@jskit-ai/agent-docs 0.1.256 → 0.1.258

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 (230) hide show
  1. package/guide/agent/app-extras/assistant-conversation.md +88 -35
  2. package/guide/agent/app-extras/assistant.md +28 -28
  3. package/guide/agent/app-setup/authentication.md +36 -17
  4. package/guide/agent/app-setup/database-layer.md +116 -17
  5. package/guide/agent/app-setup/existing-application-migration.md +29 -25
  6. package/guide/agent/app-setup/multi-homing.md +94 -48
  7. package/guide/agent/app-setup/run-an-accounts-hub.md +6 -4
  8. package/guide/agent/framework/client-features.md +496 -0
  9. package/guide/agent/framework/crud-operations.md +5 -5
  10. package/guide/agent/framework/translation.md +4 -3
  11. package/guide/agent/framework/typed-features.md +1104 -0
  12. package/guide/agent/framework/ui-operations.md +2 -2
  13. package/guide/agent/index.md +6 -1
  14. package/package.json +1 -1
  15. package/patterns/feature-package/PATTERN.md +104 -10
  16. package/patterns/feature-package/example/booking-engine/package.json +9 -4
  17. package/patterns/feature-package/example/booking-engine/src/server/BookingEngineFeature.js +24 -0
  18. package/patterns/feature-package/example/booking-engine/src/server/bookingAvailability.js +10 -0
  19. package/patterns/feature-package/example/booking-engine/src/server/bookingEngine.js +29 -0
  20. package/patterns/feature-package/example/booking-engine/src/server/bookingEngineActions.js +26 -0
  21. package/patterns/feature-package/example/booking-engine/src/server/inputSchemas.js +1 -2
  22. package/patterns/feature-package/example/booking-engine/src/server/types.js +12 -0
  23. package/patterns/feature-package/example/variations/AvailabilityEngineFeature.js +19 -0
  24. package/patterns/feature-package/example/variations/InvoiceRollupFeature.js +23 -0
  25. package/patterns/feature-package/example/variations/availabilityEngineActions.js +26 -0
  26. package/patterns/feature-package/example/variations/customKnexRepository.js +32 -26
  27. package/patterns/feature-package/example/variations/invoiceRollupActions.js +26 -0
  28. package/patterns/feature-package/example/variations/orchestratorService.js +24 -19
  29. package/patterns/feature-package/example/variations/types.js +7 -0
  30. package/patterns/minimal-foundation/PATTERN.md +30 -1
  31. package/patterns/minimal-foundation/example/AGENTS.md +14 -0
  32. package/patterns/minimal-foundation/example/bin/develop.js +10 -5
  33. package/patterns/minimal-foundation/example/eslint.config.mjs +21 -2
  34. package/patterns/minimal-foundation/example/package.json +5 -4
  35. package/patterns/minimal-foundation/example/playwright.config.mjs +1 -1
  36. package/patterns/minimal-foundation/example/server/lib/envFile.js +19 -0
  37. package/patterns/minimal-foundation/example/server/lib/loggerOptions.js +15 -0
  38. package/patterns/minimal-foundation/example/server/lib/runtimeEnv.js +17 -17
  39. package/patterns/minimal-foundation/example/server.js +32 -29
  40. package/patterns/minimal-foundation/example/tests/server/smoke.test.js +2 -1
  41. package/patterns/shell-foundation/PATTERN.md +29 -0
  42. package/patterns/shell-foundation/example/AGENTS.md +14 -0
  43. package/patterns/shell-foundation/example/bin/develop.js +10 -5
  44. package/patterns/shell-foundation/example/eslint.config.mjs +21 -2
  45. package/patterns/shell-foundation/example/package.json +6 -5
  46. package/patterns/shell-foundation/example/packages/main/package.json +1 -1
  47. package/patterns/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +1 -0
  48. package/patterns/shell-foundation/example/playwright.config.mjs +1 -1
  49. package/patterns/shell-foundation/example/server/lib/envFile.js +19 -0
  50. package/patterns/shell-foundation/example/server/lib/loggerOptions.js +15 -0
  51. package/patterns/shell-foundation/example/server/lib/runtimeEnv.js +17 -17
  52. package/patterns/shell-foundation/example/server.js +32 -29
  53. package/patterns/shell-foundation/example/tests/server/smoke.test.js +2 -1
  54. package/reference/autogen/KERNEL_MAP.md +14 -8
  55. package/reference/autogen/PATTERN_INDEX.md +37 -37
  56. package/reference/autogen/README.md +2 -0
  57. package/reference/autogen/packages/agent-docs.md +70 -26
  58. package/reference/autogen/packages/agent-runtime.md +129 -0
  59. package/reference/autogen/packages/agent.md +149 -0
  60. package/reference/autogen/packages/architecture-inspector.md +97 -44
  61. package/reference/autogen/packages/assistant-core.md +786 -292
  62. package/reference/autogen/packages/assistant-runtime.md +182 -57
  63. package/reference/autogen/packages/assistant-voice-sherpa.md +4 -0
  64. package/reference/autogen/packages/assistant-voice.md +54 -8
  65. package/reference/autogen/packages/auth-core.md +44 -13
  66. package/reference/autogen/packages/auth-provider-local-core.md +86 -34
  67. package/reference/autogen/packages/auth-provider-local-db-core.md +1 -2
  68. package/reference/autogen/packages/auth-provider-oidc-core.md +10 -4
  69. package/reference/autogen/packages/auth-provider-supabase-core.md +52 -66
  70. package/reference/autogen/packages/auth-web.md +19 -11
  71. package/reference/autogen/packages/connectors-catalog.md +71 -43
  72. package/reference/autogen/packages/connectors-core.md +42 -4
  73. package/reference/autogen/packages/console-core.md +27 -14
  74. package/reference/autogen/packages/crud-core.md +178 -170
  75. package/reference/autogen/packages/database-runtime-mysql.md +0 -2
  76. package/reference/autogen/packages/database-runtime-postgres.md +0 -2
  77. package/reference/autogen/packages/database-runtime.md +39 -10
  78. package/reference/autogen/packages/http-runtime.md +79 -57
  79. package/reference/autogen/packages/json-rest-api-core.md +11 -8
  80. package/reference/autogen/packages/kernel.md +144 -83
  81. package/reference/autogen/packages/oidc-issuer-core.md +49 -20
  82. package/reference/autogen/packages/payments-core.md +20 -3
  83. package/reference/autogen/packages/realtime.md +47 -22
  84. package/reference/autogen/packages/resource-core.md +1 -1
  85. package/reference/autogen/packages/resource-crud-core.md +64 -26
  86. package/reference/autogen/packages/rewarded-core.md +47 -36
  87. package/reference/autogen/packages/shell-web.md +7 -10
  88. package/reference/autogen/packages/storage-runtime.md +6 -2
  89. package/reference/autogen/packages/uploads-runtime.md +10 -2
  90. package/reference/autogen/packages/users-core.md +73 -71
  91. package/reference/autogen/packages/workspaces-core.md +121 -106
  92. package/reference/autogen/packages/workspaces-web.md +1 -2
  93. package/reference/autogen/tooling/config-eslint.md +302 -0
  94. package/reference/autogen/tooling/jskit-catalog.md +28 -18
  95. package/reference/autogen/tooling/jskit-release.md +35 -20
  96. package/reference/autogen/tooling/testUtils.md +3 -1
  97. package/skills/jskit/SKILL.md +3 -2
  98. package/skills/jskit/references/app-operations.md +1 -1
  99. package/skills/jskit/references/client-features.md +491 -0
  100. package/skills/jskit/references/crud-form-actions.md +1 -1
  101. package/skills/jskit/references/crud-operations.md +7 -7
  102. package/skills/jskit/references/existing-application-migration.md +31 -27
  103. package/skills/jskit/references/heuristics/INDEX.md +5 -1
  104. package/skills/jskit/references/heuristics/child-cruds.md +1 -1
  105. package/skills/jskit/references/heuristics/client-features.md +66 -0
  106. package/skills/jskit/references/heuristics/client-requests.md +1 -1
  107. package/skills/jskit/references/heuristics/crud-authoring.md +12 -2
  108. package/skills/jskit/references/heuristics/crud-links.md +1 -1
  109. package/skills/jskit/references/heuristics/crud-repository-mapping.md +3 -3
  110. package/skills/jskit/references/heuristics/filters.md +1 -1
  111. package/skills/jskit/references/heuristics/live-actions.md +1 -1
  112. package/skills/jskit/references/heuristics/page-redirects.md +1 -1
  113. package/skills/jskit/references/heuristics/page-scaffolding.md +1 -1
  114. package/skills/jskit/references/heuristics/placements.md +1 -1
  115. package/skills/jskit/references/heuristics/row-policies.md +1 -1
  116. package/skills/jskit/references/heuristics/server-search.md +1 -1
  117. package/skills/jskit/references/heuristics/surfaces.md +1 -1
  118. package/skills/jskit/references/heuristics/typed-features.md +100 -0
  119. package/skills/jskit/references/heuristics/ui-contract.md +1 -1
  120. package/skills/jskit/references/heuristics/ui-testing.md +4 -4
  121. package/skills/jskit/references/material-3.md +2 -2
  122. package/skills/jskit/references/multi-homing.md +96 -50
  123. package/skills/jskit/references/pattern-index.md +37 -37
  124. package/skills/jskit/references/patterns/app/minimal-foundation/PATTERN.md +30 -1
  125. package/skills/jskit/references/patterns/app/minimal-foundation/example/AGENTS.md +14 -0
  126. package/skills/jskit/references/patterns/app/minimal-foundation/example/bin/develop.js +10 -5
  127. package/skills/jskit/references/patterns/app/minimal-foundation/example/eslint.config.mjs +21 -2
  128. package/skills/jskit/references/patterns/app/minimal-foundation/example/package.json +5 -4
  129. package/skills/jskit/references/patterns/app/minimal-foundation/example/playwright.config.mjs +1 -1
  130. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/envFile.js +19 -0
  131. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/loggerOptions.js +15 -0
  132. package/skills/jskit/references/patterns/app/minimal-foundation/example/server/lib/runtimeEnv.js +17 -17
  133. package/skills/jskit/references/patterns/app/minimal-foundation/example/server.js +32 -29
  134. package/skills/jskit/references/patterns/app/minimal-foundation/example/tests/server/smoke.test.js +2 -1
  135. package/skills/jskit/references/patterns/app/shell-foundation/PATTERN.md +29 -0
  136. package/skills/jskit/references/patterns/app/shell-foundation/example/AGENTS.md +14 -0
  137. package/skills/jskit/references/patterns/app/shell-foundation/example/bin/develop.js +10 -5
  138. package/skills/jskit/references/patterns/app/shell-foundation/example/eslint.config.mjs +21 -2
  139. package/skills/jskit/references/patterns/app/shell-foundation/example/package.json +6 -5
  140. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/package.json +1 -1
  141. package/skills/jskit/references/patterns/app/shell-foundation/example/packages/main/src/client/providers/MainClientProvider.js +1 -0
  142. package/skills/jskit/references/patterns/app/shell-foundation/example/playwright.config.mjs +1 -1
  143. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/envFile.js +19 -0
  144. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/loggerOptions.js +15 -0
  145. package/skills/jskit/references/patterns/app/shell-foundation/example/server/lib/runtimeEnv.js +17 -17
  146. package/skills/jskit/references/patterns/app/shell-foundation/example/server.js +32 -29
  147. package/skills/jskit/references/patterns/app/shell-foundation/example/tests/server/smoke.test.js +2 -1
  148. package/skills/jskit/references/patterns/assistant/assistant-surface/example/src/ApplicationAiFeature.js +4 -2
  149. package/skills/jskit/references/patterns/auth/accounts-hub/PATTERN.md +2 -1
  150. package/skills/jskit/references/patterns/auth/accounts-hub/example/package.json +2 -2
  151. package/skills/jskit/references/patterns/auth/accounts-hub/example/server/hubPaths.js +9 -3
  152. package/skills/jskit/references/patterns/auth/auth-surface/PATTERN.md +25 -12
  153. package/skills/jskit/references/patterns/auth/auth-surface/example/tools/preview-identity +7 -1
  154. package/skills/jskit/references/patterns/auth/oidc-sign-in/example/package.json +2 -2
  155. package/skills/jskit/references/patterns/auth/supabase-auth/example/package.json +1 -1
  156. package/skills/jskit/references/patterns/connectors/ai-connections/PATTERN.md +16 -1
  157. package/skills/jskit/references/patterns/connectors/ai-connections/example/ai-model.js +12 -3
  158. package/skills/jskit/references/patterns/connectors/ai-connections/example/perplexity-answer.js +15 -4
  159. package/skills/jskit/references/patterns/connectors/api-key-connection/PATTERN.md +9 -1
  160. package/skills/jskit/references/patterns/connectors/api-key-connection/example/connections.js +5 -2
  161. package/skills/jskit/references/patterns/connectors/aws-storage-queries/PATTERN.md +13 -3
  162. package/skills/jskit/references/patterns/connectors/aws-storage-queries/example/s3-transfer.js +14 -3
  163. package/skills/jskit/references/patterns/connectors/calendar-cli/PATTERN.md +8 -0
  164. package/skills/jskit/references/patterns/connectors/calendar-cli/example/knexfile.js +1 -1
  165. package/skills/jskit/references/patterns/connectors/calendar-cli/example/package.json +4 -4
  166. package/skills/jskit/references/patterns/connectors/calendar-cli/example/scripts/calendar.js +8 -4
  167. package/skills/jskit/references/patterns/connectors/event-delivery/PATTERN.md +1 -1
  168. package/skills/jskit/references/patterns/connectors/firebase-messaging/PATTERN.md +10 -0
  169. package/skills/jskit/references/patterns/connectors/firebase-messaging/example/server/notifications.js +8 -0
  170. package/skills/jskit/references/patterns/connectors/google-ads-search/PATTERN.md +18 -7
  171. package/skills/jskit/references/patterns/connectors/google-ads-search/example/ads-setup.js +13 -5
  172. package/skills/jskit/references/patterns/connectors/oauth-connection/PATTERN.md +1 -1
  173. package/skills/jskit/references/patterns/connectors/paddle-catalogue/PATTERN.md +11 -2
  174. package/skills/jskit/references/patterns/connectors/paddle-catalogue/example/create-products.js +5 -2
  175. package/skills/jskit/references/patterns/connectors/public-image/PATTERN.md +10 -1
  176. package/skills/jskit/references/patterns/connectors/public-image/example/logo-url.js +4 -1
  177. package/skills/jskit/references/patterns/connectors/redshift-queries/PATTERN.md +1 -1
  178. package/skills/jskit/references/patterns/connectors/source-scanning/PATTERN.md +13 -2
  179. package/skills/jskit/references/patterns/connectors/source-scanning/example/source-scanner.js +9 -0
  180. package/skills/jskit/references/patterns/crud/json-api-resource-package/PATTERN.md +102 -23
  181. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/package.json +3 -2
  182. package/skills/jskit/references/patterns/crud/json-api-resource-package/example/packages/books/src/server/types.js +5 -0
  183. package/skills/jskit/references/patterns/crud/resource-contract/PATTERN.md +54 -1
  184. package/skills/jskit/references/patterns/database/mysql-application/PATTERN.md +16 -5
  185. package/skills/jskit/references/patterns/database/mysql-application/example/knexfile.js +2 -2
  186. package/skills/jskit/references/patterns/database/mysql-application/example/package.json +1 -1
  187. package/skills/jskit/references/patterns/database/mysql-application/example/scripts/prepare-database.js +1 -1
  188. package/skills/jskit/references/patterns/database/postgres-application/PATTERN.md +16 -5
  189. package/skills/jskit/references/patterns/database/postgres-application/example/knexfile.js +2 -2
  190. package/skills/jskit/references/patterns/database/postgres-application/example/package.json +1 -1
  191. package/skills/jskit/references/patterns/database/postgres-application/example/scripts/prepare-database.js +1 -1
  192. package/skills/jskit/references/patterns/realtime/realtime-application/example/package.json +2 -2
  193. package/skills/jskit/references/patterns/rewards/google-rewarded/example/GoogleRewardedDeliveryProvider.js +1 -1
  194. package/skills/jskit/references/patterns/rewards/google-rewarded/example/googlePublisherTag.js +5 -11
  195. package/skills/jskit/references/patterns/server/feature-package/PATTERN.md +104 -10
  196. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/package.json +9 -4
  197. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineFeature.js +24 -0
  198. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingAvailability.js +10 -0
  199. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingEngine.js +29 -0
  200. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/bookingEngineActions.js +26 -0
  201. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/inputSchemas.js +1 -2
  202. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/types.js +12 -0
  203. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineFeature.js +19 -0
  204. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupFeature.js +23 -0
  205. package/skills/jskit/references/patterns/server/feature-package/example/variations/availabilityEngineActions.js +26 -0
  206. package/skills/jskit/references/patterns/server/feature-package/example/variations/customKnexRepository.js +32 -26
  207. package/skills/jskit/references/patterns/server/feature-package/example/variations/invoiceRollupActions.js +26 -0
  208. package/skills/jskit/references/patterns/server/feature-package/example/variations/orchestratorService.js +24 -19
  209. package/skills/jskit/references/patterns/server/feature-package/example/variations/types.js +7 -0
  210. package/skills/jskit/references/patterns/users/user-administration-server/PATTERN.md +16 -1
  211. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/package.json +3 -2
  212. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users/src/server/types.js +5 -0
  213. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/package.json +4 -3
  214. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/UsersWorkspaceFeature.js +2 -9
  215. package/skills/jskit/references/patterns/users/user-administration-server/example/packages/users-workspace/src/server/types.js +5 -0
  216. package/skills/jskit/references/patterns/workspaces/workspace-server/PATTERN.md +42 -17
  217. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/WorkspaceInvitationsFeature.js +27 -0
  218. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteEmail.js +11 -10
  219. package/skills/jskit/references/patterns/workspaces/workspace-server/example/packages/main/src/server/email/workspaceInviteMailer.js +27 -0
  220. package/skills/jskit/references/translation.md +5 -4
  221. package/skills/jskit/references/typed-features.md +1099 -0
  222. package/skills/jskit/references/ui-operations.md +3 -3
  223. package/patterns/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +0 -33
  224. package/patterns/feature-package/example/booking-engine/src/server/actions.js +0 -24
  225. package/patterns/feature-package/example/variations/AvailabilityEngineProvider.js +0 -31
  226. package/patterns/feature-package/example/variations/InvoiceRollupProvider.js +0 -36
  227. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/BookingEngineProvider.js +0 -33
  228. package/skills/jskit/references/patterns/server/feature-package/example/booking-engine/src/server/actions.js +0 -24
  229. package/skills/jskit/references/patterns/server/feature-package/example/variations/AvailabilityEngineProvider.js +0 -31
  230. package/skills/jskit/references/patterns/server/feature-package/example/variations/InvoiceRollupProvider.js +0 -36
