@x12i/catalox 5.0.0 → 5.1.1
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 +61 -0
- package/dist/src/catalox/catalox.d.ts +4 -1
- package/dist/src/catalox/catalox.d.ts.map +1 -1
- package/dist/src/catalox/catalox.js +49 -20
- package/dist/src/catalox/catalox.js.map +1 -1
- package/dist/src/catalox/native-item-resolve.d.ts +28 -0
- package/dist/src/catalox/native-item-resolve.d.ts.map +1 -0
- package/dist/src/catalox/native-item-resolve.js +49 -0
- package/dist/src/catalox/native-item-resolve.js.map +1 -0
- package/dist/src/catalox/smart-properties.d.ts +33 -0
- package/dist/src/catalox/smart-properties.d.ts.map +1 -0
- package/dist/src/catalox/smart-properties.js +242 -0
- package/dist/src/catalox/smart-properties.js.map +1 -0
- package/dist/src/cli/index.js +2 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/contracts/descriptors.d.ts +14 -0
- package/dist/src/contracts/descriptors.d.ts.map +1 -1
- package/dist/src/contracts/index.d.ts +1 -1
- package/dist/src/contracts/index.d.ts.map +1 -1
- package/dist/src/contracts/index.js.map +1 -1
- package/dist/src/firebase/native-item-store.d.ts +1 -0
- package/dist/src/firebase/native-item-store.d.ts.map +1 -1
- package/dist/src/firebase/native-item-store.js +8 -1
- package/dist/src/firebase/native-item-store.js.map +1 -1
- package/docs/cli-items.md +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { itemIdNeedsEncodedStorageDocId, storageDocIdForItem } from "./item-scope.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve physical native rows for a logical item id.
|
|
4
|
+
* Uses indexed `itemId` query, then encoded storage doc id (`id~…`), then legacy raw doc id when path-safe.
|
|
5
|
+
*/
|
|
6
|
+
export async function resolveNativeRowsByLogicalItemId(nativeItems, catalogId, logicalItemId) {
|
|
7
|
+
const id = String(logicalItemId);
|
|
8
|
+
const rows = await nativeItems.findByLogicalItemId(catalogId, logicalItemId);
|
|
9
|
+
if (rows.length)
|
|
10
|
+
return rows;
|
|
11
|
+
const byStorageDoc = await nativeItems.get(catalogId, storageDocIdForItem(id));
|
|
12
|
+
if (byStorageDoc)
|
|
13
|
+
return [byStorageDoc];
|
|
14
|
+
if (!itemIdNeedsEncodedStorageDocId(id)) {
|
|
15
|
+
const legacy = await nativeItems.get(catalogId, logicalItemId);
|
|
16
|
+
if (legacy)
|
|
17
|
+
return [legacy];
|
|
18
|
+
}
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
/** Split list filters into equality vs array-contains based on descriptor field shape. */
|
|
22
|
+
export function planNativeListFilters(descriptor, filter) {
|
|
23
|
+
const filterEq = {};
|
|
24
|
+
const filterArrayContains = {};
|
|
25
|
+
if (!filter || !Object.keys(filter).length) {
|
|
26
|
+
return { filterEq, filterArrayContains };
|
|
27
|
+
}
|
|
28
|
+
const arrayContainsKeys = new Set();
|
|
29
|
+
for (const f of descriptor.queryableFields ?? []) {
|
|
30
|
+
if (f.multiValue || f.type === "array")
|
|
31
|
+
arrayContainsKeys.add(f.key);
|
|
32
|
+
}
|
|
33
|
+
for (const sp of descriptor.smartProperties ?? []) {
|
|
34
|
+
if (sp.indexed && sp.multiValue !== false)
|
|
35
|
+
arrayContainsKeys.add(sp.key);
|
|
36
|
+
}
|
|
37
|
+
for (const [k, v] of Object.entries(filter)) {
|
|
38
|
+
if (v == null || v === "")
|
|
39
|
+
continue;
|
|
40
|
+
if (arrayContainsKeys.has(k)) {
|
|
41
|
+
filterArrayContains[k] = String(v);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
filterEq[k] = v;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { filterEq, filterArrayContains };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=native-item-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-item-resolve.js","sourceRoot":"","sources":["../../../src/catalox/native-item-resolve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAItF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,WAA6B,EAC7B,SAAoB,EACpB,aAAqB;IAErB,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,CAAW,CAAC,CAAC;IACzF,IAAI,YAAY;QAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAExC,IAAI,CAAC,8BAA8B,CAAC,EAAE,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC/D,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAOD,0FAA0F;AAC1F,MAAM,UAAU,qBAAqB,CACnC,UAAgL,EAChL,MAA2C;IAE3C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,MAAM,mBAAmB,GAA2B,EAAE,CAAC;IACvD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,UAAU,KAAK,KAAK;YAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE,SAAS;QACpC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -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;AAMlG,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;AAwBD,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,242 @@
|
|
|
1
|
+
import { CatalogValidationError } from "../contracts/errors.js";
|
|
2
|
+
import { resolveCatalogItemId } from "./identity.js";
|
|
3
|
+
import { metadataFromScope, normalizeItemScope } from "./item-scope.js";
|
|
4
|
+
import { resolveNativeRowsByLogicalItemId } from "./native-item-resolve.js";
|
|
5
|
+
import { unionFlexibleScopes } from "./scope-legacy-convert.js";
|
|
6
|
+
export function normalizeSmartPropertyCodes(raw, multiValue = true) {
|
|
7
|
+
if (raw == null)
|
|
8
|
+
return [];
|
|
9
|
+
if (Array.isArray(raw)) {
|
|
10
|
+
return raw.map((v) => String(v).trim()).filter((s) => s.length > 0);
|
|
11
|
+
}
|
|
12
|
+
if (typeof raw === "string" && raw.trim()) {
|
|
13
|
+
return multiValue ? [raw.trim()] : [raw.trim()];
|
|
14
|
+
}
|
|
15
|
+
if (typeof raw === "number" || typeof raw === "boolean") {
|
|
16
|
+
return [String(raw)];
|
|
17
|
+
}
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
export function countFilledSmartProperties(descriptor, data) {
|
|
21
|
+
let n = 0;
|
|
22
|
+
for (const sp of descriptor.smartProperties ?? []) {
|
|
23
|
+
const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
|
|
24
|
+
if (codes.length)
|
|
25
|
+
n += 1;
|
|
26
|
+
}
|
|
27
|
+
return n;
|
|
28
|
+
}
|
|
29
|
+
export function validateSmartPropertyRules(descriptor, data) {
|
|
30
|
+
const issues = [];
|
|
31
|
+
const min = descriptor.smartPropertyRules?.minPropertiesFilled;
|
|
32
|
+
if (min != null && min > 0) {
|
|
33
|
+
const filled = countFilledSmartProperties(descriptor, data);
|
|
34
|
+
if (filled < min) {
|
|
35
|
+
issues.push({
|
|
36
|
+
code: "smart_properties.min_not_met",
|
|
37
|
+
severity: "error",
|
|
38
|
+
message: `At least ${min} smart propert${min === 1 ? "y" : "ies"} must have one or more codes (found ${filled}).`,
|
|
39
|
+
path: "smartPropertyRules.minPropertiesFilled",
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { isValid: !issues.some((i) => i.severity === "error"), issues };
|
|
44
|
+
}
|
|
45
|
+
export function deriveIndexedFromSmartProperties(descriptor, data) {
|
|
46
|
+
const out = {};
|
|
47
|
+
for (const sp of descriptor.smartProperties ?? []) {
|
|
48
|
+
if (!sp.indexed)
|
|
49
|
+
continue;
|
|
50
|
+
const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
|
|
51
|
+
if (!codes.length)
|
|
52
|
+
continue;
|
|
53
|
+
out[sp.key] = sp.multiValue === false ? (codes.length === 1 ? codes[0] : codes) : codes;
|
|
54
|
+
}
|
|
55
|
+
return Object.keys(out).length ? out : undefined;
|
|
56
|
+
}
|
|
57
|
+
function titleFromCode(code) {
|
|
58
|
+
const spaced = code
|
|
59
|
+
.replace(/([a-z])([A-Z])/g, "$1 $2")
|
|
60
|
+
.replace(/[_-]+/g, " ")
|
|
61
|
+
.trim();
|
|
62
|
+
if (!spaced)
|
|
63
|
+
return code;
|
|
64
|
+
return spaced.charAt(0).toUpperCase() + spaced.slice(1);
|
|
65
|
+
}
|
|
66
|
+
async function loadTargetByCode(deps, targetCatalogId, code, targetField) {
|
|
67
|
+
const rows = await resolveNativeRowsByLogicalItemId(deps.nativeItems, targetCatalogId, code);
|
|
68
|
+
const row = rows[0];
|
|
69
|
+
if (!row)
|
|
70
|
+
return null;
|
|
71
|
+
if (String(row.data?.[targetField] ?? row.itemId) === code)
|
|
72
|
+
return row;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
export async function resolveSmartPropertiesOnWrite(deps, context, sourceCatalogId, descriptor, data, sourceScope, options) {
|
|
76
|
+
const props = descriptor.smartProperties;
|
|
77
|
+
if (!props?.length)
|
|
78
|
+
return;
|
|
79
|
+
const rulesReport = validateSmartPropertyRules(descriptor, data);
|
|
80
|
+
if (!rulesReport.isValid) {
|
|
81
|
+
throw new CatalogValidationError({
|
|
82
|
+
reason: "smart_properties",
|
|
83
|
+
catalogId: String(sourceCatalogId),
|
|
84
|
+
report: rulesReport,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const globalAutoCreate = options?.autoCreate !== false;
|
|
88
|
+
const dryRun = options?.dryRun === true;
|
|
89
|
+
const now = new Date().toISOString();
|
|
90
|
+
for (const sp of props) {
|
|
91
|
+
const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
|
|
92
|
+
if (!codes.length)
|
|
93
|
+
continue;
|
|
94
|
+
const targetCatalogId = sp.targetCatalogId;
|
|
95
|
+
const targetField = sp.targetField ?? "code";
|
|
96
|
+
const propertyAutoCreate = sp.autoCreate !== false && globalAutoCreate;
|
|
97
|
+
const targetCatalog = await deps.catalogs.get(targetCatalogId);
|
|
98
|
+
if (!targetCatalog || targetCatalog.sourceMode !== "native") {
|
|
99
|
+
throw new CatalogValidationError({
|
|
100
|
+
reason: "smart_properties",
|
|
101
|
+
catalogId: String(sourceCatalogId),
|
|
102
|
+
report: {
|
|
103
|
+
isValid: false,
|
|
104
|
+
issues: [
|
|
105
|
+
{
|
|
106
|
+
code: "smart_properties.target_catalog_missing",
|
|
107
|
+
severity: "error",
|
|
108
|
+
message: `Target catalog "${String(targetCatalogId)}" not found or not native.`,
|
|
109
|
+
path: sp.key,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const targetAppId = await deps.resolveAppIdForCatalog({
|
|
116
|
+
context,
|
|
117
|
+
catalogId: targetCatalogId,
|
|
118
|
+
required: "write",
|
|
119
|
+
});
|
|
120
|
+
await deps.authz.requireBindingAccess(context, targetAppId, targetCatalogId, "write");
|
|
121
|
+
const targetDescriptorRec = await deps.descriptors.get(targetCatalogId);
|
|
122
|
+
const targetIdentity = targetDescriptorRec?.descriptor?.identity ?? {
|
|
123
|
+
itemIdStrategy: "natural",
|
|
124
|
+
itemIdField: targetField,
|
|
125
|
+
};
|
|
126
|
+
for (const code of codes) {
|
|
127
|
+
let target = await loadTargetByCode(deps, targetCatalogId, code, targetField);
|
|
128
|
+
if (!target) {
|
|
129
|
+
if (!propertyAutoCreate) {
|
|
130
|
+
throw new CatalogValidationError({
|
|
131
|
+
reason: "smart_properties",
|
|
132
|
+
catalogId: String(sourceCatalogId),
|
|
133
|
+
report: {
|
|
134
|
+
isValid: false,
|
|
135
|
+
issues: [
|
|
136
|
+
{
|
|
137
|
+
code: "smart_properties.target_not_found",
|
|
138
|
+
severity: "error",
|
|
139
|
+
message: `Target code "${code}" not found in catalog "${String(targetCatalogId)}".`,
|
|
140
|
+
path: sp.key,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (dryRun)
|
|
147
|
+
continue;
|
|
148
|
+
const title = titleFromCode(code);
|
|
149
|
+
const targetData = { [targetField]: code, title };
|
|
150
|
+
const logicalItemId = resolveCatalogItemId({ identity: targetIdentity, data: targetData });
|
|
151
|
+
const scopeMeta = metadataFromScope(sourceScope);
|
|
152
|
+
target = {
|
|
153
|
+
itemId: logicalItemId,
|
|
154
|
+
catalogId: targetCatalogId,
|
|
155
|
+
scope: normalizeItemScope(sourceScope),
|
|
156
|
+
appScopedOwnerId: targetAppId,
|
|
157
|
+
data: targetData,
|
|
158
|
+
metadata: {
|
|
159
|
+
createdAt: now,
|
|
160
|
+
lastUpdate: now,
|
|
161
|
+
firstUsedAt: now,
|
|
162
|
+
lastUsedAt: now,
|
|
163
|
+
usageCount: 1,
|
|
164
|
+
domainIds: scopeMeta.domainIds,
|
|
165
|
+
agentIds: scopeMeta.agentIds,
|
|
166
|
+
},
|
|
167
|
+
version: 1,
|
|
168
|
+
};
|
|
169
|
+
await deps.nativeItems.upsert(targetCatalogId, target);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (dryRun)
|
|
173
|
+
continue;
|
|
174
|
+
const prevMeta = (target.metadata ?? {});
|
|
175
|
+
const usageCount = Number(prevMeta.usageCount ?? 0) + 1;
|
|
176
|
+
const mergedScope = unionFlexibleScopes([
|
|
177
|
+
normalizeItemScope(scopeFromRecordField(target.scope)),
|
|
178
|
+
normalizeItemScope(sourceScope),
|
|
179
|
+
]);
|
|
180
|
+
const scopeMeta = metadataFromScope(mergedScope);
|
|
181
|
+
const nextRec = {
|
|
182
|
+
...target,
|
|
183
|
+
scope: mergedScope,
|
|
184
|
+
metadata: {
|
|
185
|
+
...prevMeta,
|
|
186
|
+
createdAt: String(prevMeta.createdAt ?? now),
|
|
187
|
+
lastUpdate: now,
|
|
188
|
+
firstUsedAt: String(prevMeta.firstUsedAt ?? now),
|
|
189
|
+
lastUsedAt: now,
|
|
190
|
+
usageCount,
|
|
191
|
+
domainIds: scopeMeta.domainIds,
|
|
192
|
+
agentIds: scopeMeta.agentIds,
|
|
193
|
+
},
|
|
194
|
+
version: (target.version ?? 0) + 1,
|
|
195
|
+
};
|
|
196
|
+
await deps.nativeItems.upsert(targetCatalogId, nextRec);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function scopeFromRecordField(scope) {
|
|
201
|
+
if (scope == null)
|
|
202
|
+
return {};
|
|
203
|
+
return normalizeItemScope(scope);
|
|
204
|
+
}
|
|
205
|
+
export async function validateSmartPropertiesForItem(deps, context, sourceCatalogId, descriptor, data, options) {
|
|
206
|
+
const issues = [];
|
|
207
|
+
issues.push(...validateSmartPropertyRules(descriptor, data).issues);
|
|
208
|
+
const globalAutoCreate = options?.autoCreate !== false;
|
|
209
|
+
for (const sp of descriptor.smartProperties ?? []) {
|
|
210
|
+
const codes = normalizeSmartPropertyCodes(data[sp.key], sp.multiValue !== false);
|
|
211
|
+
if (!codes.length)
|
|
212
|
+
continue;
|
|
213
|
+
const propertyAutoCreate = sp.autoCreate !== false && globalAutoCreate;
|
|
214
|
+
if (propertyAutoCreate)
|
|
215
|
+
continue;
|
|
216
|
+
const targetCatalogId = sp.targetCatalogId;
|
|
217
|
+
const targetField = sp.targetField ?? "code";
|
|
218
|
+
const targetCatalog = await deps.catalogs.get(targetCatalogId);
|
|
219
|
+
if (!targetCatalog) {
|
|
220
|
+
issues.push({
|
|
221
|
+
code: "smart_properties.target_catalog_missing",
|
|
222
|
+
severity: "error",
|
|
223
|
+
message: `Target catalog "${String(targetCatalogId)}" not found.`,
|
|
224
|
+
path: sp.key,
|
|
225
|
+
});
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
for (const code of codes) {
|
|
229
|
+
const target = await loadTargetByCode(deps, targetCatalogId, code, targetField);
|
|
230
|
+
if (!target) {
|
|
231
|
+
issues.push({
|
|
232
|
+
code: "smart_properties.target_not_found",
|
|
233
|
+
severity: "error",
|
|
234
|
+
message: `Target code "${code}" not found in catalog "${String(targetCatalogId)}".`,
|
|
235
|
+
path: sp.key,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return { isValid: !issues.some((i) => i.severity === "error"), issues };
|
|
241
|
+
}
|
|
242
|
+
//# 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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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -377,6 +377,7 @@ itemsCmd
|
|
|
377
377
|
.option("--catalog-type <type>", "Offline with --file: resolve schema by catalogType + registry")
|
|
378
378
|
.option("--schema-version <id>", "Offline: payload schema id (e.g. catalox.payload.generic-map/v1)")
|
|
379
379
|
.option("--out <path>", "Write JSON to file instead of stdout")
|
|
380
|
+
.option("--no-auto-create", "Fail validate when smart-property target codes are missing", false)
|
|
380
381
|
.option("--god", "God mode (bypass binding checks where applicable)", false)
|
|
381
382
|
.action(async (opts) => {
|
|
382
383
|
const fileRaw = opts.file != null ? String(opts.file).trim() : "";
|
|
@@ -443,7 +444,7 @@ itemsCmd
|
|
|
443
444
|
const ctx = baseContext({ app: appId, store: opts.store, god: opts.god });
|
|
444
445
|
const catalogId = String(opts.catalog);
|
|
445
446
|
if (opts.item != null && String(opts.item).trim() !== "") {
|
|
446
|
-
const report = await catalox.validateCatalogItem(ctx, catalogId, String(opts.item).trim());
|
|
447
|
+
const report = await catalox.validateCatalogItem(ctx, catalogId, String(opts.item).trim(), opts.noAutoCreate ? { noAutoCreate: true } : undefined);
|
|
447
448
|
await writeOrStdout(JSON.stringify({ scope: "item", catalogId, itemId: String(opts.item).trim(), ...report }, null, 2), opts.out);
|
|
448
449
|
if (!report.isValid)
|
|
449
450
|
process.exitCode = 1;
|