@superpanel-sdk/runtime 0.2.2 → 0.5.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/README.md +28 -8
- package/dist/builder/codegen/emit.d.ts +29 -11
- package/dist/builder/codegen/emit.js +328 -61
- package/dist/builder/codegen/generate.d.ts +21 -0
- package/dist/builder/codegen/generate.js +152 -20
- package/dist/builder/company-import-graph.d.ts +2 -0
- package/dist/builder/company-import-graph.js +40 -8
- package/dist/builder/company-imports.d.ts +24 -0
- package/dist/builder/company-imports.js +114 -0
- package/dist/builder/compile/compile-sequence.d.ts +59 -8
- package/dist/builder/compile/compile-sequence.js +279 -77
- package/dist/builder/compile/function-code.d.ts +12 -2
- package/dist/builder/compile/function-code.js +87 -39
- package/dist/builder/compile/registry.d.ts +7 -3
- package/dist/builder/compile/registry.js +24 -23
- package/dist/builder/load.d.ts +70 -10
- package/dist/builder/load.js +250 -61
- package/dist/builder/paths.d.ts +3 -0
- package/dist/builder/paths.js +16 -0
- package/dist/builder/schedules.d.ts +23 -0
- package/dist/builder/schedules.js +102 -0
- package/dist/builder/slot-schema-validation.d.ts +4 -0
- package/dist/builder/slot-schema-validation.js +10 -0
- package/dist/builder/typecheck.d.ts +8 -0
- package/dist/builder/typecheck.js +105 -0
- package/dist/builder/types.d.ts +91 -19
- package/dist/builder/types.js +2 -1
- package/dist/cli/auth/auth.d.ts +37 -0
- package/dist/cli/auth/auth.js +211 -0
- package/dist/cli/auth/backend-url.d.ts +5 -0
- package/dist/cli/auth/backend-url.js +25 -0
- package/dist/cli/auth/clipboard.d.ts +9 -0
- package/dist/cli/auth/clipboard.js +38 -0
- package/dist/cli/auth/http.d.ts +20 -0
- package/dist/cli/auth/http.js +27 -0
- package/dist/cli/auth/index.d.ts +10 -0
- package/dist/cli/auth/index.js +27 -0
- package/dist/cli/auth/progress.d.ts +12 -0
- package/dist/cli/auth/progress.js +15 -0
- package/dist/cli/auth/serve-login.d.ts +8 -0
- package/dist/cli/auth/serve-login.js +24 -0
- package/dist/cli/compile/index.js +3 -0
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.js +52 -0
- package/dist/cli/index.js +28 -8
- package/dist/cli/serve/index.d.ts +73 -3
- package/dist/cli/serve/index.js +410 -113
- package/dist/cli/type-gen/index.js +9 -8
- package/dist/compiler.d.ts +7 -0
- package/dist/compiler.js +7 -0
- package/dist/compute-host/compute-host.d.ts +15 -23
- package/dist/compute-host/compute-host.js +25 -28
- package/dist/compute-host/index.d.ts +2 -2
- package/dist/compute-host/index.js +1 -1
- package/dist/compute-host/source-compute-host.d.ts +11 -9
- package/dist/compute-host/source-compute-host.js +50 -31
- package/dist/core/case-orchestrator/contact-hours.d.ts +50 -0
- package/dist/core/case-orchestrator/contact-hours.js +108 -0
- package/dist/core/case-orchestrator/follow-ups.d.ts +31 -0
- package/dist/core/case-orchestrator/follow-ups.js +103 -0
- package/dist/core/case-orchestrator/index.d.ts +6 -0
- package/dist/core/case-orchestrator/index.js +6 -0
- package/dist/core/case-orchestrator/render.d.ts +75 -0
- package/dist/core/case-orchestrator/render.js +239 -0
- package/dist/core/case-orchestrator/time.d.ts +11 -0
- package/dist/core/case-orchestrator/time.js +29 -0
- package/dist/core/case-orchestrator/tools.d.ts +29 -0
- package/dist/core/case-orchestrator/tools.js +31 -0
- package/dist/core/case-orchestrator/types.d.ts +753 -0
- package/dist/core/case-orchestrator/types.js +46 -0
- package/dist/core/case-orchestrator/validate.d.ts +11 -0
- package/dist/core/case-orchestrator/validate.js +63 -0
- package/dist/core/context/call.d.ts +291 -0
- package/dist/core/context/call.js +94 -0
- package/dist/core/context/channels.d.ts +60 -0
- package/dist/core/context/channels.js +35 -0
- package/dist/core/context/contact.d.ts +96 -6
- package/dist/core/context/contact.js +48 -2
- package/dist/core/context/email-message.d.ts +159 -0
- package/dist/core/context/email-message.js +59 -0
- package/dist/core/context/email.d.ts +97 -0
- package/dist/core/context/email.js +91 -0
- package/dist/core/context/exchanges.d.ts +142 -0
- package/dist/core/context/exchanges.js +63 -0
- package/dist/core/context/instances.d.ts +278 -0
- package/dist/core/context/instances.js +123 -0
- package/dist/core/context/kv.d.ts +113 -0
- package/dist/core/context/kv.js +60 -0
- package/dist/core/context/platform-registry.d.ts +509 -4
- package/dist/core/context/platform-registry.js +14 -2
- package/dist/core/context/platform.d.ts +2 -1
- package/dist/core/context/sms.d.ts +147 -0
- package/dist/core/context/sms.js +57 -0
- package/dist/core/context/types.d.ts +51 -30
- package/dist/core/context/types.js +1 -7
- package/dist/core/conversation/index.d.ts +31 -0
- package/dist/core/conversation/index.js +14 -0
- package/dist/core/functions/define/bind.d.ts +25 -0
- package/dist/core/functions/define/bind.js +14 -0
- package/dist/core/functions/define/case.d.ts +9 -0
- package/dist/core/functions/define/case.js +13 -0
- package/dist/core/functions/define/events.d.ts +20 -0
- package/dist/core/functions/define/events.js +21 -0
- package/dist/core/functions/define/no-case.d.ts +4 -0
- package/dist/core/functions/define/no-case.js +9 -0
- package/dist/core/functions/events.d.ts +247 -0
- package/dist/core/functions/events.js +32 -0
- package/dist/core/functions/func-ref.d.ts +11 -2
- package/dist/core/functions/schedules.d.ts +51 -0
- package/dist/core/functions/schedules.js +20 -0
- package/dist/core/functions/types.d.ts +62 -51
- package/dist/core/functions/types.js +6 -1
- package/dist/core/office-hours/index.d.ts +39 -0
- package/dist/core/office-hours/index.js +187 -0
- package/dist/core/page/define.d.ts +834 -0
- package/dist/core/page/define.js +477 -0
- package/dist/core/page/ops.d.ts +58 -0
- package/dist/core/page/ops.js +220 -0
- package/dist/core/page/render.d.ts +253 -0
- package/dist/core/page/render.js +840 -0
- package/dist/core/page/time-format.d.ts +19 -0
- package/dist/core/page/time-format.js +41 -0
- package/dist/core/page/timeline.d.ts +40 -0
- package/dist/core/page/timeline.js +2 -0
- package/dist/core/page/typed.d.ts +642 -0
- package/dist/core/page/typed.js +2 -0
- package/dist/core/page/workspace.d.ts +33 -0
- package/dist/core/page/workspace.js +231 -0
- package/dist/core/party/index.d.ts +3 -0
- package/dist/core/party/index.js +3 -0
- package/dist/core/party/schema.d.ts +137 -0
- package/dist/core/party/schema.js +80 -0
- package/dist/core/party/types.d.ts +40 -0
- package/dist/core/party/types.js +15 -0
- package/dist/core/sequence/define.d.ts +57 -0
- package/dist/core/sequence/define.js +10 -0
- package/dist/core/sequence/index.d.ts +63 -0
- package/dist/core/sequence/index.js +231 -0
- package/dist/core/slot/binding.d.ts +40 -0
- package/dist/core/slot/binding.js +2 -0
- package/dist/core/slot/company-metadata.d.ts +113 -0
- package/dist/core/slot/company-metadata.js +563 -0
- package/dist/core/slot/compile-schema.d.ts +19 -13
- package/dist/core/slot/compile-schema.js +51 -248
- package/dist/core/slot/contact-timezone.d.ts +110 -0
- package/dist/core/slot/contact-timezone.js +186 -0
- package/dist/core/slot/field.d.ts +2 -24
- package/dist/core/slot/field.js +0 -69
- package/dist/core/slot/id-ref.d.ts +17 -2
- package/dist/core/slot/id-ref.js +16 -8
- package/dist/core/slot/index.d.ts +12 -13
- package/dist/core/slot/index.js +11 -12
- package/dist/core/slot/naming.d.ts +15 -0
- package/dist/core/slot/naming.js +96 -0
- package/dist/core/slot/platform-fields.d.ts +119 -0
- package/dist/core/slot/platform-fields.js +121 -0
- package/dist/core/slot/ref.d.ts +16 -0
- package/dist/core/slot/ref.js +14 -0
- package/dist/core/slot/row.d.ts +2 -9
- package/dist/core/slot/row.js +13 -23
- package/dist/core/slot/schema-compat.d.ts +16 -0
- package/dist/core/slot/schema-compat.js +112 -0
- package/dist/core/slot/schema.d.ts +409 -76
- package/dist/core/slot/schema.js +178 -10
- package/dist/core/slot/types.d.ts +27 -92
- package/dist/core/slot/value.d.ts +26 -3
- package/dist/core/slot/value.js +89 -57
- package/dist/dev-overlay/protocol.d.ts +41 -8
- package/dist/fn-context/build-context.d.ts +3 -1
- package/dist/fn-context/build-context.js +20 -10
- package/dist/fn-context/fake/empty-api.js +9 -28
- package/dist/fn-context/fake/index.d.ts +11 -4
- package/dist/fn-context/fake/index.js +27 -2
- package/dist/fn-context/fn-params.d.ts +6 -0
- package/dist/fn-context/fn-params.js +13 -0
- package/dist/fn-context/index.d.ts +5 -5
- package/dist/fn-context/index.js +4 -4
- package/dist/fn-context/log.js +2 -2
- package/dist/fn-context/make-ctx.d.ts +11 -0
- package/dist/fn-context/make-ctx.js +18 -8
- package/dist/fn-context/rpc/case-orchestrator-tools.d.ts +24 -0
- package/dist/fn-context/rpc/case-orchestrator-tools.js +13 -0
- package/dist/fn-context/rpc/index.d.ts +3 -1
- package/dist/fn-context/rpc/index.js +3 -1
- package/dist/fn-context/rpc/integration/index.d.ts +4 -4
- package/dist/fn-context/rpc/integration/index.js +1 -1
- package/dist/fn-context/rpc/integration/list-surfaces.d.ts +21 -0
- package/dist/fn-context/rpc/integration/{list-bindings.js → list-surfaces.js} +4 -4
- package/dist/fn-context/rpc/platform.d.ts +2 -2
- package/dist/fn-context/rpc/platform.js +1 -1
- package/dist/fn-context/rpc/records.d.ts +78 -0
- package/dist/fn-context/rpc/records.js +26 -0
- package/dist/fn-context/rpc/trpc-client.d.ts +2 -2
- package/dist/fn-context/rpc/trpc-client.js +89 -5
- package/dist/fn-context/rpc/trpc-init.d.ts +2 -2
- package/dist/fn-context/rpc/trpc-router-factory.d.ts +49 -3
- package/dist/fn-context/rpc/trpc-router-factory.js +2 -0
- package/dist/fn-context/run-scope.d.ts +4 -0
- package/dist/fn-context/run-scope.js +9 -0
- package/dist/fn-context/types.d.ts +36 -3
- package/dist/index.d.ts +37 -46
- package/dist/index.js +33 -33
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +41 -0
- package/dist/platform.d.ts +76 -0
- package/dist/platform.js +56 -0
- package/dist/voice-service/actions.d.ts +71 -4
- package/dist/voice-service/types.d.ts +42 -2
- package/dist/worker.d.ts +10 -0
- package/dist/worker.js +10 -0
- package/package.json +38 -19
- package/dist/builder/compile/compile-agenda.d.ts +0 -15
- package/dist/builder/compile/compile-agenda.js +0 -59
- package/dist/builder/merge.d.ts +0 -4
- package/dist/builder/merge.js +0 -19
- package/dist/core/context/db.d.ts +0 -69
- package/dist/core/context/db.js +0 -44
- package/dist/core/context/docusign.d.ts +0 -134
- package/dist/core/context/docusign.js +0 -108
- package/dist/core/context/filevine.d.ts +0 -323
- package/dist/core/context/filevine.js +0 -254
- package/dist/core/context/http.d.ts +0 -9
- package/dist/core/context/http.js +0 -4
- package/dist/core/context/hubspot.d.ts +0 -250
- package/dist/core/context/hubspot.js +0 -191
- package/dist/core/context/twilio.d.ts +0 -50
- package/dist/core/context/twilio.js +0 -42
- package/dist/core/functions/define/case-context.d.ts +0 -14
- package/dist/core/functions/define/case-context.js +0 -15
- package/dist/core/functions/define/compute.d.ts +0 -7
- package/dist/core/functions/define/compute.js +0 -17
- package/dist/core/functions/define/custom.d.ts +0 -4
- package/dist/core/functions/define/custom.js +0 -8
- package/dist/core/functions/define/system.d.ts +0 -7
- package/dist/core/functions/define/system.js +0 -12
- package/dist/core/slot/deps.d.ts +0 -15
- package/dist/core/slot/deps.js +0 -88
- package/dist/core/slot/derived.d.ts +0 -32
- package/dist/core/slot/derived.js +0 -115
- package/dist/core/slot/platform-session-fields.d.ts +0 -38
- package/dist/core/slot/platform-session-fields.js +0 -48
- package/dist/core/slot/sf-schema.d.ts +0 -23
- package/dist/core/slot/sf-schema.js +0 -125
- package/dist/core/slot/sf-validate.d.ts +0 -14
- package/dist/core/slot/sf-validate.js +0 -132
- package/dist/core/slot/snapshot.d.ts +0 -18
- package/dist/core/slot/snapshot.js +0 -138
- package/dist/core/slot/write.d.ts +0 -41
- package/dist/core/slot/write.js +0 -319
- package/dist/core/stage/builders.d.ts +0 -36
- package/dist/core/stage/builders.js +0 -28
- package/dist/core/stage/condition.d.ts +0 -17
- package/dist/core/stage/condition.js +0 -198
- package/dist/core/stage/drive.d.ts +0 -43
- package/dist/core/stage/drive.js +0 -77
- package/dist/core/stage/finish-when.d.ts +0 -20
- package/dist/core/stage/finish-when.js +0 -82
- package/dist/core/stage/flatten.d.ts +0 -27
- package/dist/core/stage/flatten.js +0 -464
- package/dist/core/stage/index.d.ts +0 -11
- package/dist/core/stage/index.js +0 -10
- package/dist/core/stage/simulate.d.ts +0 -24
- package/dist/core/stage/simulate.js +0 -33
- package/dist/core/stage/transfer-fields.d.ts +0 -14
- package/dist/core/stage/transfer-fields.js +0 -88
- package/dist/core/stage/types.d.ts +0 -177
- package/dist/core/stage/types.js +0 -2
- package/dist/core/stage/validate.d.ts +0 -11
- package/dist/core/stage/validate.js +0 -226
- package/dist/core/stage/walk.d.ts +0 -34
- package/dist/core/stage/walk.js +0 -96
- package/dist/fn-context/rpc/integration/list-bindings.d.ts +0 -21
- package/dist/fn-context/system-args.d.ts +0 -6
- package/dist/fn-context/system-args.js +0 -14
package/dist/core/slot/row.js
CHANGED
|
@@ -2,11 +2,23 @@ import { emptyFieldValue } from './field.js';
|
|
|
2
2
|
import { ROW_ID_FIELD } from './schema.js';
|
|
3
3
|
/** Reserved snapshot key; cannot be a company / sequence table name. */
|
|
4
4
|
export const SNAPSHOT_CURRENT_KEY = 'current';
|
|
5
|
+
/**
|
|
6
|
+
* `derivedOrder` / `reverseDeps`: keys a compiled schema carried before derived fields were removed
|
|
7
|
+
* (13-data-model-v1 §21); older builds still have them, so they stay reserved and are skipped.
|
|
8
|
+
*/
|
|
5
9
|
const RESERVED_TABLE_NAMES = new Set([SNAPSHOT_CURRENT_KEY, 'derivedOrder', 'reverseDeps']);
|
|
6
10
|
export function isReservedTableName(tableName) {
|
|
7
11
|
return RESERVED_TABLE_NAMES.has(tableName);
|
|
8
12
|
}
|
|
9
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Multi-row tables with a bound row (the conversation's contact): a write without `rowId`
|
|
15
|
+
* goes to it. Contacts are created through `ctx.api.contact`, never inserted by a write.
|
|
16
|
+
*/
|
|
17
|
+
const BOUND_ROW_TABLES = new Set(['contact']);
|
|
18
|
+
export function hasBoundRow(tableName) {
|
|
19
|
+
return BOUND_ROW_TABLES.has(tableName);
|
|
20
|
+
}
|
|
21
|
+
/** App-minted row id for multi-row tables (the Record's id). */
|
|
10
22
|
export function mintRowId() {
|
|
11
23
|
return crypto.randomUUID();
|
|
12
24
|
}
|
|
@@ -16,12 +28,6 @@ export function isRowIdField(name) {
|
|
|
16
28
|
export function isFieldValue(value) {
|
|
17
29
|
return typeof value === 'object' && value !== null && 'state' in value && 'value' in value;
|
|
18
30
|
}
|
|
19
|
-
export function getRowField(row, fieldName) {
|
|
20
|
-
if (isRowIdField(fieldName))
|
|
21
|
-
return undefined;
|
|
22
|
-
const value = row[fieldName];
|
|
23
|
-
return isFieldValue(value) ? value : undefined;
|
|
24
|
-
}
|
|
25
31
|
/** Schema fields that store envelopes — excludes row `id`. */
|
|
26
32
|
export function slotFieldEntries(fields) {
|
|
27
33
|
return Object.entries(fields).filter(([name]) => !isRowIdField(name));
|
|
@@ -29,22 +35,6 @@ export function slotFieldEntries(fields) {
|
|
|
29
35
|
export function slotFieldNames(fields) {
|
|
30
36
|
return slotFieldEntries(fields).map(([name]) => name);
|
|
31
37
|
}
|
|
32
|
-
/** Envelope cells on a runtime row — excludes `id`. */
|
|
33
|
-
export function rowValueEntries(row) {
|
|
34
|
-
const out = [];
|
|
35
|
-
for (const [name, value] of Object.entries(row)) {
|
|
36
|
-
if (isRowIdField(name) || !isFieldValue(value))
|
|
37
|
-
continue;
|
|
38
|
-
out.push([name, value]);
|
|
39
|
-
}
|
|
40
|
-
return out;
|
|
41
|
-
}
|
|
42
|
-
export function emptySlotRow(fields, options = {}) {
|
|
43
|
-
return fillRowFields({ id: options.id ?? '' }, fields, options.now ?? 0);
|
|
44
|
-
}
|
|
45
|
-
export function emptyMultiRow(fields, id, now = 0) {
|
|
46
|
-
return fillRowFields({ id }, fields, now);
|
|
47
|
-
}
|
|
48
38
|
function fillRowFields(row, fields, now) {
|
|
49
39
|
for (const name of slotFieldNames(fields)) {
|
|
50
40
|
row[name] = emptyFieldValue(now);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompiledCompanyMetadata } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why `after`'s company schema cannot replace `before`'s without breaking slot data stored under
|
|
4
|
+
* it; empty for an additive (01-slot-db §2.3) evolution. One pass covers the whole repo: sequence
|
|
5
|
+
* overlays only change usage. The session fields (`schema/session.ts`) follow the same rules, since
|
|
6
|
+
* `Session.data` keeps their values (11-remove-sequence-schema §3.1).
|
|
7
|
+
*
|
|
8
|
+
* Compatible: new tables (with their parent), fields (lookups included), more options, a widened
|
|
9
|
+
* type (`string` → `text`, `select` / `time` → `string`), and presentation changes (label,
|
|
10
|
+
* description, extraction, deprecated); a new field may be `unique`. Incompatible: removing a table or
|
|
11
|
+
* field (mark it `deprecated` instead); any other change of a field's dataType, `unique` added to or
|
|
12
|
+
* dropped from a field (18-record-search-index §4.5), any ref change (added, removed, retargeted, parent ↔ lookup), a parent added to a
|
|
13
|
+
* table `before` has (its stored rows have no parent edge, 13-data-model-v1 §22.5), a removed option.
|
|
14
|
+
*/
|
|
15
|
+
export declare function companyMetadataCompatibilityIssues(before: CompiledCompanyMetadata, after: CompiledCompanyMetadata): string[];
|
|
16
|
+
//# sourceMappingURL=schema-compat.d.ts.map
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
function formatValues(values) {
|
|
2
|
+
return values.join(', ');
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Type changes that only widen: every stored value of `before` is a valid value of `after`
|
|
6
|
+
* (18-record-search-index §5, 27 §2.3): a short value as a long one; an option or a time of day as
|
|
7
|
+
* a short value.
|
|
8
|
+
*/
|
|
9
|
+
const WIDENINGS = new Set(['string>text', 'select>string', 'select>text', 'time>string', 'time>text']);
|
|
10
|
+
function normalFieldIssues(path, before, after) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
if (before.dataType !== after.dataType && !WIDENINGS.has(`${before.dataType}>${after.dataType}`)) {
|
|
13
|
+
issues.push(`field '${path}' dataType: ${before.dataType} → ${after.dataType}`);
|
|
14
|
+
}
|
|
15
|
+
// More options only widen; a dropped one may be stored.
|
|
16
|
+
if (before.dataType === after.dataType && before.options && after.options) {
|
|
17
|
+
const kept = new Set(after.options);
|
|
18
|
+
const removed = before.options.filter((value) => !kept.has(value));
|
|
19
|
+
if (removed.length > 0)
|
|
20
|
+
issues.push(`field '${path}' removed options: ${formatValues(removed)}`);
|
|
21
|
+
}
|
|
22
|
+
issues.push(...refIssues(path, before, after));
|
|
23
|
+
// `unique` is the field's from its first release (18-record-search-index §4.5): adding it would need
|
|
24
|
+
// stored values checked and the index marked, dropping it the marks cleared, both racing writes.
|
|
25
|
+
if (Boolean(before.unique) !== Boolean(after.unique)) {
|
|
26
|
+
issues.push(`field '${path}' unique: ${before.unique ? 'yes' : 'no'} → ${after.unique ? 'yes' : 'no'} (unique is set when a field is added; add a new field instead)`);
|
|
27
|
+
}
|
|
28
|
+
return issues;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* What to do instead of changing a parent (13-data-model-v1 §22.5): which row a row belongs to is
|
|
32
|
+
* data, set once when the row is created, so no schema change can move or add it for stored rows.
|
|
33
|
+
*/
|
|
34
|
+
const PARENT_FIXED = 'a parent is fixed once released: create a new table and move the data instead';
|
|
35
|
+
/**
|
|
36
|
+
* A ref only ever stays as it is (13-data-model-v1 §11.9). Adding or retargeting one invalidates
|
|
37
|
+
* stored ids. Dropping one leaves its `RecordRef` projections behind (nothing deletes them once the
|
|
38
|
+
* field is no longer a ref), blocking the target's delete. A parent and a lookup are stored apart
|
|
39
|
+
* (a lookup in the row's data, a parent only in `RecordRef`). To change a lookup, mark the field
|
|
40
|
+
* deprecated and add a new one; a parent cannot change at all (§22.5).
|
|
41
|
+
*/
|
|
42
|
+
function refIssues(path, before, after) {
|
|
43
|
+
if (!before.ref && !after.ref)
|
|
44
|
+
return [];
|
|
45
|
+
const parentInvolved = before.ref?.kind === 'parent' || after.ref?.kind === 'parent';
|
|
46
|
+
const instead = parentInvolved ? PARENT_FIXED : 'mark it deprecated instead';
|
|
47
|
+
if (!after.ref)
|
|
48
|
+
return [`field '${path}' ref to ${before.ref.table} was removed (${instead})`];
|
|
49
|
+
if (after.ref.table !== before.ref?.table) {
|
|
50
|
+
return [`field '${path}' ref: ${before.ref?.table ?? 'none'} → ${after.ref.table}${parentInvolved ? ` (${PARENT_FIXED})` : ''}`];
|
|
51
|
+
}
|
|
52
|
+
if (after.ref.kind !== before.ref.kind) {
|
|
53
|
+
return [`field '${path}' ref kind: ${before.ref.kind} → ${after.ref.kind}${parentInvolved ? ` (${PARENT_FIXED})` : ''}`];
|
|
54
|
+
}
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
function fieldIssues(path, before, after) {
|
|
58
|
+
return normalFieldIssues(path, before, after);
|
|
59
|
+
}
|
|
60
|
+
/** A session field has no ref: the rest of a company field's rules. */
|
|
61
|
+
function sessionFieldIssues(path, before, after) {
|
|
62
|
+
return normalFieldIssues(path, before, after);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Why `after`'s company schema cannot replace `before`'s without breaking slot data stored under
|
|
66
|
+
* it; empty for an additive (01-slot-db §2.3) evolution. One pass covers the whole repo: sequence
|
|
67
|
+
* overlays only change usage. The session fields (`schema/session.ts`) follow the same rules, since
|
|
68
|
+
* `Session.data` keeps their values (11-remove-sequence-schema §3.1).
|
|
69
|
+
*
|
|
70
|
+
* Compatible: new tables (with their parent), fields (lookups included), more options, a widened
|
|
71
|
+
* type (`string` → `text`, `select` / `time` → `string`), and presentation changes (label,
|
|
72
|
+
* description, extraction, deprecated); a new field may be `unique`. Incompatible: removing a table or
|
|
73
|
+
* field (mark it `deprecated` instead); any other change of a field's dataType, `unique` added to or
|
|
74
|
+
* dropped from a field (18-record-search-index §4.5), any ref change (added, removed, retargeted, parent ↔ lookup), a parent added to a
|
|
75
|
+
* table `before` has (its stored rows have no parent edge, 13-data-model-v1 §22.5), a removed option.
|
|
76
|
+
*/
|
|
77
|
+
export function companyMetadataCompatibilityIssues(before, after) {
|
|
78
|
+
const issues = [];
|
|
79
|
+
for (const [tableName, beforeTable] of Object.entries(before.tables)) {
|
|
80
|
+
const afterTable = after.tables[tableName];
|
|
81
|
+
if (!afterTable) {
|
|
82
|
+
issues.push(`table '${tableName}' was removed`);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
for (const [fieldName, beforeField] of Object.entries(beforeTable.fields)) {
|
|
86
|
+
const path = `${tableName}.${fieldName}`;
|
|
87
|
+
const afterField = afterTable.fields[fieldName];
|
|
88
|
+
if (!afterField) {
|
|
89
|
+
const instead = beforeField.ref?.kind === 'parent' ? PARENT_FIXED : 'mark it deprecated instead';
|
|
90
|
+
issues.push(`field '${path}' was removed (${instead})`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
issues.push(...fieldIssues(path, beforeField, afterField));
|
|
94
|
+
}
|
|
95
|
+
for (const [fieldName, afterField] of Object.entries(afterTable.fields)) {
|
|
96
|
+
if (fieldName in beforeTable.fields || afterField.ref?.kind !== 'parent')
|
|
97
|
+
continue;
|
|
98
|
+
issues.push(`table '${tableName}' gained a parent '${fieldName}': its stored rows have none (${PARENT_FIXED})`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for (const [fieldName, beforeField] of Object.entries(before.session.fields)) {
|
|
102
|
+
const path = `session.${fieldName}`;
|
|
103
|
+
const afterField = after.session.fields[fieldName];
|
|
104
|
+
if (!afterField) {
|
|
105
|
+
issues.push(`field '${path}' was removed (mark it deprecated instead)`);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
issues.push(...sessionFieldIssues(path, beforeField, afterField));
|
|
109
|
+
}
|
|
110
|
+
return issues;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=schema-compat.js.map
|