@fougere/adapter-rest 0.9.2-alpha.0 → 0.10.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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/register.d.ts +1 -1
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +2 -2
- package/dist/register.js.map +1 -1
- package/dist/routes/EntityEntry.d.ts +8 -0
- package/dist/routes/EntityEntry.d.ts.map +1 -0
- package/dist/routes/EntityEntry.js +2 -0
- package/dist/routes/EntityEntry.js.map +1 -0
- package/dist/routes/GenerateRoutesOptions.d.ts +17 -0
- package/dist/routes/GenerateRoutesOptions.d.ts.map +1 -0
- package/dist/routes/GenerateRoutesOptions.js +2 -0
- package/dist/routes/GenerateRoutesOptions.js.map +1 -0
- package/dist/routes/OperationMeta.d.ts +10 -0
- package/dist/routes/OperationMeta.d.ts.map +1 -0
- package/dist/routes/OperationMeta.js +2 -0
- package/dist/routes/OperationMeta.js.map +1 -0
- package/dist/{routes.d.ts → routes/RouteDefinition.d.ts} +7 -33
- package/dist/routes/RouteDefinition.d.ts.map +1 -0
- package/dist/{routes.js → routes/RouteDefinition.js} +6 -1
- package/dist/routes/RouteDefinition.js.map +1 -0
- package/package.json +4 -4
- package/src/index.ts +2 -1
- package/src/register.ts +3 -3
- package/src/routes/EntityEntry.ts +8 -0
- package/src/routes/GenerateRoutesOptions.ts +13 -0
- package/src/routes/OperationMeta.ts +10 -0
- package/src/{routes.ts → routes/RouteDefinition.ts} +7 -39
- package/dist/routes.d.ts.map +0 -1
- package/dist/routes.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { generateRoutes, type RouteDefinition
|
|
1
|
+
export { generateRoutes, type RouteDefinition } from './routes/RouteDefinition.js';
|
|
2
|
+
export type { HttpMethod } from '@fougere/http';
|
|
2
3
|
export { registerRoutes } from './register.js';
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnF,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { generateRoutes } from './routes.js';
|
|
1
|
+
export { generateRoutes } from './routes/RouteDefinition.js';
|
|
2
2
|
export { registerRoutes } from './register.js';
|
|
3
3
|
// No schema endpoint here. Discovery is `rpc.discover` on the envelope — one
|
|
4
4
|
// surface, which answers with what the host SERVES. A second GET published
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAwB,MAAM,6BAA6B,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,sCAAsC"}
|
package/dist/register.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Framework-agnostic route registration — translates RouteDefinition[] into HttpRouter calls.
|
|
3
3
|
*/
|
|
4
4
|
import type { HttpRouter } from '@fougere/http';
|
|
5
|
-
import type { RouteDefinition } from './routes.js';
|
|
5
|
+
import type { RouteDefinition } from './routes/RouteDefinition.js';
|
|
6
6
|
/** Register all route definitions on an HttpRouter. */
|
|
7
7
|
export declare function registerRoutes(router: HttpRouter, routes: RouteDefinition[]): void;
|
|
8
8
|
//# sourceMappingURL=register.d.ts.map
|
package/dist/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,uDAAuD;AACvD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,eAAe,EAAE,GACxB,IAAI,CA0CN"}
|
package/dist/register.js
CHANGED
|
@@ -22,12 +22,12 @@ export function registerRoutes(router, routes) {
|
|
|
22
22
|
return { status: 404, data: { error: 'Not found' } };
|
|
23
23
|
}
|
|
24
24
|
// The computed fields are already here: the façade applies the presenter on every
|
|
25
|
-
//
|
|
25
|
+
// facade (`PresenterExecutor`), so a route that re-applied it did the work twice — and
|
|
26
26
|
// once a computed field started receiving the PAGE rather than one row, the second
|
|
27
27
|
// pass handed it a single object and threw `posts.map is not a function`.
|
|
28
28
|
return {
|
|
29
29
|
status: route.successStatus ?? (route.operationName === 'create' ? 201 : 200),
|
|
30
|
-
// The façade is the single egress boundary for every
|
|
30
|
+
// The façade is the single egress boundary for every facade. Re-encoding here
|
|
31
31
|
// makes custom encoders run twice and makes REST disagree with the envelope.
|
|
32
32
|
data: result,
|
|
33
33
|
};
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,uDAAuD;AACvD,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,MAAyB;IAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwC,CAAC;YAEvE,MAAM,UAAU,GAAG;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACpF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;gBACvD,CAAC;gBACD,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBACxD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACrC,CAAC;gBACD,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBACzD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;gBACvD,CAAC;gBAED,kFAAkF;gBAClF,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,uDAAuD;AACvD,MAAM,UAAU,cAAc,CAC5B,MAAkB,EAClB,MAAyB;IAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwC,CAAC;YAEvE,MAAM,UAAU,GAAG;gBACjB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACpF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;gBACvD,CAAC;gBACD,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBACxD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACrC,CAAC;gBACD,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBACzD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;gBACvD,CAAC;gBAED,kFAAkF;gBAClF,uFAAuF;gBACvF,mFAAmF;gBACnF,0EAA0E;gBAE1E,OAAO;oBACL,MAAM,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC7E,8EAA8E;oBAC9E,6EAA6E;oBAC7E,IAAI,EAAE,MAAM;iBACb,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SchemaView } from '@fougere/schema';
|
|
2
|
+
export interface EntityEntry {
|
|
3
|
+
name: string;
|
|
4
|
+
/** A live class in-process, a card from a frond whose class never crossed. */
|
|
5
|
+
entityClass: SchemaView;
|
|
6
|
+
exposed?: boolean;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=EntityEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityEntry.d.ts","sourceRoot":"","sources":["../../src/routes/EntityEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityEntry.js","sourceRoot":"","sources":["../../src/routes/EntityEntry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HttpMethod } from '@fougere/http';
|
|
2
|
+
import type { EntityEntry } from './EntityEntry.js';
|
|
3
|
+
export interface GenerateRoutesOptions {
|
|
4
|
+
/** Base path prefix (e.g. '/api'). Default: ''. */
|
|
5
|
+
prefix?: string;
|
|
6
|
+
/** Override route config per entity. */
|
|
7
|
+
overrides?: Record<string, Record<string, {
|
|
8
|
+
method?: HttpMethod;
|
|
9
|
+
path?: string;
|
|
10
|
+
status?: number;
|
|
11
|
+
}>>;
|
|
12
|
+
/** Filter entities. */
|
|
13
|
+
filter?: (entity: EntityEntry, frondName: string) => boolean;
|
|
14
|
+
/** Surface name for filtering (e.g. 'rest', 'graphql'). Uses frond.config.ts surfaces if set. */
|
|
15
|
+
surface?: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=GenerateRoutesOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateRoutesOptions.d.ts","sourceRoot":"","sources":["../../src/routes/GenerateRoutesOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACpG,uBAAuB;IACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7D,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateRoutesOptions.js","sourceRoot":"","sources":["../../src/routes/GenerateRoutesOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SchemaView } from '@fougere/schema';
|
|
2
|
+
export interface OperationMeta {
|
|
3
|
+
input?: SchemaView;
|
|
4
|
+
output?: SchemaView;
|
|
5
|
+
/** Canonical kind from core's EffectiveOperation. */
|
|
6
|
+
kind: 'query' | 'command';
|
|
7
|
+
/** The operation in words — see `RouteDefinition.description`. */
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=OperationMeta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationMeta.d.ts","sourceRoot":"","sources":["../../src/routes/OperationMeta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qDAAqD;IACrD,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationMeta.js","sourceRoot":"","sources":["../../src/routes/OperationMeta.ts"],"names":[],"mappings":""}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
/** @fougere/adapter-rest — generates REST route definitions from fougere handlers. */
|
|
2
1
|
import type { Fields, SchemaView } from '@fougere/schema';
|
|
3
|
-
import type { HandlerEntry as CoreHandlerEntry } from '@fougere/core';
|
|
4
|
-
export type { HttpMethod } from '@fougere/http';
|
|
5
2
|
import type { HttpMethod } from '@fougere/http';
|
|
3
|
+
import type { HandlerEntry as CoreHandlerEntry } from '@fougere/core';
|
|
4
|
+
import type { EntityEntry } from './EntityEntry.js';
|
|
5
|
+
import type { OperationMeta } from './OperationMeta.js';
|
|
6
|
+
import type { GenerateRoutesOptions } from './GenerateRoutesOptions.js';
|
|
6
7
|
export interface RouteDefinition {
|
|
7
8
|
method: HttpMethod;
|
|
8
9
|
path: string;
|
|
@@ -19,20 +20,6 @@ export interface RouteDefinition {
|
|
|
19
20
|
/** The operation in words — the method's own doc sentence, carried by the contract. */
|
|
20
21
|
description?: string;
|
|
21
22
|
}
|
|
22
|
-
interface OperationMeta {
|
|
23
|
-
input?: SchemaView;
|
|
24
|
-
output?: SchemaView;
|
|
25
|
-
/** Canonical kind from core's EffectiveOperation. */
|
|
26
|
-
kind: 'query' | 'command';
|
|
27
|
-
/** The operation in words — see `RouteDefinition.description`. */
|
|
28
|
-
description?: string;
|
|
29
|
-
}
|
|
30
|
-
interface EntityEntry {
|
|
31
|
-
name: string;
|
|
32
|
-
/** A live class in-process, a card from a frond whose class never crossed. */
|
|
33
|
-
entityClass: SchemaView;
|
|
34
|
-
exposed?: boolean;
|
|
35
|
-
}
|
|
36
23
|
/** Only what this projection reads of a scanned handler — five fields of nine. */
|
|
37
24
|
type HandlerEntry = Pick<CoreHandlerEntry, 'address' | 'surface'> & {
|
|
38
25
|
/** `Crud(Post, PostPublic)` — the handler-wide output view, scoping every op. */
|
|
@@ -52,7 +39,7 @@ interface FrondLike {
|
|
|
52
39
|
handlers: HandlerEntry[];
|
|
53
40
|
presenters: PresenterEntry[];
|
|
54
41
|
surfaces?: Record<string, string[]>;
|
|
55
|
-
/** What `frond.config.ts` said per op — `rest:` is read here, `graphql:` next
|
|
42
|
+
/** What `frond.config.ts` said per op — `rest:` is read here, `graphql:` next facade. */
|
|
56
43
|
operationsOverrides?: Record<string, {
|
|
57
44
|
rest?: {
|
|
58
45
|
method?: string;
|
|
@@ -68,20 +55,7 @@ interface AppLike {
|
|
|
68
55
|
/** Canonical operation table produced by core. */
|
|
69
56
|
operationsFor(entity: string, surface?: string): Map<string, OperationMeta> | undefined;
|
|
70
57
|
}
|
|
71
|
-
export interface GenerateRoutesOptions {
|
|
72
|
-
/** Base path prefix (e.g. '/api'). Default: ''. */
|
|
73
|
-
prefix?: string;
|
|
74
|
-
/** Override route config per entity. */
|
|
75
|
-
overrides?: Record<string, Record<string, {
|
|
76
|
-
method?: HttpMethod;
|
|
77
|
-
path?: string;
|
|
78
|
-
status?: number;
|
|
79
|
-
}>>;
|
|
80
|
-
/** Filter entities. */
|
|
81
|
-
filter?: (entity: EntityEntry, frondName: string) => boolean;
|
|
82
|
-
/** Surface name for filtering (e.g. 'rest', 'graphql'). Uses frond.config.ts surfaces if set. */
|
|
83
|
-
surface?: string;
|
|
84
|
-
}
|
|
85
58
|
/** Generate REST route definitions from a fougere App. */
|
|
86
59
|
export declare function generateRoutes(app: AppLike, options?: GenerateRoutesOptions): RouteDefinition[];
|
|
87
|
-
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=RouteDefinition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteDefinition.d.ts","sourceRoot":"","sources":["../../src/routes/RouteDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;CAItB;AAED,kFAAkF;AAClF,KAAK,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG;IAClE,iFAAiF;IACjF,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,GAAG;QAAE,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CACxE,CAAC;AASF,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CACtG;AAED,UAAU,OAAO;IACf,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,4EAA4E;IAC5E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;IAClF,kDAAkD;IAClD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;CACzF;AA6DD,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,eAAe,EAAE,CA2F/F"}
|
|
@@ -44,6 +44,11 @@ function derivePath(entityName, opName) {
|
|
|
44
44
|
const segment = cleanName.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase());
|
|
45
45
|
return withId ? `${base}/:id/${segment}` : `${base}/${segment}`;
|
|
46
46
|
}
|
|
47
|
+
// ─── Route generation helpers ───────────────────
|
|
48
|
+
// Update routes carry the SAME fields: input omissibility is a projection of the
|
|
49
|
+
// route's MODE (operationName 'update' → patch), never forged per-field flags.
|
|
50
|
+
// Membership is the axes-derived `Visibility.input` projection from @fougere/schema.
|
|
51
|
+
// ─── Public API ─────────────────────────────────
|
|
47
52
|
/** Generate REST route definitions from a fougere App. */
|
|
48
53
|
export function generateRoutes(app, options) {
|
|
49
54
|
const prefix = options?.prefix ?? '';
|
|
@@ -124,4 +129,4 @@ export function generateRoutes(app, options) {
|
|
|
124
129
|
}
|
|
125
130
|
return routes;
|
|
126
131
|
}
|
|
127
|
-
//# sourceMappingURL=
|
|
132
|
+
//# sourceMappingURL=RouteDefinition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RouteDefinition.js","sourceRoot":"","sources":["../../src/routes/RouteDefinition.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fougere/adapter-rest",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0-alpha.0",
|
|
4
4
|
"description": "Entity → REST routes.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fougere",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"src"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@fougere/core": "0.
|
|
33
|
-
"@fougere/
|
|
34
|
-
"@fougere/
|
|
32
|
+
"@fougere/core": "0.10.0-alpha.0",
|
|
33
|
+
"@fougere/schema": "0.10.0-alpha.0",
|
|
34
|
+
"@fougere/http": "0.10.0-alpha.0"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { generateRoutes, type RouteDefinition
|
|
1
|
+
export { generateRoutes, type RouteDefinition } from './routes/RouteDefinition.js';
|
|
2
|
+
export type { HttpMethod } from '@fougere/http';
|
|
2
3
|
export { registerRoutes } from './register.js';
|
|
3
4
|
|
|
4
5
|
// No schema endpoint here. Discovery is `rpc.discover` on the envelope — one
|
package/src/register.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { HttpRouter } from '@fougere/http';
|
|
5
5
|
import { toHttpError } from '@fougere/core';
|
|
6
|
-
import type { RouteDefinition } from './routes.js';
|
|
6
|
+
import type { RouteDefinition } from './routes/RouteDefinition.js';
|
|
7
7
|
|
|
8
8
|
/** Register all route definitions on an HttpRouter. */
|
|
9
9
|
export function registerRoutes(
|
|
@@ -35,13 +35,13 @@ export function registerRoutes(
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
// The computed fields are already here: the façade applies the presenter on every
|
|
38
|
-
//
|
|
38
|
+
// facade (`PresenterExecutor`), so a route that re-applied it did the work twice — and
|
|
39
39
|
// once a computed field started receiving the PAGE rather than one row, the second
|
|
40
40
|
// pass handed it a single object and threw `posts.map is not a function`.
|
|
41
41
|
|
|
42
42
|
return {
|
|
43
43
|
status: route.successStatus ?? (route.operationName === 'create' ? 201 : 200),
|
|
44
|
-
// The façade is the single egress boundary for every
|
|
44
|
+
// The façade is the single egress boundary for every facade. Re-encoding here
|
|
45
45
|
// makes custom encoders run twice and makes REST disagree with the envelope.
|
|
46
46
|
data: result,
|
|
47
47
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HttpMethod } from '@fougere/http';
|
|
2
|
+
import type { EntityEntry } from './EntityEntry.js';
|
|
3
|
+
|
|
4
|
+
export interface GenerateRoutesOptions {
|
|
5
|
+
/** Base path prefix (e.g. '/api'). Default: ''. */
|
|
6
|
+
prefix?: string;
|
|
7
|
+
/** Override route config per entity. */
|
|
8
|
+
overrides?: Record<string, Record<string, { method?: HttpMethod; path?: string; status?: number }>>;
|
|
9
|
+
/** Filter entities. */
|
|
10
|
+
filter?: (entity: EntityEntry, frondName: string) => boolean;
|
|
11
|
+
/** Surface name for filtering (e.g. 'rest', 'graphql'). Uses frond.config.ts surfaces if set. */
|
|
12
|
+
surface?: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SchemaView } from '@fougere/schema';
|
|
2
|
+
|
|
3
|
+
export interface OperationMeta {
|
|
4
|
+
input?: SchemaView;
|
|
5
|
+
output?: SchemaView;
|
|
6
|
+
/** Canonical kind from core's EffectiveOperation. */
|
|
7
|
+
kind: 'query' | 'command';
|
|
8
|
+
/** The operation in words — see `RouteDefinition.description`. */
|
|
9
|
+
description?: string;
|
|
10
|
+
}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import type { Field, Fields, SchemaView } from '@fougere/schema';
|
|
1
|
+
import type { Fields, SchemaView } from '@fougere/schema';
|
|
3
2
|
import { Visibility } from '@fougere/schema';
|
|
4
|
-
import type { HandlerEntry as CoreHandlerEntry } from '@fougere/core';
|
|
5
|
-
|
|
6
|
-
// ─── Types ──────────────────────────────────────
|
|
7
|
-
|
|
8
|
-
// Le vocabulaire des verbes appartient au routeur, pas à la projection : le redéclarer ici
|
|
9
|
-
// avait produit deux listes à tenir d'accord à la main, qui ont divergé au premier verbe ajouté.
|
|
10
|
-
export type { HttpMethod } from '@fougere/http';
|
|
11
3
|
import type { HttpMethod } from '@fougere/http';
|
|
4
|
+
import type { HandlerEntry as CoreHandlerEntry } from '@fougere/core';
|
|
5
|
+
import type { EntityEntry } from './EntityEntry.js';
|
|
6
|
+
import type { OperationMeta } from './OperationMeta.js';
|
|
7
|
+
import type { GenerateRoutesOptions } from './GenerateRoutesOptions.js';
|
|
12
8
|
|
|
13
9
|
export interface RouteDefinition {
|
|
14
10
|
method: HttpMethod;
|
|
@@ -26,26 +22,10 @@ export interface RouteDefinition {
|
|
|
26
22
|
/** The operation in words — the method's own doc sentence, carried by the contract. */
|
|
27
23
|
description?: string;
|
|
28
24
|
// No presenter here. A route used to carry the instance and its field names so the
|
|
29
|
-
// registration could enrich each row; the façade does that for every
|
|
25
|
+
// registration could enrich each row; the façade does that for every facade now
|
|
30
26
|
// (`PresenterExecutor`), so the rows arrive computed and a second pass was duplicated work.
|
|
31
27
|
}
|
|
32
28
|
|
|
33
|
-
interface OperationMeta {
|
|
34
|
-
input?: SchemaView;
|
|
35
|
-
output?: SchemaView;
|
|
36
|
-
/** Canonical kind from core's EffectiveOperation. */
|
|
37
|
-
kind: 'query' | 'command';
|
|
38
|
-
/** The operation in words — see `RouteDefinition.description`. */
|
|
39
|
-
description?: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
interface EntityEntry {
|
|
43
|
-
name: string;
|
|
44
|
-
/** A live class in-process, a card from a frond whose class never crossed. */
|
|
45
|
-
entityClass: SchemaView;
|
|
46
|
-
exposed?: boolean;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
29
|
/** Only what this projection reads of a scanned handler — five fields of nine. */
|
|
50
30
|
type HandlerEntry = Pick<CoreHandlerEntry, 'address' | 'surface'> & {
|
|
51
31
|
/** `Crud(Post, PostPublic)` — the handler-wide output view, scoping every op. */
|
|
@@ -72,7 +52,7 @@ interface FrondLike {
|
|
|
72
52
|
handlers: HandlerEntry[];
|
|
73
53
|
presenters: PresenterEntry[];
|
|
74
54
|
surfaces?: Record<string, string[]>;
|
|
75
|
-
/** What `frond.config.ts` said per op — `rest:` is read here, `graphql:` next
|
|
55
|
+
/** What `frond.config.ts` said per op — `rest:` is read here, `graphql:` next facade. */
|
|
76
56
|
operationsOverrides?: Record<string, { rest?: { method?: string; path?: string; status?: number } }>;
|
|
77
57
|
}
|
|
78
58
|
|
|
@@ -88,7 +68,6 @@ type HandlerFacade = Record<string, Function>;
|
|
|
88
68
|
|
|
89
69
|
// ─── Naming conventions ─────────────────────────
|
|
90
70
|
|
|
91
|
-
|
|
92
71
|
function hasById(name: string): boolean {
|
|
93
72
|
return name.includes('ById') || name === 'findById' || name === 'update' || name === 'delete';
|
|
94
73
|
}
|
|
@@ -144,17 +123,6 @@ function derivePath(entityName: string, opName: string): string {
|
|
|
144
123
|
|
|
145
124
|
// ─── Public API ─────────────────────────────────
|
|
146
125
|
|
|
147
|
-
export interface GenerateRoutesOptions {
|
|
148
|
-
/** Base path prefix (e.g. '/api'). Default: ''. */
|
|
149
|
-
prefix?: string;
|
|
150
|
-
/** Override route config per entity. */
|
|
151
|
-
overrides?: Record<string, Record<string, { method?: HttpMethod; path?: string; status?: number }>>;
|
|
152
|
-
/** Filter entities. */
|
|
153
|
-
filter?: (entity: EntityEntry, frondName: string) => boolean;
|
|
154
|
-
/** Surface name for filtering (e.g. 'rest', 'graphql'). Uses frond.config.ts surfaces if set. */
|
|
155
|
-
surface?: string;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
126
|
/** Generate REST route definitions from a fougere App. */
|
|
159
127
|
export function generateRoutes(app: AppLike, options?: GenerateRoutesOptions): RouteDefinition[] {
|
|
160
128
|
const prefix = options?.prefix ?? '';
|
package/dist/routes.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/routes.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|