@fougere/app 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.
Files changed (92) hide show
  1. package/dist/CallInput.d.ts +4 -0
  2. package/dist/CallInput.d.ts.map +1 -0
  3. package/dist/CallInput.js +2 -0
  4. package/dist/CallInput.js.map +1 -0
  5. package/dist/Designation.d.ts +55 -0
  6. package/dist/Designation.d.ts.map +1 -0
  7. package/dist/{client.js → Designation.js} +30 -9
  8. package/dist/Designation.js.map +1 -0
  9. package/dist/DoorRequest.d.ts +11 -0
  10. package/dist/DoorRequest.d.ts.map +1 -0
  11. package/dist/DoorRequest.js +2 -0
  12. package/dist/DoorRequest.js.map +1 -0
  13. package/dist/EntityClass.d.ts +6 -0
  14. package/dist/EntityClass.d.ts.map +1 -0
  15. package/dist/EntityClass.js +2 -0
  16. package/dist/EntityClass.js.map +1 -0
  17. package/dist/Fetcher.d.ts +5 -0
  18. package/dist/Fetcher.d.ts.map +1 -0
  19. package/dist/Fetcher.js +2 -0
  20. package/dist/Fetcher.js.map +1 -0
  21. package/dist/FormEntity.d.ts +18 -0
  22. package/dist/FormEntity.d.ts.map +1 -0
  23. package/dist/{form.js → FormEntity.js} +1 -5
  24. package/dist/FormEntity.js.map +1 -0
  25. package/dist/FormField.d.ts +28 -0
  26. package/dist/FormField.d.ts.map +1 -0
  27. package/dist/FormField.js +2 -0
  28. package/dist/FormField.js.map +1 -0
  29. package/dist/Matchable.d.ts +10 -0
  30. package/dist/Matchable.d.ts.map +1 -0
  31. package/dist/Matchable.js +2 -0
  32. package/dist/Matchable.js.map +1 -0
  33. package/dist/{serve.d.ts → Outcome.d.ts} +4 -14
  34. package/dist/Outcome.d.ts.map +1 -0
  35. package/dist/{serve.js → Outcome.js} +4 -5
  36. package/dist/Outcome.js.map +1 -0
  37. package/dist/{rest.d.ts → RouteMatch.d.ts} +2 -10
  38. package/dist/RouteMatch.d.ts.map +1 -0
  39. package/dist/{rest.js → RouteMatch.js} +2 -3
  40. package/dist/RouteMatch.js.map +1 -0
  41. package/dist/TableColumn.d.ts +14 -0
  42. package/dist/TableColumn.d.ts.map +1 -0
  43. package/dist/TableColumn.js +2 -0
  44. package/dist/TableColumn.js.map +1 -0
  45. package/dist/boot.d.ts.map +1 -1
  46. package/dist/boot.js.map +1 -1
  47. package/dist/client/index.d.ts +10 -0
  48. package/dist/client/index.d.ts.map +1 -0
  49. package/dist/client/index.js +7 -0
  50. package/dist/client/index.js.map +1 -0
  51. package/dist/express.d.ts +2 -2
  52. package/dist/express.d.ts.map +1 -1
  53. package/dist/express.js +8 -8
  54. package/dist/express.js.map +1 -1
  55. package/dist/graphql.d.ts +3 -3
  56. package/dist/graphql.d.ts.map +1 -1
  57. package/dist/graphql.js +1 -1
  58. package/dist/graphql.js.map +1 -1
  59. package/dist/index.d.ts +5 -3
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -3
  62. package/dist/index.js.map +1 -1
  63. package/dist/web.js +1 -1
  64. package/dist/web.js.map +1 -1
  65. package/package.json +14 -14
  66. package/src/CallInput.ts +4 -0
  67. package/src/{client.ts → Designation.ts} +42 -22
  68. package/src/DoorRequest.ts +10 -0
  69. package/src/EntityClass.ts +14 -0
  70. package/src/Fetcher.ts +1 -0
  71. package/src/{form.ts → FormEntity.ts} +3 -47
  72. package/src/FormField.ts +27 -0
  73. package/src/Matchable.ts +9 -0
  74. package/src/{serve.ts → Outcome.ts} +6 -16
  75. package/src/{rest.ts → RouteMatch.ts} +2 -12
  76. package/src/TableColumn.ts +13 -0
  77. package/src/boot.ts +3 -6
  78. package/src/client/index.ts +43 -0
  79. package/src/express.ts +8 -8
  80. package/src/graphql.ts +4 -4
  81. package/src/index.ts +5 -17
  82. package/src/web.ts +1 -1
  83. package/dist/client.d.ts +0 -45
  84. package/dist/client.d.ts.map +0 -1
  85. package/dist/client.js.map +0 -1
  86. package/dist/form.d.ts +0 -56
  87. package/dist/form.d.ts.map +0 -1
  88. package/dist/form.js.map +0 -1
  89. package/dist/rest.d.ts.map +0 -1
  90. package/dist/rest.js.map +0 -1
  91. package/dist/serve.d.ts.map +0 -1
  92. package/dist/serve.js.map +0 -1
