@fougere/app 0.2.0-alpha.2 → 0.4.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.
package/dist/boot.d.ts CHANGED
@@ -1,26 +1,98 @@
1
- import type { App, EntityOrm } from '@fougere/core';
1
+ import type { App, CreateAppOptions, EntityOrm, FougereConfig, Transport } from '@fougere/core';
2
2
  import { type SchemaView } from '@fougere/schema';
3
3
  export interface FougereServerConfig {
4
4
  /** Storage handle. Forwarded to the auth provider via AuthContext.db. */
5
5
  db?: unknown;
6
6
  /** Per-entity ORM factory. */
7
7
  ormFactory?: (entity: SchemaView, name: string) => EntityOrm;
8
- /** Called after app is created. Use for migrations, seeding, etc. */
9
- afterBoot?: (app: App) => void | Promise<void>;
8
+ /**
9
+ * What this app takes on beyond its fronds, each stating what it does and what it undoes.
10
+ *
11
+ * It replaced `afterBoot`, which a host used to CLAIM the whole post-boot to get its own
12
+ * seeding — Nuxt's generated plugin did exactly that, and its copy of the seeding loop
13
+ * drifted. Declaring `{ name: 'seeds', up }` replaces that one member and leaves the
14
+ * rest of the ascent alone.
15
+ */
16
+ extensions?: CreateAppOptions['extensions'];
10
17
  /**
11
18
  * What the boot line names as the host — 'Nuxt/Nitro', 'Next'. Stated by the
12
19
  * adapter, never sniffed: a boot that guesses its host from what happens to be
13
20
  * importable is the hidden runtime the doctrine refuses.
14
21
  */
15
22
  host?: string;
23
+ /**
24
+ * What this app is built from, when the host already knows.
25
+ *
26
+ * Absent, `boot()` reads the fronds off the disk — right on a server, impossible on a
27
+ * runtime that has none: measured on workerd, `readdir` throws through unenv's shim and
28
+ * the app comes up with ZERO fronds, so every page renders and every door answers
29
+ * NOT_FOUND. A host that scanned at BUILD time can say so instead, and `fougere build`
30
+ * writes exactly this value down.
31
+ *
32
+ * Same slot as `CreateAppOptions.scan` and for the same reason: producing the value
33
+ * reads a disk, consuming it does not.
34
+ */
35
+ scan?: CreateAppOptions['scan'];
36
+ /**
37
+ * What `fougere.config.ts` says, when the host already read it.
38
+ *
39
+ * The same rule as `scan`, and found the same way: `boot()` re-reads the file at
40
+ * runtime, which a Worker cannot do — measured, a consumer's `remotes:` never reached
41
+ * the boot and its pages rendered empty with nothing said. A host that read the config
42
+ * at BUILD time states it here instead.
43
+ *
44
+ * `auth` is deliberately not part of what a codegen'd host can carry: it holds a live
45
+ * provider, not a value. An app that authenticates reads its own config.
46
+ */
47
+ config?: Partial<FougereConfig>;
48
+ /**
49
+ * Who performs an outgoing call, when the default cannot.
50
+ *
51
+ * `boot()` builds an HTTP transport from `remotes:` and that is right nearly
52
+ * everywhere. It is not right on Cloudflare: a Worker calling a sibling's public URL
53
+ * is refused by the edge with error 1042, so two Workers of one account reach each
54
+ * other through a SERVICE BINDING and through nothing else. A binding is a value only
55
+ * the host holds, so only the host can state this.
56
+ *
57
+ * It replaces the default entirely — signing included, since a host that builds its
58
+ * own transport is the one that knows what to put on the wire.
59
+ */
60
+ remoteTransport?: (url: string) => Transport;
16
61
  }
17
62
  /**
18
63
  * Override the data layer — only needed if you don't want the convention-driven
19
64
  * setup based on `config.db` in fougere.config.ts.
20
65
  */
21
66
  export declare function configureFougere(config: FougereServerConfig): void;
67
+ /**
68
+ * Add to what is already stated, instead of replacing it.
69
+ *
70
+ * A host states its app in PIECES when the pieces are known at different moments: a
71
+ * build writes the scan and the config into a generated plugin, and a value only the
72
+ * running process holds — a Cloudflare service binding — cannot be written there at all.
73
+ * Its dual is `configureFougere`, which replaces; `reloadFougere` depends on that
74
+ * replacement, so merging silently would have broken the turn of the ring.
75
+ */
76
+ export declare function extendFougere(config: Partial<FougereServerConfig>): void;
22
77
  /** Get the booted Fougere app. Lazy — boots on first call, then caches. */
