@x12i/catalox 1.1.1 → 2.0.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 (125) hide show
  1. package/README.md +424 -222
  2. package/dist/src/catalox/catalox.d.ts +38 -1
  3. package/dist/src/catalox/catalox.d.ts.map +1 -1
  4. package/dist/src/catalox/catalox.js +499 -13
  5. package/dist/src/catalox/catalox.js.map +1 -1
  6. package/dist/src/catalox/field-source-resolution.d.ts +16 -0
  7. package/dist/src/catalox/field-source-resolution.d.ts.map +1 -0
  8. package/dist/src/catalox/field-source-resolution.js +43 -0
  9. package/dist/src/catalox/field-source-resolution.js.map +1 -0
  10. package/dist/src/catalox/reporting/render-inventory-report.d.ts +3 -0
  11. package/dist/src/catalox/reporting/render-inventory-report.d.ts.map +1 -0
  12. package/dist/src/catalox/reporting/render-inventory-report.js +78 -0
  13. package/dist/src/catalox/reporting/render-inventory-report.js.map +1 -0
  14. package/dist/src/cli/index.d.ts +3 -0
  15. package/dist/src/cli/index.d.ts.map +1 -0
  16. package/dist/src/cli/index.js +267 -0
  17. package/dist/src/cli/index.js.map +1 -0
  18. package/dist/src/contracts/context.d.ts +7 -1
  19. package/dist/src/contracts/context.d.ts.map +1 -1
  20. package/dist/src/contracts/descriptors.d.ts +6 -0
  21. package/dist/src/contracts/descriptors.d.ts.map +1 -1
  22. package/dist/src/contracts/diagram-map.d.ts +24 -0
  23. package/dist/src/contracts/diagram-map.d.ts.map +1 -0
  24. package/dist/src/contracts/diagram-map.js +2 -0
  25. package/dist/src/contracts/diagram-map.js.map +1 -0
  26. package/dist/src/contracts/field-source.d.ts +43 -0
  27. package/dist/src/contracts/field-source.d.ts.map +1 -0
  28. package/dist/src/contracts/field-source.js +2 -0
  29. package/dist/src/contracts/field-source.js.map +1 -0
  30. package/dist/src/contracts/filters.d.ts +59 -0
  31. package/dist/src/contracts/filters.d.ts.map +1 -0
  32. package/dist/src/contracts/filters.js +2 -0
  33. package/dist/src/contracts/filters.js.map +1 -0
  34. package/dist/src/contracts/ids.d.ts +1 -0
  35. package/dist/src/contracts/ids.d.ts.map +1 -1
  36. package/dist/src/contracts/index.d.ts +11 -1
  37. package/dist/src/contracts/index.d.ts.map +1 -1
  38. package/dist/src/contracts/index.js.map +1 -1
  39. package/dist/src/contracts/inventory-export.d.ts +40 -0
  40. package/dist/src/contracts/inventory-export.d.ts.map +1 -0
  41. package/dist/src/contracts/inventory-export.js +2 -0
  42. package/dist/src/contracts/inventory-export.js.map +1 -0
  43. package/dist/src/contracts/inventory-report.d.ts +61 -0
  44. package/dist/src/contracts/inventory-report.d.ts.map +1 -0
  45. package/dist/src/contracts/inventory-report.js +2 -0
  46. package/dist/src/contracts/inventory-report.js.map +1 -0
  47. package/dist/src/contracts/items.d.ts +3 -0
  48. package/dist/src/contracts/items.d.ts.map +1 -1
  49. package/dist/src/contracts/markdown-map.d.ts +42 -0
  50. package/dist/src/contracts/markdown-map.d.ts.map +1 -0
  51. package/dist/src/contracts/markdown-map.js +2 -0
  52. package/dist/src/contracts/markdown-map.js.map +1 -0
  53. package/dist/src/contracts/presentation.d.ts +149 -0
  54. package/dist/src/contracts/presentation.d.ts.map +1 -0
  55. package/dist/src/contracts/presentation.js +2 -0
  56. package/dist/src/contracts/presentation.js.map +1 -0
  57. package/dist/src/contracts/render-map.d.ts +135 -0
  58. package/dist/src/contracts/render-map.d.ts.map +1 -0
  59. package/dist/src/contracts/render-map.js +2 -0
  60. package/dist/src/contracts/render-map.js.map +1 -0
  61. package/dist/src/contracts/snapshots.d.ts +12 -0
  62. package/dist/src/contracts/snapshots.d.ts.map +1 -0
  63. package/dist/src/contracts/snapshots.js +2 -0
  64. package/dist/src/contracts/snapshots.js.map +1 -0
  65. package/dist/src/contracts/stores.d.ts +21 -0
  66. package/dist/src/contracts/stores.d.ts.map +1 -0
  67. package/dist/src/contracts/stores.js +2 -0
  68. package/dist/src/contracts/stores.js.map +1 -0
  69. package/dist/src/diagrams/render-catalog-diagram.d.ts +3 -0
  70. package/dist/src/diagrams/render-catalog-diagram.d.ts.map +1 -0
  71. package/dist/src/diagrams/render-catalog-diagram.js +27 -0
  72. package/dist/src/diagrams/render-catalog-diagram.js.map +1 -0
  73. package/dist/src/diagrams/render-item-diagram.d.ts +3 -0
  74. package/dist/src/diagrams/render-item-diagram.d.ts.map +1 -0
  75. package/dist/src/diagrams/render-item-diagram.js +26 -0
  76. package/dist/src/diagrams/render-item-diagram.js.map +1 -0
  77. package/dist/src/firebase/index.d.ts +1 -0
  78. package/dist/src/firebase/index.d.ts.map +1 -1
  79. package/dist/src/firebase/index.js +1 -0
  80. package/dist/src/firebase/index.js.map +1 -1
  81. package/dist/src/firebase/snapshot-store.d.ts +7 -0
  82. package/dist/src/firebase/snapshot-store.d.ts.map +1 -1
  83. package/dist/src/firebase/snapshot-store.js +30 -0
  84. package/dist/src/firebase/snapshot-store.js.map +1 -1
  85. package/dist/src/firebase/store-app-binding-store.d.ts +14 -0
  86. package/dist/src/firebase/store-app-binding-store.d.ts.map +1 -0
  87. package/dist/src/firebase/store-app-binding-store.js +36 -0
  88. package/dist/src/firebase/store-app-binding-store.js.map +1 -0
  89. package/dist/src/index.d.ts +4 -0
  90. package/dist/src/index.d.ts.map +1 -1
  91. package/dist/src/index.js +4 -0
  92. package/dist/src/index.js.map +1 -1
  93. package/dist/src/markdown/render-item-markdown.d.ts +5 -0
  94. package/dist/src/markdown/render-item-markdown.d.ts.map +1 -0
  95. package/dist/src/markdown/render-item-markdown.js +83 -0
  96. package/dist/src/markdown/render-item-markdown.js.map +1 -0
  97. package/dist/src/markdown/render-list-markdown.d.ts +5 -0
  98. package/dist/src/markdown/render-list-markdown.d.ts.map +1 -0
  99. package/dist/src/markdown/render-list-markdown.js +90 -0
  100. package/dist/src/markdown/render-list-markdown.js.map +1 -0
  101. package/dist/src/validation/index.d.ts +3 -1
  102. package/dist/src/validation/index.d.ts.map +1 -1
  103. package/dist/src/validation/index.js +2 -2
  104. package/dist/src/validation/index.js.map +1 -1
  105. package/dist/src/validation/ui-spec-schema.d.ts +19 -0
  106. package/dist/src/validation/ui-spec-schema.d.ts.map +1 -0
  107. package/dist/src/validation/ui-spec-schema.js +547 -0
  108. package/dist/src/validation/ui-spec-schema.js.map +1 -0
  109. package/dist/src/validation/ui-spec-validate.d.ts +19 -0
  110. package/dist/src/validation/ui-spec-validate.d.ts.map +1 -0
  111. package/dist/src/validation/ui-spec-validate.js +69 -0
  112. package/dist/src/validation/ui-spec-validate.js.map +1 -0
  113. package/dist/test/unit/field-source-resolution.test.d.ts +2 -0
  114. package/dist/test/unit/field-source-resolution.test.d.ts.map +1 -0
  115. package/dist/test/unit/field-source-resolution.test.js +45 -0
  116. package/dist/test/unit/field-source-resolution.test.js.map +1 -0
  117. package/dist/test/unit/markdown-and-diagrams.test.d.ts +2 -0
  118. package/dist/test/unit/markdown-and-diagrams.test.d.ts.map +1 -0
  119. package/dist/test/unit/markdown-and-diagrams.test.js +62 -0
  120. package/dist/test/unit/markdown-and-diagrams.test.js.map +1 -0
  121. package/dist/test/unit/ui-spec-validation.test.d.ts +2 -0
  122. package/dist/test/unit/ui-spec-validation.test.d.ts.map +1 -0
  123. package/dist/test/unit/ui-spec-validation.test.js +78 -0
  124. package/dist/test/unit/ui-spec-validation.test.js.map +1 -0
  125. package/package.json +10 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-spec-validate.js","sourceRoot":"","sources":["../../../src/validation/ui-spec-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=field-source-resolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-source-resolution.test.d.ts","sourceRoot":"","sources":["../../../test/unit/field-source-resolution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { isDollarPath, resolveFilterBy, optionsFromStaticSource, optionsFromCatalogItems, } from "../../src/catalox/field-source-resolution.js";