@@ -16,36 +16,22 @@ Use this on demand; do not load the full index at startup.
16
16
 
17
17
  ### `src/server/createCrudServiceFromResource.js`
18
18
  Exports
19
- - `createCrudServiceFromResource(resource = {}, { context = "crudService" } = {})`
19
+ - `createCrudServiceFromResource(resource, { context = "crudService" } = {})`
20
20
 
21
21
  ### `src/server/createHooksToCollectChildren.js`
22
22
  Exports
23
23
  - `createHooksToCollectChildren(options = {})`
24
24
  Local functions
25
25
  - `normalizeOwnerKey(value)`
26
- - `toDefaultChildCallOptions(callOptions = {})`
26
+ - `readParentId(record)`
27
+ - `toDefaultChildCallOptions({ callOptions = {} } = {})`
27
28
  - `resolveListChildrenHandler(options = {}, { context = "createHooksToCollectChildren" } = {})`
28
29
  - `resolveGetChildOwnerId(options = {}, { context = "createHooksToCollectChildren" } = {})`
29
- - `resolveLookupContainerKey(record = {}, hookContext = {}, options = {})`
30
-
31
- ### `src/server/crudModuleConfig.js`
32
- Exports
33
- - `CRUD_REQUESTED_OWNERSHIP_FILTER_AUTO`
34
- - `normalizeCrudRequestedOwnershipFilter(value, { fallback = CRUD_REQUESTED_OWNERSHIP_FILTER_AUTO } = {})`
35
- - `isWorkspaceRouteVisibility`
36
- - `requireCrudNamespace`
37
- - `resolveCrudRelativePath(namespace = "")`
38
- - `normalizeCrudRelativePath(relativePath = "", { context = "resolveCrudSurfacePolicy" } = {})`
39
- - `resolveCrudSurfacePolicy(sourceConfig = {}, { surfaceDefinitions = {}, defaultSurfaceId = "", context = "resolveCrudSurfacePolicy" } = {})`
40
- - `resolveCrudSurfacePolicyFromAppConfig(sourceConfig = {}, appConfig = {}, options = {})`
41
- Local functions
42
- - `asRecord(value)`
43
- - `normalizeSurfaceDefinitions(sourceDefinitions = {})`
44
- - `resolveOwnershipFilterFromSurfaceDefinition(definition = {})`
30
+ - `resolveChildrenContainerKey(hookContext = {}, options = {})`
45
31
 