package/dist/express.js CHANGED
@@ -1,6 +1,6 @@
1
- /** The doors as Express middlewares — the form an Express app expects. */
1
+ /** The facades as Express middlewares — the form an Express app expects. */
2
2
  import { readExpressBody } from '@fougere/http';
3
- import { serveRest, serveRpc, rpcParseError } from './serve.js';
3
+ import { rpcParseError, serveRest, serveRpc } from './Outcome.js';
4
4
  import { serveGraphQL } from './graphql.js';
5
5
  import { sessionViewOf } from './session.js';
6
6
  import { useFougereApp } from './boot.js';
@@ -28,7 +28,7 @@ function fail(res, next, err) {
28
28
  }
29
29
  next(err);
30
30
  }
31
- /** The call envelope, at `/_fougere/call` — the door the browser primitives use. */
31
+ /** The call envelope, at `/_fougere/call` — the facade the browser primitives use. */
32
32
  export function call(mountPath = '/_fougere/call') {
33
33
  return (req, res, next) => {
34
34
  const path = pathOf(req);
@@ -112,19 +112,19 @@ export function graphql(mountPath = '/graphql') {
112
112
  })();
113
113
  };
114
114
  }
115
- /** Every door, for an app that wants all of them. What each one SERVES is still the
115
+ /** Every facade, 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 = [call(), session(), rest(), graphql()];
118
+ const facades = [call(), session(), rest(), graphql()];
119
119
  return (req, res, next) => {
120
120
  let index = 0;
121
121
  const step = (err) => {
122
122
  if (err)
123
123
  return next(err);
124
- const door = doors[index++];
125
- if (!door)
124
+ const facade = facades[index++];
125
+ if (!facade)
126
126
  return next();
127
- door(req, res, step);
127
+ facade(req, res, step);
128
128
  };
129
129
  step();
130
130
  };
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
package/dist/graphql.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- /** The GraphQL door — declared like the others, mounted like the others. */
1
+ /** The GraphQL facade — declared like the others, mounted like the others. */
2
2
  import type { App } from '@fougere/core';
3
- import type { Outcome } from './serve.js';
3
+ import type { Outcome } from './Outcome.js';
4
4
  /** What a GraphQL request carries, whatever host read it. */
5
5
  export interface GraphQLRequest {
6
6
  query?: string;
7
7
  variables?: Record<string, unknown>;
8
8
  operationName?: string;
9
- /** The audience, when the door was mounted per surface. */
9
+ /** The audience, when the facade was mounted per surface. */
10
10
  surface?: string;
11
11
  state: Record<string, unknown>;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAyBD,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBtF"}
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAyBD,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBtF"}
package/dist/graphql.js CHANGED
@@ -23,7 +23,7 @@ export async function serveGraphQL(app, request) {
23
23
  variables: request.variables,
24
24
  operationName: request.operationName,
25
25
  surface: request.surface,
26
- // The same state every other door stamps: what the server resolved, never the wire.
26
+ // The same state every other facade stamps: what the server resolved, never the wire.
27
27
  state: request.state,
28
28
  });
