@fougere/cli 0.13.0-alpha.0 → 0.14.0-alpha.0

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.
Files changed (40) hide show
  1. package/dist/.fougere/scan.generated.js +1 -1
  2. package/dist/.fougere/scan.generated.js.map +1 -1
  3. package/dist/app/commands/MigrateCommand.d.ts +2 -2
  4. package/dist/app/commands/MigrateCommand.d.ts.map +1 -1
  5. package/dist/app/commands/MigrateCommand.js +15 -13
  6. package/dist/app/commands/MigrateCommand.js.map +1 -1
  7. package/dist/app/commands/NewCommand.d.ts +4 -12
  8. package/dist/app/commands/NewCommand.d.ts.map +1 -1
  9. package/dist/app/commands/NewCommand.js +51 -85
  10. package/dist/app/commands/NewCommand.js.map +1 -1
  11. package/dist/fronds/analysis/entities/Migrate.d.ts +1 -1
  12. package/dist/fronds/analysis/entities/Migrate.d.ts.map +1 -1
  13. package/dist/fronds/analysis/entities/Migrate.js +1 -1
  14. package/dist/fronds/analysis/entities/Migrate.js.map +1 -1
  15. package/dist/fronds/analysis/handlers/MigrateHandler.d.ts +14 -9
  16. package/dist/fronds/analysis/handlers/MigrateHandler.d.ts.map +1 -1
  17. package/dist/fronds/analysis/handlers/MigrateHandler.js +83 -39
  18. package/dist/fronds/analysis/handlers/MigrateHandler.js.map +1 -1
  19. package/dist/fronds/analysis/services/ProjectScan.d.ts +2 -2
  20. package/dist/fronds/analysis/services/ProjectScan.js +2 -2
  21. package/dist/fronds/scaffold/entities/New.d.ts +2 -5
  22. package/dist/fronds/scaffold/entities/New.d.ts.map +1 -1
  23. package/dist/fronds/scaffold/entities/New.js +5 -8
  24. package/dist/fronds/scaffold/entities/New.js.map +1 -1
  25. package/dist/fronds/scaffold/services/ProjectWriter.d.ts +16 -0
  26. package/dist/fronds/scaffold/services/ProjectWriter.d.ts.map +1 -1
  27. package/dist/fronds/scaffold/services/ProjectWriter.js +84 -12
  28. package/dist/fronds/scaffold/services/ProjectWriter.js.map +1 -1
  29. package/dist/src/composer/Composer.d.ts +61 -0
  30. package/dist/src/composer/Composer.d.ts.map +1 -0
  31. package/dist/src/composer/Composer.js +246 -0
  32. package/dist/src/composer/Composer.js.map +1 -0
  33. package/dist/src/composer/Plan.d.ts +36 -0
  34. package/dist/src/composer/Plan.d.ts.map +1 -0
  35. package/dist/src/composer/Plan.js +70 -0
  36. package/dist/src/composer/Plan.js.map +1 -0
  37. package/package.json +16 -15
  38. package/templates/frond/pnpm-workspace.yaml +9 -0
  39. package/templates/workspace/package.json +5 -3
  40. package/templates/workspace/pnpm-workspace.yaml +1 -1
@@ -1,16 +1,17 @@
1
1
  import { loadConfig } from '@fougere/core/node';
2
+ import { Card, lowerFirst } from '@fougere/schema';
2
3
  import { chainOf } from '../versions.js';
3
4
  /**
4
- * Catching the database up with the frozen chain.
5
+ * Bringing the database up to what the entities declare — the one place a schema is written.
5
6
  *
6
- * Every step is replayed in order and what has already happened is SKIPPED, read off the
7
- * columns themselves rather than a ledger of applied migrations. That is what makes the
8
- * chain safe to replay whole: nothing here has to know which version the database sits
9
- * at, and a column renamed by hand is seen rather than contradicted.
7
+ * The app is booted as its host would boot it, with the schema check and the seeds left out:
8
+ * the check would refuse the very database this is here to bring up, and a migration plants no
9
+ * rows. Booted rather than scanned, because a frond an extension brings — auth's sessions, a
10
+ * workflow's journal — has tables too, and the scan alone never sees it.
10
11
  *
11
- * The additive pass is not repeated here — a boot already creates missing tables and
12
- * columns. What this adds is the half that touches live data, and only what a human
13
- * declared at `fougere freeze`.
12
+ * What touches live data runs FIRST: a rename moves a column before the additive pass would
13
+ * otherwise add its new name empty beside it. Every change is skipped when the columns already
14
+ * say it happened, so the whole thing replays safely.
14
15
  */
