@x12i/catalox 4.2.1 → 5.1.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 (56) hide show
  1. package/README.md +61 -0
  2. package/dist/src/catalox/catalox.d.ts +7 -5
  3. package/dist/src/catalox/catalox.d.ts.map +1 -1
  4. package/dist/src/catalox/catalox.js +151 -155
  5. package/dist/src/catalox/catalox.js.map +1 -1
  6. package/dist/src/catalox/item-scope-match.d.ts +39 -0
  7. package/dist/src/catalox/item-scope-match.d.ts.map +1 -0
  8. package/dist/src/catalox/item-scope-match.js +114 -0
  9. package/dist/src/catalox/item-scope-match.js.map +1 -0
  10. package/dist/src/catalox/item-scope.d.ts +36 -0
  11. package/dist/src/catalox/item-scope.d.ts.map +1 -0
  12. package/dist/src/catalox/item-scope.js +137 -0
  13. package/dist/src/catalox/item-scope.js.map +1 -0
  14. package/dist/src/catalox/native-catalog-merge.d.ts +7 -9
  15. package/dist/src/catalox/native-catalog-merge.d.ts.map +1 -1
  16. package/dist/src/catalox/native-catalog-merge.js +23 -106
  17. package/dist/src/catalox/native-catalog-merge.js.map +1 -1
  18. package/dist/src/catalox/scope-legacy-convert.d.ts +19 -0
  19. package/dist/src/catalox/scope-legacy-convert.d.ts.map +1 -0
  20. package/dist/src/catalox/scope-legacy-convert.js +177 -0
  21. package/dist/src/catalox/scope-legacy-convert.js.map +1 -0
  22. package/dist/src/catalox/smart-properties.d.ts +33 -0
  23. package/dist/src/catalox/smart-properties.d.ts.map +1 -0
  24. package/dist/src/catalox/smart-properties.js +245 -0
  25. package/dist/src/catalox/smart-properties.js.map +1 -0
  26. package/dist/src/cli/index.js +96 -3
  27. package/dist/src/cli/index.js.map +1 -1
  28. package/dist/src/contracts/catalogs.d.ts +21 -25
  29. package/dist/src/contracts/catalogs.d.ts.map +1 -1
  30. package/dist/src/contracts/catalogs.js.map +1 -1
  31. package/dist/src/contracts/context.d.ts +9 -4
  32. package/dist/src/contracts/context.d.ts.map +1 -1
  33. package/dist/src/contracts/descriptors.d.ts +14 -0
  34. package/dist/src/contracts/descriptors.d.ts.map +1 -1
  35. package/dist/src/contracts/index.d.ts +2 -2
  36. package/dist/src/contracts/index.d.ts.map +1 -1
  37. package/dist/src/contracts/items.d.ts +8 -51
  38. package/dist/src/contracts/items.d.ts.map +1 -1
  39. package/dist/src/firebase/native-item-store.d.ts +2 -1
  40. package/dist/src/firebase/native-item-store.d.ts.map +1 -1
  41. package/dist/src/firebase/native-item-store.js +2 -5
  42. package/dist/src/firebase/native-item-store.js.map +1 -1
  43. package/dist/src/migrations/index.d.ts +1 -0
  44. package/dist/src/migrations/index.d.ts.map +1 -1
  45. package/dist/src/migrations/index.js +1 -0
  46. package/dist/src/migrations/index.js.map +1 -1
  47. package/dist/src/migrations/migrate-native-item-scope.d.ts +36 -0
  48. package/dist/src/migrations/migrate-native-item-scope.d.ts.map +1 -0
  49. package/dist/src/migrations/migrate-native-item-scope.js +204 -0
  50. package/dist/src/migrations/migrate-native-item-scope.js.map +1 -0
  51. package/docs/cli-items.md +1 -1
  52. package/package.json +1 -1
  53. package/dist/src/catalox/native-scope.d.ts +0 -29
  54. package/dist/src/catalox/native-scope.d.ts.map +0 -1
  55. package/dist/src/catalox/native-scope.js +0 -324
  56. package/dist/src/catalox/native-scope.js.map +0 -1
