@fougere/app 0.8.3-alpha.0 → 0.9.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 +1 -1
- package/dist/boot.d.ts.map +1 -1
- package/dist/boot.js +9 -19
- package/dist/boot.js.map +1 -1
- package/dist/express.d.ts +4 -4
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +5 -5
- package/dist/express.js.map +1 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +30 -23
- package/dist/form.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/web.d.ts +4 -4
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +4 -4
- package/dist/web.js.map +1 -1
- package/package.json +12 -11
- package/src/boot.ts +8 -19
- package/src/express.ts +5 -5
- package/src/form.ts +34 -16
- package/src/index.ts +1 -9
- package/src/web.ts +4 -4
package/dist/boot.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { App, CreateAppOptions, FougereConfig, Transport } from '@fougere/core';
|
|
2
|
-
import type
|
|
2
|
+
import { type ResolvedStorage } from '@fougere/defaults';
|
|
3
3
|
export interface FougereServerConfig {
|
|
4
4
|
/**
|
|
5
5
|
* The whole data layer, as `resolveStorage` composed it — where the rows are, which source
|
package/dist/boot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAW,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKlE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,8FAA8F;IAC9F,UAAU,CAAC,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC5C,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpC,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,8DAA8D;IAC9D,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;CAC9C;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,QAG3D;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,QAGjE;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,CAK5C;AAED,qBAAqB;AACrB,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAWpE"}
|
package/dist/boot.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/** Fougere server bootstrap — single entry point for an app's lifecycle, whatever hosts it. */
|
|
2
|
-
import { applyConfig, createApp, identityFromEnv, Logger
|
|
3
|
-
import { scanProject,
|
|
2
|
+
import { applyConfig, createApp, identityFromEnv, Logger } from '@fougere/core';
|
|
3
|
+
import { scanProject, frondAliases } from '@fougere/compiler';
|
|
4
|
+
import { resolveConventions } from '@fougere/core';
|
|
5
|
+
import { loadCascadedConfig, setModuleLoader } from '@fougere/core/node';
|
|
4
6
|
import { createContainer } from '@fougere/container';
|
|
5
7
|
import { createMemoryStorage } from '@fougere/adapter-memory';
|
|
8
|
+
import { layerOf } from '@fougere/defaults';
|
|
6
9
|
// ── State ────────────────────────────────────────
|
|
7
10
|
let _config = {};
|
|
8
11
|
let _appPromise = null;
|
|
@@ -95,8 +98,6 @@ async function boot() {
|
|
|
95
98
|
}
|
|
96
99
|
// The storage's two halves, kept together: its ascent is an extension, its connection
|
|
97
100
|
// is not — it is opened here, before the container, so it closes after the container.
|
|
98
|
-
const storageFactory = storage.storageFactory ?? createMemoryStorage;
|
|
99
|
-
const storageMigrate = storage.migrate;
|
|
100
101
|
// Layer-2 wiring: `remotes: { catalog: 'http://...' }` in fougere.config.ts
|
|
101
102
|
// is all the user writes — the default transport comes from here.
|
|
102
103
|
// The host's word wins here too — and where it speaks, nothing below runs: building
|
|
@@ -126,25 +127,14 @@ async function boot() {
|
|
|
126
127
|
? { scan: await scanProject(root, undefined, conventions) }
|
|
127
128
|
: {}),
|
|
128
129
|
createContainer,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
enforces: storage.enforces,
|
|
133
|
-
transacted: storage.transacted,
|
|
134
|
-
db: storage.db,
|
|
130
|
+
// The layer, spread whole. Naming a few of its members is how `transacted` and `close`
|
|
131
|
+
// were left behind once, under Nuxt only.
|
|
132
|
+
...layerOf(storage, createMemoryStorage),
|
|
135
133
|
auth: fileConfig.auth,
|
|
136
134
|
adapters: fileConfig.adapters,
|
|
137
135
|
remotes: fileConfig.remotes,
|
|
138
136
|
remoteTransport,
|
|
139
|
-
|
|
140
|
-
extensions: [
|
|
141
|
-
// The slot is declared even when this host resolved no storage — a host that resolved
|
|
142
|
-
// its own (the Nitro plugin does, for its bundler) then REPLACES this member in place
|
|
143
|
-
// instead of adding one after the seeds, which is rows before tables.
|
|
144
|
-
migrating(storageMigrate, (message) => log.warn(message)),
|
|
145
|
-
seeding((message) => log.info(`[seed]${message}`)),
|
|
146
|
-
...(_config.extensions ?? []),
|
|
147
|
-
],
|
|
137
|
+
extensions: _config.extensions ?? [],
|
|
148
138
|
// Opened before the container, so released after it. Never wired here until now:
|
|
149
139
|
// this host boots the storage and no host closed one, which is what made a reload
|
|
150
140
|
// leak the pool of every app it discarded.
|
package/dist/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAEA,+FAA+F;AAC/F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
|
package/dist/express.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
type Next = (err?: unknown) => void;
|
|
2
2
|
export type ExpressMiddleware = (req: any, res: any, next: Next) => void;
|
|
3
3
|
/** The call envelope, at `/_fougere/call` — the door the browser primitives use. */
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function call(mountPath?: string): ExpressMiddleware;
|
|
5
5
|
/** The session view, at `/_fougere/session`. */
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function session(mountPath?: string): ExpressMiddleware;
|
|
7
7
|
/** The REST projection, under `/api` by default. */
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function rest(mountPath?: string): ExpressMiddleware;
|
|
9
9
|
/** GraphQL, at `/graphql` by default. Declines when the app declares no such adapter. */
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function graphql(mountPath?: string): ExpressMiddleware;
|
|
11
11
|
/** Every door, for an app that wants all of them. What each one SERVES is still the
|
|
12
12
|
* app's declaration — mounting is not publishing. */
|
|
13
13
|
export declare function fougere(): ExpressMiddleware;
|
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AA2BA,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AACpC,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AA+BzE,oFAAoF;AACpF,wBAAgB,
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AA2BA,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AACpC,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;AA+BzE,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,SAAS,SAAmB,GAAG,iBAAiB,CAqBpE;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,SAAS,SAAsB,GAAG,iBAAiB,CAK1E;AAED,oDAAoD;AACpD,wBAAgB,IAAI,CAAC,SAAS,SAAS,GAAG,iBAAiB,CA4B1D;AAED,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,SAAS,SAAa,GAAG,iBAAiB,CAoBjE;AAED;sDACsD;AACtD,wBAAgB,OAAO,IAAI,iBAAiB,CAY3C"}
|
package/dist/express.js
CHANGED
|
@@ -29,7 +29,7 @@ function fail(res, next, err) {
|
|
|
29
29
|
next(err);
|
|
30
30
|
}
|
|
31
31
|
/** The call envelope, at `/_fougere/call` — the door the browser primitives use. */
|
|
32
|
-
export function
|
|
32
|
+
export function call(mountPath = '/_fougere/call') {
|
|
33
33
|
return (req, res, next) => {
|
|
34
34
|
const path = pathOf(req);
|
|
35
35
|
if (req.method !== 'POST' || !path.startsWith(mountPath))
|
|
@@ -54,7 +54,7 @@ export function fougereCall(mountPath = '/_fougere/call') {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
/** The session view, at `/_fougere/session`. */
|
|
57
|
-
export function
|
|
57
|
+
export function session(mountPath = '/_fougere/session') {
|
|
58
58
|
return (req, res, next) => {
|
|
59
59
|
if (req.method !== 'GET' || pathOf(req) !== mountPath)
|
|
60
60
|
return next();
|
|
@@ -62,7 +62,7 @@ export function fougereSession(mountPath = '/_fougere/session') {
|
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
64
|
/** The REST projection, under `/api` by default. */
|
|
65
|
-
export function
|
|
65
|
+
export function rest(mountPath = '/api') {
|
|
66
66
|
return (req, res, next) => {
|
|
67
67
|
const path = pathOf(req);
|
|
68
68
|
if (!path.startsWith(`${mountPath}/`))
|
|
@@ -93,7 +93,7 @@ export function fougereRest(mountPath = '/api') {
|
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
95
|
/** GraphQL, at `/graphql` by default. Declines when the app declares no such adapter. */
|
|
96
|
-
export function
|
|
96
|
+
export function graphql(mountPath = '/graphql') {
|
|
97
97
|
return (req, res, next) => {
|
|
98
98
|
if (req.method !== 'POST' || pathOf(req) !== mountPath)
|
|
99
99
|
return next();
|
|
@@ -115,7 +115,7 @@ export function fougereGraphQL(mountPath = '/graphql') {
|
|
|
115
115
|
/** Every door, for an app that wants all of them. What each one SERVES is still the
|
|
116
116
|
* app's declaration — mounting is not publishing. */
|
|
117
117
|
export function fougere() {
|
|
118
|
-
const doors = [
|
|
118
|
+
const doors = [call(), session(), rest(), graphql()];
|
|
119
119
|
return (req, res, next) => {
|
|
120
120
|
let index = 0;
|
|
121
121
|
const step = (err) => {
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAyB1C,+CAA+C;AAC/C,SAAS,OAAO,CAAC,GAAmB;IAClC,IAAI,GAAG,CAAC,YAAY;QAAE,OAAO,GAAG,CAAC,YAAY,CAAC;IAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,MAAM,CAAC,GAAmB;IACjC,OAAO,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;AAC7E,CAAC;AAED,SAAS,OAAO,CAAC,GAAmB;IAClC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QACpD,GAAG;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;KAChD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,SAAS,IAAI,CAAC,GAAoB,EAAE,IAAU,EAAE,GAAY;IAC1D,MAAM,IAAI,GAAI,GAAyB,EAAE,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
|
package/dist/form.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAS,UAAU,
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAS,UAAU,EAAa,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAEvG,kFAAkF;AAClF,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC;AAOpC,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;;;OAGG;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,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAsED,2CAA2C;AAC3C,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,yEAAyE;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAqBD,qCAAqC;AACrC,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,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQ/E"}
|
package/dist/form.js
CHANGED
|
@@ -20,20 +20,23 @@ const CONTROL_BY_FORMAT = {
|
|
|
20
20
|
email: 'email',
|
|
21
21
|
uri: 'url',
|
|
22
22
|
};
|
|
23
|
+
/** What the type alone decides. A `text` still asks its format — that list is open. */
|
|
24
|
+
const CONTROL_BY_TYPE = {
|
|
25
|
+
choice: 'select',
|
|
26
|
+
number: 'number',
|
|
27
|
+
integer: 'number',
|
|
28
|
+
boolean: 'boolean',
|
|
29
|
+
date: 'date',
|
|
30
|
+
object: 'text',
|
|
31
|
+
array: 'text',
|
|
32
|
+
};
|
|
23
33
|
function controlOf(field) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
const type = Shapes.typeOf(field.shape);
|
|
35
|
+
if (type && type !== 'text')
|
|
36
|
+
return CONTROL_BY_TYPE[type];
|
|
27
37
|
const base = Shapes.of(field.shape).base;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (base?.type === 'number' || base?.type === 'integer')
|
|
31
|
-
return 'number';
|
|
32
|
-
if (base?.type === 'boolean')
|
|
33
|
-
return 'boolean';
|
|
34
|
-
if (base?.type === 'string' && base.format)
|
|
35
|
-
return CONTROL_BY_FORMAT[base.format] ?? 'text';
|
|
36
|
-
return 'text';
|
|
38
|
+
const format = base?.type === 'string' ? base.format : undefined;
|
|
39
|
+
return (format && CONTROL_BY_FORMAT[format]) ?? 'text';
|
|
37
40
|
}
|
|
38
41
|
/** A closed set's members, when the shape declares one — `oneOf('draft','live')`. */
|
|
39
42
|
function enumOf(field) {
|
|
@@ -86,19 +89,21 @@ export function formFieldsOf(entity, entityKey) {
|
|
|
86
89
|
});
|
|
87
90
|
}
|
|
88
91
|
/** Asked of the relation before the shape: a reference's own shape is a bare string. */
|
|
92
|
+
const RENDER_BY_TYPE = {
|
|
93
|
+
number: 'number',
|
|
94
|
+
integer: 'number',
|
|
95
|
+
boolean: 'boolean',
|
|
96
|
+
object: 'json',
|
|
97
|
+
array: 'json',
|
|
98
|
+
date: 'date',
|
|
99
|
+
choice: 'text',
|
|
100
|
+
text: 'text',
|
|
101
|
+
};
|
|
89
102
|
function renderOf(field) {
|
|
90
103
|
if (Role.of(field).isReference)
|
|
91
104
|
return 'link';
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
return 'number';
|
|
95
|
-
if (base?.type === 'boolean')
|
|
96
|
-
return 'boolean';
|
|
97
|
-
if (base?.type === 'object' || base?.type === 'array')
|
|
98
|
-
return 'json';
|
|
99
|
-
if (base?.type === 'string' && base.format === 'date-time')
|
|
100
|
-
return 'date';
|
|
101
|
-
return 'text';
|
|
105
|
+
const type = Shapes.typeOf(field.shape);
|
|
106
|
+
return type ? RENDER_BY_TYPE[type] : 'text';
|
|
102
107
|
}
|
|
103
108
|
/** The columns a list is made of. */
|
|
104
109
|
export function tableColumnsOf(entity, entityKey) {
|
|
@@ -126,7 +131,9 @@ export function payloadOf(values) {
|
|
|
126
131
|
export function errorsByField(errors) {
|
|
127
132
|
const byField = {};
|
|
128
133
|
for (const err of errors) {
|
|
129
|
-
const field = err.path
|
|
134
|
+
const field = err.path[0];
|
|
135
|
+
if (field === undefined)
|
|
136
|
+
continue;
|
|
130
137
|
byField[field] ??= err.message;
|
|
131
138
|
}
|
|
132
139
|
return byField;
|
package/dist/form.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMvE,8DAA8D;AAC9D,SAAS,SAAS,CAAC,KAAY;IAC7B,OAAO,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC;AAC5C,CAAC;AA8BD,sEAAsE;AACtE,SAAS,QAAQ,CAAC,IAAa;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAY,IAAI,QAAQ,CAAC;IACvF,OAAQ,IAAe,IAAI,QAAQ,CAAC;AACtC,CAAC;AAED,2FAA2F;AAC3F,MAAM,iBAAiB,GAAyC;IAC9D,WAAW,EAAE,MAAM;IACnB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** `@fougere/app` — what an app host needs and what no host owns. */
|
|
2
2
|
export { configureFougere, extendFougere, useFougereApp, reloadFougere, type FougereServerConfig, } from './boot.js';
|
|
3
3
|
export { useFougereAuth } from './auth.js';
|
|
4
|
-
export { tableOf
|
|
5
|
-
export { serveRest,
|
|
4
|
+
export { tableOf } from './rest.js';
|
|
5
|
+
export { serveRest, serveRpc, surfaceOf, rpcParseError, invokeOn, } from './serve.js';
|
|
6
6
|
export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, type FormEntity, type FormField, type TableColumn, } from './form.js';
|
|
7
7
|
export { sessionViewOf, type SessionView } from './session.js';
|
|
8
8
|
export { stateFor } from './state.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** `@fougere/app` — what an app host needs and what no host owns. */
|
|
2
2
|
export { configureFougere, extendFougere, useFougereApp, reloadFougere, } from './boot.js';
|
|
3
3
|
export { useFougereAuth } from './auth.js';
|
|
4
|
-
export { tableOf
|
|
5
|
-
export { serveRest,
|
|
4
|
+
export { tableOf } from './rest.js';
|
|
5
|
+
export { serveRest, serveRpc, surfaceOf, rpcParseError, invokeOn, } from './serve.js';
|
|
6
6
|
export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, } from './form.js';
|
|
7
7
|
export { sessionViewOf } from './session.js';
|
|
8
8
|
export { stateFor } from './state.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,GAEd,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,aAAa,GAEd,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,GAId,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAoB,MAAM,cAAc,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAuB,MAAM,cAAc,CAAC;AAEjE,sFAAsF;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/web.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/** The call envelope. */
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function call(request: Request): Promise<Response>;
|
|
3
3
|
/** The REST projection, mounted under `/api`. */
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function rest(request: Request): Promise<Response>;
|
|
5
5
|
/** The session view over the wire, for a client refreshing after login or logout. */
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function session(request: Request): Promise<Response>;
|
|
7
7
|
/** GraphQL, at whatever path the host mounted it — `/graphql` by convention. */
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function graphql(request: Request): Promise<Response>;
|
|
9
9
|
//# sourceMappingURL=web.d.ts.map
|
package/dist/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAQA,yBAAyB;AACzB,wBAAsB,
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAQA,yBAAyB;AACzB,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqB9D;AAED,iDAAiD;AACjD,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoB9D;AAED,qFAAqF;AACrF,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEjE;AAED,gFAAgF;AAChF,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkBjE"}
|
package/dist/web.js
CHANGED
|
@@ -5,7 +5,7 @@ import { sessionViewOf } from './session.js';
|
|
|
5
5
|
import { stateFor } from './state.js';
|
|
6
6
|
const WITH_BODY = new Set(['POST', 'PUT', 'PATCH']);
|
|
7
7
|
/** The call envelope. */
|
|
8
|
-
export async function
|
|
8
|
+
export async function call(request) {
|
|
9
9
|
const declared = Number(request.headers.get('content-length'));
|
|
10
10
|
if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {
|
|
11
11
|
return Response.json({ message: 'Payload too large' }, { status: 413 });
|
|
@@ -25,7 +25,7 @@ export async function fougereCall(request) {
|
|
|
25
25
|
}));
|
|
26
26
|
}
|
|
27
27
|
/** The REST projection, mounted under `/api`. */
|
|
28
|
-
export async function
|
|
28
|
+
export async function rest(request) {
|
|
29
29
|
const app = await useFougereApp();
|
|
30
30
|
const url = new URL(request.url);
|
|
31
31
|
const method = request.method.toUpperCase();
|
|
@@ -45,11 +45,11 @@ export async function fougereRest(request) {
|
|
|
45
45
|
return Response.json(outcome.body, { status: outcome.status });
|
|
46
46
|
}
|
|
47
47
|
/** The session view over the wire, for a client refreshing after login or logout. */
|
|
48
|
-
export async function
|
|
48
|
+
export async function session(request) {
|
|
49
49
|
return Response.json(sessionViewOf(await stateFor(request.headers)));
|
|
50
50
|
}
|
|
51
51
|
/** GraphQL, at whatever path the host mounted it — `/graphql` by convention. */
|
|
52
|
-
export async function
|
|
52
|
+
export async function graphql(request) {
|
|
53
53
|
const app = await useFougereApp();
|
|
54
54
|
const body = (await request.json().catch(() => ({})));
|
|
55
55
|
const outcome = await serveGraphQL(app, {
|
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpD,yBAAyB;AACzB,MAAM,CAAC,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0-alpha.0",
|
|
4
4
|
"description": "The host-independent half of a Fougere app: boot, call envelope, REST table, form contract.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
@@ -42,24 +42,25 @@
|
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"jiti": "^2.6.1",
|
|
45
|
-
"@fougere/
|
|
46
|
-
"@fougere/
|
|
47
|
-
"@fougere/
|
|
48
|
-
"@fougere/
|
|
49
|
-
"@fougere/
|
|
50
|
-
"@fougere/
|
|
51
|
-
"@fougere/
|
|
52
|
-
"@fougere/transport-http": "0.
|
|
45
|
+
"@fougere/defaults": "0.9.0-alpha.0",
|
|
46
|
+
"@fougere/schema": "0.9.0-alpha.0",
|
|
47
|
+
"@fougere/core": "0.9.0-alpha.0",
|
|
48
|
+
"@fougere/container": "0.9.0-alpha.0",
|
|
49
|
+
"@fougere/adapter-memory": "0.9.0-alpha.0",
|
|
50
|
+
"@fougere/http": "0.9.0-alpha.0",
|
|
51
|
+
"@fougere/compiler": "0.9.0-alpha.0",
|
|
52
|
+
"@fougere/transport-http": "0.9.0-alpha.0",
|
|
53
|
+
"@fougere/adapter-rest": "0.9.0-alpha.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
56
|
"vitest": "^4.1.0",
|
|
56
|
-
"@fougere/adapter-graphql": "0.
|
|
57
|
+
"@fougere/adapter-graphql": "0.9.0-alpha.0"
|
|
57
58
|
},
|
|
58
59
|
"publishConfig": {
|
|
59
60
|
"access": "public"
|
|
60
61
|
},
|
|
61
62
|
"peerDependencies": {
|
|
62
|
-
"@fougere/adapter-graphql": "0.
|
|
63
|
+
"@fougere/adapter-graphql": "0.9.0-alpha.0"
|
|
63
64
|
},
|
|
64
65
|
"peerDependenciesMeta": {
|
|
65
66
|
"@fougere/adapter-graphql": {
|
package/src/boot.ts
CHANGED
|
@@ -2,12 +2,14 @@ import { Role } from '@fougere/schema';
|
|
|
2
2
|
import { Lifecycle } from '@fougere/schema';
|
|
3
3
|
/** Fougere server bootstrap — single entry point for an app's lifecycle, whatever hosts it. */
|
|
4
4
|
import { applyConfig, createApp, identityFromEnv, Logger, migrating, seeding } from '@fougere/core';
|
|
5
|
-
import { scanProject,
|
|
5
|
+
import { scanProject, frondAliases } from '@fougere/compiler';
|
|
6
|
+
import { resolveConventions } from '@fougere/core';
|
|
7
|
+
import { loadCascadedConfig, setModuleLoader } from '@fougere/core/node';
|
|
6
8
|
import type { Extension } from '@fougere/core';
|
|
7
9
|
import { createContainer } from '@fougere/container';
|
|
8
10
|
import { createMemoryStorage } from '@fougere/adapter-memory';
|
|
9
11
|
import type { App, CreateAppOptions, Storage, FougereConfig, Transport } from '@fougere/core';
|
|
10
|
-
import type
|
|
12
|
+
import { layerOf, type ResolvedStorage } from '@fougere/defaults';
|
|
11
13
|
import { applyCreate, applyUpdate, type SchemaView } from '@fougere/schema';
|
|
12
14
|
|
|
13
15
|
// ── Public types ─────────────────────────────────
|
|
@@ -136,8 +138,6 @@ async function boot(): Promise<App> {
|
|
|
136
138
|
}
|
|
137
139
|
// The storage's two halves, kept together: its ascent is an extension, its connection
|
|
138
140
|
// is not — it is opened here, before the container, so it closes after the container.
|
|
139
|
-
const storageFactory = storage.storageFactory ?? createMemoryStorage;
|
|
140
|
-
const storageMigrate: Extension['up'] | undefined = storage.migrate;
|
|
141
141
|
|
|
142
142
|
// Layer-2 wiring: `remotes: { catalog: 'http://...' }` in fougere.config.ts
|
|
143
143
|
// is all the user writes — the default transport comes from here.
|
|
@@ -169,25 +169,14 @@ async function boot(): Promise<App> {
|
|
|
169
169
|
? { scan: await scanProject(root, undefined, conventions) }
|
|
170
170
|
: {}),
|
|
171
171
|
createContainer,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
enforces: storage.enforces,
|
|
176
|
-
transacted: storage.transacted as never,
|
|
177
|
-
db: storage.db,
|
|
172
|
+
// The layer, spread whole. Naming a few of its members is how `transacted` and `close`
|
|
173
|
+
// were left behind once, under Nuxt only.
|
|
174
|
+
...layerOf(storage, createMemoryStorage),
|
|
178
175
|
auth: fileConfig.auth,
|
|
179
176
|
adapters: fileConfig.adapters,
|
|
180
177
|
remotes: fileConfig.remotes,
|
|
181
178
|
remoteTransport,
|
|
182
|
-
|
|
183
|
-
extensions: [
|
|
184
|
-
// The slot is declared even when this host resolved no storage — a host that resolved
|
|
185
|
-
// its own (the Nitro plugin does, for its bundler) then REPLACES this member in place
|
|
186
|
-
// instead of adding one after the seeds, which is rows before tables.
|
|
187
|
-
migrating(storageMigrate, (message) => log.warn(message)),
|
|
188
|
-
seeding((message) => log.info(`[seed]${message}`)),
|
|
189
|
-
...(_config.extensions ?? []),
|
|
190
|
-
],
|
|
179
|
+
extensions: _config.extensions ?? [],
|
|
191
180
|
// Opened before the container, so released after it. Never wired here until now:
|
|
192
181
|
// this host boots the storage and no host closed one, which is what made a reload
|
|
193
182
|
// leak the pool of every app it discarded.
|
package/src/express.ts
CHANGED
|
@@ -58,7 +58,7 @@ function fail(res: ExpressResponse, next: Next, err: unknown): void {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
/** The call envelope, at `/_fougere/call` — the door the browser primitives use. */
|
|
61
|
-
export function
|
|
61
|
+
export function call(mountPath = '/_fougere/call'): ExpressMiddleware {
|
|
62
62
|
return (req, res, next) => {
|
|
63
63
|
const path = pathOf(req);
|
|
64
64
|
if (req.method !== 'POST' || !path.startsWith(mountPath)) return next();
|
|
@@ -82,7 +82,7 @@ export function fougereCall(mountPath = '/_fougere/call'): ExpressMiddleware {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/** The session view, at `/_fougere/session`. */
|
|
85
|
-
export function
|
|
85
|
+
export function session(mountPath = '/_fougere/session'): ExpressMiddleware {
|
|
86
86
|
return (req, res, next) => {
|
|
87
87
|
if (req.method !== 'GET' || pathOf(req) !== mountPath) return next();
|
|
88
88
|
res.status(200).json(sessionViewOf(stateOf(req)));
|
|
@@ -90,7 +90,7 @@ export function fougereSession(mountPath = '/_fougere/session'): ExpressMiddlewa
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
/** The REST projection, under `/api` by default. */
|
|
93
|
-
export function
|
|
93
|
+
export function rest(mountPath = '/api'): ExpressMiddleware {
|
|
94
94
|
return (req, res, next) => {
|
|
95
95
|
const path = pathOf(req);
|
|
96
96
|
if (!path.startsWith(`${mountPath}/`)) return next();
|
|
@@ -121,7 +121,7 @@ export function fougereRest(mountPath = '/api'): ExpressMiddleware {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
/** GraphQL, at `/graphql` by default. Declines when the app declares no such adapter. */
|
|
124
|
-
export function
|
|
124
|
+
export function graphql(mountPath = '/graphql'): ExpressMiddleware {
|
|
125
125
|
return (req, res, next) => {
|
|
126
126
|
if (req.method !== 'POST' || pathOf(req) !== mountPath) return next();
|
|
127
127
|
|
|
@@ -146,7 +146,7 @@ export function fougereGraphQL(mountPath = '/graphql'): ExpressMiddleware {
|
|
|
146
146
|
/** Every door, for an app that wants all of them. What each one SERVES is still the
|
|
147
147
|
* app's declaration — mounting is not publishing. */
|
|
148
148
|
export function fougere(): ExpressMiddleware {
|
|
149
|
-
const doors = [
|
|
149
|
+
const doors = [call(), session(), rest(), graphql()];
|
|
150
150
|
return (req, res, next) => {
|
|
151
151
|
let index = 0;
|
|
152
152
|
const step = (err?: unknown) => {
|
package/src/form.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Lifecycle } from '@fougere/schema';
|
|
|
4
4
|
* axes.
|
|
5
5
|
*/
|
|
6
6
|
import { Shapes, lowerFirst, Role, Visibility } from '@fougere/schema';
|
|
7
|
-
import type { Field, SchemaView, ValidationError, ValidationResult } from '@fougere/schema';
|
|
7
|
+
import type { Field, SchemaView, ShapeType, ValidationError, ValidationResult } from '@fougere/schema';
|
|
8
8
|
|
|
9
9
|
/** What an entity class exposes to a form — the schema statics it already has. */
|
|
10
10
|
export type FormEntity = SchemaView;
|
|
@@ -55,16 +55,25 @@ const CONTROL_BY_FORMAT: Record<string, FormField['control']> = {
|
|
|
55
55
|
uri: 'url',
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
/** What the type alone decides. A `text` still asks its format — that list is open. */
|
|
59
|
+
const CONTROL_BY_TYPE: Record<Exclude<ShapeType, 'text'>, FormField['control']> = {
|
|
60
|
+
choice: 'select',
|
|
61
|
+
number: 'number',
|
|
62
|
+
integer: 'number',
|
|
63
|
+
boolean: 'boolean',
|
|
64
|
+
date: 'date',
|
|
65
|
+
object: 'text',
|
|
66
|
+
array: 'text',
|
|
67
|
+
};
|
|
68
|
+
|
|
58
69
|
function controlOf(field: Field): FormField['control'] {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
70
|
+
const type = Shapes.typeOf(field.shape);
|
|
71
|
+
if (type && type !== 'text') return CONTROL_BY_TYPE[type];
|
|
72
|
+
|
|
62
73
|
const base = Shapes.of(field.shape).base;
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (base?.type === 'string' && base.format) return CONTROL_BY_FORMAT[base.format] ?? 'text';
|
|
67
|
-
return 'text';
|
|
74
|
+
const format = base?.type === 'string' ? base.format : undefined;
|
|
75
|
+
|
|
76
|
+
return (format && CONTROL_BY_FORMAT[format]) ?? 'text';
|
|
68
77
|
}
|
|
69
78
|
|
|
70
79
|
/** A closed set's members, when the shape declares one — `oneOf('draft','live')`. */
|
|
@@ -137,14 +146,22 @@ export interface TableColumn {
|
|
|
137
146
|
}
|
|
138
147
|
|
|
139
148
|
/** Asked of the relation before the shape: a reference's own shape is a bare string. */
|
|
149
|
+
const RENDER_BY_TYPE: Record<ShapeType, TableColumn['render']> = {
|
|
150
|
+
number: 'number',
|
|
151
|
+
integer: 'number',
|
|
152
|
+
boolean: 'boolean',
|
|
153
|
+
object: 'json',
|
|
154
|
+
array: 'json',
|
|
155
|
+
date: 'date',
|
|
156
|
+
choice: 'text',
|
|
157
|
+
text: 'text',
|
|
158
|
+
};
|
|
159
|
+
|
|
140
160
|
function renderOf(field: Field): TableColumn['render'] {
|
|
141
161
|
if (Role.of(field).isReference) return 'link';
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (base?.type === 'object' || base?.type === 'array') return 'json';
|
|
146
|
-
if (base?.type === 'string' && base.format === 'date-time') return 'date';
|
|
147
|
-
return 'text';
|
|
162
|
+
const type = Shapes.typeOf(field.shape);
|
|
163
|
+
|
|
164
|
+
return type ? RENDER_BY_TYPE[type] : 'text';
|
|
148
165
|
}
|
|
149
166
|
|
|
150
167
|
/** The columns a list is made of. */
|
|
@@ -177,7 +194,8 @@ export function payloadOf(values: Record<string, unknown>): Record<string, unkno
|
|
|
177
194
|
export function errorsByField(errors: ValidationError[]): Record<string, string> {
|
|
178
195
|
const byField: Record<string, string> = {};
|
|
179
196
|
for (const err of errors) {
|
|
180
|
-
const field = err.path
|
|
197
|
+
const field = err.path[0];
|
|
198
|
+
if (field === undefined) continue;
|
|
181
199
|
byField[field] ??= err.message;
|
|
182
200
|
}
|
|
183
201
|
return byField;
|
package/src/index.ts
CHANGED
|
@@ -9,22 +9,14 @@ export {
|
|
|
9
9
|
|
|
10
10
|
export { useFougereAuth } from './auth.js';
|
|
11
11
|
|
|
12
|
-
export {
|
|
13
|
-
tableOf,
|
|
14
|
-
matchRoute,
|
|
15
|
-
type Matchable,
|
|
16
|
-
type RouteMatch,
|
|
17
|
-
} from './rest.js';
|
|
12
|
+
export { tableOf } from './rest.js';
|
|
18
13
|
|
|
19
14
|
export {
|
|
20
15
|
serveRest,
|
|
21
|
-
shapeRest,
|
|
22
16
|
serveRpc,
|
|
23
17
|
surfaceOf,
|
|
24
18
|
rpcParseError,
|
|
25
19
|
invokeOn,
|
|
26
|
-
type DoorRequest,
|
|
27
|
-
type Outcome,
|
|
28
20
|
} from './serve.js';
|
|
29
21
|
|
|
30
22
|
export {
|
package/src/web.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { stateFor } from './state.js';
|
|
|
7
7
|
const WITH_BODY = new Set(['POST', 'PUT', 'PATCH']);
|
|
8
8
|
|
|
9
9
|
/** The call envelope. */
|
|
10
|
-
export async function
|
|
10
|
+
export async function call(request: Request): Promise<Response> {
|
|
11
11
|
const declared = Number(request.headers.get('content-length'));
|
|
12
12
|
if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {
|
|
13
13
|
return Response.json({ message: 'Payload too large' }, { status: 413 });
|
|
@@ -31,7 +31,7 @@ export async function fougereCall(request: Request): Promise<Response> {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
/** The REST projection, mounted under `/api`. */
|
|
34
|
-
export async function
|
|
34
|
+
export async function rest(request: Request): Promise<Response> {
|
|
35
35
|
const app = await useFougereApp();
|
|
36
36
|
const url = new URL(request.url);
|
|
37
37
|
const method = request.method.toUpperCase();
|
|
@@ -54,12 +54,12 @@ export async function fougereRest(request: Request): Promise<Response> {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
/** The session view over the wire, for a client refreshing after login or logout. */
|
|
57
|
-
export async function
|
|
57
|
+
export async function session(request: Request): Promise<Response> {
|
|
58
58
|
return Response.json(sessionViewOf(await stateFor(request.headers)));
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/** GraphQL, at whatever path the host mounted it — `/graphql` by convention. */
|
|
62
|
-
export async function
|
|
62
|
+
export async function graphql(request: Request): Promise<Response> {
|
|
63
63
|
const app = await useFougereApp();
|
|
64
64
|
const body = (await request.json().catch(() => ({}))) as {
|
|
65
65
|
query?: string;
|