23
78
  export declare function useFougereApp(): Promise<App>;
79
+ /**
80
+ * Turn the ring: instantiate the app again, then let the previous one go.
81
+ *
82
+ * This is what "reload" means for anything the config CONSUMED — a value that built
83
+ * something cannot move under what it built, so the thing is built again. Its dual is
84
+ * `applyConfig`, for values that are merely consulted and need no turn at all.
85
+ *
86
+ * Every door reaches the app through `useFougereApp()` inside the request it serves and
87
+ * none holds it across two, which is what makes the swap invisible: the next request
88
+ * lands on the new app whether or not the old one has finished being released.
89
+ *
90
+ * A call already running finishes on the OLD app: it is drained before being released,
91
+ * so nothing has its storage closed underneath it. `timeoutMs` bounds that wait, and a
92
+ * drain that runs out REJECTS — the app is left alone rather than released under work,
93
+ * because a caller who cannot wait must choose that on purpose.
94
+ */
95
+ export declare function reloadFougere(timeoutMs?: number): Promise<App>;
24
96
  /**
25
97
  * The store an app with no `db` runs on.
26
98
  *
@@ -1 +1 @@
1
- {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAA4B,MAAM,eAAe,CAAC;AAC9E,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI5E,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,8BAA8B;IAC9B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7D,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,QAG3D;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,CAK5C;AAiGD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CA+G3E"}
1
+ {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAA4B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI5E,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,8BAA8B;IAC9B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7D;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5C;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;CAC9C;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,QAG3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,QAGjE;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,CAK5C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAWpE;AAoID;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CA+G3E"}
package/dist/boot.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { Role } from '@fougere/schema';
2
+ import { Lifecycle } from '@fougere/schema';
1
3
  /**
2
4
  * Fougere server bootstrap — single entry point for an app's lifecycle,
3
5
  * whatever hosts it.
@@ -6,7 +8,7 @@
6
8
  * scans fronds off the filesystem and hands back an `App`. That is why it lives
7
9
  * in `@fougere/app` rather than in one of the two adapters — the second host
8
10
  * would otherwise have copied it, and a copied boot drifts (the seeding loop
9
- * already did, `core/src/seed.ts`).
11
+ * already did, `core/src/boot/seed.ts`).
10
12
  *
11
13
  * Default path (zero-config): fougere.config.ts declares `db: 'sqlite'` and
12
14
  * everything else; this module auto-resolves the storage handle, builds an
@@ -16,7 +18,8 @@
16
18
  * host's own startup (a Nitro plugin, a Next instrumentation hook) if the user
17
19
  * wants a custom data layer — alternative driver, managed migrations, etc.
18
20
  */
19
- import { createApp, loadCascadedConfig, setModuleLoader, frondAliases, Logger } from '@fougere/core';
21
+ import { createApp, identityFromEnv, Logger, migrating, seeding } from '@fougere/core';
22
+ import { scanProject, loadCascadedConfig, setModuleLoader, frondAliases, resolveConventions } from '@fougere/core/node';
20
23
  import { createContainer } from '@fougere/container';
21
24
  import { applyCreate, applyUpdate } from '@fougere/schema';
22
25
  // ── State ────────────────────────────────────────
@@ -31,6 +34,19 @@ export function configureFougere(config) {
31
34
  _config = config;
32
35
  _appPromise = null;
33
36
  }
37
+ /**
38
+ * Add to what is already stated, instead of replacing it.
39
+ *
40
+ * A host states its app in PIECES when the pieces are known at different moments: a
41
+ * build writes the scan and the config into a generated plugin, and a value only the
42
+ * running process holds — a Cloudflare service binding — cannot be written there at all.
43
+ * Its dual is `configureFougere`, which replaces; `reloadFougere` depends on that
44
+ * replacement, so merging silently would have broken the turn of the ring.
45
+ */
46
+ export function extendFougere(config) {
47
+ _config = { ..._config, ...config };
48
+ _appPromise = null;
49
+ }
34
50
  /** Get the booted Fougere app. Lazy — boots on first call, then caches. */
