@antelopejs/interface-data-api 0.4.0 → 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.
Files changed (121) hide show
  1. package/dist/components.d.ts +15 -7
  2. package/dist/components.js +98 -645
  3. package/dist/components.js.map +1 -1
  4. package/dist/index.d.ts +41 -36
  5. package/dist/index.js +94 -92
  6. package/dist/index.js.map +1 -1
  7. package/dist/internal/computed.d.ts +6 -0
  8. package/dist/internal/computed.js +43 -0
  9. package/dist/internal/computed.js.map +1 -0
  10. package/dist/internal/controller-types.d.ts +19 -0
  11. package/dist/internal/controller-types.js +4 -0
  12. package/dist/internal/controller-types.js.map +1 -0
  13. package/dist/internal/default-filter.d.ts +4 -0
  14. package/dist/internal/default-filter.js +19 -0
  15. package/dist/internal/default-filter.js.map +1 -0
  16. package/dist/internal/deferred-joined-stream.d.ts +11 -0
  17. package/dist/internal/deferred-joined-stream.js +112 -0
  18. package/dist/internal/deferred-joined-stream.js.map +1 -0
  19. package/dist/internal/field-types.d.ts +183 -0
  20. package/dist/internal/field-types.js +4 -0
  21. package/dist/internal/field-types.js.map +1 -0
  22. package/dist/internal/filters.d.ts +4 -0
  23. package/dist/internal/filters.js +15 -0
  24. package/dist/internal/filters.js.map +1 -0
  25. package/dist/internal/foreign.d.ts +6 -0
  26. package/dist/internal/foreign.js +116 -0
  27. package/dist/internal/foreign.js.map +1 -0
  28. package/dist/internal/guards.d.ts +20 -0
  29. package/dist/internal/guards.js +74 -0
  30. package/dist/internal/guards.js.map +1 -0
  31. package/dist/internal/joined.d.ts +28 -0
  32. package/dist/internal/joined.js +127 -0
  33. package/dist/internal/joined.js.map +1 -0
  34. package/dist/internal/list.d.ts +16 -0
  35. package/dist/internal/list.js +178 -0
  36. package/dist/internal/list.js.map +1 -0
  37. package/dist/internal/meta-records.d.ts +17 -0
  38. package/dist/internal/meta-records.js +73 -0
  39. package/dist/internal/meta-records.js.map +1 -0
  40. package/dist/internal/properties.d.ts +4 -0
  41. package/dist/internal/properties.js +43 -0
  42. package/dist/internal/properties.js.map +1 -0
  43. package/dist/internal/table-reference.d.ts +11 -0
  44. package/dist/internal/table-reference.js +46 -0
  45. package/dist/internal/table-reference.js.map +1 -0
  46. package/dist/internal/tables.d.ts +18 -0
  47. package/dist/internal/tables.js +37 -0
  48. package/dist/internal/tables.js.map +1 -0
  49. package/dist/internal/validation.d.ts +11 -0
  50. package/dist/internal/validation.js +88 -0
  51. package/dist/internal/validation.js.map +1 -0
  52. package/dist/metadata.d.ts +27 -228
  53. package/dist/metadata.js +61 -188
  54. package/dist/metadata.js.map +1 -1
  55. package/dist/tests/components/access_control.test.js +20 -20
  56. package/dist/tests/components/access_control.test.js.map +1 -1
  57. package/dist/tests/components/computed.test.js +28 -30
  58. package/dist/tests/components/computed.test.js.map +1 -1
  59. package/dist/tests/components/cross_instance.test.js +8 -6
  60. package/dist/tests/components/cross_instance.test.js.map +1 -1
  61. package/dist/tests/components/deferred_joined.test.js +56 -53
  62. package/dist/tests/components/deferred_joined.test.js.map +1 -1
  63. package/dist/tests/components/filter_options.test.js +8 -7
  64. package/dist/tests/components/filter_options.test.js.map +1 -1
  65. package/dist/tests/components/foreign_computed.test.js +14 -16
  66. package/dist/tests/components/foreign_computed.test.js.map +1 -1
  67. package/dist/tests/components/foreign_joined.test.js +19 -27
  68. package/dist/tests/components/foreign_joined.test.js.map +1 -1
  69. package/dist/tests/components/joined.test.js +41 -45
  70. package/dist/tests/components/joined.test.js.map +1 -1
  71. package/dist/tests/components/listable.test.js +59 -58
  72. package/dist/tests/components/listable.test.js.map +1 -1
  73. package/dist/tests/components/localized_sort.test.js +10 -11
  74. package/dist/tests/components/localized_sort.test.js.map +1 -1
  75. package/dist/tests/components/mandatory.test.js +25 -25
  76. package/dist/tests/components/mandatory.test.js.map +1 -1
  77. package/dist/tests/components/modifier_key.test.js +19 -18
  78. package/dist/tests/components/modifier_key.test.js.map +1 -1
  79. package/dist/tests/components/parse_body.test.d.ts +1 -0
  80. package/dist/tests/components/parse_body.test.js +75 -0
  81. package/dist/tests/components/parse_body.test.js.map +1 -0
  82. package/dist/tests/components/parsed_value.test.js +23 -21
  83. package/dist/tests/components/parsed_value.test.js.map +1 -1
  84. package/dist/tests/components/partial_edit.test.js +33 -32
  85. package/dist/tests/components/partial_edit.test.js.map +1 -1
  86. package/dist/tests/components/per_action_access.test.js +12 -12
  87. package/dist/tests/components/per_action_access.test.js.map +1 -1
  88. package/dist/tests/components/validator.test.js +45 -37
  89. package/dist/tests/components/validator.test.js.map +1 -1
  90. package/dist/tests/helpers/other-instance.d.ts +11 -1
  91. package/dist/tests/helpers/other-instance.js +27 -5
  92. package/dist/tests/helpers/other-instance.js.map +1 -1
  93. package/dist/tests/index/get_guard.test.js +6 -6
  94. package/dist/tests/index/get_guard.test.js.map +1 -1
  95. package/dist/tests/index/inheritance.test.js +10 -9
  96. package/dist/tests/index/inheritance.test.js.map +1 -1
  97. package/dist/tests/index/routes.test.js +40 -44
  98. package/dist/tests/index/routes.test.js.map +1 -1
  99. package/dist/tests/integration.test.d.ts +1 -1
  100. package/dist/tests/integration.test.js +53 -729
  101. package/dist/tests/integration.test.js.map +1 -1
  102. package/dist/tests/internal/http.d.ts +23 -0
  103. package/dist/tests/internal/http.js +35 -0
  104. package/dist/tests/internal/http.js.map +1 -0
  105. package/dist/tests/internal/shop-api.d.ts +1 -0
  106. package/dist/tests/internal/shop-api.js +331 -0
  107. package/dist/tests/internal/shop-api.js.map +1 -0
  108. package/dist/tests/internal/shop-schema.d.ts +154 -0
  109. package/dist/tests/internal/shop-schema.js +387 -0
  110. package/dist/tests/internal/shop-schema.js.map +1 -0
  111. package/dist/tests/utils.d.ts +5 -5
  112. package/dist/tests/utils.js +1 -3
  113. package/dist/tests/utils.js.map +1 -1
  114. package/dist/tests/utils.test.js +10 -11
  115. package/dist/tests/utils.test.js.map +1 -1
  116. package/docs/3.routes.md +8 -3
  117. package/docs/5.validators.md +12 -3
  118. package/docs/8.filters.md +7 -3
  119. package/package.json +14 -3
  120. package/skills/data-api-interface/SKILL.md +4 -0
  121. package/skills/data-api-interface/cases.json +99 -0
