@jskit-ai/agent-docs 0.1.15 → 0.1.17

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 (35) hide show
  1. package/guide/agent/app-extras/assistant.md +2 -2
  2. package/guide/agent/app-setup/initial-scaffolding.md +1 -3
  3. package/guide/agent/app-setup/multi-homing.md +21 -0
  4. package/guide/agent/generators/advanced-cruds.md +208 -110
  5. package/guide/agent/generators/crud-generators.md +4 -0
  6. package/guide/agent/index.md +1 -1
  7. package/package.json +1 -1
  8. package/patterns/INDEX.md +1 -1
  9. package/patterns/client-requests.md +3 -0
  10. package/patterns/crud-repository-mapping.md +45 -23
  11. package/patterns/filters.md +8 -8
  12. package/reference/autogen/KERNEL_MAP.md +94 -40
  13. package/reference/autogen/README.md +3 -0
  14. package/reference/autogen/packages/assistant-core.md +0 -12
  15. package/reference/autogen/packages/assistant-runtime.md +11 -3
  16. package/reference/autogen/packages/auth-core.md +34 -23
  17. package/reference/autogen/packages/auth-provider-supabase-core.md +4 -7
  18. package/reference/autogen/packages/auth-web.md +3 -0
  19. package/reference/autogen/packages/console-core.md +6 -29
  20. package/reference/autogen/packages/crud-core.md +35 -28
  21. package/reference/autogen/packages/crud-server-generator.md +28 -50
  22. package/reference/autogen/packages/crud-ui-generator.md +12 -7
  23. package/reference/autogen/packages/http-runtime.md +171 -21
  24. package/reference/autogen/packages/json-rest-api-core.md +54 -0
  25. package/reference/autogen/packages/kernel.md +118 -55
  26. package/reference/autogen/packages/realtime.md +1 -0
  27. package/reference/autogen/packages/resource-core.md +35 -0
  28. package/reference/autogen/packages/resource-crud-core.md +51 -0
  29. package/reference/autogen/packages/shell-web.md +31 -0
  30. package/reference/autogen/packages/users-core.md +34 -77
  31. package/reference/autogen/packages/users-web.md +29 -20
  32. package/reference/autogen/packages/workspaces-core.md +44 -76
  33. package/reference/autogen/packages/workspaces-web.md +1 -3
  34. package/reference/autogen/tooling/jskit-cli.md +5 -4
  35. package/workflow/feature-delivery.md +2 -1
@@ -214,6 +214,9 @@ Exports
214
214
  ### `src/server/providers/AuthWebServiceProvider.js`
215
215
  Exports
216
216
  - `AuthWebServiceProvider`
217
+ Local functions
218
+ - `parseBoolean(value, fallback = false)`
219
+ - `resolveDevAuthBootstrapEnabled(scope)`
217
220
 
218
221
  ### `src/server/routes/authRoutes.js`
219
222
  Exports
@@ -14,6 +14,12 @@ Use this on demand; do not load the full index at startup.
14
14
 
15
15
  ### src
16
16
 
17
+ ### `src/server/consoleAuthServiceDecorator.js`
18
+ Exports
19
+ - `createConsoleAuthServiceDecorator({ consoleService } = {})`
20
+ Local functions
21
+ - `normalizeRequestPathname(request = null)`
22
+
17
23
  ### `src/server/consoleBootstrapContributor.js`
18
24
  Exports
19
25
  - `createConsoleBootstrapContributor({ consoleService } = {})`
@@ -39,7 +45,6 @@ Exports
39
45
  - `createRepository(knex)`
40
46
  Local functions
41
47
  - `nowDb()`
42
- - `mapSettings(row = {})`
43
48
  - `mapSingletonRow(row)`
44
49
 
45
50
  ### `src/server/consoleSettings/consoleSettingsService.js`
@@ -71,27 +76,9 @@ Local functions
71
76
  Exports
72
77
  - `createOperationMessages({ validationMessage = "Validation failed.", apiValidationMessage = validationMessage } = {})`
73
78
 
74
- ### `src/shared/resources/consoleSettingsFields.js`
75
- Exports
76
- - `defineField(field = {})`
77
- - `resetConsoleSettingsFields()`
78
- - `consoleSettingsFields`
79
-
80
79
  ### `src/shared/resources/consoleSettingsResource.js`
81
80
  Exports
82
81
  - `consoleSettingsResource`
83
- Local functions
84
- - `buildCreateSchema()`
85
- - `buildOutputSchema()`
86
- - `buildConsoleSettingsRecordSchema()`
87
- - `buildConsoleSettingsCreateSchema()`
88
- - `buildConsoleSettingsReplaceSchema()`
89
- - `buildConsoleSettingsPatchSchema()`
90
- - `normalizeConsoleSettingsInput(payload = {})`
91
-
92
- ### `src/shared/resources/resolveGlobalArrayRegistry.js`
93
- Exports
94
- - `resolveGlobalArrayRegistry(symbolKey)`
95
82
 
96
83
  ### templates
97
84
 
@@ -99,18 +86,8 @@ Exports
99
86
  Exports
100
87
  - None
101
88
 
102
- ### `templates/packages/main/src/shared/resources/consoleSettingsFields.js`
103
- Exports
104
- - None
105
-
106
89
  ### root
107
90
 
108
91
  ### `package.descriptor.mjs`
109
92
  Exports
110
93
  - None
111
-
112
- ### test-support
113
-
114
- ### `test-support/registerDefaultSettingsFields.js`
115
- Exports
116
- - None
@@ -117,7 +117,6 @@ Exports
117
117
  - `createCrudFieldAccessRuntime(resource = {}, { context = "crudFieldAccess" } = {})`
118
118
  - `createFieldAccessForRoleMatrix(matrix = {}, { context = "crudFieldAccess" } = {})`
119
119
  Local functions