35
51
  export function useFougereApp() {
36
52
  if (!_appPromise) {
@@ -38,31 +54,86 @@ export function useFougereApp() {
38
54
  }
39
55
  return _appPromise;
40
56
  }
57
+ /**
58
+ * Turn the ring: instantiate the app again, then let the previous one go.
59
+ *
60
+ * This is what "reload" means for anything the config CONSUMED — a value that built
61
+ * something cannot move under what it built, so the thing is built again. Its dual is
62
+ * `applyConfig`, for values that are merely consulted and need no turn at all.
63
+ *
64
+ * Every door reaches the app through `useFougereApp()` inside the request it serves and
65
+ * none holds it across two, which is what makes the swap invisible: the next request
66
+ * lands on the new app whether or not the old one has finished being released.
67
+ *
68
+ * A call already running finishes on the OLD app: it is drained before being released,
69
+ * so nothing has its storage closed underneath it. `timeoutMs` bounds that wait, and a
70
+ * drain that runs out REJECTS — the app is left alone rather than released under work,
71
+ * because a caller who cannot wait must choose that on purpose.
72
+ */
73
+ export async function reloadFougere(timeoutMs) {
74
+ const previous = _appPromise;
75
+ _appPromise = null;
76
+ // The new one first: a boot that fails leaves the previous app serving, still whole.
77
+ const next = await useFougereApp();
78
+ if (previous) {
79
+ const old = await previous;
80
+ await old.drain(timeoutMs);
81
+ await old.dispose();
82
+ }
83
+ return next;
84
+ }
41
85
  // ── Boot ─────────────────────────────────────────
42
86
  async function boot() {
43
87
  const bootStart = performance.now();
44
- const log = new Logger('boot', { level: 'debug' });
88
+ const log = new Logger('boot');
45
89
  log.info(`booting (${_config.host ?? 'app'})`);
46
90
  const { createJiti } = await import('jiti');
47
91
  // Nitro serves from a bundle, but the scan still reads frond sources from disk — so the
48
92
  // named form a frond uses for its neighbour has to resolve here too.
49
- const jiti = createJiti(import.meta.url, {
50
- interopDefault: true,
51
- alias: await frondAliases(process.env.FOUGERE_ROOT ?? process.cwd()),
52
- });
53
- setModuleLoader((filePath) => jiti.import(filePath));
93
+ //
94
+ // Installed twice: the config names the scope the aliases are built from, so reading it
95
+ // must not need them. Nothing in `fougere.config.ts` may import `@fronds/*`.
96
+ //
97
+ // And installed only when something is going to READ a source. A host that handed in
98
+ // both its scan and its config has nothing left to load, and jiti cannot run where
99
+ // there is no module resolver: measured on workerd, `createJiti` threw
100
+ // `Cannot read properties of undefined (reading 'paths')` and every request answered
101
+ // 500 — the loader was being built for files that no longer needed opening.
102
+ const reads = _config.scan === undefined || _config.config === undefined;
103
+ const installLoader = (alias) => {
104
+ if (!reads)
105
+ return;
106
+ const jiti = createJiti(import.meta.url, { interopDefault: true, ...(alias ? { alias } : {}) });
107
+ setModuleLoader((filePath) => jiti.import(filePath));
108
+ };
109
+ installLoader();
54
110
  // Config cascades along the workspace→app frontier: the workspace root (via
55
111
  // FOUGERE_ROOT, where `remotes`/shared db live) is the base, the app (cwd)
56
112
  // overrides. Same boundary the fronds cascade along. No `root` → both equal.
57
113
  const configRoot = process.cwd();
58
114
  const root = process.env.FOUGERE_ROOT ?? configRoot;
59
- const fileConfig = await loadCascadedConfig(root, configRoot);
115
+ // The host's word wins, for the reason it wins on `scan`: it read the file already,
116
+ // and where there is no file a second read finds nothing and says nothing.
117
+ const fileConfig = _config.config
118
+ ?? (await loadCascadedConfig(root, configRoot));
119
+ const conventions = resolveConventions(fileConfig.conventions);
120
+ // `frondAliases` reads a directory listing, so it is asked only when the loader it
121
+ // feeds is going to exist at all.
122
+ if (reads)
123
+ installLoader(await frondAliases(root, conventions));
60
124
  // Auto-resolve the data layer from config.db when the user didn't provide a
61
125
  // custom one via configureFougere. The resolution itself lives in @fougere/defaults
62
126
  // — this host must not know which storage package backs `db:`.
63
127
  let db = _config.db;
64
128
  let ormFactory = _config.ormFactory;
65
- let migrateSchema;
129
+ // The storage's two halves, kept together: its ascent is an extension, its connection
130
+ // is not — it is opened here, before the container, so it closes after the container.
131
+ let storageMigrate;
132
+ let closeStorage;
133
+ // Where the rows are, and how to open a transaction there — read from the same storage
134
+ // resolution, because a frame's realization is decided by `sources:` and nothing else.
135
+ let sourceOf;
136
+ let transacted;
66
137
  if (!ormFactory) {
67
138
  const { resolveStorage } = await import('@fougere/defaults');
68
139
  const storage = resolveStorage(fileConfig.db, fileConfig.sources);
@@ -70,7 +141,10 @@ async function boot() {
70
141
  log.debug('auto-resolving storage from config.db');
71
142
  db = storage.db;
72
143
  ormFactory = storage.ormFactory;
73
- migrateSchema = storage.afterBoot;
144
+ sourceOf = storage.sourceOf;
145
+ transacted = storage.transacted;
146
+ storageMigrate = storage.migrate;
147
+ closeStorage = storage.close;
74
148
  }
75
149
  else {
76
150
  log.debug('no db declared — falling back to in-memory ORM');
@@ -79,44 +153,51 @@ async function boot() {
79
153
  }
80
154
  // Layer-2 wiring: `remotes: { catalog: 'http://...' }` in fougere.config.ts
81
155
  // is all the user writes — the default transport comes from here.
82
- let remoteTransport;
83
- if (Object.keys(fileConfig.remotes ?? {}).length > 0) {
156
+ // The host's word wins here too — and where it speaks, nothing below runs: building
157
+ // the default would import the transport and read the environment for a key, both
158
+ // pointless once the caller has said who carries the call.
159
+ let remoteTransport = _config.remoteTransport;
160
+ if (!remoteTransport && Object.keys(fileConfig.remotes ?? {}).length > 0) {
84
161
  log.debug(`remotes declared (${Object.keys(fileConfig.remotes).join(', ')}) — wiring HTTP transport`);
85
162
  const { createHttpTransport } = await import('@fougere/transport-http');
86
- remoteTransport = (url) => createHttpTransport(url);
163
+ // A call that leaves this process carries a proof of who sent it, when the
164
+ // deployment gave one. Without a key it travels as a bare claim, which only a
165
+ // receiver that trusts no root will take.
166
+ const { sign } = await identityFromEnv();
167
+ remoteTransport = (url) => createHttpTransport(url, (sign ? { sign } : {}));
87
168
  }
88
169
  const app = await createApp({
89
- root,
170
+ // The host's word wins: it scanned at build, and a second scan here would either
171
+ // repeat that work or — where there is no disk — find nothing and say so quietly.
172
+ scan: _config.scan ?? (await scanProject(root, undefined, conventions)),
90
173
  createContainer,
91
174
  ormFactory,
175
+ sourceOf,
176
+ transacted,
92
177
  db,
93
178
  auth: fileConfig.auth,
94
179
  adapters: fileConfig.adapters,
95
180
  remotes: fileConfig.remotes,
96
181
  remoteTransport,
182
+ /**
183
+ * The whole ascent, one ordered list: tables, then rows, then what the host adds.
184
+ * A host wanting its OWN seeding declares `{ name: 'seeds', … }` and replaces that
185
+ * member — it no longer has to claim everything after the boot to get it.
186
+ */
187
+ extensions: [
188
+ // The slot is declared even when this host resolved no storage — a host that resolved
189
+ // its own (the Nitro plugin does, for its bundler) then REPLACES this member in place
190
+ // instead of adding one after the seeds, which is rows before tables.
191
+ migrating(storageMigrate),
192
+ seeding((message) => log.info(`[seed]${message}`)),
193
+ ...(_config.extensions ?? []),
194
+ ],
195
+ // Opened before the container, so released after it. Never wired here until now:
196
+ // this host boots the storage and no host closed one, which is what made a reload
197
+ // leak the pool of every app it discarded.
198
+ onDispose: closeStorage,
97
199
  });
98
- // Bring the schema up to date — creates missing tables and adds columns an
99
- // entity gained. Auth entities travel with the app, no synthetic frond needed.
100
- if (migrateSchema) {
101
- log.debug('migrating schema from entities');
102
- await migrateSchema(app);
103
- }
104
- if (_config.afterBoot) {
105
- // A host that declares `afterBoot` OWNS what happens after the boot, seeding
106
- // included — Nuxt's generated Nitro plugin does exactly that, because Nitro
107
- // bundles and the seed modules have to be spelled out as static imports for it.
108
- log.debug('running afterBoot');
109
- await _config.afterBoot(app);
110
- log.info('afterBoot done');
111
- }
112
- else {
113
- // Nobody claimed it, so the boot seeds. The scan already carries each seed's
114
- // data (`SeedEntry.data` is its resolved default export), and the order comes
115
- // from core — the same `orderSeeds`/`runSeeds` pair Nuxt's plugin calls. A host
116
- // that does not bundle its frond sources needs nothing else.
117
- const { orderSeeds, runSeeds } = await import('@fougere/core');
118
- await runSeeds(app, orderSeeds(app.fronds), (message) => log.info(`[seed]${message}`));
119
- }
200
+ log.info(`ascent: ${app.extensions().join(' ') || 'nothing declared'}`);
120
201
  const ms = (performance.now() - bootStart).toFixed(0);
121
202
  log.info(`ready in ${ms}ms — ${app.fronds.length} frond(s)${app.auth ? ` + auth (${app.auth.basePath})` : ''}`);
122
203
  return app;
@@ -134,7 +215,7 @@ async function boot() {
134
215
  */
135
216
  export function createMemoryOrm(entity, name) {
136
217
  const fields = entity.getFields();
137
- const pk = Object.entries(fields).find(([, field]) => field.role?.primary)?.[0] ?? 'id';
218
+ const pk = Object.entries(fields).find(([, field]) => Role.of(field).isPrimary)?.[0] ?? 'id';
138
219
  const store = new Map();
139
220
  // `EntityOrm.findById(id: string)` — but a key can hold a number, and a Map keyed on
140
221
  // `1` does not answer `'1'`. SQL never had the question; here the divergence was
@@ -213,7 +294,7 @@ export function createMemoryOrm(entity, name) {
213
294
  const held = store.get(keyOf(id));
214
295
  if (held) {
215
296
  for (const [key, field] of Object.entries(fields)) {
216
- if (key === pk || (field.lifecycle?.create === 'now' && field.lifecycle?.update !== 'now'))
297
+ if (key === pk || Lifecycle.of(field).stampedOnce)
217
298
  record[key] = held[key];
218
299
  }
219
300
  }
package/dist/boot.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -59,6 +59,6 @@ export declare function pageOf(data: unknown): {
59
59
  * code the server never sent.
60
60
  */
61
61
  export declare function asFougereError(err: unknown, entityKey: string, op: string): FougereError;
62
- export { formFieldsOf, payloadOf, errorsByField, type FormEntity, type FormField, } from './form.js';
62
+ export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, type FormEntity, type FormField, type TableColumn, } from './form.js';
63
63
  export { sessionViewOf, type SessionView } from './session.js';
64
64
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,YAAY,EAGZ,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAGhC,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AAEtF,+EAA+E;AAC/E,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAIjG,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEvD;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAEnF;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAMlB;AAOD,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,IAAI,CAKrE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAYD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKlE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAE/C;AAED,yFAAyF;AACzF,eAAO,MAAM,OAAO,EAAE,OAOrB,CAAC;AAIF,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,CAM7C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAE/F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAUxF;AAKD,OAAO,EACL,YAAY,EACZ,SAAS,EACT,aAAa,EACb,KAAK,UAAU,EACf,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,YAAY,EAGZ,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,wBAAwB,CAAC;AAGhC,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AAEtF,+EAA+E;AAC/E,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAE9C,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAIjG,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEvD;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,iBAAiB,CAEjE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAEnF;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAMlB;AAOD,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,IAAI,CAKrE;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvD;AAYD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKlE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAE/C;AAED,yFAAyF;AACzF,eAAO,MAAM,OAAO,EAAE,OAOrB,CAAC;AAIF,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,CAM7C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAE/F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,CAUxF;AAKD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC"}
package/dist/client.js CHANGED
@@ -13,14 +13,14 @@
13
13
  * the transport's client subpath, never the boot. `@fougere/app/client` is the
14
14
  * subpath that keeps it that way.
15
15
  */
16
- import { FougereError, ErrorCode, toRegistrationName, } from '@fougere/core/contract';
16
+ import { FougereError, ErrorCode, lowerFirst, } from '@fougere/core/contract';
17
17
  import { frameCall, unframeResponse } from '@fougere/transport-http/client';
18
18
  /** The one door the browser knows. A named surface adds `/{surface}` to it. */
19
19
  export const CALL_ENDPOINT = '/_fougere/call';
20
20
  let nextId = 1;
21
21
  /** The registration key an entity class designates. */
22
22
  export function entityKeyOf(entity) {
23
- return toRegistrationName(entity.name);
23
+ return lowerFirst(entity.name);
24
24
  }
25
25
  export function callOf(entity, op) {
26
26
  return { entity: entityKeyOf(entity), op };
@@ -119,6 +119,6 @@ export function asFougereError(err, entityKey, op) {
119
119
  // The form contract is host-independent too, and a form is client code — so it
120
120
  // reaches the browser through this subpath rather than through the package root,
121
121
  // which carries the boot.
122
- export { formFieldsOf, payloadOf, errorsByField, } from './form.js';
122
+ export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, } from './form.js';
123
123
  export { sessionViewOf } from './session.js';
124
124
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/form.d.ts CHANGED
@@ -61,10 +61,35 @@ export interface FormField {
61
61
  }
62
62
  /**
63
63
  * The fields a create form is made of: membership from the io projection
64
- * (`inputFields` — what a client may supply), requiredness from the
64
+ * (`Visibility.input` — what a client may supply), requiredness from the
65
65
  * lifecycle axis (any create rule makes absence legal).
66
66
  */
67
67
  export declare function formFieldsOf(entity: FormEntity, entityKey: string): FormField[];
68
+ export interface TableColumn {
69
+ name: string;
70
+ /**
71
+ * How to print the value — the dual of {@link FormField.control}, and deliberately not
72
+ * the same list: a closed set prints as its value, a reference prints as a link.
73
+ */
74
+ render: 'text' | 'number' | 'boolean' | 'date' | 'json' | 'link';
75
+ /** The same key a form uses for the same field — one convention, two projections. */
76
+ labelKey: string;
77
+ label: string;
78
+ /**
79
+ * The entity a `link` points at, under the key its door is named by. Always present on a
80
+ * reference: the card carries the target's name, and a card rebuilt with no sibling to
81
+ * resolve to keeps it as a stand-in rather than losing it.
82
+ */
83
+ to?: string;
84
+ }
85
+ /**
86
+ * The columns a list is made of: membership from the io projection (`Visibility.output` — what
87
+ * may leave), minus collections, because a cell holds one value and a `many()` is a page.
88
+ *
89
+ * Which column identifies the row is NOT answered here — `FieldSet.primary` answers it for a
90
+ * shape, and its own doc records what five private copies of that loop cost.
91
+ */
92
+ export declare function tableColumnsOf(entity: FormEntity, entityKey: string): TableColumn[];
68
93
  /**
69
94
  * The wire body of the form's values — an empty control is an absent value
70
95
  * at the create boundary (absence is judged by the lifecycle axis, an empty
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAS,UAAU,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC;AAiBpC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7E,QAAQ,EAAE,OAAO,CAAC;IAClB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqDD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAmB/E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlF;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO/E"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAS,UAAU,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAE5F;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC;AAcpC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7E,QAAQ,EAAE,OAAO,CAAC;IAClB,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6DD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAkB/E;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjE,qFAAqF;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAaD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAYnF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlF;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO/E"}
package/dist/form.js CHANGED
@@ -1,9 +1,10 @@
1
+ import { Lifecycle } from '@fougere/schema';
1
2
  /**
2
3
  * Form contract, pure part — derives what a create/edit form is made of
3
4
  * from the entity's field axes. No Vue, no Nuxt: testable headless,
4
5
  * usable by any renderer (the page owns the widgets).
5
6
  */
6
- import { Anatomy, inputFields } from '@fougere/schema';
7
+ import { Anatomy, lowerFirst, Role, Visibility } from '@fougere/schema';
7
8
  /**
8
9
  * The literal a field is born with, when it declares one.
9
10
  *
@@ -13,10 +14,7 @@ import { Anatomy, inputFields } from '@fougere/schema';
13
14
  * is decided at write time, so a form has nothing to show for them.
14
15
  */
15
16
  function defaultOf(field) {
16
- const create = field.lifecycle?.create;
17
- return create !== null && typeof create === 'object' && 'value' in create
18
- ? create.value
19
- : undefined;
17
+ return Lifecycle.of(field).literal?.value;
20
18
  }
21
19
  /** The base JSON type of a shape — unwraps the `[T,'null']` union. */
22
20
  function baseType(type) {
@@ -68,23 +66,29 @@ function attrsOf(field, control, required) {
68
66
  };
69
67
  return Object.fromEntries(Object.entries(attrs).filter(([, v]) => v !== undefined));
70
68
  }
69
+ /**
70
+ * The label convention, spelled once for both projections: an i18n key by convention and
71
+ * the field's own name as the fallback. The schema never carries display text.
72
+ */
73
+ function labelOf(name, entityKey) {
74
+ return { labelKey: `${entityKey}.${name}`, label: name.charAt(0).toUpperCase() + name.slice(1) };
75
+ }
71
76
  /**
72
77
  * The fields a create form is made of: membership from the io projection
73
- * (`inputFields` — what a client may supply), requiredness from the
78
+ * (`Visibility.input` — what a client may supply), requiredness from the
74
79
  * lifecycle axis (any create rule makes absence legal).
75
80
  */
76
81
  export function formFieldsOf(entity, entityKey) {
77
- return Object.entries(inputFields(entity.getFields())).map(([name, field]) => {
82
+ return Object.entries(Visibility.of(entity.getFields()).input).map(([name, field]) => {
78
83
  const f = field;
79
84
  const control = controlOf(f);
80
- const required = f.lifecycle?.create === undefined;
85
+ const required = Lifecycle.of(f).requiredAtCreate;
81
86
  const attrs = attrsOf(f, control, required);
82
87
  return {
83
88
  name,
84
89
  control,
85
90
  required,
86
- labelKey: `${entityKey}.${name}`,
87
- label: name.charAt(0).toUpperCase() + name.slice(1),
91
+ ...labelOf(name, entityKey),
88
92
  ...(Array.isArray(enumOf(f))
89
93
  ? { options: enumOf(f).filter((value) => typeof value === 'string') }
90
94
  : {}),
@@ -93,6 +97,41 @@ export function formFieldsOf(entity, entityKey) {
93
97
  };
94
98
  });
95
99
  }
100
+ /** Asked of the relation before the shape: a reference's own shape is a bare string. */
101
+ function renderOf(field) {
102
+ if (Role.of(field).isReference)
103
+ return 'link';
104
+ const base = Anatomy.of(field.shape).base;
105
+ if (base?.type === 'number' || base?.type === 'integer')
106
+ return 'number';
107
+ if (base?.type === 'boolean')
108
+ return 'boolean';
109
+ if (base?.type === 'object' || base?.type === 'array')
110
+ return 'json';
111
+ if (base?.type === 'string' && base.format === 'date-time')
112
+ return 'date';
113
+ return 'text';
114
+ }
115
+ /**
116
+ * The columns a list is made of: membership from the io projection (`Visibility.output` — what
117
+ * may leave), minus collections, because a cell holds one value and a `many()` is a page.
118
+ *
119
+ * Which column identifies the row is NOT answered here — `FieldSet.primary` answers it for a
120
+ * shape, and its own doc records what five private copies of that loop cost.
121
+ */
122
+ export function tableColumnsOf(entity, entityKey) {
123
+ return Object.entries(Visibility.of(entity.getFields()).output)
124
+ .filter(([, field]) => !Role.of(field).isCollection)
125
+ .map(([name, field]) => {
126
+ const target = Role.of(field).target;
127
+ return {
128
+ name,
129
+ render: renderOf(field),
130
+ ...labelOf(name, entityKey),
131
+ ...(target ? { to: lowerFirst(target.name) } : {}),
132
+ };
133
+ });
134
+ }
96
135
  /**
97
136
  * The wire body of the form's values — an empty control is an absent value
98
137
  * at the create boundary (absence is judged by the lifecycle axis, an empty