From c9a0724ed2d247820c925fa6a5ea1d34408bcc9c Mon Sep 17 00:00:00 2001 From: Tamay Eser Uysal Date: Thu, 24 Sep 2026 11:45:36 +0200 Subject: [PATCH 1/2] Make DOM emulation the default and retain explicit WASM mode Signed-off-by: Tamay Eser Uysal --- README.md | 22 +++++++++++++++++++ src/create-geastack.mjs | 10 +++------ src/gea.mjs | 20 ++++++++++++------ src/web/adapter.mjs | 40 +++++++++++++---------------------- test/create-geastack.test.mjs | 1 + test/web-target.test.mjs | 22 +++++++++++++++++-- 6 files changed, 74 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 36bca71..d8ab5df 100644 --- a/README.md +++ b/README.md @@ -192,3 +192,25 @@ built on it. The only GeaStack code under a different license is the embedded board support (`targets` and `@geastack/chips`, GPL-3.0-only): shipping closed-source firmware through those needs a commercial license. Contact [contact@geastack.com](mailto:contact@geastack.com) for commercial terms, support and hosted builds. + +## Browser development and emulation + +`gea dev` (equivalently `gea dev --target web`) runs the Gea DOM/CSS app with +Vite HMR. `gea simulate` uses that same pipeline inside a device viewport and +opens the browser. Use `--no-open` to suppress opening, and `--width`, `--height`, +`--zoom`, and `--dpr` to configure the preview. DPR is a simulated Display API +value; it does not override the browser's pixel ratio. + +The default for `simulate` changed from WASM to DOM. To retain the embedded +renderer and framebuffer workflow, use `gea simulate --renderer wasm`; this +explicit mode still requires Emscripten. Unknown renderer values are rejected. + +`gea build --target web` emits HTML/JS/CSS into `.gea/build/web/site` (override +with `--out-dir`). The app's `index.html` is honored. Web-only Vite customization +belongs in `vite.web.config.ts`; new web apps scaffold this file. Existing +`vite.config.*` files remain dedicated to their previous build pipeline. + +Compatible component edits and CSS changes update without reloading the page; +reactive state is preserved for compatible component edits. Incompatible edits +reload. Browser previews use simulated device APIs and browser layout; use the +WASM renderer or a physical device to validate embedded rendering. diff --git a/src/create-geastack.mjs b/src/create-geastack.mjs index 6b7fa08..3baa38f 100644 --- a/src/create-geastack.mjs +++ b/src/create-geastack.mjs @@ -97,7 +97,7 @@ export async function runCreateGeastack(argv, io = {}) { writeJson(path.join(targetDir, '.gea', 'boards.json'), {}) ensureJson(path.join(targetDir, 'tsconfig.json'), () => tsconfigJson(targets)) ensureFile(path.join(targetDir, '.gitignore'), gitignore) - if (targets.web) ensureFile(path.join(targetDir, 'vite.config.ts'), viteConfigTs) + if (targets.web) ensureFile(path.join(targetDir, 'vite.web.config.ts'), viteConfigTs) fs.writeFileSync(path.join(targetDir, 'README.md'), readme({ appId, displayName, starter, targets })) const installDependencies = shouldInstallDependencies(parsed, io) @@ -472,7 +472,7 @@ function tsconfigJson(targets) { types: [] }, include: ['**/*.ts', '**/*.tsx', '**/*.d.ts'], - exclude: ['node_modules', 'dist', '.gea', 'vite.config.ts'] + exclude: ['node_modules', 'dist', '.gea', 'vite.config.ts', 'vite.web.config.ts'] } } @@ -488,11 +488,7 @@ function viteConfigTs() { return `import { defineConfig } from 'vite' export default defineConfig({ - root: __dirname, - build: { - outDir: 'dist', - emptyOutDir: true - } + // Gea adds the DOM runtime and JSX transforms. Add web-only options here. }) ` } diff --git a/src/gea.mjs b/src/gea.mjs index 95d533c..5bdc242 100644 --- a/src/gea.mjs +++ b/src/gea.mjs @@ -113,11 +113,8 @@ export async function runGea(argv, io = {}) { const { runIos } = await import('./ios/adapter.mjs') return runIos({ app, env, dryRun: flag(parsed, 'dry-run'), stdout, mode: option(parsed, 'mode', ''), run: command === 'run' }) } - // `web` names two targets, and both are driven by gea, so it leaves the - // refusal below the way macos does above. `gea simulate` is the WASM device - // simulator; `gea {dev,build} --target web` is a real DOM/CSS web app. A bare - // `gea dev` means the latter -- it is the only target with a dev server, and - // it is what `gea create` scaffolds into a new app's package.json. + // DOM is the default web development and emulator runtime. The embedded + // framebuffer simulator remains available through simulate --renderer wasm. if ((command === 'dev' || command === 'build') && (target === 'web' || (!target && command === 'dev'))) { const app = webApp(ctx, parsed, rest, cwd) const { runWebBuild, runWebDev } = await import('./web/adapter.mjs') @@ -127,15 +124,24 @@ export async function runGea(argv, io = {}) { } if (command === 'simulate') { const app = webApp(ctx, parsed, rest, cwd) + const renderer = option(parsed, 'renderer', 'dom') + if (!['dom', 'wasm'].includes(renderer)) fail(`Unknown renderer '${renderer}'. Use dom or wasm.`, ExitCode.usage) + for (const key of ['width', 'height', 'dpr', 'zoom']) { + const value = option(parsed, key) + if (value !== undefined && (typeof value === 'boolean' || !Number.isFinite(Number(value)) || Number(value) <= 0)) { + fail(`--${key} must be a positive number.`, ExitCode.usage) + } + } const { runSimulate } = await import('./web/adapter.mjs') return runSimulate({ + renderer, ctx, app, env, dryRun: flag(parsed, 'dry-run'), stdout, port: option(parsed, 'port', ''), - open: !flag(parsed, 'no-open'), + open: option(parsed, 'open', true) !== false, view: { width: option(parsed, 'width', ''), height: option(parsed, 'height', ''), @@ -226,7 +232,7 @@ ${heading('Usage:')} gea doctor [--json] [--strict] check packages and toolchains ${heading('Run on this machine (no board needed):')} - gea simulate [app] [--port N] build to WASM + open the device simulator [--no-open] [--width W --height H --dpr D --zoom Z] + gea simulate [app] [--port N] DOM emulator with HMR [--renderer dom|wasm] [--no-open] [--width W --height H --dpr D --zoom Z] gea dev [app] [--port N] real DOM + CSS dev server with HMR (same as --target web) gea build --target web [app] [--out-dir d] build the app as a real web app diff --git a/src/web/adapter.mjs b/src/web/adapter.mjs index e706008..3a7d196 100644 --- a/src/web/adapter.mjs +++ b/src/web/adapter.mjs @@ -10,29 +10,9 @@ import { appSummary, discoverApps } from '../manifest.mjs' import { formatCommand } from '../run.mjs' import { onPath } from '../toolchain.mjs' -// `web` is two targets wearing one name, and the CLI keeps them apart. -// -// gea simulate the SIMULATOR. The app's C++ is generated with the -// same geatsc flags an ESP32 firmware uses -- same -// board profile, same font DPR, same renderer -- and -// only the final compile differs (emcc/WASM + an -// RGB565 framebuffer on a canvas, instead of clang + -// a QSPI panel). Gea's own layout engine does layout, -// so what you see is what the board will show. -// -// gea {dev,build} --target web -// a REAL WEB APP. The same TSX compiled onto the -// @geajs/core reactive DOM runtime: real DOM nodes, -// the browser's own CSSOM, native HMR. Faster to -// iterate on, and deployable -- but the *browser* -// does layout, so it drifts from the device exactly -// where a simulator would need to be trusted. -// -// Both live in @geastack/simulator. Unlike the Apple targets -- where the app -// depends on @geastack/apple and the app's own resolution finds the script -- -// nothing here is declared by the app: a gea app is simulatable because it is -// buildable, so the CLI owns the dependency and resolves it from its own -// installation. +// Web development and the default emulator use Gea's DOM/CSS runtime. +// `gea simulate --renderer wasm` retains the embedded renderer compiled with +// Emscripten for framebuffer/device-rendering comparisons. const require = createRequire(import.meta.url) @@ -150,7 +130,8 @@ export function buildSimulatorApp({ app, env, dryRun = false, stdout }) { return { simulatorDir, paths } } -export async function runSimulate({ ctx, app, env, dryRun = false, stdout, port, open = true, view = {} }) { +export async function runSimulate({ ctx, app, env, dryRun = false, stdout, port, open = true, view = {}, renderer = 'dom' }) { + if (renderer === 'dom') return runWebDev({ app, env, dryRun, stdout, port, emulator: true, open, view }) const { simulatorDir, paths } = buildSimulatorApp({ app, env, dryRun, stdout }) const url = await startSimulatorServer({ ctx, app, env, simulatorDir, paths, port, dryRun, stdout, view }) if (dryRun) return 0 @@ -235,13 +216,22 @@ function openBrowser(url, env) { // The DOM target resolves the app from the directory itself rather than from an // id looked up under an apps root, so `gea dev --target web` works in any app // folder on disk. -export function runWebDev({ app, env, dryRun = false, stdout, port }) { +export function runWebDev({ app, env, dryRun = false, stdout, port, emulator = false, open = false, view = {} }) { requireWebTarget(app) const simulatorDir = resolveSimulatorDir(env) const script = path.join(simulatorDir, 'targets', 'web', 'dev-web.mjs') if (!existsSync(script)) fail(`Web dev server not found: ${script}`, ExitCode.missingDependency) const args = [script, '--app-dir', app.root] if (port) args.push('--port', String(port)) + if (emulator) args.push('--emulator') + if (open) args.push('--open') + for (const key of ['width', 'height', 'dpr', 'zoom']) { + if (view[key] !== undefined && view[key] !== '') { + const value = Number(view[key]) + if (!Number.isFinite(value) || value <= 0) fail(`--${key} must be a positive number.`, ExitCode.usage) + args.push(`--${key}`, String(value)) + } + } return runScript('node', args, { cwd: app.root, env, diff --git a/test/create-geastack.test.mjs b/test/create-geastack.test.mjs index 7b12a33..b4ece5b 100644 --- a/test/create-geastack.test.mjs +++ b/test/create-geastack.test.mjs @@ -39,6 +39,7 @@ test('create-geastack scaffolds a valid app manifest', async () => { assert.equal(fs.existsSync(path.join(tmp, 'src/index.tsx')), true) assert.equal(fs.existsSync(path.join(tmp, 'src/App.tsx')), true) assert.equal(fs.existsSync(path.join(tmp, 'tsconfig.json')), true) + assert.equal(fs.existsSync(path.join(tmp, 'vite.web.config.ts')), true) assert.match(fs.readFileSync(path.join(tmp, '.gitignore'), 'utf8'), /^\.env$/m) assert.deepEqual(readJson(path.join(tmp, '.gea/boards.json')), {}) assert.match(fs.readFileSync(path.join(tmp, 'README.md'), 'utf8'), /bundled starter: `Component Counter`/) diff --git a/test/web-target.test.mjs b/test/web-target.test.mjs index 94246a6..66ede8d 100644 --- a/test/web-target.test.mjs +++ b/test/web-target.test.mjs @@ -39,7 +39,7 @@ test('gea simulate builds to wasm and serves the simulator', async (t) => { const env = envWith(fixture.root, ['emcc', 'em++']) const out = capture() - assert.equal(await runGea(['simulate', 'watch', '--dry-run'], { ...out.io, cwd: fixture.root, env }), 0) + assert.equal(await runGea(['simulate', 'watch', '--renderer', 'wasm', '--dry-run'], { ...out.io, cwd: fixture.root, env }), 0) const printed = out.out.join('\n') assert.match(printed, /targets\/web\/build-web\.sh watch/) @@ -90,7 +90,7 @@ test('gea simulate names the Emscripten SDK when emcc is missing', async (t) => const out = capture() await assert.rejects( - runGea(['simulate', 'watch', '--dry-run'], { ...out.io, cwd: fixture.root, env }), + runGea(['simulate', 'watch', '--renderer', 'wasm', '--dry-run'], { ...out.io, cwd: fixture.root, env }), (error) => { assert.equal(error.exitCode, ExitCode.missingDependency) assert.match(error.message, /emcc and em\+\+ not on PATH/) @@ -145,3 +145,21 @@ test('web build output is the app\'s, and the object cache is the machine\'s', ( // apps is safe -- and it is the expensive half worth not duplicating. assert.ok(!paths.objcache.startsWith(app.root), paths.objcache) }) + +test('simulate defaults to DOM with viewport options and no Emscripten', async (t) => { + const fixture = createFixture(t) + const env = envWith(fixture.root, []) + const out = capture() + await runGea(['simulate', 'watch', '--no-open', '--width', '320', '--height', '480', '--dpr', '2', '--zoom', '1.5', '--dry-run'], { ...out.io, cwd: fixture.root, env }) + assert.match(out.out.join('\n'), /dev-web\.mjs .*--emulator --width 320 --height 480 --dpr 2 --zoom 1.5/) + assert.doesNotMatch(out.out.join('\n'), /--open|build-web\.sh/) +}) + +test('simulate rejects unknown renderers and invalid viewport values', async (t) => { + const fixture = createFixture(t) + const env = envWith(fixture.root, []) + for (const args of [['--renderer', 'other'], ['--width', '-1']]) { + const out = capture() + await assert.rejects(runGea(['simulate', 'watch', ...args, '--dry-run'], { ...out.io, cwd: fixture.root, env }), (error) => error.exitCode === ExitCode.usage) + } +}) From 83325617986fa7d2715ec3d091df8dbba016868b Mon Sep 17 00:00:00 2001 From: Tamay Eser Uysal Date: Fri, 25 Sep 2026 02:02:03 +0200 Subject: [PATCH 2/2] Prepare CLI 0.1.83 for DOM simulator 0.1.9 Require core 0.1.26 for generated apps and Gea 1.4.3 in the counter starter. Align create-geastack 0.1.18 with the CLI and link its development dependency to the root package so clean installs work before publication. --- package-lock.json | 429 ++++++++++++++++++++++---- package.json | 6 +- packages/create-geastack/package.json | 4 +- starters/bundled/counter/package.json | 2 +- 4 files changed, 381 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 54c70f6..6049a7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "@geastack/cli", - "version": "0.1.82", + "version": "0.1.83", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@geastack/cli", - "version": "0.1.82", + "version": "0.1.83", "license": "Apache-2.0", "workspaces": [ "packages/*" ], "dependencies": { "@clack/prompts": "^1.8.0", - "@geastack/simulator": "^0.1.6", + "@geastack/simulator": "^0.1.9", "@geastack/targets": "^0.1.80", "picocolors": "^1.1.1", "serialport": "^13.0.0" @@ -188,18 +188,18 @@ } }, "node_modules/@geajs/core": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@geajs/core/-/core-1.4.0.tgz", - "integrity": "sha512-91Oz41mmsq5u8tMlGqe3HS5DuzH5RR81ZvmCDLrP8wvsLsnE4ddUeNALjuV7rGimE7SOXNqnPdR886OgFo9cRg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@geajs/core/-/core-1.4.3.tgz", + "integrity": "sha512-TtJQAiYMHcERu17XZb+phyD+ECKalRGFxRXLnUKGeAsKwYKpUfXhIdotBFC1JroyLYZ+CaOOhMfPvn2mBKK+Ig==", "license": "MIT", "dependencies": { "@types/react": "^19.0.0" } }, "node_modules/@geajs/vite-plugin": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@geajs/vite-plugin/-/vite-plugin-1.4.1.tgz", - "integrity": "sha512-R7BC/ybPZW5pJailL8ttEZrNjquCQ29gK0TwIz3lL4M4fKs/+afFpJeMUhig1nexpknTCQlveAUc1HRAdh71fA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@geajs/vite-plugin/-/vite-plugin-1.4.3.tgz", + "integrity": "sha512-R7gIPcUfdF7TaZKsObeBqN8DUSTcM0qlYOh5gxoMhHVZWPdtJIxQG+7ay8pW7iOp0KY7SxTOzvl59s7+HMU0jg==", "license": "MIT", "dependencies": { "@acemir/cssom": "^0.9.31", @@ -223,27 +223,8 @@ } }, "node_modules/@geastack/cli": { - "version": "0.1.82", - "resolved": "https://registry.npmjs.org/@geastack/cli/-/cli-0.1.82.tgz", - "integrity": "sha512-uio67iOq0/Zyyz6GOn7rKHTjtjrft66ORs7faCah3bsa4Khri4vYfQDaRfYDpTsgXtW3IeJQo0XDuDzB/5qRvA==", - "license": "Apache-2.0", - "workspaces": [ - "packages/*" - ], - "dependencies": { - "@clack/prompts": "^1.8.0", - "@geastack/simulator": "^0.1.6", - "@geastack/targets": "^0.1.80", - "picocolors": "^1.1.1", - "serialport": "^13.0.0" - }, - "bin": { - "gea": "bin/gea.mjs", - "create-geastack": "bin/create-geastack.mjs" - }, - "engines": { - "node": ">=20.19" - } + "resolved": "", + "link": true }, "node_modules/@geastack/compiler": { "version": "1.0.15", @@ -291,19 +272,19 @@ } }, "node_modules/@geastack/core": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@geastack/core/-/core-0.1.23.tgz", - "integrity": "sha512-pxr7tDSmS0CzSkKiMqSzUmzrWisc+YElJXEwWD1jOx5TdjxX1CPrsFvPZhSbpqEB1k1FVOYqfNIpAGPH8AW0Sw==", + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/@geastack/core/-/core-0.1.26.tgz", + "integrity": "sha512-Vqcyfow4fnLnBfzyPBkRJPo/yz+r2Pg5exmKhO/Rt+2REccwojJgjFt3xi8bwbyZTjAucqnpUE3GKVGSiF66Aw==", "license": "Apache-2.0", "dependencies": { "@babel/generator": "^7.23.0", "@babel/parser": "^7.23.0", "@babel/traverse": "^7.23.0", "@babel/types": "^7.23.0", - "@geajs/core": "1.4.0", - "@geajs/vite-plugin": "1.4.1", - "@geastack/compiler": "^1.0.4", - "@geastack/geatsc-plugin-gea": "^0.1.0", + "@geajs/core": "1.4.3", + "@geajs/vite-plugin": "1.4.3", + "@geastack/compiler": "^1.0.15", + "@geastack/geatsc-plugin-gea": "^0.1.7", "opentype.js": "^2.0.0", "vite": "^8.0.0" }, @@ -327,12 +308,12 @@ } }, "node_modules/@geastack/engine": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@geastack/engine/-/engine-0.1.5.tgz", - "integrity": "sha512-MVIctKbTj8pTwAB+cITZrfFGbBhrvEdkHPmH3v5OYRaCACfrzrvjkgEKm0iH8I/CZJp8d8K/0j6sgUluCVA2Yg==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@geastack/engine/-/engine-0.1.6.tgz", + "integrity": "sha512-Di38oC9XSBLfDf+zVIj2f045UBQ9/hkFVASf5Rv3o0lixjYRBjtV0i+SgqF6JphJ8LkytMmUOxkaRmMXG58GZA==", "license": "Apache-2.0", "dependencies": { - "@geastack/core": "^0.1.0" + "@geastack/core": "^0.1.26" }, "engines": { "node": ">=20.19" @@ -348,9 +329,9 @@ } }, "node_modules/@geastack/geatsc-plugin-gea": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@geastack/geatsc-plugin-gea/-/geatsc-plugin-gea-0.1.6.tgz", - "integrity": "sha512-87fVn9iulzQ4sk3p40zRErSsydyufnqS9Fx42KMt29J1zVYOxhSHQ9DLVC2Ds8969j9adN31XCs7DRVxb87i9w==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@geastack/geatsc-plugin-gea/-/geatsc-plugin-gea-0.1.7.tgz", + "integrity": "sha512-xQG2nrKlKZGVpfx+ylqArLur5FYpC0Nr/CWcYjROz7zB7Eg5MAJ59jlCcOH+0+zKpHRPdXazUEm+MrivbJvTmw==", "license": "Apache-2.0", "engines": { "node": ">=20.19" @@ -389,16 +370,16 @@ } }, "node_modules/@geastack/simulator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@geastack/simulator/-/simulator-0.1.6.tgz", - "integrity": "sha512-gDOjtkKUjRWFjUmzGW3nsq5Bd8OfYigRW1SnEUreBKglhYEliLq0UUbJK0cT6aRf2MHbKEXbahFyvjAR89/VzQ==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@geastack/simulator/-/simulator-0.1.9.tgz", + "integrity": "sha512-Z87RSlyz5XOueDrOqAHz1TYCwpRDlU9aTjJdrtJ6zCBdrcOEVoYkqQIRwyskifll14wiYjov1a/yPlp4X4vw0Q==", "license": "Apache-2.0", "dependencies": { - "@geastack/core": "^0.1.21", - "@geastack/elements": "^0.1.0", - "@geastack/engine": "^0.1.3", - "@geastack/geaos": "^0.1.1", - "@geastack/host": "^0.1.6", + "@geastack/core": "^0.1.26", + "@geastack/elements": "^0.1.2", + "@geastack/engine": "^0.1.6", + "@geastack/geaos": "^0.1.3", + "@geastack/host": "^0.1.8", "vite": "^8.0.0" }, "engines": { @@ -1472,6 +1453,346 @@ "csstype": "^3.2.2" } }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/create-geastack": { "resolved": "packages/create-geastack", "link": true @@ -2237,10 +2558,10 @@ } }, "packages/create-geastack": { - "version": "0.1.17", + "version": "0.1.18", "license": "Apache-2.0", "dependencies": { - "@geastack/cli": "^0.1.82" + "@geastack/cli": "^0.1.83" }, "bin": { "create-geastack": "bin/create-geastack.mjs" diff --git a/package.json b/package.json index d68b6b3..69bdd32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@geastack/cli", - "version": "0.1.82", + "version": "0.1.83", "description": "Command-line front door for GeaStack apps, targets, and local toolchains.", "license": "Apache-2.0", "repository": { @@ -37,13 +37,13 @@ ], "dependencies": { "@clack/prompts": "^1.8.0", - "@geastack/simulator": "^0.1.6", + "@geastack/simulator": "^0.1.9", "@geastack/targets": "^0.1.80", "picocolors": "^1.1.1", "serialport": "^13.0.0" }, "starterDependencies": { - "@geastack/core": "^0.1.24", + "@geastack/core": "^0.1.26", "@geastack/targets": "^0.1.77", "@geastack/apple": "^0.2.9" }, diff --git a/packages/create-geastack/package.json b/packages/create-geastack/package.json index 02046a0..acf7b7e 100644 --- a/packages/create-geastack/package.json +++ b/packages/create-geastack/package.json @@ -1,6 +1,6 @@ { "name": "create-geastack", - "version": "0.1.17", + "version": "0.1.18", "description": "Project scaffolder for GeaStack apps: `npx create-geastack my-app` or `npm create geastack my-app`.", "license": "Apache-2.0", "repository": { @@ -22,6 +22,6 @@ "access": "public" }, "dependencies": { - "@geastack/cli": "^0.1.82" + "@geastack/cli": "^0.1.83" } } diff --git a/starters/bundled/counter/package.json b/starters/bundled/counter/package.json index 744a14d..dec07c3 100644 --- a/starters/bundled/counter/package.json +++ b/starters/bundled/counter/package.json @@ -8,7 +8,7 @@ "check": "tsc --noEmit" }, "dependencies": { - "@geajs/core": "1.4.2" + "@geajs/core": "1.4.3" }, "devDependencies": { "typescript": "latest"