diff --git a/BuildExamples.sh b/BuildExamples.sh new file mode 100644 index 0000000..24d5966 --- /dev/null +++ b/BuildExamples.sh @@ -0,0 +1,18 @@ +#!/bin/sh +. ./BuildLib.sh + +buildHtml(){ + useBuilder "Build.BuildHtmlFile('$1', { outputFile: '$2' })" +} + +for example in Server +do + example="Example.${example}" + file="./${example}/index.js" + node "${file}" writeStaticHtml 0 "./${example}/index.html" + node "${file}" writeStaticHtml 1 "./Build/${example}.html" +done + +for example in Build + do buildHtml "./SpaccDotWeb.${example}/Example.html" "SpaccDotWeb.${example}.Example.html" +done diff --git a/BuildLib.sh b/BuildLib.sh old mode 100755 new mode 100644 index 189e5b5..2f5a8b8 --- a/BuildLib.sh +++ b/BuildLib.sh @@ -1,4 +1,21 @@ #!/bin/sh + +useBuilder(){ + node ./SpaccDotWeb.Build/node.js "$1" +} + +buildScript(){ + useBuilder "Build.BuildScriptFile('$1')" +} + for file in ./SpaccDotWeb.js ./SpaccDotWeb.*.js -do node ./SpaccDotWeb.Build.js "BuildScriptFile('${file}')" + do buildScript "${file}" +done + +for lib in Build +do + lib="SpaccDotWeb.${lib}" + output="./Build/${lib}.bundle.min.js" + npx esbuild "./${lib}/browser.js" --bundle --minify --outfile="${output}" + #buildScript "${output}" done diff --git a/Example.Server/index.css b/Example.Server/index.css index 15ef091..561b6ae 100644 --- a/Example.Server/index.css +++ b/Example.Server/index.css @@ -21,3 +21,17 @@ div#transition { cursor: progress; display: none; } + +.particles { + position: absolute; + overflow: hidden; + width: 100vw; + height: 100vh; + top: 0; + left: 0; + z-index: -1; +} + +.particles > * { + position: absolute; +} diff --git a/Example.Server/index.js b/Example.Server/index.js old mode 100755 new mode 100644 index 14171d2..4ae01d5 --- a/Example.Server/index.js +++ b/Example.Server/index.js @@ -14,7 +14,10 @@ const server = SpaccDotWebServer.setup({ }); if (SpaccDotWebServer.envIsNode && ['dump', 'html', 'writeStaticHtml'].includes(process.argv[2])) { - const fileName = server.writeStaticHtml(Number(process.argv[3] || 0)); + const fileName = server.writeStaticHtml({ + selfContained: Number(process.argv[3] || 0), + htmlFilePath: process.argv[4], + }); console.log(`Dumped Static HTML to '${fileName}'!`); } else { const serverData = server.initServer({ diff --git a/Example.Server/particles.js b/Example.Server/particles.js index 2269b16..a1bef41 100644 --- a/Example.Server/particles.js +++ b/Example.Server/particles.js @@ -1,10 +1,11 @@ window.addEventListener('load', function(){ + var c = Object.assign(document.createElement('div'), { className: "particles" }); + document.body.appendChild(c); for (var i=0; i<(window.innerWidth * window.innerHeight / 6000); i++) (function(){ var v = (Math.random() * window.innerHeight), h = (100 * Math.random()); var n = document.createElement('span'); n.textContent = '✨️'; - n.style.position = 'absolute'; - document.body.appendChild(n); + c.appendChild(n); var e = setInterval(function(){ var r = Math.random(); n.style.top = (v += 1).toString() + 'px'; diff --git a/SpaccDotWeb.Alt.js b/SpaccDotWeb.Alt.js index 1478145..243c8b6 100644 --- a/SpaccDotWeb.Alt.js +++ b/SpaccDotWeb.Alt.js @@ -29,7 +29,6 @@ document.body.appendChild(scriptElem); })); }; - // .RequireScripts = (...) => {} SpaccDotWeb.RequireScript = SpaccDotWeb.requireScript; SpaccDotWeb.showModal = async (params) => { @@ -76,7 +75,7 @@ buttonCancel = modal.querySelector('button[name="cancel"]'); buttonCancel.onclick = (event) => { if (params.actionCancel) { - output = actionCancel(event, buttonCancel); + output = params.actionCancel(event, buttonCancel); } modal.close(); return output; @@ -93,5 +92,40 @@ SpaccDotWeb.sleep = (ms) => (new Promise((resolve) => setTimeout(resolve, ms))); SpaccDotWeb.Sleep = SpaccDotWeb.sleep; + SpaccDotWeb.$ = (query) => { + query = query.trim(); + return (query.startsWith('::') + ? arrayFrom(document.querySelectorAll(domSpecialQuery(query.slice(2).trim()))) + : document.querySelector(domSpecialQuery(query)) + ); + } + + function domSpecialQuery (query) { + const chars = []; + let buffer = []; + let brackets = 0; + for (const char of query) { + if (brackets === 0) { + if (buffer.length > 0) { + buffer = buffer.join(''); + if (!buffer.includes('=')) { + buffer = `name=${buffer}`; + } + chars.push(buffer); + buffer = []; + } + chars.push(char); + } else { + buffer.push(char); + } + if (char === '[') { + brackets++; + } else if (char === ']' && brackets > 0) { + brackets--; + } + } + return chars.join(''); + } + window.SpaccDotWeb ||= SpaccDotWeb; })(document.currentScript); diff --git a/SpaccDotWeb.Android/gradlew b/SpaccDotWeb.Android/gradlew old mode 100755 new mode 100644 diff --git a/SpaccDotWeb.Build.js b/SpaccDotWeb.Build.js deleted file mode 100755 index b0f2bfb..0000000 --- a/SpaccDotWeb.Build.js +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env node -const Lib = { - fs: require('fs'), - mime: require('mime-types'), - crypto: require('crypto'), - babel: require('@babel/core'), - uglify: require('uglify-js'), -}; - -const BuildScriptFile = (scriptFile, options) => { - options = { - forceResult: false, - checkHash: true, - ...options }; - Lib.fs.mkdirSync(`${__dirname}/Build`, { recursive: true }); - const __scriptname = scriptFile.split('/').slice(-1)[0].split('.').slice(0, -1).join('.'); - const scriptScript = Lib.fs.readFileSync(scriptFile, 'utf8'); - const compiledPath = `${__dirname}/Build/${__scriptname}.js`; - const minifiedPath = `${__dirname}/Build/${__scriptname}.min.js`; - const hashPath = `${__dirname}/Build/${__scriptname}.js.hash`; - const hashOld = (Lib.fs.existsSync(hashPath) && Lib.fs.readFileSync(hashPath, 'utf8')); - const hashNew = Lib.crypto.createHash('sha256').update(scriptScript).digest('hex'); - if (!options.checkHash || !Lib.fs.existsSync(compiledPath) || !Lib.fs.existsSync(minifiedPath) || !(hashOld === hashNew)) { - const compiledScript = Lib.babel.transformSync(scriptScript, - JSON.parse(Lib.fs.readFileSync(`${__dirname}/babel.config.json`, 'utf8'))).code; - const minifiedScript = Lib.uglify.minify(compiledScript).code; - Lib.fs.writeFileSync(compiledPath, compiledScript); - Lib.fs.writeFileSync(minifiedPath, minifiedScript); - Lib.fs.writeFileSync(hashPath, hashNew); - return { compiled: compiledScript, minified: minifiedScript }; - } - return { notice: `Target "${scriptFile}" is up-to-date.`, ...(options.forceResult && { - compiled: Lib.fs.readFileSync(compiledPath, 'utf8'), - minified: Lib.fs.readFileSync(minifiedPath, 'utf8'), - }) }; -}; - -//const BuildHtmlFile = (htmlFile) => { -// -//} - -const EncodeStaticFiles = (files, /* encoding='base64' */) => { - const data = {}; - files.forEach(file => (data[file] = `data:${Lib.mime.lookup(file)};base64,${Lib.fs.readFileSync(file).toString('base64')}`)); - return data; -}; - -module.exports = { BuildScriptFile, EncodeStaticFiles }; - -if (require.main === module) { - console.log(eval(process.argv.slice(-1)[0])); -} diff --git a/SpaccDotWeb.Build/Example.html b/SpaccDotWeb.Build/Example.html new file mode 100644 index 0000000..45e5b27 --- /dev/null +++ b/SpaccDotWeb.Build/Example.html @@ -0,0 +1,64 @@ + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/SpaccDotWeb.Build/browser.js b/SpaccDotWeb.Build/browser.js new file mode 100644 index 0000000..4ae481f --- /dev/null +++ b/SpaccDotWeb.Build/browser.js @@ -0,0 +1,7 @@ +window.global ||= window.globalThis; +window.SpaccDotWeb ||= {}; +window.SpaccDotWeb.Build = require('./lib.js')({ + mime: require('mime-types-browser/dist/mime-types-browser'), + babel: require('@babel/standalone'), + uglify: require('uglifyjs-browser'), +}); \ No newline at end of file diff --git a/SpaccDotWeb.Build/lib.js b/SpaccDotWeb.Build/lib.js new file mode 100644 index 0000000..a4d3572 --- /dev/null +++ b/SpaccDotWeb.Build/lib.js @@ -0,0 +1,102 @@ +module.exports = (Lib) => { + +const envIsBrowser = (typeof window !== 'undefined' && typeof window.document !== 'undefined'); + +let babelPreset, makeHtmlDom; + +if (envIsBrowser) { + Lib.babel.registerPreset(null, { + presets: [ + [Lib.babel.availablePresets['preset-env']], + ], + }); + babelPreset = 'env'; + makeHtmlDom = (html) => (new DOMParser()).parseFromString(html, 'text/html'); +} else { + babelPreset = '@babel/preset-env'; + makeHtmlDom = (html) => (new Lib.jsdom(html)).window.document; +} + +const babelConfig = { + "presets": [ + [ + babelPreset, + { + "targets": { + "chrome": "4", + "edge": "12", + "firefox": "2", + "ie": "6", + "safari": "3.1", + }, + }, + ], + ], +}; + +const findPath = (path, folder) => { + for (const prefix of [folder, __dirname]) { + path = Lib.path.join(prefix, path); + if (Lib.fs.existsSync(path)) { + return path; + } + } +} + +const fileToBase64 = (path, content) => `data:${Lib.mime.lookup(path)};base64,${content || Lib.fs.readFileSync(findPath(path)).toString('base64')}`; + +const isUrlAbsolute = (url) => (url && ['http:', 'https:', ''].includes(url.split('/')[0])); + +const BuildScript = (scriptText, options) => { + options = { + minify: true, + ...options }; + const compiled = (Lib.babel.transformSync || Lib.babel.transform)(scriptText, babelConfig).code; + const minified = (options.minify && Lib.uglify.minify(compiled).code); + return { compiled, minified }; +} + +const BuildHtml = async (html, options) => { + options = { + compileScripts: true, + minifyScripts: true, + compileStyles: true, + inputFolder: '.', + ...options }; + const dom = makeHtmlDom(html); + for (const element of dom.querySelectorAll('script, [src], link[rel=stylesheet][href]')) { + if (isUrlAbsolute(element.src || element.href)) { + return; + } + if (element.tagName === 'SCRIPT') { + const scriptOptions = JSON.parse(element.dataset.spaccdotweb || '{}'); + const minifyScripts = (scriptOptions.minify ?? options.minifyScripts); + let scriptText = (element.src + ? Lib.fs.readFileSync(findPath(element.src, options.inputFolder), 'utf8') + : element.textContent); + if (scriptOptions.compile ?? options.compileScripts) { + scriptText = BuildScript(scriptText, { minify: minifyScripts })[minifyScripts ? 'minified' : 'compiled']; + } + element.removeAttribute('src'); + element.textContent = scriptText; + } else if (element.tagName === 'LINK') { + const stylePath = findPath(element.href, options.inputFolder); + let styleText = Lib.fs.readFileSync(stylePath, 'utf8'); + if (options.compileStyles) { + styleText = (await Lib.postcss([ + Lib.postcssImport(), + Lib.postcssUrl({ url: 'inline' }), + ]).process(styleText, { from: stylePath })).css; + } + element.parentElement.insertBefore(Object.assign(dom.createElement('style'), { textContent: styleText }), element); + element.remove(); + } else { + element.src = fileToBase64(element.src); + } + } + return `\n${dom.documentElement.outerHTML}`; +} + +return { BuildScript, BuildHtml, fileToBase64 }; + +} \ No newline at end of file diff --git a/SpaccDotWeb.Build/node.js b/SpaccDotWeb.Build/node.js new file mode 100644 index 0000000..afe0934 --- /dev/null +++ b/SpaccDotWeb.Build/node.js @@ -0,0 +1,64 @@ +#!/usr/bin/env node +const Lib = { + fs: require('fs'), + path: require('path'), + mime: require('mime-types'), + crypto: require('crypto'), + babel: require('@babel/core'), + uglify: require('uglify-js'), + postcss: require('postcss'), + postcssImport: require('postcss-import'), + postcssUrl: require('postcss-url'), + jsdom: require('jsdom').JSDOM, +}; +let Build = require('./lib.js')(Lib); + +const BuildScriptFile = (scriptFile, options) => { + options = { + forceResult: false, + checkHash: true, + outputFolder: './Build', + ...options }; + Lib.fs.mkdirSync(options.outputFolder, { recursive: true }); + const __scriptname = scriptFile.split('/').slice(-1)[0].split('.').slice(0, -1).join('.'); + const scriptText = Lib.fs.readFileSync(scriptFile, 'utf8'); + const compiledPath = `${options.outputFolder}/${__scriptname}.js`; + const minifiedPath = `${options.outputFolder}/${__scriptname}.min.js`; + const hashPath = `${options.outputFolder}/${__scriptname}.js.hash`; + const hashOld = (Lib.fs.existsSync(hashPath) && Lib.fs.readFileSync(hashPath, 'utf8')); + const hashNew = Lib.crypto.createHash('sha256').update(scriptText).digest('hex'); + if (!options.checkHash || !Lib.fs.existsSync(compiledPath) || !Lib.fs.existsSync(minifiedPath) || !(hashOld === hashNew)) { + const builtScript = Build.BuildScript(scriptText, /* JSON.parse(Lib.fs.readFileSync(`${__dirname}/babel.config.json`, 'utf8')) */); + Lib.fs.writeFileSync(compiledPath, builtScript.compiled); + Lib.fs.writeFileSync(minifiedPath, builtScript.minified); + Lib.fs.writeFileSync(hashPath, hashNew); + return builtScript; + } + return { notice: `Target "${scriptFile}" is up-to-date.`, ...(options.forceResult && { + compiled: Lib.fs.readFileSync(compiledPath, 'utf8'), + minified: Lib.fs.readFileSync(minifiedPath, 'utf8'), + }) }; +}; + +const BuildHtmlFile = (htmlFile, options) => { + options = { + outputFolder: './Build', + outputFile: htmlFile, + inputFolder: Lib.path.dirname(htmlFile), + ...options }; + const outputPath = `${options.outputFolder}/${options.outputFile}`; + Build.BuildHtml(Lib.fs.readFileSync(htmlFile, 'utf8'), options).then(html => Lib.fs.writeFileSync(outputPath, html)); + return outputPath; +}; + +const EncodeStaticFiles = (files, /* encoding='base64' */) => { + const data = {}; + files.forEach(file => (data[file] = Build.fileToBase64(file))); + return data; +}; + +module.exports = Build = { ...Build, BuildScriptFile, BuildHtmlFile, EncodeStaticFiles }; + +if (require.main === module) { + console.log(eval(process.argv.slice(-1)[0])); +} diff --git a/SpaccDotWeb.Server.js b/SpaccDotWeb.Server.js index c557839..5368e1d 100644 --- a/SpaccDotWeb.Server.js +++ b/SpaccDotWeb.Server.js @@ -82,16 +82,21 @@ const initServer = (serverOptions) => { const navigateClientPage = (forceUrl) => ((!forceUrl || (window.location.hash === forceUrl)) && handleRequest({ url: window.location.hash.slice(1), method: 'GET' })); -const writeStaticHtml = (selfContained=false) => { +const writeStaticHtml = (options={}) => { const appFilePath = process.mainModule.filename; - const htmlFilePath = (appFilePath.split('.').slice(0, -1).join('.') + '.html'); + options.selfContained ??= false; + options.htmlFilePath ??= (appFilePath.split('.').slice(0, -1).join('.') + '.html'); // path.relative seems to always append an extra '../', so we must slice it - const libraryPath = path.relative(appFilePath, __filename).split(path.sep).slice(1).join(path.sep); - const libraryFolder = libraryPath.split(path.sep).slice(0, -1).join(path.sep); + let libraryPath = path.relative(appFilePath, __filename).split(path.sep).slice(1).join(path.sep); + let libraryFolder = libraryPath.split(path.sep).slice(0, -1).join(path.sep); + if (path.sep === '\\') { + libraryPath = libraryPath.replaceAll('\\', '/'); + libraryFolder = libraryFolder.replaceAll('\\', '/'); + } const context = { envIsNode: false, envIsBrowser: true }; - fs.writeFileSync(htmlFilePath, allOpts.global.htmlPager(` - ${makeHtmlScriptFragment(libraryPath, selfContained)} - ${makeHtmlScriptFragment(((libraryFolder && (libraryFolder + '/')) + 'SpaccDotWeb.Alt.js'), selfContained)} + fs.writeFileSync(options.htmlFilePath, allOpts.global.htmlPager(` + ${makeHtmlScriptFragment(libraryPath, options.selfContained)} + ${makeHtmlScriptFragment(((libraryFolder && (libraryFolder + '/')) + 'SpaccDotWeb.Alt.js'), options.selfContained)} <${'script'}> window.require = () => { window.require = async (src, type) => { @@ -99,15 +104,15 @@ const writeStaticHtml = (selfContained=false) => { }; return window.SpaccDotWebServer; }; - window.SpaccDotWebServer.staticFilesData = { ${selfContained ? allOpts.global.staticFiles.map((file) => { + window.SpaccDotWebServer.staticFilesData = { ${options.selfContained ? allOpts.global.staticFiles.map((file) => { // TODO check if these paths are correct or must still be fixed const filePath = (appFilePath.split(path.sep).slice(0, -1).join(path.sep) + path.sep + file); return `"${file}":"data:${mime.lookup(filePath)};base64,${fs.readFileSync(filePath).toString('base64')}"`; }).join() : ''} }; ${'script'}> - ${makeHtmlScriptFragment(path.basename(appFilePath), selfContained)} - `, null, { selfContained, context }, context)); - return htmlFilePath; + ${makeHtmlScriptFragment(path.basename(appFilePath), options.selfContained)} + `, null, { selfContained: options.selfContained, context }, context)); + return options.htmlFilePath; }; const makeHtmlStyleFragment = (path, getContent) => { @@ -115,15 +120,18 @@ const makeHtmlStyleFragment = (path, getContent) => { return (data[1] ? `` : ``); }; -const makeHtmlScriptFragment = (path, getContent) => { - const data = getFilePathContent(path, getContent); +const makeHtmlScriptFragment = (patha, getContent) => { + const data = getFilePathContent(patha, getContent); return `<${'script'}${data[1] ? `>${data[1]}` : ` src="${data[0]}">`}${'script'}>`; }; -const getFilePathContent = (path, getContent) => ([ - (allOpts.global.staticFiles.includes(path) ? (allOpts.global.staticPrefix + path) : ('./' + path)), - (getContent && fs.existsSync(path) && fs.readFileSync(path)), -]); +const getFilePathContent = (filePath, getContent) => { + const realPath = path.join(path.dirname(process.mainModule.filename), filePath); + return [ + (allOpts.global.staticFiles.includes(filePath) ? (allOpts.global.staticPrefix + filePath) : ('./' + filePath)), + (getContent && fs.existsSync(realPath) && fs.readFileSync(realPath)), + ]; +}; const handleRequest = async (request, response={}) => { // build request context and handle special tasks diff --git a/SpaccDotWeb.js b/SpaccDotWeb.js old mode 100755 new mode 100644 diff --git a/package-lock.json b/package-lock.json index d957d26..421ea34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,24 @@ "version": "indev", "dependencies": { "mime-types": "^2.1.35", + "mime-types-browser": "^0.0.3", "parse-multipart-data": "^1.5.0" }, "devDependencies": { "@babel/cli": "^7.24.8", "@babel/core": "^7.23.0", "@babel/preset-env": "^7.22.20", + "@babel/standalone": "^7.26.9", "core-js": "^3.35.0", "dialog-polyfill": "^0.5.6", + "esbuild": "^0.25.0", "jsdom": "^22.1.0", - "uglify-js": "^3.17.4" + "lightningcss": "^1.29.2", + "postcss": "^8.5.3", + "postcss-import": "^16.1.0", + "postcss-url": "^10.1.3", + "uglify-js": "^3.17.4", + "uglifyjs-browser": "^3.0.0" } }, "node_modules/@ampproject/remapping": { @@ -1674,6 +1682,16 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/standalone": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.9.tgz", + "integrity": "sha512-UTeQKy0kzJwWRe55kT1uK4G9H6D0lS6G4207hCU/bDaOhA5t2aC0qHN6GmID0Axv3OFLNXm27NdqcWp+BXcGtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", @@ -1720,6 +1738,431 @@ "node": ">=6.9.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -2091,6 +2534,13 @@ "node": ">=14" } }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", + "dev": true, + "license": "MIT" + }, "node_modules/data-urls": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", @@ -2137,6 +2587,16 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dialog-polyfill": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz", @@ -2174,6 +2634,47 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/esbuild": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -2531,6 +3032,12 @@ "node": ">=4" } }, + "node_modules/json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2543,6 +3050,245 @@ "node": ">=6" } }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -2580,6 +3326,19 @@ "semver": "bin/semver" } }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2599,6 +3358,16 @@ "node": ">= 0.6" } }, + "node_modules/mime-types-browser": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mime-types-browser/-/mime-types-browser-0.0.3.tgz", + "integrity": "sha512-L/KVCNDbNPI0G2lwPT/+pVsGMf/lDVA6GgLxMYhqohzsjwlZvc3Tsz95Avvf8TTV60tmuqgvAXLu97EZq5YJKg==", + "license": "ISC", + "dependencies": { + "json-loader": "^0.5.4", + "mime-types": "^2.1.12" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2617,6 +3386,25 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/nanoid": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", + "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -2681,10 +3469,11 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2708,6 +3497,108 @@ "node": ">=6" } }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz", + "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-url": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", + "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "make-dir": "~3.1.0", + "mime": "~2.5.2", + "minimatch": "~3.0.4", + "xxhashjs": "~0.2.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-url/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss-url/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2729,6 +3620,26 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2878,6 +3789,16 @@ "node": ">=6" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2958,10 +3879,11 @@ } }, "node_modules/uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, + "license": "BSD-2-Clause", "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -2969,6 +3891,12 @@ "node": ">=0.8.0" } }, + "node_modules/uglifyjs-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uglifyjs-browser/-/uglifyjs-browser-3.0.0.tgz", + "integrity": "sha512-bMYMKKcbVHNEF9/B+ki1TyWc7plh9cikJnkPyt1LMTXDuF+CY20vpA6HrR+/QaUdEXG9XkzLsR7kBwnDfCkpnw==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -3155,6 +4083,16 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cuint": "^0.2.2" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 02d8756..dd69ca3 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,27 @@ "version": "indev", "scripts": { "build:lib": "sh ./BuildLib.sh", + "build:examples": "sh ./BuildExamples.sh", "build:clear": "rm -rf ./Build" }, "devDependencies": { "@babel/cli": "^7.24.8", "@babel/core": "^7.23.0", "@babel/preset-env": "^7.22.20", + "@babel/standalone": "^7.26.9", "core-js": "^3.35.0", "dialog-polyfill": "^0.5.6", + "esbuild": "^0.25.0", "jsdom": "^22.1.0", - "uglify-js": "^3.17.4" + "postcss": "^8.5.3", + "postcss-import": "^16.1.0", + "postcss-url": "^10.1.3", + "uglify-js": "^3.17.4", + "uglifyjs-browser": "^3.0.0" }, "dependencies": { "mime-types": "^2.1.35", + "mime-types-browser": "^0.0.3", "parse-multipart-data": "^1.5.0" } }