diff --git a/app.js b/app.js index ec1ec7c2..e443faf9 100644 --- a/app.js +++ b/app.js @@ -322,6 +322,7 @@ const productionMap = { '/lib/kiri-run/engine.js' : '/lib/pack/kiri-eng.js', '/lib/kiri-run/minion.js' : '/lib/pack/kiri-pool.js', '/lib/kiri-run/worker.js' : '/lib/pack/kiri-work.js', + // '/lib/kiri-run/frame.js' : '/lib/pack/kiri-frame.js', }; function handleVersion(req, res, next) { @@ -539,7 +540,8 @@ function rewriteHtmlVersion(req, res, next) { "/lib/mesh/work.js", "/lib/kiri-run/worker.js", "/lib/kiri-run/minion.js", - "/lib/kiri-run/engine.js" + "/lib/kiri-run/engine.js", + "/lib/kiri-run/frame.js" ].indexOf(req.app.path) >= 0) { addCorsHeaders(req, res); } @@ -547,6 +549,8 @@ function rewriteHtmlVersion(req, res, next) { "/lib/main/kiri.js", "/lib/main/mesh.js" ].indexOf(req.app.path) >= 0) { + addCorsHeaders(req, res); + const data = append[req.app.path.split('/')[3].split('.')[0]]; if (!data) return next(); diff --git a/bin/esbuild.config.mjs b/bin/esbuild.config.mjs new file mode 100644 index 00000000..59061ce8 --- /dev/null +++ b/bin/esbuild.config.mjs @@ -0,0 +1,160 @@ +import { build, transform } from 'esbuild'; +import fs from 'fs/promises'; +import glob from 'fast-glob'; + +// Get build mode from command line argument +const mode = process.argv[2] || 'dev'; +const isProd = mode === 'prod'; + +console.log(`Building in ${mode} mode...`); + +const MESH_OUTFILE = 'src/pack/mesh-main.js'; +const MESH_EXTRAS = [ ]; + +const KIRI_OUTFILE = 'src/pack/kiri-main.js'; +const KIRI_EXTRAS = [ ]; + +async function appendExtraModules(extras, outfile, minify = false) { + const files = await glob(extras); + if (files.length === 0) return; + + const transformed = await Promise.all( + files.map(async (file) => { + const code = await fs.readFile(file, 'utf8'); + if (!minify) return code; + + const result = await transform(code, { + minify: true, + loader: 'js', + target: 'es2020', + }); + return result.code; + }) + ); + + await fs.appendFile(outfile, transformed.join('')); + console.log(`Appended ${files.length} module(s) to ${outfile}`); +} + +const logOverride = { + 'duplicate-class-member': 'silent', + 'duplicate-object-key': 'silent', + 'direct-eval': 'silent' +}; + +async function buildApp() { + try { + // Bundle mesh main app + await build({ + entryPoints: [ 'src/main/mesh.js' ], + bundle: true, + outfile: MESH_OUTFILE, + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + appendExtraModules(MESH_EXTRAS, MESH_OUTFILE, isProd); + + // Bundle mesh worker + await build({ + entryPoints: [ 'src/mesh/work.js' ], + bundle: true, + outfile: 'src/pack/mesh-work.js', + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + // Bundle kiri main app + await build({ + entryPoints: [ 'src/main/kiri.js' ], + bundle: true, + outfile: KIRI_OUTFILE, + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + appendExtraModules(KIRI_EXTRAS, KIRI_OUTFILE, isProd); + + // Bundle kiri worker + await build({ + entryPoints: [ 'src/kiri-run/worker.js' ], + bundle: true, + outfile: 'src/pack/kiri-work.js', + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + // Bundle kiri minion + await build({ + entryPoints: [ 'src/kiri-run/minion.js' ], + bundle: true, + outfile: 'src/pack/kiri-pool.js', + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + // Bundle kiri engine + await build({ + entryPoints: [ 'src/kiri-run/engine.js' ], + bundle: true, + outfile: 'src/pack/kiri-eng.js', + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + }, + logOverride + }); + + console.log(`Build completed successfully in ${mode} mode!`); + } catch (error) { + console.error('Build failed:', error); + process.exit(1); + } +} + +buildApp(); \ No newline at end of file diff --git a/bin/webpack-three-esm.js b/bin/webpack-three-esm.js new file mode 100644 index 00000000..2eff4b47 --- /dev/null +++ b/bin/webpack-three-esm.js @@ -0,0 +1,38 @@ +const path = require('path'); + +module.exports = { + mode: 'production', + entry: path.resolve(__dirname, './webpack-three-bundle.js'), + output: { + path: path.resolve(__dirname, '../src/ext'), + filename: 'three.js', + library: { + type: 'module' + }, + module: true + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: ['.mjs', '.js'], + }, + module: { + rules: [ + { + test: /\.m?js$/, + resolve: { + fullySpecified: false, + }, + }, + ], + }, + optimization: { + minimize: false + }, + performance: { + hints: false, + maxAssetSize: 2 * 1024 * 1024, + maxEntrypointSize: 2 * 1024 * 1024, + }, +}; \ No newline at end of file diff --git a/src/kiri-run/frame.js b/src/kiri-run/frame.js index 02d06e62..9830b436 100644 --- a/src/kiri-run/frame.js +++ b/src/kiri-run/frame.js @@ -1,7 +1,5 @@ /** Copyright Stewart Allen -- All Rights Reserved */ -"use strict"; - (function() { let KIRI = self.kiri = self.kiri || {}; let frame, cwin, onevent = {}, targetOrigin; diff --git a/src/kiri/frame.js b/src/kiri/frame.js index 8f5df085..d5d7e9aa 100644 --- a/src/kiri/frame.js +++ b/src/kiri/frame.js @@ -1,17 +1,12 @@ /** Copyright Stewart Allen -- All Rights Reserved */ -import { load } from '../load.js'; -import { kiri } from './kiri.js'; -import { moto } from '../moto.js'; -import { api } from './api.js'; -import { newWidget } from './widget.js'; -import { conf, event, feature, platform, settings, show } from './api.js'; -import { VIEWS } from './consts.js'; +import { api } from './api.js'; +import { load } from '../load/file.js'; +import { newWidget } from './widget.js'; +import { VIEWS } from './consts.js'; // add frame message api listener window.addEventListener('message', msg => { - const { load, kiri, moto } = self; - const { api, newWidget } = kiri; const { conf, event, feature, platform, settings, show } = api; if (!feature.frame) return; @@ -124,6 +119,3 @@ window.addEventListener('message', msg => { show.progress(data.progress, data.message); } }); - - -// No direct exports; sets up message listener diff --git a/src/kiri/main.js b/src/kiri/main.js index 433a01d9..d31041f0 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -1,5 +1,7 @@ /** Copyright Stewart Allen -- All Rights Reserved */ +import './frame.js'; + import lang from './lang.js'; import STACKS from './stacks.js'; diff --git a/web/kiri/frame.html b/web/kiri/frame.html index b89ae43e..b495b7a0 100644 --- a/web/kiri/frame.html +++ b/web/kiri/frame.html @@ -82,7 +82,7 @@ } - +