@@ -0,0 +1,177 @@
1
+ const CX = "cx~";
2
+ const V2 = "v2";
3
+ function b64uDec(s) {
4
+ return Buffer.from(s, "base64url").toString("utf8");
5
+ }
6
+ /** Decode legacy `cx~` storage document ids (migration only). */
7
+ export function decodeNativeItemStorageDocId(docId) {
8
+ if (!docId.startsWith(CX)) {
9
+ return { logicalItemId: docId, legacyScope: { kind: "global" } };
10
+ }
11
+ const rest = docId.slice(CX.length);
12
+ const parts = rest.split("~");
13
+ if (parts[0] === V2) {
14
+ const last = parts[parts.length - 1];
15
+ if (!last)
16
+ return null;
17
+ const logicalItemId = b64uDec(last);
18
+ const scoped = { kind: "scoped", tenant: {}, agent: {} };
19
+ for (let i = 1; i < parts.length - 1; i += 2) {
20
+ const k = parts[i];
21
+ const v = parts[i + 1];
22
+ if (!k || !v)
23
+ break;
24
+ const dec = b64uDec(v);
25
+ const t = scoped.tenant;
26
+ const a = scoped.agent;
27
+ if (k === "ac")
28
+ t.accountId = dec;
29
+ else if (k === "g")
30
+ t.groupId = dec;
31
+ else if (k === "u")
32
+ t.userId = dec;
33
+ else if (k === "ch")
34
+ t.channelId = dec;
35
+ else if (k === "v")
36
+ t.visitorId = dec;
37
+ else if (k === "d")
38
+ a.domainId = dec;
39
+ else if (k === "ag")
40
+ a.agentId = dec;
41
+ }
42
+ return { logicalItemId, legacyScope: scoped };
43
+ }
44
+ if (parts[0] === "a" && parts.length === 3) {
45
+ return { logicalItemId: b64uDec(parts[2]), legacyScope: { kind: "account", accountId: b64uDec(parts[1]) } };
46
+ }
47
+ if (parts[0] === "ag" && parts.length === 4) {
48
+ return {
49
+ logicalItemId: b64uDec(parts[3]),
50
+ legacyScope: { kind: "agent", accountId: b64uDec(parts[1]), agentId: b64uDec(parts[2]) },
51
+ };
52
+ }
53
+ if (parts[0] === "u" && parts.length === 4) {
54
+ return {
55
+ logicalItemId: b64uDec(parts[3]),
56
+ legacyScope: { kind: "user", accountId: b64uDec(parts[1]), userId: b64uDec(parts[2]) },
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ function arr1(v) {
62
+ if (v == null || String(v).trim() === "")
63
+ return undefined;
64
+ return [String(v).trim()];
65
+ }
66
+ function unionDim(target, dim, vals) {
67
+ const prev = target[dim] ?? [];
68
+ target[dim] = [...new Set([...prev, ...vals])];
69
+ }
70
+ function normalizeStringArray(raw) {
71
+ if (!Array.isArray(raw))
72
+ return [];
73
+ return [...new Set(raw.filter((x) => typeof x === "string" && x.trim() !== "").map((s) => s.trim()))];
74
+ }
75
+ /**
76
+ * Convert legacy stored scope + metadata tags to flexible scope (migration / allowLegacy reads).
77
+ */
78
+ export function convertLegacyScopeToFlexible(scope, metadata) {
79
+ const out = {};
80
+ const meta = metadata ?? {};
81
+ const domainIds = normalizeStringArray(meta.domainIds);
82
+ const agentIds = normalizeStringArray(meta.agentIds);
83
+ if (domainIds.length)
84
+ unionDim(out, "domains", domainIds);
85
+ if (agentIds.length)
86
+ unionDim(out, "agents", agentIds);
87
+ if (scope == null || typeof scope !== "object") {
88
+ return out;
89
+ }
90
+ const o = scope;
91
+ const kind = o.kind;
92
+ if (kind === "global" || kind == null) {
93
+ return out;
94
+ }
95
+ if (kind === "scoped") {
96
+ const tenant = o.tenant;
97
+ const agent = o.agent;
98
+ if (tenant) {
99
+ const ac = arr1(tenant.accountId);
100
+ if (ac)
101
+ unionDim(out, "accounts", ac);
102
+ const g = arr1(tenant.groupId);
103
+ if (g)
104
+ unionDim(out, "groups", g);
105
+ const u = arr1(tenant.userId);
106
+ if (u)
107
+ unionDim(out, "users", u);
108
+ const ch = arr1(tenant.channelId);
109
+ if (ch)
110
+ unionDim(out, "channels", ch);
111
+ const v = arr1(tenant.visitorId);
112
+ if (v)
113
+ unionDim(out, "visitors", v);
114
+ }
115
+ if (agent) {
116
+ const d = arr1(agent.domainId);
117
+ if (d)
118
+ unionDim(out, "domains", d);
119
+ const ag = arr1(agent.agentId);
120
+ if (ag)
121
+ unionDim(out, "agents", ag);
122
+ }
123
+ return out;
124
+ }
125
+ if (kind === "account" && typeof o.accountId === "string") {
126
+ unionDim(out, "accounts", [o.accountId]);
127
+ unionDim(out, "agents", normalizeStringArray(o.agentIds));
128
+ unionDim(out, "users", normalizeStringArray(o.userIds));
129
+ return out;
130
+ }
131
+ if (kind === "agent" && typeof o.accountId === "string" && typeof o.agentId === "string") {
132
+ unionDim(out, "accounts", [o.accountId]);
133
+ unionDim(out, "agents", [o.agentId]);
134
+ return out;
135
+ }
136
+ if (kind === "user" && typeof o.accountId === "string" && typeof o.userId === "string") {
137
+ unionDim(out, "accounts", [o.accountId]);
138
+ unionDim(out, "users", [o.userId]);
139
+ return out;
140
+ }
141
+ return out;
142
+ }
143
+ export function applyAgentScopeMapping(scope, accountId, agentId, mapping) {
144
+ if (!mapping)
145
+ return scope;
146
+ const key = `${accountId}:${agentId}`;
147
+ const m = mapping[key];
148
+ if (!m?.domains?.length)
149
+ return scope;
150
+ const out = { ...scope };
151
+ unionDim(out, "domains", m.domains);
152
+ if (m.agents?.length)
153
+ unionDim(out, "agents", m.agents);
154
+ return out;
155
+ }
156
+ /** Stable fingerprint for migration payload equivalence checks. */
157
+ export function payloadFingerprint(data) {
158
+ return JSON.stringify(data, Object.keys(data).sort());
159
+ }
160
+ export function unionFlexibleScopes(scopes) {
161
+ const out = {};
162
+ for (const s of scopes) {
163
+ for (const [dim, vals] of Object.entries(normalizeFlexibleOnly(s))) {
164
+ unionDim(out, dim, vals);
165
+ }
166
+ }
167
+ return out;
168
+ }
169
+ function normalizeFlexibleOnly(scope) {
170
+ const out = {};
171
+ for (const [k, v] of Object.entries(scope)) {
172
+ if (v?.length)
173
+ out[k] = [...new Set(v)];
174
+ }
175
+ return out;
176
+ }
177
+ //# sourceMappingURL=scope-legacy-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-legacy-convert.js","sourceRoot":"","sources":["../../../src/catalox/scope-legacy-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { CataloxContext } from "../contracts/context.js";
2
+ import type { CatalogDescriptor } from "../contracts/descriptors.js";
3
+ import type { CatalogId } from "../contracts/ids.js";
4
+ import type { CatalogItemScope } from "../contracts/items.js";
5
+ import type { CatalogValidationReport } from "../contracts/validation.js";
6
+ import type { NativeItemStore } from "../firebase/native-item-store.js";
7
+ import type { CatalogStore } from "../firebase/catalog-store.js";
8
+ import type { DescriptorStore } from "../firebase/descriptor-store.js";
9
+ import type { AuthorizationService } from "./authorization.js";
10
+ export type SmartPropertyResolveDeps = {
11
+ catalogs: CatalogStore;
12
+ descriptors: DescriptorStore;
13
+ nativeItems: NativeItemStore;
14
+ authz: AuthorizationService;
15
+ resolveAppIdForCatalog: (input: {
16
+ context: CataloxContext;
17
+ catalogId: CatalogId;
18
+ required: "read" | "write";
19
+ }) => Promise<string>;
20
+ };
21
+ export type ResolveSmartPropertiesOptions = {
22
+ /** When false, missing targets are validation errors instead of auto-created. Default true. */
23
+ autoCreate?: boolean;
24
+ /** Validate only; do not persist target updates. */
25
+ dryRun?: boolean;
26
+ };
27
+ export declare function normalizeSmartPropertyCodes(raw: unknown, multiValue?: boolean): string[];
28
+ export declare function countFilledSmartProperties(descriptor: CatalogDescriptor, data: Record<string, unknown>): number;
29
+ export declare function validateSmartPropertyRules(descriptor: CatalogDescriptor, data: Record<string, unknown>): CatalogValidationReport;
30
+ export declare function deriveIndexedFromSmartProperties(descriptor: CatalogDescriptor, data: Record<string, unknown>): Record<string, unknown> | undefined;
31
+ export declare function resolveSmartPropertiesOnWrite(deps: SmartPropertyResolveDeps, context: CataloxContext, sourceCatalogId: CatalogId, descriptor: CatalogDescriptor, data: Record<string, unknown>, sourceScope: CatalogItemScope, options?: ResolveSmartPropertiesOptions): Promise<void>;
32
+ export declare function validateSmartPropertiesForItem(deps: SmartPropertyResolveDeps, context: CataloxContext, sourceCatalogId: CatalogId, descriptor: CatalogDescriptor, data: Record<string, unknown>, options?: ResolveSmartPropertiesOptions): Promise<CatalogValidationReport>;
33
+ //# sourceMappingURL=smart-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-properties.d.ts","sourceRoot":"","sources":["../../../src/catalox/smart-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAA0B,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AASlG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,oBAAoB,CAAC;IAC5B,sBAAsB,EAAE,CACtB,KAAK,EAAE;QAAE,OAAO,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KACjF,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,+FAA+F;IAC/F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,UAAO,GAAG,MAAM,EAAE,CAYrF;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAOR;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,uBAAuB,CAezB;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CASrC;AA2BD,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,wBAAwB,EAC9B,OAAO,EAAE,cAAc,EACvB,eAAe,EAAE,SAAS,EAC1B,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,IAAI,CAAC,CAqIf;AAOD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,wBAAwB,EAC9B,OAAO,EAAE,cAAc,EACvB,eAAe,EAAE,SAAS,EAC1B,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
@@ -0,0 +1,245 @@
1
+ import { CatalogValidationError } from "../contracts/errors.js";
2
+ import { resolveCatalogItemId } from "./identity.js";
3
+ import { metadataFromScope, normalizeItemScope, storageDocIdForNativeRecord, } from "./item-scope.js";
4
+ import { unionFlexibleScopes } from "./scope-legacy-convert.js";
5
+ export function normalizeSmartPropertyCodes(raw, multiValue = true) {
6
+ if (raw == null)
7
+ return [];
8
+ if (Array.isArray(raw)) {
9
+ return raw.map((v) => String(v).trim()).filter((s) => s.length > 0);
10
+ }
11
+ if (typeof raw === "string" && raw.trim()) {
12
+ return multiValue ? [raw.trim()] : [raw.trim()];
13
+ }
14
+ if (typeof raw === "number" || typeof raw === "boolean") {
15
+ return [String(raw)];
16
+ }
17
+ return [];
18
+ }
19
+ export function countFilledSmartProperties(descriptor, data) {
20
+ let n = 0;
21
+ for (const sp of descriptor.smartProperties ?? []) {
22
+ const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
23
+ if (codes.length)
24
+ n += 1;
25
+ }
26
+ return n;
27
+ }
28
+ export function validateSmartPropertyRules(descriptor, data) {
29
+ const issues = [];
30
+ const min = descriptor.smartPropertyRules?.minPropertiesFilled;
31
+ if (min != null && min > 0) {
32
+ const filled = countFilledSmartProperties(descriptor, data);
33
+ if (filled < min) {
34
+ issues.push({
35
+ code: "smart_properties.min_not_met",
36
+ severity: "error",
37
+ message: `At least ${min} smart propert${min === 1 ? "y" : "ies"} must have one or more codes (found ${filled}).`,
38
+ path: "smartPropertyRules.minPropertiesFilled",
39
+ });
40
+ }
41
+ }
42
+ return { isValid: !issues.some((i) => i.severity === "error"), issues };
43
+ }
44
+ export function deriveIndexedFromSmartProperties(descriptor, data) {
45
+ const out = {};
46
+ for (const sp of descriptor.smartProperties ?? []) {
47
+ if (!sp.indexed)
48
+ continue;
49
+ const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
50
+ if (!codes.length)
51
+ continue;
52
+ out[sp.key] = codes.length === 1 ? codes[0] : codes;
53
+ }
54
+ return Object.keys(out).length ? out : undefined;
55
+ }
56
+ function titleFromCode(code) {
57
+ const spaced = code
58
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
59
+ .replace(/[_-]+/g, " ")
60
+ .trim();
61
+ if (!spaced)
62
+ return code;
63
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
64
+ }
65
+ async function loadTargetByCode(deps, targetCatalogId, code, targetField) {
66
+ const rows = await deps.nativeItems.findByLogicalItemId(targetCatalogId, code);
67
+ if (rows.length)
68
+ return rows[0];
69
+ const legacy = await deps.nativeItems.get(targetCatalogId, code);
70
+ if (legacy)
71
+ return legacy;
72
+ const docId = storageDocIdForNativeRecord({ itemId: code });
73
+ const byDoc = await deps.nativeItems.get(targetCatalogId, docId);
74
+ if (byDoc && String(byDoc.data?.[targetField] ?? byDoc.itemId) === code)
75
+ return byDoc;
76
+ return null;
77
+ }
78
+ export async function resolveSmartPropertiesOnWrite(deps, context, sourceCatalogId, descriptor, data, sourceScope, options) {
79
+ const props = descriptor.smartProperties;
80
+ if (!props?.length)
81
+ return;
82
+ const rulesReport = validateSmartPropertyRules(descriptor, data);
83
+ if (!rulesReport.isValid) {
84
+ throw new CatalogValidationError({
85
+ reason: "smart_properties",
86
+ catalogId: String(sourceCatalogId),
87
+ report: rulesReport,
88
+ });
89
+ }
90
+ const globalAutoCreate = options?.autoCreate !== false;
91
+ const dryRun = options?.dryRun === true;
92
+ const now = new Date().toISOString();
93
+ for (const sp of props) {
94
+ const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
95
+ if (!codes.length)
96
+ continue;
97
+ const targetCatalogId = sp.targetCatalogId;
98
+ const targetField = sp.targetField ?? "code";
99
+ const propertyAutoCreate = sp.autoCreate !== false && globalAutoCreate;
100
+ const targetCatalog = await deps.catalogs.get(targetCatalogId);
101
+ if (!targetCatalog || targetCatalog.sourceMode !== "native") {
102
+ throw new CatalogValidationError({
103
+ reason: "smart_properties",
104
+ catalogId: String(sourceCatalogId),
105
+ report: {
106
+ isValid: false,
107
+ issues: [
108
+ {
109
+ code: "smart_properties.target_catalog_missing",
110
+ severity: "error",
111
+ message: `Target catalog "${String(targetCatalogId)}" not found or not native.`,
112
+ path: sp.key,
113
+ },
114
+ ],
115
+ },
116
+ });
117
+ }
118
+ const targetAppId = await deps.resolveAppIdForCatalog({
119
+ context,
120
+ catalogId: targetCatalogId,
121
+ required: "write",
122
+ });
123
+ await deps.authz.requireBindingAccess(context, targetAppId, targetCatalogId, "write");
124
+ const targetDescriptorRec = await deps.descriptors.get(targetCatalogId);
125
+ const targetIdentity = targetDescriptorRec?.descriptor?.identity ?? {
126
+ itemIdStrategy: "natural",
127
+ itemIdField: targetField,
128
+ };
129
+ for (const code of codes) {
130
+ let target = await loadTargetByCode(deps, targetCatalogId, code, targetField);
131
+ if (!target) {
132
+ if (!propertyAutoCreate) {
133
+ throw new CatalogValidationError({
134
+ reason: "smart_properties",
135
+ catalogId: String(sourceCatalogId),
136
+ report: {
137
+ isValid: false,
138
+ issues: [
139
+ {
140
+ code: "smart_properties.target_not_found",
141
+ severity: "error",
142
+ message: `Target code "${code}" not found in catalog "${String(targetCatalogId)}".`,
143
+ path: sp.key,
144
+ },
145
+ ],
146
+ },
147
+ });
148
+ }
149
+ if (dryRun)
150
+ continue;
151
+ const title = titleFromCode(code);
152
+ const targetData = { [targetField]: code, title };
153
+ const logicalItemId = resolveCatalogItemId({ identity: targetIdentity, data: targetData });
154
+ const scopeMeta = metadataFromScope(sourceScope);
155
+ target = {
156
+ itemId: logicalItemId,
157
+ catalogId: targetCatalogId,
158
+ scope: normalizeItemScope(sourceScope),
159
+ appScopedOwnerId: targetAppId,
160
+ data: targetData,
161
+ metadata: {
162
+ createdAt: now,
163
+ lastUpdate: now,
164
+ firstUsedAt: now,
165
+ lastUsedAt: now,
166
+ usageCount: 1,
167
+ domainIds: scopeMeta.domainIds,
168
+ agentIds: scopeMeta.agentIds,
169
+ },
170
+ version: 1,
171
+ };
172
+ await deps.nativeItems.upsert(targetCatalogId, target);
173
+ continue;
174
+ }
175
+ if (dryRun)
176
+ continue;
177
+ const prevMeta = (target.metadata ?? {});
178
+ const usageCount = Number(prevMeta.usageCount ?? 0) + 1;
179
+ const mergedScope = unionFlexibleScopes([
180
+ normalizeItemScope(scopeFromRecordField(target.scope)),
181
+ normalizeItemScope(sourceScope),
182
+ ]);
183
+ const scopeMeta = metadataFromScope(mergedScope);
184
+ const nextRec = {
185
+ ...target,
186
+ scope: mergedScope,
187
+ metadata: {
188
+ ...prevMeta,
189
+ createdAt: String(prevMeta.createdAt ?? now),
190
+ lastUpdate: now,
191
+ firstUsedAt: String(prevMeta.firstUsedAt ?? now),
192
+ lastUsedAt: now,
193
+ usageCount,
194
+ domainIds: scopeMeta.domainIds,
195
+ agentIds: scopeMeta.agentIds,
196
+ },
197
+ version: (target.version ?? 0) + 1,
198
+ };
199
+ await deps.nativeItems.upsert(targetCatalogId, nextRec);
200
+ }
201
+ }
202
+ }
203
+ function scopeFromRecordField(scope) {
204
+ if (scope == null)
205
+ return {};
206
+ return normalizeItemScope(scope);
207
+ }
208
+ export async function validateSmartPropertiesForItem(deps, context, sourceCatalogId, descriptor, data, options) {
209
+ const issues = [];
210
+ issues.push(...validateSmartPropertyRules(descriptor, data).issues);
211
+ const globalAutoCreate = options?.autoCreate !== false;
212
+ for (const sp of descriptor.smartProperties ?? []) {
213
+ const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
214
+ if (!codes.length)
215
+ continue;
216
+ const propertyAutoCreate = sp.autoCreate !== false && globalAutoCreate;
217
+ if (propertyAutoCreate)
218
+ continue;
219
+ const targetCatalogId = sp.targetCatalogId;
220
+ const targetField = sp.targetField ?? "code";
221
+ const targetCatalog = await deps.catalogs.get(targetCatalogId);
222
+ if (!targetCatalog) {
223
+ issues.push({
224
+ code: "smart_properties.target_catalog_missing",
225
+ severity: "error",
226
+ message: `Target catalog "${String(targetCatalogId)}" not found.`,
227
+ path: sp.key,
228
+ });
229
+ continue;
230
+ }
231
+ for (const code of codes) {
232
+ const target = await loadTargetByCode(deps, targetCatalogId, code, targetField);
233
+ if (!target) {
234
+ issues.push({
235
+ code: "smart_properties.target_not_found",
236
+ severity: "error",
237
+ message: `Target code "${code}" not found in catalog "${String(targetCatalogId)}".`,
238
+ path: sp.key,
239
+ });
240
+ }
241
+ }
242
+ }
243
+ return { isValid: !issues.some((i) => i.severity === "error"), issues };
244
+ }
245
+ //# sourceMappingURL=smart-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-properties.js","sourceRoot":"","sources":["../../../src/catalox/smart-properties.ts"],"names":[],"mappings":"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"}