@byline/core 0.9.3
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/LICENSE +373 -0
- package/README.md +17 -0
- package/dist/@types/admin-types.d.ts +275 -0
- package/dist/@types/admin-types.d.ts.map +1 -0
- package/dist/@types/admin-types.js +18 -0
- package/dist/@types/admin-types.js.map +1 -0
- package/dist/@types/collection-types.d.ts +816 -0
- package/dist/@types/collection-types.d.ts.map +1 -0
- package/dist/@types/collection-types.js +217 -0
- package/dist/@types/collection-types.js.map +1 -0
- package/dist/@types/db-types.d.ts +463 -0
- package/dist/@types/db-types.d.ts.map +1 -0
- package/dist/@types/db-types.js +2 -0
- package/dist/@types/db-types.js.map +1 -0
- package/dist/@types/field-data-types.d.ts +147 -0
- package/dist/@types/field-data-types.d.ts.map +1 -0
- package/dist/@types/field-data-types.js +38 -0
- package/dist/@types/field-data-types.js.map +1 -0
- package/dist/@types/field-types.d.ts +579 -0
- package/dist/@types/field-types.d.ts.map +1 -0
- package/dist/@types/field-types.js +32 -0
- package/dist/@types/field-types.js.map +1 -0
- package/dist/@types/index.d.ts +18 -0
- package/dist/@types/index.d.ts.map +1 -0
- package/dist/@types/index.js +18 -0
- package/dist/@types/index.js.map +1 -0
- package/dist/@types/populate-types.d.ts +54 -0
- package/dist/@types/populate-types.d.ts.map +1 -0
- package/dist/@types/populate-types.js +9 -0
- package/dist/@types/populate-types.js.map +1 -0
- package/dist/@types/query-predicate.d.ts +74 -0
- package/dist/@types/query-predicate.d.ts.map +1 -0
- package/dist/@types/query-predicate.js +9 -0
- package/dist/@types/query-predicate.js.map +1 -0
- package/dist/@types/site-config.d.ts +212 -0
- package/dist/@types/site-config.d.ts.map +1 -0
- package/dist/@types/site-config.js +9 -0
- package/dist/@types/site-config.js.map +1 -0
- package/dist/@types/storage-types.d.ts +86 -0
- package/dist/@types/storage-types.d.ts.map +1 -0
- package/dist/@types/storage-types.js +9 -0
- package/dist/@types/storage-types.js.map +1 -0
- package/dist/@types/store-types.d.ts +134 -0
- package/dist/@types/store-types.d.ts.map +1 -0
- package/dist/@types/store-types.js +24 -0
- package/dist/@types/store-types.js.map +1 -0
- package/dist/@types/type-utils.d.ts +17 -0
- package/dist/@types/type-utils.d.ts.map +1 -0
- package/dist/@types/type-utils.js +9 -0
- package/dist/@types/type-utils.js.map +1 -0
- package/dist/auth/apply-before-read.d.ts +36 -0
- package/dist/auth/apply-before-read.d.ts.map +1 -0
- package/dist/auth/apply-before-read.js +68 -0
- package/dist/auth/apply-before-read.js.map +1 -0
- package/dist/auth/apply-before-read.test.node.d.ts +9 -0
- package/dist/auth/apply-before-read.test.node.d.ts.map +1 -0
- package/dist/auth/apply-before-read.test.node.js +144 -0
- package/dist/auth/apply-before-read.test.node.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.d.ts +39 -0
- package/dist/auth/assert-actor-can-perform.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.js +64 -0
- package/dist/auth/assert-actor-can-perform.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts +9 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.js +119 -0
- package/dist/auth/assert-actor-can-perform.test.node.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/register-collection-abilities.d.ts +40 -0
- package/dist/auth/register-collection-abilities.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.js +87 -0
- package/dist/auth/register-collection-abilities.js.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts +9 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.js +124 -0
- package/dist/auth/register-collection-abilities.test.node.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +108 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/routes.d.ts +16 -0
- package/dist/config/routes.d.ts.map +1 -0
- package/dist/config/routes.js +26 -0
- package/dist/config/routes.js.map +1 -0
- package/dist/config/validate-admin-configs.d.ts +33 -0
- package/dist/config/validate-admin-configs.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.js +250 -0
- package/dist/config/validate-admin-configs.js.map +1 -0
- package/dist/config/validate-admin-configs.test.node.d.ts +9 -0
- package/dist/config/validate-admin-configs.test.node.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.test.node.js +224 -0
- package/dist/config/validate-admin-configs.test.node.js.map +1 -0
- package/dist/config/validate-collections.d.ts +33 -0
- package/dist/config/validate-collections.d.ts.map +1 -0
- package/dist/config/validate-collections.js +70 -0
- package/dist/config/validate-collections.js.map +1 -0
- package/dist/config/validate-collections.test.node.d.ts +9 -0
- package/dist/config/validate-collections.test.node.d.ts.map +1 -0
- package/dist/config/validate-collections.test.node.js +149 -0
- package/dist/config/validate-collections.test.node.js.map +1 -0
- package/dist/core.d.ts +89 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +99 -0
- package/dist/core.js.map +1 -0
- package/dist/defaults/default-values.d.ts +13 -0
- package/dist/defaults/default-values.d.ts.map +1 -0
- package/dist/defaults/default-values.js +60 -0
- package/dist/defaults/default-values.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +98 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +134 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/logger.d.ts +62 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +120 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/registry.d.ts +65 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +133 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/patches/apply-patches.d.ts +21 -0
- package/dist/patches/apply-patches.d.ts.map +1 -0
- package/dist/patches/apply-patches.js +357 -0
- package/dist/patches/apply-patches.js.map +1 -0
- package/dist/patches/index.d.ts +3 -0
- package/dist/patches/index.d.ts.map +1 -0
- package/dist/patches/index.js +4 -0
- package/dist/patches/index.js.map +1 -0
- package/dist/patches/patch-types.d.ts +82 -0
- package/dist/patches/patch-types.d.ts.map +1 -0
- package/dist/patches/patch-types.js +3 -0
- package/dist/patches/patch-types.js.map +1 -0
- package/dist/patches/patch.test.node.d.ts +2 -0
- package/dist/patches/patch.test.node.d.ts.map +1 -0
- package/dist/patches/patch.test.node.js +193 -0
- package/dist/patches/patch.test.node.js.map +1 -0
- package/dist/query/parse-where.d.ts +100 -0
- package/dist/query/parse-where.d.ts.map +1 -0
- package/dist/query/parse-where.js +352 -0
- package/dist/query/parse-where.js.map +1 -0
- package/dist/query/parse-where.test.node.d.ts +9 -0
- package/dist/query/parse-where.test.node.d.ts.map +1 -0
- package/dist/query/parse-where.test.node.js +581 -0
- package/dist/query/parse-where.test.node.js.map +1 -0
- package/dist/schemas/zod/builder.d.ts +466 -0
- package/dist/schemas/zod/builder.d.ts.map +1 -0
- package/dist/schemas/zod/builder.js +276 -0
- package/dist/schemas/zod/builder.js.map +1 -0
- package/dist/schemas/zod/cache.d.ts +14 -0
- package/dist/schemas/zod/cache.d.ts.map +1 -0
- package/dist/schemas/zod/cache.js +40 -0
- package/dist/schemas/zod/cache.js.map +1 -0
- package/dist/schemas/zod/index.d.ts +4 -0
- package/dist/schemas/zod/index.d.ts.map +1 -0
- package/dist/schemas/zod/index.js +4 -0
- package/dist/schemas/zod/index.js.map +1 -0
- package/dist/schemas/zod/types.d.ts +13 -0
- package/dist/schemas/zod/types.d.ts.map +1 -0
- package/dist/schemas/zod/types.js +2 -0
- package/dist/schemas/zod/types.js.map +1 -0
- package/dist/services/collection-bootstrap.d.ts +46 -0
- package/dist/services/collection-bootstrap.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.js +108 -0
- package/dist/services/collection-bootstrap.js.map +1 -0
- package/dist/services/collection-bootstrap.test.node.d.ts +9 -0
- package/dist/services/collection-bootstrap.test.node.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.test.node.js +208 -0
- package/dist/services/collection-bootstrap.test.node.js.map +1 -0
- package/dist/services/document-lifecycle.d.ts +245 -0
- package/dist/services/document-lifecycle.d.ts.map +1 -0
- package/dist/services/document-lifecycle.js +481 -0
- package/dist/services/document-lifecycle.js.map +1 -0
- package/dist/services/document-lifecycle.test.node.d.ts +9 -0
- package/dist/services/document-lifecycle.test.node.d.ts.map +1 -0
- package/dist/services/document-lifecycle.test.node.js +781 -0
- package/dist/services/document-lifecycle.test.node.js.map +1 -0
- package/dist/services/document-read.d.ts +26 -0
- package/dist/services/document-read.d.ts.map +1 -0
- package/dist/services/document-read.js +60 -0
- package/dist/services/document-read.js.map +1 -0
- package/dist/services/field-upload.d.ts +100 -0
- package/dist/services/field-upload.d.ts.map +1 -0
- package/dist/services/field-upload.js +328 -0
- package/dist/services/field-upload.js.map +1 -0
- package/dist/services/field-upload.test.node.d.ts +9 -0
- package/dist/services/field-upload.test.node.d.ts.map +1 -0
- package/dist/services/field-upload.test.node.js +337 -0
- package/dist/services/field-upload.test.node.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +11 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/populate.d.ts +299 -0
- package/dist/services/populate.d.ts.map +1 -0
- package/dist/services/populate.js +484 -0
- package/dist/services/populate.js.map +1 -0
- package/dist/services/populate.test.node.d.ts +9 -0
- package/dist/services/populate.test.node.d.ts.map +1 -0
- package/dist/services/populate.test.node.js +910 -0
- package/dist/services/populate.test.node.js.map +1 -0
- package/dist/services/relation-projection.d.ts +52 -0
- package/dist/services/relation-projection.d.ts.map +1 -0
- package/dist/services/relation-projection.js +81 -0
- package/dist/services/relation-projection.js.map +1 -0
- package/dist/services/richtext-populate.d.ts +87 -0
- package/dist/services/richtext-populate.d.ts.map +1 -0
- package/dist/services/richtext-populate.js +189 -0
- package/dist/services/richtext-populate.js.map +1 -0
- package/dist/services/richtext-populate.test.node.d.ts +9 -0
- package/dist/services/richtext-populate.test.node.d.ts.map +1 -0
- package/dist/services/richtext-populate.test.node.js +197 -0
- package/dist/services/richtext-populate.test.node.js.map +1 -0
- package/dist/storage/collection-fingerprint.d.ts +21 -0
- package/dist/storage/collection-fingerprint.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.js +172 -0
- package/dist/storage/collection-fingerprint.js.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts +9 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.js +256 -0
- package/dist/storage/collection-fingerprint.test.node.js.map +1 -0
- package/dist/storage/field-store-map.d.ts +59 -0
- package/dist/storage/field-store-map.d.ts.map +1 -0
- package/dist/storage/field-store-map.js +75 -0
- package/dist/storage/field-store-map.js.map +1 -0
- package/dist/storage/field-store-map.test.node.d.ts +9 -0
- package/dist/storage/field-store-map.test.node.d.ts.map +1 -0
- package/dist/storage/field-store-map.test.node.js +117 -0
- package/dist/storage/field-store-map.test.node.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +10 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/utils/normalise-dates.d.ts +15 -0
- package/dist/utils/normalise-dates.d.ts.map +1 -0
- package/dist/utils/normalise-dates.js +22 -0
- package/dist/utils/normalise-dates.js.map +1 -0
- package/dist/utils/slugify.d.ts +56 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +91 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/utils/slugify.test.node.d.ts +9 -0
- package/dist/utils/slugify.test.node.d.ts.map +1 -0
- package/dist/utils/slugify.test.node.js +86 -0
- package/dist/utils/slugify.test.node.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +36 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +38 -0
- package/dist/utils/storage-utils.js.map +1 -0
- package/dist/utils/utils.general.d.ts +64 -0
- package/dist/utils/utils.general.d.ts.map +1 -0
- package/dist/utils/utils.general.js +219 -0
- package/dist/utils/utils.general.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/shared.d.ts +36 -0
- package/dist/validation/shared.d.ts.map +1 -0
- package/dist/validation/shared.js +42 -0
- package/dist/validation/shared.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/workflow.d.ts +40 -0
- package/dist/workflow/workflow.d.ts.map +1 -0
- package/dist/workflow/workflow.js +96 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.node.d.ts +2 -0
- package/dist/workflow/workflow.test.node.d.ts.map +1 -0
- package/dist/workflow/workflow.test.node.js +198 -0
- package/dist/workflow/workflow.test.node.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
import { applyBeforeRead } from '../auth/apply-before-read.js';
|
|
9
|
+
import { ERR_READ_BUDGET_EXCEEDED } from '../lib/errors.js';
|
|
10
|
+
import { parseWhere } from '../query/parse-where.js';
|
|
11
|
+
import { applyAfterRead } from './document-read.js';
|
|
12
|
+
import { populateRichTextFields } from './richtext-populate.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// ReadContext — recursion guard
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const DEFAULT_MAX_READS = 500;
|
|
17
|
+
const DEFAULT_MAX_DEPTH = 8;
|
|
18
|
+
/** Build a fresh ReadContext. */
|
|
19
|
+
export function createReadContext(overrides) {
|
|
20
|
+
return {
|
|
21
|
+
visited: overrides?.visited ?? new Set(),
|
|
22
|
+
afterReadFired: overrides?.afterReadFired ?? new Set(),
|
|
23
|
+
beforeReadCache: overrides?.beforeReadCache ?? new Map(),
|
|
24
|
+
readCount: overrides?.readCount ?? 0,
|
|
25
|
+
maxReads: overrides?.maxReads ?? DEFAULT_MAX_READS,
|
|
26
|
+
maxDepth: overrides?.maxDepth ?? DEFAULT_MAX_DEPTH,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Main entry
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/**
|
|
33
|
+
* Populate relation leaves in `opts.documents` in place, one DB
|
|
34
|
+
* round-trip per depth level per target collection.
|
|
35
|
+
*/
|
|
36
|
+
export async function populateDocuments(opts) {
|
|
37
|
+
const ctx = opts.readContext ?? createReadContext();
|
|
38
|
+
const populate = opts.populate;
|
|
39
|
+
const requestedDepth = opts.depth ?? (populate !== undefined ? 1 : 0);
|
|
40
|
+
const maxDepth = Math.max(0, Math.min(requestedDepth, ctx.maxDepth));
|
|
41
|
+
// Mark the input documents as visited regardless of whether we populate —
|
|
42
|
+
// a future read-side hook that triggers further reads will then skip
|
|
43
|
+
// re-materialising documents it has already seen.
|
|
44
|
+
for (const doc of opts.documents) {
|
|
45
|
+
const id = doc?.document_id;
|
|
46
|
+
if (typeof id === 'string') {
|
|
47
|
+
ctx.visited.add(visitedKey(opts.collectionId, id));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (populate === undefined || maxDepth === 0 || opts.documents.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Per-call cache: collection lookup key → resolved CollectionDefinition.
|
|
54
|
+
// Populated on first hit via synthetic match, path match, or a one-time
|
|
55
|
+
// `db.queries.collections.getCollectionById` fallback. Negative results
|
|
56
|
+
// are cached too (null) so we never double-query a missing target.
|
|
57
|
+
const defCache = new Map();
|
|
58
|
+
const sourceDef = await resolveCollectionDef(opts.db, opts.collections, opts.collectionId, defCache);
|
|
59
|
+
if (!sourceDef) {
|
|
60
|
+
// Cannot walk without field definitions; leave documents untouched.
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
let current = opts.documents.map((doc) => ({
|
|
64
|
+
doc,
|
|
65
|
+
fieldDefs: sourceDef.fields,
|
|
66
|
+
populate,
|
|
67
|
+
}));
|
|
68
|
+
for (let level = 0; level < maxDepth; level++) {
|
|
69
|
+
const allLeaves = [];
|
|
70
|
+
for (const entry of current) {
|
|
71
|
+
if (entry.doc?.fields && typeof entry.doc.fields === 'object') {
|
|
72
|
+
collectRelationLeaves(entry.doc.fields, entry.fieldDefs, entry.populate, allLeaves);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (allLeaves.length === 0)
|
|
76
|
+
break;
|
|
77
|
+
// Group by target collection so we batch one query per target.
|
|
78
|
+
const byTarget = new Map();
|
|
79
|
+
for (const leaf of allLeaves) {
|
|
80
|
+
const tid = leaf.value.targetCollectionId;
|
|
81
|
+
const arr = byTarget.get(tid);
|
|
82
|
+
if (arr)
|
|
83
|
+
arr.push(leaf);
|
|
84
|
+
else
|
|
85
|
+
byTarget.set(tid, [leaf]);
|
|
86
|
+
}
|
|
87
|
+
const nextLevel = [];
|
|
88
|
+
const queuedForNext = new Set();
|
|
89
|
+
for (const [targetCollectionId, leaves] of byTarget) {
|
|
90
|
+
const targetDef = await resolveCollectionDef(opts.db, opts.collections, targetCollectionId, defCache);
|
|
91
|
+
const selectList = buildBatchSelect(leaves, targetDef);
|
|
92
|
+
// Only fetch IDs we haven't materialised earlier in this request.
|
|
93
|
+
const idsToFetch = Array.from(new Set(leaves
|
|
94
|
+
.filter((l) => !ctx.visited.has(visitedKey(targetCollectionId, l.value.targetDocumentId)))
|
|
95
|
+
.map((l) => l.value.targetDocumentId)));
|
|
96
|
+
// Resolve the target collection's `beforeRead` predicate, if any.
|
|
97
|
+
// The cache on `ctx.beforeReadCache` ensures each (collectionPath,
|
|
98
|
+
// actor) tuple only runs through the hook once per request, even
|
|
99
|
+
// across populate fanout where the same target collection may be
|
|
100
|
+
// visited from multiple sources.
|
|
101
|
+
const targetFilters = await resolveBeforeReadFiltersForTarget({
|
|
102
|
+
targetDef,
|
|
103
|
+
collections: opts.collections,
|
|
104
|
+
requestContext: opts.requestContext,
|
|
105
|
+
readContext: ctx,
|
|
106
|
+
bypassBeforeRead: opts.bypassBeforeRead,
|
|
107
|
+
db: opts.db,
|
|
108
|
+
});
|
|
109
|
+
let fetched = [];
|
|
110
|
+
if (idsToFetch.length > 0) {
|
|
111
|
+
fetched = await opts.db.queries.documents.getDocumentsByDocumentIds({
|
|
112
|
+
collection_id: targetCollectionId,
|
|
113
|
+
document_ids: idsToFetch,
|
|
114
|
+
locale: opts.locale,
|
|
115
|
+
fields: selectList,
|
|
116
|
+
readMode: opts.readMode,
|
|
117
|
+
filters: targetFilters,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const byId = new Map();
|
|
121
|
+
for (const d of fetched) {
|
|
122
|
+
if (typeof d?.document_id === 'string')
|
|
123
|
+
byId.set(d.document_id, d);
|
|
124
|
+
}
|
|
125
|
+
// First pass: replace leaves with envelopes (reading visited state
|
|
126
|
+
// before we update it). Each envelope preserves the original link
|
|
127
|
+
// metadata (`targetDocumentId`, `targetCollectionId`, and any
|
|
128
|
+
// `relationshipType` / `cascadeDelete`) so consumers can
|
|
129
|
+
// round-trip or inspect the relationship regardless of outcome.
|
|
130
|
+
for (const leaf of leaves) {
|
|
131
|
+
const { targetDocumentId, targetCollectionId } = leaf.value;
|
|
132
|
+
const key = visitedKey(targetCollectionId, targetDocumentId);
|
|
133
|
+
if (ctx.visited.has(key)) {
|
|
134
|
+
leaf.parent[leaf.key] = {
|
|
135
|
+
...leaf.value,
|
|
136
|
+
_resolved: true,
|
|
137
|
+
_cycle: true,
|
|
138
|
+
};
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const fetchedDoc = byId.get(targetDocumentId);
|
|
142
|
+
if (fetchedDoc === undefined) {
|
|
143
|
+
leaf.parent[leaf.key] = {
|
|
144
|
+
...leaf.value,
|
|
145
|
+
_resolved: false,
|
|
146
|
+
};
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
leaf.parent[leaf.key] = {
|
|
150
|
+
...leaf.value,
|
|
151
|
+
_resolved: true,
|
|
152
|
+
document: fetchedDoc,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// Second pass: mark freshly fetched docs visited, update readCount,
|
|
156
|
+
// fire `afterRead`, enforce the budget, and queue them for the next
|
|
157
|
+
// level (dedup by id).
|
|
158
|
+
//
|
|
159
|
+
// `afterRead` fires here rather than after the full walk so the hook
|
|
160
|
+
// can mutate targets before their envelopes land in the source tree.
|
|
161
|
+
// A target's own direct relations may still be raw refs at this point
|
|
162
|
+
// (they populate on the next depth level); a hook that wants to
|
|
163
|
+
// observe populated grandchildren should run at the outer / source
|
|
164
|
+
// level where populate has fully returned.
|
|
165
|
+
for (const d of fetched) {
|
|
166
|
+
const id = d.document_id;
|
|
167
|
+
const key = visitedKey(targetCollectionId, id);
|
|
168
|
+
if (ctx.visited.has(key))
|
|
169
|
+
continue;
|
|
170
|
+
ctx.visited.add(key);
|
|
171
|
+
ctx.readCount += 1;
|
|
172
|
+
if (ctx.readCount > ctx.maxReads) {
|
|
173
|
+
throw ERR_READ_BUDGET_EXCEEDED({
|
|
174
|
+
message: `populate exceeded read budget (maxReads=${ctx.maxReads})`,
|
|
175
|
+
details: {
|
|
176
|
+
readCount: ctx.readCount,
|
|
177
|
+
maxReads: ctx.maxReads,
|
|
178
|
+
targetCollectionId,
|
|
179
|
+
targetDocumentId: id,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
if (targetDef) {
|
|
184
|
+
// Rich-text populate runs *before* the user-land afterRead hook
|
|
185
|
+
// so hook authors observe fully-populated rich-text content. The
|
|
186
|
+
// gate (per-field `populateRelationsOnRead`) lives inside the
|
|
187
|
+
// service; passing the function unconditionally is correct.
|
|
188
|
+
if (opts.richTextPopulate) {
|
|
189
|
+
await populateRichTextFields({
|
|
190
|
+
fields: targetDef.fields,
|
|
191
|
+
collectionPath: targetDef.path,
|
|
192
|
+
documents: [d],
|
|
193
|
+
populate: opts.richTextPopulate,
|
|
194
|
+
readContext: ctx,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
await applyAfterRead({ doc: d, definition: targetDef, readContext: ctx });
|
|
198
|
+
}
|
|
199
|
+
if (!targetDef || queuedForNext.has(key))
|
|
200
|
+
continue;
|
|
201
|
+
const childPopulate = reduceChildPopulate(leaves, id);
|
|
202
|
+
if (childPopulate === undefined)
|
|
203
|
+
continue;
|
|
204
|
+
queuedForNext.add(key);
|
|
205
|
+
nextLevel.push({
|
|
206
|
+
doc: d,
|
|
207
|
+
fieldDefs: targetDef.fields,
|
|
208
|
+
populate: childPopulate,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
current = nextLevel;
|
|
213
|
+
if (current.length === 0)
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Internals
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
function visitedKey(collectionId, documentId) {
|
|
221
|
+
return `${collectionId}:${documentId}`;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Resolve a collection reference (DB UUID *or* path) to its
|
|
225
|
+
* `CollectionDefinition`. Tries in order:
|
|
226
|
+
*
|
|
227
|
+
* 1. Synthetic `.id` match on the collections array — supports unit
|
|
228
|
+
* tests that attach a synthetic id, and is a cheap win when the
|
|
229
|
+
* caller has pre-decorated collections with DB UUIDs.
|
|
230
|
+
* 2. Direct `.path` match — the public API of CollectionDefinition.
|
|
231
|
+
* 3. DB fallback via `getCollectionById(id)` — resolves a real DB
|
|
232
|
+
* UUID to its path, then matches on the path. This is the
|
|
233
|
+
* production path for the admin server fn and `@byline/client`,
|
|
234
|
+
* which both pass DB UUIDs as `collectionId` / `target_collection_id`.
|
|
235
|
+
*
|
|
236
|
+
* Results (including misses) are cached in `cache` for the duration of
|
|
237
|
+
* the current populate call.
|
|
238
|
+
*/
|
|
239
|
+
async function resolveCollectionDef(db, collections, id, cache) {
|
|
240
|
+
if (cache.has(id)) {
|
|
241
|
+
return cache.get(id) ?? undefined;
|
|
242
|
+
}
|
|
243
|
+
// 1. Synthetic `.id` (tests, pre-decorated arrays)
|
|
244
|
+
let def = collections.find((c) => c.id === id) ??
|
|
245
|
+
// 2. Path match
|
|
246
|
+
collections.find((c) => c.path === id);
|
|
247
|
+
// 3. DB fallback
|
|
248
|
+
if (!def) {
|
|
249
|
+
try {
|
|
250
|
+
const row = await db.queries.collections.getCollectionById(id);
|
|
251
|
+
if (row && typeof row.path === 'string') {
|
|
252
|
+
def = collections.find((c) => c.path === row.path);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
// Missing target collection is handled by the caller via the
|
|
257
|
+
// unresolved-stub path — swallow lookup errors here.
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
cache.set(id, def ?? null);
|
|
261
|
+
return def;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Resolve the per-target-collection `beforeRead` predicate for a populate
|
|
265
|
+
* batch fetch and compile it to `DocumentFilter[]`. Skipped when:
|
|
266
|
+
* - the target collection definition could not be resolved (in which
|
|
267
|
+
* case populate emits an unresolved stub anyway),
|
|
268
|
+
* - no `requestContext` was threaded in (synthetic / test call paths
|
|
269
|
+
* that don't go through `CollectionHandle`),
|
|
270
|
+
* - `bypassBeforeRead` is set (admin tooling, seeds, migrations).
|
|
271
|
+
*
|
|
272
|
+
* Returns `undefined` when no scoping applies, so the adapter can skip
|
|
273
|
+
* the EXISTS-loop entirely.
|
|
274
|
+
*/
|
|
275
|
+
async function resolveBeforeReadFiltersForTarget(params) {
|
|
276
|
+
const { targetDef, collections, requestContext, readContext, bypassBeforeRead, db } = params;
|
|
277
|
+
if (!targetDef || !requestContext || bypassBeforeRead)
|
|
278
|
+
return undefined;
|
|
279
|
+
const predicate = await applyBeforeRead({
|
|
280
|
+
definition: targetDef,
|
|
281
|
+
requestContext,
|
|
282
|
+
readContext,
|
|
283
|
+
});
|
|
284
|
+
if (predicate == null)
|
|
285
|
+
return undefined;
|
|
286
|
+
const parsed = await parseWhere(predicate, targetDef, {
|
|
287
|
+
collections,
|
|
288
|
+
resolveCollectionId: async (path) => {
|
|
289
|
+
// Match the target collection by path against the loaded collection
|
|
290
|
+
// list first (cheap, in-memory); fall back to a DB lookup for cases
|
|
291
|
+
// where a hook references a collection not loaded into the same
|
|
292
|
+
// populate context. This mirrors `CollectionHandle`'s parser ctx.
|
|
293
|
+
const local = collections.find((c) => c.path === path);
|
|
294
|
+
if (local?.id)
|
|
295
|
+
return local.id;
|
|
296
|
+
const row = await db.queries.collections.getCollectionByPath(path);
|
|
297
|
+
return row?.id ?? '';
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
return parsed.filters.length > 0 ? parsed.filters : undefined;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Walk `fields` against `fieldDefs` and collect every relation leaf whose
|
|
304
|
+
* name matches `populate`. Recurses through `group` / `array` / `blocks`
|
|
305
|
+
* using the same populate spec (structure field names do not scope the
|
|
306
|
+
* match — if `populate: { author: true }` is given, every `author`
|
|
307
|
+
* relation found in the tree matches).
|
|
308
|
+
*/
|
|
309
|
+
function collectRelationLeaves(fields, fieldDefs, populate, acc) {
|
|
310
|
+
for (const def of fieldDefs) {
|
|
311
|
+
const rawValue = fields[def.name];
|
|
312
|
+
if (rawValue == null)
|
|
313
|
+
continue;
|
|
314
|
+
if (def.type === 'relation') {
|
|
315
|
+
const sub = matchesPopulate(def.name, populate);
|
|
316
|
+
if (sub === undefined)
|
|
317
|
+
continue;
|
|
318
|
+
if (!isRelatedDocumentValue(rawValue))
|
|
319
|
+
continue;
|
|
320
|
+
// Skip leaves that have already been replaced (e.g. via shared-ref
|
|
321
|
+
// duplication at the previous level); only raw RelatedDocumentValues
|
|
322
|
+
// are candidates for population.
|
|
323
|
+
if ('_resolved' in rawValue)
|
|
324
|
+
continue;
|
|
325
|
+
acc.push({
|
|
326
|
+
parent: fields,
|
|
327
|
+
key: def.name,
|
|
328
|
+
field: def,
|
|
329
|
+
value: rawValue,
|
|
330
|
+
sub,
|
|
331
|
+
});
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
if (def.type === 'group') {
|
|
335
|
+
if (typeof rawValue === 'object' && !Array.isArray(rawValue)) {
|
|
336
|
+
collectRelationLeaves(rawValue, def.fields, populate, acc);
|
|
337
|
+
}
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (def.type === 'array') {
|
|
341
|
+
if (Array.isArray(rawValue)) {
|
|
342
|
+
for (const item of rawValue) {
|
|
343
|
+
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
|
344
|
+
collectRelationLeaves(item, def.fields, populate, acc);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
if (def.type === 'blocks') {
|
|
351
|
+
if (Array.isArray(rawValue)) {
|
|
352
|
+
for (const item of rawValue) {
|
|
353
|
+
if (item && typeof item === 'object' && !Array.isArray(item)) {
|
|
354
|
+
// Reconstructed block items carry `_type` set to the variant's `blockType`.
|
|
355
|
+
const blockType = item._type;
|
|
356
|
+
if (typeof blockType !== 'string')
|
|
357
|
+
continue;
|
|
358
|
+
const block = def.blocks.find((b) => b.blockType === blockType);
|
|
359
|
+
if (!block)
|
|
360
|
+
continue;
|
|
361
|
+
collectRelationLeaves(item, block.fields, populate, acc);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function matchesPopulate(fieldName, populate) {
|
|
369
|
+
if (populate === true)
|
|
370
|
+
return true;
|
|
371
|
+
if (populate === '*')
|
|
372
|
+
return '*';
|
|
373
|
+
const spec = populate[fieldName];
|
|
374
|
+
return spec;
|
|
375
|
+
}
|
|
376
|
+
function isRelatedDocumentValue(v) {
|
|
377
|
+
return (typeof v === 'object' &&
|
|
378
|
+
v !== null &&
|
|
379
|
+
typeof v.targetDocumentId === 'string' &&
|
|
380
|
+
typeof v.targetCollectionId === 'string');
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Build the `fields` array for a batch fetch against a single target
|
|
384
|
+
* collection.
|
|
385
|
+
*
|
|
386
|
+
* - Any leaf with `sub === '*'` → `undefined` (fetch all fields).
|
|
387
|
+
* - Otherwise → union of explicit `select` lists from each leaf,
|
|
388
|
+
* merged with the target's identity field (`useAsTitle`, falling
|
|
389
|
+
* back to the first text field). `sub === true` contributes no
|
|
390
|
+
* selects, so a batch of only-`true` leaves collapses to the
|
|
391
|
+
* identity field alone — the default projection.
|
|
392
|
+
*
|
|
393
|
+
* Document metadata (`document_id`, `collection_id`, `path`, `status`,
|
|
394
|
+
* timestamps) lives on the row itself and is always returned — it does
|
|
395
|
+
* not need to appear in the `fields` list.
|
|
396
|
+
*/
|
|
397
|
+
function buildBatchSelect(leaves, targetDef) {
|
|
398
|
+
const union = new Set();
|
|
399
|
+
for (const leaf of leaves) {
|
|
400
|
+
if (leaf.sub === '*')
|
|
401
|
+
return undefined;
|
|
402
|
+
if (leaf.sub === true)
|
|
403
|
+
continue;
|
|
404
|
+
const select = leaf.sub.select;
|
|
405
|
+
if (select) {
|
|
406
|
+
for (const name of select)
|
|
407
|
+
union.add(name);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (targetDef) {
|
|
411
|
+
const identity = resolveIdentityField(targetDef);
|
|
412
|
+
if (identity)
|
|
413
|
+
union.add(identity);
|
|
414
|
+
}
|
|
415
|
+
return Array.from(union);
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* The field that represents a target document's identity for populate's
|
|
419
|
+
* default projection. Prefers `useAsTitle` (server-safe schema-level
|
|
420
|
+
* config), falling back to the first declared text field.
|
|
421
|
+
*/
|
|
422
|
+
function resolveIdentityField(def) {
|
|
423
|
+
if (def.useAsTitle)
|
|
424
|
+
return def.useAsTitle;
|
|
425
|
+
const firstText = def.fields.find((f) => f.type === 'text');
|
|
426
|
+
return firstText?.name;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Merge the per-leaf sub-populate specs for all leaves pointing at a
|
|
430
|
+
* single (now-populated) target document into a single PopulateSpec for
|
|
431
|
+
* the next level's walk of that document. Returns `undefined` if the
|
|
432
|
+
* leaves don't request any nested population (in which case the populated
|
|
433
|
+
* document's own relations stay as raw refs).
|
|
434
|
+
*
|
|
435
|
+
* Sub-spec semantics at the next level:
|
|
436
|
+
* - `'*'` → propagate `'*'` (scope=all, full projection, recursive).
|
|
437
|
+
* `'*'` wins over `true` when both appear in the same batch
|
|
438
|
+
* so the caller's "full document" intent is preserved.
|
|
439
|
+
* - `true` → recurse into every relation of the target (scope=all,
|
|
440
|
+
* default projection).
|
|
441
|
+
* - object → forward any nested `populate` map; ignore `select`.
|
|
442
|
+
*/
|
|
443
|
+
function reduceChildPopulate(leaves, targetDocumentId) {
|
|
444
|
+
let anyStar = false;
|
|
445
|
+
let anyTrue = false;
|
|
446
|
+
const merged = {};
|
|
447
|
+
let hasMerged = false;
|
|
448
|
+
for (const l of leaves) {
|
|
449
|
+
if (l.value.targetDocumentId !== targetDocumentId)
|
|
450
|
+
continue;
|
|
451
|
+
if (l.sub === '*') {
|
|
452
|
+
anyStar = true;
|
|
453
|
+
break;
|
|
454
|
+
}
|
|
455
|
+
if (l.sub === true) {
|
|
456
|
+
anyTrue = true;
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
if (l.sub.populate !== undefined) {
|
|
460
|
+
for (const [k, v] of Object.entries(l.sub.populate)) {
|
|
461
|
+
merged[k] = v;
|
|
462
|
+
hasMerged = true;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (anyStar)
|
|
467
|
+
return '*';
|
|
468
|
+
if (anyTrue)
|
|
469
|
+
return true;
|
|
470
|
+
if (hasMerged)
|
|
471
|
+
return merged;
|
|
472
|
+
return undefined;
|
|
473
|
+
}
|
|
474
|
+
// ---------------------------------------------------------------------------
|
|
475
|
+
// Internal re-exports for tests
|
|
476
|
+
// ---------------------------------------------------------------------------
|
|
477
|
+
export const __internal = {
|
|
478
|
+
collectRelationLeaves,
|
|
479
|
+
matchesPopulate,
|
|
480
|
+
buildBatchSelect,
|
|
481
|
+
reduceChildPopulate,
|
|
482
|
+
visitedKey,
|
|
483
|
+
};
|
|
484
|
+
//# sourceMappingURL=populate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populate.js","sourceRoot":"","sources":["../../src/services/populate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgIH,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAoB/D,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAC7B,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAE3B,iCAAiC;AACjC,MAAM,UAAU,iBAAiB,CAAC,SAAgC;IAChE,OAAO;QACL,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI,GAAG,EAAE;QACxC,cAAc,EAAE,SAAS,EAAE,cAAc,IAAI,IAAI,GAAG,EAAE;QACtD,eAAe,EAAE,SAAS,EAAE,eAAe,IAAI,IAAI,GAAG,EAAE;QACxD,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,CAAC;QACpC,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,iBAAiB;QAClD,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,iBAAiB;KACnD,CAAA;AACH,CAAC;AA+ID,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAqB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,IAAI,iBAAiB,EAAE,CAAA;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEpE,0EAA0E;IAC1E,qEAAqE;IACrE,kDAAkD;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,GAAG,EAAE,WAAW,CAAA;QAC3B,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5E,OAAM;IACR,CAAC;IAED,yEAAyE;IACzE,wEAAwE;IACxE,wEAAwE;IACxE,mEAAmE;IACnE,MAAM,QAAQ,GAAuB,IAAI,GAAG,EAAE,CAAA;IAE9C,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,QAAQ,CACT,CAAA;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,oEAAoE;QACpE,OAAM;IACR,CAAC;IAUD,IAAI,OAAO,GAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG;QACH,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,QAAQ;KACT,CAAC,CAAC,CAAA;IAEH,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAsB,EAAE,CAAA;QACvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9D,qBAAqB,CACnB,KAAK,CAAC,GAAG,CAAC,MAA6B,EACvC,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,QAAQ,EACd,SAAS,CACV,CAAA;YACH,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,MAAK;QAEjC,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAA;QACrD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAA;YACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC7B,IAAI,GAAG;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;gBAClB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,SAAS,GAAiB,EAAE,CAAA;QAClC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;QAEvC,KAAK,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAC1C,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,WAAW,EAChB,kBAAkB,EAClB,QAAQ,CACT,CAAA;YACD,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAEtD,kEAAkE;YAClE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,IAAI,GAAG,CACL,MAAM;iBACH,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAClF;iBACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CACxC,CACF,CAAA;YAED,kEAAkE;YAClE,mEAAmE;YACnE,iEAAiE;YACjE,iEAAiE;YACjE,iCAAiC;YACjC,MAAM,aAAa,GAAG,MAAM,iCAAiC,CAAC;gBAC5D,SAAS;gBACT,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,WAAW,EAAE,GAAG;gBAChB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ,CAAC,CAAA;YAEF,IAAI,OAAO,GAAU,EAAE,CAAA;YACvB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,yBAAyB,CAAC;oBAClE,aAAa,EAAE,kBAAkB;oBACjC,YAAY,EAAE,UAAU;oBACxB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,aAAa;iBACvB,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAA;YACnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,EAAE,WAAW,KAAK,QAAQ;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;YACpE,CAAC;YAED,mEAAmE;YACnE,kEAAkE;YAClE,8DAA8D;YAC9D,yDAAyD;YACzD,gEAAgE;YAChE,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;gBAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;gBAE5D,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAU,CAAC,GAAG;wBAC7B,GAAG,IAAI,CAAC,KAAK;wBACb,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,IAAI;qBACgB,CAAA;oBAC9B,SAAQ;gBACV,CAAC;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;gBAC7C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAU,CAAC,GAAG;wBAC7B,GAAG,IAAI,CAAC,KAAK;wBACb,SAAS,EAAE,KAAK;qBACiB,CAAA;oBACnC,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAU,CAAC,GAAG;oBAC7B,GAAG,IAAI,CAAC,KAAK;oBACb,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,UAAU;iBACY,CAAA;YACpC,CAAC;YAED,oEAAoE;YACpE,oEAAoE;YACpE,uBAAuB;YACvB,EAAE;YACF,qEAAqE;YACrE,qEAAqE;YACrE,sEAAsE;YACtE,gEAAgE;YAChE,mEAAmE;YACnE,2CAA2C;YAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,EAAE,GAAG,CAAC,CAAC,WAAqB,CAAA;gBAClC,MAAM,GAAG,GAAG,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;gBAC9C,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAQ;gBAClC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACpB,GAAG,CAAC,SAAS,IAAI,CAAC,CAAA;gBAClB,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACjC,MAAM,wBAAwB,CAAC;wBAC7B,OAAO,EAAE,2CAA2C,GAAG,CAAC,QAAQ,GAAG;wBACnE,OAAO,EAAE;4BACP,SAAS,EAAE,GAAG,CAAC,SAAS;4BACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,kBAAkB;4BAClB,gBAAgB,EAAE,EAAE;yBACrB;qBACF,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,SAAS,EAAE,CAAC;oBACd,gEAAgE;oBAChE,iEAAiE;oBACjE,8DAA8D;oBAC9D,4DAA4D;oBAC5D,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAC1B,MAAM,sBAAsB,CAAC;4BAC3B,MAAM,EAAE,SAAS,CAAC,MAAM;4BACxB,cAAc,EAAE,SAAS,CAAC,IAAI;4BAC9B,SAAS,EAAE,CAAC,CAAC,CAAC;4BACd,QAAQ,EAAE,IAAI,CAAC,gBAAgB;4BAC/B,WAAW,EAAE,GAAG;yBACjB,CAAC,CAAA;oBACJ,CAAC;oBACD,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAA;gBAC3E,CAAC;gBAED,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAQ;gBAElD,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;gBACrD,IAAI,aAAa,KAAK,SAAS;oBAAE,SAAQ;gBAEzC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACtB,SAAS,CAAC,IAAI,CAAC;oBACb,GAAG,EAAE,CAAC;oBACN,SAAS,EAAE,SAAS,CAAC,MAAM;oBAC3B,QAAQ,EAAE,aAAa;iBACxB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,GAAG,SAAS,CAAA;QACnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAK;IACjC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,SAAS,UAAU,CAAC,YAAoB,EAAE,UAAkB;IAC1D,OAAO,GAAG,YAAY,IAAI,UAAU,EAAE,CAAA;AACxC,CAAC;AAKD;;;;;;;;;;;;;;;GAeG;AACH,KAAK,UAAU,oBAAoB,CACjC,EAAc,EACd,WAAmC,EACnC,EAAU,EACV,KAAyB;IAEzB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,CAAA;IACnC,CAAC;IAED,mDAAmD;IACnD,IAAI,GAAG,GACL,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7C,gBAAgB;QAChB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IAExC,iBAAiB;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;YAC9D,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;YAC7D,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,CAAA;IAC1B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,iCAAiC,CAAC,MAOhD;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,MAAM,CAAA;IAC5F,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,IAAI,gBAAgB;QAAE,OAAO,SAAS,CAAA;IAEvE,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC;QACtC,UAAU,EAAE,SAAS;QACrB,cAAc;QACd,WAAW;KACZ,CAAC,CAAA;IACF,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,SAAS,CAAA;IAEvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE;QACpD,WAAW;QACX,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAClC,oEAAoE;YACpE,oEAAoE;YACpE,gEAAgE;YAChE,kEAAkE;YAClE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAExC,CAAA;YACb,IAAI,KAAK,EAAE,EAAE;gBAAE,OAAO,KAAK,CAAC,EAAE,CAAA;YAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;YAClE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,CAAA;QACtB,CAAC;KACF,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;AAC/D,CAAC;AAsBD;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC5B,MAA2B,EAC3B,SAAmB,EACnB,QAAsB,EACtB,GAAsB;IAEtB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,QAAQ,IAAI,IAAI;YAAE,SAAQ;QAE9B,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAC/C,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAQ;YAC/B,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;gBAAE,SAAQ;YAC/C,mEAAmE;YACnE,qEAAqE;YACrE,iCAAiC;YACjC,IAAI,WAAW,IAAK,QAAgC;gBAAE,SAAQ;YAC9D,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,QAAQ;gBACf,GAAG;aACJ,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7D,qBAAqB,CAAC,QAA+B,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YACnF,CAAC;YACD,SAAQ;QACV,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC7D,qBAAqB,CAAC,IAA2B,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;oBAC/E,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAQ;QACV,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;oBAC5B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC7D,4EAA4E;wBAC5E,MAAM,SAAS,GAAI,IAA4B,CAAC,KAAK,CAAA;wBACrD,IAAI,OAAO,SAAS,KAAK,QAAQ;4BAAE,SAAQ;wBAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAA;wBAC/D,IAAI,CAAC,KAAK;4BAAE,SAAQ;wBACpB,qBAAqB,CAAC,IAA2B,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB,EAAE,QAAsB;IAChE,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,GAAG,CAAA;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;IAChC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAU;IACxC,OAAO,CACL,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,OAAQ,CAAS,CAAC,gBAAgB,KAAK,QAAQ;QAC/C,OAAQ,CAAS,CAAC,kBAAkB,KAAK,QAAQ,CAClD,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CACvB,MAAyB,EACzB,SAA2C;IAE3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG;YAAE,OAAO,SAAS,CAAA;QACtC,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;YAAE,SAAQ;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,IAAI,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAChD,IAAI,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,GAAyB;IACrD,IAAI,GAAG,CAAC,UAAU;QAAE,OAAO,GAAG,CAAC,UAAU,CAAA;IACzC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IAC3D,OAAO,SAAS,EAAE,IAAI,CAAA;AACxB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,mBAAmB,CAC1B,MAAyB,EACzB,gBAAwB;IAExB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,MAAM,GAAgB,EAAE,CAAA;IAC9B,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,KAAK,gBAAgB;YAAE,SAAQ;QAC3D,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAClB,OAAO,GAAG,IAAI,CAAA;YACd,MAAK;QACP,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBACb,SAAS,GAAG,IAAI,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,OAAO,GAAG,CAAA;IACvB,IAAI,OAAO;QAAE,OAAO,IAAI,CAAA;IACxB,IAAI,SAAS;QAAE,OAAO,MAAM,CAAA;IAC5B,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,qBAAqB;IACrB,eAAe;IACf,gBAAgB;IAChB,mBAAmB;IACnB,UAAU;CACX,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=populate.test.node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populate.test.node.d.ts","sourceRoot":"","sources":["../../src/services/populate.test.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|