46
32
  ### `src/server/defineCrudJsonApiFeature.js`
47
33
  Exports
48
- - `defineCrudJsonApiFeature({ resource, id = "", capability = "", surface, ownershipFilter = "", relativePath = "", internal = false, routes = true, listFilterQueryValidator = null, searchSchema = null, permissions = null, scope = {}, requires = {}, decorateRepository = null, decorateService = null, operationLifecycle = {}, operationInputs = {}, actions = {}, operations = undefined, realtimeAudience = "event_scope" } = {})`
34
+ - `defineCrudJsonApiFeature({ resource, id = "", capability = "", surface, ownershipFilter = "", relativePath = "", internal = false, routes = true, listFilterQueryValidator = null, searchSchema = null, permissions = null, scope = {}, requires = {}, decorateRepository = null, decorateService = null, operationLifecycle = {}, operationInputs = {}, actions = {}, operations = undefined, realtimeAudience = "event_scope" })`
49
35
  Local functions
50
36
  - `normalizeAccess(resource = {})`
51
37
  - `normalizeScope(scope = {})`
@@ -53,7 +39,7 @@ Local functions
53
39
  - `normalizeFeatureRequirements(requires = {})`
54
40
  - `operationsFromResource(resource)`
55
41
  - `normalizeOperations(operations, resource)`
56
- - `resolveActionPermission(actionName, { access, workspaceScoped, permissions } = {})`
42
+ - `resolveActionPermission(actionName, { access, workspaceScoped, permissions })`
57
43
  - `projectEnabledServiceOperations(service, operations)`
58
44
 
59
45
  ### `src/server/fieldAccess.js`
@@ -64,96 +50,117 @@ Local functions
64
50
  - `normalizeFieldSet(value, { context = "crudFieldAccess", label = "field list" } = {})`
65
51
  - `resolveFieldSet(resolver, input = {}, { context = "crudFieldAccess", label = "field list" } = {})`
66
52
  - `resolveWriteMode(fieldAccess = {}, { context = "crudFieldAccess" } = {})`
67
- - `buildOutputFieldRules(resource = {})`
68
- - `resolveRoleFromFieldAccessInput(input = {})`
69
- - `resolveActionFromFieldAccessInput(input = {})`
53
+ - `buildOutputFieldRules(resource)`
54
+ - `resolveRoleFromFieldAccessInput(input)`
55
+ - `resolveActionFromFieldAccessInput(input)`
70
56
  - `resolveOperationPolicyValue(operationPolicy, input = {}, action = "*")`
71
57
  - `resolveRoleMatrixPolicy(matrix = {}, operation = "readable", input = {})`
72
- - `applyReadableFieldPolicyToRecord(record, allowedFields, outputRules = null, { context = "crudFieldAccess" } = {})`
58
+ - `applyReadableFieldPolicyToRecord(record, allowedFields, outputRules, { context = "crudFieldAccess" } = {})`
73
59
 
