@aventara/core 1.0.0-rc.1 → 1.0.0-rc.10

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 (228) hide show
  1. package/CHANGELOG.md +943 -16
  2. package/ERRORS.md +142 -0
  3. package/README.md +274 -16
  4. package/dist/adapters/adapter-discovery-diagnostic.guidance.d.ts +6 -0
  5. package/dist/adapters/adapter-discovery-diagnostic.guidance.js +7 -0
  6. package/dist/adapters/adapter-field.d.ts +22 -0
  7. package/dist/adapters/adapter-identifier.d.ts +9 -0
  8. package/dist/adapters/adapter-identifier.js +6 -1
  9. package/dist/adapters/adapter-model.d.ts +9 -0
  10. package/dist/adapters/adapter-operation.d.ts +18 -3
  11. package/dist/adapters/adapter-resource.d.ts +5 -0
  12. package/dist/adapters/adapter.interface.d.ts +10 -0
  13. package/dist/avz/avz.d.ts +1 -1
  14. package/dist/avz/json-shape.registry.d.ts +2 -1
  15. package/dist/compiler/contract-compiler-diagnostic.guidance.d.ts +6 -0
  16. package/dist/compiler/contract-compiler-diagnostic.guidance.js +97 -0
  17. package/dist/compiler/contract.compiler.d.ts +6 -0
  18. package/dist/compiler/contract.compiler.js +227 -24
  19. package/dist/compiler/managed-elsewhere.projector.d.ts +52 -0
  20. package/dist/compiler/managed-elsewhere.projector.js +179 -0
  21. package/dist/compiler/managed-elsewhere.validator.d.ts +9 -0
  22. package/dist/compiler/managed-elsewhere.validator.js +74 -0
  23. package/dist/config/computed-fields.d.ts +62 -0
  24. package/dist/config/computed-fields.js +73 -0
  25. package/dist/config/config-diagnostic.guidance.d.ts +6 -0
  26. package/dist/config/config-diagnostic.guidance.js +32 -0
  27. package/dist/config/config.resolver.d.ts +24 -0
  28. package/dist/config/config.resolver.js +65 -0
  29. package/dist/config/config.validator.js +222 -8
  30. package/dist/config/define-resource.d.ts +1 -5
  31. package/dist/config/entrypoint.normalizer.d.ts +3 -2
  32. package/dist/config/exact-framework-config.d.ts +67 -22
  33. package/dist/config/field-compute.resolver.d.ts +2 -0
  34. package/dist/config/field-compute.resolver.js +8 -0
  35. package/dist/config/framework-config.d.ts +53 -15
  36. package/dist/config/framework-resources-config.d.ts +25 -14
  37. package/dist/config/pipeline-config.d.ts +4 -4
  38. package/dist/config/pipeline-tree.resolver.d.ts +2 -2
  39. package/dist/contracts/access-route.rules.d.ts +10 -0
  40. package/dist/contracts/access-route.rules.js +45 -0
  41. package/dist/contracts/capability.d.ts +26 -1
  42. package/dist/contracts/capability.js +20 -0
  43. package/dist/contracts/client-contract-structure.validator.d.ts +301 -89
  44. package/dist/contracts/client-contract-structure.validator.js +37 -2
  45. package/dist/contracts/contract-access.d.ts +29 -0
  46. package/dist/contracts/contract-access.js +1 -0
  47. package/dist/contracts/contract-canonicalizer.d.ts +9 -1
  48. package/dist/contracts/contract-canonicalizer.js +30 -4
  49. package/dist/contracts/contract-hash.d.ts +0 -1
  50. package/dist/contracts/contract-hash.js +1 -1
  51. package/dist/contracts/contract.d.ts +27 -1
  52. package/dist/contracts/field.d.ts +58 -1
  53. package/dist/contracts/json-schema.projector.d.ts +11 -0
  54. package/dist/contracts/json-schema.projector.js +78 -0
  55. package/dist/contracts/scalar-value-type.d.ts +3 -1
  56. package/dist/framework/access-facade.d.ts +116 -0
  57. package/dist/framework/access-facade.js +120 -0
  58. package/dist/framework/contract-view.d.ts +120 -16
  59. package/dist/framework/framework-construction.error.d.ts +14 -4
  60. package/dist/framework/framework-construction.error.js +18 -2
  61. package/dist/framework/framework.d.ts +26 -5
  62. package/dist/framework/framework.factory.d.ts +1 -1
  63. package/dist/framework/framework.factory.js +115 -23
  64. package/dist/framework/operation-facade.d.ts +80 -13
  65. package/dist/framework/operation-facade.js +2 -1
  66. package/dist/index.d.ts +17 -5
  67. package/dist/index.js +1 -0
  68. package/dist/internal.d.ts +7 -2
  69. package/dist/internal.js +6 -0
  70. package/dist/operations/database-refusal.d.ts +51 -0
  71. package/dist/operations/database-refusal.js +45 -0
  72. package/dist/operations/operation-arguments.d.ts +148 -60
  73. package/dist/operations/operation-call.d.ts +9 -5
  74. package/dist/operations/operation-result.d.ts +6 -4
  75. package/dist/operations/operation-validator-core.js +159 -36
  76. package/dist/operations/operation-validator.d.ts +1 -1
  77. package/dist/operations/structural-limits.walker.d.ts +1 -1
  78. package/dist/operations/validation-code.guidance.d.ts +6 -0
  79. package/dist/operations/validation-code.guidance.js +90 -0
  80. package/dist/operations/write-scope.resolver.d.ts +4 -0
  81. package/dist/operations/write-scope.resolver.js +2 -0
  82. package/dist/policy/access-provider.interface.d.ts +91 -0
  83. package/dist/policy/access-provider.interface.js +1 -0
  84. package/dist/policy/access-provider.registry.d.ts +17 -0
  85. package/dist/policy/access-provider.registry.js +15 -0
  86. package/dist/policy/access-question.d.ts +20 -0
  87. package/dist/policy/access-question.js +1 -0
  88. package/dist/policy/access-question.registry.d.ts +5 -0
  89. package/dist/policy/access-question.registry.js +19 -0
  90. package/dist/policy/access-question.runtime.d.ts +36 -0
  91. package/dist/policy/access-question.runtime.js +297 -0
  92. package/dist/policy/access-verb.table.d.ts +56 -0
  93. package/dist/policy/access-verb.table.js +21 -0
  94. package/dist/policy/access-verbs.d.ts +46 -0
  95. package/dist/policy/access-verbs.js +1 -0
  96. package/dist/policy/policy-admission.d.ts +20 -0
  97. package/dist/policy/policy-admission.js +409 -0
  98. package/dist/policy/policy-after-update.runtime.d.ts +79 -0
  99. package/dist/policy/policy-after-update.runtime.js +208 -0
  100. package/dist/policy/policy-condition.d.ts +15 -0
  101. package/dist/policy/policy-condition.js +36 -0
  102. package/dist/policy/policy-engine.d.ts +205 -0
  103. package/dist/policy/policy-engine.js +1 -0
  104. package/dist/policy/policy-named-rows.d.ts +18 -0
  105. package/dist/policy/policy-named-rows.js +51 -0
  106. package/dist/policy/policy-nested-write.runtime.d.ts +44 -0
  107. package/dist/policy/policy-nested-write.runtime.js +545 -0
  108. package/dist/policy/policy-read.runtime.d.ts +81 -0
  109. package/dist/policy/policy-read.runtime.js +503 -0
  110. package/dist/policy/policy-reference-write.runtime.d.ts +51 -0
  111. package/dist/policy/policy-reference-write.runtime.js +345 -0
  112. package/dist/policy/policy-request.d.ts +41 -0
  113. package/dist/policy/policy-request.js +63 -0
  114. package/dist/policy/policy-session.d.ts +106 -0
  115. package/dist/policy/policy-session.js +295 -0
  116. package/dist/policy/policy-startup.validator.d.ts +10 -0
  117. package/dist/policy/policy-startup.validator.js +112 -0
  118. package/dist/policy/policy-write.runtime.d.ts +39 -0
  119. package/dist/policy/policy-write.runtime.js +532 -0
  120. package/dist/prebuilt/core-version.generated.d.ts +2 -0
  121. package/dist/prebuilt/core-version.generated.js +1 -0
  122. package/dist/prebuilt/prebuilt-changes.d.ts +29 -0
  123. package/dist/prebuilt/prebuilt-changes.js +65 -0
  124. package/dist/prebuilt/prebuilt-contracts.d.ts +40 -0
  125. package/dist/prebuilt/prebuilt-contracts.emitter.d.ts +16 -0
  126. package/dist/prebuilt/prebuilt-contracts.emitter.js +50 -0
  127. package/dist/prebuilt/prebuilt-contracts.js +1 -0
  128. package/dist/prebuilt/prebuilt-contracts.loader.d.ts +19 -0
  129. package/dist/prebuilt/prebuilt-contracts.loader.js +77 -0
  130. package/dist/prebuilt/prebuilt-inputs.fingerprint.d.ts +16 -0
  131. package/dist/prebuilt/prebuilt-inputs.fingerprint.js +229 -0
  132. package/dist/protocol/absent-route.responder.d.ts +9 -27
  133. package/dist/protocol/absent-route.responder.js +36 -3
  134. package/dist/protocol/contract-document.responder.d.ts +2 -1
  135. package/dist/protocol/http-request.decoder.d.ts +19 -3
  136. package/dist/protocol/http-request.decoder.js +24 -1
  137. package/dist/protocol/http-request.reader.d.ts +6 -3
  138. package/dist/protocol/http-request.reader.js +1 -0
  139. package/dist/protocol/http-response.encoder.js +2 -2
  140. package/dist/protocol/protocol-headers.d.ts +3 -3
  141. package/dist/protocol/protocol-surface.d.ts +6 -1
  142. package/dist/protocol/protocol-surface.js +7 -0
  143. package/dist/protocol/protocol.binder.d.ts +16 -1
  144. package/dist/protocol/protocol.binder.js +4 -1
  145. package/dist/protocol/protocol.handler.d.ts +12 -1
  146. package/dist/protocol/protocol.handler.js +86 -17
  147. package/dist/runtime/caller-data.copier.d.ts +18 -3
  148. package/dist/runtime/caller-data.copier.js +21 -8
  149. package/dist/runtime/caller-data.door.d.ts +13 -6
  150. package/dist/runtime/computed-read-runtime.d.ts +6 -1
  151. package/dist/runtime/computed-read-runtime.js +232 -45
  152. package/dist/runtime/computed-value.error.d.ts +3 -2
  153. package/dist/runtime/computed-value.error.js +3 -2
  154. package/dist/runtime/context-executor.runtime.d.ts +4 -3
  155. package/dist/runtime/context-executor.runtime.js +4 -2
  156. package/dist/runtime/core-class.brand.d.ts +10 -0
  157. package/dist/runtime/core-class.brand.js +21 -0
  158. package/dist/runtime/create-requirement.d.ts +31 -5
  159. package/dist/runtime/create-requirement.js +129 -21
  160. package/dist/runtime/decimal.d.ts +14 -0
  161. package/dist/runtime/decimal.js +21 -0
  162. package/dist/runtime/diagnostics-reporter.d.ts +44 -9
  163. package/dist/runtime/diagnostics-reporter.js +13 -1
  164. package/dist/runtime/error-boundary.d.ts +9 -2
  165. package/dist/runtime/error-boundary.js +12 -0
  166. package/dist/runtime/error-guidance.d.ts +12 -0
  167. package/dist/runtime/error-guidance.js +1 -0
  168. package/dist/runtime/error.catalog.d.ts +49 -0
  169. package/dist/runtime/error.catalog.js +49 -0
  170. package/dist/runtime/execution-options.d.ts +8 -0
  171. package/dist/runtime/field-check.evaluator.d.ts +0 -2
  172. package/dist/runtime/field-check.evaluator.js +1 -1
  173. package/dist/runtime/field-compute.d.ts +11 -10
  174. package/dist/runtime/field-stage.runtime.d.ts +3 -1
  175. package/dist/runtime/field-stage.runtime.js +8 -4
  176. package/dist/runtime/field-validator.runtime.d.ts +19 -1
  177. package/dist/runtime/field-validator.runtime.js +47 -8
  178. package/dist/runtime/framework-error.js +9 -0
  179. package/dist/runtime/framework-warning.emitter.d.ts +6 -0
  180. package/dist/runtime/framework-warning.emitter.js +8 -0
  181. package/dist/runtime/json-value.d.ts +10 -5
  182. package/dist/runtime/level-lifecycle.runtime.d.ts +4 -3
  183. package/dist/runtime/level-lifecycle.runtime.js +3 -5
  184. package/dist/runtime/mutation-planner.d.ts +1 -6
  185. package/dist/runtime/mutation-planner.js +3 -14
  186. package/dist/runtime/operation-code.guidance.d.ts +6 -0
  187. package/dist/runtime/operation-code.guidance.js +167 -0
  188. package/dist/runtime/operation-request.d.ts +16 -9
  189. package/dist/runtime/operation-runtime.d.ts +35 -17
  190. package/dist/runtime/operation-runtime.js +220 -49
  191. package/dist/runtime/outcome-mapper.d.ts +2 -1
  192. package/dist/runtime/output-validator.d.ts +1 -1
  193. package/dist/runtime/owned-execution.registry.d.ts +13 -3
  194. package/dist/runtime/pipe-output.validator.d.ts +10 -0
  195. package/dist/runtime/pipe-output.validator.js +4 -2
  196. package/dist/runtime/pipeline.d.ts +47 -22
  197. package/dist/runtime/readonly-value.d.ts +20 -5
  198. package/dist/runtime/readonly-value.js +74 -26
  199. package/dist/runtime/referential-action.d.ts +1 -1
  200. package/dist/runtime/scalar-runtime.d.ts +4 -11
  201. package/dist/runtime/scalar-runtime.js +91 -22
  202. package/dist/runtime/unsent-value.normalizer.d.ts +15 -0
  203. package/dist/runtime/unsent-value.normalizer.js +128 -0
  204. package/dist/transactions/operation-arguments-encoder.js +8 -3
  205. package/dist/transactions/operation-fingerprint.js +2 -2
  206. package/dist/transactions/sql-statement.d.ts +10 -2
  207. package/dist/transactions/sql-statement.validator.d.ts +2 -2
  208. package/dist/transactions/sql-statement.validator.js +38 -5
  209. package/dist/transactions/transaction-envelope.d.ts +5 -4
  210. package/dist/transactions/transaction-integrity-error.js +2 -0
  211. package/dist/transactions/transaction-plan-assembler.d.ts +12 -5
  212. package/dist/transactions/transaction-plan-assembler.js +48 -10
  213. package/dist/transactions/transaction-plan-validator.d.ts +23 -7
  214. package/dist/transactions/transaction-plan-validator.js +27 -1
  215. package/dist/transactions/transaction-reference-resolver.d.ts +3 -2
  216. package/dist/transactions/transaction-reference-validator.d.ts +43 -3
  217. package/dist/transactions/transaction-reference-validator.js +83 -57
  218. package/dist/transactions/transaction-reference.d.ts +1 -1
  219. package/dist/transactions/transaction-reference.js +5 -0
  220. package/dist/transactions/transaction-request.d.ts +8 -8
  221. package/dist/transactions/transaction-runtime.d.ts +5 -2
  222. package/dist/transactions/transaction-runtime.js +79 -27
  223. package/dist/transactions/transaction-settlement.runtime.d.ts +4 -3
  224. package/dist/transactions/transaction-slot-path-error.js +2 -0
  225. package/dist/transactions/transaction-stage.runtime.d.ts +5 -3
  226. package/dist/transactions/transaction-stage.runtime.js +7 -4
  227. package/package.json +6 -5
  228. package/src/runtime/field-check.evaluator.ts +1 -1