120
- - `isSchemaNullable(schema = {})`
121
120
  - `normalizeFieldSet(value, { context = "crudFieldAccess", label = "field list" } = {})`
122
121
  - `resolveFieldSet(resolver, input = {}, { context = "crudFieldAccess", label = "field list" } = {})`
123
122
  - `resolveWriteMode(fieldAccess = {}, { context = "crudFieldAccess" } = {})`
@@ -132,21 +131,18 @@ Local functions
132
131
  Exports
133
132
  - `CRUD_LIST_FILTER_INVALID_VALUES_REJECT`
134
133
  - `CRUD_LIST_FILTER_INVALID_VALUES_DISCARD`
134
+ - `createCrudListFilterQueryField(filterDefinition = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
135
+ - `createCrudListFilterQuerySchema(structure = {})`
135
136
  - `createCrudListFilters(definitions = {}, { columns = {}, apply = {} } = {})`
136
137
  Local functions
137
- - `normalizeCrudListFilterInvalidValues(value = "")`
138
- - `createSingleOrMultiValueSchema(itemSchema)`
139
- - `firstValue(value)`
140
- - `normalizeDateFilterValue(value)`
141
- - `normalizeNumberFilterValue(value)`
142
- - `normalizeRecordIdFilterValue(value)`
143
- - `normalizeRecordIdFilterValues(value)`
144
- - `resolveAllowedOptionValues(filter = {})`
145
- - `normalizeAllowedTextValue(value, allowedValues = new Set())`
146
- - `normalizeAllowedTextValues(value, allowedValues = new Set())`
138
+ - `cloneTransportSchema(value)`
139
+ - `buildSingleOrMultiTransportSchema(itemSchema)`
147
140
  - `addDaysToDateFilterValue(value = "", days = 0)`
148
- - `createFilterQuerySchema(filter = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
149
- - `normalizeFilterValue(filter = {}, source = {})`
141
+ - `normalizeCrudListFilterQueryFieldInput(filterDefinition = null)`
142
+ - `buildFilterQueryFieldDefinition(filterDefinition = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
143
+ - `buildFilterQueryTransportSchema(filter = {}, { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
144
+ - `buildFilterQuerySchemaDefinition(filterEntries = [], { invalidValues = CRUD_LIST_FILTER_INVALID_VALUES_REJECT } = {})`
145
+ - `projectNormalizedFilterValues(filterEntries = [], source = {}, errors = {})`
150
146
  - `normalizeColumnsMap(columns = {})`
151
147
  - `applyDefaultFilterQuery(queryBuilder, filter = {}, value, column = "")`
152
148
 
@@ -211,16 +207,17 @@ Exports
211
207
  - `deriveRepositoryMappingFromResource(resource = {}, { context = "crudRepository" } = {})`
212
208
  - `applyCrudListQueryFilters(query, { idColumn = "id", cursor = "", applyCursor = true, q = "", searchColumns = [], parentFilters = {}, parentFilterColumns = {} } = {})`
213
209
  - `mapRecordRow(row, fieldKeys = [], overrides = {}, { recordIdKeys = [] } = {})`
214
- - `buildWritePayload(sourcePayload = {}, fieldKeys = [], overrides = {})`
210
+ - `buildWritePayload(sourcePayload = {}, fieldKeys = [], overrides = {}, { serializerByKey = {} } = {})`
215
211
  - `resolveColumnName(fieldKey, overrides = {})`
216
212
  - `resolveCrudIdColumn(idColumn, { fallback = "id" } = {})`
217
213
  - `buildRepositoryColumnMetadata({ outputKeys = [], writeKeys = [], columnOverrides = {}, fieldStorageByKey = {} } = {})`
218
214
  Local functions
219
- - `resolveOptionalObjectSchemaProperties(schema, options = {})`
220
- - `requireObjectSchemaProperties(schema, { context = "crudRepository", schemaLabel = "schema" } = {})`
221
- - `normalizeResourceFieldMetaEntries(fieldMeta = [])`
222
- - `schemaIncludesStringType(schema = {})`
223
- - `schemaIncludesRecordIdType(schema = {})`
215
+ - `resolveOptionalFieldDefinitions(definition, options = {})`
216
+ - `requireFieldDefinitions(definition, { context = "crudRepository", schemaLabel = "schema definition", defaultMode = "patch" } = {})`
217
+ - `resolveFieldDefinitionType(definition = {})`
218
+ - `definitionIncludesStringType(definition = {})`
219
+ - `definitionIncludesDateTimeType(definition = {})`
220
+ - `definitionIncludesRecordIdType(definition = {})`
224
221
 
225
222
  ### `src/server/resourceRuntime/index.js`
226
223
  Exports
@@ -236,7 +233,6 @@ Local functions
236
233
  - `normalizeListOrderNulls(value = LIST_ORDER_NULLS_LAST)`
237
234
  - `normalizeListOrderBy(orderBy = [], { idColumn = "id" } = {})`
238
235
  - `resolveListRuntimeConfig(list = {}, fallbackSearchColumns = [], { idColumn = "id" } = {})`
239
- - `formatOutputValidationError(issue = {})`
240
236
  - `resolveRecordOutputValidator(resource = {}, { context = "crudRepository" } = {})`
241
237
  - `resolveOperationBodyValidator(resource = {}, operationKey = "", { context = "crudRepository" } = {})`
242
238
  - `extractExplicitFieldErrors(error)`
@@ -297,9 +293,19 @@ Local functions
297
293
  - `buildLookupCollectionMap(records = [], foreignKey = "")`
298
294
  - `resolveLookupVisitedNamespaces(runtime = {}, callOptions = {})`
299
295
 
296
+ ### `src/server/routeContracts.js`
297
+ Exports
298
+ - `createCrudJsonApiRouteContracts({ resource = {}, routeParamsValidator = null, listSearchQueryValidator = defaultListSearchQueryValidator, lookupIncludeQueryValidator = defaultLookupIncludeQueryValidator } = {})`
299
+
300
300
  ### `src/server/serviceEvents.js`
301
301
  Exports
302
302
  - `createCrudServiceEvents(resource = {}, { context = "crudService" } = {})`
303
+ - `createCrudJsonApiServiceEvents(namespace = "", { context = "createCrudJsonApiServiceEvents" } = {})`
304
+ - `resolveCrudEntityIdFromArgs({ args = [] } = {})`
305
+ - `resolveCrudEntityIdFromResult({ result } = {})`
306
+ - `resolveCrudJsonApiEntityIdFromResult({ result } = {})`
307
+ Local functions
308
+ - `normalizeCrudEventEntityId(value = null)`
303
309
 
304
310
  ### `src/server/serviceMethods.js`
305
311
  Exports
@@ -313,22 +319,23 @@ Local functions
313
319
  - `requireCrudServiceRepository(runtime = {}, repository = null)`
314
320
  - `splitCrudListRepositoryCall(query = {}, options = {})`
315
321
 
316
- ### `src/shared/crudFieldMetaSupport.js`
322
+ ### `src/shared/crudFieldSupport.js`
317
323
  Exports
318
- - `CRUD_FIELD_REPOSITORY_STORAGE_COLUMN`
319
- - `CRUD_FIELD_REPOSITORY_STORAGE_VIRTUAL`
320
324
  - `CRUD_LOOKUP_FORM_CONTROL_AUTOCOMPLETE`
321
325
  - `CRUD_LOOKUP_FORM_CONTROL_SELECT`
322
326
  - `CRUD_RUNTIME_LOOKUPS_FIELD_KEY`
323
- - `checkCrudLookupFormControl(value, { context = "crud fieldMeta ui.formControl", defaultValue = CRUD_LOOKUP_FORM_CONTROL_AUTOCOMPLETE } = {})`
327
+ - `checkCrudLookupFormControl(value, { context = "crud field ui.formControl", defaultValue = CRUD_LOOKUP_FORM_CONTROL_AUTOCOMPLETE } = {})`
324
328
  - `isCrudRuntimeOutputOnlyFieldKey(value = "", { lookupContainerKey = CRUD_RUNTIME_LOOKUPS_FIELD_KEY } = {})`
325
- - `normalizeCrudFieldRepositoryConfig(fieldMetaEntry = {}, { context = "crud fieldMeta repository", fieldKey = "" } = {})`
326
329
 
327
330
  ### `src/shared/crudNamespaceSupport.js`
328
331
  Exports
329
- - `normalizeCrudNamespace(value = "")`
330
- - `requireCrudNamespace(namespace, { context = "requireCrudNamespace" } = {})`
331
- - `resolveCrudRecordChangedEvent(namespace = "")`
332
+ - `normalizeCrudNamespace`
333
+ - `requireCrudNamespace`
334
+ - `resolveCrudRecordChangedEvent`
335
+
336
+ ### `src/shared/crudResource.js`
337
+ Exports
338
+ - `defineCrudResource`
332
339
 
333
340
  ### root
334
341
 
@@ -18,12 +18,9 @@ Use this on demand; do not load the full index at startup.
18
18
  Exports
19
19
  - `buildTemplateContext(input = {})`
20
20
  - `resolveScaffoldColumns(snapshot)`
21
- - `renderPropertyAccess(sourceName, key)`
22
21
  - `resolveGenerationSnapshot({ appRoot, tableName, idColumnOption } = {})`
23
- - `renderResourceFieldSchema(column, { forOutput = false } = {})`
24
- - `renderInputNormalizer(column)`
25
- - `renderOutputNormalizerExpression(column)`
26
- - `buildFieldMetaEntries({ outputColumns = [], writableColumns = [], snapshot = {} } = {})`
22
+ - `renderCanonicalResourceFieldSchema(column, { fieldContractEntry = null } = {})`
23
+ - `buildFieldContractEntries({ outputColumns = [], writableColumns = [], snapshot = {} } = {})`
27
24
  - `resolveCrudGenerationSurfaceId({ appRoot, options } = {})`
28
25
  - `__testables`
29
26
  Local functions
@@ -53,17 +50,20 @@ Local functions
53
50
  - `resolveColumnNumericBounds(snapshot = {})`
54
51
  - `isIdentifier(value)`
55
52
  - `renderObjectPropertyKey(value)`
56
- - `renderIntegerSchema(column)`
57
- - `renderStringSchema(column, { forOutput = false } = {})`
58
- - `renderResourceValidatorsImport({ htmlTimeSchemaImports = [], recordIdValidatorImports = [] } = {})`
59
- - `resolveHtmlTimeSchemaImports(columns = [])`
60
- - `resolveRecordIdValidatorImports(...sources)`
61
- - `renderResourceSchemaPropertyLines(columns, { forOutput = false } = {})`
62
- - `renderResourceInputNormalizationLines(columns)`
63
- - `renderResourceOutputNormalizationLines(columns)`
64
- - `renderResourceDatabaseRuntimeImport({ needsToIsoString = false, needsToDatabaseDateTimeUtc = false } = {})`
65
- - `renderResourceJsonImport({ needsJson = false } = {})`
66
- - `renderResourceNormalizeSupportImport({ needsNormalizeText = false, needsNormalizeBoolean = false, needsNormalizeFiniteNumber = false, needsNormalizeFiniteInteger = false, needsNormalizeRecordId = false, needsNormalizeIfInSource = false, needsNormalizeIfPresent = false, needsNormalizeOrNull = false } = {})`
53
+ - `renderBoundedNumberEntries(column)`
54
+ - `resolveCanonicalResourceFieldRequired(column = {})`
55
+ - `renderCanonicalResourceOperations(column = {})`
56
+ - `renderCanonicalResourceSchemaPropertyLines(columns = [], { fieldContractEntries = [] } = {})`
57
+ - `resolveJsonRestRelationshipScopeName(fieldContractEntry = null)`
58
+ - `resolveJsonRestRelationshipAlias(column = null)`
59
+ - `resolveJsonRestFieldType(column = {})`
60
+ - `shouldRenderJsonRestSearch(column = {})`
61
+ - `shouldRenderJsonRestStorage(column = {})`
62
+ - `renderJsonRestFieldSchema(column, { fieldContractEntry = null } = {})`
63
+ - `renderJsonRestSchemaPropertyLines(columns = [], { fieldContractEntries = [] } = {})`
64
+ - `renderJsonRestSearchSchemaLines(columns = [])`
65
+ - `renderJsonRestDefaultSortLine(columns = [])`
66
+ - `renderResourceDefaultSortLiteral(columns = [])`
67
67
  - `renderMigrationDefaultClause(column)`
68
68
  - `renderMigrationSpecificStringType(column, { tableCollation = "" } = {})`
69
69
  - `renderTemporalColumnBuilder(column, methodName)`
@@ -82,9 +82,6 @@ Local functions
82
82
  - `toSelectOptionLabel(value)`
83
83
  - `normalizeFieldMetaUiOptions(rawOptions = [])`
84
84
  - `resolveEnumFieldMetaUiOptions(enumValues = [])`
85
- - `renderFieldMetaEntryLines(entry = {})`
86
- - `renderResourceFieldMetaPushLines(entries = [])`
87
- - `renderRepositoryListConfigLines(snapshot = {})`
88
85
  - `buildCrudPermissionIds(namespace = "")`
89
86
  - `normalizeCrudOperation(operation = "", context = "CRUD operation")`
90
87
  - `renderRoleCatalogPermissionGrants(namespace = "", { requiresNamedPermissions = true } = {})`
@@ -94,7 +91,9 @@ Local functions
94
91
  - `renderActionWorkspaceValidatorImport({ surfaceRequiresWorkspace = true } = {})`
95
92
  - `renderRouteParamsValidatorLine(operation = "", { surfaceRequiresWorkspace = true } = {})`
96
93
  - `renderRouteInputLines(operation = "", { surfaceRequiresWorkspace = true } = {})`
97
- - `renderActionInputValidatorExpression(operation = "", { surfaceRequiresWorkspace = true } = {})`
94
+ - `renderObjectSchemaDefinition(lines = [], { mode = "patch" } = {})`
95
+ - `renderActionInputExpressions({ surfaceRequiresWorkspace = true } = {})`
96
+ - `renderRouteValidatorConstants({ surfaceRequiresWorkspace = true } = {})`
98
97
  - `buildReplacementsFromSnapshot({ namespace = "", snapshot, resolvedOwnershipFilter, surfaceRequiresWorkspace = true, surfaceId = "" })`
99
98
  - `resolveCrudGenerationTableName(options = {})`
100
99
  - `createCacheKey({ appRoot, options })`
@@ -117,38 +116,26 @@ Local functions
117
116
  - `parseSubcommandArgs(args = [])`
118
117
  - `resolveRequestedTableConfig(source = "", options = {}, context = "crud-server-generator scaffold-field")`
119
118
  - `resolveColumnForField(snapshot = {}, fieldKey = "", { idColumn = "id" } = {})`
120
- - `buildFieldMetaEntry(snapshot = {}, column = {})`
121
- - `collectKnownIdentifiers(expression = "")`
122
- - `resolveImportsForField({ inputNormalizationExpression = "", outputNormalizationExpression = "" } = {})`
123
- - `resolveOutputNormalizationExpression(column = {})`
119
+ - `buildFieldContractEntry(snapshot = {}, column = {})`
124
120
 
125
121
  ### `src/server/subcommands/resourceAst.js`
126
122
  Exports
127
123
  - `resolveCrudResourceDefaults(source = "", context = "crud-server-generator scaffold-field")`
128
- - `applyCrudResourceFieldPatch(source = "", { fieldKey = "", outputSchemaExpression = "", createSchemaExpression = "", outputNormalizationExpression = "", inputNormalizationExpression = "", fieldMetaEntry = null, normalizeImportNames = [], databaseRuntimeImportNames = [], databaseRuntimeRepositoryOptionsImportNames = [], context = "crud-server-generator scaffold-field" } = {})`
124
+ - `applyCrudResourceFieldPatch(source = "", { fieldKey = "", resourceSchemaExpression = "", context = "crud-server-generator scaffold-field" } = {})`
129
125
  Local functions
130
126
  - `isIdentifierName(value = "")`
131
127
  - `parseModule(source = "", context = "crud-server-generator scaffold-field")`
132
128
  - `parseExpression(source = "", context = "crud-server-generator scaffold-field")`
133
- - `parseStatement(source = "", context = "crud-server-generator scaffold-field")`
134
129
  - `resolveNodeKeyName(keyNode, { computed = false } = {})`
135
130
  - `createObjectPropertyKeyNode(key = "")`
136
131
  - `findVariableDeclarator(programNode, variableName = "")`
137
132
  - `requireVariableDeclarator(programNode, variableName = "", context = "crud-server-generator scaffold-field")`
138
- - `requireSchemaPropertiesObject(programNode, variableName = "", context = "crud-server-generator scaffold-field")`
139
- - `requireObjectFreezePayloadObject(programNode, variableName = "", context = "crud-server-generator scaffold-field")`
133
+ - `requireCrudResourceConfigObject(programNode, context = "crud-server-generator scaffold-field")`
134
+ - `requireResourceSchemaObject(programNode, context = "crud-server-generator scaffold-field")`
140
135
  - `findObjectPropertyByName(objectNode, propertyName = "")`
141
- - `requireNormalizeFunctionBody(programNode, variableName = "", context = "crud-server-generator scaffold-field")`
142
- - `requireNormalizedObjectLiteral(functionBody, context = "crud-server-generator scaffold-field")`
143
136
  - `hasObjectProperty(objectNode, propertyName = "")`
144
137
  - `insertObjectProperty(objectNode, propertyName = "", valueExpressionSource = "", { context = "crud-server-generator scaffold-field", insertBeforeComputed = false } = {})`
145
- - `hasNormalizeIfInSourceCall(functionBody, fieldKey = "")`
146
- - `resolveReturnNormalizedIndex(functionBody)`
147
- - `hasResourceFieldMetaEntry(programNode, fieldKey = "")`
148
- - `sortImportSpecifiers(importDeclaration)`
149
- - `ensureNamedImport(programNode, modulePath = "", importName = "")`
150
138
  - `resolveObjectPropertyStringValue(objectNode, propertyName = "")`
151
- - `renderResourceFieldMetaPushStatement(entry = {})`
152
139
 
153
140
  ### `src/shared/crud/crudResource.js`
154
141
  Exports
@@ -168,15 +155,9 @@ Exports
168
155
  Exports
169
156
  - None
170
157
 
171
- ### `templates/src/local-package/server/actionIds.js`
172
- Exports
173
- - `actionIds`
174
-
175
158
  ### `templates/src/local-package/server/actions.js`
176
159
  Exports
177
- - `createActions({ surface = "" } = {})`
178
- Local functions
179
- - `requireActionSurface(surface = "")`
160
+ - `createActions({ surface } = {})`
180
161
 
181
162
  ### `templates/src/local-package/server/CrudProvider.js`
182
163
  Exports
@@ -184,22 +165,19 @@ Exports
184
165
  Local functions
185
166
  - `resolveCrudPolicyFromApp(app)`
186
167
 
187
- ### `templates/src/local-package/server/listConfig.js`
188
- Exports
189
- - `LIST_CONFIG`
190
-
191
168
  ### `templates/src/local-package/server/registerRoutes.js`
192
169
  Exports
193
170
  - `registerRoutes(app, { routeOwnershipFilter = "public", routeSurface = "", routeRelativePath = "" } = {})`
194
171
 
195
172
  ### `templates/src/local-package/server/repository.js`
196
173
  Exports
197
- - `createRepository(knex, options = {})`
174
+ - `createRepository({ api, knex } = {})`
198
175
 
199
176
  ### `templates/src/local-package/server/service.js`
200
177
  Exports
201
- - `createService({ ${option:namespace|camel}Repository, fieldAccess = DEFAULT_FIELD_ACCESS } = {})`
202
- - `serviceEvents`
178
+ - `createService({ ${option:namespace|camel}Repository } = {})`
179
+ Local functions
180
+ - `return404IfNotFound(document = null)`
203
181
 
204
182
  ### `templates/src/local-package/shared/crudResource.js`
205
183
  Exports
@@ -40,7 +40,7 @@ Local functions
40
40
  - `buildLookupFormPropDefinitions({ createFields = [], editFields = [] } = {})`
41
41
  - `filterDefaultHiddenListFields(selectedFieldKeys, fields, { recordIdFieldKey = "" } = {})`
42
42
  - `ensureFields(fields, fallbackFields = createFieldDefinitions({}))`
43
- - `resolveViewTitleFallbackFieldKey(fields = [])`
43
+ - `resolveViewTitleFallbackFieldKey(fields = [], { recordIdFieldKey = "" } = {})`
44
44
  - `resolveResourceNamespace(resource = {}, pageTarget = {}, options = {})`
45
45
  - `resolveResourceLabels(namespace = "", pageTarget = {})`
46
46
  - `resolveTargetRootRelativeRoutePath(pageTarget = {})`
@@ -57,12 +57,12 @@ Exports
57
57
  - `resolveOperationRealtimeEvents(operation = {}, { defaultEvents = [], context = "ui-generator" } = {})`
58
58
  - `requireOutputSchema(operation, operationName, { context = "ui-generator" } = {})`
59
59
  - `requireBodySchema(operation, operationName, { context = "ui-generator" } = {})`
60
- - `requireObjectProperties(schema, contextLabel, { context = "ui-generator" } = {})`
60
+ - `requireObjectProperties(schema, contextLabel, { context = "ui-generator", rootSchema = schema } = {})`
61
61
  - `resolveListItemProperties(listOutputSchema, { context = "ui-generator" } = {})`
62
62
  - `resolveLookupContainerKey(resource = {}, { context = "ui-generator" } = {})`
63
- - `buildResourceFieldMetaMap(resource = {})`
64
- - `createFieldDefinitions(properties = {}, { fieldMetaMap = {}, lookupContainerKey = "lookups" } = {})`
65
- - `createFormFieldDefinitions(properties = {}, { fieldMetaMap = {}, lookupContainerKey = "lookups", parentRouteParamKey = "" } = {})`
63
+ - `buildResourceFieldContractMap(resource = {})`
64
+ - `createFieldDefinitions(properties = {}, { fieldContractMap = {}, lookupContainerKey = "lookups" } = {})`
65
+ - `createFormFieldDefinitions(properties = {}, { fieldContractMap = {}, lookupContainerKey = "lookups", parentRouteParamKey = "" } = {})`
66
66
  - `resolveNearestParentRouteParamKey(routePath = "", { recordIdParam = "recordId" } = {})`
67
67
  - `buildListHeaderColumns(fields = [])`
68
68
  - `buildListRowColumns(fields = [])`
@@ -74,18 +74,23 @@ Exports
74
74
  - `resolveRecordIdExpression(fields = [])`
75
75
  Local functions
76
76
  - `normalizeRealtimeEventList(events = [])`
77
+ - `resolveOperationTransportSchema(definition, { context = "ui-generator", defaultMode = "replace", label = "schema definition" } = {})`
77
78
  - `resolveUnionSchemaVariant(schema = {})`
79
+ - `decodeJsonPointerSegment(segment = "")`
80
+ - `resolveSchemaReference(ref = "", rootSchema = {}, { context = "ui-generator", contextLabel = "schema" } = {})`
81
+ - `resolveObjectSchema(schema = {}, contextLabel, { context = "ui-generator", rootSchema = schema } = {})`
82
+ - `resolveJsonRestCastType(schema = {})`
78
83
  - `resolveSchemaType(schema)`
79
84
  - `toFieldLabel(key)`
80
85
  - `isSupportedSelectOptionValue(value)`
81
86
  - `toSelectOptionLabel(value)`
82
87
  - `toSelectOptionIdentity(value)`
83
- - `normalizeFieldUiOptions(rawOptions, { context = "resource fieldMeta ui.options" } = {})`
88
+ - `normalizeFieldUiOptions(rawOptions, { context = "resource field ui.options" } = {})`
84
89
  - `stripLookupIdSuffix(key = "")`
85
90
  - `resolveFieldLabel(key = "", relation = null)`
86
91
  - `extractDynamicRouteParamKeys(routePath = "")`
87
92
  - `normalizeLookupRelation(relation = {})`
88
- - `toLookupRelation(fieldMetaMap = {}, fieldKey = "", { lookupContainerKey = "lookups" } = {})`
93
+ - `toLookupRelation(fieldContractMap = {}, fieldKey = "", { lookupContainerKey = "lookups" } = {})`
89
94
  - `resolveFormInputType(fieldType, fieldFormat)`
90
95
  - `resolveFormFieldComponent(fieldType, relation = null)`
91
96
  - `buildDefaultNullableBooleanOptions()`
@@ -69,6 +69,8 @@ Local functions
69
69
  - `resolveUnsafeMethods(value)`
70
70
  - `resolveFetch()`
71
71
  - `isObjectBody(value)`
72
+ - `isQueryValuePresent(value)`
73
+ - `appendRequestQueryToUrl(url, query = null, transport = null)`
72
74
  - `parseJsonSafely(response)`
73
75
  - `emitNdjsonLine(line, handlers)`
74
76
  - `readNdjsonStream(response, handlers = {})`
@@ -95,6 +97,24 @@ Exports
95
97
  - `hasHeader`
96
98
  - `setHeaderIfMissing`
97
99
 
100
+ ### `src/shared/clientRuntime/jsonApiResourceTransport.js`
101
+ Exports
102
+ - `JSON_API_CONTENT_TYPE`
103
+ - `isJsonApiResourceTransport(transport = null)`
104
+ - `normalizeJsonApiClientTransport(transport = null)`
105
+ - `encodeJsonApiResourceRequestBody(body, transport = null)`
106
+ - `encodeJsonApiResourceQuery(query, transport = null)`
107
+ - `decodeJsonApiResourceResponse(payload, transport = null)`
108
+ - `decodeJsonApiErrorFieldErrors(payload = {})`
109
+ - `createJsonApiClientErrorPayload(payload = {})`
110
+ Local functions
111
+ - `isRecord(value)`
112
+ - `normalizeTransportKind(transport = null)`
113
+ - `defaultEncodeAttributes(body = {})`
114
+ - `simplifyResourceObject(resource = {})`
115
+ - `assertPrimaryDataType(resource = {}, expectedType = "")`
116
+ - `resolveCollectionPageMeta(document = {})`
117
+
98
118
  ### `src/shared/clientRuntime/retry.js`
99
119
  Exports
100
120
  - `DEFAULT_RETRYABLE_CSRF_ERROR_CODES`
@@ -105,14 +125,16 @@ Local functions
105
125
  ### `src/shared/index.js`
106
126
  Exports
107
127
  - `createPaginationQuerySchema`
108
- - `registerTypeBoxFormats`
109
- - `__testables`
110
- - `fieldErrorsSchema`
128
+ - `fieldErrorsFieldDefinition`
111
129
  - `apiErrorDetailsSchema`
112
- - `apiErrorResponseSchema`
113
- - `apiValidationErrorResponseSchema`
114
- - `fastifyDefaultErrorResponseSchema`
130
+ - `apiValidationErrorDetailsSchema`
131
+ - `apiErrorOutputValidator`
132
+ - `apiValidationErrorOutputValidator`
133
+ - `apiErrorTransportSchema`
134
+ - `apiValidationErrorTransportSchema`
135
+ - `fastifyDefaultErrorTransportSchema`
115
136
  - `STANDARD_ERROR_STATUS_CODES`
137
+ - `createTransportResponseSchema`
116
138
  - `passthroughErrorResponses`
117
139
  - `withStandardErrorResponses`
118
140
  - `enumSchema`
@@ -127,6 +149,44 @@ Exports
127
149
  - `mapOperationIssues`
128
150
  - `validateOperationSection`
129
151
  - `validateOperationInput`
152
+ - `JSON_API_CONTENT_TYPE`
153
+ - `createJsonApiDocument`
154
+ - `createJsonApiErrorDocumentFromFailure`
155
+ - `createJsonApiErrorObject`
156
+ - `createJsonApiResourceObject`
157
+ - `isJsonApiCollectionDocument`
158
+ - `isJsonApiContentType`
159
+ - `isJsonApiErrorDocument`
160
+ - `isJsonApiResourceDocument`
161
+ - `isJsonContentType`
162
+ - `normalizeJsonApiDocument`
163
+ - `normalizeJsonApiResourceObject`
164
+ - `resolveJsonApiTransportTypes`
165
+ - `simplifyJsonApiDocument`
166
+ - `returnJsonApiData`
167
+ - `returnJsonApiDocument`
168
+ - `returnJsonApiMeta`
169
+ - `isJsonApiResult`
170
+ - `isJsonApiDataResult`
171
+ - `isJsonApiDocumentResult`
172
+ - `isJsonApiMetaResult`
173
+ - `unwrapJsonApiResult`
174
+ - `JSON_API_QUERY_PAGE_CURSOR_KEY`
175
+ - `JSON_API_QUERY_PAGE_LIMIT_KEY`
176
+ - `JSON_API_QUERY_INCLUDE_KEY`
177
+ - `JSON_API_QUERY_SORT_KEY`
178
+ - `mapPlainQueryKeyToTransportKey`
179
+ - `mapTransportQueryKeyToPlainKey`
180
+ - `encodeJsonApiResourceQueryObject`
181
+ - `decodeJsonApiResourceQueryObject`
182
+ - `createJsonApiResourceQueryTransportSchema`
183
+ - `JSON_API_ERROR_DOCUMENT_SCHEMA`
184
+ - `createJsonApiResourceObjectTransportSchema`
185
+ - `createJsonApiResourceRequestBodyTransportSchema`
186
+ - `createJsonApiResourceSuccessTransportSchema`
187
+ - `withJsonApiErrorResponses`
188
+ - `createJsonApiResourceRouteTransport`
189
+ - `createJsonApiResourceRouteContract`
130
190
 
131
191
  ### `src/shared/providers/singletonApiProvider.js`
132
192
  Exports
@@ -144,12 +204,16 @@ Exports
144
204
 
145
205
  ### `src/shared/validators/errorResponses.js`
146
206
  Exports
147
- - `fieldErrorsSchema`
207
+ - `fieldErrorsFieldDefinition`
148
208
  - `apiErrorDetailsSchema`
149
- - `apiErrorResponseSchema`
150
- - `apiValidationErrorResponseSchema`
151
- - `fastifyDefaultErrorResponseSchema`
209
+ - `apiValidationErrorDetailsSchema`
210
+ - `apiErrorOutputValidator`
211
+ - `apiValidationErrorOutputValidator`
212
+ - `apiErrorTransportSchema`
213
+ - `apiValidationErrorTransportSchema`
214
+ - `fastifyDefaultErrorTransportSchema`
152
215
  - `STANDARD_ERROR_STATUS_CODES`
216
+ - `createTransportResponseSchema(schema = {})`
153
217
  - `passthroughErrorResponses(successResponses)`
154
218
  - `withStandardErrorResponses(successResponses, { includeValidation400 = false } = {})`
155
219
  - `enumSchema(values)`
@@ -158,6 +222,94 @@ Exports
158
222
  Exports
159
223
  - `HTTP_VALIDATORS_API`
160
224
 
225
+ ### `src/shared/validators/jsonApiQueryTransport.js`
226
+ Exports
227
+ - `JSON_API_QUERY_PAGE_CURSOR_KEY`
228
+ - `JSON_API_QUERY_PAGE_LIMIT_KEY`
229
+ - `JSON_API_QUERY_INCLUDE_KEY`
230
+ - `JSON_API_QUERY_SORT_KEY`
231
+ - `mapPlainQueryKeyToTransportKey(key = "", { responseType = "" } = {})`
232
+ - `mapTransportQueryKeyToPlainKey(key = "", { responseType = "" } = {})`
233
+ - `encodeJsonApiResourceQueryObject(query = {}, { responseType = "" } = {})`
234
+ - `decodeJsonApiResourceQueryObject(query = {}, { responseType = "" } = {})`
235
+ - `createJsonApiResourceQueryTransportSchema({ query, responseType = "" } = {})`
236
+ Local functions
237
+ - `isRecord(value)`
238
+ - `normalizeQueryKey(key = "")`
239
+ - `buildFieldsTransportKey(responseType = "")`
240
+ - `normalizeTransportQueryScalar(value)`
241
+
242
+ ### `src/shared/validators/jsonApiResponses.js`
243
+ Exports
244
+ - `simplifyJsonApiDocument`
245
+
246
+ ### `src/shared/validators/jsonApiResult.js`
247
+ Exports
248
+ - `JSON_API_RESULT_MARKER`
249
+ - `returnJsonApiData(data)`
250
+ - `returnJsonApiDocument(document)`
251
+ - `returnJsonApiMeta(meta)`
252
+ - `isJsonApiResult(value)`
253
+ - `isJsonApiDataResult(value)`
254
+ - `isJsonApiDocumentResult(value)`
255
+ - `isJsonApiMetaResult(value)`
256
+ - `unwrapJsonApiResult(value)`
257
+ Local functions
258
+ - `normalizeJsonApiResultKind(kind = "")`
259
+ - `createJsonApiResult(kind, value)`
260
+ - `isJsonApiResultKind(value, kind)`
261
+
262
+ ### `src/shared/validators/jsonApiRouteTransport.js`
263
+ Exports
264
+ - `JSON_API_ERROR_DOCUMENT_SCHEMA`
265
+ - `createJsonApiResourceObjectTransportSchema({ type = "", attributes, requireId = true, includeLinks = false, includeMeta = false } = {})`
266
+ - `createJsonApiResourceRequestBodyTransportSchema({ type = "", attributes, requireId = false } = {})`
267
+ - `createJsonApiResourceSuccessTransportSchema({ type = "", attributes, kind = "record", includeLinks = false, includeMeta = false, includeIncluded = false } = {})`
268
+ - `withJsonApiErrorResponses(successResponses, { includeValidation400 = false } = {})`
269
+ - `createJsonApiResourceRouteTransport({ type = "", requestType = "", responseType = "", query = null, allowBodyId = false, successKind = "record", pointerPrefix = "/data/attributes", mapRequestRelationships = null, getRecordType = null, getRecordId = null, getRecordAttributes = null, getRecordRelationships = null, getRecordLinks = null, getRecordMeta = null, getIncluded = null, getDocumentLinks = null, getDocumentMeta = null, getCollectionItems = null } = {})`
270
+ - `createJsonApiResourceRouteContract({ type = "", requestType = "", responseType = "", body = null, query = null, output = null, outputKind = "record", successStatus = 200, includeValidation400 = false, allowBodyId = false, pointerPrefix = "/data/attributes", getRecordType = null, getRecordId = null, getRecordAttributes = null, getRecordRelationships = null, getRecordLinks = null, getRecordMeta = null, getIncluded = null, getDocumentLinks = null, getDocumentMeta = null, getCollectionItems = null, mapRequestRelationships = null } = {})`
271
+ Local functions
272
+ - `isRecord(value)`
273
+ - `createJsonApiTransportError(statusCode, message, code)`
274
+ - `resolveRouteType(type = "")`
275
+ - `resolveRouteTypes(value = {})`
276
+ - `resolveEmbeddedAttributesTransportSchema(definition, { context = "JSON:API resource", defaultMode = "replace", removeId = false } = {})`
277
+ - `createJsonApiMetaSuccessTransportSchema({ meta } = {})`
278
+ - `defaultRecordTypeResolver(type)`
279
+ - `defaultRecordIdResolver(record = {})`
280
+ - `defaultRecordAttributesResolver(record = {})`
281
+ - `defaultCollectionItemsResolver(payload)`
282
+ - `defaultCollectionMetaResolver(payload)`
283
+ - `assertJsonApiSuccessResult(payload)`
284
+
285
+ ### `src/shared/validators/jsonApiTransport.js`
286
+ Exports
287
+ - `JSON_API_CONTENT_TYPE`
288
+ - `resolveJsonApiTransportTypes({ type = "", requestType = "", responseType = "" } = {}, { context = "JSON:API transport" } = {})`
289
+ - `createJsonApiDocument({ data = undefined, included = undefined, links = undefined, meta = undefined, errors = undefined } = {})`
290
+ - `createJsonApiErrorDocumentFromFailure({ statusCode = 500, code = "", message = "", fieldErrors = {}, validationIssues = [], validationContext = "", pointerPrefix = "/data/attributes" } = {})`
291
+ - `createJsonApiErrorObject({ status = "", code = "", title = "", detail = "", source = undefined, links = undefined, meta = undefined } = {})`
292
+ - `createJsonApiResourceObject({ type = "", id = null, attributes = undefined, relationships = undefined, links = undefined, meta = undefined } = {})`
293
+ - `isJsonApiCollectionDocument(payload = {})`
294
+ - `isJsonApiContentType(contentType = "")`
295
+ - `isJsonApiErrorDocument(payload = {})`
296
+ - `isJsonApiResourceDocument(payload = {})`
297
+ - `isJsonContentType(contentType = "")`
298
+ - `normalizeJsonApiDocument(payload = {})`
299
+ - `normalizeJsonApiResourceObject(resource = {})`
300
+ - `simplifyJsonApiDocument(payload = {})`
301
+ Local functions
302
+ - `isRecord(value)`
303
+ - `normalizeMediaType(contentType = "")`
304
+ - `normalizeJsonApiResourceArray(value)`
305
+ - `normalizeJsonApiLinks(value)`
306
+ - `normalizeJsonApiMeta(value)`
307
+ - `normalizeJsonApiErrors(value)`
308
+ - `escapeJsonPointerSegment(value = "")`
309
+ - `resolveValidationFieldName(issue = {})`
310
+ - `resolveJsonApiValidationSource(issue = {}, validationContext = "")`
311
+ - `simplifyJsonApiResourceObject(resource = {})`
312
+
161
313
  ### `src/shared/validators/operationMessages.js`
162
314
  Exports
163
315
  - `resolveSchemaMessages(schema = {})`
@@ -178,11 +330,13 @@ Local functions
178
330
 
179
331
  ### `src/shared/validators/operationValidation.js`
180
332
  Exports
181
- - `validateOperationSection({ operation = {}, section = "bodyValidator", value, context = {} } = {})`
333
+ - `validateOperationSection({ operation = {}, section = "body", value, context = {} } = {})`
182
334
  - `validateOperationInput({ operation = {}, input = {}, context = {} } = {})`
183
335
  Local functions
184
- - `defaultNormalize(value)`
185
- - `resolveOperationSection(operation = {}, section = "bodyValidator")`
336
+ - `resolveOperationSection(operation = {}, section = "body")`
337
+ - `buildValidationSuccessResult(value)`
338
+ - `isFieldValidationError(error)`
339
+ - `buildValidationFailureResult(error, normalized)`
186
340
 
187
341
  ### `src/shared/validators/paginationQuery.js`
188
342
  Exports
@@ -195,16 +349,12 @@ Exports
195
349
 
196
350
  ### `src/shared/validators/schemaUtils.js`
197
351
  Exports
198
- - `asSchema(value, label)`
352
+ - `asSchemaDefinition(value, label, defaultMode, { required = true } = {})`
199
353
 
200
- ### `src/shared/validators/typeboxFormats.js`
354
+ ### `src/shared/validators/transportSchemaEmbedding.js`
201
355
  Exports
202
- - `registerTypeBoxFormats()`
203
- - `__testables`
204
- Local functions
205
- - `isStrictUuid(value)`
206
- - `isStrictIsoUtcDateTime(value)`
207
- - `registerTypeBoxFormatsWith(formatRegistry)`
356
+ - `rewriteEmbeddedTransportSchemaRefs(value, { rootRef = "#", definitionRefByName = {} } = {})`
357
+ - `createEmbeddableTransportSchemaDocument(schemaDocument = {}, rootDefinitionName = "TransportSchema")`
208
358
 
209
359
  ### root
210
360