@@ -0,0 +1,28 @@
1
+ /** @internal @packageDocumentation */
2
+ import { type Datum, type SchemaInstance, type Stream } from "@antelopejs/interface-database";
3
+ import type { DataAPIMeta, FieldFilter } from "../metadata";
4
+ export interface JoinedFieldSplit {
5
+ filter: Set<string>;
6
+ sort: Set<string>;
7
+ }
8
+ /**
9
+ * Splits the joined fields of `meta` between those {@link List} must
10
+ * materialize before the filter and count (`filter`) and those it only
11
+ * needs after the count (`sort`). Joined fields referenced by neither are
12
+ * left out so the list route can defer their lookups to the returned page.
13
+ *
14
+ * Computed expressions may read joined fields, so materializing a computed
15
+ * field pulls every remaining joined group in with it. Groups whose local
16
+ * key is also a foreign field must resolve before `Foreign` replaces the
17
+ * key with the looked-up record.
18
+ */
19
+ export declare function splitJoinedFields(meta: DataAPIMeta, sorting?: [string, "asc" | "desc" | undefined], filters?: Record<string, FieldFilter>): JoinedFieldSplit;
20
+ /**
21
+ * Joined field names that {@link List} does not materialize for the given
22
+ * split. The default list route resolves these after pagination so their
23
+ * lookups only run on the returned page.
24
+ */
25
+ export declare function deferredJoinedFields(meta: DataAPIMeta, split: JoinedFieldSplit): Set<string>;
26
+ export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any>, only?: Set<string>): Stream<any>;
27
+ export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Datum<any>, only?: Set<string>): Datum<any>;
28
+ export declare function Joined(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any> | Datum<any>, only?: Set<string>): Stream<any> | Datum<any>;
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /** @internal @packageDocumentation */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.splitJoinedFields = splitJoinedFields;
5
+ exports.deferredJoinedFields = deferredJoinedFields;
6
+ exports.Joined = Joined;
7
+ const interface_database_1 = require("@antelopejs/interface-database");
8
+ const tables_1 = require("./tables");
9
+ function collectJoinedGroups(meta) {
10
+ const groups = new Map();
11
+ for (const [name, field] of Object.entries(meta.fields)) {
12
+ if (!field.joined)
13
+ continue;
14
+ const j = field.joined;
15
+ const groupKey = `${j.schemaName ?? ""}|${j.table}|${j.localKey}|${j.remoteIndex}`;
16
+ let group = groups.get(groupKey);
17
+ if (!group) {
18
+ group = {
19
+ table: j.table,
20
+ tableClass: j.tableClass,
21
+ localKey: j.localKey,
22
+ remoteIndex: j.remoteIndex,
23
+ schemaName: j.schemaName,
24
+ fields: [],
25
+ };
26
+ groups.set(groupKey, group);
27
+ }
28
+ group.fields.push({ name, remoteField: j.remoteField });
29
+ }
30
+ return Array.from(groups.values());
31
+ }
32
+ function addAll(target, names) {
33
+ for (const name of names) {
34
+ target.add(name);
35
+ }
36
+ }
37
+ /**
38
+ * Splits the joined fields of `meta` between those {@link List} must
39
+ * materialize before the filter and count (`filter`) and those it only
40
+ * needs after the count (`sort`). Joined fields referenced by neither are
41
+ * left out so the list route can defer their lookups to the returned page.
42
+ *
43
+ * Computed expressions may read joined fields, so materializing a computed
44
+ * field pulls every remaining joined group in with it. Groups whose local
45
+ * key is also a foreign field must resolve before `Foreign` replaces the
46
+ * key with the looked-up record.
47
+ */
48
+ function splitJoinedFields(meta, sorting, filters) {
49
+ const split = { filter: new Set(), sort: new Set() };
50
+ const filterNames = Object.keys(meta.filters).filter((name) => filters && name in filters);
51
+ const hasComputedFilter = filterNames.some((name) => meta.fields[name]?.computed);
52
+ const sortField = sorting?.[0];
53
+ const hasComputedSort = !!sortField && !!meta.fields[sortField]?.computed;
54
+ for (const group of collectJoinedGroups(meta)) {
55
+ const names = group.fields.map((field) => field.name);
56
+ if (hasComputedFilter || names.some((name) => filterNames.includes(name))) {
57
+ addAll(split.filter, names);
58
+ }
59
+ else if (hasComputedSort ||
60
+ (sortField && names.includes(sortField)) ||
61
+ meta.fields[group.localKey]?.foreign) {
62
+ addAll(split.sort, names);
63
+ }
64
+ }
65
+ return split;
66
+ }
67
+ /**
68
+ * Joined field names that {@link List} does not materialize for the given
69
+ * split. The default list route resolves these after pagination so their
70
+ * lookups only run on the returned page.
71
+ */
72
+ function deferredJoinedFields(meta, split) {
73
+ return new Set(Object.entries(meta.fields)
74
+ .filter(([name, field]) => field.joined && !split.filter.has(name) && !split.sort.has(name))
75
+ .map(([name]) => name));
76
+ }
77
+ function Joined(db, meta, query, only) {
78
+ const groups = collectJoinedGroups(meta).filter((group) => !only || group.fields.some((field) => only.has(field.name)));
79
+ if (groups.length === 0) {
80
+ return query;
81
+ }
82
+ const emptyRemote = {};
83
+ const tmpKeyFor = (localKey) => `__joined_orig_${localKey}`;
84
+ if ((0, interface_database_1.IsStream)(query)) {
85
+ let stream = query;
86
+ const tmpKeys = [];
87
+ for (const group of groups) {
88
+ const remoteFields = group.fields.map((f) => f.remoteField);
89
+ const remoteTable = (0, tables_1.pluckedTable)((0, tables_1.targetTable)(db, group), group.remoteIndex, ...remoteFields);
90
+ const tmpKey = tmpKeyFor(group.localKey);
91
+ tmpKeys.push(tmpKey);
92
+ stream = stream
93
+ .map((row) => row.merge({ [tmpKey]: row.key(group.localKey) }))
94
+ .lookup(remoteTable, group.localKey, group.remoteIndex)
95
+ .map((row) => {
96
+ const merged = {};
97
+ const remote = row.key(group.localKey).default(emptyRemote);
98
+ for (const f of group.fields) {
99
+ merged[f.name] = remote.key(f.remoteField).default(null);
100
+ }
101
+ merged[group.localKey] = row.key(tmpKey);
102
+ return row.merge(merged);
103
+ });
104
+ }
105
+ return stream.without(...tmpKeys);
106
+ }
107
+ let datum = query;
108
+ for (const group of groups) {
109
+ const remoteFields = group.fields.map((f) => f.remoteField);
110
+ const remoteTable = (0, tables_1.pluckedTable)((0, tables_1.targetTable)(db, group), group.remoteIndex, ...remoteFields);
111
+ const tmpKey = tmpKeyFor(group.localKey);
112
+ datum = datum
113
+ .do((row) => row.merge({ [tmpKey]: row.key(group.localKey) }))
114
+ .lookup(remoteTable, group.localKey, group.remoteIndex)
115
+ .do((row) => {
116
+ const merged = {};
117
+ const remote = row.key(group.localKey).default(emptyRemote);
118
+ for (const f of group.fields) {
119
+ merged[f.name] = remote.key(f.remoteField).default(null);
120
+ }
121
+ merged[group.localKey] = row.key(tmpKey);
122
+ return row.merge(merged);
123
+ });
124
+ }
125
+ return datum;
126
+ }
127
+ //# sourceMappingURL=joined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joined.js","sourceRoot":"","sources":["../../src/internal/joined.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** @internal @packageDocumentation */
2
+ import type { RequestContext } from "@antelopejs/interface-api";
3
+ import type { Datum, SchemaInstance, Stream, Table } from "@antelopejs/interface-database";
4
+ import type { Query } from "../components";
5
+ import { type DataAPIMeta } from "../metadata";
6
+ type ListPageOptions = Query.ListPageOptions;
7
+ /** The arguments {@link Query.List} takes after the request context. */
8
+ interface ListArguments {
9
+ sorting?: Parameters<typeof Query.List>[4];
10
+ filters?: Parameters<typeof Query.List>[5];
11
+ db?: Parameters<typeof Query.List>[6];
12
+ options?: Parameters<typeof Query.List>[7];
13
+ }
14
+ export declare function List<T extends Record<string, any>>(obj: any, meta: DataAPIMeta, request: Table<T>, reqCtx: RequestContext, { sorting, filters, db, options }: ListArguments): [sorted: Stream<T>, total: Datum<number>, deferredJoined: Set<string>];
15
+ export declare function ListPage(db: SchemaInstance<any>, meta: DataAPIMeta, query: Stream<any>, options: ListPageOptions): Stream<any>;
16
+ export {};
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /** @internal @packageDocumentation */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.List = List;
5
+ exports.ListPage = ListPage;
6
+ const common_1 = require("@antelopejs/interface-database-decorators/common");
7
+ const common_2 = require("@antelopejs/interface-database-decorators/modifiers/common");
8
+ const metadata_1 = require("../metadata");
9
+ const computed_1 = require("./computed");
10
+ const deferred_joined_stream_1 = require("./deferred-joined-stream");
11
+ const foreign_1 = require("./foreign");
12
+ const joined_1 = require("./joined");
13
+ const validation_1 = require("./validation");
14
+ function listResultTuple(tmpRequest, total, meta, joinedSplit, { db, options }) {
15
+ const deferredJoined = (0, joined_1.deferredJoinedFields)(meta, joinedSplit);
16
+ if (options?.exposeDeferredJoined || !db || deferredJoined.size === 0) {
17
+ return [tmpRequest, total, deferredJoined];
18
+ }
19
+ return [
20
+ (0, deferred_joined_stream_1.wrapDeferredJoined)(db, meta, deferredJoined, tmpRequest),
21
+ total,
22
+ new Set(),
23
+ ];
24
+ }
25
+ /** Where a list sorted on a modifier-held field keeps the value it sorts on. */
26
+ const MODIFIED_SORT_KEY = "__dataApiSortValue";
27
+ /**
28
+ * Whether a field is held by a modifier the controller keys (a localized
29
+ * field read in the request's locale): stored under the modifier, it sorts
30
+ * on the value the request reads, not on the stored field.
31
+ */
32
+ function isHeldByKeyedModifier(meta, field) {
33
+ const keyed = new Set(Array.from(meta.modifierKeys.keys(), (modifier) => modifier.name));
34
+ return ((0, common_1.getMetadata)(meta.tableClass, common_2.ModifiersStaticMetadata).fields[field]?.some(({ id }) => keyed.has(id)) ?? false);
35
+ }
36
+ /**
37
+ * The rows {@link List} starts from: the index lookup serving the one field
38
+ * filtered once with `eq` on a single-field index, else the whole table.
39
+ */
40
+ function indexedSource(meta, request, filterList, filters) {
41
+ const indexed = filterList.find(([field]) => {
42
+ const fieldFilters = filters ? (0, metadata_1.FilterValuesOf)(filters[field]) : [];
43
+ return (fieldFilters.length === 1 &&
44
+ fieldFilters[0][1] === "eq" &&
45
+ meta.fields[field]?.indexable);
46
+ })?.[0];
47
+ const indexName = indexed
48
+ ? meta.fields[indexed].dbName || indexed
49
+ : undefined;
50
+ const equality = indexed
51
+ ? (0, metadata_1.FilterValuesOf)(filters?.[indexed] ?? [])[0]
52
+ : undefined;
53
+ const source = indexName
54
+ ? request.getAll(equality?.[0] ?? "", indexName)
55
+ : request;
56
+ return { indexFilter: indexed, source };
57
+ }
58
+ /**
59
+ * Merges the joined and computed fields the filters read, before
60
+ * {@link List} filters and counts.
61
+ */
62
+ function materializeFilterFields(source, meta, db, joinedSplit, { filterList }) {
63
+ const joined = db && joinedSplit.filter.size > 0
64
+ ? (0, joined_1.Joined)(db, meta, source, joinedSplit.filter)
65
+ : source;
66
+ const filteredComputed = new Set(filterList
67
+ .map(([field]) => field)
68
+ .filter((field) => meta.fields[field]?.computed));
69
+ const stream = db && filteredComputed.size > 0
70
+ ? (0, computed_1.Computed)(db, meta, joined, filteredComputed)
71
+ : joined;
72
+ return { stream, filteredComputed };
73
+ }
74
+ /** The field a list request sorts on, how, and whether a modifier holds it. */
75
+ function sortPlan(meta, sorting) {
76
+ const sortField = sorting?.[0];
77
+ const shouldSort = sortField ? meta.fields[sortField]?.sortable : undefined;
78
+ const isModifiedSort = !!shouldSort && !!sortField && isHeldByKeyedModifier(meta, sortField);
79
+ return { sortField, shouldSort, isModifiedSort };
80
+ }
81
+ /** Sorts on an indexed field before the filters, when the plan allows it. */
82
+ function orderedByIndex(stream, { sortField, shouldSort, isModifiedSort }, sorting) {
83
+ if (shouldSort?.indexed && sortField && !isModifiedSort) {
84
+ return stream.orderBy(sortField, sorting?.[1] ?? "asc");
85
+ }
86
+ return stream;
87
+ }
88
+ /**
89
+ * Merges the joined fields the sort reads, then a computed sort field no
90
+ * filter already merged, after {@link List} counts.
91
+ */
92
+ function materializeSortFields(stream, sortField, { db, meta, joinedSplit, filteredComputed }) {
93
+ if (!db)
94
+ return stream;
95
+ const joined = joinedSplit.sort.size > 0
96
+ ? (0, joined_1.Joined)(db, meta, stream, joinedSplit.sort)
97
+ : stream;
98
+ const sortsOnComputed = !!sortField &&
99
+ !!meta.fields[sortField]?.computed &&
100
+ !filteredComputed.has(sortField);
101
+ return sortsOnComputed
102
+ ? (0, computed_1.Computed)(db, meta, joined, new Set([sortField]))
103
+ : joined;
104
+ }
105
+ function List(obj, meta, request, reqCtx, { sorting, filters, db, options }) {
106
+ const filterList = Object.entries(meta.filters).filter(([name]) => filters && name in filters);
107
+ const { indexFilter, source } = indexedSource(meta, request, filterList, filters);
108
+ const joinedSplit = (0, joined_1.splitJoinedFields)(meta, sorting, filters);
109
+ const filtering = materializeFilterFields(source, meta, db, joinedSplit, {
110
+ filterList,
111
+ });
112
+ const plan = sortPlan(meta, sorting);
113
+ const { sortField, shouldSort, isModifiedSort } = plan;
114
+ let tmpRequest = orderedByIndex(filtering.stream, plan, sorting);
115
+ if (filterList.length > 0) {
116
+ tmpRequest = filterList.reduce((req, [name, filter]) => {
117
+ const fieldFilter = filters?.[name];
118
+ if (!fieldFilter || name === indexFilter)
119
+ return req;
120
+ return (0, metadata_1.FilterValuesOf)(fieldFilter).reduce((filtered, [value, mode]) => filtered.filter((row) => filter(Object.assign(reqCtx, { this: obj }), (0, validation_1.UnlockRequest)(obj, meta, row, name), name, value, mode, row.cast())), req);
121
+ }, tmpRequest);
122
+ }
123
+ const total = tmpRequest.count();
124
+ tmpRequest = materializeSortFields(tmpRequest, sortField, {
125
+ db,
126
+ meta,
127
+ joinedSplit,
128
+ filteredComputed: filtering.filteredComputed,
129
+ });
130
+ if (isModifiedSort && sortField) {
131
+ tmpRequest = tmpRequest
132
+ .cast()
133
+ .map((row) => row.merge({
134
+ [MODIFIED_SORT_KEY]: (0, validation_1.UnlockRequest)(obj, meta, row, sortField),
135
+ }))
136
+ .orderBy(MODIFIED_SORT_KEY, sorting?.[1] ?? "asc")
137
+ .without(MODIFIED_SORT_KEY)
138
+ .cast();
139
+ }
140
+ else if (shouldSort && !shouldSort.indexed && sortField) {
141
+ tmpRequest = tmpRequest.orderBy(sortField, sorting?.[1] ?? "asc");
142
+ }
143
+ return listResultTuple(tmpRequest, total, meta, joinedSplit, {
144
+ db,
145
+ options,
146
+ });
147
+ }
148
+ function pageComputedFields(meta, options) {
149
+ const merged = new Set(Object.keys(options.filters ?? {}).filter((name) => name in meta.filters));
150
+ if (options.sortKey)
151
+ merged.add(options.sortKey);
152
+ const names = Object.entries(meta.fields)
153
+ .filter(([name, field]) => field.computed &&
154
+ !merged.has(name) &&
155
+ (!options.pluck || options.pluck.has(name)))
156
+ .map(([name]) => name);
157
+ return new Set(names);
158
+ }
159
+ function pageJoinedFields(options, materializeAll) {
160
+ const deferred = options.deferredJoined ?? new Set();
161
+ if (materializeAll || !options.pluck)
162
+ return deferred;
163
+ const pluck = options.pluck;
164
+ return new Set(Array.from(deferred).filter((name) => pluck.has(name)));
165
+ }
166
+ function ListPage(db, meta, query, options) {
167
+ let page = query.slice(options.offset, options.limit);
168
+ const computed = pageComputedFields(meta, options);
169
+ const joined = pageJoinedFields(options, computed.size > 0);
170
+ if (joined.size > 0)
171
+ page = (0, joined_1.Joined)(db, meta, page, joined);
172
+ if (computed.size > 0)
173
+ page = (0, computed_1.Computed)(db, meta, page, computed);
174
+ if (!options.noForeign)
175
+ page = (0, foreign_1.Foreign)(db, meta, page, options.pluck);
176
+ return options.pluck ? page.pluck("_internal", ...options.pluck) : page;
177
+ }
178
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/internal/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** @internal @packageDocumentation */
2
+ import type { FieldData, ForeignJoinedRef } from "./field-types";
3
+ /** Copies into `dst` the entries of `src` it lacks. */
4
+ export declare function merge<Value>(src: Record<string, Value>, dst: Record<string, Value>): void;
5
+ /** Rebuilds the fields each list mode plucks from the fields' listable modes. */
6
+ export declare function rebuildPluck(pluck: Record<string, Set<string>>, fields: Record<string, FieldData>): void;
7
+ /**
8
+ * The `@Joined` fields of a relation target that `pluck` names, or all of
9
+ * them when `pluck` is unset; `undefined` when there are none.
10
+ */
11
+ export declare function targetJoinedFields(fields: Record<string, FieldData>, pluck?: string[]): ForeignJoinedRef[] | undefined;
12
+ /**
13
+ * The database fields a listable field selects: itself (`true`), none
14
+ * (`false`) or the given ones, plus the field and its local key when it is
15
+ * joined and selects any.
16
+ */
17
+ export declare function listedNames(name: string, requiredFields: boolean | string[], field: FieldData): string[];
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /** @internal @packageDocumentation */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.merge = merge;
5
+ exports.rebuildPluck = rebuildPluck;
6
+ exports.targetJoinedFields = targetJoinedFields;
7
+ exports.listedNames = listedNames;
8
+ /** Copies into `dst` the entries of `src` it lacks. */
9
+ function merge(src, dst) {
10
+ for (const key in src) {
11
+ if (!(key in dst)) {
12
+ dst[key] = src[key];
13
+ }
14
+ }
15
+ }
16
+ /** Rebuilds the fields each list mode plucks from the fields' listable modes. */
17
+ function rebuildPluck(pluck, fields) {
18
+ for (const set of Object.values(pluck)) {
19
+ set.clear();
20
+ }
21
+ for (const [_, field] of Object.entries(fields)) {
22
+ if (field.listable) {
23
+ for (const [mode, names] of Object.entries(field.listable)) {
24
+ if (!(mode in pluck)) {
25
+ pluck[mode] = new Set();
26
+ }
27
+ for (const name of names) {
28
+ pluck[mode].add(name);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
34
+ /**
35
+ * The `@Joined` fields of a relation target that `pluck` names, or all of
36
+ * them when `pluck` is unset; `undefined` when there are none.
37
+ */
38
+ function targetJoinedFields(fields, pluck) {
39
+ const pluckSet = pluck ? new Set(pluck) : undefined;
40
+ const groups = [];
41
+ for (const [fieldName, field] of Object.entries(fields)) {
42
+ if (!field.joined || (pluckSet && !pluckSet.has(fieldName))) {
43
+ continue;
44
+ }
45
+ const j = field.joined;
46
+ groups.push({
47
+ name: fieldName,
48
+ table: j.table,
49
+ tableClass: j.tableClass,
50
+ localKey: j.localKey,
51
+ remoteField: j.remoteField,
52
+ remoteIndex: j.remoteIndex,
53
+ schemaName: j.schemaName,
54
+ });
55
+ }
56
+ return groups.length > 0 ? groups : undefined;
57
+ }
58
+ /**
59
+ * The database fields a listable field selects: itself (`true`), none
60
+ * (`false`) or the given ones, plus the field and its local key when it is
61
+ * joined and selects any.
62
+ */
63
+ function listedNames(name, requiredFields, field) {
64
+ const baseNames = requiredFields === true
65
+ ? [name]
66
+ : requiredFields === false
67
+ ? []
68
+ : requiredFields;
69
+ return baseNames.length > 0 && field.joined
70
+ ? Array.from(new Set([...baseNames, name, field.joined.localKey]))
71
+ : baseNames;
72
+ }
73
+ //# sourceMappingURL=meta-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-records.js","sourceRoot":"","sources":["../../src/internal/meta-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** @internal @packageDocumentation */
2
+ import type { Query } from "../components";
3
+ import type { DataAPIMeta } from "../metadata";
4
+ export declare function WriteProperties(obj: any, meta: DataAPIMeta, bodyData: Parameters<typeof Query.WriteProperties>[2], action?: string, existingDBData?: Parameters<typeof Query.WriteProperties>[4]): Record<string, any>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ /** @internal @packageDocumentation */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.WriteProperties = WriteProperties;
5
+ function writableInBody(writable, bodyData) {
6
+ return {
7
+ props: writable.props.filter(([key]) => Object.hasOwn(bodyData, key)),
8
+ setters: writable.setters.filter(([key]) => Object.hasOwn(bodyData, key)),
9
+ };
10
+ }
11
+ function writeTargetDefaults(instance, meta, dbData) {
12
+ for (const [key, value] of Object.entries(new meta.target())) {
13
+ if (value !== undefined) {
14
+ instance[key] = value;
15
+ if (key in meta.fields) {
16
+ dbData[meta.fields[key].dbName || key] = value;
17
+ }
18
+ }
19
+ }
20
+ }
21
+ function WriteProperties(obj, meta, bodyData, action, existingDBData) {
22
+ const actionWritable = meta.writable[action ?? "_default"] ?? meta.writable._default;
23
+ const writable = existingDBData
24
+ ? writableInBody(actionWritable, bodyData)
25
+ : actionWritable;
26
+ const instance = { ...obj };
27
+ const dbData = existingDBData || {};
28
+ Object.setPrototypeOf(dbData, meta.tableClass.prototype);
29
+ if (!existingDBData) {
30
+ writeTargetDefaults(instance, meta, dbData);
31
+ }
32
+ for (const [key, field] of writable.props) {
33
+ instance[key] = bodyData[key];
34
+ dbData[field.dbName || key] = bodyData[key];
35
+ }
36
+ instance.table = dbData;
37
+ Object.setPrototypeOf(instance, meta.target.prototype);
38
+ for (const [key, field] of writable.setters) {
39
+ field.desc?.set?.apply(instance, [bodyData[key]]);
40
+ }
41
+ return dbData;
42
+ }
43
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/internal/properties.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AA8BtC,0CA6BC;AAtDD,SAAS,cAAc,CACrB,QAA8B,EAC9B,QAAqD;IAErD,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAqD,EACrD,IAAiB,EACjB,MAAuE;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAC7B,GAAQ,EACR,IAAiB,EACjB,QAAqD,EACrD,MAAe,EACf,cAA4D;IAE5D,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChE,MAAM,QAAQ,GAAG,cAAc;QAC7B,CAAC,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC;QAC1C,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC5B,MAAM,MAAM,GACV,cAAc,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** @internal @packageDocumentation */
2
+ import type { Class } from "@antelopejs/interface-core/decorators";
3
+ import { type Table } from "@antelopejs/interface-database-decorators";
4
+ interface ResolvedTableReference {
5
+ tableName: string;
6
+ tableClass?: Class<Table>;
7
+ /** `undefined` means same schema as the source DataAPI. */
8
+ schemaName?: string;
9
+ }
10
+ export declare function resolveTableReference(sourceSchemaName: string, table: string | Class<Table>, explicitSchema: string | undefined, contextLabel: string): ResolvedTableReference;
11
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /** @internal @packageDocumentation */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.resolveTableReference = resolveTableReference;
5
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
6
+ const guards_1 = require("./guards");
7
+ function readTableMetadata(table) {
8
+ const meta = (0, interface_database_decorators_1.getMetadata)(table, interface_database_decorators_1.DatumStaticMetadata);
9
+ return { schemaName: meta?.schemaName, tableName: meta?.tableName };
10
+ }
11
+ function resolveTableReference(sourceSchemaName, table, explicitSchema, contextLabel) {
12
+ if (!(0, guards_1.isString)(table)) {
13
+ const inferred = readTableMetadata(table);
14
+ const schemaName = explicitSchema ?? inferred.schemaName;
15
+ const tableName = inferred.tableName;
16
+ if (!schemaName || !tableName) {
17
+ throw new Error(`Unable to infer table name/schema for ${contextLabel}: pass @RegisterTable on the table class`);
18
+ }
19
+ if (explicitSchema &&
20
+ inferred.schemaName &&
21
+ explicitSchema !== inferred.schemaName) {
22
+ throw new Error(`Schema mismatch for ${contextLabel}: class registers in "${inferred.schemaName}" but option specifies "${explicitSchema}"`);
23
+ }
24
+ return {
25
+ tableName,
26
+ tableClass: table,
27
+ schemaName: schemaName === sourceSchemaName ? undefined : schemaName,
28
+ };
29
+ }
30
+ const targetSchema = explicitSchema ?? sourceSchemaName;
31
+ const databaseSchema = (0, interface_database_decorators_1.getTablesForSchema)(targetSchema);
32
+ if (!databaseSchema) {
33
+ throw new Error(`Schema "${targetSchema}" not found for ${contextLabel}`);
34
+ }
35
+ const tableClass = databaseSchema[table];
36
+ const isOtherSchema = targetSchema !== sourceSchemaName;
37
+ if (isOtherSchema && !tableClass) {
38
+ throw new Error(`Table "${table}" is not registered in schema "${targetSchema}" for ${contextLabel}: register its class with @RegisterTable before declaring the field`);
39
+ }
40
+ return {
41
+ tableName: table,
42
+ tableClass,
43
+ schemaName: isOtherSchema ? targetSchema : undefined,
44
+ };
45
+ }
46
+ //# sourceMappingURL=table-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-reference.js","sourceRoot":"","sources":["../../src/internal/table-reference.ts"],"names":[],"mappings":";AAAA,sCAAsC;;AAwBtC,sDAgDC;AArED,6FAKmD;AAEnD,qCAAoC;AASpC,SAAS,iBAAiB,CAAC,KAAmB;IAC5C,MAAM,IAAI,GAAG,IAAA,2CAAW,EAAC,KAAK,EAAE,mDAAmB,CAAC,CAAC;IACrD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACtE,CAAC;AAED,SAAgB,qBAAqB,CACnC,gBAAwB,EACxB,KAA4B,EAC5B,cAAkC,EAClC,YAAoB;IAEpB,IAAI,CAAC,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,yCAAyC,YAAY,0CAA0C,CAChG,CAAC;QACJ,CAAC;QACD,IACE,cAAc;YACd,QAAQ,CAAC,UAAU;YACnB,cAAc,KAAK,QAAQ,CAAC,UAAU,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CACb,uBAAuB,YAAY,yBAAyB,QAAQ,CAAC,UAAU,2BAA2B,cAAc,GAAG,CAC5H,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS;YACT,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,UAAU,KAAK,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;SACrE,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,IAAI,gBAAgB,CAAC;IACxD,MAAM,cAAc,GAAG,IAAA,kDAAkB,EAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,WAAW,YAAY,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,YAAY,KAAK,gBAAgB,CAAC;IACxD,IAAI,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,UAAU,KAAK,kCAAkC,YAAY,SAAS,YAAY,qEAAqE,CACxJ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU;QACV,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** @internal @packageDocumentation */
2
+ import type { Constructible } from "@antelopejs/interface-database-decorators/common";
3
+ import type { SchemaInstance, Table, ValueProxy } from "@antelopejs/interface-database";
4
+ import type { ComputedFieldData } from "../metadata";
5
+ export type TableRow = Parameters<ComputedFieldData["expr"]>[0];
6
+ export interface TableTargetReference {
7
+ table: string;
8
+ tableClass?: Constructible;
9
+ schemaName?: string;
10
+ }
11
+ export declare function targetTable(sourceDb: SchemaInstance<any>, target: TableTargetReference): Table<any>;
12
+ /**
13
+ * The lookup side of a relation: `table` reduced to `fields`, with the
14
+ * internal fields the modifiers keep. A plucked table is a staged selection
15
+ * the database accepts wherever it takes a table, but its type is a stream.
16
+ */
17
+ export declare function pluckedTable(table: Table<any>, ...fields: string[]): Table<any>;
18
+ export declare function Get(table: Table<any>, id: string | ValueProxy<string>, index?: string): import("@antelopejs/interface-database").Datum<any>;