@@ -2,8 +2,10 @@ import type { AvAdapterModel } from "../adapters/adapter-model.js";
2
2
  import type { AvAdapterFieldKey } from "../adapters/adapter-resource.js";
3
3
  import type { AvZCheck } from "../avz/avz-check.registry.js";
4
4
  import type { AvOperationFamily } from "../operations/operation-identity.js";
5
- import type { AvStageArguments } from "../runtime/pipeline.js";
5
+ import type { AvPreComputeStageArguments, AvStageArguments } from "../runtime/pipeline.js";
6
6
  import type { AvConfigAny } from "./any-framework-config.js";
7
+ import type { AvPreComputeLift } from "./computed-fields.js";
8
+ import type { AvConfigLayerName } from "./config-layer.js";
7
9
  import type { AvEffectiveFieldKey } from "./effective-fields.js";
8
10
  import type { AvRelationFieldPipeline, AvScalarFieldPipeline } from "./field-pipeline-config.js";
9
11
  import type { AvConfigAddedFieldDefinition, AvConfigFieldDefinition, AvConfigKnownFieldDefinition, AvConfigResourceKey } from "./framework-field-definition.js";
@@ -14,29 +16,29 @@ import type { AvPipeline, AvTransactionPipeline } from "./pipeline-config.js";
14
16
  */