74
60
  ### `src/server/jsonApiModule/actions.js`
75
61
  Exports
76
62
  - `assertCrudOperationName(operation = "")`
77
- - `createCrudJsonApiActions({ namespace, resource, repository = null, service, surface, permissionForOperation, permissionForAction = permissionForOperation, operations = CRUD_OPERATION_NAMES, scopeInputValidator = null, scopeInputKeys = [], listFilterQueryValidator = null, operationLifecycle = {}, operationInputs = {}, actions: additionalActionDefinitions = {}, dependencies = {}, realtimeAudience = "event_scope" } = {})`
78
- - `normalizeCrudOperationLifecycle(value = {})`
63
+ - `createCrudJsonApiActions({ namespace, resource, repository, service, surface, permissionForOperation, operations, scopeInputValidator, scopeInputKeys, listFilterQueryValidator, operationLifecycle, operationInputs, actions, dependencies, realtimeAudience })`
64
+ - `normalizeCrudOperationLifecycle(value)`
65
+ Local functions
66
+ - `buildActionInput(resource, operation, scopeInputValidator, listFilterQueryValidator, operationInputs)`
67
+ - `omitInputKeys(input, keys)`
68
+ - `buildLifecycleContext(value)`
69
+ - `normalizeAdditionalActions(definitions, { namespace, surface, permissionForAction, scopeInputValidator })`
70
+
71
+ ### `src/server/jsonApiModule/assistantExtension.js`
72
+ Exports
73
+ - `createCrudAssistantExtension(resource, namespace, operation)`
79
74
  Local functions
80
- - `isRecord(value)`
81
- - `normalizeOptionalCursor(value)`
82
75
  - `resolveAssistantResultValue(result)`
83
- - `createProjectionRecordSchema(recordSchema, { lookupContainerKey = "", relationshipEntries = [] } = {})`
84
- - `createProjectionOutputDefinition(output, operation, relationshipEntries, lookupContainerKey)`
85
- - `createCrudAssistantTransport(resource, operation, relationshipEntries, lookupContainerKey)`
76
+ - `buildProjectionRecordSchema(recordSchema, { lookupContainerKey = "", relationshipEntries = [] } = {})`
77
+ - `buildProjectionOutputDefinition(output, operation, relationshipEntries, lookupContainerKey)`
78
+ - `buildCrudAssistantTransport(resource, operation, relationshipEntries, lookupContainerKey)`
86
79
  - `projectCrudAssistantRecordFields(record, selectedFields = null, { preserveKeys = [] } = {})`
87
80
  - `projectCrudAssistantLookupValue(value, selectedFields = null)`
88
81
  - `projectCrudAssistantReadRecord(record, { lookupContainerKey = "", primaryFields = null, relatedFieldsByLookupKey = new Map() } = {})`
89
- - `createCrudAssistantResultProjection(input = {}, resource = {}, relationshipEntries = [])`
82
+ - `buildCrudAssistantResultProjection(input, resource, relationshipEntries = [])`
90
83
  - `projectCrudAssistantReadResult(result, projection = null, { lookupContainerKey = "" } = {})`
91
84
  - `transformCrudAssistantResult(operation, result, { input = {}, resource, relationshipEntries = [], lookupContainerKey = "" } = {})`
92
- - `createCrudAssistantReadDescription({ fieldsetContract, lookupContainerKey = "", namespace = "", operation = "list" } = {})`
93
- - `createCrudAssistantExtension(resource, namespace, operation)`
94
- - `createActionInput(resource, operation, scopeInputValidator = null, listFilterQueryValidator = null, operationInputs = {})`
95
- - `omitInputKeys(input = {}, keys = [])`
96
- - `createLifecycleContext(value = {})`
97
- - `normalizeAdditionalActions(value = {}, { namespace, surface, permissionForAction, scopeInputValidator = null } = {})`
85
+ - `buildCrudAssistantReadDescription({ fieldsetContract, lookupContainerKey = "", namespace = "", operation = "list" } = {})`
86
+
87
+ ### `src/server/jsonApiModule/customActionId.js`
88
+ Exports
89
+ - `buildCrudCustomActionId(namespace, name, definition)`
98
90
 
99
91
  ### `src/server/jsonApiModule/repository.js`
100
92
  Exports
101
- - `createCrudJsonApiRepository({ api, resource, resourceScopeName } = {})`
93
+ - `createCrudJsonApiRepository({ api, resource, resourceScopeName })`
102
94
 
103
95
  ### `src/server/jsonApiModule/routes.js`
104
96
  Exports
105
- - `normalizeCustomActionRoutes(actions = {}, namespace = "")`
106
- - `registerCrudJsonApiRoutes(router, { namespace, resource, routeBase = "/", relativePath, surface, ownershipFilter, access, internal = false, operations = ["list", "view", "create", "update", "delete"], actions = {}, operationInputs = {}, listFilterQueryValidator = null, routeParamsValidator = null, scopeInput = null } = {})`
97
+ - `registerCrudJsonApiRoutes(router, { namespace, resource, routeBase, relativePath, surface, ownershipFilter, access, internal, operations, actions, operationInputs, listFilterQueryValidator, routeParamsValidator, scopeInput })`
107
98
  Local functions
108
- - `createScopeInput(scopeInput, request)`
109
- - `createCustomActionInput(scopeInput, route, request)`
99
+ - `buildScopeInput(scopeInput, request)`
100
+ - `buildCustomActionInput(scopeInput, route, request)`
101
+ - `normalizeCustomActionRoutes(actions, namespace)`
110
102
 
111
103
  ### `src/server/jsonApiModule/service.js`
112
104
  Exports
113
- - `createCrudJsonApiService({ repository } = {})`
105
+ - `createCrudJsonApiService({ repository })`
106
+ - `repositoryCallOptions(options = {})`
114
107
  Local functions
115
- - `requireDocument(document = null)`
108
+ - `requireDocument(document)`
116
109
 
117
110
  ### `src/server/jsonApiResourceContract.js`
118
111
  Exports
119
- - `resolveJsonApiFieldsetContract(resource = {})`
112
+ - `resolveDeclaredLookupContainerKey(resource)`
113
+ - `resolveJsonApiFieldsetContract(resource)`
120
114
  - `resolveJsonApiRelationshipEntries(definition = null)`
121
115
  - `resolveSchemaFieldDefinitions(definition = null)`
122
- Local functions
123
- - `isRecord(value)`
124
116
 
125
- ### `src/server/listFilters.js`
117
+ ### `src/server/listFilterJsonRest.js`
126
118
  Exports
