@graview/core 0.1.12 → 0.1.14
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 +23 -2
- package/dist/address.d.ts +31 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.js +53 -0
- package/dist/address.js.map +1 -0
- package/dist/app.d.ts +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/arrange.d.ts +13 -183
- package/dist/arrange.d.ts.map +1 -1
- package/dist/arrange.js +12 -470
- package/dist/arrange.js.map +1 -1
- package/dist/arrangement.d.ts +169 -0
- package/dist/arrangement.d.ts.map +1 -0
- package/dist/arrangement.js +220 -0
- package/dist/arrangement.js.map +1 -0
- package/dist/arranging.d.ts +28 -0
- package/dist/arranging.d.ts.map +1 -0
- package/dist/arranging.js +264 -0
- package/dist/arranging.js.map +1 -0
- package/dist/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/cli/check/hidden-reads.d.ts.map +1 -1
- package/dist/cli/check/hidden-reads.js +31 -0
- package/dist/cli/check/hidden-reads.js.map +1 -1
- package/dist/cli/check/lenses.d.ts.map +1 -1
- package/dist/cli/check/lenses.js +29 -1
- package/dist/cli/check/lenses.js.map +1 -1
- package/dist/cli/describe.d.ts.map +1 -1
- package/dist/cli/describe.js +16 -6
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/docs.js +1 -1
- package/dist/cli/docs.js.map +1 -1
- package/dist/columns.d.ts +48 -16
- package/dist/columns.d.ts.map +1 -1
- package/dist/columns.js +65 -22
- package/dist/columns.js.map +1 -1
- package/dist/conformance/fixtures.d.ts.map +1 -1
- package/dist/conformance/fixtures.js +19 -1
- package/dist/conformance/fixtures.js.map +1 -1
- package/dist/describe.d.ts +2 -2
- package/dist/describe.d.ts.map +1 -1
- package/dist/describe.js +1 -1
- package/dist/describe.js.map +1 -1
- package/dist/document/act-findings.d.ts +5 -0
- package/dist/document/act-findings.d.ts.map +1 -0
- package/dist/document/act-findings.js +84 -0
- package/dist/document/act-findings.js.map +1 -0
- package/dist/document/compile-checked.d.ts.map +1 -1
- package/dist/document/compile-checked.js +11 -4
- package/dist/document/compile-checked.js.map +1 -1
- package/dist/document/compile.d.ts +15 -4
- package/dist/document/compile.d.ts.map +1 -1
- package/dist/document/compile.js +102 -18
- package/dist/document/compile.js.map +1 -1
- package/dist/document/describe-coverage.d.ts +37 -0
- package/dist/document/describe-coverage.d.ts.map +1 -0
- package/dist/document/describe-coverage.js +162 -0
- package/dist/document/describe-coverage.js.map +1 -0
- package/dist/document/describe-place.d.ts.map +1 -1
- package/dist/document/describe-place.js +14 -1
- package/dist/document/describe-place.js.map +1 -1
- package/dist/document/diff.d.ts +5 -0
- package/dist/document/diff.d.ts.map +1 -1
- package/dist/document/diff.js +12 -3
- 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 +63 -6
- package/dist/document/edit.js.map +1 -1
- package/dist/document/far-end.d.ts +15 -0
- package/dist/document/far-end.d.ts.map +1 -0
- package/dist/document/far-end.js +26 -0
- package/dist/document/far-end.js.map +1 -0
- package/dist/document/index.d.ts +1 -1
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/migrate.d.ts.map +1 -1
- package/dist/document/migrate.js +7 -5
- package/dist/document/migrate.js.map +1 -1
- package/dist/document/range.d.ts +17 -0
- package/dist/document/range.d.ts.map +1 -0
- package/dist/document/range.js +46 -0
- package/dist/document/range.js.map +1 -0
- package/dist/document/schema.d.ts +23 -0
- package/dist/document/schema.d.ts.map +1 -1
- package/dist/document/schema.js +16 -0
- package/dist/document/schema.js.map +1 -1
- package/dist/document/thumbnail.d.ts +21 -0
- package/dist/document/thumbnail.d.ts.map +1 -1
- package/dist/document/thumbnail.js +139 -32
- package/dist/document/thumbnail.js.map +1 -1
- package/dist/document/to-document.d.ts.map +1 -1
- package/dist/document/to-document.js +16 -2
- package/dist/document/to-document.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/mutations/define-mutation.d.ts.map +1 -1
- package/dist/mutations/define-mutation.js +9 -1
- package/dist/mutations/define-mutation.js.map +1 -1
- package/dist/mutations/derive-edits.d.ts +8 -0
- package/dist/mutations/derive-edits.d.ts.map +1 -1
- package/dist/mutations/derive-edits.js +30 -7
- package/dist/mutations/derive-edits.js.map +1 -1
- package/dist/mutations/form.d.ts +2 -0
- package/dist/mutations/form.d.ts.map +1 -1
- package/dist/mutations/form.js +1 -0
- package/dist/mutations/form.js.map +1 -1
- package/dist/mutations/node-ref.d.ts +4 -1
- package/dist/mutations/node-ref.d.ts.map +1 -1
- package/dist/mutations/node-ref.js +6 -0
- package/dist/mutations/node-ref.js.map +1 -1
- package/dist/mutations/types.d.ts +16 -0
- package/dist/mutations/types.d.ts.map +1 -1
- package/dist/places.js +1 -1
- package/dist/places.js.map +1 -1
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +4 -0
- package/dist/refusal.js.map +1 -1
- package/dist/refused.d.ts +20 -0
- package/dist/refused.d.ts.map +1 -0
- package/dist/refused.js +24 -0
- package/dist/refused.js.map +1 -0
- package/dist/scaffold/project.d.ts.map +1 -1
- package/dist/scaffold/project.js +3 -0
- package/dist/scaffold/project.js.map +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +1 -1
- package/dist/search.js.map +1 -1
- package/dist/theme/derive.d.ts.map +1 -1
- package/dist/theme/derive.js +5 -4
- package/dist/theme/derive.js.map +1 -1
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/theme/types.js +5 -0
- package/dist/theme/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type { AnySchema } from "./schema/schema.js";
|
|
2
|
+
import type { AnyNodeDefinition } from "./schema/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* ARRANGEMENT IS A CAPABILITY OF THE DECLARATION, not of a view.
|
|
5
|
+
*
|
|
6
|
+
* Every surface that lists things arranges them, and each did it its own
|
|
7
|
+
* way or not at all: the list page grouped by an edge through a URL key of
|
|
8
|
+
* its own, the districts sorted by id, the board and the calendar took no
|
|
9
|
+
* sort, filter or group whatever. What a kind CAN be arranged by is already
|
|
10
|
+
* written down — its fields have types, its edges have far ends, its
|
|
11
|
+
* lifecycle names the past, the rules name what is flagged — so the offers
|
|
12
|
+
* are derived here once, headless, and the same string carries the chosen
|
|
13
|
+
* arrangement in a stop's fragment (`in.sort`, `in.filter`, `in.group`) and
|
|
14
|
+
* in a page's search, so an arranged picture is a link.
|
|
15
|
+
*/
|
|
16
|
+
export type SortDirection = "asc" | "desc";
|
|
17
|
+
export interface Sort {
|
|
18
|
+
/** `label`, a field name, or an edge kind (by the far end's label). */
|
|
19
|
+
readonly by: string;
|
|
20
|
+
readonly direction: SortDirection;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* One condition; a filter is the conjunction of several.
|
|
24
|
+
*
|
|
25
|
+
* `key` is a field name, an edge kind, or `is`. The value's grammar depends
|
|
26
|
+
* on the key: a boolean, enum or text field takes one of its values; a date
|
|
27
|
+
* field takes `before:<date>`, `after:<date>` or `on:<date>`; a number field
|
|
28
|
+
* takes `at-most:<n>`, `at-least:<n>` or a value; an edge takes a
|
|
29
|
+
* node id, `*` (tied to anything) or `none`; `is` takes `current`, `past`,
|
|
30
|
+
* `any`, `flagged` or `clear`. Anything else is dropped, not thrown.
|
|
31
|
+
*/
|
|
32
|
+
export interface Condition {
|
|
33
|
+
readonly key: string;
|
|
34
|
+
readonly value: string;
|
|
35
|
+
}
|
|
36
|
+
/** How wide a date group is. A year and a decade are what a catalogue of thirty years reads by. */
|
|
37
|
+
export type DateBucket = "day" | "week" | "month" | "year" | "decade";
|
|
38
|
+
export interface Grouping {
|
|
39
|
+
/** A field name or an edge kind. */
|
|
40
|
+
readonly by: string;
|
|
41
|
+
/** For a date field: how wide a group is. Day when unsaid. */
|
|
42
|
+
readonly bucket?: DateBucket;
|
|
43
|
+
}
|
|
44
|
+
export interface Arrangement {
|
|
45
|
+
readonly sort?: Sort;
|
|
46
|
+
readonly filter?: readonly Condition[];
|
|
47
|
+
readonly group?: Grouping;
|
|
48
|
+
/**
|
|
49
|
+
* Words to look for: a node stays when its label or any scalar field
|
|
50
|
+
* contains them, case aside. The narrowing a person types, beside the
|
|
51
|
+
* conditions a person picks — and the same matcher a search would use.
|
|
52
|
+
*/
|
|
53
|
+
readonly query?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare const NO_ARRANGEMENT: Arrangement;
|
|
56
|
+
/** What a lens says to decline arrangement, wholly or a part at a time. */
|
|
57
|
+
export type ArrangeOption = boolean | {
|
|
58
|
+
readonly sort?: boolean;
|
|
59
|
+
readonly filter?: boolean;
|
|
60
|
+
readonly group?: boolean;
|
|
61
|
+
};
|
|
62
|
+
export type OfferType = "text" | "number" | "date" | "boolean" | "choice";
|
|
63
|
+
/** One thing a kind can be sorted, filtered or grouped by, in the declaration's own words. */
|
|
64
|
+
export interface ArrangeOffer {
|
|
65
|
+
readonly key: string;
|
|
66
|
+
/** The words for it: the field's reading, the edge kind humanised, or the reserved word's sentence. */
|
|
67
|
+
readonly label: string;
|
|
68
|
+
readonly about: "label" | "field" | "edge" | "is";
|
|
69
|
+
readonly type?: OfferType;
|
|
70
|
+
/** For a choice field, its options; for `is`, its words; for an edge, nothing — the far ends are the graph's. */
|
|
71
|
+
readonly options?: readonly string[];
|
|
72
|
+
/** For a date field, how it may be bucketed when grouped. */
|
|
73
|
+
readonly buckets?: readonly DateBucket[];
|
|
74
|
+
/** For an edge: the kinds at the far end, and how it reads from this kind. */
|
|
75
|
+
readonly far?: readonly string[];
|
|
76
|
+
}
|
|
77
|
+
export interface Arrangeable {
|
|
78
|
+
readonly kind: string;
|
|
79
|
+
readonly sorts: readonly ArrangeOffer[];
|
|
80
|
+
readonly filters: readonly ArrangeOffer[];
|
|
81
|
+
readonly groups: readonly ArrangeOffer[];
|
|
82
|
+
/** The kind's natural order, when `fieldRoles.order` names one. */
|
|
83
|
+
readonly natural?: Sort;
|
|
84
|
+
}
|
|
85
|
+
/** The words for a field, after the declaration's own `display.labels`. */
|
|
86
|
+
export declare function readingOf(definition: AnyNodeDefinition, field: string): string;
|
|
87
|
+
export declare function fieldType(schema: unknown): OfferType | undefined;
|
|
88
|
+
/** The edges this kind takes part in, from either end, with how each reads from here. */
|
|
89
|
+
export declare function edgesOf(schema: AnySchema, kind: string): readonly ArrangeOffer[];
|
|
90
|
+
/**
|
|
91
|
+
* Whether a condition names one of a kind's RETIRED states — `status:demo`
|
|
92
|
+
* where demos are behind the horizon — which is asking for the past by
|
|
93
|
+
* name. The search box and the list page both left the past out for it and
|
|
94
|
+
* found nothing.
|
|
95
|
+
*/
|
|
96
|
+
export declare function asksForThePast(definition: {
|
|
97
|
+
readonly lifecycle?: {
|
|
98
|
+
readonly field: string;
|
|
99
|
+
readonly retired: readonly unknown[] | "date";
|
|
100
|
+
};
|
|
101
|
+
} | undefined, conditions: readonly {
|
|
102
|
+
readonly key: string;
|
|
103
|
+
readonly value: string;
|
|
104
|
+
}[]): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* What a kind can be arranged by, derived from its declaration alone.
|
|
107
|
+
*
|
|
108
|
+
* Sorts: the label, every field with a scalar type, every edge (by the far
|
|
109
|
+
* end's label). Filters: boolean and choice fields by value, date fields by
|
|
110
|
+
* before/after/on, every edge by a node or by having one at all, and `is`
|
|
111
|
+
* for the lifecycle and the standing. Groups: boolean and choice fields,
|
|
112
|
+
* date fields by day, week or month, and every edge by its far end. A field
|
|
113
|
+
* the declaration hides is not offered — an ordering key is not a thing a
|
|
114
|
+
* person groups by.
|
|
115
|
+
*/
|
|
116
|
+
export declare function arrangeable(schema: AnySchema, kind: string): Arrangeable;
|
|
117
|
+
export declare function describeArgOptions(schema: unknown): readonly string[];
|
|
118
|
+
export interface ArrangementWords {
|
|
119
|
+
readonly sort?: string;
|
|
120
|
+
readonly filter?: string;
|
|
121
|
+
readonly group?: string;
|
|
122
|
+
readonly q?: string;
|
|
123
|
+
}
|
|
124
|
+
export declare function parseArrangement(words: ArrangementWords): Arrangement;
|
|
125
|
+
/** What arranging needs of a node: its identity. Fields are read off it by name. */
|
|
126
|
+
export type ArrangeNode = {
|
|
127
|
+
readonly id: string;
|
|
128
|
+
readonly kind: string;
|
|
129
|
+
};
|
|
130
|
+
export declare const fields: (node: ArrangeNode) => Record<string, unknown>;
|
|
131
|
+
export declare const asRecord: (node: ArrangeNode) => ArrangeNode & Record<string, unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* The little of a graph arranging needs, said structurally so a `Graph<S>`
|
|
134
|
+
* over any concrete schema fits — `GraphReader`'s generic `nodesOfKind`
|
|
135
|
+
* does not, once the kinds are literal.
|
|
136
|
+
*/
|
|
137
|
+
export interface ArrangeGraph {
|
|
138
|
+
getNode(id: string): ArrangeNode | undefined;
|
|
139
|
+
allNodes(): readonly ArrangeNode[];
|
|
140
|
+
out(id: string, kind?: string): readonly ArrangeNode[];
|
|
141
|
+
in(id: string, kind?: string): readonly ArrangeNode[];
|
|
142
|
+
}
|
|
143
|
+
export interface ArrangeContext {
|
|
144
|
+
readonly schema: AnySchema;
|
|
145
|
+
readonly graph: ArrangeGraph;
|
|
146
|
+
/** Node ids the rules currently implicate, for `is:flagged` and `is:clear`. */
|
|
147
|
+
readonly flagged?: ReadonlySet<string>;
|
|
148
|
+
/** For the lifecycle: today, as YYYY-MM-DD. */
|
|
149
|
+
readonly today?: string;
|
|
150
|
+
}
|
|
151
|
+
export interface ArrangedGroup<N extends ArrangeNode = ArrangeNode> {
|
|
152
|
+
/** Stable, sortable: the value, the date bucket's first day, the far end's id, or `` for none. */
|
|
153
|
+
readonly key: string;
|
|
154
|
+
/** The words for the group: a value as it reads, a date, a far end's label, or "No <reading>". */
|
|
155
|
+
readonly label: string;
|
|
156
|
+
readonly nodes: readonly N[];
|
|
157
|
+
}
|
|
158
|
+
export interface Arranged<N extends ArrangeNode = ArrangeNode> {
|
|
159
|
+
/** The nodes that passed the filter, in order. */
|
|
160
|
+
readonly nodes: readonly N[];
|
|
161
|
+
/** The same nodes, grouped when a grouping was asked; one unnamed group otherwise. */
|
|
162
|
+
readonly groups: readonly ArrangedGroup<N>[];
|
|
163
|
+
readonly grouped: boolean;
|
|
164
|
+
}
|
|
165
|
+
/** The far ends of `edgeKind` from `id`, either way round, as nodes. */
|
|
166
|
+
export declare function farEnds(graph: ArrangeGraph, id: string, edgeKind: string): ArrangeNode[];
|
|
167
|
+
/** Whether a node meets one condition of a filter. Search judges its `key:value` tokens with this too. */
|
|
168
|
+
export declare function conditionHolds(ctx: ArrangeContext, node: ArrangeNode, condition: Condition): boolean;
|
|
169
|
+
//# sourceMappingURL=arrangement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrangement.d.ts","sourceRoot":"","sources":["../src/arrangement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { describeArg } from "./mutations/node-ref.js";
|
|
2
|
+
import { humaniseField, isCurrent } from "./schema/define-node.js";
|
|
3
|
+
export const NO_ARRANGEMENT = {};
|
|
4
|
+
/** The words for a field, after the declaration's own `display.labels`. */
|
|
5
|
+
export function readingOf(definition, field) {
|
|
6
|
+
return definition.display?.labels?.[field] ?? humaniseField(field);
|
|
7
|
+
}
|
|
8
|
+
export function fieldType(schema) {
|
|
9
|
+
const shape = describeArg(schema);
|
|
10
|
+
switch (shape.type) {
|
|
11
|
+
case "text":
|
|
12
|
+
case "date":
|
|
13
|
+
case "number":
|
|
14
|
+
case "boolean":
|
|
15
|
+
case "choice":
|
|
16
|
+
return shape.type;
|
|
17
|
+
default:
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** The edges this kind takes part in, from either end, with how each reads from here. */
|
|
22
|
+
export function edgesOf(schema, kind) {
|
|
23
|
+
const offers = new Map();
|
|
24
|
+
const definition = schema.tryDefinition(kind);
|
|
25
|
+
for (const [edgeKind, declared] of Object.entries(definition?.edges ?? {})) {
|
|
26
|
+
offers.set(edgeKind, {
|
|
27
|
+
key: edgeKind,
|
|
28
|
+
label: declared.description ? capitalise(declared.description) : humaniseField(edgeKind),
|
|
29
|
+
about: "edge",
|
|
30
|
+
far: declared.to === "*" ? [...schema.kinds] : [...declared.to],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
for (const other of schema.definitions) {
|
|
34
|
+
if (other.kind === kind)
|
|
35
|
+
continue;
|
|
36
|
+
for (const [edgeKind, declared] of Object.entries(other.edges ?? {})) {
|
|
37
|
+
if (offers.has(edgeKind))
|
|
38
|
+
continue;
|
|
39
|
+
if (declared.to !== "*" && !declared.to.includes(kind))
|
|
40
|
+
continue;
|
|
41
|
+
offers.set(edgeKind, {
|
|
42
|
+
key: edgeKind,
|
|
43
|
+
label: declared.inverse ? capitalise(declared.inverse) : humaniseField(edgeKind),
|
|
44
|
+
about: "edge",
|
|
45
|
+
far: [other.kind],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [...offers.values()];
|
|
50
|
+
}
|
|
51
|
+
const capitalise = (text) => text.charAt(0).toUpperCase() + text.slice(1);
|
|
52
|
+
const IS_WORDS = ["current", "past", "any", "flagged", "clear"];
|
|
53
|
+
/**
|
|
54
|
+
* Whether a condition names one of a kind's RETIRED states — `status:demo`
|
|
55
|
+
* where demos are behind the horizon — which is asking for the past by
|
|
56
|
+
* name. The search box and the list page both left the past out for it and
|
|
57
|
+
* found nothing.
|
|
58
|
+
*/
|
|
59
|
+
export function asksForThePast(definition, conditions) {
|
|
60
|
+
const lifecycle = definition?.lifecycle;
|
|
61
|
+
if (!lifecycle || lifecycle.retired === "date")
|
|
62
|
+
return false;
|
|
63
|
+
const retired = lifecycle.retired.map(String);
|
|
64
|
+
return conditions.some((condition) => condition.key === lifecycle.field && retired.includes(condition.value));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* What a kind can be arranged by, derived from its declaration alone.
|
|
68
|
+
*
|
|
69
|
+
* Sorts: the label, every field with a scalar type, every edge (by the far
|
|
70
|
+
* end's label). Filters: boolean and choice fields by value, date fields by
|
|
71
|
+
* before/after/on, every edge by a node or by having one at all, and `is`
|
|
72
|
+
* for the lifecycle and the standing. Groups: boolean and choice fields,
|
|
73
|
+
* date fields by day, week or month, and every edge by its far end. A field
|
|
74
|
+
* the declaration hides is not offered — an ordering key is not a thing a
|
|
75
|
+
* person groups by.
|
|
76
|
+
*/
|
|
77
|
+
export function arrangeable(schema, kind) {
|
|
78
|
+
const definition = schema.tryDefinition(kind);
|
|
79
|
+
if (!definition)
|
|
80
|
+
return { kind, sorts: [], filters: [], groups: [] };
|
|
81
|
+
const hidden = new Set(definition.display?.hide ?? []);
|
|
82
|
+
const shape = (definition.fields.shape ?? {});
|
|
83
|
+
const sorts = [{ key: "label", label: "Name", about: "label", type: "text" }];
|
|
84
|
+
const filters = [];
|
|
85
|
+
const groups = [];
|
|
86
|
+
for (const [field, fieldSchema] of Object.entries(shape)) {
|
|
87
|
+
if (field === "id" || field === "kind" || field === "label" || hidden.has(field))
|
|
88
|
+
continue;
|
|
89
|
+
const type = fieldType(fieldSchema);
|
|
90
|
+
if (!type)
|
|
91
|
+
continue;
|
|
92
|
+
const label = readingOf(definition, field);
|
|
93
|
+
const options = type === "choice" ? describeArgOptions(fieldSchema) : type === "boolean" ? ["true", "false"] : undefined;
|
|
94
|
+
const offer = { key: field, label, about: "field", type, ...(options ? { options } : {}) };
|
|
95
|
+
sorts.push(offer);
|
|
96
|
+
/*
|
|
97
|
+
* A NUMBER AND A WORD ARE FILTERS TOO. "SUVs under £25,000 with fewer
|
|
98
|
+
* than 30,000 miles, a Kia or a Hyundai" is the whole of a car
|
|
99
|
+
* shopper's first minute, and the list offered none of it: only a
|
|
100
|
+
* choice, a yes or no and a date could be picked. A number is kept at
|
|
101
|
+
* most or at least a value; a word field is picked by the values it
|
|
102
|
+
* holds (which the graph says, so a surface lists them).
|
|
103
|
+
*/
|
|
104
|
+
filters.push(offer);
|
|
105
|
+
if (type === "boolean" || type === "choice")
|
|
106
|
+
groups.push(offer);
|
|
107
|
+
if (type === "date")
|
|
108
|
+
groups.push({ ...offer, buckets: ["day", "week", "month", "year", "decade"] });
|
|
109
|
+
}
|
|
110
|
+
for (const edge of edgesOf(schema, kind)) {
|
|
111
|
+
sorts.push(edge);
|
|
112
|
+
filters.push(edge);
|
|
113
|
+
groups.push(edge);
|
|
114
|
+
}
|
|
115
|
+
const is = {
|
|
116
|
+
key: "is",
|
|
117
|
+
label: definition.lifecycle ? "Standing and currency" : "Standing",
|
|
118
|
+
about: "is",
|
|
119
|
+
type: "choice",
|
|
120
|
+
options: definition.lifecycle ? [...IS_WORDS] : ["flagged", "clear"],
|
|
121
|
+
};
|
|
122
|
+
filters.push(is);
|
|
123
|
+
const order = definition.fieldRoles?.["order"];
|
|
124
|
+
const natural = order && (order in shape || order === "label") ? { by: order, direction: "asc" } : undefined;
|
|
125
|
+
return { kind, sorts, filters, groups, ...(natural ? { natural } : {}) };
|
|
126
|
+
}
|
|
127
|
+
export function describeArgOptions(schema) {
|
|
128
|
+
const shape = describeArg(schema);
|
|
129
|
+
return shape.type === "choice" ? shape.options : [];
|
|
130
|
+
}
|
|
131
|
+
const BUCKETS = ["day", "week", "month", "year", "decade"];
|
|
132
|
+
export function parseArrangement(words) {
|
|
133
|
+
const out = {};
|
|
134
|
+
if (words.q && words.q.trim().length > 0)
|
|
135
|
+
out.query = words.q;
|
|
136
|
+
if (words.sort) {
|
|
137
|
+
const [by, direction] = words.sort.split(":");
|
|
138
|
+
if (by)
|
|
139
|
+
out.sort = { by, direction: direction === "desc" ? "desc" : "asc" };
|
|
140
|
+
}
|
|
141
|
+
if (words.filter) {
|
|
142
|
+
const conditions = [];
|
|
143
|
+
for (const part of words.filter.split(",")) {
|
|
144
|
+
const colon = part.indexOf(":");
|
|
145
|
+
if (colon <= 0)
|
|
146
|
+
continue;
|
|
147
|
+
conditions.push({ key: part.slice(0, colon), value: part.slice(colon + 1) });
|
|
148
|
+
}
|
|
149
|
+
if (conditions.length > 0)
|
|
150
|
+
out.filter = conditions;
|
|
151
|
+
}
|
|
152
|
+
if (words.group) {
|
|
153
|
+
const [by, bucket] = words.group.split(":");
|
|
154
|
+
if (by)
|
|
155
|
+
out.group = { by, ...(BUCKETS.includes(bucket) ? { bucket: bucket } : {}) };
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
export const fields = (node) => node;
|
|
160
|
+
export const asRecord = (node) => node;
|
|
161
|
+
/** The far ends of `edgeKind` from `id`, either way round, as nodes. */
|
|
162
|
+
export function farEnds(graph, id, edgeKind) {
|
|
163
|
+
const seen = new Map();
|
|
164
|
+
for (const node of [...graph.out(id, edgeKind), ...graph.in(id, edgeKind)])
|
|
165
|
+
seen.set(node.id, node);
|
|
166
|
+
return [...seen.values()];
|
|
167
|
+
}
|
|
168
|
+
/** Whether a node meets one condition of a filter. Search judges its `key:value` tokens with this too. */
|
|
169
|
+
export function conditionHolds(ctx, node, condition) {
|
|
170
|
+
const definition = ctx.schema.tryDefinition(node.kind);
|
|
171
|
+
if (condition.key === "is") {
|
|
172
|
+
switch (condition.value) {
|
|
173
|
+
case "current":
|
|
174
|
+
return isCurrent(definition, asRecord(node), ctx.today);
|
|
175
|
+
case "past":
|
|
176
|
+
return !isCurrent(definition, asRecord(node), ctx.today);
|
|
177
|
+
case "any":
|
|
178
|
+
return true;
|
|
179
|
+
case "flagged":
|
|
180
|
+
return ctx.flagged?.has(node.id) ?? false;
|
|
181
|
+
case "clear":
|
|
182
|
+
return !(ctx.flagged?.has(node.id) ?? false);
|
|
183
|
+
default:
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const shape = (definition?.fields.shape ?? {});
|
|
188
|
+
if (condition.key in shape) {
|
|
189
|
+
const value = fields(node)[condition.key];
|
|
190
|
+
const type = fieldType(shape[condition.key]);
|
|
191
|
+
if (type === "date") {
|
|
192
|
+
const [op, date] = condition.value.split(":");
|
|
193
|
+
if (typeof value !== "string" || !date)
|
|
194
|
+
return false;
|
|
195
|
+
const day = value.slice(0, 10);
|
|
196
|
+
return op === "before" ? day < date : op === "after" ? day > date : day === date;
|
|
197
|
+
}
|
|
198
|
+
if (type === "boolean")
|
|
199
|
+
return String(value) === condition.value;
|
|
200
|
+
if (type === "number") {
|
|
201
|
+
const at = condition.value.lastIndexOf(":");
|
|
202
|
+
const op = at > 0 ? condition.value.slice(0, at) : "";
|
|
203
|
+
const bound = Number(condition.value.slice(at + 1));
|
|
204
|
+
if (op === "at-most" || op === "at-least") {
|
|
205
|
+
if (typeof value !== "number" || !Number.isFinite(bound))
|
|
206
|
+
return false;
|
|
207
|
+
return op === "at-most" ? value <= bound : value >= bound;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return String(value) === condition.value;
|
|
211
|
+
}
|
|
212
|
+
// An edge: tied to this node, to anything, or to nothing.
|
|
213
|
+
const ends = farEnds(ctx.graph, node.id, condition.key);
|
|
214
|
+
if (condition.value === "*")
|
|
215
|
+
return ends.length > 0;
|
|
216
|
+
if (condition.value === "none")
|
|
217
|
+
return ends.length === 0;
|
|
218
|
+
return ends.some((end) => end.id === condition.value);
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=arrangement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrangement.js","sourceRoot":"","sources":["../src/arrangement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type ArrangeContext, type Arrangeable, type Arranged, type ArrangementWords, type ArrangeNode, type ArrangeOption, type Arrangement, type DateBucket } from "./arrangement.js";
|
|
2
|
+
/** Whether a lens offers a part, given what it declared. Everything is on unless declined. */
|
|
3
|
+
export declare function arrangeAllows(option: ArrangeOption | undefined, part: "sort" | "filter" | "group"): boolean;
|
|
4
|
+
export declare function formatArrangement(arrangement: Arrangement): ArrangementWords;
|
|
5
|
+
/**
|
|
6
|
+
* Keeps only the parts a kind can actually be arranged by, and says which
|
|
7
|
+
* were dropped — a stale link names a field that was renamed, and the
|
|
8
|
+
* honest thing is to show the rest arranged and say what was ignored.
|
|
9
|
+
*/
|
|
10
|
+
export declare function admitArrangement(arrangement: Arrangement, offers: Arrangeable): {
|
|
11
|
+
readonly arrangement: Arrangement;
|
|
12
|
+
readonly dropped: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
/** The first day of the bucket a date falls in, as YYYY-MM-DD; weeks start on Monday, in UTC. */
|
|
15
|
+
export declare function bucketStart(date: string, bucket: DateBucket): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Whether the words find the node — search's own matcher, so a list's `q`
|
|
18
|
+
* and the Find box never disagree: every word the start of a word in the
|
|
19
|
+
* label or a readable field, case, diacritics and punctuation aside.
|
|
20
|
+
*/
|
|
21
|
+
export declare function matches(ctx: ArrangeContext, node: ArrangeNode, query: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Filters, sorts and groups. The filter is a conjunction; the sort is
|
|
24
|
+
* stable; a grouping puts the group with nothing to say last. Nodes whose
|
|
25
|
+
* kind the context cannot describe are kept and sort by what they carry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function arrange<N extends ArrangeNode>(nodes: readonly N[], arrangement: Arrangement, ctx: ArrangeContext): Arranged<N>;
|
|
28
|
+
//# sourceMappingURL=arranging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arranging.d.ts","sourceRoot":"","sources":["../src/arranging.ts"],"names":[],"mappings":"AAEA,OAAO,EAUL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,KAAK,UAAU,EAGhB,MAAM,kBAAkB,CAAC;AAW1B,8FAA8F;AAC9F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAI3G;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,gBAAgB,CAa5E;AAGD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,WAAW,GAClB;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAwB5E;AAyBD,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAYhF;AAYD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtF;AA8BD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,CAyF9H"}
|