ultimabase 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +4 -2
- package/dist/access.d.ts +62 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +258 -0
- package/dist/adapter-errors.d.ts +43 -0
- package/dist/adapter-errors.d.ts.map +1 -0
- package/dist/adapter-errors.js +72 -0
- package/dist/adapter-json.d.ts +20 -0
- package/dist/adapter-json.d.ts.map +1 -0
- package/dist/adapter-json.js +2 -0
- package/dist/adapter-migrations.d.ts +90 -0
- package/dist/adapter-migrations.d.ts.map +1 -0
- package/dist/adapter-migrations.js +1 -0
- package/dist/adapter.d.ts +333 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +5 -0
- package/dist/aggregate.d.ts +31 -0
- package/dist/aggregate.d.ts.map +1 -0
- package/dist/aggregate.js +99 -0
- package/dist/app-internals.d.ts +10 -0
- package/dist/app-internals.d.ts.map +1 -0
- package/dist/app-internals.js +12 -0
- package/dist/app-options.d.ts +22 -0
- package/dist/app-options.d.ts.map +1 -0
- package/dist/app-options.js +3 -0
- package/dist/cascade.d.ts +47 -0
- package/dist/cascade.d.ts.map +1 -0
- package/dist/cascade.js +209 -0
- package/dist/cli-config.d.ts +6 -0
- package/dist/cli-config.d.ts.map +1 -0
- package/dist/cli-config.js +45 -0
- package/dist/cli-deploy.d.ts +14 -0
- package/dist/cli-deploy.d.ts.map +1 -0
- package/dist/cli-deploy.js +193 -0
- package/dist/cli-main.d.ts +16 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +151 -0
- package/dist/cli-migrate.d.ts +20 -0
- package/dist/cli-migrate.d.ts.map +1 -0
- package/dist/cli-migrate.js +105 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/complete.d.ts +13 -0
- package/dist/complete.d.ts.map +1 -0
- package/dist/complete.js +60 -0
- package/dist/console-logger.d.ts +3 -0
- package/dist/console-logger.d.ts.map +1 -0
- package/dist/console-logger.js +62 -0
- package/dist/create-many.d.ts +7 -0
- package/dist/create-many.d.ts.map +1 -0
- package/dist/create-many.js +88 -0
- package/dist/decimal.d.ts +23 -0
- package/dist/decimal.d.ts.map +1 -0
- package/dist/decimal.js +50 -0
- package/dist/define-app.d.ts +59 -0
- package/dist/define-app.d.ts.map +1 -0
- package/dist/define-app.js +5 -0
- package/dist/define-enum.d.ts +6 -0
- package/dist/define-enum.d.ts.map +1 -0
- package/dist/define-enum.js +18 -0
- package/dist/define-function.d.ts +25 -0
- package/dist/define-function.d.ts.map +1 -0
- package/dist/define-function.js +111 -0
- package/dist/define-model.d.ts +48 -0
- package/dist/define-model.d.ts.map +1 -0
- package/dist/define-model.js +85 -0
- package/dist/definition.d.ts +179 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +165 -0
- package/dist/delete-many.d.ts +13 -0
- package/dist/delete-many.d.ts.map +1 -0
- package/dist/delete-many.js +58 -0
- package/dist/engine.d.ts +16 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +174 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +43 -0
- package/dist/exact.d.ts +20 -0
- package/dist/exact.d.ts.map +1 -0
- package/dist/exact.js +1 -0
- package/dist/feed.d.ts +6 -0
- package/dist/feed.d.ts.map +1 -0
- package/dist/feed.js +33 -0
- package/dist/field-codec.d.ts +11 -0
- package/dist/field-codec.d.ts.map +1 -0
- package/dist/field-codec.js +48 -0
- package/dist/field-rules.d.ts +57 -0
- package/dist/field-rules.d.ts.map +1 -0
- package/dist/field-rules.js +1 -0
- package/dist/field-type.d.ts +51 -0
- package/dist/field-type.d.ts.map +1 -0
- package/dist/field-type.js +106 -0
- package/dist/fields.d.ts +295 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +1 -0
- package/dist/function.d.ts +126 -0
- package/dist/function.d.ts.map +1 -0
- package/dist/function.js +1 -0
- package/dist/functions.d.ts +18 -0
- package/dist/functions.d.ts.map +1 -0
- package/dist/functions.js +99 -0
- package/dist/group-by.d.ts +10 -0
- package/dist/group-by.d.ts.map +1 -0
- package/dist/group-by.js +145 -0
- package/dist/group-having.d.ts +8 -0
- package/dist/group-having.d.ts.map +1 -0
- package/dist/group-having.js +97 -0
- package/dist/hooks.d.ts +41 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +149 -0
- package/dist/hosts.d.ts +3 -0
- package/dist/hosts.d.ts.map +1 -0
- package/dist/hosts.js +8 -0
- package/dist/identify.d.ts +15 -0
- package/dist/identify.d.ts.map +1 -0
- package/dist/identify.js +71 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/internal.d.ts +28 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +39 -0
- package/dist/lifecycle.d.ts +21 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +149 -0
- package/dist/list-update.d.ts +12 -0
- package/dist/list-update.d.ts.map +1 -0
- package/dist/list-update.js +52 -0
- package/dist/live.d.ts +37 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +139 -0
- package/dist/manifest.d.ts +11 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +60 -0
- package/dist/memory-aggregate.d.ts +7 -0
- package/dist/memory-aggregate.d.ts.map +1 -0
- package/dist/memory-aggregate.js +107 -0
- package/dist/memory-conditions.d.ts +8 -0
- package/dist/memory-conditions.d.ts.map +1 -0
- package/dist/memory-conditions.js +82 -0
- package/dist/memory-draft.d.ts +34 -0
- package/dist/memory-draft.d.ts.map +1 -0
- package/dist/memory-draft.js +255 -0
- package/dist/memory-json.d.ts +6 -0
- package/dist/memory-json.d.ts.map +1 -0
- package/dist/memory-json.js +86 -0
- package/dist/memory-read.d.ts +45 -0
- package/dist/memory-read.d.ts.map +1 -0
- package/dist/memory-read.js +244 -0
- package/dist/memory-search.d.ts +16 -0
- package/dist/memory-search.d.ts.map +1 -0
- package/dist/memory-search.js +110 -0
- package/dist/memory-values.d.ts +23 -0
- package/dist/memory-values.d.ts.map +1 -0
- package/dist/memory-values.js +82 -0
- package/dist/memory.d.ts +4 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +157 -0
- package/dist/migrate.d.ts +22 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +131 -0
- package/dist/model.d.ts +239 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +1 -0
- package/dist/nested-write.d.ts +64 -0
- package/dist/nested-write.d.ts.map +1 -0
- package/dist/nested-write.js +274 -0
- package/dist/number-update.d.ts +18 -0
- package/dist/number-update.d.ts.map +1 -0
- package/dist/number-update.js +96 -0
- package/dist/plugin-app.d.ts +48 -0
- package/dist/plugin-app.d.ts.map +1 -0
- package/dist/plugin-app.js +230 -0
- package/dist/plugin-code.d.ts +17 -0
- package/dist/plugin-code.d.ts.map +1 -0
- package/dist/plugin-code.js +125 -0
- package/dist/plugin-use.d.ts +22 -0
- package/dist/plugin-use.d.ts.map +1 -0
- package/dist/plugin-use.js +161 -0
- package/dist/plugin.d.ts +357 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +17 -0
- package/dist/query-aggregate.d.ts +82 -0
- package/dist/query-aggregate.d.ts.map +1 -0
- package/dist/query-aggregate.js +1 -0
- package/dist/query-args.d.ts +41 -0
- package/dist/query-args.d.ts.map +1 -0
- package/dist/query-args.js +263 -0
- package/dist/query-bulk.d.ts +35 -0
- package/dist/query-bulk.d.ts.map +1 -0
- package/dist/query-bulk.js +1 -0
- package/dist/query-conditions.d.ts +9 -0
- package/dist/query-conditions.d.ts.map +1 -0
- package/dist/query-conditions.js +46 -0
- package/dist/query-context.d.ts +32 -0
- package/dist/query-context.d.ts.map +1 -0
- package/dist/query-context.js +55 -0
- package/dist/query-filter.d.ts +46 -0
- package/dist/query-filter.d.ts.map +1 -0
- package/dist/query-filter.js +1 -0
- package/dist/query-group.d.ts +82 -0
- package/dist/query-group.d.ts.map +1 -0
- package/dist/query-group.js +1 -0
- package/dist/query-json.d.ts +9 -0
- package/dist/query-json.d.ts.map +1 -0
- package/dist/query-json.js +66 -0
- package/dist/query-order.d.ts +15 -0
- package/dist/query-order.d.ts.map +1 -0
- package/dist/query-order.js +115 -0
- package/dist/query-project.d.ts +15 -0
- package/dist/query-project.d.ts.map +1 -0
- package/dist/query-project.js +45 -0
- package/dist/query-search.d.ts +24 -0
- package/dist/query-search.d.ts.map +1 -0
- package/dist/query-search.js +2 -0
- package/dist/query-values.d.ts +28 -0
- package/dist/query-values.d.ts.map +1 -0
- package/dist/query-values.js +91 -0
- package/dist/query-where.d.ts +46 -0
- package/dist/query-where.d.ts.map +1 -0
- package/dist/query-where.js +200 -0
- package/dist/query-write.d.ts +14 -0
- package/dist/query-write.d.ts.map +1 -0
- package/dist/query-write.js +260 -0
- package/dist/query.d.ts +254 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +1 -0
- package/dist/record.d.ts +257 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +1 -0
- package/dist/recorder.d.ts +32 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +152 -0
- package/dist/relation-write.d.ts +41 -0
- package/dist/relation-write.d.ts.map +1 -0
- package/dist/relation-write.js +112 -0
- package/dist/relations.d.ts +42 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +119 -0
- package/dist/rules.d.ts +97 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +71 -0
- package/dist/running.d.ts +29 -0
- package/dist/running.d.ts.map +1 -0
- package/dist/running.js +39 -0
- package/dist/schema-indexes.d.ts +11 -0
- package/dist/schema-indexes.d.ts.map +1 -0
- package/dist/schema-indexes.js +59 -0
- package/dist/schema-virtuals.d.ts +19 -0
- package/dist/schema-virtuals.d.ts.map +1 -0
- package/dist/schema-virtuals.js +100 -0
- package/dist/schema.d.ts +35 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +267 -0
- package/dist/scope.d.ts +46 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +82 -0
- package/dist/scratch.d.ts +14 -0
- package/dist/scratch.d.ts.map +1 -0
- package/dist/scratch.js +10 -0
- package/dist/serve.d.ts +2 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +4 -0
- package/dist/symbols.d.ts +10 -0
- package/dist/symbols.d.ts.map +1 -0
- package/dist/symbols.js +1 -0
- package/dist/transaction.d.ts +28 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +156 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/update-many.d.ts +7 -0
- package/dist/update-many.d.ts.map +1 -0
- package/dist/update-many.js +182 -0
- package/dist/uuid.d.ts +7 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +48 -0
- package/dist/validation.d.ts +24 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +72 -0
- package/dist/virtual-read.d.ts +9 -0
- package/dist/virtual-read.d.ts.map +1 -0
- package/dist/virtual-read.js +145 -0
- package/dist/virtual.d.ts +142 -0
- package/dist/virtual.d.ts.map +1 -0
- package/dist/virtual.js +1 -0
- package/dist/write-context.d.ts +46 -0
- package/dist/write-context.d.ts.map +1 -0
- package/dist/write-context.js +102 -0
- package/dist/write-data.d.ts +26 -0
- package/dist/write-data.d.ts.map +1 -0
- package/dist/write-data.js +144 -0
- package/dist/write-plan.d.ts +107 -0
- package/dist/write-plan.d.ts.map +1 -0
- package/dist/write-plan.js +170 -0
- package/dist/write-target.d.ts +17 -0
- package/dist/write-target.d.ts.map +1 -0
- package/dist/write-target.js +59 -0
- package/dist/writes.d.ts +23 -0
- package/dist/writes.d.ts.map +1 -0
- package/dist/writes.js +246 -0
- package/dist/writing.d.ts +10 -0
- package/dist/writing.d.ts.map +1 -0
- package/dist/writing.js +66 -0
- package/package.json +42 -3
- package/src/access.ts +329 -0
- package/src/adapter-errors.ts +89 -0
- package/src/adapter-json.ts +21 -0
- package/src/adapter-migrations.ts +98 -0
- package/src/adapter.ts +363 -0
- package/src/aggregate.ts +136 -0
- package/src/app-internals.ts +26 -0
- package/src/app-options.ts +24 -0
- package/src/cascade.ts +297 -0
- package/src/cli-config.ts +45 -0
- package/src/cli-deploy.ts +235 -0
- package/src/cli-main.ts +165 -0
- package/src/cli-migrate.ts +143 -0
- package/src/cli.ts +5 -0
- package/src/complete.ts +73 -0
- package/src/console-logger.ts +87 -0
- package/src/create-many.ts +126 -0
- package/src/decimal.ts +74 -0
- package/src/define-app.ts +108 -0
- package/src/define-enum.ts +26 -0
- package/src/define-function.ts +188 -0
- package/src/define-model.ts +220 -0
- package/src/definition.ts +352 -0
- package/src/delete-many.ts +76 -0
- package/src/engine.ts +281 -0
- package/src/errors.ts +97 -0
- package/src/exact.ts +49 -0
- package/src/feed.ts +39 -0
- package/src/field-codec.ts +72 -0
- package/src/field-rules.ts +77 -0
- package/src/field-type.ts +219 -0
- package/src/fields.ts +383 -0
- package/src/function.ts +143 -0
- package/src/functions.ts +154 -0
- package/src/group-by.ts +186 -0
- package/src/group-having.ts +143 -0
- package/src/hooks.ts +215 -0
- package/src/hosts.ts +11 -0
- package/src/identify.ts +95 -0
- package/src/index.ts +125 -0
- package/src/internal.ts +68 -0
- package/src/lifecycle.ts +214 -0
- package/src/list-update.ts +71 -0
- package/src/live.ts +199 -0
- package/src/manifest.ts +71 -0
- package/src/memory-aggregate.ts +162 -0
- package/src/memory-conditions.ts +88 -0
- package/src/memory-draft.ts +319 -0
- package/src/memory-json.ts +91 -0
- package/src/memory-read.ts +311 -0
- package/src/memory-search.ts +149 -0
- package/src/memory-values.ts +106 -0
- package/src/memory.ts +173 -0
- package/src/migrate.ts +152 -0
- package/src/model.ts +312 -0
- package/src/nested-write.ts +390 -0
- package/src/number-update.ts +142 -0
- package/src/plugin-app.ts +308 -0
- package/src/plugin-code.ts +158 -0
- package/src/plugin-use.ts +217 -0
- package/src/plugin.ts +400 -0
- package/src/query-aggregate.ts +96 -0
- package/src/query-args.ts +375 -0
- package/src/query-bulk.ts +53 -0
- package/src/query-conditions.ts +53 -0
- package/src/query-context.ts +104 -0
- package/src/query-filter.ts +54 -0
- package/src/query-group.ts +137 -0
- package/src/query-json.ts +90 -0
- package/src/query-order.ts +158 -0
- package/src/query-project.ts +73 -0
- package/src/query-search.ts +31 -0
- package/src/query-values.ts +131 -0
- package/src/query-where.ts +318 -0
- package/src/query-write.ts +360 -0
- package/src/query.ts +400 -0
- package/src/record.ts +379 -0
- package/src/recorder.ts +212 -0
- package/src/relation-write.ts +176 -0
- package/src/relations.ts +165 -0
- package/src/rules.ts +188 -0
- package/src/running.ts +62 -0
- package/src/schema-indexes.ts +88 -0
- package/src/schema-virtuals.ts +134 -0
- package/src/schema.ts +367 -0
- package/src/scope.ts +123 -0
- package/src/scratch.ts +28 -0
- package/src/serve.ts +5 -0
- package/src/symbols.ts +11 -0
- package/src/transaction.ts +211 -0
- package/src/types.ts +79 -0
- package/src/update-many.ts +268 -0
- package/src/uuid.ts +51 -0
- package/src/validation.ts +107 -0
- package/src/virtual-read.ts +198 -0
- package/src/virtual.ts +187 -0
- package/src/write-context.ts +170 -0
- package/src/write-data.ts +188 -0
- package/src/write-plan.ts +273 -0
- package/src/write-target.ts +92 -0
- package/src/writes.ts +361 -0
- package/src/writing.ts +93 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// `defineFunction` and `defineType` (D-27, D-109): a server operation, its
|
|
2
|
+
// access rule checked and its input validated on each `run` (D-75), and the
|
|
3
|
+
// named objects its output may hold.
|
|
4
|
+
import { refused } from './access.js';
|
|
5
|
+
import { describedBy, functionDefinitions, nameOf, nullable, outputOf, typeDefinitions, withOnce, } from './definition.js';
|
|
6
|
+
import { entriesOf } from './plugin-use.js';
|
|
7
|
+
import { callerOf } from './engine.js';
|
|
8
|
+
import { PublicError, Refused } from './errors.js';
|
|
9
|
+
import { isObject } from './query-where.js';
|
|
10
|
+
import { isMaster } from './rules.js';
|
|
11
|
+
import { current } from './running.js';
|
|
12
|
+
import { checked, standardOf } from './validation.js';
|
|
13
|
+
export function defineType(definition) {
|
|
14
|
+
const { fields } = definition;
|
|
15
|
+
const name = nameOf(definition.name, 'defineType');
|
|
16
|
+
const description = describedBy(definition.description, name);
|
|
17
|
+
if (!isObject(fields) || Object.keys(fields).length === 0) {
|
|
18
|
+
throw new Refused(`${name}: fields is an object of one output or more.`);
|
|
19
|
+
}
|
|
20
|
+
const outputs = new Map();
|
|
21
|
+
for (const [field, value] of Object.entries(fields)) {
|
|
22
|
+
outputs.set(field, outputOf(value, `${name}.${field}`));
|
|
23
|
+
}
|
|
24
|
+
const recorded = { name, description, fields: outputs };
|
|
25
|
+
const type = Object.freeze({
|
|
26
|
+
name,
|
|
27
|
+
nullable: () => nullable({ kind: 'type', type: recorded }),
|
|
28
|
+
});
|
|
29
|
+
typeDefinitions.set(type, recorded);
|
|
30
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the value holds the name and `nullable`; its fields are a type only.
|
|
31
|
+
return type;
|
|
32
|
+
}
|
|
33
|
+
/** Closed to all but Master by default (D-04); the rule reads the caller. */
|
|
34
|
+
function allowed(record, caller, app) {
|
|
35
|
+
if (isMaster(caller))
|
|
36
|
+
return;
|
|
37
|
+
const rule = isObject(record.rules) ? record.rules['access'] : undefined;
|
|
38
|
+
if (rule !== undefined && typeof rule !== 'function') {
|
|
39
|
+
throw new TypeError(`${record.name}: access is a function.`);
|
|
40
|
+
}
|
|
41
|
+
const result = rule === undefined ? false : Reflect.apply(rule, undefined, [{ caller }]);
|
|
42
|
+
if (typeof result !== 'boolean') {
|
|
43
|
+
throw new TypeError(`${record.name}: access returns a boolean.`);
|
|
44
|
+
}
|
|
45
|
+
if (result)
|
|
46
|
+
return;
|
|
47
|
+
const { name } = record;
|
|
48
|
+
throw refused({ function: name }, `${name} refused.`, caller, app.logger);
|
|
49
|
+
}
|
|
50
|
+
/** `run`'s call, the input first when the function takes one; a transport
|
|
51
|
+
* passes its client (D-113). */
|
|
52
|
+
export async function called(value, record, args, client) {
|
|
53
|
+
const app = current();
|
|
54
|
+
if (app?.functions.get(value) !== record) {
|
|
55
|
+
throw new Error(`${record.name} is not a function of a started application.`);
|
|
56
|
+
}
|
|
57
|
+
const { input: schema, name } = record;
|
|
58
|
+
const [input, options] = schema === undefined ? [undefined, args[0]] : [args[0], args[1]];
|
|
59
|
+
const identity = callerOf(options, name);
|
|
60
|
+
return app.work.run(async () => {
|
|
61
|
+
const caller = await app.complete(identity);
|
|
62
|
+
allowed(record, caller, app);
|
|
63
|
+
const facts = { caller, client };
|
|
64
|
+
const standard = standardOf(schema);
|
|
65
|
+
if (standard !== undefined) {
|
|
66
|
+
const result = await checked(standard, input, [], name);
|
|
67
|
+
if ('issues' in result) {
|
|
68
|
+
throw new PublicError('VALIDATION_FAILED', 'Invalid input.', {
|
|
69
|
+
details: { issues: result.issues },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
facts['input'] = result.value;
|
|
73
|
+
}
|
|
74
|
+
const output = await Reflect.apply(record.run, undefined, [
|
|
75
|
+
Object.freeze(facts),
|
|
76
|
+
]);
|
|
77
|
+
return record.output === undefined ? undefined : output;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
export function defineFunction(definition) {
|
|
81
|
+
const { query = false, input, output, run } = definition;
|
|
82
|
+
const name = nameOf(definition.name, 'defineFunction');
|
|
83
|
+
const description = describedBy(definition.description, name);
|
|
84
|
+
if (typeof query !== 'boolean')
|
|
85
|
+
throw new Refused(`${name}: query is a boolean.`);
|
|
86
|
+
if (input !== undefined && standardOf(input) === undefined) {
|
|
87
|
+
throw new Refused(`${name}: input is a Standard Schema.`);
|
|
88
|
+
}
|
|
89
|
+
if (typeof run !== 'function')
|
|
90
|
+
throw new Refused(`${name}: run is a function.`);
|
|
91
|
+
const record = {
|
|
92
|
+
name,
|
|
93
|
+
description,
|
|
94
|
+
query,
|
|
95
|
+
input,
|
|
96
|
+
output: output === undefined ? undefined : outputOf(output, `${name}.output`),
|
|
97
|
+
uses: entriesOf(name, definition.use ?? []),
|
|
98
|
+
run,
|
|
99
|
+
rules: undefined,
|
|
100
|
+
};
|
|
101
|
+
const fn = Object.freeze({
|
|
102
|
+
name,
|
|
103
|
+
input,
|
|
104
|
+
output,
|
|
105
|
+
with: withOnce(name, record, () => fn),
|
|
106
|
+
run: async (...args) => called(fn, record, args),
|
|
107
|
+
});
|
|
108
|
+
functionDefinitions.set(fn, record);
|
|
109
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the value ServerFunction describes; its types follow the definition.
|
|
110
|
+
return fn;
|
|
111
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { FieldBuilders } from './fields.ts';
|
|
2
|
+
import type { FieldShape, IndexCheck, IndexShape, Model, RecordCheck, UniqueIndexFields } from './model.ts';
|
|
3
|
+
import type { ForModel, ModelUse, PluginTypes } from './plugin.ts';
|
|
4
|
+
type CommandFn<U, F> = U extends ModelUse<string, infer T> ? T extends {
|
|
5
|
+
readonly commands: object;
|
|
6
|
+
} ? (value: ForModel<T, F>['commands']) => void : never : never;
|
|
7
|
+
type Commands<U, F> = [CommandFn<U, F>] extends [never] ? unknown : CommandFn<U, F> extends (value: infer I) => void ? I : unknown;
|
|
8
|
+
/** Each used plugin's key of `.with`, typed by the model's fields. */
|
|
9
|
+
type WithKeys<U, F> = {
|
|
10
|
+
readonly [V in U as V extends ModelUse<infer P, infer T> ? T extends {
|
|
11
|
+
readonly with: object | false;
|
|
12
|
+
} ? P : never : never]?: V extends ModelUse<string, infer T extends {
|
|
13
|
+
readonly with: object | false;
|
|
14
|
+
}> ? ForModel<T, F>['with'] : never;
|
|
15
|
+
};
|
|
16
|
+
/** The types of the plugins in a model's `use`. */
|
|
17
|
+
type UsedTypes<U> = U extends ModelUse<string, infer T> ? T : never;
|
|
18
|
+
type AddFn<U> = U extends ModelUse<string, infer T> ? T extends {
|
|
19
|
+
readonly addedFields: infer A;
|
|
20
|
+
} ? (value: A) => void : never : never;
|
|
21
|
+
type Added<U> = [AddFn<U>] extends [never] ? unknown : AddFn<U> extends (value: infer I) => void ? I : unknown;
|
|
22
|
+
type AllFields<F, U> = [Added<U>] extends [unknown] ? unknown extends Added<U> ? F : F & Added<U> : F & Added<U>;
|
|
23
|
+
/** A model's fields, as `fields` returns them. */
|
|
24
|
+
export type FieldShapes = {
|
|
25
|
+
readonly [field: string]: FieldShape;
|
|
26
|
+
};
|
|
27
|
+
/** The `fields` callback: its builders know the plugins of `use` (D-12, D-57). */
|
|
28
|
+
export type ModelFields<F, U extends readonly ModelUse<string, PluginTypes>[]> = (fields: FieldBuilders<UsedTypes<U[number]>>) => F & NoInfer<RecordCheck<F>>;
|
|
29
|
+
/**
|
|
30
|
+
* The model a declaration with these fields and plugins builds; a plugin's
|
|
31
|
+
* `define<Kind>` returns it with its own entry in `U` (D-13).
|
|
32
|
+
*/
|
|
33
|
+
export type ModelOf<N extends string, F, U extends readonly ModelUse<string, PluginTypes>[], X extends readonly IndexShape[] = []> = Model<N, AllFields<F, U[number]>, U[number]['plugin'], WithKeys<U[number], AllFields<F, U[number]>>, UniqueIndexFields<X>> & Commands<U[number], AllFields<F, U[number]>>;
|
|
34
|
+
/** `indexes`, whose fields are checked against the model's (D-52). */
|
|
35
|
+
export type ModelIndexes<X, F, U extends readonly ModelUse<string, PluginTypes>[]> = X & NoInfer<IndexCheck<X, AllFields<F, U[number]>>>;
|
|
36
|
+
export declare function defineModel<const N extends string, const F extends FieldShapes, const U extends readonly ModelUse<string, PluginTypes>[] = [], const X extends readonly IndexShape[] = []>(definition: {
|
|
37
|
+
readonly name: N;
|
|
38
|
+
/** What the model means, which the transports show (D-150). */
|
|
39
|
+
readonly description?: string;
|
|
40
|
+
/** The stored table's or collection's name (D-63). */
|
|
41
|
+
readonly dbName?: string;
|
|
42
|
+
readonly use?: U;
|
|
43
|
+
/** The only form (D-12). */
|
|
44
|
+
readonly fields: ModelFields<F, U>;
|
|
45
|
+
readonly indexes?: ModelIndexes<X, F, U>;
|
|
46
|
+
}): ModelOf<N, F, U, X>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=define-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-model.d.ts","sourceRoot":"","sources":["../src/define-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// `defineModel` (D-07, D-12): the fields its callback and its plugins build,
|
|
2
|
+
// recorded for `start`, and the model value whose methods run the queries
|
|
3
|
+
// (D-18) and its plugins' commands (D-89).
|
|
4
|
+
import { describedBy, fieldBuilders, modelDefinitions, nameOf, nullable, withOnce, } from './definition.js';
|
|
5
|
+
import { query } from './engine.js';
|
|
6
|
+
import { addFields, usedBy } from './plugin-use.js';
|
|
7
|
+
import { Refused } from './errors.js';
|
|
8
|
+
export function defineModel(definition) {
|
|
9
|
+
const model = createModel({
|
|
10
|
+
name: definition.name,
|
|
11
|
+
description: definition.description,
|
|
12
|
+
dbName: definition.dbName,
|
|
13
|
+
use: definition.use ?? [],
|
|
14
|
+
fields: definition.fields,
|
|
15
|
+
indexes: definition.indexes ?? [],
|
|
16
|
+
});
|
|
17
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- createModel builds the value ModelOf describes; the types follow the definition.
|
|
18
|
+
return model;
|
|
19
|
+
}
|
|
20
|
+
const operations = [
|
|
21
|
+
'findMany',
|
|
22
|
+
'findFirst',
|
|
23
|
+
'findUnique',
|
|
24
|
+
'findFirstOrThrow',
|
|
25
|
+
'findUniqueOrThrow',
|
|
26
|
+
'count',
|
|
27
|
+
'aggregate',
|
|
28
|
+
'groupBy',
|
|
29
|
+
'create',
|
|
30
|
+
'update',
|
|
31
|
+
'upsert',
|
|
32
|
+
'delete',
|
|
33
|
+
'updateMany',
|
|
34
|
+
'createMany',
|
|
35
|
+
'updateManyAndReturn',
|
|
36
|
+
'createManyAndReturn',
|
|
37
|
+
'deleteMany',
|
|
38
|
+
];
|
|
39
|
+
function createModel(definition) {
|
|
40
|
+
const { dbName } = definition;
|
|
41
|
+
const name = nameOf(definition.name, 'defineModel');
|
|
42
|
+
if (dbName !== undefined && typeof dbName !== 'string') {
|
|
43
|
+
throw new Refused(`${name}: dbName must be a string.`);
|
|
44
|
+
}
|
|
45
|
+
const description = describedBy(definition.description, name);
|
|
46
|
+
const built = Reflect.apply(definition.fields, undefined, [
|
|
47
|
+
fieldBuilders,
|
|
48
|
+
]);
|
|
49
|
+
const fields = new Map();
|
|
50
|
+
addFields(name, built, fields, new Map());
|
|
51
|
+
const queries = {};
|
|
52
|
+
for (const operation of operations) {
|
|
53
|
+
queries[operation] = async (args, options) => query(name, operation, args, options);
|
|
54
|
+
}
|
|
55
|
+
Object.freeze(queries);
|
|
56
|
+
const { uses, commands, indexes } = usedBy(name, definition.use, fields, queries);
|
|
57
|
+
const record = {
|
|
58
|
+
name,
|
|
59
|
+
description,
|
|
60
|
+
dbName,
|
|
61
|
+
fields,
|
|
62
|
+
indexes: [
|
|
63
|
+
...definition.indexes.map((index) => ({
|
|
64
|
+
fields: [...index.fields],
|
|
65
|
+
...(index.unique === undefined ? {} : { unique: index.unique }),
|
|
66
|
+
...(index.contains === undefined ? {} : { contains: index.contains }),
|
|
67
|
+
})),
|
|
68
|
+
// A plugin's, checked with the model's at startup (D-122).
|
|
69
|
+
...indexes,
|
|
70
|
+
],
|
|
71
|
+
uses,
|
|
72
|
+
queries,
|
|
73
|
+
rules: undefined,
|
|
74
|
+
};
|
|
75
|
+
const model = {
|
|
76
|
+
name,
|
|
77
|
+
...queries,
|
|
78
|
+
...Object.fromEntries(commands),
|
|
79
|
+
};
|
|
80
|
+
model['with'] = withOnce(name, record, () => frozen);
|
|
81
|
+
model['nullable'] = () => nullable({ kind: 'model', value: frozen, name });
|
|
82
|
+
const frozen = Object.freeze(model);
|
|
83
|
+
modelDefinitions.set(frozen, record);
|
|
84
|
+
return frozen;
|
|
85
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { ScalarType } from './adapter.ts';
|
|
2
|
+
import type { Enum, StandardSchema } from './fields.ts';
|
|
3
|
+
import type { Manifest, OutputForm } from './plugin.ts';
|
|
4
|
+
import type { Standard } from './validation.ts';
|
|
5
|
+
export type FieldOptions = {
|
|
6
|
+
readonly [option: string]: unknown;
|
|
7
|
+
};
|
|
8
|
+
/** What a plugin field type adds to its stored field (D-122). */
|
|
9
|
+
export type Codec = {
|
|
10
|
+
readonly plugin: string;
|
|
11
|
+
/** The field type's own options this field took (D-152). */
|
|
12
|
+
readonly options: {
|
|
13
|
+
readonly [key: string]: unknown;
|
|
14
|
+
};
|
|
15
|
+
/** The stored value of the rows stored before the field (D-152). */
|
|
16
|
+
readonly filled?: unknown;
|
|
17
|
+
readonly decode: (stored: unknown) => unknown;
|
|
18
|
+
readonly encode: (value: unknown) => unknown;
|
|
19
|
+
readonly schema: Standard;
|
|
20
|
+
readonly toJSON: (value: unknown) => unknown;
|
|
21
|
+
/** What `toJSON` gives, as a Standard Schema (D-152). */
|
|
22
|
+
readonly shape?: StandardSchema;
|
|
23
|
+
};
|
|
24
|
+
/** A field as its builder recorded it. */
|
|
25
|
+
export type FieldDefinition = {
|
|
26
|
+
readonly kind: 'scalar';
|
|
27
|
+
readonly type: ScalarType;
|
|
28
|
+
readonly values?: readonly string[];
|
|
29
|
+
/** The `defineEnum` its values are, if one (D-150). */
|
|
30
|
+
readonly enum?: Enum;
|
|
31
|
+
readonly options: FieldOptions;
|
|
32
|
+
readonly rules?: object;
|
|
33
|
+
/** A plugin field type's, whose `type` is the stored one (D-122). */
|
|
34
|
+
readonly codec?: Codec;
|
|
35
|
+
} | {
|
|
36
|
+
readonly kind: 'one' | 'many';
|
|
37
|
+
readonly target: () => unknown;
|
|
38
|
+
readonly options: FieldOptions;
|
|
39
|
+
readonly rules?: object;
|
|
40
|
+
} | {
|
|
41
|
+
/** Computed on read (D-151): its schema, or a thunk of its output. */
|
|
42
|
+
readonly kind: 'virtual';
|
|
43
|
+
readonly output: unknown;
|
|
44
|
+
readonly options: FieldOptions;
|
|
45
|
+
readonly rules?: object;
|
|
46
|
+
};
|
|
47
|
+
export type IndexDefinition = {
|
|
48
|
+
readonly fields: readonly string[];
|
|
49
|
+
readonly unique?: boolean;
|
|
50
|
+
/** A trigram index, for `contains` and `mode: 'insensitive'` (D-141). */
|
|
51
|
+
readonly contains?: true;
|
|
52
|
+
};
|
|
53
|
+
export type ModelDefinition = {
|
|
54
|
+
readonly name: string;
|
|
55
|
+
readonly description: string | undefined;
|
|
56
|
+
readonly dbName: string | undefined;
|
|
57
|
+
readonly fields: ReadonlyMap<string, FieldDefinition>;
|
|
58
|
+
readonly indexes: readonly IndexDefinition[];
|
|
59
|
+
/** The plugins of its `use`, in that order (D-89). */
|
|
60
|
+
readonly uses: readonly PluginUse[];
|
|
61
|
+
/** Its operations, which a field type's plugin is given (D-152). */
|
|
62
|
+
readonly queries: object;
|
|
63
|
+
/** What `.with` received, once (D-07). */
|
|
64
|
+
rules: object | undefined;
|
|
65
|
+
};
|
|
66
|
+
/** A plugin's code, as `definePlugin` checked it (D-57, D-89). */
|
|
67
|
+
export type PluginCode = {
|
|
68
|
+
readonly name: string;
|
|
69
|
+
readonly manifest: Manifest;
|
|
70
|
+
readonly requires: readonly string[];
|
|
71
|
+
readonly optional: readonly string[];
|
|
72
|
+
readonly hooks: {
|
|
73
|
+
readonly [hook: string]: Function | undefined;
|
|
74
|
+
};
|
|
75
|
+
readonly redirect: Function | undefined;
|
|
76
|
+
readonly commands: Function | undefined;
|
|
77
|
+
readonly api: Function | undefined;
|
|
78
|
+
readonly addedFields: Function | undefined;
|
|
79
|
+
/** The indexes it adds to the models that use it (D-122). */
|
|
80
|
+
readonly addedIndexes: readonly IndexDefinition[];
|
|
81
|
+
readonly start: Function | undefined;
|
|
82
|
+
readonly stop: Function | undefined;
|
|
83
|
+
/** Who sends a request, if the plugin knows it (D-112). */
|
|
84
|
+
readonly identify: Function | undefined;
|
|
85
|
+
/** The keys it gives a user caller (D-121). */
|
|
86
|
+
readonly caller: Function | undefined;
|
|
87
|
+
/** Takes what each commit changed (D-154). */
|
|
88
|
+
readonly changed: Function | undefined;
|
|
89
|
+
readonly missed: Function | undefined;
|
|
90
|
+
/** Its own models, which no plugin is given (D-110). */
|
|
91
|
+
readonly models: readonly unknown[];
|
|
92
|
+
/** Builds its functions when the application starts (D-113). */
|
|
93
|
+
readonly functions: Function | undefined;
|
|
94
|
+
/** The APIs of the plugins it needs, read when used (D-89). */
|
|
95
|
+
readonly plugins: object;
|
|
96
|
+
};
|
|
97
|
+
/** A plugin's entry in `use`, or its value in `plugins`, with its options. */
|
|
98
|
+
export type PluginRecord = {
|
|
99
|
+
readonly code: PluginCode;
|
|
100
|
+
readonly options: object;
|
|
101
|
+
};
|
|
102
|
+
/** A plugin in a model's `use`, and what its code gets of the model. */
|
|
103
|
+
export type PluginUse = {
|
|
104
|
+
readonly code: PluginCode;
|
|
105
|
+
readonly model: {
|
|
106
|
+
readonly name: string;
|
|
107
|
+
readonly queries: object;
|
|
108
|
+
readonly options: object;
|
|
109
|
+
readonly plugins: object;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
/** A model or a type, as an output holds it (D-109). */
|
|
113
|
+
export type NamedOutput = {
|
|
114
|
+
readonly kind: 'model';
|
|
115
|
+
/** The `defineModel` value. */
|
|
116
|
+
readonly value: object;
|
|
117
|
+
readonly name: string;
|
|
118
|
+
} | {
|
|
119
|
+
readonly kind: 'type';
|
|
120
|
+
readonly type: TypeDefinition;
|
|
121
|
+
};
|
|
122
|
+
/** A function's or a type's output, as the kernel reads it (D-109). */
|
|
123
|
+
export type Output = {
|
|
124
|
+
readonly kind: 'schema';
|
|
125
|
+
readonly schema: StandardSchema;
|
|
126
|
+
} | (NamedOutput & {
|
|
127
|
+
readonly form: OutputForm;
|
|
128
|
+
});
|
|
129
|
+
export type TypeDefinition = {
|
|
130
|
+
readonly name: string;
|
|
131
|
+
readonly description: string | undefined;
|
|
132
|
+
readonly fields: ReadonlyMap<string, Output>;
|
|
133
|
+
};
|
|
134
|
+
export type FunctionDefinition = {
|
|
135
|
+
readonly name: string;
|
|
136
|
+
readonly description: string | undefined;
|
|
137
|
+
readonly query: boolean;
|
|
138
|
+
readonly input: StandardSchema | undefined;
|
|
139
|
+
readonly output: Output | undefined;
|
|
140
|
+
/** The plugins of its `use` (D-27). */
|
|
141
|
+
readonly uses: readonly PluginRecord[];
|
|
142
|
+
readonly run: Function;
|
|
143
|
+
/** What `.with` received, once. */
|
|
144
|
+
rules: object | undefined;
|
|
145
|
+
};
|
|
146
|
+
export declare const fieldDefinitions: WeakMap<object, FieldDefinition>;
|
|
147
|
+
export declare const modelDefinitions: WeakMap<object, ModelDefinition>;
|
|
148
|
+
/** The application values `plugin()` returned. */
|
|
149
|
+
export declare const pluginValues: WeakMap<object, PluginRecord>;
|
|
150
|
+
/** The model entries `use()` returned. */
|
|
151
|
+
export declare const pluginEntries: WeakMap<object, PluginRecord>;
|
|
152
|
+
export declare const typeDefinitions: WeakMap<object, TypeDefinition>;
|
|
153
|
+
export declare const functionDefinitions: WeakMap<object, FunctionDefinition>;
|
|
154
|
+
/** What each `X.nullable()` returned stands for (D-109). */
|
|
155
|
+
export declare const nullables: WeakMap<object, NamedOutput>;
|
|
156
|
+
/** `X.nullable()`, for a model or a type. */
|
|
157
|
+
export declare function nullable(named: NamedOutput): object;
|
|
158
|
+
/** The name a `define*` call takes: a non-empty string. */
|
|
159
|
+
export declare function nameOf(name: unknown, by: string): string;
|
|
160
|
+
/** A `description` (D-150): a non-empty string, when given. */
|
|
161
|
+
export declare function describedBy(description: unknown, of: string): string | undefined;
|
|
162
|
+
/**
|
|
163
|
+
* The `.with` of a model or a function: its rules, in one call, read when
|
|
164
|
+
* they apply, so it returns the same value.
|
|
165
|
+
*/
|
|
166
|
+
export declare const withOnce: (name: string, record: {
|
|
167
|
+
rules: object | undefined;
|
|
168
|
+
}, value: () => object) => (rules: unknown) => object;
|
|
169
|
+
/** A field value, keyed by its definition; `.with` takes its rules once. */
|
|
170
|
+
export declare function build(definition: FieldDefinition): object;
|
|
171
|
+
/** The `defineEnum` values, which `enumOf` takes in place of a list. */
|
|
172
|
+
export declare const sharedEnums: WeakMap<object, Enum>;
|
|
173
|
+
/** An enum's values: strings, each once. */
|
|
174
|
+
export declare function enumValues(values: unknown, of: string): readonly string[];
|
|
175
|
+
/** The builders `defineModel`'s `fields` callback receives (D-09, D-12). */
|
|
176
|
+
export declare const fieldBuilders: object;
|
|
177
|
+
/** An output's value, read once at its definition (D-109). */
|
|
178
|
+
export declare function outputOf(value: unknown, where: string): Output;
|
|
179
|
+
//# sourceMappingURL=definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Refused } from './errors.js';
|
|
2
|
+
import { isObject } from './query-where.js';
|
|
3
|
+
import { standardOf } from './validation.js';
|
|
4
|
+
export const fieldDefinitions = new WeakMap();
|
|
5
|
+
export const modelDefinitions = new WeakMap();
|
|
6
|
+
/** The application values `plugin()` returned. */
|
|
7
|
+
export const pluginValues = new WeakMap();
|
|
8
|
+
/** The model entries `use()` returned. */
|
|
9
|
+
export const pluginEntries = new WeakMap();
|
|
10
|
+
export const typeDefinitions = new WeakMap();
|
|
11
|
+
export const functionDefinitions = new WeakMap();
|
|
12
|
+
/** What each `X.nullable()` returned stands for (D-109). */
|
|
13
|
+
export const nullables = new WeakMap();
|
|
14
|
+
/** `X.nullable()`, for a model or a type. */
|
|
15
|
+
export function nullable(named) {
|
|
16
|
+
const marker = Object.freeze({});
|
|
17
|
+
nullables.set(marker, named);
|
|
18
|
+
return marker;
|
|
19
|
+
}
|
|
20
|
+
/** The name a `define*` call takes: a non-empty string. */
|
|
21
|
+
export function nameOf(name, by) {
|
|
22
|
+
if (typeof name !== 'string' || name === '') {
|
|
23
|
+
throw new Error(`${by} takes a name.`);
|
|
24
|
+
}
|
|
25
|
+
return name;
|
|
26
|
+
}
|
|
27
|
+
/** A `description` (D-150): a non-empty string, when given. */
|
|
28
|
+
export function describedBy(description, of) {
|
|
29
|
+
if (description === undefined)
|
|
30
|
+
return undefined;
|
|
31
|
+
if (typeof description !== 'string' || description === '') {
|
|
32
|
+
throw new Error(`${of}: description is a non-empty string.`);
|
|
33
|
+
}
|
|
34
|
+
return description;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The `.with` of a model or a function: its rules, in one call, read when
|
|
38
|
+
* they apply, so it returns the same value.
|
|
39
|
+
*/
|
|
40
|
+
export const withOnce = (name, record, value) => (rules) => {
|
|
41
|
+
if (record.rules !== undefined) {
|
|
42
|
+
throw new Refused(`${name} takes its rules in one \`.with\`.`);
|
|
43
|
+
}
|
|
44
|
+
if (!isObject(rules))
|
|
45
|
+
throw new Refused(`${name}.with takes an object.`);
|
|
46
|
+
record.rules = rules;
|
|
47
|
+
return value();
|
|
48
|
+
};
|
|
49
|
+
/** A field value, keyed by its definition; `.with` takes its rules once. */
|
|
50
|
+
export function build(definition) {
|
|
51
|
+
describedBy(definition.options['description'], 'A field');
|
|
52
|
+
const field = {
|
|
53
|
+
with: (rules) => {
|
|
54
|
+
if (definition.rules !== undefined) {
|
|
55
|
+
throw new Error('A field takes its rules in one `.with`.');
|
|
56
|
+
}
|
|
57
|
+
return build({ ...definition, rules });
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
fieldDefinitions.set(field, definition);
|
|
61
|
+
return field;
|
|
62
|
+
}
|
|
63
|
+
/** A field that `list: true` makes a list (D-120, D-127). */
|
|
64
|
+
function listable(type, options = {}, values, shared) {
|
|
65
|
+
const list = options['list'] === true;
|
|
66
|
+
if (list) {
|
|
67
|
+
if (options['optional'] !== undefined) {
|
|
68
|
+
throw new Error('A list is never null: left out, it is []. Remove optional.');
|
|
69
|
+
}
|
|
70
|
+
if (options['unique'] !== undefined) {
|
|
71
|
+
throw new Error('A list cannot be unique.');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (options['search'] !== undefined && (list || type !== 'string')) {
|
|
75
|
+
throw new Error('search takes a string field that is not a list.');
|
|
76
|
+
}
|
|
77
|
+
return build({
|
|
78
|
+
kind: 'scalar',
|
|
79
|
+
type,
|
|
80
|
+
...(values === undefined ? {} : { values }),
|
|
81
|
+
...(shared === undefined ? {} : { enum: shared }),
|
|
82
|
+
options,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/** A field no list holds yet (D-127). */
|
|
86
|
+
const scalar = (type) => (options) => {
|
|
87
|
+
if (options?.['list'] !== undefined) {
|
|
88
|
+
throw new Error(`f.${type}() makes no list: a list holds strings, numbers or enum values.`);
|
|
89
|
+
}
|
|
90
|
+
return build({ kind: 'scalar', type, options: options ?? {} });
|
|
91
|
+
};
|
|
92
|
+
const whole = (value, most) => Number.isInteger(value) && Number(value) >= 0 && Number(value) <= most;
|
|
93
|
+
/** Exact numbers of `precision` digits, `scale` after the point (D-145). */
|
|
94
|
+
function decimal(options) {
|
|
95
|
+
const { precision, scale } = options ?? {};
|
|
96
|
+
if (!whole(precision, 1000) || precision === 0) {
|
|
97
|
+
throw new Error('f.decimal() takes a precision from 1 to 1000.');
|
|
98
|
+
}
|
|
99
|
+
if (!whole(scale, precision)) {
|
|
100
|
+
throw new Error(`f.decimal() takes a scale from 0 to its precision, ${precision}.`);
|
|
101
|
+
}
|
|
102
|
+
return scalar('decimal')(options);
|
|
103
|
+
}
|
|
104
|
+
const relation = (kind) => (target, options) => build({ kind, target, options: options ?? {} });
|
|
105
|
+
/** The `defineEnum` values, which `enumOf` takes in place of a list. */
|
|
106
|
+
export const sharedEnums = new WeakMap();
|
|
107
|
+
/** An enum's values: strings, each once. */
|
|
108
|
+
export function enumValues(values, of) {
|
|
109
|
+
const listed = Array.isArray(values) ? values : [];
|
|
110
|
+
const strings = listed.filter((value) => typeof value === 'string');
|
|
111
|
+
if (strings.length === 0 || strings.length !== listed.length) {
|
|
112
|
+
throw new Error(`${of} takes a list of strings.`);
|
|
113
|
+
}
|
|
114
|
+
if (new Set(strings).size !== strings.length) {
|
|
115
|
+
throw new Error(`${of} lists a value twice: ${strings.join(', ')}.`);
|
|
116
|
+
}
|
|
117
|
+
return strings;
|
|
118
|
+
}
|
|
119
|
+
function enumOf(values, options) {
|
|
120
|
+
const shared = isObject(values) ? sharedEnums.get(values) : undefined;
|
|
121
|
+
if (shared !== undefined) {
|
|
122
|
+
return listable('enum', options, shared.values, shared);
|
|
123
|
+
}
|
|
124
|
+
return listable('enum', options, enumValues(values, 'enumOf'));
|
|
125
|
+
}
|
|
126
|
+
/** The builders `defineModel`'s `fields` callback receives (D-09, D-12). */
|
|
127
|
+
export const fieldBuilders = Object.freeze({
|
|
128
|
+
string: (options) => listable('string', options),
|
|
129
|
+
number: (options) => listable('number', options),
|
|
130
|
+
decimal,
|
|
131
|
+
boolean: scalar('boolean'),
|
|
132
|
+
dateTime: scalar('dateTime'),
|
|
133
|
+
date: scalar('date'),
|
|
134
|
+
json: scalar('json'),
|
|
135
|
+
enumOf,
|
|
136
|
+
one: relation('one'),
|
|
137
|
+
many: relation('many'),
|
|
138
|
+
virtual: (output, options) => build({ kind: 'virtual', output, options: options ?? {} }),
|
|
139
|
+
});
|
|
140
|
+
function namedOf(value) {
|
|
141
|
+
if (!isObject(value))
|
|
142
|
+
return undefined;
|
|
143
|
+
const model = modelDefinitions.get(value);
|
|
144
|
+
if (model !== undefined)
|
|
145
|
+
return { kind: 'model', value, name: model.name };
|
|
146
|
+
const type = typeDefinitions.get(value);
|
|
147
|
+
return type === undefined ? undefined : { kind: 'type', type };
|
|
148
|
+
}
|
|
149
|
+
/** An output's value, read once at its definition (D-109). */
|
|
150
|
+
export function outputOf(value, where) {
|
|
151
|
+
const standard = standardOf(value);
|
|
152
|
+
if (standard !== undefined)
|
|
153
|
+
return { kind: 'schema', schema: standard.schema };
|
|
154
|
+
const named = namedOf(value);
|
|
155
|
+
if (named !== undefined)
|
|
156
|
+
return { ...named, form: 'one' };
|
|
157
|
+
const marked = isObject(value) ? nullables.get(value) : undefined;
|
|
158
|
+
if (marked !== undefined)
|
|
159
|
+
return { ...marked, form: 'nullable' };
|
|
160
|
+
const list = Array.isArray(value) ? value : [];
|
|
161
|
+
const listed = list.length === 1 ? namedOf(list[0]) : undefined;
|
|
162
|
+
if (listed !== undefined)
|
|
163
|
+
return { ...listed, form: 'list' };
|
|
164
|
+
throw new Refused(`${where} is a model, a type, a list of one, X.nullable() or a Standard Schema.`);
|
|
165
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Row } from './adapter.ts';
|
|
2
|
+
import type { Context } from './query-context.ts';
|
|
3
|
+
import type { Commit, Store } from './transaction.ts';
|
|
4
|
+
export declare function removeMany(context: Context, store: Store, commits: Commit[], args: unknown): Promise<{
|
|
5
|
+
readonly count: number;
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* Deletes `rows`, which the caller may delete, as `delete` does: in one write
|
|
9
|
+
* when nothing runs (D-102), else with their cascade or redirect, then the
|
|
10
|
+
* hooks.
|
|
11
|
+
*/
|
|
12
|
+
export declare function deleted(context: Context, store: Store, commits: Commit[], rows: readonly Row[]): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=delete-many.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-many.d.ts","sourceRoot":"","sources":["../src/delete-many.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAU,GAAG,EAAE,MAAM,cAAc,CAAA;AAI/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAIrD,wBAAsB,UAAU,CAC/B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,OAAO,GACX,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCrC;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,SAAS,GAAG,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf"}
|