29
29
  // A GraphQL error is not an HTTP error: the transport succeeded, and the errors ride
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"AAsBA,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC/D,OAAO,SAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iFAAiF;YACjF,kFAAkF;YAClF,kFAAkF;YAClF,WAAW,EACX,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,OAAuB;IAClE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEpD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,oFAAoF;QACpF,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,qFAAqF;IACrF,2DAA2D;IAC3D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAiC,EAAE,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../src/graphql.ts"],"names":[],"mappings":"AAsBA,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QAC/D,OAAO,SAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,iFAAiF;YACjF,kFAAkF;YAClF,kFAAkF;YAClF,WAAW,EACX,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,OAAuB;IAClE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAEpD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,QAAQ,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,sFAAsF;QACtF,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,qFAAqF;IACrF,2DAA2D;IAC3D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAiC,EAAE,CAAC;AAC9E,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
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 } from './rest.js';
5
- export { serveRest, serveRpc, surfaceOf, rpcParseError, invokeOn, } from './serve.js';
6
- export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, type FormEntity, type FormField, type TableColumn, } from './form.js';
4
+ export { tableOf } from './RouteMatch.js';
5
+ export { invokeOn, rpcParseError, serveRest, serveRpc, surfaceOf } from './Outcome.js';
6
+ export { errorsByField, formFieldsOf, payloadOf, tableColumnsOf, type FormEntity } from './FormEntity.js';
7
+ export { type FormField } from './FormField.js';
8
+ export { type TableColumn } from './TableColumn.js';
7
9
  export { sessionViewOf, type SessionView } from './session.js';
8
10
  export { stateFor } from './state.js';
9
11
  export { serveGraphQL, type GraphQLRequest } from './graphql.js';
@@ -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,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"}
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,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,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,9 +1,9 @@
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 } from './rest.js';
5
- export { serveRest, serveRpc, surfaceOf, rpcParseError, invokeOn, } from './serve.js';
6
- export { formFieldsOf, tableColumnsOf, payloadOf, errorsByField, } from './form.js';
4
+ export { tableOf } from './RouteMatch.js';
5
+ export { invokeOn, rpcParseError, serveRest, serveRpc, surfaceOf } from './Outcome.js';
6
+ export { errorsByField, formFieldsOf, payloadOf, tableColumnsOf } from './FormEntity.js';
7
7
  export { sessionViewOf } from './session.js';
8
8
  export { stateFor } from './state.js';
9
9
  export { serveGraphQL } from './graphql.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,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"}
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,iBAAiB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAmB,MAAM,iBAAiB,CAAC;AAI1G,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.js CHANGED
@@ -1,4 +1,4 @@
1
- /** The three doors as Web-standard handlers: `Request` in, `Response` out. */
1
+ /** The three facades as Web-standard handlers: `Request` in, `Response` out. */
2
2
  import { serveRest, serveRpc, rpcParseError, useFougereApp, serveGraphQL } from './index.js';
3
3
  import { MAX_BODY_BYTES } from '@fougere/core';
4
4
  import { sessionViewOf } from './session.js';
package/dist/web.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
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.9.2-alpha.0",
3
+ "version": "0.10.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",
@@ -24,8 +24,8 @@
24
24
  "import": "./dist/index.js"
25
25
  },
26
26
  "./client": {
27
- "types": "./dist/client.d.ts",
28
- "import": "./dist/client.js"
27
+ "types": "./dist/client/index.d.ts",
28
+ "import": "./dist/client/index.js"
29
29
  },
30
30
  "./web": {
31
31
  "types": "./dist/web.d.ts",
@@ -42,25 +42,25 @@
42
42
  ],
43
43
  "dependencies": {
44
44
  "jiti": "^2.6.1",
45
- "@fougere/core": "0.9.2-alpha.0",
46
- "@fougere/defaults": "0.9.2-alpha.0",
47
- "@fougere/schema": "0.9.2-alpha.0",
48
- "@fougere/adapter-rest": "0.9.2-alpha.0",
49
- "@fougere/transport-http": "0.9.2-alpha.0",
50
- "@fougere/http": "0.9.2-alpha.0",
51
- "@fougere/container": "0.9.2-alpha.0",
52
- "@fougere/adapter-memory": "0.9.2-alpha.0",
53
- "@fougere/compiler": "0.9.2-alpha.0"
45
+ "@fougere/core": "0.10.0-alpha.0",
46
+ "@fougere/defaults": "0.10.0-alpha.0",
47
+ "@fougere/container": "0.10.0-alpha.0",
48
+ "@fougere/adapter-rest": "0.10.0-alpha.0",
49
+ "@fougere/http": "0.10.0-alpha.0",
50
+ "@fougere/transport-http": "0.10.0-alpha.0",
51
+ "@fougere/schema": "0.10.0-alpha.0",
52
+ "@fougere/adapter-memory": "0.10.0-alpha.0",
53
+ "@fougere/compiler": "0.10.0-alpha.0"
54
54
  },