15
17
  export type AvConfigLayerKind = "root" | "overlay";
16
18
  /** One operation variant's level: its stages and `forceTransaction`. */
17
- export type AvConfigVariant<M extends AvAdapterModel = AvAdapterModel, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily, V extends string = string, A = NoInfer<AvStageArguments<M, R, F, V>>> = {
19
+ export type AvConfigVariant<M extends AvAdapterModel = AvAdapterModel, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily, V extends string = string, A = NoInfer<AvStageArguments<M, R, F, V>>, PreCompute = NoInfer<AvPreComputeStageArguments<M, R, F, V>>> = {
18
20
  /**
19
21
  * Stages that run for this one operation: at a variant, `ctx.$args` (and a
20
- * pipe's arguments) are typed as the operation's arguments.
22
+ * pipe's arguments) are typed as the operation's arguments; in a guard, a
23
+ * pipe or a filter a create may lack the fields `compute.create` fills
24
+ * (write compute runs after them).
21
25
  */
22
- readonly pipelines?: AvPipeline<NoInfer<M>, R, F, V, A>;
26
+ readonly pipelines?: AvPipeline<NoInfer<M>, R, F, V, A, PreCompute>;
23
27
  /** Runs a plain call of this operation as a one-step transaction. */
24
28
  readonly forceTransaction?: boolean;
25
29
  };
26
- /** The variants a family's stages are told: its own, and `"one"` for a nested target. */
27
- type FamilyStageVariant<F extends AvOperationFamily, V extends string> = F extends "create" | "update" | "delete" ? V | "one" : V;
28
30
  /**
29
31
  * One operation family's level: stages and `forceTransaction` for every variant
30
32
  * of it, and each variant's own level by name.
31
33
  */
32
34
  export type AvConfigFamily<M extends AvAdapterModel = AvAdapterModel, Variants = {
33
35
  readonly [V in "first" | "unique" | "many" | "count" | "one"]?: unknown;
34
- }, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily> = AvConfigVariant<M, R, F, FamilyStageVariant<F, Extract<keyof NonNullable<Variants>, string>>, unknown> & {
35
- readonly [V in Extract<keyof NonNullable<Variants>, string>]?: AvConfigVariant<M, R, F, V> | undefined;
36
+ }, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily, Layer extends AvConfigLayerName = "root"> = AvConfigVariant<M, R, F, F extends "create" | "update" | "delete" ? Extract<keyof NonNullable<Variants>, string> | "one" : Extract<keyof NonNullable<Variants>, string>, unknown, unknown> & {
37
+ readonly [V in Extract<keyof NonNullable<Variants>, string>]?: AvConfigVariant<M, R, F, V, NoInfer<AvStageArguments<M, R, F, V>>, NoInfer<AvPreComputeStageArguments<M, R, F, V, AvPreComputeLift<M, Layer>>>> | undefined;
36
38
  };
37
39
  /** A Resource's families, as the adapter model offers them, each with its level. */
38
- export type AvConfigOperations<M extends AvAdapterModel = AvAdapterModel, R extends AvConfigResourceKey<M> = AvConfigResourceKey<M>> = {
39
- readonly [F in Extract<keyof M["resources"][R]["operations"], AvOperationFamily>]?: AvConfigFamily<M, M["resources"][R]["operations"][F], R, F>;
40
+ export type AvConfigOperations<M extends AvAdapterModel = AvAdapterModel, R extends AvConfigResourceKey<M> = AvConfigResourceKey<M>, Layer extends AvConfigLayerName = "root"> = {
41
+ readonly [F in Extract<keyof M["resources"][R]["operations"], AvOperationFamily>]?: AvConfigFamily<M, M["resources"][R]["operations"][F], R, F, Layer>;
40
42
  };
41
43
  /** A Resource's transaction level. */
42
44
  export type AvConfigResourceTransactions<M extends AvAdapterModel = AvAdapterModel> = {
@@ -99,18 +101,27 @@ export type AvConfigResourceFields<in out M extends AvAdapterModel = AvAdapterMo
99
101
  readonly [F in AvEffectiveFieldKey<M, Cfg, R>]?: Kind extends "root" ? RootFieldConfigFor<M, Cfg, R, F> : OverlayFieldConfigFor<M, Cfg, R, F>;
100
102
  };
101
103
  /** One Resource's tree: its stages, operations, transactions and fields. */
102
- export type AvConfigResource<in out M extends AvAdapterModel = AvAdapterModel, in out Cfg = AvConfigAny, in out R extends AvConfigResourceKey<M> = AvConfigResourceKey<M>, Kind extends AvConfigLayerKind = "root"> = {
104
+ export type AvConfigResource<in out M extends AvAdapterModel = AvAdapterModel, in out Cfg = AvConfigAny, in out R extends AvConfigResourceKey<M> = AvConfigResourceKey<M>, Kind extends AvConfigLayerKind = "root", Layer extends AvConfigLayerName = LayerOfKind<Kind>> = {
103
105
  /** Stages that run for every operation of this Resource. */
104
106
  readonly pipelines?: AvPipeline<NoInfer<M>, R>;
105
107
  /** Per family, and per variant under its family. */
106
- readonly operations?: AvConfigOperations<M, R>;
108
+ readonly operations?: AvConfigOperations<M, R, Layer>;
107
109
  /** Stages that run once per transaction with a top-level step on this Resource. */
108
110
  readonly transactions?: AvConfigResourceTransactions<M>;
109
111
  /** Per field: its definition (root only) and its stages. */
110
112
  readonly fields?: AvConfigResourceFields<M, Cfg, R, Kind>;
113
+ /**
114
+ * `true`: another service owns this Resource's table and migrates it. It is
115
+ * read and joined, never written: it has no write operation, no nested write
116
+ * reaches its rows, and the client and agent Contracts leave it out, with
117
+ * every relation to it. Root only.
118
+ */
119
+ readonly managedElsewhere?: Kind extends "root" ? boolean : never;
111
120
  };
112
121
  /** The `resources` tree of one layer, keyed by the adapter's Resource names. */
113
- export type AvConfigResources<in out M extends AvAdapterModel = AvAdapterModel, in out Cfg = AvConfigAny, in out Kind extends AvConfigLayerKind = "root"> = {
114
- readonly [R in AvConfigResourceKey<M>]?: AvConfigResource<M, Cfg, R, Kind>;
122
+ export type AvConfigResources<in out M extends AvAdapterModel = AvAdapterModel, in out Cfg = AvConfigAny, in out Kind extends AvConfigLayerKind = "root", in out Layer extends AvConfigLayerName = LayerOfKind<Kind>> = {
123
+ readonly [R in AvConfigResourceKey<M>]?: AvConfigResource<M, Cfg, R, Kind, Layer>;
115
124
  };
125
+ /** The layers a tree of kind `Kind` may be written in, when it names none. */
126
+ export type LayerOfKind<Kind extends AvConfigLayerKind> = Kind extends "root" ? "root" : Exclude<AvConfigLayerName, "root">;
116
127
  export {};
@@ -6,11 +6,11 @@ import type { AvConfigResourceKey } from "./framework-field-definition.js";
6
6
  * Pipeline registrations for one level of the configuration: a layer, a
7
7
  * Resource, a family or a variant. See {@link AvContext}.
8
8
  */
9
- export type AvPipeline<M extends AvAdapterModel = AvAdapterModel, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily, V extends string = string, A = unknown> = {
9
+ export type AvPipeline<M extends AvAdapterModel = AvAdapterModel, R extends string = AvConfigResourceKey<M>, F extends AvOperationFamily = AvOperationFamily, V extends string = string, A = unknown, PreCompute = A> = {
10
10
  /** Run first; a guard returning `false` denies the operation with `A4001`. */
11
- readonly guards?: readonly AvGuard<M, R, F, V, A>[];
11
+ readonly guards?: readonly AvGuard<M, R, F, V, PreCompute>[];
12
12
  /** Run in order on the arguments; a pipe may return replacement arguments. */
13
- readonly pipes?: readonly AvPipe<M, R, F, V, A>[];
13
+ readonly pipes?: readonly AvPipe<M, R, F, V, PreCompute>[];
14
14
  /**
15
15
  * Run around the operation, inside every level's interceptors: `before`
16
16
  * hooks outer to inner, `after` hooks inner to outer.
@@ -22,7 +22,7 @@ export type AvPipeline<M extends AvAdapterModel = AvAdapterModel, R extends stri
22
22
  /** Wrap everything below this level; each calls `next()` to continue. */
23
23
  readonly interceptors?: readonly AvInterceptor<M, R, F, V, A>[];
24
24
  /** Turn a thrown error into a {@link AvError} outcome. */
25
- readonly filters?: readonly AvFilter<M, R, F, V, A>[];
25
+ readonly filters?: readonly AvFilter<M, R, F, V, PreCompute>[];
26
26
  };
27
27
  /**
28
28
  * A Resource's transaction stages: they run once per transaction with a
@@ -2,12 +2,12 @@ import type { AvOperationIdentity } from "../operations/operation-identity.js";
2
2
  import type { AvFieldGuard, AvFieldPipe } from "../runtime/pipeline.js";
3
3
  import type { ResolvedPipelineConfig, ResolvedTransactionPipelineConfig } from "./pipeline-config.js";
4
4
  /** One variant's levels and whether a layer forces it. */
5
- export type ResolvedVariantPipelines = {
5
+ type ResolvedVariantPipelines = {
6
6
  readonly pipelines: readonly ResolvedPipelineConfig[];
7
7
  readonly forceTransaction: boolean;
8
8
  };
9
9
  /** One family's levels, its variants' and whether a layer forces the family. */
10
- export type ResolvedFamilyPipelines = ResolvedVariantPipelines & {
10
+ type ResolvedFamilyPipelines = ResolvedVariantPipelines & {
11
11
  readonly variants: Readonly<Record<string, ResolvedVariantPipelines>>;
12
12
  };
13
13
  /** One field's stages for one origin: the root's, then the overlay's. */
@@ -0,0 +1,10 @@
1
+ /**
2
+ * An absolute `http:`/`https:` URL, or a root-relative path other than `"/"`:
3
+ * never `//host`, a backslash, a control character, a space or a dot segment.
4
+ */
5
+ export declare function isAccessUrl(value: unknown): value is string;
6
+ /**
7
+ * A verb's path under the section's `url`: starting with one `/`, never a
8
+ * backslash, a control character, a space or a dot segment.
9
+ */
10
+ export declare function isAccessPath(value: unknown): value is string;
@@ -0,0 +1,45 @@
1
+ function hasControlOrSpace(value) {
2
+ for (let index = 0; index < value.length; index += 1) {
3
+ const code = value.charCodeAt(index);
4
+ if (code <= 0x20 || code === 0x7f) {
5
+ return true;
6
+ }
7
+ }
8
+ return false;
9
+ }
10
+ const DOT_SEGMENT = /^(?:\.|%2e){1,2}$/i;
11
+ function hasDotSegment(path) {
12
+ const end = path.search(/[?#]/);
13
+ return (end === -1 ? path : path.slice(0, end))
14
+ .split("/")
15
+ .some((segment) => DOT_SEGMENT.test(segment));
16
+ }
17
+ export function isAccessUrl(value) {
18
+ if (typeof value !== "string" ||
19
+ value.includes("\\") ||
20
+ hasControlOrSpace(value)) {
21
+ return false;
22
+ }
23
+ if (value.startsWith("/")) {
24
+ return value !== "/" && !value.startsWith("//") && !hasDotSegment(value);
25
+ }
26
+ const authority = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*/i.exec(value)?.[0];
27
+ if (authority === undefined || hasDotSegment(value.slice(authority.length))) {
28
+ return false;
29
+ }
30
+ try {
31
+ const { protocol } = new URL(value);
32
+ return protocol === "https:" || protocol === "http:";
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ export function isAccessPath(value) {
39
+ return (typeof value === "string" &&
40
+ value.startsWith("/") &&
41
+ !value.startsWith("//") &&
42
+ !value.includes("\\") &&
43
+ !hasControlOrSpace(value) &&
44
+ !hasDotSegment(value));
45
+ }
@@ -1,11 +1,36 @@
1
1
  /** The operators a scalar field can be filtered with. */
2
2
  export type AvScalarFilterOperator = "equals" | "not" | "in" | "notIn" | "lt" | "lte" | "gt" | "gte" | "contains" | "startsWith" | "endsWith" | "mode" | "has" | "hasEvery" | "hasSome" | "isEmpty" | "path" | "stringContains" | "stringStartsWith" | "stringEndsWith" | "arrayContains" | "arrayStartsWith" | "arrayEndsWith";
3
+ /**
4
+ * The case-sensitivity a text filter's `mode` asks for. `"default"` is whatever
5
+ * the database's own comparison does and is always available; `"sensitive"` and
6
+ * `"insensitive"` are an explicit promise, available on a field only where its
7
+ * `filterModes` lists them.
8
+ */
9
+ export declare const FILTER_MODES: readonly ["default", "sensitive", "insensitive"];
10
+ /** @see FILTER_MODES, the axis this union is derived from. */
11
+ export type ScalarFilterMode = (typeof FILTER_MODES)[number];
3
12
  /** What an update can do to a scalar value besides setting it. */
4
13
  export type AvScalarMutationDirective = "$increment" | "$decrement" | "$multiply" | "$divide" | "$push" | "$unset";
5
14
  /** How a relation can be filtered on. */
6
15
  export type AvRelationFilterCapability = "nested" | "match" | "null" | "some" | "every" | "none";
7
16
  /** What a write can do to a relation: `$create`, `$connect` and the rest. */
8
17
  export type AvRelationMutationDirective = "$create" | "$connect" | "$connectOrCreate" | "$disconnect" | "$set" | "$update" | "$delete" | "$upsert";
18
+ /** The to-one directives that change which row the relation links. */
19
+ export declare const TO_ONE_RELINK_DIRECTIVES: readonly ["$connect", "$connectOrCreate", "$create", "$set", "$disconnect"];
20
+ /** The to-one directives that write the row the relation links. */
21
+ export declare const TO_ONE_REWRITE_DIRECTIVES: readonly ["$update", "$upsert"];
22
+ /** @see TO_ONE_RELINK_DIRECTIVES */
23
+ export type ToOneRelinkDirective = (typeof TO_ONE_RELINK_DIRECTIVES)[number];
24
+ /** @see TO_ONE_REWRITE_DIRECTIVES */
25
+ export type ToOneRewriteDirective = (typeof TO_ONE_REWRITE_DIRECTIVES)[number];
26
+ /**
27
+ * A to-one operand's directives that both relink the relation and write the
28
+ * linked row, or `undefined` when it does not pair them.
29
+ */
30
+ export declare function toOneRelinkWithRewrite(operand: Readonly<Record<string, unknown>>): {
31
+ readonly rewrite: readonly ToOneRewriteDirective[];
32
+ readonly relink: readonly ToOneRelinkDirective[];
33
+ } | undefined;
9
34
  /** How a list of related rows can be paginated. */
10
35
  export type AvPaginationCapability = "limit" | "offset" | "cursor";
11
36
  /** What a projection can compute over a to-many relation. */
@@ -24,6 +49,6 @@ export type AvProjectionScope = (typeof PROJECTION_SCOPES)[number];
24
49
  * not the operation that carries it. The write counterpart of
25
50
  * {@link AvProjectionScope}.
26
51
  */
27
- export declare const WRITE_SCOPES: readonly ["nested", "bulkWrite"];
52
+ export declare const WRITE_SCOPES: readonly ["nested", "bulkWrite", "loopback"];
28
53
  /** @see WRITE_SCOPES, the axis this union is derived from. */
29
54
  export type AvWriteScope = (typeof WRITE_SCOPES)[number];
@@ -1,3 +1,22 @@
1
+ export const FILTER_MODES = ["default", "sensitive", "insensitive"];
2
+ export const TO_ONE_RELINK_DIRECTIVES = [
3
+ "$connect",
4
+ "$connectOrCreate",
5
+ "$create",
6
+ "$set",
7
+ "$disconnect",
8
+ ];
9
+ export const TO_ONE_REWRITE_DIRECTIVES = [
10
+ "$update",
11
+ "$upsert",
12
+ ];
13
+ export function toOneRelinkWithRewrite(operand) {
14
+ const rewrite = TO_ONE_REWRITE_DIRECTIVES.filter((key) => Object.hasOwn(operand, key));
15
+ const relink = TO_ONE_RELINK_DIRECTIVES.filter((key) => Object.hasOwn(operand, key));
16
+ return rewrite.length === 0 || relink.length === 0
17
+ ? undefined
18
+ : { rewrite, relink };
19
+ }
1
20
  export const PROJECTION_SCOPES = [
2
21
  "record",
3
22
  "bulkWrite",
@@ -5,4 +24,5 @@ export const PROJECTION_SCOPES = [
5
24
  export const WRITE_SCOPES = [
6
25
  "nested",
7
26
  "bulkWrite",
27
+ "loopback",
8
28
  ];