@atolljs/cli 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/cli.js +32 -23
- package/package.json +1 -1
- package/src/cli.ts +3 -1
- package/src/commands.ts +26 -13
- package/src/files.ts +8 -2
- package/src/templates.ts +9 -9
package/README.md
CHANGED
|
@@ -30,10 +30,12 @@ atoll new <dir> [--framework react|vue|solid|svelte|node] [--mfe] [--pm npm]
|
|
|
30
30
|
self-contained remote bundle) + a dev harness mounting the
|
|
31
31
|
island through the contract.
|
|
32
32
|
|
|
33
|
-
atoll init
|
|
33
|
+
atoll init [--name app] [--dir <path>] [--framework <fw>]
|
|
34
34
|
Wire Atoll into the current project: .npmrc, installs the @atolljs/*
|
|
35
35
|
packages your framework needs, and generates a working spine —
|
|
36
|
-
app.memory.ts + app.worker.ts + app.ts under src/atoll/.
|
|
36
|
+
app.memory.ts + app.worker.ts + app.ts under src/atoll/. --dir
|
|
37
|
+
relocates the spine; --framework overrides detection (monorepos
|
|
38
|
+
where the root package.json doesn't describe the target project).
|
|
37
39
|
|
|
38
40
|
atoll add worker <name> pooled worker + typed client (browser or node)
|
|
39
41
|
atoll add memory <name> shared-memory contract module
|
|
@@ -53,3 +55,7 @@ atoll doctor [--fix] verify deps, lockfile, .npmrc policy,
|
|
|
53
55
|
|
|
54
56
|
Existing files are never overwritten without `--force`; missing answers
|
|
55
57
|
prompt interactively (or take defaults under `--yes` / no TTY).
|
|
58
|
+
|
|
59
|
+
**Nx workspaces:** use `@atolljs/nx` — `nx g @atolljs/nx:init`,
|
|
60
|
+
`nx g @atolljs/nx:worker <name>`, and `nx run <p>:atoll-doctor` wrap these
|
|
61
|
+
commands with project/`sourceRoot` scoping. See `packages/nx/README.md`.
|
package/dist/cli.js
CHANGED
|
@@ -181,9 +181,10 @@ function missingDeps(pkg, want) {
|
|
|
181
181
|
import { existsSync as existsSync2, mkdirSync, writeFileSync } from "node:fs";
|
|
182
182
|
import { dirname as dirname2, join as join2, normalize } from "node:path";
|
|
183
183
|
async function writeTree(io, cwd, files, opts = {}) {
|
|
184
|
+
const bound = normalize(opts.within ?? cwd);
|
|
184
185
|
for (const f of files) {
|
|
185
186
|
const abs = normalize(join2(cwd, f.path));
|
|
186
|
-
if (!abs.startsWith(
|
|
187
|
+
if (!abs.startsWith(bound)) {
|
|
187
188
|
io.error(`refusing to write outside the project: ${io.fmt.accent(f.path)}`);
|
|
188
189
|
continue;
|
|
189
190
|
}
|
|
@@ -579,8 +580,8 @@ var HEADERS = ` // SharedArrayBuffer is gated behind cross-origin isolation \u2
|
|
|
579
580
|
},`;
|
|
580
581
|
var SCAFFOLDS = {
|
|
581
582
|
react: {
|
|
582
|
-
deps: { react: "^19.3.0", "react-dom": "^19.3.0", "react-reconciler": "^0.34.0", "@atolljs/core": "^0.1.
|
|
583
|
-
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-react": "^6.1.1", "@atolljs/vite": "^0.1.
|
|
583
|
+
deps: { react: "^19.3.0", "react-dom": "^19.3.0", "react-reconciler": "^0.34.0", "@atolljs/core": "^0.1.12", "@atolljs/react": "^0.1.12", "@atolljs/react-island": "^0.1.12", zod: "^4.6.5" },
|
|
584
|
+
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-react": "^6.1.1", "@atolljs/vite": "^0.1.12", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0" },
|
|
584
585
|
// `exclude` replaces the plugin's default /node_modules/ — keep it, and
|
|
585
586
|
// add *.worker.*: fast-refresh injects `/@react-refresh` (which reads
|
|
586
587
|
// `window` unguarded) into every transformed module, including worker
|
|
@@ -588,19 +589,19 @@ var SCAFFOLDS = {
|
|
|
588
589
|
vitePlugin: { pkg: "@vitejs/plugin-react", import_: `import react from '@vitejs/plugin-react';`, call: "react({ exclude: [/\\/node_modules\\//, /\\.worker\\./] })" }
|
|
589
590
|
},
|
|
590
591
|
vue: {
|
|
591
|
-
deps: { vue: "^3.5.43", "@atolljs/core": "^0.1.
|
|
592
|
-
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-vue": "^6.0.9", "@atolljs/vite": "^0.1.
|
|
592
|
+
deps: { vue: "^3.5.43", "@atolljs/core": "^0.1.12", "@atolljs/vue": "^0.1.12", "@atolljs/vue-island": "^0.1.12", zod: "^4.6.5" },
|
|
593
|
+
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@vitejs/plugin-vue": "^6.0.9", "@atolljs/vite": "^0.1.12" },
|
|
593
594
|
vitePlugin: { pkg: "@vitejs/plugin-vue", import_: `import vue from '@vitejs/plugin-vue';`, call: "vue()" }
|
|
594
595
|
},
|
|
595
596
|
solid: {
|
|
596
|
-
deps: { "solid-js": "^1.9.15", "@atolljs/core": "^0.1.
|
|
597
|
-
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "vite-plugin-solid": "^2.11.14", "@atolljs/vite": "^0.1.
|
|
597
|
+
deps: { "solid-js": "^1.9.15", "@atolljs/core": "^0.1.12", "@atolljs/solidjs": "^0.1.12", "@atolljs/solid-island": "^0.1.12", zod: "^4.6.5" },
|
|
598
|
+
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "vite-plugin-solid": "^2.11.14", "@atolljs/vite": "^0.1.12" },
|
|
598
599
|
atollCall: `atoll({ jsxImportSource: 'solid-js' })`,
|
|
599
600
|
vitePlugin: { pkg: "vite-plugin-solid", import_: `import solid from 'vite-plugin-solid';`, call: "solid()" }
|
|
600
601
|
},
|
|
601
602
|
svelte: {
|
|
602
|
-
deps: { svelte: "^5.57.1", "@atolljs/core": "^0.1.
|
|
603
|
-
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@sveltejs/vite-plugin-svelte": "^7.3.1", "@atolljs/vite": "^0.1.
|
|
603
|
+
deps: { svelte: "^5.57.1", "@atolljs/core": "^0.1.12", "@atolljs/svelte": "^0.1.12", "@atolljs/svelte-island": "^0.1.12", zod: "^4.6.5" },
|
|
604
|
+
devDeps: { vite: "^8.3.1", typescript: "^7.0.2", "@sveltejs/vite-plugin-svelte": "^7.3.1", "@atolljs/vite": "^0.1.12" },
|
|
604
605
|
vitePlugin: { pkg: "@sveltejs/vite-plugin-svelte", import_: `import { svelte } from '@sveltejs/vite-plugin-svelte';`, call: "svelte()" }
|
|
605
606
|
}
|
|
606
607
|
};
|
|
@@ -896,7 +897,7 @@ function nodeScaffoldFiles(appName) {
|
|
|
896
897
|
start: "tsx src/main.ts",
|
|
897
898
|
bundle: "esbuild src/atoll/tasks.worker.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/tasks.worker.js"
|
|
898
899
|
},
|
|
899
|
-
dependencies: { "@atolljs/core": "^0.1.
|
|
900
|
+
dependencies: { "@atolljs/core": "^0.1.12", "@atolljs/node": "^0.1.12", zod: "^4.6.5" },
|
|
900
901
|
devDependencies: { esbuild: "^0.28.2", tsx: "^4.23.15", typescript: "^7.0.2", "@types/node": "^26.6.3" }
|
|
901
902
|
},
|
|
902
903
|
null,
|
|
@@ -2353,21 +2354,26 @@ async function runInit(ctx) {
|
|
|
2353
2354
|
return 1;
|
|
2354
2355
|
}
|
|
2355
2356
|
const rel = (abs) => relative(ctx.cwd, abs).replaceAll("\\", "/");
|
|
2357
|
+
const framework = flag(ctx.args, "framework") ?? project.framework;
|
|
2356
2358
|
ctx.io.print(
|
|
2357
2359
|
ctx.io.fmt.dim(
|
|
2358
|
-
`detected: ${
|
|
2360
|
+
`detected: ${framework} \xB7 ${project.pm} \xB7 root ${project.root}`
|
|
2359
2361
|
)
|
|
2360
2362
|
);
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2363
|
+
const within = project.root;
|
|
2364
|
+
await writeTree(
|
|
2365
|
+
ctx.io,
|
|
2366
|
+
ctx.cwd,
|
|
2367
|
+
[{ path: rel(join3(project.root, ".npmrc")), content: NPMRC }],
|
|
2368
|
+
{ force: hasFlag(ctx.args, "force"), within }
|
|
2369
|
+
);
|
|
2370
|
+
const atollDir = flag(ctx.args, "dir") ? join3(ctx.cwd, flag(ctx.args, "dir")) : join3(project.srcDir, "atoll");
|
|
2371
|
+
const host = hostOf(framework);
|
|
2366
2372
|
const name = flag(ctx.args, "name") ?? "app";
|
|
2367
2373
|
const files = [
|
|
2368
2374
|
{ path: `${rel(atollDir)}/${name}.memory.ts`, content: memoryContract(name) }
|
|
2369
2375
|
];
|
|
2370
|
-
if (
|
|
2376
|
+
if (framework === "nestjs") {
|
|
2371
2377
|
files.push(
|
|
2372
2378
|
...nestjsServiceFiles(name, rel(atollDir), {
|
|
2373
2379
|
import_: `./${name}.memory`,
|
|
@@ -2397,11 +2403,11 @@ async function runInit(ctx) {
|
|
|
2397
2403
|
}
|
|
2398
2404
|
);
|
|
2399
2405
|
}
|
|
2400
|
-
await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, "force") });
|
|
2401
|
-
await offerInstall(ctx, project, ATOLL_DEPS[
|
|
2406
|
+
await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, "force"), within });
|
|
2407
|
+
await offerInstall(ctx, project, ATOLL_DEPS[framework]);
|
|
2402
2408
|
ctx.io.print("");
|
|
2403
2409
|
ctx.io.print(ctx.io.fmt.strong("next steps:"));
|
|
2404
|
-
if (
|
|
2410
|
+
if (framework === "nestjs") {
|
|
2405
2411
|
ctx.io.print(
|
|
2406
2412
|
` import ${ctx.io.fmt.accent(`${pascal(name)}Module`)} into AppModule, then inject ${ctx.io.fmt.accent(`${pascal(name)}Service`)} \u2014 ${ctx.io.fmt.accent(`service.echo('hi')`)} runs in a worker`
|
|
2407
2413
|
);
|
|
@@ -2735,7 +2741,7 @@ bind it: pass ${ctx.io.fmt.accent(`${c}Memory`)} as ${ctx.io.fmt.accent("sharedM
|
|
|
2735
2741
|
...files,
|
|
2736
2742
|
{ path: publishCfg, content: mfePublishConfig(name, framework, dirFromRoot) }
|
|
2737
2743
|
],
|
|
2738
|
-
force
|
|
2744
|
+
{ ...force, within: project.root }
|
|
2739
2745
|
);
|
|
2740
2746
|
if (missingDeps(project.pkg, ["vite"]).length) {
|
|
2741
2747
|
ctx.io.warn(
|
|
@@ -2821,7 +2827,8 @@ bind it: pass ${ctx.io.fmt.accent(`${c}Memory`)} as ${ctx.io.fmt.accent("sharedM
|
|
|
2821
2827
|
await writeTree(
|
|
2822
2828
|
ctx.io,
|
|
2823
2829
|
ctx.cwd,
|
|
2824
|
-
|
|
2830
|
+
// --dir names the dir instrumentation.ts lands in (default: srcDir).
|
|
2831
|
+
[nextjsInstrumentationFile(name, flag(ctx.args, "dir") ?? rel(project.srcDir))],
|
|
2825
2832
|
force
|
|
2826
2833
|
);
|
|
2827
2834
|
ctx.io.print(
|
|
@@ -3059,9 +3066,11 @@ var HELP = (fmt) => `${fmt.strong("atoll")} \u2014 bootstrap multithreading ${fm
|
|
|
3059
3066
|
or a tsx Node service with a pooled worker. --mfe scaffolds a
|
|
3060
3067
|
publishable MFE package (contract + worker + bundle build).
|
|
3061
3068
|
|
|
3062
|
-
${fmt.accent("atoll init")} [--name app] [--force]
|
|
3069
|
+
${fmt.accent("atoll init")} [--name app] [--dir <path>] [--framework <fw>] [--force]
|
|
3063
3070
|
Wire Atoll into the current project: hardened .npmrc, package
|
|
3064
3071
|
install, and a contract + worker + client spine under src/atoll/.
|
|
3072
|
+
--dir relocates the spine, --framework overrides detection \u2014 both
|
|
3073
|
+
are how monorepo integrations (e.g. @atolljs/nx) scope it.
|
|
3065
3074
|
|
|
3066
3075
|
${fmt.accent("atoll add [framework] <kind> [variant] [name]")}
|
|
3067
3076
|
worker pool + typed client (+ framework bindings on UI projects)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atolljs/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"description": "atoll — scaffold worker pools, shared-memory contracts, and framework islands (experimental)",
|
|
5
5
|
"homepage": "https://jwhenry3.github.io/atolljs/consumer/quickstart/",
|
|
6
6
|
"type": "module",
|
package/src/cli.ts
CHANGED
|
@@ -21,9 +21,11 @@ const HELP = (fmt: Fmt) => `${fmt.strong('atoll')} — bootstrap multithreading
|
|
|
21
21
|
or a tsx Node service with a pooled worker. --mfe scaffolds a
|
|
22
22
|
publishable MFE package (contract + worker + bundle build).
|
|
23
23
|
|
|
24
|
-
${fmt.accent('atoll init')} [--name app] [--force]
|
|
24
|
+
${fmt.accent('atoll init')} [--name app] [--dir <path>] [--framework <fw>] [--force]
|
|
25
25
|
Wire Atoll into the current project: hardened .npmrc, package
|
|
26
26
|
install, and a contract + worker + client spine under src/atoll/.
|
|
27
|
+
--dir relocates the spine, --framework overrides detection — both
|
|
28
|
+
are how monorepo integrations (e.g. @atolljs/nx) scope it.
|
|
27
29
|
|
|
28
30
|
${fmt.accent('atoll add [framework] <kind> [variant] [name]')}
|
|
29
31
|
worker pool + typed client (+ framework bindings on UI projects)
|
package/src/commands.ts
CHANGED
|
@@ -80,28 +80,40 @@ export async function runInit(ctx: Ctx): Promise<number> {
|
|
|
80
80
|
return 1;
|
|
81
81
|
}
|
|
82
82
|
const rel = (abs: string) => relative(ctx.cwd, abs).replaceAll('\\', '/');
|
|
83
|
+
// --framework overrides detection (monorepos where the root package.json
|
|
84
|
+
// doesn't describe the target project — e.g. Nx workspaces, where the nx
|
|
85
|
+
// plugin also supplies --dir for the same reason).
|
|
86
|
+
const framework = (flag(ctx.args, 'framework') as Framework | undefined) ?? project.framework;
|
|
83
87
|
ctx.io.print(
|
|
84
88
|
ctx.io.fmt.dim(
|
|
85
|
-
`detected: ${
|
|
89
|
+
`detected: ${framework} · ${project.pm} · root ${project.root}`,
|
|
86
90
|
),
|
|
87
91
|
);
|
|
88
92
|
|
|
89
|
-
// Supply-chain baseline — the same .npmrc this repo ships.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
// Supply-chain baseline — the same .npmrc this repo ships. Written at the
|
|
94
|
+
// detected project root, which may sit ABOVE cwd (the nx plugin invokes
|
|
95
|
+
// the CLI inside a project dir) — bound the write guard to the root.
|
|
96
|
+
const within = project.root;
|
|
97
|
+
await writeTree(
|
|
98
|
+
ctx.io,
|
|
99
|
+
ctx.cwd,
|
|
100
|
+
[{ path: rel(join(project.root, '.npmrc')), content: T.NPMRC }],
|
|
101
|
+
{ force: hasFlag(ctx.args, 'force'), within },
|
|
102
|
+
);
|
|
93
103
|
|
|
94
104
|
// A working spine — written BEFORE the install so a failed install still
|
|
95
105
|
// leaves a complete, retryable scaffold. NestJS gets the DI-native spine
|
|
96
106
|
// (service facade + registerPool module + worker entry); other hosts get
|
|
97
107
|
// the contract + worker + client trio.
|
|
98
|
-
const atollDir =
|
|
99
|
-
|
|
108
|
+
const atollDir = flag(ctx.args, 'dir')
|
|
109
|
+
? join(ctx.cwd, flag(ctx.args, 'dir')!)
|
|
110
|
+
: join(project.srcDir, 'atoll');
|
|
111
|
+
const host = hostOf(framework);
|
|
100
112
|
const name = flag(ctx.args, 'name') ?? 'app';
|
|
101
113
|
const files: OutFile[] = [
|
|
102
114
|
{ path: `${rel(atollDir)}/${name}.memory.ts`, content: T.memoryContract(name) },
|
|
103
115
|
];
|
|
104
|
-
if (
|
|
116
|
+
if (framework === 'nestjs') {
|
|
105
117
|
files.push(
|
|
106
118
|
...T.nestjsServiceFiles(name, rel(atollDir), {
|
|
107
119
|
import_: `./${name}.memory`,
|
|
@@ -131,13 +143,13 @@ export async function runInit(ctx: Ctx): Promise<number> {
|
|
|
131
143
|
},
|
|
132
144
|
);
|
|
133
145
|
}
|
|
134
|
-
await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, 'force') });
|
|
146
|
+
await writeTree(ctx.io, ctx.cwd, files, { force: hasFlag(ctx.args, 'force'), within });
|
|
135
147
|
|
|
136
|
-
await offerInstall(ctx, project, ATOLL_DEPS[
|
|
148
|
+
await offerInstall(ctx, project, ATOLL_DEPS[framework]);
|
|
137
149
|
|
|
138
150
|
ctx.io.print('');
|
|
139
151
|
ctx.io.print(ctx.io.fmt.strong('next steps:'));
|
|
140
|
-
if (
|
|
152
|
+
if (framework === 'nestjs') {
|
|
141
153
|
ctx.io.print(
|
|
142
154
|
` import ${ctx.io.fmt.accent(`${pascal(name)}Module`)} into AppModule, then inject ${ctx.io.fmt.accent(`${pascal(name)}Service`)} — ${ctx.io.fmt.accent(`service.echo('hi')`)} runs in a worker`,
|
|
143
155
|
);
|
|
@@ -546,7 +558,7 @@ export async function runAdd(ctx: Ctx): Promise<number> {
|
|
|
546
558
|
...files,
|
|
547
559
|
{ path: publishCfg, content: T.mfePublishConfig(name, framework, dirFromRoot) },
|
|
548
560
|
],
|
|
549
|
-
force,
|
|
561
|
+
{ ...force, within: project.root! },
|
|
550
562
|
);
|
|
551
563
|
if (missingDeps(project.pkg, ['vite']).length) {
|
|
552
564
|
ctx.io.warn(
|
|
@@ -639,7 +651,8 @@ export async function runAdd(ctx: Ctx): Promise<number> {
|
|
|
639
651
|
await writeTree(
|
|
640
652
|
ctx.io,
|
|
641
653
|
ctx.cwd,
|
|
642
|
-
|
|
654
|
+
// --dir names the dir instrumentation.ts lands in (default: srcDir).
|
|
655
|
+
[T.nextjsInstrumentationFile(name, flag(ctx.args, 'dir') ?? rel(project.srcDir))],
|
|
643
656
|
force,
|
|
644
657
|
);
|
|
645
658
|
ctx.io.print(
|
package/src/files.ts
CHANGED
|
@@ -12,16 +12,22 @@ export interface OutFile {
|
|
|
12
12
|
* Write a set of files under `cwd`. Existing files are never silently
|
|
13
13
|
* clobbered — `--force` overwrites, interactive sessions get a prompt, and
|
|
14
14
|
* non-interactive runs skip with a warning.
|
|
15
|
+
*
|
|
16
|
+
* `within` bounds where writes may land (default: `cwd`). Commands invoked
|
|
17
|
+
* from a subdirectory — e.g. the nx plugin running the CLI inside a project
|
|
18
|
+
* dir — pass the detected project root so artifacts that belong there
|
|
19
|
+
* (.npmrc, vite.mfe.config.ts) don't trip the escape guard.
|
|
15
20
|
*/
|
|
16
21
|
export async function writeTree(
|
|
17
22
|
io: Io,
|
|
18
23
|
cwd: string,
|
|
19
24
|
files: readonly OutFile[],
|
|
20
|
-
opts: { force?: boolean } = {},
|
|
25
|
+
opts: { force?: boolean; within?: string } = {},
|
|
21
26
|
): Promise<void> {
|
|
27
|
+
const bound = normalize(opts.within ?? cwd);
|
|
22
28
|
for (const f of files) {
|
|
23
29
|
const abs = normalize(join(cwd, f.path));
|
|
24
|
-
if (!abs.startsWith(
|
|
30
|
+
if (!abs.startsWith(bound)) {
|
|
25
31
|
io.error(`refusing to write outside the project: ${io.fmt.accent(f.path)}`);
|
|
26
32
|
continue;
|
|
27
33
|
}
|
package/src/templates.ts
CHANGED
|
@@ -423,8 +423,8 @@ interface ScaffoldSpec {
|
|
|
423
423
|
|
|
424
424
|
const SCAFFOLDS: Record<string, ScaffoldSpec> = {
|
|
425
425
|
react: {
|
|
426
|
-
deps: { react: '^19.3.0', 'react-dom': '^19.3.0', 'react-reconciler': '^0.34.0', '@atolljs/core': '^0.1.
|
|
427
|
-
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-react': '^6.1.1', '@atolljs/vite': '^0.1.
|
|
426
|
+
deps: { react: '^19.3.0', 'react-dom': '^19.3.0', 'react-reconciler': '^0.34.0', '@atolljs/core': '^0.1.12', '@atolljs/react': '^0.1.12', '@atolljs/react-island': '^0.1.12', zod: '^4.6.5' },
|
|
427
|
+
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-react': '^6.1.1', '@atolljs/vite': '^0.1.12', '@types/react': '^19.3.0', '@types/react-dom': '^19.3.0' },
|
|
428
428
|
// `exclude` replaces the plugin's default /node_modules/ — keep it, and
|
|
429
429
|
// add *.worker.*: fast-refresh injects `/@react-refresh` (which reads
|
|
430
430
|
// `window` unguarded) into every transformed module, including worker
|
|
@@ -432,19 +432,19 @@ const SCAFFOLDS: Record<string, ScaffoldSpec> = {
|
|
|
432
432
|
vitePlugin: { pkg: '@vitejs/plugin-react', import_: `import react from '@vitejs/plugin-react';`, call: 'react({ exclude: [/\\/node_modules\\//, /\\.worker\\./] })' },
|
|
433
433
|
},
|
|
434
434
|
vue: {
|
|
435
|
-
deps: { vue: '^3.5.43', '@atolljs/core': '^0.1.
|
|
436
|
-
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-vue': '^6.0.9', '@atolljs/vite': '^0.1.
|
|
435
|
+
deps: { vue: '^3.5.43', '@atolljs/core': '^0.1.12', '@atolljs/vue': '^0.1.12', '@atolljs/vue-island': '^0.1.12', zod: '^4.6.5' },
|
|
436
|
+
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@vitejs/plugin-vue': '^6.0.9', '@atolljs/vite': '^0.1.12' },
|
|
437
437
|
vitePlugin: { pkg: '@vitejs/plugin-vue', import_: `import vue from '@vitejs/plugin-vue';`, call: 'vue()' },
|
|
438
438
|
},
|
|
439
439
|
solid: {
|
|
440
|
-
deps: { 'solid-js': '^1.9.15', '@atolljs/core': '^0.1.
|
|
441
|
-
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', 'vite-plugin-solid': '^2.11.14', '@atolljs/vite': '^0.1.
|
|
440
|
+
deps: { 'solid-js': '^1.9.15', '@atolljs/core': '^0.1.12', '@atolljs/solidjs': '^0.1.12', '@atolljs/solid-island': '^0.1.12', zod: '^4.6.5' },
|
|
441
|
+
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', 'vite-plugin-solid': '^2.11.14', '@atolljs/vite': '^0.1.12' },
|
|
442
442
|
atollCall: `atoll({ jsxImportSource: 'solid-js' })`,
|
|
443
443
|
vitePlugin: { pkg: 'vite-plugin-solid', import_: `import solid from 'vite-plugin-solid';`, call: 'solid()' },
|
|
444
444
|
},
|
|
445
445
|
svelte: {
|
|
446
|
-
deps: { svelte: '^5.57.1', '@atolljs/core': '^0.1.
|
|
447
|
-
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@sveltejs/vite-plugin-svelte': '^7.3.1', '@atolljs/vite': '^0.1.
|
|
446
|
+
deps: { svelte: '^5.57.1', '@atolljs/core': '^0.1.12', '@atolljs/svelte': '^0.1.12', '@atolljs/svelte-island': '^0.1.12', zod: '^4.6.5' },
|
|
447
|
+
devDeps: { vite: '^8.3.1', typescript: '^7.0.2', '@sveltejs/vite-plugin-svelte': '^7.3.1', '@atolljs/vite': '^0.1.12' },
|
|
448
448
|
vitePlugin: { pkg: '@sveltejs/vite-plugin-svelte', import_: `import { svelte } from '@sveltejs/vite-plugin-svelte';`, call: 'svelte()' },
|
|
449
449
|
},
|
|
450
450
|
};
|
|
@@ -726,7 +726,7 @@ export function nodeScaffoldFiles(appName: string): OutFile[] {
|
|
|
726
726
|
bundle:
|
|
727
727
|
'esbuild src/atoll/tasks.worker.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/tasks.worker.js',
|
|
728
728
|
},
|
|
729
|
-
dependencies: { '@atolljs/core': '^0.1.
|
|
729
|
+
dependencies: { '@atolljs/core': '^0.1.12', '@atolljs/node': '^0.1.12', zod: '^4.6.5' },
|
|
730
730
|
devDependencies: { esbuild: '^0.28.2', tsx: '^4.23.15', typescript: '^7.0.2', '@types/node': '^26.6.3' },
|
|
731
731
|
},
|
|
732
732
|
null,
|