@x12i/catalox 3.5.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -1
- package/dist/src/adapters/api/api-adapter.d.ts.map +1 -1
- package/dist/src/adapters/api/api-adapter.js +1 -0
- package/dist/src/adapters/api/api-adapter.js.map +1 -1
- package/dist/src/adapters/mongo/mongo-adapter.d.ts.map +1 -1
- package/dist/src/adapters/mongo/mongo-adapter.js +1 -0
- package/dist/src/adapters/mongo/mongo-adapter.js.map +1 -1
- package/dist/src/catalox/catalog-discovery.d.ts.map +1 -1
- package/dist/src/catalox/catalog-discovery.js +8 -6
- package/dist/src/catalox/catalog-discovery.js.map +1 -1
- package/dist/src/catalox/catalog-lifecycle.d.ts.map +1 -1
- package/dist/src/catalox/catalog-lifecycle.js +26 -19
- package/dist/src/catalox/catalog-lifecycle.js.map +1 -1
- package/dist/src/catalox/catalox-bound.d.ts +42 -0
- package/dist/src/catalox/catalox-bound.d.ts.map +1 -1
- package/dist/src/catalox/catalox-bound.js +15 -0
- package/dist/src/catalox/catalox-bound.js.map +1 -1
- package/dist/src/catalox/catalox.d.ts +84 -1
- package/dist/src/catalox/catalox.d.ts.map +1 -1
- package/dist/src/catalox/catalox.js +318 -58
- package/dist/src/catalox/catalox.js.map +1 -1
- package/dist/src/catalox/create-catalox.d.ts +4 -0
- package/dist/src/catalox/create-catalox.d.ts.map +1 -1
- package/dist/src/catalox/create-catalox.js +15 -0
- package/dist/src/catalox/create-catalox.js.map +1 -1
- package/dist/src/catalox/native-catalog-merge.d.ts.map +1 -1
- package/dist/src/catalox/native-catalog-merge.js +12 -11
- package/dist/src/catalox/native-catalog-merge.js.map +1 -1
- package/dist/src/contracts/agents.d.ts +19 -0
- package/dist/src/contracts/agents.d.ts.map +1 -0
- package/dist/src/contracts/agents.js +2 -0
- package/dist/src/contracts/agents.js.map +1 -0
- package/dist/src/contracts/catalog-types.d.ts +19 -0
- package/dist/src/contracts/catalog-types.d.ts.map +1 -0
- package/dist/src/contracts/catalog-types.js +2 -0
- package/dist/src/contracts/catalog-types.js.map +1 -0
- package/dist/src/contracts/catalogs.d.ts +26 -6
- package/dist/src/contracts/catalogs.d.ts.map +1 -1
- package/dist/src/contracts/catalogs.js.map +1 -1
- package/dist/src/contracts/descriptors.d.ts +5 -0
- package/dist/src/contracts/descriptors.d.ts.map +1 -1
- package/dist/src/contracts/design-objects.d.ts +38 -0
- package/dist/src/contracts/design-objects.d.ts.map +1 -0
- package/dist/src/contracts/design-objects.js +2 -0
- package/dist/src/contracts/design-objects.js.map +1 -0
- package/dist/src/contracts/discovery.d.ts +7 -8
- package/dist/src/contracts/discovery.d.ts.map +1 -1
- package/dist/src/contracts/domains.d.ts +19 -0
- package/dist/src/contracts/domains.d.ts.map +1 -0
- package/dist/src/contracts/domains.js +2 -0
- package/dist/src/contracts/domains.js.map +1 -0
- package/dist/src/contracts/ids.d.ts +2 -0
- package/dist/src/contracts/ids.d.ts.map +1 -1
- package/dist/src/contracts/index.d.ts +8 -2
- package/dist/src/contracts/index.d.ts.map +1 -1
- package/dist/src/contracts/index.js +1 -0
- package/dist/src/contracts/index.js.map +1 -1
- package/dist/src/contracts/inputs.d.ts +1 -0
- package/dist/src/contracts/inputs.d.ts.map +1 -1
- package/dist/src/contracts/items.d.ts +9 -7
- package/dist/src/contracts/items.d.ts.map +1 -1
- package/dist/src/contracts/presentation-binding.d.ts +116 -0
- package/dist/src/contracts/presentation-binding.d.ts.map +1 -0
- package/dist/src/contracts/presentation-binding.js +215 -0
- package/dist/src/contracts/presentation-binding.js.map +1 -0
- package/dist/src/contracts/presentation.d.ts +41 -0
- package/dist/src/contracts/presentation.d.ts.map +1 -1
- package/dist/src/firebase/agent-store.d.ts +18 -0
- package/dist/src/firebase/agent-store.d.ts.map +1 -0
- package/dist/src/firebase/agent-store.js +47 -0
- package/dist/src/firebase/agent-store.js.map +1 -0
- package/dist/src/firebase/catalog-type-store.d.ts +22 -0
- package/dist/src/firebase/catalog-type-store.d.ts.map +1 -0
- package/dist/src/firebase/catalog-type-store.js +51 -0
- package/dist/src/firebase/catalog-type-store.js.map +1 -0
- package/dist/src/firebase/definition-store.d.ts +4 -18
- package/dist/src/firebase/definition-store.d.ts.map +1 -1
- package/dist/src/firebase/definition-store.js.map +1 -1
- package/dist/src/firebase/design-object-store.d.ts +15 -0
- package/dist/src/firebase/design-object-store.d.ts.map +1 -0
- package/dist/src/firebase/design-object-store.js +51 -0
- package/dist/src/firebase/design-object-store.js.map +1 -0
- package/dist/src/firebase/domain-store.d.ts +18 -0
- package/dist/src/firebase/domain-store.d.ts.map +1 -0
- package/dist/src/firebase/domain-store.js +47 -0
- package/dist/src/firebase/domain-store.js.map +1 -0
- package/dist/src/firebase/index.d.ts +2 -0
- package/dist/src/firebase/index.d.ts.map +1 -1
- package/dist/src/firebase/index.js +2 -0
- package/dist/src/firebase/index.js.map +1 -1
- package/dist/src/firebase/presentation-profile-store.d.ts +18 -0
- package/dist/src/firebase/presentation-profile-store.d.ts.map +1 -0
- package/dist/src/firebase/presentation-profile-store.js +44 -0
- package/dist/src/firebase/presentation-profile-store.js.map +1 -0
- package/dist/src/migrations/backfill-catalog-model.d.ts +29 -0
- package/dist/src/migrations/backfill-catalog-model.d.ts.map +1 -0
- package/dist/src/migrations/backfill-catalog-model.js +124 -0
- package/dist/src/migrations/backfill-catalog-model.js.map +1 -0
- package/dist/src/migrations/migrate-native-catalog-layout.js +4 -4
- package/dist/src/migrations/migrate-native-catalog-layout.js.map +1 -1
- package/dist/src/validation/index.d.ts +2 -2
- package/dist/src/validation/index.d.ts.map +1 -1
- package/dist/src/validation/index.js +2 -2
- package/dist/src/validation/index.js.map +1 -1
- package/dist/src/validation/ui-spec-schema.d.ts +5 -0
- package/dist/src/validation/ui-spec-schema.d.ts.map +1 -1
- package/dist/src/validation/ui-spec-schema.js +114 -0
- package/dist/src/validation/ui-spec-schema.js.map +1 -1
- package/dist/src/validation/ui-spec-validate.d.ts +3 -0
- package/dist/src/validation/ui-spec-validate.d.ts.map +1 -1
- package/dist/src/validation/ui-spec-validate.js +13 -1
- package/dist/src/validation/ui-spec-validate.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { CatalogDescriptor } from "./descriptors.js";
|
|
2
|
+
import type { CatalogPresentationSpec } from "./presentation.js";
|
|
3
|
+
import type { CatalogCustomRenderer, CustomRendererEntry } from "./render-map.js";
|
|
4
|
+
import type { CatalogDesignObjectRecord, CatalogDesignRef, CatalogDesignScope } from "./design-objects.js";
|
|
5
|
+
import type { CatalogRendererMode, CatalogRendererRole, CatalogRendererSnippetRecord } from "./renderer-snippets.js";
|
|
6
|
+
export type CatalogPresentationStrategy = "native-auto" | "template" | "custom-renderer";
|
|
7
|
+
export type CatalogPresentationScope = {
|
|
8
|
+
catalogId?: string;
|
|
9
|
+
catalogType?: string;
|
|
10
|
+
};
|
|
11
|
+
export type CatalogPresentationProfileRecord = {
|
|
12
|
+
profileId: string;
|
|
13
|
+
scope: CatalogPresentationScope;
|
|
14
|
+
/**
|
|
15
|
+
* Declarative presentation hints. If present, can override/augment descriptor presentationSpec.
|
|
16
|
+
*/
|
|
17
|
+
presentationSpec?: CatalogPresentationSpec;
|
|
18
|
+
/**
|
|
19
|
+
* Optional template assignment defaults (host-defined). Stored on the profile so multiple catalogs
|
|
20
|
+
* can share a template selection without copying it into every descriptor.
|
|
21
|
+
*/
|
|
22
|
+
templates?: CatalogPresentationSpec["templates"];
|
|
23
|
+
/**
|
|
24
|
+
* Optional custom renderer defaults shared across catalogs.
|
|
25
|
+
*/
|
|
26
|
+
customRenderer?: CatalogCustomRenderer;
|
|
27
|
+
/**
|
|
28
|
+
* Optional design refs (tokens/branding/content) that apply under this scope.
|
|
29
|
+
*/
|
|
30
|
+
designRefs?: CatalogDesignRef[];
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
createdAt?: string;
|
|
33
|
+
updatedAt?: string;
|
|
34
|
+
};
|
|
35
|
+
export type ResolveCatalogPresentationBindingInput = {
|
|
36
|
+
descriptor: CatalogDescriptor | null;
|
|
37
|
+
/**
|
|
38
|
+
* Optional presentation profiles; caller can provide a catalog-scoped profile and/or type-scoped profile.
|
|
39
|
+
*/
|
|
40
|
+
profiles?: CatalogPresentationProfileRecord[];
|
|
41
|
+
role: Exclude<CatalogRendererRole, "core">;
|
|
42
|
+
mode?: CatalogRendererMode;
|
|
43
|
+
/**
|
|
44
|
+
* Current list-like display context. Used when selecting templates for list/grid/cards.
|
|
45
|
+
*/
|
|
46
|
+
displayContext?: "grid" | "list" | "cards" | "form";
|
|
47
|
+
/**
|
|
48
|
+
* Optional snippet record resolved by the caller (Catalox can fetch it when wired).
|
|
49
|
+
* This is metadata only; evaluation is a host concern.
|
|
50
|
+
*/
|
|
51
|
+
snippet?: CatalogRendererSnippetRecord | null;
|
|
52
|
+
/**
|
|
53
|
+
* Optional design objects available to match/merge.
|
|
54
|
+
*/
|
|
55
|
+
designObjects?: CatalogDesignObjectRecord[];
|
|
56
|
+
/**
|
|
57
|
+
* Runtime scope used to select design objects, if requested.
|
|
58
|
+
*/
|
|
59
|
+
designScope?: CatalogDesignScope;
|
|
60
|
+
};
|
|
61
|
+
export type ResolvedCatalogPresentationBinding = {
|
|
62
|
+
strategy: CatalogPresentationStrategy;
|
|
63
|
+
/**
|
|
64
|
+
* The effective presentation spec to use for native automatic or as a supplement to templates/custom renderers.
|
|
65
|
+
*/
|
|
66
|
+
presentationSpec?: CatalogPresentationSpec;
|
|
67
|
+
/**
|
|
68
|
+
* The resolved template assignment, when strategy is "template".
|
|
69
|
+
*/
|
|
70
|
+
template?: {
|
|
71
|
+
templateId: string;
|
|
72
|
+
props?: Record<string, unknown>;
|
|
73
|
+
designRefs?: CatalogDesignRef[];
|
|
74
|
+
metadata?: Record<string, unknown>;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* The resolved custom renderer entry, when strategy is "custom-renderer".
|
|
78
|
+
*/
|
|
79
|
+
customRenderer?: {
|
|
80
|
+
entry: CustomRendererEntry;
|
|
81
|
+
snippet?: CatalogRendererSnippetRecord | null;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Merged opaque design payload and provenance.
|
|
85
|
+
*/
|
|
86
|
+
design?: {
|
|
87
|
+
merged: Record<string, unknown>;
|
|
88
|
+
contributingDesignIds: string[];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Helpful debug info for hosts (non-authoritative).
|
|
92
|
+
*/
|
|
93
|
+
debug?: {
|
|
94
|
+
fromCatalogId?: string;
|
|
95
|
+
fromCatalogType?: string;
|
|
96
|
+
usedProfileIds?: string[];
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Lightweight helper to merge JSON objects in order (later wins).
|
|
101
|
+
* This is intentionally shallow; hosts can implement deep merge if they want.
|
|
102
|
+
*/
|
|
103
|
+
export declare function mergeDesignObjects(objects: CatalogDesignObjectRecord[]): {
|
|
104
|
+
merged: Record<string, unknown>;
|
|
105
|
+
contributingDesignIds: string[];
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Resolve a catalog presentation binding for a given role/mode without rendering anything.
|
|
109
|
+
*
|
|
110
|
+
* Precedence:
|
|
111
|
+
* - catalog-scoped profiles override catalog-type-scoped profiles
|
|
112
|
+
* - `customRenderer` wins over templates, templates win over native-auto
|
|
113
|
+
* - design refs are applied (explicit refs first), then optionally scope-matched design objects
|
|
114
|
+
*/
|
|
115
|
+
export declare function resolveCatalogPresentationBinding(input: ResolveCatalogPresentationBindingInput): ResolvedCatalogPresentationBinding;
|
|
116
|
+
//# sourceMappingURL=presentation-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-binding.d.ts","sourceRoot":"","sources":["../../../src/contracts/presentation-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { resolveCustomRendererEntry } from "./custom-renderer-resolve.js";
|
|
2
|
+
function isNonEmptyString(v) {
|
|
3
|
+
return typeof v === "string" && v.trim().length > 0;
|
|
4
|
+
}
|
|
5
|
+
function scopeMatches(target, candidate) {
|
|
6
|
+
if (!target)
|
|
7
|
+
return true;
|
|
8
|
+
if (!candidate)
|
|
9
|
+
return false;
|
|
10
|
+
// Every axis provided in target must match candidate.
|
|
11
|
+
if (target.storeId != null && String(candidate.storeId ?? "") !== String(target.storeId))
|
|
12
|
+
return false;
|
|
13
|
+
if (target.appId != null && String(candidate.appId ?? "") !== String(target.appId))
|
|
14
|
+
return false;
|
|
15
|
+
if (target.accountId != null && String(candidate.accountId ?? "") !== String(target.accountId))
|
|
16
|
+
return false;
|
|
17
|
+
if (target.agentId != null && String(candidate.agentId ?? "") !== String(target.agentId))
|
|
18
|
+
return false;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
function scopeSpecificity(s) {
|
|
22
|
+
if (!s)
|
|
23
|
+
return 0;
|
|
24
|
+
return Number(Boolean(s.storeId)) + Number(Boolean(s.appId)) + Number(Boolean(s.accountId)) + Number(Boolean(s.agentId));
|
|
25
|
+
}
|
|
26
|
+
function dedupeByDesignId(objs) {
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const o of objs) {
|
|
30
|
+
const id = String(o?.designId ?? "");
|
|
31
|
+
if (!id)
|
|
32
|
+
continue;
|
|
33
|
+
if (seen.has(id))
|
|
34
|
+
continue;
|
|
35
|
+
seen.add(id);
|
|
36
|
+
out.push(o);
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
function pickTemplateAssignment(params) {
|
|
41
|
+
const templates = params.templates ?? [];
|
|
42
|
+
if (!templates.length)
|
|
43
|
+
return null;
|
|
44
|
+
// Merge semantics: core -> role -> role+mode, optionally filtering by displayContext when provided.
|
|
45
|
+
const candidates = templates.filter((t) => {
|
|
46
|
+
if (!t || typeof t !== "object")
|
|
47
|
+
return false;
|
|
48
|
+
if (!isNonEmptyString(t.templateId))
|
|
49
|
+
return false;
|
|
50
|
+
if (params.displayContext && t.displayContext && String(t.displayContext) !== String(params.displayContext))
|
|
51
|
+
return false;
|
|
52
|
+
return true;
|
|
53
|
+
});
|
|
54
|
+
const core = candidates.find((t) => t.role === "core" && t.mode == null);
|
|
55
|
+
const roleOnly = candidates.find((t) => t.role === params.role && t.mode == null);
|
|
56
|
+
const roleMode = params.mode ? candidates.find((t) => t.role === params.role && t.mode === params.mode) : undefined;
|
|
57
|
+
if (!core && !roleOnly && !roleMode)
|
|
58
|
+
return null;
|
|
59
|
+
const merge = (base, override) => {
|
|
60
|
+
const out = { ...base, ...override };
|
|
61
|
+
// Merge props/designRefs shallowly (later wins but retains previous keys).
|
|
62
|
+
if (base?.props || override?.props)
|
|
63
|
+
out.props = { ...(base?.props ?? {}), ...(override?.props ?? {}) };
|
|
64
|
+
if (base?.designRefs || override?.designRefs)
|
|
65
|
+
out.designRefs = [...(base?.designRefs ?? []), ...(override?.designRefs ?? [])];
|
|
66
|
+
return out;
|
|
67
|
+
};
|
|
68
|
+
let out = { templateId: "", props: undefined, designRefs: undefined, metadata: undefined };
|
|
69
|
+
if (core)
|
|
70
|
+
out = merge(out, core);
|
|
71
|
+
if (roleOnly)
|
|
72
|
+
out = merge(out, roleOnly);
|
|
73
|
+
if (roleMode)
|
|
74
|
+
out = merge(out, roleMode);
|
|
75
|
+
if (!isNonEmptyString(out.templateId))
|
|
76
|
+
return null;
|
|
77
|
+
return { templateId: out.templateId, props: out.props, designRefs: out.designRefs, metadata: out.metadata };
|
|
78
|
+
}
|
|
79
|
+
function deriveNativeAutoPresentationSpec(descriptor) {
|
|
80
|
+
// v1: use explicit presentationSpec when present; derivation can be evolved later.
|
|
81
|
+
return descriptor?.presentationSpec;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Lightweight helper to merge JSON objects in order (later wins).
|
|
85
|
+
* This is intentionally shallow; hosts can implement deep merge if they want.
|
|
86
|
+
*/
|
|
87
|
+
export function mergeDesignObjects(objects) {
|
|
88
|
+
const merged = {};
|
|
89
|
+
const contributingDesignIds = [];
|
|
90
|
+
for (const o of objects) {
|
|
91
|
+
if (!o || typeof o !== "object")
|
|
92
|
+
continue;
|
|
93
|
+
if (!o.designId)
|
|
94
|
+
continue;
|
|
95
|
+
contributingDesignIds.push(String(o.designId));
|
|
96
|
+
Object.assign(merged, o.design ?? {});
|
|
97
|
+
}
|
|
98
|
+
return { merged, contributingDesignIds };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Resolve a catalog presentation binding for a given role/mode without rendering anything.
|
|
102
|
+
*
|
|
103
|
+
* Precedence:
|
|
104
|
+
* - catalog-scoped profiles override catalog-type-scoped profiles
|
|
105
|
+
* - `customRenderer` wins over templates, templates win over native-auto
|
|
106
|
+
* - design refs are applied (explicit refs first), then optionally scope-matched design objects
|
|
107
|
+
*/
|
|
108
|
+
export function resolveCatalogPresentationBinding(input) {
|
|
109
|
+
const descriptor = input.descriptor ?? null;
|
|
110
|
+
const catalogId = descriptor?.catalogId ? String(descriptor.catalogId) : undefined;
|
|
111
|
+
const catalogType = descriptor?.catalogType ? String(descriptor.catalogType) : undefined;
|
|
112
|
+
const profiles = input.profiles ?? [];
|
|
113
|
+
const catalogProfiles = catalogId ? profiles.filter((p) => p?.scope?.catalogId && String(p.scope.catalogId) === catalogId) : [];
|
|
114
|
+
const typeProfiles = catalogType ? profiles.filter((p) => p?.scope?.catalogType && String(p.scope.catalogType) === catalogType) : [];
|
|
115
|
+
const usedProfiles = [...catalogProfiles, ...typeProfiles];
|
|
116
|
+
const mergedCustomRenderer = (() => {
|
|
117
|
+
const fromProfiles = usedProfiles.map((p) => p.customRenderer).filter(Boolean);
|
|
118
|
+
const fromDescriptor = descriptor?.customRenderer;
|
|
119
|
+
const renderers = [];
|
|
120
|
+
for (const cr of [...fromProfiles, ...(fromDescriptor ? [fromDescriptor] : [])]) {
|
|
121
|
+
for (const e of cr.renderers ?? [])
|
|
122
|
+
renderers.push(e);
|
|
123
|
+
}
|
|
124
|
+
return renderers.length ? { renderers } : null;
|
|
125
|
+
})();
|
|
126
|
+
const mergedTemplates = (() => {
|
|
127
|
+
const out = [];
|
|
128
|
+
for (const p of usedProfiles)
|
|
129
|
+
for (const t of (p.templates ?? []))
|
|
130
|
+
out.push(t);
|
|
131
|
+
const dTemplates = (descriptor?.presentationSpec?.templates ?? []);
|
|
132
|
+
for (const t of dTemplates)
|
|
133
|
+
out.push(t);
|
|
134
|
+
return out.length ? out : undefined;
|
|
135
|
+
})();
|
|
136
|
+
const presentationSpec = (() => {
|
|
137
|
+
// Profile can override/augment; v1 chooses descriptor.spec if present else first profile.spec.
|
|
138
|
+
const d = descriptor?.presentationSpec;
|
|
139
|
+
if (d)
|
|
140
|
+
return d;
|
|
141
|
+
const p = usedProfiles.find((x) => x.presentationSpec)?.presentationSpec;
|
|
142
|
+
return p;
|
|
143
|
+
})();
|
|
144
|
+
const resolvedCustom = resolveCustomRendererEntry({
|
|
145
|
+
customRenderer: mergedCustomRenderer ?? undefined,
|
|
146
|
+
role: input.role,
|
|
147
|
+
...(input.mode ? { mode: input.mode } : {}),
|
|
148
|
+
});
|
|
149
|
+
const resolvedTemplate = !resolvedCustom
|
|
150
|
+
? pickTemplateAssignment({
|
|
151
|
+
templates: mergedTemplates,
|
|
152
|
+
role: input.role,
|
|
153
|
+
...(input.mode ? { mode: input.mode } : {}),
|
|
154
|
+
...(input.displayContext ? { displayContext: input.displayContext } : {}),
|
|
155
|
+
})
|
|
156
|
+
: null;
|
|
157
|
+
const strategy = resolvedCustom ? "custom-renderer" : resolvedTemplate ? "template" : "native-auto";
|
|
158
|
+
// Design resolution
|
|
159
|
+
const allDesignRefs = [
|
|
160
|
+
...(usedProfiles.flatMap((p) => p.designRefs ?? []) ?? []),
|
|
161
|
+
...(descriptor?.presentationSpec?.designRefs ?? []),
|
|
162
|
+
...(resolvedTemplate?.designRefs ?? []),
|
|
163
|
+
].filter(Boolean);
|
|
164
|
+
const availableDesigns = (input.designObjects ?? []).filter((d) => d && typeof d === "object" && d.design && typeof d.design === "object" && !Array.isArray(d.design));
|
|
165
|
+
const explicitlyPicked = dedupeByDesignId(allDesignRefs
|
|
166
|
+
.map((r) => {
|
|
167
|
+
if (!r?.designId)
|
|
168
|
+
return null;
|
|
169
|
+
const id = String(r.designId);
|
|
170
|
+
return availableDesigns.find((d) => String(d.designId) === id) ?? null;
|
|
171
|
+
})
|
|
172
|
+
.filter(Boolean));
|
|
173
|
+
const scopePicked = (() => {
|
|
174
|
+
if (!input.designScope)
|
|
175
|
+
return [];
|
|
176
|
+
// Match designs by runtime scope and sort by specificity (broad -> specific) so specific overrides last.
|
|
177
|
+
const matches = availableDesigns.filter((d) => scopeMatches(input.designScope, d.scope));
|
|
178
|
+
matches.sort((a, b) => scopeSpecificity(a.scope) - scopeSpecificity(b.scope));
|
|
179
|
+
return dedupeByDesignId(matches);
|
|
180
|
+
})();
|
|
181
|
+
const contributing = dedupeByDesignId([...explicitlyPicked, ...scopePicked]);
|
|
182
|
+
const design = contributing.length ? mergeDesignObjects(contributing) : undefined;
|
|
183
|
+
return {
|
|
184
|
+
strategy,
|
|
185
|
+
...(() => {
|
|
186
|
+
const spec = strategy === "native-auto" ? deriveNativeAutoPresentationSpec(descriptor) ?? presentationSpec : presentationSpec;
|
|
187
|
+
return spec != null ? { presentationSpec: spec } : {};
|
|
188
|
+
})(),
|
|
189
|
+
...(resolvedTemplate
|
|
190
|
+
? {
|
|
191
|
+
template: {
|
|
192
|
+
templateId: resolvedTemplate.templateId,
|
|
193
|
+
...(resolvedTemplate.props ? { props: resolvedTemplate.props } : {}),
|
|
194
|
+
...(resolvedTemplate.designRefs ? { designRefs: resolvedTemplate.designRefs } : {}),
|
|
195
|
+
...(resolvedTemplate.metadata ? { metadata: resolvedTemplate.metadata } : {}),
|
|
196
|
+
},
|
|
197
|
+
}
|
|
198
|
+
: {}),
|
|
199
|
+
...(resolvedCustom
|
|
200
|
+
? {
|
|
201
|
+
customRenderer: {
|
|
202
|
+
entry: resolvedCustom,
|
|
203
|
+
...(input.snippet !== undefined ? { snippet: input.snippet } : {}),
|
|
204
|
+
},
|
|
205
|
+
}
|
|
206
|
+
: {}),
|
|
207
|
+
...(design ? { design } : {}),
|
|
208
|
+
debug: {
|
|
209
|
+
...(catalogId ? { fromCatalogId: catalogId } : {}),
|
|
210
|
+
...(catalogType ? { fromCatalogType: catalogType } : {}),
|
|
211
|
+
...(usedProfiles.length ? { usedProfileIds: usedProfiles.map((p) => p.profileId) } : {}),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=presentation-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation-binding.js","sourceRoot":"","sources":["../../../src/contracts/presentation-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { FieldSource } from "./field-source.js";
|
|
2
|
+
import type { CatalogDesignRef } from "./design-objects.js";
|
|
3
|
+
import type { CatalogRendererMode, CatalogRendererRole } from "./renderer-snippets.js";
|
|
2
4
|
export type CatalogDisplayContext = "grid" | "list" | "cards" | "form";
|
|
3
5
|
export type CatalogUIMode = "view" | "edit";
|
|
4
6
|
export type CatalogPresentationDensity = "compact" | "default" | "comfortable";
|
|
@@ -144,6 +146,45 @@ export type CatalogPresentationSpec = {
|
|
|
144
146
|
showSearch?: boolean;
|
|
145
147
|
searchFields?: string[];
|
|
146
148
|
emptyState?: EmptyStateSpec;
|
|
149
|
+
/**
|
|
150
|
+
* Optional template assignments (host-defined). This is a declarative, non-code way
|
|
151
|
+
* to select presentation. Rendering is performed by the host presentation layer.
|
|
152
|
+
*/
|
|
153
|
+
templates?: CatalogPresentationTemplateAssignment[];
|
|
154
|
+
/**
|
|
155
|
+
* Optional design references to scoped design objects (tokens/branding/content).
|
|
156
|
+
* Payloads remain opaque to Catalox.
|
|
157
|
+
*/
|
|
158
|
+
designRefs?: CatalogDesignRef[];
|
|
159
|
+
metadata?: Record<string, unknown>;
|
|
160
|
+
};
|
|
161
|
+
export type CatalogPresentationTemplateAssignment = {
|
|
162
|
+
/**
|
|
163
|
+
* Matches the same renderer surface roles as custom renderers.
|
|
164
|
+
* Use "core" to express defaults that hosts may merge.
|
|
165
|
+
*/
|
|
166
|
+
role: CatalogRendererRole;
|
|
167
|
+
/**
|
|
168
|
+
* Optional mode variant. Only meaningful for list/grid/item roles.
|
|
169
|
+
*/
|
|
170
|
+
mode?: CatalogRendererMode;
|
|
171
|
+
/**
|
|
172
|
+
* Optional displayContext override used by list-like surfaces.
|
|
173
|
+
* If omitted, the host decides based on the active map context.
|
|
174
|
+
*/
|
|
175
|
+
displayContext?: Exclude<CatalogDisplayContext, "form">;
|
|
176
|
+
/**
|
|
177
|
+
* Host-owned template identifier (not an import path).
|
|
178
|
+
*/
|
|
179
|
+
templateId: string;
|
|
180
|
+
/**
|
|
181
|
+
* Static JSON props passed to the template by the host.
|
|
182
|
+
*/
|
|
183
|
+
props?: Record<string, unknown>;
|
|
184
|
+
/**
|
|
185
|
+
* Optional design refs specifically for this template assignment.
|
|
186
|
+
*/
|
|
187
|
+
designRefs?: CatalogDesignRef[];
|
|
147
188
|
metadata?: Record<string, unknown>;
|
|
148
189
|
};
|
|
149
190
|
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/contracts/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../../src/contracts/presentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AppId, StoreId } from "../contracts/ids.js";
|
|
2
|
+
import type { AgentRegistryRecord, AgentRegistryScope } from "../contracts/agents.js";
|
|
3
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
4
|
+
export declare class AgentStore {
|
|
5
|
+
private readonly store;
|
|
6
|
+
constructor(store: FirestoreStore);
|
|
7
|
+
private docRef;
|
|
8
|
+
get(scope: AgentRegistryScope): Promise<AgentRegistryRecord | null>;
|
|
9
|
+
upsert(scope: AgentRegistryScope, input: {
|
|
10
|
+
agents: string[];
|
|
11
|
+
metadata?: Record<string, unknown>;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
resolveForContext(input: {
|
|
14
|
+
storeId?: StoreId;
|
|
15
|
+
appId?: AppId;
|
|
16
|
+
}): Promise<AgentRegistryRecord | null>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=agent-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/agent-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtD,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAKnE,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAajH,iBAAiB,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;CAW1G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
2
|
+
function scopeDocId(scope) {
|
|
3
|
+
if (scope.kind === "global")
|
|
4
|
+
return "global";
|
|
5
|
+
if (scope.kind === "app")
|
|
6
|
+
return `app:${String(scope.appId)}`;
|
|
7
|
+
return `store:${String(scope.storeId)}`;
|
|
8
|
+
}
|
|
9
|
+
export class AgentStore {
|
|
10
|
+
store;
|
|
11
|
+
constructor(store) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
}
|
|
14
|
+
docRef(scope) {
|
|
15
|
+
return this.store.collection("agentRegistry").doc(scopeDocId(scope));
|
|
16
|
+
}
|
|
17
|
+
async get(scope) {
|
|
18
|
+
const snap = await this.docRef(scope).get();
|
|
19
|
+
return snap.exists ? snap.data() : null;
|
|
20
|
+
}
|
|
21
|
+
async upsert(scope, input) {
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
const existing = await this.get(scope);
|
|
24
|
+
const record = {
|
|
25
|
+
scope,
|
|
26
|
+
agents: input.agents,
|
|
27
|
+
...(input.metadata != null ? { metadata: input.metadata } : {}),
|
|
28
|
+
createdAt: existing?.createdAt ?? now,
|
|
29
|
+
updatedAt: now,
|
|
30
|
+
};
|
|
31
|
+
await this.docRef(scope).set(record, { merge: true });
|
|
32
|
+
}
|
|
33
|
+
async resolveForContext(input) {
|
|
34
|
+
if (input.storeId) {
|
|
35
|
+
const got = await this.get({ kind: "store", storeId: input.storeId });
|
|
36
|
+
if (got)
|
|
37
|
+
return got;
|
|
38
|
+
}
|
|
39
|
+
if (input.appId) {
|
|
40
|
+
const got = await this.get({ kind: "app", appId: input.appId });
|
|
41
|
+
if (got)
|
|
42
|
+
return got;
|
|
43
|
+
}
|
|
44
|
+
return this.get({ kind: "global" });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=agent-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-store.js","sourceRoot":"","sources":["../../../src/firebase/agent-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,SAAS,UAAU,CAAC,KAAyB;IAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9D,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAE9C,MAAM,CAAC,KAAyB;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAyB;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,EAA0B,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAyB,EAAE,KAA+D;QACrG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAwB;YAClC,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;SACf,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAA2C;QACjE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AppId, StoreId } from "../contracts/ids.js";
|
|
2
|
+
import type { CatalogTypeRegistryRecord, CatalogTypeScope } from "../contracts/catalog-types.js";
|
|
3
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
4
|
+
export declare class CatalogTypeStore {
|
|
5
|
+
private readonly store;
|
|
6
|
+
constructor(store: FirestoreStore);
|
|
7
|
+
private docRef;
|
|
8
|
+
get(scope: CatalogTypeScope): Promise<CatalogTypeRegistryRecord | null>;
|
|
9
|
+
upsert(scope: CatalogTypeScope, input: {
|
|
10
|
+
types: string[];
|
|
11
|
+
metadata?: Record<string, unknown>;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Best applicable list for a context: store → app → global.
|
|
15
|
+
* Returns null when no registry entry exists for any applicable scope.
|
|
16
|
+
*/
|
|
17
|
+
resolveForContext(input: {
|
|
18
|
+
storeId?: StoreId;
|
|
19
|
+
appId?: AppId;
|
|
20
|
+
}): Promise<CatalogTypeRegistryRecord | null>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=catalog-type-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-type-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/catalog-type-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQtD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAKvE,MAAM,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAapH;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;CAWhH"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { FirestoreStore } from "./firestore-store.js";
|
|
2
|
+
function scopeDocId(scope) {
|
|
3
|
+
if (scope.kind === "global")
|
|
4
|
+
return "global";
|
|
5
|
+
if (scope.kind === "app")
|
|
6
|
+
return `app:${String(scope.appId)}`;
|
|
7
|
+
return `store:${String(scope.storeId)}`;
|
|
8
|
+
}
|
|
9
|
+
export class CatalogTypeStore {
|
|
10
|
+
store;
|
|
11
|
+
constructor(store) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
}
|
|
14
|
+
docRef(scope) {
|
|
15
|
+
return this.store.collection("catalogTypeRegistry").doc(scopeDocId(scope));
|
|
16
|
+
}
|
|
17
|
+
async get(scope) {
|
|
18
|
+
const snap = await this.docRef(scope).get();
|
|
19
|
+
return snap.exists ? snap.data() : null;
|
|
20
|
+
}
|
|
21
|
+
async upsert(scope, input) {
|
|
22
|
+
const now = new Date().toISOString();
|
|
23
|
+
const existing = await this.get(scope);
|
|
24
|
+
const record = {
|
|
25
|
+
scope,
|
|
26
|
+
types: input.types,
|
|
27
|
+
...(input.metadata != null ? { metadata: input.metadata } : {}),
|
|
28
|
+
createdAt: existing?.createdAt ?? now,
|
|
29
|
+
updatedAt: now,
|
|
30
|
+
};
|
|
31
|
+
await this.docRef(scope).set(record, { merge: true });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Best applicable list for a context: store → app → global.
|
|
35
|
+
* Returns null when no registry entry exists for any applicable scope.
|
|
36
|
+
*/
|
|
37
|
+
async resolveForContext(input) {
|
|
38
|
+
if (input.storeId) {
|
|
39
|
+
const got = await this.get({ kind: "store", storeId: input.storeId });
|
|
40
|
+
if (got)
|
|
41
|
+
return got;
|
|
42
|
+
}
|
|
43
|
+
if (input.appId) {
|
|
44
|
+
const got = await this.get({ kind: "app", appId: input.appId });
|
|
45
|
+
if (got)
|
|
46
|
+
return got;
|
|
47
|
+
}
|
|
48
|
+
return this.get({ kind: "global" });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=catalog-type-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-type-store.js","sourceRoot":"","sources":["../../../src/firebase/catalog-type-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,SAAS,UAAU,CAAC,KAAuB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9D,OAAO,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAE9C,MAAM,CAAC,KAAuB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAuB;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,EAAgC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAuB,EAAE,KAA8D;QAClG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAA8B;YACxC,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;SACf,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAA2C;QACjE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
import type { CatalogId } from "../contracts/ids.js";
|
|
2
|
+
import type { CatalogItemsConfig, CatalogSourceMode } from "../contracts/catalogs.js";
|
|
2
3
|
import { FirestoreStore } from "./firestore-store.js";
|
|
3
|
-
export type
|
|
4
|
+
export type CatalogDefinitionRecord = {
|
|
4
5
|
catalogId: CatalogId;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
provider: "firestore";
|
|
8
|
-
collectionPath: string;
|
|
9
|
-
};
|
|
10
|
-
itemSchema?: Record<string, unknown>;
|
|
11
|
-
metadata?: Record<string, unknown>;
|
|
12
|
-
createdAt: string;
|
|
13
|
-
updatedAt: string;
|
|
14
|
-
};
|
|
15
|
-
export type MappedCatalogDefinitionRecord = {
|
|
16
|
-
catalogId: CatalogId;
|
|
17
|
-
type: "mapped";
|
|
18
|
-
adapterType: "mongo" | "api";
|
|
19
|
-
adapterId: string;
|
|
20
|
-
mappingId: string;
|
|
6
|
+
sourceMode: CatalogSourceMode;
|
|
7
|
+
catalogItems: CatalogItemsConfig;
|
|
21
8
|
sync?: {
|
|
22
9
|
mode: "read-through" | "snapshot";
|
|
23
10
|
lastSyncedAt?: string;
|
|
@@ -28,7 +15,6 @@ export type MappedCatalogDefinitionRecord = {
|
|
|
28
15
|
createdAt: string;
|
|
29
16
|
updatedAt: string;
|
|
30
17
|
};
|
|
31
|
-
export type CatalogDefinitionRecord = NativeCatalogDefinitionRecord | MappedCatalogDefinitionRecord;
|
|
32
18
|
export declare class DefinitionStore {
|
|
33
19
|
private readonly store;
|
|
34
20
|
constructor(store: FirestoreStore);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definition-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/definition-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"definition-store.d.ts","sourceRoot":"","sources":["../../../src/firebase/definition-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,YAAY,EAAE,kBAAkB,CAAC;IACjC,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,cAAc,GAAG,UAAU,CAAC;QAClC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;QAChE,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAElD,OAAO,CAAC,MAAM;IAIR,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAKlE,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;CAG7D"}
|