4
+ function readPath(obj, path) {
5
+ const parts = path.split(".").filter(Boolean);
6
+ let cur = obj;
7
+ for (const p of parts) {
8
+ if (cur == null || typeof cur !== "object")
9
+ return undefined;
10
+ cur = cur[p];
11
+ }
12
+ return cur;
13
+ }
14
+ test("isDollarPath detects $.prefix", () => {
15
+ assert.equal(isDollarPath("$.a"), true);
16
+ assert.equal(isDollarPath("a"), false);
17
+ });
18
+ test("resolveFilterBy resolves $. paths from current item data", () => {
19
+ const filterBy = { countryCode: "$.country.code", status: "active" };
20
+ const currentItemData = { country: { code: "US" } };
21
+ const out = resolveFilterBy(filterBy, currentItemData, readPath);
22
+ assert.deepEqual(out, { countryCode: "US", status: "active" });
23
+ });
24
+ test("resolveFilterBy drops $. paths when no current item data", () => {
25
+ const filterBy = { countryCode: "$.country.code", status: "active" };
26
+ const out = resolveFilterBy(filterBy, undefined, readPath);
27
+ assert.deepEqual(out, { status: "active" });
28
+ });
29
+ test("optionsFromStaticSource maps values to resolved options", () => {
30
+ const out = optionsFromStaticSource({
31
+ type: "static",
32
+ values: [{ value: "P0", label: "Critical", color: "red" }],
33
+ });
34
+ assert.deepEqual(out, [{ value: "P0", label: "Critical", color: "red" }]);
35
+ });
36
+ test("optionsFromCatalogItems extracts values via dot paths", () => {
37
+ const out = optionsFromCatalogItems({
38
+ items: [{ data: { code: "P0", label: "Critical" } }],
39
+ valueField: "code",
40
+ labelField: "label",
41
+ readPath,
42
+ });
43
+ assert.deepEqual(out, [{ value: "P0", label: "Critical" }]);
44
+ });
45
+ //# sourceMappingURL=field-source-resolution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-source-resolution.test.js","sourceRoot":"","sources":["../../../test/unit/field-source-resolution.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,8CAA8C,CAAC;AAEtD,SAAS,QAAQ,CAAC,GAAY,EAAE,IAAY;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,GAAG,GAAQ,GAAG,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,GAAG,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC7D,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,QAAQ,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrE,MAAM,eAAe,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IACjE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,QAAQ,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACrE,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,GAAG,GAAG,uBAAuB,CAAC;QAClC,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,GAAG,GAAG,uBAAuB,CAAC;QAClC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC;QACpD,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,OAAO;QACnB,QAAQ;KACT,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-and-diagrams.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-and-diagrams.test.d.ts","sourceRoot":"","sources":["../../../test/unit/markdown-and-diagrams.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { buildCatalogListMarkdownMap, renderCatalogListMarkdown, } from "../../src/markdown/render-list-markdown.js";
4
+ import { buildCatalogItemMarkdownMap, renderCatalogItemMarkdown, } from "../../src/markdown/render-item-markdown.js";
5
+ import { renderCatalogRelationsMermaid } from "../../src/diagrams/render-catalog-diagram.js";
6
+ import { renderItemRelationsMermaid } from "../../src/diagrams/render-item-diagram.js";
7
+ test("list markdown renderer produces a table", () => {
8
+ const map = {
9
+ catalogId: "orders",
10
+ label: "Orders",
11
+ items: [{ itemId: "1", data: { name: "A" }, title: "Order A" }],
12
+ resolvedSources: {},
13
+ filters: { active: {} },
14
+ sort: null,
15
+ pagination: { page: 1, pageSize: 10, hasMore: false },
16
+ selection: [],
17
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
18
+ context: { mode: "view", displayContext: "grid" },
19
+ actions: {},
20
+ };
21
+ const doc = buildCatalogListMarkdownMap(map, { maxRows: 10 });
22
+ const md = renderCatalogListMarkdown(doc);
23
+ assert.ok(md.includes("# Orders"));
24
+ assert.ok(md.includes("| itemId |"));
25
+ assert.ok(md.includes("| 1 |"));
26
+ });
27
+ test("item markdown renderer produces fields table", () => {
28
+ const map = {
29
+ catalogId: "orders",
30
+ itemId: "1",
31
+ item: { data: { name: "A" }, title: "Order A" },
32
+ resolvedSources: {},
33
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
34
+ context: { mode: "view", displayContext: "form" },
35
+ actions: {},
36
+ };
37
+ const doc = buildCatalogItemMarkdownMap(map, {});
38
+ const md = renderCatalogItemMarkdown(doc);
39
+ assert.ok(md.includes("# Order A"));
40
+ assert.ok(md.includes("| field | value |"));
41
+ });
42
+ test("catalog mermaid renderer escapes labels and uses flowchart", () => {
43
+ const mermaid = renderCatalogRelationsMermaid({
44
+ title: "t",
45
+ catalogs: [{ id: "order-statuses", label: "Order Statuses" }],
46
+ relations: [],
47
+ });
48
+ assert.ok(mermaid.startsWith("flowchart LR"));
49
+ assert.ok(mermaid.includes('order_statuses["Order Statuses"]'));
50
+ });
51
+ test("item mermaid renderer outputs edges with labels", () => {
52
+ const mermaid = renderItemRelationsMermaid({
53
+ title: "t",
54
+ items: [
55
+ { id: "orders:1", label: "Order 1" },
56
+ { id: "customers:2", label: "Customer 2" },
57
+ ],
58
+ relations: [{ from: "orders:1", to: "customers:2", label: "customer" }],
59
+ });
60
+ assert.ok(mermaid.includes('orders_1 -->|"customer"| customers_2'));
61
+ });
62
+ //# sourceMappingURL=markdown-and-diagrams.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-and-diagrams.test.js","sourceRoot":"","sources":["../../../test/unit/markdown-and-diagrams.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ui-spec-validation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-spec-validation.test.d.ts","sourceRoot":"","sources":["../../../test/unit/ui-spec-validation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { validateCatalogFilterSpec, validateCatalogPresentationSpec, validateCatalogCustomRenderer, validateCatalogListRenderMap, validateCatalogItemRenderMap, validateCatalogDescriptorUiSpec, } from "../../src/validation/index.js";
4
+ test("validateCatalogFilterSpec accepts minimal valid spec", () => {
5
+ const spec = {
6
+ filters: [
7
+ {
8
+ key: "status",
9
+ fieldPath: "status",
10
+ controlType: "select",
11
+ source: { type: "static", values: [{ value: "open", label: "Open" }] },
12
+ },
13
+ ],
14
+ };
15
+ const res = validateCatalogFilterSpec(spec);
16
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
17
+ });
18
+ test("validateCatalogFilterSpec rejects missing filters", () => {
19
+ const res = validateCatalogFilterSpec({});
20
+ assert.equal(res.isValid, false);
21
+ assert.ok(res.errors.length > 0);
22
+ });
23
+ test("validateCatalogPresentationSpec accepts minimal valid spec", () => {
24
+ const spec = {
25
+ fields: [{ fieldPath: "name", renderHint: "text" }],
26
+ grid: { columns: [{ fieldPath: "name" }] },
27
+ };
28
+ const res = validateCatalogPresentationSpec(spec);
29
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
30
+ });
31
+ test("validateCatalogCustomRenderer accepts registry entry", () => {
32
+ const spec = {
33
+ list: { component: "orders/custom-grid", receiveMap: "full" },
34
+ };
35
+ const res = validateCatalogCustomRenderer(spec);
36
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
37
+ });
38
+ test("validateCatalogListRenderMap accepts minimal map shape", () => {
39
+ const map = {
40
+ catalogId: "orders",
41
+ label: "Orders",
42
+ items: [{ itemId: "1", data: { name: "A" } }],
43
+ resolvedSources: {},
44
+ filters: { active: {} },
45
+ pagination: { page: 1, pageSize: 10, hasMore: false },
46
+ selection: [],
47
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
48
+ context: { mode: "view", displayContext: "grid" },
49
+ actions: {},
50
+ };
51
+ const res = validateCatalogListRenderMap(map);
52
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
53
+ });
54
+ test("validateCatalogItemRenderMap accepts minimal map shape", () => {
55
+ const map = {
56
+ catalogId: "orders",
57
+ itemId: "1",
58
+ item: { data: { name: "A" } },
59
+ resolvedSources: {},
60
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
61
+ context: { mode: "view", displayContext: "form" },
62
+ actions: {},
63
+ };
64
+ const res = validateCatalogItemRenderMap(map);
65
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
66
+ });
67
+ test("validateCatalogDescriptorUiSpec validates only present ui parts", () => {
68
+ const descriptor = {
69
+ catalogId: "orders",
70
+ label: "Orders",
71
+ filterSpec: { filters: [] },
72
+ presentationSpec: { fields: [] },
73
+ customRenderer: { list: { component: "orders/custom-grid" } },
74
+ };
75
+ const res = validateCatalogDescriptorUiSpec(descriptor);
76
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
77
+ });
78
+ //# sourceMappingURL=ui-spec-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-spec-validation.test.js","sourceRoot":"","sources":["../../../test/unit/ui-spec-validation.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/catalox",
3
- "version": "1.1.1",
3
+ "version": "2.0.0",
4
4
  "description": "Catalox: Firebase-native catalog metadata + unification package.",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -24,6 +24,9 @@
24
24
  "default": "./dist/index.js"
25
25
  }
26
26
  },
27
+ "bin": {
28
+ "catalox": "./dist/src/cli/index.js"
29
+ },
27
30
  "main": "./dist/index.js",
28
31
  "types": "./dist/index.d.ts",
29
32
  "files": [
@@ -40,8 +43,13 @@
40
43
  "lint": "node -e \"console.log('no lint configured')\""
41
44
  },
42
45
  "dependencies": {
46
+ "@x12i/helpers": "^1.2.4",
47
+ "ajv": "^8.18.0",
48
+ "ajv-formats": "^3.0.1",
49
+ "commander": "^14.0.0",
50
+ "dotenv": "^17.0.0",
43
51
  "firebase-admin": "^13.0.0",
44
- "@x12i/helpers": "^1.2.4"
52
+ "mongodb": "^6.0.0"
45
53
  },
46
54
  "devDependencies": {
47
55
  "@types/node": "^22.0.0",