15
16
  export default class MigrateHandler {
16
17
  projectScan;
@@ -18,7 +19,7 @@ export default class MigrateHandler {
18
19
  this.projectScan = projectScan;
19
20
  }
20
21
  /**
21
- * Realise the frozen steps this database has not caught up with.
22
+ * Plan the migration, and run it when `apply` says so.
22
23
  *
23
24
  * `json` is the presentation's, so it is not part of what this operation receives.
24
25
  */
@@ -26,51 +27,94 @@ export default class MigrateHandler {
26
27
  const scan = await this.projectScan.at(input.root ?? undefined);
27
28
  const perFrond = await Promise.all(scan.fronds.map((frond) => stepsOf(frond.source.path)));
28
29
  const steps = perFrond.flat();
29
- if (steps.length === 0)
30
- return { chain: [], changes: [], refusals: [], ran: [] };
30
+ const chain = versionsOf(steps);
31
31
  const config = await loadConfig(scan.root);
32
- // `fougere migrate --root ../app` read that project's config and planned against a
33
- // database beside the CLI's own directory — the loudest form of this bug.
34
- const { resolveStorage } = await import('@fougere/defaults');
35
- const storage = resolveStorage(config.db ?? {}, undefined, scan.root);
32
+ const { bootApp, resolveStorage } = await import('@fougere/defaults');
33
+ const storage = resolveStorage(config.db ?? {}, config.sources, scan.root);
36
34
  if (!storage.db) {
35
+ await storage.close?.();
37
36
  return {
38
- chain: versionsOf(steps),
39
- changes: [],
37
+ chain, changes: [], added: [], warnings: [], ran: [],
40
38
  refusals: [{ entity: '*', field: '*', reason: 'no `db` in fougere.config.ts — nothing to migrate' }],
41
- ran: [],
42
39
  };
43
40
  }
44
41
  // Resolved from the project rather than named in this package's dependencies:
45
42
  // `@fougere/adapter-sql` declares `better-sqlite3`, so a CLI depending on it installs
46
43
  // 26 MB of native module into every `npm create fougere`. A project that migrates
47
44
  // declares the adapter itself, which is where this resolves from.
48
- const { actualState, desiredTables, planStep, collapseChain, applyStep } = await import('@fougere/adapter-sql');
49
- const tables = desiredTables(scan);
50
- // Each frond's chain is composed on its own — its versions are its own line — and the
51
- // results are gathered by SOURCE, because an engine is what a statement runs against.
52
- const composed = collapseChain(perFrond.map((chain) => collapseChain(chain.map(({ step }) => step))));
53
- const sourceOf = storage.sourceOf ?? (() => 'db');
54
- const changes = [];
55
- const refusals = [];
56
- const ran = [];
57
- for (const source of storage.sources?.() ?? ['db']) {
58
- const db = (source === 'db' ? storage.db : storage.dbOf?.(source));
59
- if (!db)
60
- continue;
61
- const mine = onSource(composed, source, sourceOf);
62
- if (Object.keys(mine.entities).length === 0)
63
- continue;
64
- const plan = planStep(mine, tables, { actual: await actualState(db) });
65
- changes.push(...plan.changes);
66
- refusals.push(...plan.refusals);
45
+ const { actualState, desiredTables, planStep, collapseChain, applyStep, undeclaredColumns } = await import('@fougere/adapter-sql');
46
+ const app = await bootApp(scan.root, { extensions: [{ name: 'schema' }, { name: 'seeds' }] });
47
+ try {
48
+ const tables = desiredTables(app);
49
+ const frozen = collapseChain(perFrond.map((one) => collapseChain(one.map(({ step }) => step))));
50
+ const composed = collapseChain([frozen, declaredStep(app, frozen)]);
51
+ const sourceOf = storage.sourceOf ?? (() => 'db');
52
+ const changes = [];
53
+ const refusals = [];
54
+ const warnings = [];
55
+ const plans = [];
56
+ for (const source of storage.sources?.() ?? ['db']) {
57
+ const db = (source === 'db' ? storage.db : storage.dbOf?.(source));
58
+ if (!db)
59
+ continue;
60
+ const actual = await actualState(db);
61
+ const plan = planStep(onSource(composed, source, sourceOf), tables, { actual });
62
+ changes.push(...plan.changes);
63
+ refusals.push(...plan.refusals);
64
+ plans.push({ plan, db });
65
+ const renamed = new Set(plan.changes.flatMap((change) => change.kind === 'renameColumn' ? [`${change.table}.${change.from}`] : []));
66
+ const mine = tables.filter((table) => actual.has(table.name));
67
+ for (const { table, columns, added } of undeclaredColumns(mine, actual)) {
68
+ const left = columns.filter((column) => !renamed.has(`${table}.${column}`));
69
+ if (left.length === 0)
70
+ continue;
71
+ warnings.push(`${table} keeps ${left.join(', ')}, which no field declares, while ${added.join(', ')} is added — `
72
+ + `if one replaces the other, declare it on the entity: previous: { ${added[0]}: '${left[0]}' }`);
73
+ }
74
+ }
75
+ const moved = new Set(changes.flatMap((change) => change.kind === 'renameColumn' ? [`${change.table}.${change.to} — no column`] : []));
76
+ const added = (await storage.pending?.(app) ?? []).filter((line) => !moved.has(line));
77
+ if (!input.apply || refusals.length > 0)
78
+ return { chain, changes, added, refusals, warnings, ran: [] };
67
79
  // Held back: a refusal anywhere stops every engine, for the reason it stops every
68
80
  // statement — half a chain is worse across two engines than within one.
69
- if (input.apply && refusals.length === 0)
81
+ const ran = [];
82
+ for (const { plan, db } of plans)
70
83
  ran.push(...(await applyStep(plan, db)));
84
+ const drift = await storage.migrate?.(app);
85
+ if (drift)
86
+ warnings.push(drift);
87
+ return { chain, changes, added, refusals, warnings, ran: [...ran, ...added] };
88
+ }
89
+ finally {
90
+ await app.dispose();
91
+ await storage.close?.();
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * The renames the entities state themselves — `previous: { content: 'body' }` — as a step, so
97
+ * the live table is the baseline and no version has to have been frozen before the change. What
98
+ * the frozen chain already renames is left out, or the same column would be renamed twice.
99
+ */
100
+ function declaredStep(app, frozen) {
101
+ const entities = {};
102
+ for (const frond of app.fronds) {
103
+ for (const { name, entityClass } of frond.entities) {
104
+ const previous = entityClass.previous;
105
+ if (!previous)
106
+ continue;
107
+ const key = lowerFirst(name);
108
+ const known = frozen.entities[key]?.changes ?? [];
109
+ const properties = Card.fromSchema(entityClass).descriptor.properties;
110
+ const changes = Object.entries(previous)
111
+ .filter(([now, was]) => !known.some((change) => change.kind === 'renamed' && change.from === was && change.to === now))
112
+ .map(([now, was]) => ({ kind: 'renamed', from: was, to: now, field: properties[now] }));
113
+ if (changes.length > 0)
114
+ entities[key] = { changes, ambiguous: [] };
71
115
  }
72
- return { chain: versionsOf(steps), changes, refusals, ran: refusals.length > 0 ? [] : ran };
73
116
  }
117
+ return { entities, entitiesAdded: [], entitiesRemoved: [] };
74
118
  }
75
119
  /** The versions read, oldest first and each named once however many fronds cut it. */
76
120
  function versionsOf(steps) {
@@ -1 +1 @@
1
- {"version":3,"file":"MigrateHandler.js","sourceRoot":"","sources":["../../../../fronds/analysis/handlers/MigrateHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MigrateHandler.js","sourceRoot":"","sources":["../../../../fronds/analysis/handlers/MigrateHandler.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,8 @@ import { type FougereConfig, type ScanResult } from '@fougere/core';
6
6
  * CLI's cwd, install a jiti loader so the scan can import TypeScript sources, scan.
7
7
  * Two copies of one gesture, and the second was written by copying the first.
8
8
  *
9
- * Not a boot: `bootApp` runs migrations and seeds, so an analysis command
10
- * that booted would write to the target's database. The cost is stated rather than
9
+ * Not a boot: `bootApp` runs the seeds, so an analysis command that booted
10
+ * would write to the target's database. The cost is stated rather than
11
11
  * hidden, though — the scan IMPORTS the modules it reads, so a frond's top-level
12
12
  * code runs. "No application cycle, no database", not "no side effect".
13
13
  */
@@ -9,8 +9,8 @@ import { resolve } from 'node:path';
9
9
  * CLI's cwd, install a jiti loader so the scan can import TypeScript sources, scan.
10
10
  * Two copies of one gesture, and the second was written by copying the first.
11
11
  *
12
- * Not a boot: `bootApp` runs migrations and seeds, so an analysis command
13
- * that booted would write to the target's database. The cost is stated rather than
12
+ * Not a boot: `bootApp` runs the seeds, so an analysis command that booted
13
+ * would write to the target's database. The cost is stated rather than
14
14
  * hidden, though — the scan IMPORTS the modules it reads, so a frond's top-level
15
15
  * code runs. "No application cycle, no database", not "no side effect".
16
16
  */
@@ -7,11 +7,8 @@ declare const New_base: import("@fougere/schema").SchemaConstructor<{
7
7
  app: import("@fougere/schema").Field<string>;
8
8
  }>;
9
9
  /**
10
- * `fougere new [name]` — the workspace composer.
11
- *
12
- * Guided when it has a TTY and nothing to compose from; stated when `--frond` or
13
- * `--app` is given, which is the only form a script, a CI job or an agent can drive.
14
- * `--bare` is the third: the empty shell, nothing composed.
10
+ * `fougere new [name]` — a project, composed on one screen when the flags state nothing, and
11
+ * written from the flags when `--frond`, `--app` or `--bare` say it all.
15
12
  */
16
13
  export default class New extends New_base {
17
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"New.d.ts","sourceRoot":"","sources":["../../../../fronds/scaffold/entities/New.ts"],"names":[],"mappings":";;;;;;;;AAEA;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,QAO/B;CAAG"}
1
+ {"version":3,"file":"New.d.ts","sourceRoot":"","sources":["../../../../fronds/scaffold/entities/New.ts"],"names":[],"mappings":";;;;;;;;AAEA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,QAO/B;CAAG"}
@@ -1,15 +1,12 @@
1
1
  import { entity, text, bool } from "@fougere/schema";
2
2
  /**
3
- * `fougere new [name]` — the workspace composer.
4
- *
5
- * Guided when it has a TTY and nothing to compose from; stated when `--frond` or
6
- * `--app` is given, which is the only form a script, a CI job or an agent can drive.
7
- * `--bare` is the third: the empty shell, nothing composed.
3
+ * `fougere new [name]` — a project, composed on one screen when the flags state nothing, and
4
+ * written from the flags when `--frond`, `--app` or `--bare` say it all.
8
5
  */
9
6
  export default class New extends entity({
10
- name: text({ description: "Workspace name" }),
11
- force: bool({ description: "Overwrite existing directory", default: false }),
12
- bare: bool({ description: "Skip the guided flow — just the empty shell", default: false }),
7
+ name: text({ description: "Project name — its directory and its package" }),
8
+ force: bool({ description: "Replace an existing directory, without asking", default: false }),
9
+ bare: bool({ description: "No fronds, no apps — the empty workspace, no prompt", default: false }),
13
10
  local: bool({ description: "Link @fougere/* to this monorepo (dev — installs offline)", default: false }),
14
11
  frond: text({ description: "Fronds to add, no prompt — 'blog' or 'blog:shop', comma-separated", default: "" }),
15
12
  app: text({ description: "Apps to add, no prompt — 'nuxt' or 'nuxt:web', comma-separated", default: "" }),
@@ -1 +1 @@
1
- {"version":3,"file":"New.js","sourceRoot":"","sources":["../../../../fronds/scaffold/entities/New.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,MAAM,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAC7C,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,8BAA8B,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5E,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,6CAA6C,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1F,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzG,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,mEAAmE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9G,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,gEAAgE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;CAC1G,CAAC;CAAG"}
1
+ {"version":3,"file":"New.js","sourceRoot":"","sources":["../../../../fronds/scaffold/entities/New.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,MAAM,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;IAC3E,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,+CAA+C,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7F,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClG,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzG,KAAK,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,mEAAmE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC9G,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,gEAAgE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;CAC1G,CAAC;CAAG"}
@@ -1,5 +1,15 @@
1
1
  import { type Conventions } from '@fougere/core';
2
+ import type { Plan } from '../../../src/composer/Plan.js';
2
3
  export default class ProjectWriter {
4
+ /**
5
+ * The whole plan, or nothing: it is written beside its destination and moved there once every
6
+ * piece landed, since fetching a host's starter can fail halfway. `replace` removes what the
7
+ * destination held, and only then — a failed write leaves the old project as it was.
8
+ */
9
+ write(plan: Plan, dir: string, options?: {
10
+ local?: boolean;
11
+ replace?: boolean;
12
+ }): void;
3
13
  /** The workspace shell — fougere.config, pnpm-workspace (fronds/* apps/*), package.json. */
4
14
  createWorkspace(dir: string, name: string): {
5
15
  path: string;
@@ -20,6 +30,11 @@ export default class ProjectWriter {
20
30
  * CLI depends on, so `fougere new` offers what is published rather than what was copied here.
21
31
  */
22
32
  listTemplates(kind: 'fronds' | 'apps'): string[];
33
+ /**
34
+ * One script per app, and `dev` for the first: two apps started together fight over a port and
35
+ * interleave their output, and a terminal app is not a server at all.
36
+ */
37
+ runApps(wsDir: string, apps: string[]): void;
23
38
  /**
24
39
  * Every app depends on every frond of the workspace — stated once composition is done,
25
40
  * because that is when the names exist.
@@ -50,5 +65,6 @@ export default class ProjectWriter {
50
65
  * packages aren't on npm yet). No-op once the packages are published.
51
66
  */
52
67
  linkLocal(wsDir: string): void;
68
+ sharePeers(wsDir: string, linked: Iterable<string>): void;
53
69
  }
54
70
  //# sourceMappingURL=ProjectWriter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectWriter.d.ts","sourceRoot":"","sources":["../../../../fronds/scaffold/services/ProjectWriter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAqC,MAAM,eAAe,CAAC;AA2IpF,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,4FAA4F;IAC5F,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAM3D;IAED,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAcxH;IAED,2FAA2F;IAC3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAUtE;IAED;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAO/C;IAED;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG,IAAI,CAoB9E;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG,IAAI,CAyB/E;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAwC7B;CACF"}
1
+ {"version":3,"file":"ProjectWriter.d.ts","sourceRoot":"","sources":["../../../../fronds/scaffold/services/ProjectWriter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAqC,MAAM,eAAe,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAkJ1D,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI,CAkBzF;IAED,4FAA4F;IAC5F,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAM3D;IAED,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAcxH;IAED,2FAA2F;IAC3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAUtE;IAED;;;;;;OAMG;IACH,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAO/C;IAED;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAU3C;IAED;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG,IAAI,CAoB9E;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,GAAE,WAAiC,GAAG,IAAI,CA2B/E;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CA4C7B;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,CAgBxD;CACF"}
@@ -1,7 +1,7 @@
1
1
  import { execFileSync } from 'node:child_process';
2
- import { cpSync, existsSync, mkdirSync, renameSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
2
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, renameSync, readFileSync, rmSync, writeFileSync, readdirSync } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
- import { dirname, join } from 'node:path';
4
+ import { basename, dirname, join } from 'node:path';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { DEFAULT_CONVENTIONS, frondPackage } from '@fougere/core';
7
7
  /**
@@ -132,7 +132,40 @@ function setPackageName(dir, name) {
132
132
  pkg.name = name;
133
133
  writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
134
134
  }
135
+ /** Both lists a starter names a package in — `@fougere/vite` is a build tool, so it sits in the second. */
136
+ function rangesOf(pkg) {
137
+ return [pkg.dependencies, pkg.devDependencies].filter((ranges) => ranges !== undefined);
138
+ }
135
139
  export default class ProjectWriter {
140
+ /**
141
+ * The whole plan, or nothing: it is written beside its destination and moved there once every
142
+ * piece landed, since fetching a host's starter can fail halfway. `replace` removes what the
143
+ * destination held, and only then — a failed write leaves the old project as it was.
144
+ */
145
+ write(plan, dir, options = {}) {
146
+ if (existsSync(dir) && !options.replace)
147
+ throw new Error(`${basename(dir)}/ already exists.`);
148
+ const staged = mkdtempSync(join(dirname(dir), `.${basename(dir)}-`));
149
+ try {
150
+ this.createWorkspace(staged, plan.name);
151
+ for (const { template, name } of plan.fronds)
152
+ this.addFrond(staged, template, name);
153
+ for (const { template, name } of plan.apps)
154
+ this.addApp(staged, template, name);
155
+ this.runApps(staged, plan.apps.map(({ name }) => name));
156
+ this.linkFronds(staged);
157
+ if (options.local)
158
+ this.linkLocal(staged);
159
+ else
160
+ this.pinVersions(staged);
161
+ }
162
+ catch (error) {
163
+ rmSync(staged, { recursive: true, force: true });
164
+ throw error;
165
+ }
166
+ rmSync(dir, { recursive: true, force: true });
167
+ renameSync(staged, dir);
168
+ }
136
169
  /** The workspace shell — fougere.config, pnpm-workspace (fronds/* apps/*), package.json. */
137
170
  createWorkspace(dir, name) {
138
171
  cpSync(join(TEMPLATES, 'workspace'), dir, { recursive: true });
@@ -181,6 +214,21 @@ export default class ProjectWriter {
181
214
  return [];
182
215
  return readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name);
183
216
  }
217
+ /**
218
+ * One script per app, and `dev` for the first: two apps started together fight over a port and
219
+ * interleave their output, and a terminal app is not a server at all.
220
+ */
221
+ runApps(wsDir, apps) {
222
+ const path = join(wsDir, 'package.json');
223
+ const pkg = JSON.parse(readFileSync(path, 'utf8'));
224
+ const run = (app) => `pnpm -C apps/${app} dev`;
225
+ pkg.scripts = {
226
+ ...(apps.length ? { dev: run(apps[0]) } : {}),
227
+ ...Object.fromEntries(apps.map((app) => [`dev:${app}`, run(app)])),
228
+ ...pkg.scripts,
229
+ };
230
+ writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n');
231
+ }
184
232
  /**
185
233
  * Every app depends on every frond of the workspace — stated once composition is done,
186
234
  * because that is when the names exist.
@@ -242,11 +290,13 @@ export default class ProjectWriter {
242
290
  continue;
243
291
  const pkg = JSON.parse(readFileSync(path, 'utf8'));
244
292
  let moved = false;
245
- for (const [name, range] of Object.entries(pkg.dependencies ?? {})) {
246
- if (!name.startsWith('@fougere/') || range !== 'latest')
247
- continue;
248
- pkg.dependencies[name] = version;
249
- moved = true;
293
+ for (const ranges of rangesOf(pkg)) {
294
+ for (const [name, range] of Object.entries(ranges)) {
295
+ if (!name.startsWith('@fougere/') || range !== 'latest')
296
+ continue;
297
+ ranges[name] = version;
298
+ moved = true;
299
+ }
250
300
  }
251
301
  if (moved)
252
302
  writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n');
@@ -285,6 +335,7 @@ export default class ProjectWriter {
285
335
  }
286
336
  };
287
337
  scan(packages);
338
+ const linked = new Set();
288
339
  const walk = (d) => {
289
340
  for (const e of readdirSync(d, { withFileTypes: true })) {
290
341
  if (e.name === 'node_modules')
@@ -298,11 +349,14 @@ export default class ProjectWriter {
298
349
  continue;
299
350
  const pkg = JSON.parse(readFileSync(f, 'utf8'));
300
351
  let changed = false;
301
- for (const dep of Object.keys(pkg.dependencies ?? {})) {
302
- const local = dirOf.get(dep);
303
- if (local) {
304
- pkg.dependencies[dep] = `link:${local}`;
305
- changed = true;
352
+ for (const ranges of rangesOf(pkg)) {
353
+ for (const dep of Object.keys(ranges)) {
354
+ const local = dirOf.get(dep);
355
+ if (local) {
356
+ ranges[dep] = `link:${local}`;
357
+ linked.add(local);
358
+ changed = true;
359
+ }
306
360
  }
307
361
  }
308
362
  if (changed)
@@ -310,6 +364,24 @@ export default class ProjectWriter {
310
364
  }
311
365
  };
312
366
  walk(wsDir);
367
+ this.sharePeers(wsDir, linked);
368
+ }
369
+ sharePeers(wsDir, linked) {
370
+ const overrides = new Map();
371
+ for (const dir of linked) {
372
+ const { peerDependencies = {} } = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
373
+ for (const peer of Object.keys(peerDependencies)) {
374
+ const copy = join(dir, 'node_modules', peer);
375
+ if (peer.startsWith('@fougere/') || overrides.has(peer) || !existsSync(copy))
376
+ continue;
377
+ overrides.set(peer, `link:${copy}`);
378
+ }
379
+ }
380
+ if (overrides.size === 0)
381
+ return;
382
+ const lines = [...overrides].map(([peer, target]) => ` ${peer.includes('/') ? `'${peer}'` : peer}: ${target}`);
383
+ const workspace = join(wsDir, 'pnpm-workspace.yaml');
384
+ writeFileSync(workspace, `${readFileSync(workspace, 'utf8').trimEnd()}\n\noverrides:\n${lines.join('\n')}\n`);
313
385
  }
314
386
  }
315
387
  //# sourceMappingURL=ProjectWriter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectWriter.js","sourceRoot":"","sources":["../../../../fronds/scaffold/services/ProjectWriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectWriter.js","sourceRoot":"","sources":["../../../../fronds/scaffold/services/ProjectWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import { type Catalog, type Plan } from './Plan.js';
3
+ export interface Composed {
4
+ plan: Plan;
5
+ overwrite: boolean;
6
+ }
7
+ export interface ComposerOptions {
8
+ name: string;
9
+ catalog: Catalog;
10
+ exists: (name: string) => boolean;
11
+ refusals: (plan: Plan, overwrite: boolean) => string[];
12
+ input?: Readable;
13
+ output?: Writable;
14
+ }
15
+ /**
16
+ * `fougere new` in three steps — the project, its fronds, its apps — with the tree the plan
17
+ * writes and the command that writes it with no prompt drawn beside every step.
18
+ *
19
+ * ⏎ moves on and ← goes back. In a list, `r` renames the row under the cursor and `+` adds another
20
+ * piece of the same template. Nothing is written here: the answer is a `Plan`, and whether the
21
+ * directory it names may be replaced.
22
+ *
23
+ * Documented: [the CLI](https://fougere.dev/docs/cli).
24
+ */
25
+ export declare class Composer {
26
+ private options;
27
+ static WIDTH: number;
28
+ private step;
29
+ private rows;
30
+ private name;
31
+ private cursor;
32
+ private editing;
33
+ private asking;
34
+ private overwrite;
35
+ private held;
36
+ private prompt;
37
+ private output;
38
+ constructor(options: ComposerOptions);
39
+ /** What the screen was left on, or `undefined` when it was cancelled. */
40
+ ask(): Promise<Composed | undefined>;
41
+ plan(): Plan;
42
+ frame(columns?: number): string;
43
+ private breadcrumb;
44
+ private body;
45
+ private hint;
46
+ /** The rows of the current step, each with its index among them. */
47
+ private listed;
48
+ private current;
49
+ private go;
50
+ private act;
51
+ private type;
52
+ private edit;
53
+ /** The name is kept, and the step left, only once it can be written. */
54
+ private named;
55
+ private answer;
56
+ private another;
57
+ /** ⏎ that moves the screen on is not the ⏎ that writes: the next one is. */
58
+ private hold;
59
+ private refusal;
60
+ }
61
+ //# sourceMappingURL=Composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Composer.d.ts","sourceRoot":"","sources":["../../../src/composer/Composer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,OAAO,EAAE,KAAK,OAAO,EAAa,KAAK,IAAI,EAAqB,MAAM,WAAW,CAAC;AA6BlF,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE;AAE5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;IACvD,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IAcP,OAAO,CAAC,OAAO;IAb3B,MAAM,CAAC,KAAK,SAAM;IAElB,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAW;IAEzB,YAAoB,OAAO,EAAE,eAAe,EAiB3C;IAED,yEAAyE;IACnE,GAAG,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAIzC;IAED,IAAI,IAAI,IAAI,CAKX;IAED,KAAK,CAAC,OAAO,SAAsD,GAAG,MAAM,CA8B3E;IAED,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,IAAI;IAkBZ,OAAO,CAAC,IAAI;IASZ,oEAAoE;IACpE,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,EAAE;IAMV,OAAO,CAAC,GAAG;IAaX,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,IAAI;IAaZ,wEAAwE;IACxE,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,OAAO;IAYf,4EAA4E;IAC5E,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,OAAO;CAiBhB"}