127
- - `CRUD_LIST_FILTER_INVALID_VALUES_REJECT`
128
- - `CRUD_LIST_FILTER_INVALID_VALUES_DISCARD`
129
- - `createCrudListFilterQueryField(filterDefinition = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
130
- - `createCrudListFilterQuerySchema(structure = {})`
119
+ - `normalizeColumnsMap(columns = {})`
131
120
  - `createCrudListFilterJsonRestSearchSchema(runtime = {}, { columns = {}, apply = {} } = {})`
132
- - `createCrudListFilters(definitions = {}, { columns = {}, apply = {} } = {})`
133
- - `createCrudListFilterContract(definitions = {}, { columns = {}, apply = {}, invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
121
+ - `normalizeCrudListFilterJsonRestQuery(runtime = {}, query = {})`
134
122
  Local functions
135
- - `cloneTransportSchema(value)`
136
- - `buildSingleOrMultiTransportSchema(itemSchema)`
137
- - `addDaysToDateFilterValue(value = "", days = 0)`
138
- - `normalizeCrudListFilterQueryFieldInput(filterDefinition = null)`
139
- - `buildFilterQueryFieldDefinition(filterDefinition = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
140
- - `buildFilterQueryTransportSchema(filter = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
141
- - `buildFilterQuerySchemaDefinition(filterEntries = [], { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
142
- - `projectNormalizedFilterValues(filterEntries = [], source = {}, errors = {})`
143
- - `normalizeColumnsMap(columns = {})`
144
123
  - `resolveJsonRestFilterActualField(filter = {}, columns = {})`
145
124
  - `renderInternalJsonRestFilterKey(filter = {}, suffix = "")`
146
- - `createJsonRestSearchSchemaEntry({ type = "string", actualField = "", filterOperator = "=", extra = {} } = {})`
125
+ - `buildJsonRestSearchSchemaEntry({ type = "string", actualField = "", filterOperator = "=", extra = {} } = {})`
147
126
  - `buildJsonRestFilterItemSchema(filter = {})`
148
127
  - `buildJsonRestSimpleFilterSearchSchemaEntry(filter = {}, { actualField = "" } = {})`
149
128
  - `buildJsonRestRangeFilterSearchSchemaEntries(filter = {}, { actualField = "" } = {})`
150
129
  - `buildJsonRestPresenceFilterSearchSchemaEntry(filter = {}, { actualField = "" } = {})`
151
- - `buildJsonRestCustomFilterSearchSchemaEntry(filter = {}, customApply = null)`
130
+ - `buildJsonRestCustomFilterSearchSchemaEntry(filter, customApply)`
152
131
  - `resolveCrudListFilterEntries(value = {})`
153
132
  - `addJsonRestDateFilterValues(target = {}, filter = {}, value = "")`
154
133
  - `addJsonRestFilterValue(target = {}, filter = {}, value)`
155
- - `normalizeCrudListFilterJsonRestQuery(runtime = {}, query = {})`
134
+
135
+ ### `src/server/listFilters.js`
136
+ Exports
137
+ - `CRUD_LIST_FILTER_INVALID_VALUES_REJECT`
138
+ - `CRUD_LIST_FILTER_INVALID_VALUES_DISCARD`
139
+ - `buildCrudListFilterQueryField`
140
+ - `createCrudListFilterQuerySchema`
141
+ - `createCrudListFilterJsonRestSearchSchema`
142
+ - `createCrudListFilters(definitions = {}, { columns = {}, apply = {} } = {})`
143
+ - `createCrudListFilterContract(definitions = {}, { columns = {}, apply = {}, invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
144
+ Local functions
145
+ - `projectNormalizedFilterValues(filterEntries = [], source = {}, errors = {})`
146
+
147
+ ### `src/server/listFilterTypes.js`
148
+ Exports
149
+ - `recordIdTransportSchema`
150
+ - `cloneTransportSchema(value)`
151
+ - `addDaysToDateFilterValue(value = "", days = 0)`
152
+ - `buildCrudListFilterQueryField(filterDefinition, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
153
+ - `createCrudListFilterQuerySchema(structure = {})`
154
+ - `buildFilterQuerySchemaDefinition(filterEntries = [], { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
156
155
  - `applyDefaultFilterQuery(queryBuilder, filter = {}, value, column = "")`
156
+ Local functions
157
+ - `buildSingleOrMultiTransportSchema(itemSchema)`
158
+ - `buildAllowedValuesTransportSchema({ discardInvalidValues, allowedValues })`
159
+ - `applyEqualsFilterQuery(queryBuilder, value, column = "")`
160
+ - `applyInFilterQuery(queryBuilder, value, column = "")`
161
+ - `normalizeCrudListFilterQueryFieldInput(filterDefinition)`
162
+ - `buildFilterQueryFieldDefinition(filterDefinition, { invalidValues })`
163
+ - `buildFilterQueryTransportSchema(filter, { invalidValues })`
157
164
 
158
165
  ### `src/server/listQueryValidators.js`
159
166
  Exports
@@ -162,53 +169,27 @@ Exports
162
169
  - `listSearchQueryValidator`
163
170
  - `lookupIncludeQueryValidator`
164
171
  - `jsonApiFieldsetsQueryValidator`
165
- - `resolveCrudParentFilterKeys(resource = {})`
166
172
  - `createCrudParentFilterQueryValidator(resource = {})`
167
- - `createStandardCrudListQueryValidators({ resource = {}, listFilterQueryValidator = null, searchQueryValidator = listSearchQueryValidator, includeQueryValidator = lookupIncludeQueryValidator, fieldsetsQueryValidator = jsonApiFieldsetsQueryValidator } = {})`
173
+ - `createStandardCrudListQueryValidators({ // readable-check: allow dependency-default - data: a resource definition resource = {}, listFilterQueryValidator = null, searchQueryValidator = listSearchQueryValidator, includeQueryValidator = lookupIncludeQueryValidator, fieldsetsQueryValidator = jsonApiFieldsetsQueryValidator } = {})`
168
174
  - `createStandardCrudViewQueryValidators({ includeQueryValidator = lookupIncludeQueryValidator, fieldsetsQueryValidator = jsonApiFieldsetsQueryValidator } = {})`
169
175
  Local functions
170
- - `createJsonApiFieldsetValueDefinition({ allowedFields = [] } = {})`
176
+ - `buildJsonApiFieldsetValueDefinition({ allowedFields = [] } = {})`
171
177
  - `resolveCrudListUsesOrderedCursor(list = {})`
172
178
 
173
- ### `src/server/lookupHydration.js`
174
- Exports
175
- - `createCrudLookupRuntime(resource = {}, { outputKeys = [] } = {})`
176
- - `hydrateCrudLookupRecords(records = [], runtime = {}, { include, mode = "list", repositoryOptions = {}, callOptions = {} } = {})`
177
- Local functions
178
- - `normalizeLookupRelationEntry(entry = {}, outputKeys = new Set())`
179
- - `normalizeLookupDefaultInclude(value)`
180
- - `normalizeLookupMaxDepth(value)`
181
- - `resolveLookupRuntimeDefaults(resource = {})`
182
- - `normalizeLookupIdentifier(value)`
183
- - `normalizeIncludePaths(include, { defaultInclude = DEFAULT_LOOKUP_INCLUDE } = {})`
184
- - `resolveChildIncludeFromPaths(paths = [])`
185
- - `buildLookupHydrationPlan(runtime = {}, include, { mode = "list", context = "crudRepository", includeWasExplicit = false, skippedNamespaces = new Set() } = {})`
186
- - `resolveLookupResolver(repositoryOptions = {}, callOptions = {}, { context = "crudRepository" } = {})`
187
- - `resolveLookupDepthRuntime(runtime = {}, repositoryOptions = {}, callOptions = {})`
188
- - `buildLookupGroupKey(relation = {})`
189
- - `normalizeLookupRelationValues(records = [], entries = [], childIncludeByKey = {})`
190
- - `resolveGroupChildInclude(group = {})`
191
- - `normalizeLookup(provider, relation = {}, { context = "crudRepository" } = {})`
192
- - `resolveLookupOwnershipFilter(provider = {}, { context = "crudRepository" } = {})`
193
- - `resolveLookupVisibilityContext(provider = {}, relation = {}, callOptions = {}, { context = "crudRepository" } = {})`
194
- - `buildLookupRecordMap(records = [], valueKey = "")`
195
- - `buildLookupCollectionMap(records = [], foreignKey = "")`
196
- - `resolveLookupVisitedNamespaces(runtime = {}, callOptions = {})`
197
-
198
179
  ### `src/server/lookupPathSupport.js`
199
180
  Exports
200
- - `normalizeCrudLookupApiPath`
201
- - `normalizeCrudLookupNamespace`
181
+ - `normalizeLookupOwnershipFilter(value, { context })`
202
182
  - `requireCrudLookupNamespace(value = "", { context = "crudLookup" } = {})`
203
- - `resolveCrudLookupNamespaceFromRelation(relation = {}, { context = "crudLookup" } = {})`
204
183
  - `resolveCrudLookupToken(namespace = "", { context = "crudLookup" } = {})`
205
184
 
206
185
  ### `src/server/lookups.js`
207
186
  Exports
208
187
  - `resolveCrudLookupToken`
209
188
  - `createCrudLookup(repository, { context = "crudLookup", ownershipFilter = "" } = {})`
210
- Local functions
211
- - `normalizeLookupOwnershipFilter(value, { context = "crudLookup ownershipFilter" } = {})`
189
+
190
+ ### `src/server/normalizeOptionalText.js`
191
+ Exports
192
+ - `normalizeOptionalText(value)`
212
193
 
213
194
  ### `src/server/repositorySupport.js`
214
195
  Exports
@@ -227,115 +208,121 @@ Exports
227
208
  Local functions
228
209
  - `resolveOptionalFieldDefinitions(definition, options = {})`
229
210
  - `requireFieldDefinitions(definition, { context = "crudRepository", schemaLabel = "schema definition", defaultMode = "patch" } = {})`
230
- - `resolveFieldDefinitionType(definition = {})`
211
+ - `resolveFieldDefinitionType(definition)`
231
212
  - `definitionIncludesStringType(definition = {})`
232
213
  - `definitionIncludesDateTimeType(definition = {})`
233
214
  - `definitionIncludesRecordIdType(definition = {})`
234
215
 
216
+ ### `src/server/resourceRuntime/compiledRuntime.js`
217
+ Exports
218
+ - `buildCompiledCrudRepositoryRuntime(resource, repositoryOptions)`
219
+ Local functions
220
+ - `requireCrudRepositoryOptions(value)`
221
+ - `resolveRepositoryDefaults(resource, repositoryMapping, { context })`
222
+ - `normalizeCrudVirtualFieldHandlers(virtualFields = {}, repositoryMapping, { context })`
223
+ - `resolveRecordOutputValidator(resource, { context })`
224
+ - `resolveOperationBodyValidator(resource, operationKey, { context })`
225
+ - `normalizeCrudRepositoryOperationStage(stage, stageLabel, { context })`
226
+ - `normalizeCrudRepositoryOperationConfig(config, operationKey, { context })`
227
+ - `normalizeCrudRepositoryOperations(sourceOperations, { context })`
228
+
235
229
  ### `src/server/resourceRuntime/index.js`
236
230
  Exports
237
- - `createCrudResourceRuntime(resource = {}, knex, repositoryOptions = {})`
231
+ - `createCrudResourceRuntime(resource, knex, repositoryOptions = {})`
232
+ - `type RuntimeKnex`
233
+ Local functions
234
+ - `requireCrudRecordId(value, { context })`
235
+ - `resolveCrudRepositoryCall(runtime, knex, callOptions)`
236
+ - `applyCrudRepositoryReadLock(dbQuery, callOptions)`
237
+ - `listRecords(runtime, knex, query, callOptions)`
238
+ - `findRecordById(runtime, knex, recordId, callOptions)`
239
+ - `listRecordsByIds(runtime, knex, ids, callOptions)`
240
+ - `createRecord(runtime, knex, payload, callOptions)`
241
+ - `updateRecordById(runtime, knex, recordId, patch, callOptions)`
242
+ - `deleteRecordById(runtime, knex, recordId, callOptions)`
243
+
244
+ ### `src/server/resourceRuntime/listControls.js`
245
+ Exports
246
+ - `resolveListRuntimeConfig(list = {}, fallbackSearchColumns, { idColumn })`
247
+ - `encodeOrderedListCursor(row, orderBy)`
248
+ - `applyOrderedListCursorFilter(query, { orderBy, cursor })`
249
+ - `enforceCrudRepositoryListControls(dbQuery, { idColumn, limit, orderBy })`
238
250
  Local functions
239
- - `requireCrudRecordId(value, { context = "crudRepository" } = {})`
240
- - `requireCrudRepositoryOptions(value = {}, { context = "crudRepository" } = {})`
241
- - `resolveRepositoryDefaults(resource = {}, repositoryMapping = {}, { context = "crudRepository" } = {})`
242
- - `normalizeCrudVirtualFieldHandlers(virtualFields = {}, repositoryMapping = {}, { context = "crudRepository" } = {})`
243
- - `applyCrudRepositoryVirtualProjections(dbQuery, runtime = {}, { knex, tableName } = {})`
244
- - `normalizeSearchColumns(searchColumns = [], fallbackColumns = [])`
251
+ - `normalizeSearchColumns(searchColumns, fallbackColumns)`
245
252
  - `normalizeListOrderDirection(value = LIST_ORDER_DIRECTION_ASC)`
246
253
  - `normalizeListOrderNulls(value = LIST_ORDER_NULLS_LAST)`
247
- - `normalizeListOrderBy(orderBy = [], { idColumn = "id" } = {})`
248
- - `resolveListRuntimeConfig(list = {}, fallbackSearchColumns = [], { idColumn = "id" } = {})`
249
- - `resolveRecordOutputValidator(resource = {}, { context = "crudRepository" } = {})`
250
- - `resolveOperationBodyValidator(resource = {}, operationKey = "", { context = "crudRepository" } = {})`
251
- - `extractExplicitFieldErrors(error)`
252
- - `normalizeRepositoryInputPayload(runtime = {}, payload = {}, { operationKey = "create", phase = "crudCreate", action = "create", recordId = null, existingRecord = null, actionContextBase = {} } = {})`
253
- - `normalizeRepositoryOutputRecord(runtime = {}, record = {}, { operation = "list" } = {})`
254
+ - `normalizeListOrderBy(orderBy, { idColumn })`
254
255
  - `encodeOrderedListCursorValue(value = null)`
255
256
  - `decodeOrderedListCursorValue(value = null)`
256
- - `encodeOrderedListCursor(row = null, orderBy = [])`
257
- - `decodeOrderedListCursor(cursor = "", orderBy = [])`
257
+ - `decodeOrderedListCursor(cursor, orderBy)`
258
258
  - `applyOrderedListCursorEquality(query, descriptor = {}, value = null)`
259
259
  - `applyOrderedListCursorAfterBranch(query, descriptor = {}, value = null)`
260
260
  - `canApplyOrderedListCursorAfterBranch(descriptor = {}, value = null)`
261
261
  - `appendOrderedListCursorBranches(query, orderBy = [], cursorValues = [], index = 0, { useOr = false } = {})`
262
- - `applyOrderedListCursorFilter(query, { orderBy = [], cursor = "" } = {})`
263
- - `normalizeCrudRepositoryOperationStage(stage = null, stageLabel = "", { context = "crudRepository" } = {})`
264
- - `normalizeCrudRepositoryOperationConfig(config = {}, operationKey = "", { context = "crudRepository" } = {})`
265
- - `normalizeCrudRepositoryOperations(sourceOperations = {}, { context = "crudRepository" } = {})`
266
- - `applyConfiguredQueryStage(dbQuery, stage = null, stageContext = {}, { context = "crudRepository", stageKey = "applyQuery" } = {})`
267
- - `isCrudRepositoryQueryBuilder(value)`
268
- - `normalizeCrudRepositoryObjectInput(value = {})`
269
- - `applyConfiguredObjectStage(payload = {}, stage = null, stageContext = {}, { context = "crudRepository", stageKey = "preparePayload" } = {})`
270
- - `applyOrderedListControls(dbQuery, orderBy = [])`
271
- - `enforceCrudRepositoryListControls(dbQuery, { idColumn = "id", limit = DEFAULT_LIST_LIMIT + 1, orderBy = [] } = {})`
272
- - `createCrudRepositoryActionContextBase(runtime, callOptions = {})`
273
- - `createCompiledCrudRepositoryRuntime(resource = {}, repositoryOptions = {})`
274
- - `resolveCrudRepositoryCall(runtime, knex, callOptions = {})`
275
- - `applyCrudRepositoryReadLock(dbQuery, callOptions = {})`
276
- - `listRecords(runtime, knex, query = {}, callOptions = {})`
277
- - `findRecordById(runtime, knex, recordId, callOptions = {})`
278
- - `listRecordsByIds(runtime, knex, ids = [], callOptions = {})`
279
- - `createRecord(runtime, knex, payload = {}, callOptions = {})`
280
- - `updateRecordById(runtime, knex, recordId, patch = {}, callOptions = {})`
281
- - `deleteRecordById(runtime, knex, recordId, callOptions = {})`
262
+ - `applyOrderedListControls(dbQuery, orderBy)`
282
263
 
283
264
  ### `src/server/resourceRuntime/lookupHydration.js`
284
265
  Exports
285
- - `createCrudLookupRuntime(resource = {}, { outputKeys = [] } = {})`
286
- - `hydrateCrudLookupRecords(records = [], runtime = {}, { include, mode = "list", repositoryOptions = {}, callOptions = {} } = {})`
266
+ - `buildCrudLookupRuntime(resource, { outputKeys, context })`
267
+ - `hydrateCrudLookupRecords(records, runtime, { include, mode, repositoryOptions, callOptions })`
268
+ - `type LookupRuntime`
287
269
  Local functions
288
- - `normalizeLookupRelationEntry(entry = {}, outputKeys = new Set())`
270
+ - `normalizeLookupRelationEntry(entry, outputKeys)`
289
271
  - `normalizeLookupDefaultInclude(value)`
290
272
  - `normalizeLookupMaxDepth(value)`
291
- - `resolveLookupRuntimeDefaults(resource = {})`
273
+ - `resolveLookupRuntimeDefaults(resource)`
292
274
  - `normalizeLookupIdentifier(value)`
293
- - `normalizeIncludePaths(include, { defaultInclude = DEFAULT_LOOKUP_INCLUDE } = {})`
294
- - `resolveChildIncludeFromPaths(paths = [])`
295
- - `shouldHydrateByMode(entry = {}, mode = "list")`
296
- - `buildLookupHydrationPlan(runtime = {}, include, { mode = "list", context = "crudRepository", includeWasExplicit = false, skippedNamespaces = new Set() } = {})`
297
- - `resolveLookupResolver(repositoryOptions = {}, callOptions = {}, { context = "crudRepository" } = {})`
298
- - `resolveLookupDepthRuntime(runtime = {}, repositoryOptions = {}, callOptions = {})`
299
- - `buildLookupGroupKey(relation = {})`
300
- - `normalizeLookupRelationValues(records = [], entries = [], childIncludeByKey = {})`
301
- - `resolveGroupChildInclude(group = {})`
302
- - `normalizeLookup(provider, relation = {}, { context = "crudRepository" } = {})`
303
- - `resolveLookupOwnershipFilter(provider = {}, { context = "crudRepository" } = {})`
304
- - `resolveLookupVisibilityContext(provider = {}, relation = {}, callOptions = {}, { context = "crudRepository" } = {})`
305
- - `buildLookupRecordMap(records = [], valueKey = "")`
306
- - `buildLookupCollectionMap(records = [], foreignKey = "")`
307
- - `resolveLookupVisitedNamespaces(runtime = {}, callOptions = {})`
275
+ - `normalizeIncludePaths(include, defaultInclude)`
276
+ - `resolveChildIncludeFromPaths(paths)`
277
+ - `shouldHydrateByMode(entry, mode)`
278
+ - `buildLookupHydrationPlan(runtime, include, { mode, includeWasExplicit, skippedNamespaces })`
279
+ - `resolveLookupResolver(repositoryOptions, callOptions, { context })`
280
+ - `resolveLookupDepthRuntime(runtime, repositoryOptions, callOptions)`
281
+ - `buildLookupGroupKey(relation)`
282
+ - `normalizeLookupRelationValues(records, entries, childIncludeByKey)`
283
+ - `resolveGroupChildInclude(group)`
284
+ - `normalizeLookup(provider, relation, { context })`
285
+ - `resolveLookupVisibilityContext(provider, relation, callOptions, { context })`
286
+ - `buildLookupRecordMap(records, valueKey)`
287
+ - `buildLookupCollectionMap(records, foreignKey)`
288
+ - `resolveLookupVisitedNamespaces(runtime, callOptions)`
289
+
290
+ ### `src/server/resourceRuntime/operationStages.js`
291
+ Exports
292
+ - `applyCrudRepositoryVirtualProjections(dbQuery, runtime, { knex, tableName })`
293
+ - `applyConfiguredQueryStage(dbQuery, stage, stageContext, { context, stageKey })`
294
+ - `applyConfiguredObjectStage(payload, stage, stageContext, { context, stageKey })`
295
+ - `buildCrudRepositoryActionContextBase(runtime, callOptions)`
296
+ Local functions
297
+ - `isCrudRepositoryQueryBuilder(value)`
298
+
299
+ ### `src/server/resourceRuntime/recordValidation.js`
300
+ Exports
301
+ - `normalizeRepositoryInputPayload(runtime, payload, operationKey)`
302
+ - `normalizeRepositoryOutputRecord(runtime, record, { operation })`
308
303
 
309
304
  ### `src/server/routeContracts.js`
310
305
  Exports
311
- - `createCrudJsonApiRouteContracts({ resource = {}, routeParamsValidator = null, operations = ["list", "view", "create", "update", "delete"], operationInputs = {}, listSearchQueryValidator = defaultListSearchQueryValidator, lookupIncludeQueryValidator = defaultLookupIncludeQueryValidator, listFilterQueryValidator = null } = {})`
306
+ - `createCrudJsonApiRouteContracts({ // readable-check: allow dependency-default - data: a resource definition resource = {}, routeParamsValidator = null, operations = ["list", "view", "create", "update", "delete"], operationInputs = {}, listSearchQueryValidator = defaultListSearchQueryValidator, lookupIncludeQueryValidator = defaultLookupIncludeQueryValidator, // readable-check: allow dependency-default - data: an optional input schema listFilterQueryValidator = null } = {})`
312
307
  - `resolveJsonApiRelationshipEntries`
313
308
  Local functions
314
- - `isRecord(value)`
315
309
  - `readOwnValue(source = {}, key = "")`
316
- - `resolveLookupContainer(record = {}, lookupContainerKey = "")`
310
+ - `resolveLookupContainer(record, lookupContainerKey = "")`
317
311
  - `resolveRelationshipValueSource(record = {}, entry = {}, { lookupContainerKey = "", preferLookup = false } = {})`
318
- - `normalizeLookupId(value)`
319
312
  - `normalizeRelationshipIdentifierId(value = null)`
320
- - `createRelationshipIdentifier(entry = {}, value = null)`
313
+ - `buildRelationshipIdentifier(entry = {}, value = null)`
321
314
  - `createRecordAttributesResolver(definition = null, { excludeKeys = [] } = {})`
322
315
  - `createRecordRelationshipsResolver(definition = null, { lookupContainerKey = "" } = {})`
323
316
  - `createRequestRelationshipMapper(definition = null)`
324
- - `resolveOutputAttributeExcludeKeys(resource = {})`
325
- - `resolveLookupContainerKey(resource = {})`
317
+ - `resolveOutputAttributeExcludeKeys(resource)`
326
318
  - `normalizeIncludedLookupRecord(source = null, fallbackId = null)`
327
319
  - `appendIncludedRelationshipResource({ included = [], seen = new Set(), entry = {}, lookupRecord = null, fallbackId = null } = {})`
328
320
  - `createLookupIncludedResolver(definition = null, { lookupContainerKey = "" } = {})`
329
321
 
330
322
  ### `src/server/serviceEvents.js`
331
323
  Exports
332
- - `createCrudServiceEvents(resource = {}, { context = "crudService" } = {})`
333
- - `createCrudJsonApiServiceEvents(namespace = "", { context = "createCrudJsonApiServiceEvents" } = {})`
334
- - `resolveCrudEntityIdFromArgs({ args = [] } = {})`
335
- - `resolveCrudEntityIdFromResult({ result } = {})`
324
+ - `buildCrudRecordChangedEvent({ namespace, operation, entityId, audience })`
336
325
  - `resolveCrudJsonApiEntityIdFromResult({ result } = {})`
337
- Local functions
338
- - `normalizeCrudEventEntityId(value = null)`
339
326
 
340
327
  ### `src/server/serviceMethods.js`
341
328
  Exports
@@ -346,9 +333,26 @@ Exports
346
333
  - `crudServiceUpdateRecord(runtime, repository, fieldAccess = {}, recordId, payload = {}, options = {})`
347
334
  - `crudServiceDeleteRecord(runtime, repository, fieldAccess = {}, recordId, options = {})`
348
335
  Local functions
349
- - `requireCrudServiceRepository(runtime = {}, repository = null)`
350
336
  - `splitCrudListRepositoryCall(query = {}, options = {})`
351
337
 
338
+ ### `src/server/types.js`
339
+ Exports
340
+ - `type CrudResourceDefinition`
341
+ - `type CrudRepository`
342
+ - `type CrudService`
343
+ - `type CrudJsonApiResult`
344
+ - `type CrudScope`
345
+ - `type CrudResourceApi`
346
+ - `type CrudCustomActionInvocation`
347
+ - `type CrudLifecycleContext`
348
+ - `type CrudLifecycleHooks`
349
+ - `type CrudOperationLifecycle`
350
+ - `type CrudRecordRepository`
351
+ - `type CompiledCrudRepositoryRuntime`
352
+ - `type CrudLookupRepository`
353
+ - `type CrudFieldAccess`
354
+ - `type CrudServiceRuntime`
355
+
352
356
  ### patterns
353
357
 
354
358
  ### `patterns/json-api-resource-package/example/migrations/20260815000000_books.cjs`
@@ -359,6 +363,10 @@ Exports
359
363
  Exports
360
364
  - `BooksFeature`
361
365
 
366
+ ### `patterns/json-api-resource-package/example/packages/books/src/server/types.js`
367
+ Exports
368
+ - `type AppBooks`
369
+
362
370
  ### `patterns/json-api-resource-package/example/packages/books/src/shared/bookResource.js`
363
371
  Exports
364
372
  - `bookResource`
@@ -25,12 +25,10 @@ Exports
25
25
  ### `src/shared/dialect.js`
26
26
  Exports
27
27
  - `DIALECT_ID`
28
- - `getDialectId()`
29
28
 
30
29
  ### `src/shared/index.js`
31
30
  Exports
32
31
  - `DIALECT_ID`
33
- - `getDialectId`
34
32
  - `introspectCrudTableSnapshot`
35
33
 
36
34
  ### `src/shared/introspectCrudTable.js`
@@ -25,12 +25,10 @@ Exports
25
25
  ### `src/shared/dialect.js`
26
26
  Exports
27
27
  - `DIALECT_ID`
28
- - `getDialectId()`
29
28
 
30
29
  ### `src/shared/index.js`
31
30
  Exports
32
31
  - `DIALECT_ID`
33
- - `getDialectId`
34
32
 
35
33
  ### patterns
36
34
 
@@ -14,31 +14,55 @@ Use this on demand; do not load the full index at startup.
14
14
 
15
15
  ### src
16
16
 
17
+ ### `src/server/database.js`
18
+ Exports
19
+ - `createDatabase({ driver, env })`
20
+ Local functions
21
+ - `resolveDriverDialectId(driver)`
22
+
17
23
  ### `src/server/databaseSetup.js`
18
24
  Exports
19
- - `prepareDatabaseFromApp({ client, appRoot = process.cwd(), environment = process.env, migrationsDirectory = "migrations", seed } = {})`
20
- - `runDatabaseSetup({ knex, seed, appRoot = process.cwd(), environment = process.env } = {})`
25
+ - `prepareDatabaseFromApp({ client, appRoot = process.cwd(), environment, migrationsDirectory = "migrations", seed })`
26
+ - `runDatabaseSetup({ knex, seed, appRoot = process.cwd(), environment })`
21
27
  Local functions
22
28
  - `normalizeMigrationResult(result)`
23
29
 
30
+ ### `src/server/foreignKeyMigrations.js`
31
+ Exports
32
+ - `addMissingForeignKey(knex, key)`
33
+ - `dropForeignKeyIfPresent(knex, key)`
34
+ - `hasForeignKey(knex, key)`
35
+ - `type ForeignKey`
36
+ Local functions
37
+ - `findForeignKeyName(knex, { tableName, columnName, parentTable, parentColumn = "id" })`
38
+
24
39
  ### `src/server/knexFactory.js`
25
40
  Exports
26
41
  - `loadKnexFactory()`
27
42
 
28
43
  ### `src/server/knexMigrationConfig.js`
29
44
  Exports
30
- - `createKnexMigrationConfig({ client, environment = process.env, appRoot = process.cwd(), migrationsDirectory = "migrations", packageMigrationDirectories = [] } = {})`
31
- - `createKnexMigrationConfigFromApp(options = {})`
45
+ - `createKnexMigrationConfig({ client, environment, appRoot = process.cwd(), migrationsDirectory = "migrations", // readable-check: allow dependency-default - data: a list of directory paths, not a collaborator packageMigrationDirectories = [], // readable-check: allow dependency-default - data: a list of directory paths, not a collaborator packageConstraintDirectories = [] })`
46
+ - `createKnexMigrationConfigFromApp(options)`
32
47
  - `discoverPackageMigrationDirectories({ appRoot = process.cwd() } = {})`
33
48
  Local functions
34
49
  - `directoryExists(directory)`
50
+ - `migrationsAfterOf({ packageId, packageMetadata }, installedPackageIds)`
51
+ - `orderPackageMigrationDirectories(directories, packageIdOf, afterOf)`
52
+ - `packageConstraintDirectoriesOf(packageMigrationDirectories)`
35
53
 
36
54
  ### `src/server/providers/DatabaseProvider.js`
37
55
  Exports
38
56
  - `DatabaseProvider`
39
- Local functions
40
- - `resolveDriverDialectId(driver)`
41
- - `createDatabase({ driver, env })`
57
+
58
+ ### `src/server/types.js`
59
+ Exports
60
+ - `type RuntimeDatabase`
61
+ - `type RuntimeKnex`
62
+ - `type RuntimeTransactionManager`
63
+ - `type RuntimeKnexTransaction`
64
+ - `type RuntimeKnexQueryBuilder`
65
+ - `type RuntimeDatabaseDriver`
42
66
 
43
67
  ### `src/shared/databaseClient.js`
44
68
  Exports
@@ -82,6 +106,7 @@ Exports
82
106
  Exports
83
107
  - `findDuplicateEntryError(error, { dialect = "", client = null } = {})`
84
108
  - `isDuplicateEntryError(error, options)`
109
+ - `isLostDuplicateInsertRace(error, options)`
85
110
  Local functions
86
111
  - `isMysqlDuplicateEntryError(error)`
87
112
  - `isPostgresDuplicateEntryError(error)`
@@ -101,9 +126,11 @@ Exports
101
126
  - `toKnexClientId`
102
127
  - `findDuplicateEntryError`
103
128
  - `isDuplicateEntryError`
129
+ - `isLostDuplicateInsertRace`
104
130
  - `DEFAULT_VISIBILITY_COLUMNS`
105
131
  - `applyVisibility`
106
132
  - `applyVisibilityOwners`
133
+ - `resolveTransaction`
107
134
  - `resolveQueryOptions`
108
135
  - `resolveRepoClient`
109
136
  - `applyForUpdate`
@@ -118,11 +145,13 @@ Exports
118
145
  - `retryDeadlocks`
119
146
  - `runInTransaction`
120
147
  - `createWithTransaction`
148
+ - `joinOrOpenTransaction`
121
149
  - `lockScopedRecordId`
122
150
 
123
151
  ### `src/shared/repositoryOptions.js`
124
152
  Exports
125
- - `resolveQueryOptions(options = {})`
153
+ - `resolveTransaction(options)`
154
+ - `resolveQueryOptions(options)`
126
155
  - `resolveRepoClient(dbClient, options = {})`
127
156
  - `applyForUpdate(query, options = {})`
128
157
  - `parseJsonObject(value, fallback = {})`
@@ -136,14 +165,14 @@ Exports
136
165
  - `retryDeadlocks(run, { retries = 3 } = {})`
137
166
  - `runInTransaction(knex, callback, options = {})`
138
167
  - `createWithTransaction(knex)`
168
+ - `joinOrOpenTransaction(options, withTransaction, work)`
139
169
  - `lockScopedRecordId({ trx, tableName, recordId, scopeId, idColumn = "id", scopeColumn = "workspace_id" } = {})`
140
170
  Local functions
141
171
  - `requireSqlIdentifier(value, label)`
142
172
 
143
173
  ### `src/shared/transactionManager.js`
144
174
  Exports
145
- - `TransactionManager`
146
- - `createTransactionManager(options = {})`
175
+ - `createTransactionManager({ knex })`
147
176
 
148
177
  ### `src/shared/visibility.js`
149
178
  Exports