@graview/core 0.1.29 → 0.1.32
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 +11 -1
- package/dist/app-places.d.ts +2 -2
- package/dist/app-places.d.ts.map +1 -1
- package/dist/app-places.js +53 -3
- package/dist/app-places.js.map +1 -1
- package/dist/app.d.ts +24 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js.map +1 -1
- package/dist/arrange.d.ts +3 -1
- package/dist/arrange.d.ts.map +1 -1
- package/dist/arrange.js +3 -1
- package/dist/arrange.js.map +1 -1
- package/dist/arrangement.d.ts +18 -0
- package/dist/arrangement.d.ts.map +1 -1
- package/dist/arrangement.js +34 -0
- package/dist/arrangement.js.map +1 -1
- package/dist/arranging.d.ts.map +1 -1
- package/dist/arranging.js +17 -6
- package/dist/arranging.js.map +1 -1
- package/dist/blocks.d.ts +1 -1
- package/dist/blocks.d.ts.map +1 -1
- package/dist/catalog.d.ts +312 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +459 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli/check/brand.d.ts.map +1 -1
- package/dist/cli/check/brand.js +29 -1
- package/dist/cli/check/brand.js.map +1 -1
- package/dist/cli/check/lenses.d.ts.map +1 -1
- package/dist/cli/check/lenses.js +6 -1
- package/dist/cli/check/lenses.js.map +1 -1
- package/dist/cli/check/relations.d.ts +23 -0
- package/dist/cli/check/relations.d.ts.map +1 -1
- package/dist/cli/check/relations.js +53 -3
- package/dist/cli/check/relations.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +32 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/describe.d.ts.map +1 -1
- package/dist/cli/describe.js +27 -4
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/doctor.d.ts +18 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +58 -5
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/document-schema.d.ts +2 -0
- package/dist/cli/document-schema.d.ts.map +1 -1
- package/dist/cli/document-schema.js +163 -5
- package/dist/cli/document-schema.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js +6 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/conformance/fixtures.d.ts.map +1 -1
- package/dist/conformance/fixtures.js +165 -0
- package/dist/conformance/fixtures.js.map +1 -1
- package/dist/coverage-words.d.ts +18 -0
- package/dist/coverage-words.d.ts.map +1 -0
- package/dist/coverage-words.js +18 -0
- package/dist/coverage-words.js.map +1 -0
- package/dist/days.d.ts +7 -1
- package/dist/days.d.ts.map +1 -1
- package/dist/days.js +10 -4
- package/dist/days.js.map +1 -1
- package/dist/document/act-findings.d.ts.map +1 -1
- package/dist/document/act-findings.js +21 -3
- package/dist/document/act-findings.js.map +1 -1
- package/dist/document/blocks.d.ts +20 -7
- package/dist/document/blocks.d.ts.map +1 -1
- package/dist/document/blocks.js +85 -15
- package/dist/document/blocks.js.map +1 -1
- package/dist/document/brand-check.d.ts +5 -0
- package/dist/document/brand-check.d.ts.map +1 -1
- package/dist/document/brand-check.js +16 -2
- package/dist/document/brand-check.js.map +1 -1
- package/dist/document/compile-checked.d.ts.map +1 -1
- package/dist/document/compile-checked.js +12 -4
- package/dist/document/compile-checked.js.map +1 -1
- package/dist/document/compile.d.ts +0 -2
- package/dist/document/compile.d.ts.map +1 -1
- package/dist/document/compile.js +19 -17
- package/dist/document/compile.js.map +1 -1
- package/dist/document/compiled.d.ts +2 -0
- package/dist/document/compiled.d.ts.map +1 -1
- package/dist/document/compiled.js +51 -12
- package/dist/document/compiled.js.map +1 -1
- package/dist/document/computed-values.d.ts +3 -0
- package/dist/document/computed-values.d.ts.map +1 -1
- package/dist/document/computed-values.js +12 -2
- package/dist/document/computed-values.js.map +1 -1
- package/dist/document/connection-findings.d.ts +6 -0
- package/dist/document/connection-findings.d.ts.map +1 -0
- package/dist/document/connection-findings.js +110 -0
- package/dist/document/connection-findings.js.map +1 -0
- package/dist/document/connection-spec.d.ts +38 -0
- package/dist/document/connection-spec.d.ts.map +1 -0
- package/dist/document/connection-spec.js +43 -0
- package/dist/document/connection-spec.js.map +1 -0
- package/dist/document/describe-coverage.d.ts +3 -0
- package/dist/document/describe-coverage.d.ts.map +1 -1
- package/dist/document/describe-coverage.js +12 -5
- package/dist/document/describe-coverage.js.map +1 -1
- package/dist/document/describe-place.d.ts.map +1 -1
- package/dist/document/describe-place.js +3 -1
- package/dist/document/describe-place.js.map +1 -1
- package/dist/document/diff.d.ts.map +1 -1
- package/dist/document/diff.js +39 -8
- package/dist/document/diff.js.map +1 -1
- package/dist/document/edit.d.ts +1 -1
- package/dist/document/edit.d.ts.map +1 -1
- package/dist/document/edit.js +251 -15
- package/dist/document/edit.js.map +1 -1
- package/dist/document/expr/evaluate.d.ts +25 -0
- package/dist/document/expr/evaluate.d.ts.map +1 -1
- package/dist/document/expr/evaluate.js +38 -0
- package/dist/document/expr/evaluate.js.map +1 -1
- package/dist/document/format-words.d.ts +1 -1
- package/dist/document/format-words.d.ts.map +1 -1
- package/dist/document/format-words.js +3 -1
- package/dist/document/format-words.js.map +1 -1
- package/dist/document/framework-path.d.ts +11 -0
- package/dist/document/framework-path.d.ts.map +1 -0
- package/dist/document/framework-path.js +122 -0
- package/dist/document/framework-path.js.map +1 -0
- package/dist/document/index.d.ts +2 -2
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/index.js +1 -1
- package/dist/document/index.js.map +1 -1
- package/dist/document/linked-findings.d.ts +5 -0
- package/dist/document/linked-findings.d.ts.map +1 -0
- package/dist/document/linked-findings.js +100 -0
- package/dist/document/linked-findings.js.map +1 -0
- package/dist/document/migrate.d.ts.map +1 -1
- package/dist/document/migrate.js +4 -1
- package/dist/document/migrate.js.map +1 -1
- package/dist/document/policy-words.d.ts +2 -0
- package/dist/document/policy-words.d.ts.map +1 -1
- package/dist/document/policy-words.js +16 -1
- package/dist/document/policy-words.js.map +1 -1
- package/dist/document/right-names.d.ts +10 -0
- package/dist/document/right-names.d.ts.map +1 -0
- package/dist/document/right-names.js +57 -0
- package/dist/document/right-names.js.map +1 -0
- package/dist/document/rules.d.ts.map +1 -1
- package/dist/document/rules.js +13 -5
- package/dist/document/rules.js.map +1 -1
- package/dist/document/schema.d.ts +86 -8
- package/dist/document/schema.d.ts.map +1 -1
- package/dist/document/schema.js +64 -7
- package/dist/document/schema.js.map +1 -1
- package/dist/document/template-parse.d.ts.map +1 -1
- package/dist/document/template-parse.js +36 -3
- package/dist/document/template-parse.js.map +1 -1
- package/dist/document/template.d.ts +13 -1
- package/dist/document/template.d.ts.map +1 -1
- package/dist/document/template.js +29 -9
- package/dist/document/template.js.map +1 -1
- package/dist/document/to-document.d.ts.map +1 -1
- package/dist/document/to-document.js +12 -0
- package/dist/document/to-document.js.map +1 -1
- package/dist/document/views.d.ts +36 -4
- package/dist/document/views.d.ts.map +1 -1
- package/dist/document/views.js +64 -21
- package/dist/document/views.js.map +1 -1
- package/dist/document.schema.json +1184 -51
- package/dist/field-sight.js +2 -2
- package/dist/field-sight.js.map +1 -1
- package/dist/forms.d.ts +1 -0
- package/dist/forms.d.ts.map +1 -1
- package/dist/forms.js +2 -0
- package/dist/forms.js.map +1 -1
- package/dist/graph/archived.d.ts +9 -0
- package/dist/graph/archived.d.ts.map +1 -1
- package/dist/graph/archived.js +9 -0
- package/dist/graph/archived.js.map +1 -1
- package/dist/graph/diff.d.ts +16 -0
- package/dist/graph/diff.d.ts.map +1 -1
- package/dist/graph/diff.js +18 -0
- package/dist/graph/diff.js.map +1 -1
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +5 -8
- package/dist/graph/graph.js.map +1 -1
- package/dist/grid-sort.d.ts +20 -0
- package/dist/grid-sort.d.ts.map +1 -0
- package/dist/grid-sort.js +58 -0
- package/dist/grid-sort.js.map +1 -0
- package/dist/history.d.ts +88 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +146 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +18 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/installation.d.ts +1 -1
- package/dist/kind-list.d.ts +78 -0
- package/dist/kind-list.d.ts.map +1 -0
- package/dist/kind-list.js +176 -0
- package/dist/kind-list.js.map +1 -0
- package/dist/linked.d.ts +95 -0
- package/dist/linked.d.ts.map +1 -0
- package/dist/linked.js +181 -0
- package/dist/linked.js.map +1 -0
- package/dist/mutations/arg-shape.d.ts +2 -0
- package/dist/mutations/arg-shape.d.ts.map +1 -1
- package/dist/mutations/arg-shape.js +4 -0
- package/dist/mutations/arg-shape.js.map +1 -1
- package/dist/mutations/derive-edits.d.ts.map +1 -1
- package/dist/mutations/derive-edits.js +89 -38
- package/dist/mutations/derive-edits.js.map +1 -1
- package/dist/mutations/derived-names.d.ts +3 -1
- package/dist/mutations/derived-names.d.ts.map +1 -1
- package/dist/mutations/derived-names.js +5 -3
- package/dist/mutations/derived-names.js.map +1 -1
- package/dist/mutations/edit-start.d.ts +28 -0
- package/dist/mutations/edit-start.d.ts.map +1 -0
- package/dist/mutations/edit-start.js +24 -0
- package/dist/mutations/edit-start.js.map +1 -0
- package/dist/mutations/form.d.ts +14 -0
- package/dist/mutations/form.d.ts.map +1 -1
- package/dist/mutations/form.js +5 -1
- package/dist/mutations/form.js.map +1 -1
- package/dist/mutations/kept-arguments.js +2 -2
- package/dist/mutations/kept-arguments.js.map +1 -1
- package/dist/mutations/types.d.ts +1 -1
- package/dist/mutations/types.d.ts.map +1 -1
- package/dist/navigate.d.ts +13 -0
- package/dist/navigate.d.ts.map +1 -0
- package/dist/navigate.js +13 -0
- package/dist/navigate.js.map +1 -0
- package/dist/ops/digest.d.ts +33 -0
- package/dist/ops/digest.d.ts.map +1 -0
- package/dist/ops/digest.js +47 -0
- package/dist/ops/digest.js.map +1 -0
- package/dist/ops/lineage.d.ts +13 -0
- package/dist/ops/lineage.d.ts.map +1 -1
- package/dist/ops/lineage.js +6 -4
- package/dist/ops/lineage.js.map +1 -1
- package/dist/ops/log.d.ts +6 -0
- package/dist/ops/log.d.ts.map +1 -1
- package/dist/ops/log.js +19 -12
- package/dist/ops/log.js.map +1 -1
- package/dist/ops/suggestions.d.ts +26 -0
- package/dist/ops/suggestions.d.ts.map +1 -0
- package/dist/ops/suggestions.js +21 -0
- package/dist/ops/suggestions.js.map +1 -0
- package/dist/ops/tidying.d.ts +48 -0
- package/dist/ops/tidying.d.ts.map +1 -0
- package/dist/ops/tidying.js +84 -0
- package/dist/ops/tidying.js.map +1 -0
- package/dist/ops/types.d.ts +17 -0
- package/dist/ops/types.d.ts.map +1 -1
- package/dist/ops/undo.d.ts.map +1 -1
- package/dist/ops/undo.js +10 -0
- package/dist/ops/undo.js.map +1 -1
- package/dist/past.d.ts +35 -0
- package/dist/past.d.ts.map +1 -0
- package/dist/past.js +173 -0
- package/dist/past.js.map +1 -0
- package/dist/permissions/policy.d.ts +8 -1
- package/dist/permissions/policy.d.ts.map +1 -1
- package/dist/permissions/policy.js +20 -5
- package/dist/permissions/policy.js.map +1 -1
- package/dist/places.d.ts +6 -2
- package/dist/places.d.ts.map +1 -1
- package/dist/places.js +48 -3
- package/dist/places.js.map +1 -1
- package/dist/scaffold/agents.d.ts.map +1 -1
- package/dist/scaffold/agents.js +13 -0
- package/dist/scaffold/agents.js.map +1 -1
- package/dist/scaffold/project.d.ts.map +1 -1
- package/dist/scaffold/project.js +8 -0
- package/dist/scaffold/project.js.map +1 -1
- package/dist/scaffold/ui.d.ts.map +1 -1
- package/dist/scaffold/ui.js +18 -5
- package/dist/scaffold/ui.js.map +1 -1
- package/dist/schema/app-address.d.ts +5 -0
- package/dist/schema/app-address.d.ts.map +1 -0
- package/dist/schema/app-address.js +10 -0
- package/dist/schema/app-address.js.map +1 -0
- package/dist/schema/app-link.d.ts +1 -4
- package/dist/schema/app-link.d.ts.map +1 -1
- package/dist/schema/app-link.js +5 -7
- package/dist/schema/app-link.js.map +1 -1
- package/dist/schema/define-node.d.ts +16 -0
- package/dist/schema/define-node.d.ts.map +1 -1
- package/dist/schema/define-node.js +6 -0
- package/dist/schema/define-node.js.map +1 -1
- package/dist/schema/files.d.ts +8 -0
- package/dist/schema/files.d.ts.map +1 -1
- package/dist/schema/files.js.map +1 -1
- package/dist/schema/json-schema.d.ts.map +1 -1
- package/dist/schema/json-schema.js +19 -1
- package/dist/schema/json-schema.js.map +1 -1
- package/dist/schema/linked-field.d.ts +6 -0
- package/dist/schema/linked-field.d.ts.map +1 -0
- package/dist/schema/linked-field.js +34 -0
- package/dist/schema/linked-field.js.map +1 -0
- package/dist/schema/linked-reads.d.ts +20 -0
- package/dist/schema/linked-reads.d.ts.map +1 -0
- package/dist/schema/linked-reads.js +69 -0
- package/dist/schema/linked-reads.js.map +1 -0
- package/dist/schema/linked-schema.d.ts +5 -0
- package/dist/schema/linked-schema.d.ts.map +1 -0
- package/dist/schema/linked-schema.js +9 -0
- package/dist/schema/linked-schema.js.map +1 -0
- package/dist/schema/linked.d.ts +147 -0
- package/dist/schema/linked.d.ts.map +1 -0
- package/dist/schema/linked.js +151 -0
- package/dist/schema/linked.js.map +1 -0
- package/dist/schema/reading.d.ts.map +1 -1
- package/dist/schema/reading.js +82 -27
- package/dist/schema/reading.js.map +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +11 -4
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/types.d.ts +17 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +30 -2
- package/dist/search.js.map +1 -1
- package/dist/seat-of.d.ts +9 -0
- package/dist/seat-of.d.ts.map +1 -0
- package/dist/seat-of.js +14 -0
- package/dist/seat-of.js.map +1 -0
- package/dist/seen.d.ts +0 -12
- package/dist/seen.d.ts.map +1 -1
- package/dist/seen.js +5 -0
- package/dist/seen.js.map +1 -1
- package/dist/store.d.ts +58 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +96 -11
- package/dist/store.js.map +1 -1
- package/dist/subscription-shape.d.ts +135 -0
- package/dist/subscription-shape.d.ts.map +1 -0
- package/dist/subscription-shape.js +55 -0
- package/dist/subscription-shape.js.map +1 -0
- package/dist/subscriptions.d.ts +68 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +425 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/sync/connection-filter.d.ts +12 -0
- package/dist/sync/connection-filter.d.ts.map +1 -0
- package/dist/sync/connection-filter.js +34 -0
- package/dist/sync/connection-filter.js.map +1 -0
- package/dist/sync/connection.d.ts +65 -0
- package/dist/sync/connection.d.ts.map +1 -0
- package/dist/sync/connection.js +148 -0
- package/dist/sync/connection.js.map +1 -0
- package/dist/sync/engine.d.ts.map +1 -1
- package/dist/sync/engine.js +4 -0
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/google-calendar.d.ts +27 -2
- package/dist/sync/google-calendar.d.ts.map +1 -1
- package/dist/sync/google-calendar.js +55 -14
- package/dist/sync/google-calendar.js.map +1 -1
- package/dist/sync/index.d.ts +3 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/theme/derive.d.ts +16 -0
- package/dist/theme/derive.d.ts.map +1 -1
- package/dist/theme/derive.js +14 -0
- package/dist/theme/derive.js.map +1 -1
- package/dist/theme/marks.d.ts +19 -2
- package/dist/theme/marks.d.ts.map +1 -1
- package/dist/theme/marks.js +67 -2
- package/dist/theme/marks.js.map +1 -1
- package/dist/theme/types.d.ts +7 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/theme/types.js.map +1 -1
- package/dist/tidying.d.ts +62 -0
- package/dist/tidying.d.ts.map +1 -0
- package/dist/tidying.js +131 -0
- package/dist/tidying.js.map +1 -0
- package/dist/typed.d.ts +1 -1
- package/dist/typed.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/via.d.ts.map +1 -1
- package/dist/via.js +2 -1
- package/dist/via.js.map +1 -1
- package/dist/views/address.d.ts +13 -0
- package/dist/views/address.d.ts.map +1 -0
- package/dist/views/address.js +29 -0
- package/dist/views/address.js.map +1 -0
- package/dist/views/types.d.ts +52 -3
- package/dist/views/types.d.ts.map +1 -1
- package/dist/views/types.js +4 -3
- package/dist/views/types.js.map +1 -1
- package/dist/wall-time.d.ts +60 -0
- package/dist/wall-time.d.ts.map +1 -0
- package/dist/wall-time.js +111 -0
- package/dist/wall-time.js.map +1 -0
- package/dist/when-typed.d.ts +15 -0
- package/dist/when-typed.d.ts.map +1 -0
- package/dist/when-typed.js +158 -0
- package/dist/when-typed.js.map +1 -0
- package/dist/words.d.ts +6 -1
- package/dist/words.d.ts.map +1 -1
- package/dist/words.js +6 -1
- package/dist/words.js.map +1 -1
- package/package.json +29 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/** A document's kind's fields, as `ListFields` says them: what the edit judges before anything is compiled. */
|
|
2
|
+
export function documentListFields(spec) {
|
|
3
|
+
const fields = {};
|
|
4
|
+
for (const [name, field] of Object.entries(spec?.fields ?? {})) {
|
|
5
|
+
fields[name] =
|
|
6
|
+
field.type === "enum"
|
|
7
|
+
? { type: "choice", options: field.options ?? [] }
|
|
8
|
+
: field.type === "boolean"
|
|
9
|
+
? { type: "boolean" }
|
|
10
|
+
: ["list", "image", "file", "app-link", "place"].includes(field.type ?? "")
|
|
11
|
+
? { type: "other" }
|
|
12
|
+
: { type: "scalar" };
|
|
13
|
+
}
|
|
14
|
+
return { fields, computed: Object.keys(spec?.computed ?? {}) };
|
|
15
|
+
}
|
|
16
|
+
const MOST_TIEBREAKS = 3;
|
|
17
|
+
/** A declared sort, said either way, as an arrangement's sort with its tiebreaks. */
|
|
18
|
+
export function listSort(spec) {
|
|
19
|
+
if (spec === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (typeof spec === "string")
|
|
22
|
+
return { by: spec, direction: "asc" };
|
|
23
|
+
const then = spec.then === undefined ? undefined : typeof spec.then === "string" ? { by: spec.then, direction: "asc" } : { by: spec.then.by, direction: spec.then.direction ?? "asc" };
|
|
24
|
+
return { by: spec.by, direction: spec.direction ?? "asc", ...(then ? { then } : {}) };
|
|
25
|
+
}
|
|
26
|
+
/** A declared grouping, said either way, in its whole form. */
|
|
27
|
+
export function listGroup(spec) {
|
|
28
|
+
if (spec === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
return typeof spec === "string" ? { by: spec } : spec;
|
|
31
|
+
}
|
|
32
|
+
/** How a kind's list opens when its address says nothing: its declared sort and grouping. */
|
|
33
|
+
export function listOpening(list) {
|
|
34
|
+
const sort = listSort(list?.sort);
|
|
35
|
+
const group = listGroup(list?.group);
|
|
36
|
+
if (!sort && !group)
|
|
37
|
+
return undefined;
|
|
38
|
+
return { ...(sort ? { sort } : {}), ...(group ? { group: { by: group.by } } : {}) };
|
|
39
|
+
}
|
|
40
|
+
/** A group's value as the declaration names it: a yes-or-no group's key ("1", "0") is `"true"` or `"false"`. */
|
|
41
|
+
const valueOf = (key, boolean) => (boolean ? (key === "1" ? "true" : "false") : key);
|
|
42
|
+
/**
|
|
43
|
+
* The groups in the declared order — the order it names, then the rest in
|
|
44
|
+
* their declared order, the group with nothing to say after those — and
|
|
45
|
+
* the closed ones last, each marked. A group the address asked for some
|
|
46
|
+
* other way is left as `arrange` drew it.
|
|
47
|
+
*/
|
|
48
|
+
export function orderListGroups(groups, spec, field) {
|
|
49
|
+
const boolean = field.type === "boolean";
|
|
50
|
+
const options = boolean ? ["true", "false"] : (field.options ?? []);
|
|
51
|
+
const order = [...new Set([...(spec.order ?? []).filter((value) => options.includes(value)), ...options])];
|
|
52
|
+
const closed = spec.closed ?? [];
|
|
53
|
+
// Open groups in their order; closed ones in the order the declaration closes them.
|
|
54
|
+
const rank = (group) => {
|
|
55
|
+
if (group.key === "")
|
|
56
|
+
return [1, 0];
|
|
57
|
+
const value = valueOf(group.key, boolean);
|
|
58
|
+
if (closed.includes(value))
|
|
59
|
+
return [2, closed.indexOf(value)];
|
|
60
|
+
const at = order.indexOf(value);
|
|
61
|
+
return [0, at < 0 ? order.length : at];
|
|
62
|
+
};
|
|
63
|
+
return groups
|
|
64
|
+
.map((group, at) => ({ group, at, rank: rank(group) }))
|
|
65
|
+
.sort((a, b) => a.rank[0] - b.rank[0] || a.rank[1] - b.rank[1] || a.at - b.at)
|
|
66
|
+
.map(({ group, rank }) => ({ ...group, closed: rank[0] === 2 }));
|
|
67
|
+
}
|
|
68
|
+
/** A direction, in the words a key's values read in: "highest first", "A to Z". */
|
|
69
|
+
function directionSaid(type, direction) {
|
|
70
|
+
const words = {
|
|
71
|
+
date: ["earliest first", "latest first"],
|
|
72
|
+
number: ["lowest first", "highest first"],
|
|
73
|
+
boolean: ["no first", "yes first"],
|
|
74
|
+
choice: ["in their order", "in reverse order"],
|
|
75
|
+
text: ["A to Z", "Z to A"],
|
|
76
|
+
}[type];
|
|
77
|
+
return words[direction === "desc" ? 1 : 0];
|
|
78
|
+
}
|
|
79
|
+
/** What a document's field type reads as, for the words a sort is said in. */
|
|
80
|
+
export function sortTypeOfDocumentField(type) {
|
|
81
|
+
if (type === "enum")
|
|
82
|
+
return "choice";
|
|
83
|
+
if (type === "boolean")
|
|
84
|
+
return "boolean";
|
|
85
|
+
if (type === "number" || type === "integer" || type === "duration")
|
|
86
|
+
return "number";
|
|
87
|
+
if (type === "date" || type === "datetime")
|
|
88
|
+
return "date";
|
|
89
|
+
return "text";
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* A kind's declared order and grouping, said: `sorted by "votes", highest
|
|
93
|
+
* first, then "label", A to Z` and `grouped by "status", done and declined
|
|
94
|
+
* closed at the end`. `typeOf` says what a key's values are (a computed
|
|
95
|
+
* field is a number).
|
|
96
|
+
*/
|
|
97
|
+
export function kindListWords(list, typeOf) {
|
|
98
|
+
const out = {};
|
|
99
|
+
const sort = listSort(list.sort);
|
|
100
|
+
if (sort) {
|
|
101
|
+
const parts = [];
|
|
102
|
+
for (let at = sort, depth = 0; at && depth <= MOST_TIEBREAKS; at = at.then, depth += 1) {
|
|
103
|
+
parts.push(`${depth === 0 ? "sorted by" : "then"} "${at.by}", ${directionSaid(at.by === "label" ? "text" : typeOf(at.by), at.direction)}`);
|
|
104
|
+
}
|
|
105
|
+
out.sort = parts.join(", ");
|
|
106
|
+
}
|
|
107
|
+
const group = listGroup(list.group);
|
|
108
|
+
if (group) {
|
|
109
|
+
const quoted = (values) => values.map((value) => `"${value}"`);
|
|
110
|
+
const join = (values) => (values.length <= 1 ? values.join("") : `${values.slice(0, -1).join(", ")} and ${values.at(-1)}`);
|
|
111
|
+
const order = group.order?.length ? `, ${join(quoted(group.order))} first` : "";
|
|
112
|
+
const closed = group.closed?.length ? `, ${join(quoted(group.closed))} closed at the end` : "";
|
|
113
|
+
out.group = `grouped by "${group.by}"${order}${closed}`;
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* What is wrong with a kind's declared order and grouping, each said in a
|
|
119
|
+
* sentence: a sort by what the kind does not have, a grouping by a field
|
|
120
|
+
* that is not a choice or a yes or no, a group's order or a closed group
|
|
121
|
+
* naming a value the field does not offer.
|
|
122
|
+
*/
|
|
123
|
+
export function kindListFindings(kind, list, shape, at = `pages.lists.${kind}`) {
|
|
124
|
+
const out = [];
|
|
125
|
+
const sortable = ["label", ...Object.entries(shape.fields).filter(([, field]) => field.type !== "other").map(([name]) => name), ...shape.computed];
|
|
126
|
+
if (list.sort !== undefined) {
|
|
127
|
+
const sort = listSort(list.sort);
|
|
128
|
+
const keys = [[sort.by, `${at}.sort${typeof list.sort === "string" ? "" : ".by"}`]];
|
|
129
|
+
for (let then = sort.then, depth = 0; then && depth < MOST_TIEBREAKS; then = then.then, depth += 1)
|
|
130
|
+
keys.push([then.by, `${at}.sort.then`]);
|
|
131
|
+
for (const [by, path] of keys) {
|
|
132
|
+
if (sortable.includes(by))
|
|
133
|
+
continue;
|
|
134
|
+
const field = shape.fields[by];
|
|
135
|
+
out.push({
|
|
136
|
+
path,
|
|
137
|
+
message: field
|
|
138
|
+
? `The ${kind} list cannot be sorted by "${by}": it is a field no list sorts by (a list, a file, a picture).`
|
|
139
|
+
: `The ${kind} list cannot be sorted by "${by}": ${kind} has no field or computed field called that.`,
|
|
140
|
+
fix: `Sort by ${sortable.map((key) => `"${key}"`).join(", ")}.`,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (list.group !== undefined) {
|
|
145
|
+
const group = listGroup(list.group);
|
|
146
|
+
const groupAt = `${at}.group${typeof list.group === "string" ? "" : ".by"}`;
|
|
147
|
+
const field = shape.fields[group.by];
|
|
148
|
+
const groupable = Object.entries(shape.fields).filter(([, one]) => one.type === "choice" || one.type === "boolean").map(([name]) => `"${name}"`);
|
|
149
|
+
const fix = groupable.length > 0 ? `Group by ${groupable.join(", ")}.` : `${kind} has no choice or yes-or-no field to group by; add one, or leave the list ungrouped.`;
|
|
150
|
+
if (!field) {
|
|
151
|
+
out.push({ path: groupAt, message: `The ${kind} list cannot be grouped by "${group.by}": ${kind} has no field called that${shape.computed.includes(group.by) ? " it stores (a computed field is not grouped by)" : ""}.`, fix });
|
|
152
|
+
}
|
|
153
|
+
else if (field.type !== "choice" && field.type !== "boolean") {
|
|
154
|
+
out.push({ path: groupAt, message: `The ${kind} list cannot be grouped by "${group.by}": a list groups by a choice or a yes-or-no field, and ${group.by} is neither.`, fix });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const options = field.type === "boolean" ? ["true", "false"] : (field.options ?? []);
|
|
158
|
+
const said = options.map((option) => `"${option}"`).join(", ");
|
|
159
|
+
for (const part of ["order", "closed"]) {
|
|
160
|
+
(group[part] ?? []).forEach((value, n) => {
|
|
161
|
+
if (options.includes(value))
|
|
162
|
+
return;
|
|
163
|
+
out.push({
|
|
164
|
+
path: `${at}.group.${part}.${n}`,
|
|
165
|
+
message: part === "closed"
|
|
166
|
+
? `The ${kind} list cannot close the "${value}" group: "${value}" is not one of ${group.by}'s choices.`
|
|
167
|
+
: `The ${kind} list cannot put the "${value}" group in order: "${value}" is not one of ${group.by}'s choices.`,
|
|
168
|
+
fix: `Name ${said}.`,
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return out;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=kind-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kind-list.js","sourceRoot":"","sources":["../src/kind-list.ts"],"names":[],"mappings":"AAwBA,+GAA+G;AAC/G,MAAM,UAAU,kBAAkB,CAAC,IAAyL;IAC1N,MAAM,MAAM,GAAiD,EAAE,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,CAAC,IAAI,KAAK,MAAM;gBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE;gBAClD,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;oBACxB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;oBACrB,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;wBACzE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;wBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC;AAQD,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,IAAsB;IAC7C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,KAAc,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC;IAChM,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC/C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,WAAW,CAAC,IAA0B;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,gHAAgH;AAChH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,OAAgB,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE9G;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAmC,EACnC,IAAmB,EACnB,KAAoF;IAEpF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IACjC,oFAAoF;IACpF,MAAM,IAAI,GAAG,CAAC,KAAuB,EAAoB,EAAE;QACzD,IAAI,KAAK,CAAC,GAAG,KAAK,EAAE;YAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC;IACF,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;SAC7E,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,mFAAmF;AACnF,SAAS,aAAa,CAAC,IAAuD,EAAE,SAAyB;IACvG,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;QACxC,MAAM,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;QACzC,OAAO,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QAClC,MAAM,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;QAC9C,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;KAC3B,CAAC,IAAI,CAAC,CAAC;IACR,OAAO,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAAC,IAAwB;IAC9D,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IACpF,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAC1D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,MAA0E;IACtH,MAAM,GAAG,GAAsC,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,EAAE,GAAqB,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,KAAK,IAAI,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACzG,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7I,CAAC;QACD,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,CAAC,MAAyB,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,CAAC,MAAyB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9I,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,GAAG,CAAC,KAAK,GAAG,eAAe,KAAK,CAAC,EAAE,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAc,EAAE,KAAiB,EAAE,EAAE,GAAG,eAAe,IAAI,EAAE;IAC1G,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnJ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC;QAClC,MAAM,IAAI,GAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxG,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,KAAK,GAAG,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5I,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9B,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,SAAS;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI;gBACJ,OAAO,EAAE,KAAK;oBACZ,CAAC,CAAC,OAAO,IAAI,8BAA8B,EAAE,gEAAgE;oBAC7G,CAAC,CAAC,OAAO,IAAI,8BAA8B,EAAE,MAAM,IAAI,8CAA8C;gBACvG,GAAG,EAAE,WAAW,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAChE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,EAAE,SAAS,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACjJ,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,sFAAsF,CAAC;QACvK,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,+BAA+B,KAAK,CAAC,EAAE,MAAM,IAAI,4BAA4B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACnO,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,+BAA+B,KAAK,CAAC,EAAE,0DAA0D,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;QAChL,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/D,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;gBAChD,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,OAAO;oBACpC,GAAG,CAAC,IAAI,CAAC;wBACP,IAAI,EAAE,GAAG,EAAE,UAAU,IAAI,IAAI,CAAC,EAAE;wBAChC,OAAO,EACL,IAAI,KAAK,QAAQ;4BACf,CAAC,CAAC,OAAO,IAAI,2BAA2B,KAAK,aAAa,KAAK,mBAAmB,KAAK,CAAC,EAAE,aAAa;4BACvG,CAAC,CAAC,OAAO,IAAI,yBAAyB,KAAK,sBAAsB,KAAK,mBAAmB,KAAK,CAAC,EAAE,aAAa;wBAClH,GAAG,EAAE,QAAQ,IAAI,GAAG;qBACrB,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/linked.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@graview/core/linked` — RECORDS IN ANOTHER APP, READ AS THE VIEWER (FR-171).
|
|
3
|
+
*
|
|
4
|
+
* A relation may go to a kind in another app (`"to": ["@nick/house/house"]`);
|
|
5
|
+
* the record that links keeps which one (`house:h1`) and the host reads the
|
|
6
|
+
* far record as whoever is looking (`LinkedRecords`, on `@graview/core`).
|
|
7
|
+
* This entry is what a host and a face need beyond that, fetched when a
|
|
8
|
+
* link is first drawn or a host first serves one:
|
|
9
|
+
*
|
|
10
|
+
* - `linkedRecordsOver` — the host over apps it holds in memory: each far
|
|
11
|
+
* record read through the far store's `seenBy(viewer)`, so a viewer is
|
|
12
|
+
* told only what they may see there, and refused an app they may not
|
|
13
|
+
* open. The tests read two compiled documents through it; a host serving
|
|
14
|
+
* many apps answers the same shape from its own store.
|
|
15
|
+
* - `readLinkedRecord` — one record of a store, as a viewer is told it.
|
|
16
|
+
* - `linkedChange`, `recordLinkedChange` — a far value's change, kept in the
|
|
17
|
+
* READING app's history: an op authored by the far app (`system`,
|
|
18
|
+
* `app:<address>`, via `app:<address>`) on each record that links it,
|
|
19
|
+
* naming what changed and nothing of its value.
|
|
20
|
+
* - `linkedRelationWords` — a relation to another app, said: what
|
|
21
|
+
* `describe_app` and the agent's tools tell a model.
|
|
22
|
+
*/
|
|
23
|
+
import "./field-sight.js";
|
|
24
|
+
import { type LinkedRead, type LinkedReader, type LinkedRecord, type LinkedRecordAnswer, type LinkedRecordRef, type LinkedRecords, type LinkedRelation, type LinkedSearch, type LinkedViewer } from "./schema/linked.js";
|
|
25
|
+
import type { AnySchema } from "./schema/schema.js";
|
|
26
|
+
import type { Operation } from "./ops/types.js";
|
|
27
|
+
import type { Store } from "./store.js";
|
|
28
|
+
export type { LinkedRead, LinkedReader, LinkedRecord, LinkedRecordAnswer, LinkedRecordRef, LinkedRecords, LinkedRelation, LinkedSearch, LinkedViewer };
|
|
29
|
+
/** An app a host holds, as far records are read from it. */
|
|
30
|
+
export interface LinkedHome {
|
|
31
|
+
/** The far app's store: its records, its policy and its sights. */
|
|
32
|
+
readonly store: Store<AnySchema>;
|
|
33
|
+
/** What the app is called, as a history line says where a change came from. */
|
|
34
|
+
readonly name?: string;
|
|
35
|
+
/** Whether a viewer may open the app at all; everyone, when unsaid. */
|
|
36
|
+
readonly opens?: (viewer: LinkedViewer) => boolean;
|
|
37
|
+
/** Where a record opens in the app: a path on the host or an http(s) address. */
|
|
38
|
+
readonly href?: (ref: LinkedRecordRef) => string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* ONE RECORD OF A STORE, AS A VIEWER IS TOLD IT: read through the store's
|
|
42
|
+
* `seenBy(viewer)`, so a record they may not see is null and a field kept
|
|
43
|
+
* from them is not there — its label, its describe line, its card (a
|
|
44
|
+
* glance, field by field, in words) and its values, computed ones too.
|
|
45
|
+
*/
|
|
46
|
+
export declare function readLinkedRecord(store: Store<AnySchema>, ref: LinkedRecordRef, viewer: LinkedViewer, options?: {
|
|
47
|
+
readonly href?: string;
|
|
48
|
+
readonly app?: string;
|
|
49
|
+
}): LinkedRecord | null;
|
|
50
|
+
/**
|
|
51
|
+
* THE HOST, OVER APPS IT HOLDS IN MEMORY (FR-171): every answer as the
|
|
52
|
+
* viewer. An address it does not hold, or a record not there for this
|
|
53
|
+
* viewer, is null; an app the viewer may not open is `{ denied: true }`,
|
|
54
|
+
* for a record and for a search alike — nothing of it is said.
|
|
55
|
+
*/
|
|
56
|
+
export declare function linkedRecordsOver(homes: Readonly<Record<string, LinkedHome>>, options?: {
|
|
57
|
+
readonly open?: LinkedRecords["open"];
|
|
58
|
+
}): LinkedRecords;
|
|
59
|
+
/** The fields whose values differ between two readings of one far record, in the order the later one holds them. */
|
|
60
|
+
export declare function linkedChange(before: LinkedRecord, after: LinkedRecord): readonly string[];
|
|
61
|
+
/** A far record's change, as its host tells the app that reads it. */
|
|
62
|
+
export interface LinkedChange {
|
|
63
|
+
readonly ref: LinkedRecordRef;
|
|
64
|
+
/** Which of its fields changed; their values are the far app's, and not kept here. */
|
|
65
|
+
readonly fields: readonly string[];
|
|
66
|
+
/** What the far app is called, as the history says where the change came from; its address when unsaid. */
|
|
67
|
+
readonly app?: string;
|
|
68
|
+
/** When it changed there; the store's clock when unsaid. */
|
|
69
|
+
readonly at?: string;
|
|
70
|
+
}
|
|
71
|
+
/** The records of a store that link a far record, and the relation each links it by. */
|
|
72
|
+
export declare function recordsLinking(store: Store<AnySchema>, ref: LinkedRecordRef): readonly {
|
|
73
|
+
readonly id: string;
|
|
74
|
+
readonly relation: string;
|
|
75
|
+
}[];
|
|
76
|
+
/**
|
|
77
|
+
* A FAR VALUE'S CHANGE, KEPT IN THE READING APP'S HISTORY (FR-171): one op
|
|
78
|
+
* on each record that links the far record, in one batch, authored by the
|
|
79
|
+
* far app — `{ kind: "system", id: "app:<address>", name }`, via
|
|
80
|
+
* `app:<address>` — saying which of its fields changed and nothing of
|
|
81
|
+
* their values, which are the far app's to show to whoever may see them.
|
|
82
|
+
* It reads the linking record and writes nothing: the reading app's own
|
|
83
|
+
* values are as they were, and its Activity and the record's history say
|
|
84
|
+
* "Buy it outright: the linked house changed in House — list price".
|
|
85
|
+
* Nothing is kept when no record links it or nothing changed.
|
|
86
|
+
*/
|
|
87
|
+
export declare function recordLinkedChange(store: Store<AnySchema>, change: LinkedChange): readonly Operation[];
|
|
88
|
+
/**
|
|
89
|
+
* A RELATION TO ANOTHER APP, SAID — for `describe_app`, the agent's tools and
|
|
90
|
+
* a person reading the declaration: where it goes, how many, and how one is
|
|
91
|
+
* linked. "forHouse → one house in the app @nick/house (another app; link
|
|
92
|
+
* one by setting forHouse to "house:<id>", an id the host's search finds)".
|
|
93
|
+
*/
|
|
94
|
+
export declare function linkedRelationWords(name: string, relation: LinkedRelation, editAct?: string): string;
|
|
95
|
+
//# sourceMappingURL=linked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked.d.ts","sourceRoot":"","sources":["../src/linked.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,kBAAkB,CAAC;AAK1B,OAAO,EAA8C,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrQ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAEvJ,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC;IACnD,iFAAiF;IACjF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;CAClD;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,GAAG,IAAI,CAK1L;AA0BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAO,GAAG,aAAa,CA6BrJ;AAED,oHAAoH;AACpH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAGzF;AAED,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,2GAA2G;IAC3G,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,eAAe,GAAG,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,CAY3I;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,SAAS,EAAE,CAuBtG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpG"}
|
package/dist/linked.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@graview/core/linked` — RECORDS IN ANOTHER APP, READ AS THE VIEWER (FR-171).
|
|
3
|
+
*
|
|
4
|
+
* A relation may go to a kind in another app (`"to": ["@nick/house/house"]`);
|
|
5
|
+
* the record that links keeps which one (`house:h1`) and the host reads the
|
|
6
|
+
* far record as whoever is looking (`LinkedRecords`, on `@graview/core`).
|
|
7
|
+
* This entry is what a host and a face need beyond that, fetched when a
|
|
8
|
+
* link is first drawn or a host first serves one:
|
|
9
|
+
*
|
|
10
|
+
* - `linkedRecordsOver` — the host over apps it holds in memory: each far
|
|
11
|
+
* record read through the far store's `seenBy(viewer)`, so a viewer is
|
|
12
|
+
* told only what they may see there, and refused an app they may not
|
|
13
|
+
* open. The tests read two compiled documents through it; a host serving
|
|
14
|
+
* many apps answers the same shape from its own store.
|
|
15
|
+
* - `readLinkedRecord` — one record of a store, as a viewer is told it.
|
|
16
|
+
* - `linkedChange`, `recordLinkedChange` — a far value's change, kept in the
|
|
17
|
+
* READING app's history: an op authored by the far app (`system`,
|
|
18
|
+
* `app:<address>`, via `app:<address>`) on each record that links it,
|
|
19
|
+
* naming what changed and nothing of its value.
|
|
20
|
+
* - `linkedRelationWords` — a relation to another app, said: what
|
|
21
|
+
* `describe_app` and the agent's tools tell a model.
|
|
22
|
+
*/
|
|
23
|
+
// A host serves seats: a sight that hides a field shows the rest, never nothing (`@graview/core/field-sight`).
|
|
24
|
+
import "./field-sight.js";
|
|
25
|
+
import { labelOf } from "./schema/define-node.js";
|
|
26
|
+
import { humanizeField } from "./schema/define-node.js";
|
|
27
|
+
import { readableFields } from "./schema/reading.js";
|
|
28
|
+
import { computedValues } from "./document/computed-values.js";
|
|
29
|
+
import { linkedRelations, linkedRefsOf, linkedValue } from "./schema/linked.js";
|
|
30
|
+
const asPrincipal = (viewer) => ({ kind: viewer.kind, ...(viewer.id === undefined ? {} : { id: viewer.id }), ...(viewer.roles ? { roles: viewer.roles } : {}) });
|
|
31
|
+
const NOT_A_FIELD = new Set(["id", "kind"]);
|
|
32
|
+
/**
|
|
33
|
+
* ONE RECORD OF A STORE, AS A VIEWER IS TOLD IT: read through the store's
|
|
34
|
+
* `seenBy(viewer)`, so a record they may not see is null and a field kept
|
|
35
|
+
* from them is not there — its label, its describe line, its card (a
|
|
36
|
+
* glance, field by field, in words) and its values, computed ones too.
|
|
37
|
+
*/
|
|
38
|
+
export function readLinkedRecord(store, ref, viewer, options = {}) {
|
|
39
|
+
const seen = store.seenBy(asPrincipal(viewer));
|
|
40
|
+
const node = seen.graph.getNode(ref.id);
|
|
41
|
+
if (!node || node.kind !== ref.kind)
|
|
42
|
+
return null;
|
|
43
|
+
return recordOf(seen, node, ref.address, options);
|
|
44
|
+
}
|
|
45
|
+
function recordOf(seen, node, address, options) {
|
|
46
|
+
const definition = seen.schema.tryDefinition(node.kind);
|
|
47
|
+
const { values } = computedValues(seen.schema, seen.graph, node);
|
|
48
|
+
const fields = {};
|
|
49
|
+
for (const [key, value] of Object.entries(node))
|
|
50
|
+
if (!NOT_A_FIELD.has(key) && value !== undefined)
|
|
51
|
+
fields[key] = value;
|
|
52
|
+
for (const [key, value] of Object.entries(values))
|
|
53
|
+
fields[key] = typeof value === "object" && value !== null && !Array.isArray(value) ? value.label : value;
|
|
54
|
+
const label = labelOf(definition, node);
|
|
55
|
+
const describe = definition?.describe?.(node)?.trim();
|
|
56
|
+
const card = readableFields(node, definition, { glance: true, limit: 4, said: [label] })
|
|
57
|
+
.filter((field) => !field.files && !field.app)
|
|
58
|
+
.map((field) => ({ label: field.label, text: field.value }));
|
|
59
|
+
return {
|
|
60
|
+
address,
|
|
61
|
+
kind: node.kind,
|
|
62
|
+
id: node.id,
|
|
63
|
+
label,
|
|
64
|
+
...(describe ? { describe } : {}),
|
|
65
|
+
...(card.length > 0 ? { card } : {}),
|
|
66
|
+
fields,
|
|
67
|
+
...(options.href ? { href: options.href } : {}),
|
|
68
|
+
...(options.app ? { app: options.app } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* THE HOST, OVER APPS IT HOLDS IN MEMORY (FR-171): every answer as the
|
|
73
|
+
* viewer. An address it does not hold, or a record not there for this
|
|
74
|
+
* viewer, is null; an app the viewer may not open is `{ denied: true }`,
|
|
75
|
+
* for a record and for a search alike — nothing of it is said.
|
|
76
|
+
*/
|
|
77
|
+
export function linkedRecordsOver(homes, options = {}) {
|
|
78
|
+
const homeOf = (address) => (Object.hasOwn(homes, address) ? homes[address] : undefined);
|
|
79
|
+
return {
|
|
80
|
+
async resolve(ref, viewer) {
|
|
81
|
+
const home = homeOf(ref.address);
|
|
82
|
+
if (!home)
|
|
83
|
+
return null;
|
|
84
|
+
if (home.opens && !home.opens(viewer))
|
|
85
|
+
return { denied: true };
|
|
86
|
+
return readLinkedRecord(home.store, ref, viewer, { ...(home.href ? { href: home.href(ref) } : {}), ...(home.name ? { app: home.name } : {}) });
|
|
87
|
+
},
|
|
88
|
+
async find(search, viewer) {
|
|
89
|
+
const home = homeOf(search.address);
|
|
90
|
+
if (!home)
|
|
91
|
+
return [];
|
|
92
|
+
if (home.opens && !home.opens(viewer))
|
|
93
|
+
return { denied: true };
|
|
94
|
+
const seen = home.store.seenBy(asPrincipal(viewer));
|
|
95
|
+
const words = search.query.trim().toLowerCase();
|
|
96
|
+
const found = [];
|
|
97
|
+
for (const kind of search.kinds) {
|
|
98
|
+
for (const node of seen.graph.nodesOfKind(kind)) {
|
|
99
|
+
if (found.length >= search.limit)
|
|
100
|
+
break;
|
|
101
|
+
const label = labelOf(seen.schema.tryDefinition(kind), node);
|
|
102
|
+
if (words && !label.toLowerCase().includes(words))
|
|
103
|
+
continue;
|
|
104
|
+
const ref = { address: search.address, kind, id: node.id };
|
|
105
|
+
found.push(recordOf(seen, node, search.address, { ...(home.href ? { href: home.href(ref) } : {}), ...(home.name ? { app: home.name } : {}) }));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return found;
|
|
109
|
+
},
|
|
110
|
+
...(options.open ? { open: options.open } : {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/** The fields whose values differ between two readings of one far record, in the order the later one holds them. */
|
|
114
|
+
export function linkedChange(before, after) {
|
|
115
|
+
const keys = [...new Set([...Object.keys(after.fields), ...Object.keys(before.fields)])];
|
|
116
|
+
return keys.filter((key) => JSON.stringify(before.fields[key]) !== JSON.stringify(after.fields[key]));
|
|
117
|
+
}
|
|
118
|
+
/** The records of a store that link a far record, and the relation each links it by. */
|
|
119
|
+
export function recordsLinking(store, ref) {
|
|
120
|
+
const kept = linkedValue(ref);
|
|
121
|
+
const found = [];
|
|
122
|
+
for (const kind of store.schema.kinds) {
|
|
123
|
+
for (const [relation, link] of linkedRelations(store.schema.tryDefinition(kind))) {
|
|
124
|
+
if (link.address !== ref.address || !link.kinds.includes(ref.kind))
|
|
125
|
+
continue;
|
|
126
|
+
for (const node of store.graph.nodesOfKind(kind, { archived: "all" })) {
|
|
127
|
+
if (linkedRefsOf(node[relation], link).some((one) => linkedValue(one) === kept))
|
|
128
|
+
found.push({ id: node["id"], relation });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return found;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* A FAR VALUE'S CHANGE, KEPT IN THE READING APP'S HISTORY (FR-171): one op
|
|
136
|
+
* on each record that links the far record, in one batch, authored by the
|
|
137
|
+
* far app — `{ kind: "system", id: "app:<address>", name }`, via
|
|
138
|
+
* `app:<address>` — saying which of its fields changed and nothing of
|
|
139
|
+
* their values, which are the far app's to show to whoever may see them.
|
|
140
|
+
* It reads the linking record and writes nothing: the reading app's own
|
|
141
|
+
* values are as they were, and its Activity and the record's history say
|
|
142
|
+
* "Buy it outright: the linked house changed in House — list price".
|
|
143
|
+
* Nothing is kept when no record links it or nothing changed.
|
|
144
|
+
*/
|
|
145
|
+
export function recordLinkedChange(store, change) {
|
|
146
|
+
if (change.fields.length === 0)
|
|
147
|
+
return [];
|
|
148
|
+
const linking = recordsLinking(store, change.ref);
|
|
149
|
+
if (linking.length === 0)
|
|
150
|
+
return [];
|
|
151
|
+
const app = change.app ?? change.ref.address;
|
|
152
|
+
const what = change.fields.map((field) => humanizeField(field).toLowerCase()).join(", ");
|
|
153
|
+
const author = { kind: "system", id: `app:${change.ref.address}`, name: app };
|
|
154
|
+
return store.append(linking.map(({ id }) => {
|
|
155
|
+
const node = store.graph.getNode(id);
|
|
156
|
+
const label = node ? labelOf(store.schema.tryDefinition(node.kind), node) : id;
|
|
157
|
+
return {
|
|
158
|
+
primitives: [],
|
|
159
|
+
author,
|
|
160
|
+
// The far kind's noun is its own app's: the record is said as the link it is.
|
|
161
|
+
intent: `${label}: the linked record changed in ${app} — ${what}`,
|
|
162
|
+
reads: [id],
|
|
163
|
+
writes: [],
|
|
164
|
+
via: `app:${change.ref.address}`,
|
|
165
|
+
...(change.at ? { at: change.at } : {}),
|
|
166
|
+
};
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* A RELATION TO ANOTHER APP, SAID — for `describe_app`, the agent's tools and
|
|
171
|
+
* a person reading the declaration: where it goes, how many, and how one is
|
|
172
|
+
* linked. "forHouse → one house in the app @nick/house (another app; link
|
|
173
|
+
* one by setting forHouse to "house:<id>", an id the host's search finds)".
|
|
174
|
+
*/
|
|
175
|
+
export function linkedRelationWords(name, relation, editAct) {
|
|
176
|
+
const kinds = relation.kinds.join(" or ");
|
|
177
|
+
const many = relation.cardinality === "many";
|
|
178
|
+
const how = `link ${many ? "them" : "one"} by setting ${name} to ${many ? "a list of " : ""}"${relation.kinds[0]}:<id>"${editAct ? ` with ${editAct}` : ""}, an id found in that app (find_linked)`;
|
|
179
|
+
return `${name} → ${many ? "records of" : "one"} ${kinds} in the app ${relation.address} (another app, read as the viewer; ${how})`;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=linked.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked.js","sourceRoot":"","sources":["../src/linked.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,8 @@ export type ArgShape =
|
|
|
29
29
|
| {
|
|
30
30
|
readonly type: "date";
|
|
31
31
|
readonly time?: true;
|
|
32
|
+
/** A moment that names an instant (a document's `datetime`, `z.iso.datetime()`): typed on the reader's clock and kept in UTC with its `Z`. Without it, a time is kept as the wall time written. */
|
|
33
|
+
readonly instant?: true;
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
36
|
* A number, and its range where it says one: `step` is what its values are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arg-shape.d.ts","sourceRoot":"","sources":["../../src/mutations/arg-shape.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arg-shape.d.ts","sourceRoot":"","sources":["../../src/mutations/arg-shape.ts"],"names":[],"mappings":"AAIA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAUrE;;;;;;;;;GASG;AACH,MAAM,MAAM,QAAQ;AAClB;;;;GAIG;AACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE;AACrF;;;;;GAKG;GACD;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,mMAAmM;IACnM,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;CACzB;AACH;;;;;;GAMG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,GACzJ;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE;AAClE;;;;;;;GAOG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE;AAC9B;;;;;;;;GAQG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE;AACrD,wIAAwI;GACtI;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEjC,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG/C;AAeD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAmErD;AAED,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAI/D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defOf } from "../schema/zod.js";
|
|
2
|
+
import { isMoment } from "../days.js";
|
|
2
3
|
import { fileKindOf } from "../schema/files.js";
|
|
3
4
|
import { typedFieldOf } from "../schema/typed-field-of.js";
|
|
4
5
|
import { amountOf } from "../schema/amount-mark.js";
|
|
@@ -74,6 +75,9 @@ export function describeArg(schema) {
|
|
|
74
75
|
};
|
|
75
76
|
}
|
|
76
77
|
if (type === "string") {
|
|
78
|
+
// A moment that names an instant: a document's `datetime` (checked by `isMoment`) or zod's own ISO date and time.
|
|
79
|
+
if (checks.some((check) => check.fn === isMoment || check.format === "datetime") || def?.format === "datetime")
|
|
80
|
+
return { type: "date", time: true, instant: true };
|
|
77
81
|
// A date is a string with a date-shaped pattern. Recognizing it means
|
|
78
82
|
// the interface offers a date picker instead of a free text box, which
|
|
79
83
|
// is the difference between an action anyone can run and one only its
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arg-shape.js","sourceRoot":"","sources":["../../src/mutations/arg-shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAmB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"arg-shape.js","sourceRoot":"","sources":["../../src/mutations/arg-shape.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-edits.d.ts","sourceRoot":"","sources":["../../src/mutations/derive-edits.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"derive-edits.d.ts","sourceRoot":"","sources":["../../src/mutations/derive-edits.ts"],"names":[],"mappings":"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"}
|