summaryrefslogtreecommitdiff
path: root/src/generate.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/generate.ts')
-rw-r--r--src/generate.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/generate.ts b/src/generate.ts
new file mode 100644
index 000000000..de7f76b25
--- /dev/null
+++ b/src/generate.ts
@@ -0,0 +1,59 @@
+import type { MagicConfig } from './@types/magicthing';
+import { loadConfiguration, startServer as startSnowpackServer } from 'snowpack';
+import { promises as fsPromises } from 'fs';
+import { relative as pathRelative } from 'path';
+
+const { mkdir, readdir, stat, writeFile } = fsPromises;
+
+async function* allPages(root: URL): AsyncGenerator<URL, void, unknown> {
+ for(const filename of await readdir(root)) {
+ const fullpath = new URL(filename, root);
+ const info = await stat(fullpath);
+
+ if(info.isDirectory()) {
+ yield * allPages(new URL(fullpath + '/'));
+ } else {
+ yield fullpath;
+ }
+ }
+}
+
+export default async function(magicConfig: MagicConfig) {
+ const { projectRoot, hmxRoot } = magicConfig;
+ const pageRoot = new URL('./pages/', hmxRoot);
+ const dist = new URL(magicConfig.dist + '/', projectRoot);
+
+ const configPath = new URL('./snowpack.config.js', projectRoot).pathname;
+ const config = await loadConfiguration({
+ root: projectRoot.pathname,
+ devOptions:
+ {open: 'none', output: 'stream'
+ }
+ }, configPath);
+ const snowpack = await startSnowpackServer({
+ config,
+ lockfile: null // TODO should this be required?
+ });
+
+ const runtime = snowpack.getServerRuntime();
+
+ for await(const filepath of allPages(pageRoot)) {
+ const rel = pathRelative(hmxRoot.pathname, filepath.pathname); // pages/index.hmx
+ const pagePath = `/_hmx/${rel.replace(/\.(hmx|md)/, '.js')}`;
+
+ try {
+ const outPath = new URL('./' + rel.replace(/\.(hmx|md)/, '.html'), dist);
+ const outFolder = new URL('./', outPath);
+ const mod = await runtime.importModule(pagePath);
+ const html = await mod.exports.default({});
+
+ await mkdir(outFolder, { recursive: true });
+ await writeFile(outPath, html, 'utf-8');
+ } catch(err) {
+ console.error('Unable to generate page', rel);
+ }
+ }
+
+ await snowpack.shutdown();
+ process.exit(0);
+} \ No newline at end of file