55
55
  "devDependencies": {
56
56
  "vitest": "^4.1.0",
57
- "@fougere/adapter-graphql": "0.9.2-alpha.0"
57
+ "@fougere/adapter-graphql": "0.10.0-alpha.0"
58
58
  },
59
59
  "publishConfig": {
60
60
  "access": "public"
61
61
  },
62
62
  "peerDependencies": {
63
- "@fougere/adapter-graphql": "0.9.2-alpha.0"
63
+ "@fougere/adapter-graphql": "0.10.0-alpha.0"
64
64
  },
65
65
  "peerDependenciesMeta": {
66
66
  "@fougere/adapter-graphql": {
@@ -0,0 +1,4 @@
1
+ import { type InvocationContext } from '@fougere/core/contract';
2
+
3
+ /** What a page provides of an invocation — the rest is stamped server-side. */
4
+ export type CallInput = Partial<Pick<InvocationContext, 'params' | 'query' | 'input'>>;
@@ -1,26 +1,52 @@
1
- /**
2
- * The couple, minus the reactivity — everything `useQuery`/`useCommand` decide before a
3
- * framework's state primitives get involved.
4
- */
5
1
  import {
6
2
  FougereError,
7
3
  ErrorCode,
8
4
  lowerFirst,
9
5
  type InvocationContext,
10
6
  type FrondCall,
7
+ type FacadeName,
8
+ type Addresses,
9
+ type HandlerOf,
10
+ type AnyHandler,
11
11
  } from '@fougere/core/contract';
12
12
  import { frameCall, unframeResponse, type RpcResponse } from '@fougere/transport-http/client';
13
+ import type { EntityClass } from './EntityClass.js';
14
+ import type { CallInput } from './CallInput.js';
15
+ import type { Fetcher } from './Fetcher.js';
13
16
 
14
- /** An entity class is a designation: its name is the registration key. */
15
- export type EntityClass = { name: string };
17
+ /**
18
+ * One facade, built from its address alone — what a project that never generated `@fronds/facade`
19
+ * has, and what a test writes when it stands one up by hand.
20
+ *
21
+ * A page imports its facade instead, so a missing generated module fails to resolve rather than
22
+ * falling back to `string` in silence. A service writes no address at all: the container
23
+ * resolves `Facade<PostHandler>` from the type, and a browser has no container.
24
+ */
25
+ export function facade<Address extends Addresses>(address: Address): FacadeName<HandlerOf<Address>, Address> {
26
+ return { address };
27
+ }
16
28
 
17
- /** What a page provides of an invocation — the rest is stamped server-side. */
18
- export type CallInput = Partial<Pick<InvocationContext, 'params' | 'query' | 'input'>>;
29
+ /**
30
+ * The facade an ENTITY class names the one designation computed rather than written, because a
31
+ * form is handed a set of FIELDS and works out where it submits from them. Its operations are
32
+ * not known from a type, which is exactly what `AnyHandler` says.
33
+ */
34
+ export function facadeOf(entity: EntityClass): FacadeName<AnyHandler, string> {
35
+ return { address: entityKeyOf(entity) };
36
+ }
19
37
 
20
- /** The one door the browser knows. A named surface adds `/{surface}` to it. */
21
- export const CALL_ENDPOINT = '/_fougere/call';
38
+ /** Where a call goes: a named facade, an entity class that happens to name one, or the address. */
39
+ export function addressOf(designation: Designation): string {
40
+ if (typeof designation === 'string') return designation;
41
+
42
+ return 'address' in designation ? designation.address : entityKeyOf(designation);
43
+ }
44
+
45
+ /** The three ways a page designates one facade. */
46
+ export type Designation = FacadeName<unknown, string> | EntityClass | string;
22
47
 
23
- export type Fetcher = <T>(url: string, options: { method: 'POST'; body: unknown }) => Promise<T>;
48
+ /** The one facade the browser knows. A named surface adds `/{surface}` to it. */
49
+ export const CALL_ENDPOINT = '/_fougere/call';
24
50
 
25
51
  let nextId = 1;
26
52
 
@@ -29,8 +55,8 @@ export function entityKeyOf(entity: EntityClass): string {
29
55
  return lowerFirst(entity.name);
30
56
  }
31
57
 
32
- export function callOf(entity: EntityClass, op: string): FrondCall {
33
- return { entity: entityKeyOf(entity), op };
58
+ export function callOf(designation: Designation, op: string): FrondCall {
59
+ return { entity: addressOf(designation), op };
34
60
  }
35
61
 
36
62
  export function invocationOf(input?: CallInput): InvocationContext {
@@ -129,13 +155,7 @@ export function asFougereError(err: unknown, entityKey: string, op: string): Fou
129
155
  // The form contract is host-independent too, and a form is client code — so it
130
156
  // reaches the browser through this subpath rather than through the package root,
131
157
  // which carries the boot.
132
- export {
133
- formFieldsOf,
134
- tableColumnsOf,
135
- payloadOf,
136
- errorsByField,
137
- type FormEntity,
138
- type FormField,
139
- type TableColumn,
140
- } from './form.js';
158
+ export { errorsByField, formFieldsOf, payloadOf, tableColumnsOf, type FormEntity } from './FormEntity.js';
159
+ export { type FormField } from './FormField.js';
160
+ export { type TableColumn } from './TableColumn.js';
141
161
  export { sessionViewOf, type SessionView } from './session.js';
@@ -0,0 +1,10 @@
1
+ /** What a host must read off the request before any decision is possible. */
2
+ export interface DoorRequest {
3
+ method: string;
4
+ /** Path with no query string. The REST facade strips its own `/api` prefix. */
5
+ path: string;
6
+ query: Record<string, string>;
7
+ body?: unknown;
8
+ /** The server-resolved session. */
9
+ state: Record<string, unknown>;
10
+ }
@@ -0,0 +1,14 @@
1
+ /** An entity class is a designation: its name is the registration key. */
2
+ export type EntityClass = { name: string };
3
+
4
+ export type {
5
+ FougereOperations,
6
+ FacadeName,
7
+ Addresses,
8
+ AnyHandler,
9
+ HandlerOf,
10
+ Refused,
11
+ FougereHandlers,
12
+ Answer,
13
+ Rows,
14
+ } from '@fougere/core/contract';
package/src/Fetcher.ts ADDED
@@ -0,0 +1 @@
1
+ export type Fetcher = <T>(url: string, options: { method: 'POST'; body: unknown }) => Promise<T>;
@@ -1,10 +1,8 @@
1
1
  import { Lifecycle } from '@fougere/schema';
2
- /**
3
- * Form contract, pure part — derives what a create/edit form is made of from the entity's field
4
- * axes.
5
- */
6
2
  import { Shapes, lowerFirst, Role, Visibility } from '@fougere/schema';
7
- import type { Field, SchemaView, ShapeType, ValidationError, ValidationResult } from '@fougere/schema';
3
+ import type { Field, SchemaView, ShapeType, ValidationError } from '@fougere/schema';
4
+ import type { FormField } from './FormField.js';
5
+ import type { TableColumn } from './TableColumn.js';
8
6
 
9
7
  /** What an entity class exposes to a form — the schema statics it already has. */
10
8
  export type FormEntity = SchemaView;
@@ -14,34 +12,6 @@ function defaultOf(field: Field): unknown {
14
12
  return Lifecycle.of(field).literal?.value;
15
13
  }
16
14
 
17
- export interface FormField {
18
- name: string;
19
- /** Rendering hint derived from the shape — the page maps it to widgets. */
20
- control: 'text' | 'email' | 'url' | 'number' | 'boolean' | 'date' | 'select';
21
- required: boolean;
22
- /** i18n key by convention: `entity.field`. The schema never carries display text. */
23
- labelKey: string;
24
- /** Fallback label when no i18n message fills the key. */
25
- label: string;
26
- /** Enum values, when control is 'select'. */
27
- options?: string[];
28
- /**
29
- * What the browser enforces, under the names it already knows — spread this on the input and the
30
- * page states no rule of its own.
31
- */
32
- attrs?: {
33
- type?: 'text' | 'email' | 'url' | 'number';
34
- required?: boolean;
35
- minlength?: number;
36
- maxlength?: number;
37
- min?: number;
38
- max?: number;
39
- pattern?: string;
40
- };
41
- /** The value the field is born with — the literal its `lifecycle.create` rule names. */
42
- default?: unknown;
43
- }
44
-
45
15
  /** The base JSON type of a shape — unwraps the `[T,'null']` union. */
46
16
  function baseType(type: unknown): string {
47
17
  if (Array.isArray(type)) return (type.find((t) => t !== 'null') as string) ?? 'string';
@@ -131,20 +101,6 @@ export function formFieldsOf(entity: FormEntity, entityKey: string): FormField[]
131
101
  });
132
102
  }
133
103
 
134
- export interface TableColumn {
135
- name: string;
136
- /**
137
- * How to print the value — the dual of {@link FormField.control}, and deliberately not
138
- * the same list: a closed set prints as its value, a reference prints as a link.
139
- */
140
- render: 'text' | 'number' | 'boolean' | 'date' | 'json' | 'link';
141
- /** The same key a form uses for the same field — one convention, two projections. */
142
- labelKey: string;
143
- label: string;
144
- /** The entity a `link` points at, under the key its door is named by. */
145
- to?: string;
146
- }
147
-
148
104
  /** Asked of the relation before the shape: a reference's own shape is a bare string. */
149
105
  const RENDER_BY_TYPE: Record<ShapeType, TableColumn['render']> = {
150
106
  number: 'number',
@@ -0,0 +1,27 @@
1
+ export interface FormField {
2
+ name: string;
3
+ /** Rendering hint derived from the shape — the page maps it to widgets. */
4
+ control: 'text' | 'email' | 'url' | 'number' | 'boolean' | 'date' | 'select';
5
+ required: boolean;
6
+ /** i18n key by convention: `entity.field`. The schema never carries display text. */
7
+ labelKey: string;
8
+ /** Fallback label when no i18n message fills the key. */
9
+ label: string;
10
+ /** Enum values, when control is 'select'. */
11
+ options?: string[];
12
+ /**
13
+ * What the browser enforces, under the names it already knows — spread this on the input and the
14
+ * page states no rule of its own.
15
+ */
16
+ attrs?: {
17
+ type?: 'text' | 'email' | 'url' | 'number';
18
+ required?: boolean;
19
+ minlength?: number;
20
+ maxlength?: number;
21
+ min?: number;
22
+ max?: number;
23
+ pattern?: string;
24
+ };
25
+ /** The value the field is born with — the literal its `lifecycle.create` rule names. */
26
+ default?: unknown;
27
+ }
@@ -0,0 +1,9 @@
1
+ /** One row of the canonical table, in the form this facade matches against. */
2
+ export interface Matchable {
3
+ method: string;
4
+ /** `route.path` split once: a literal segment, or `:name` to capture. */
5
+ segments: string[];
6
+ path: string;
7
+ entityName: string;
8
+ operationName: string;
9
+ }
@@ -1,4 +1,3 @@
1
- /** The three doors, decided — and nothing about how a request arrives. */
2
1
  import {
3
2
  createAppRunner,
4
3
  callValueOf,
@@ -8,20 +7,10 @@ import {
8
7
  type InvocationContext,
9
8
  } from '@fougere/core';
10
9
  import { handleRpc, PARSE_ERROR } from '@fougere/transport-http';
11
- import { matchRoute, tableOf } from './rest.js';
12
-
13
- /** What a host must read off the request before any decision is possible. */
14
- export interface DoorRequest {
15
- method: string;
16
- /** Path with no query string. The REST door strips its own `/api` prefix. */
17
- path: string;
18
- query: Record<string, string>;
19
- body?: unknown;
20
- /** The server-resolved session. */
21
- state: Record<string, unknown>;
22
- }
10
+ import { matchRoute, tableOf } from './RouteMatch.js';
11
+ import type { DoorRequest } from './DoorRequest.js';
23
12
 
24
- /** What a host must write back. `pass` is the one that keeps a door additive. */
13
+ /** What a host must write back. `pass` is the one that keeps a facade additive. */
25
14
  export type Outcome =
26
15
  /** Not ours — the host's own routes must still reach their handler. */
27
16
  | { kind: 'pass' }
@@ -30,7 +19,7 @@ export type Outcome =
30
19
 
31
20
  // ── The call envelope ────────────────────────────
32
21
 
33
- /** The audience this door serves — the path segment after `/_fougere/call`. */
22
+ /** The audience this facade serves — the path segment after `/_fougere/call`. */
34
23
  export function surfaceOf(path: string): string | undefined {
35
24
  const named = /^\/_fougere\/call\/([A-Za-z0-9_-]+)/.exec(path.replace(/\?.*$/, ''));
36
25
  return named?.[1];
@@ -114,7 +103,7 @@ export function shapeRest(operationName: string, result: unknown): Outcome {
114
103
  };
115
104
  }
116
105
 
117
- // 200 on every verb, including POST — what the Nuxt door has always answered. A 201
106
+ // 200 on every verb, including POST — what the Nuxt facade has always answered. A 201
118
107
  // would be better REST and is a change of behaviour, so it belongs to `schema-rest`
119
108
  // (which owns what a verb means) and not to a refactor that moved this code.
120
109
  return { kind: 'ok', status: 200, body: result };
@@ -123,6 +112,7 @@ export function shapeRest(operationName: string, result: unknown): Outcome {
123
112
  // ── The server-side dual of the couple ───────────
124
113
 
125
114
  type EntityClass = { name: string };
115
+
126
116
  type CallInput = Partial<InvocationContext>;
127
117
 
128
118
  /**
@@ -1,16 +1,6 @@
1
- /** The REST table this app serves, and the rule that matches a request against it. */
2
1
  import { generateRoutes } from '@fougere/adapter-rest';
3
2
  import type { App } from '@fougere/core';
4
-
5
- /** One row of the canonical table, in the form this door matches against. */
6
- export interface Matchable {
7
- method: string;
8
- /** `route.path` split once: a literal segment, or `:name` to capture. */
9
- segments: string[];
10
- path: string;
11
- entityName: string;
12
- operationName: string;
13
- }
3
+ import type { Matchable } from './Matchable.js';
14
4
 
15
5
  export type RouteMatch =
16
6
  | { kind: 'match'; route: Matchable; params: Record<string, string> }
@@ -63,7 +53,7 @@ function openness(route: Matchable): number {
63
53
  return route.segments.filter((s) => s.startsWith(':')).length;
64
54
  }
65
55
 
66
- /** Verbs this door accepts in place of the one the table names. */
56
+ /** Verbs this facade accepts in place of the one the table names. */
67
57
  const ALIASES: Record<string, string> = { PATCH: 'PUT' };
68
58
 
69
59
  /** Path first, method second — a router's order, and what makes a 405 possible at all. */
@@ -0,0 +1,13 @@
1
+ export interface TableColumn {
2
+ name: string;
3
+ /**
4
+ * How to print the value — the dual of {@link FormField.control}, and deliberately not
5
+ * the same list: a closed set prints as its value, a reference prints as a link.
6
+ */
7
+ render: 'text' | 'number' | 'boolean' | 'date' | 'json' | 'link';
8
+ /** The same key a form uses for the same field — one convention, two projections. */
9
+ labelKey: string;
10
+ label: string;
11
+ /** The entity a `link` points at, under the key its facade is named by. */
12
+ to?: string;
13
+ }
package/src/boot.ts CHANGED
@@ -1,16 +1,13 @@
1
- import { Role } from '@fougere/schema';
2
- import { Lifecycle } from '@fougere/schema';
3
1
  /** Fougere server bootstrap — single entry point for an app's lifecycle, whatever hosts it. */
4
- import { applyConfig, createApp, identityFromEnv, Logger, migrating, seeding } from '@fougere/core';
2
+ import { applyConfig, createApp, identityFromEnv, Logger } from '@fougere/core';
5
3
  import { scanProject, frondAliases } from '@fougere/compiler';
6
4
  import { resolveConventions } from '@fougere/core';
7
5
  import { loadCascadedConfig, setModuleLoader } from '@fougere/core/node';
8
- import type { Extension } from '@fougere/core';
6
+
9
7
  import { createContainer } from '@fougere/container';
10
8
  import { createMemoryStorage } from '@fougere/adapter-memory';
11
- import type { App, CreateAppOptions, Storage, FougereConfig, Transport } from '@fougere/core';
9
+ import type { App, CreateAppOptions, FougereConfig, Transport } from '@fougere/core';
12
10
  import { layerOf, type ResolvedStorage } from '@fougere/defaults';
13
- import { applyCreate, applyUpdate, type SchemaView } from '@fougere/schema';
14
11
 
15
12
  // ── Public types ─────────────────────────────────
16
13