@x12i/catalox 1.2.0 → 2.0.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.
Files changed (141) hide show
  1. package/README.md +424 -406
  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 +468 -5
  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 +12 -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 +151 -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/renderer-snippets.d.ts +32 -0
  62. package/dist/src/contracts/renderer-snippets.d.ts.map +1 -0
  63. package/dist/src/contracts/renderer-snippets.js +2 -0
  64. package/dist/src/contracts/renderer-snippets.js.map +1 -0
  65. package/dist/src/contracts/snapshots.d.ts +12 -0
  66. package/dist/src/contracts/snapshots.d.ts.map +1 -0
  67. package/dist/src/contracts/snapshots.js +2 -0
  68. package/dist/src/contracts/snapshots.js.map +1 -0
  69. package/dist/src/contracts/stores.d.ts +21 -0
  70. package/dist/src/contracts/stores.d.ts.map +1 -0
  71. package/dist/src/contracts/stores.js +2 -0
  72. package/dist/src/contracts/stores.js.map +1 -0
  73. package/dist/src/diagrams/render-catalog-diagram.d.ts +3 -0
  74. package/dist/src/diagrams/render-catalog-diagram.d.ts.map +1 -0
  75. package/dist/src/diagrams/render-catalog-diagram.js +27 -0
  76. package/dist/src/diagrams/render-catalog-diagram.js.map +1 -0
  77. package/dist/src/diagrams/render-item-diagram.d.ts +3 -0
  78. package/dist/src/diagrams/render-item-diagram.d.ts.map +1 -0
  79. package/dist/src/diagrams/render-item-diagram.js +26 -0
  80. package/dist/src/diagrams/render-item-diagram.js.map +1 -0
  81. package/dist/src/firebase/index.d.ts +2 -0
  82. package/dist/src/firebase/index.d.ts.map +1 -1
  83. package/dist/src/firebase/index.js +2 -0
  84. package/dist/src/firebase/index.js.map +1 -1
  85. package/dist/src/firebase/renderer-snippet-store.d.ts +12 -0
  86. package/dist/src/firebase/renderer-snippet-store.d.ts.map +1 -0
  87. package/dist/src/firebase/renderer-snippet-store.js +21 -0
  88. package/dist/src/firebase/renderer-snippet-store.js.map +1 -0
  89. package/dist/src/firebase/snapshot-store.d.ts +7 -0
  90. package/dist/src/firebase/snapshot-store.d.ts.map +1 -1
  91. package/dist/src/firebase/snapshot-store.js +30 -0
  92. package/dist/src/firebase/snapshot-store.js.map +1 -1
  93. package/dist/src/firebase/store-app-binding-store.d.ts +14 -0
  94. package/dist/src/firebase/store-app-binding-store.d.ts.map +1 -0
  95. package/dist/src/firebase/store-app-binding-store.js +36 -0
  96. package/dist/src/firebase/store-app-binding-store.js.map +1 -0
  97. package/dist/src/index.d.ts +5 -0
  98. package/dist/src/index.d.ts.map +1 -1
  99. package/dist/src/index.js +5 -0
  100. package/dist/src/index.js.map +1 -1
  101. package/dist/src/jsx/index.d.ts +66 -0
  102. package/dist/src/jsx/index.d.ts.map +1 -0
  103. package/dist/src/jsx/index.js +165 -0
  104. package/dist/src/jsx/index.js.map +1 -0
  105. package/dist/src/markdown/render-item-markdown.d.ts +5 -0
  106. package/dist/src/markdown/render-item-markdown.d.ts.map +1 -0
  107. package/dist/src/markdown/render-item-markdown.js +83 -0
  108. package/dist/src/markdown/render-item-markdown.js.map +1 -0
  109. package/dist/src/markdown/render-list-markdown.d.ts +5 -0
  110. package/dist/src/markdown/render-list-markdown.d.ts.map +1 -0
  111. package/dist/src/markdown/render-list-markdown.js +90 -0
  112. package/dist/src/markdown/render-list-markdown.js.map +1 -0
  113. package/dist/src/validation/index.d.ts +3 -1
  114. package/dist/src/validation/index.d.ts.map +1 -1
  115. package/dist/src/validation/index.js +2 -2
  116. package/dist/src/validation/index.js.map +1 -1
  117. package/dist/src/validation/ui-spec-schema.d.ts +20 -0
  118. package/dist/src/validation/ui-spec-schema.d.ts.map +1 -0
  119. package/dist/src/validation/ui-spec-schema.js +605 -0
  120. package/dist/src/validation/ui-spec-schema.js.map +1 -0
  121. package/dist/src/validation/ui-spec-validate.d.ts +20 -0
  122. package/dist/src/validation/ui-spec-validate.d.ts.map +1 -0
  123. package/dist/src/validation/ui-spec-validate.js +73 -0
  124. package/dist/src/validation/ui-spec-validate.js.map +1 -0
  125. package/dist/test/unit/field-source-resolution.test.d.ts +2 -0
  126. package/dist/test/unit/field-source-resolution.test.d.ts.map +1 -0
  127. package/dist/test/unit/field-source-resolution.test.js +45 -0
  128. package/dist/test/unit/field-source-resolution.test.js.map +1 -0
  129. package/dist/test/unit/jsx-snippets.test.d.ts +2 -0
  130. package/dist/test/unit/jsx-snippets.test.d.ts.map +1 -0
  131. package/dist/test/unit/jsx-snippets.test.js +35 -0
  132. package/dist/test/unit/jsx-snippets.test.js.map +1 -0
  133. package/dist/test/unit/markdown-and-diagrams.test.d.ts +2 -0
  134. package/dist/test/unit/markdown-and-diagrams.test.d.ts.map +1 -0
  135. package/dist/test/unit/markdown-and-diagrams.test.js +62 -0
  136. package/dist/test/unit/markdown-and-diagrams.test.js.map +1 -0
  137. package/dist/test/unit/ui-spec-validation.test.d.ts +2 -0
  138. package/dist/test/unit/ui-spec-validation.test.d.ts.map +1 -0
  139. package/dist/test/unit/ui-spec-validation.test.js +90 -0
  140. package/dist/test/unit/ui-spec-validation.test.js.map +1 -0
  141. package/package.json +16 -2
@@ -0,0 +1,20 @@
1
+ export type UiSpecValidationError = {
2
+ path: string;
3
+ message: string;
4
+ };
5
+ export type UiSpecValidationResult = {
6
+ isValid: boolean;
7
+ errors: UiSpecValidationError[];
8
+ };
9
+ export declare function validateCatalogFilterSpec(filterSpec: unknown): UiSpecValidationResult;
10
+ export declare function validateCatalogPresentationSpec(presentationSpec: unknown): UiSpecValidationResult;
11
+ export declare function validateCatalogCustomRenderer(customRenderer: unknown): UiSpecValidationResult;
12
+ export declare function validateCatalogRendererSnippetRecord(record: unknown): UiSpecValidationResult;
13
+ export declare function validateCatalogListRenderMap(map: unknown): UiSpecValidationResult;
14
+ export declare function validateCatalogItemRenderMap(map: unknown): UiSpecValidationResult;
15
+ /**
16
+ * Convenience validator for backoffice systems validating a persisted CatalogDescriptor.
17
+ * Only validates the optional UI-related portions if present.
18
+ */
19
+ export declare function validateCatalogDescriptorUiSpec(descriptor: unknown): UiSpecValidationResult;
20
+ //# sourceMappingURL=ui-spec-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-spec-validate.d.ts","sourceRoot":"","sources":["../../../src/validation/ui-spec-validate.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC,CAAC;AAkCF,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,OAAO,GAAG,sBAAsB,CAErF;AAED,wBAAgB,+BAA+B,CAAC,gBAAgB,EAAE,OAAO,GAAG,sBAAsB,CAEjG;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,OAAO,GAAG,sBAAsB,CAE7F;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,CAE5F;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAEjF;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAEjF;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,OAAO,GAAG,sBAAsB,CAsB3F"}
@@ -0,0 +1,73 @@
1
+ import AjvImport from "ajv";
2
+ import addFormatsImport from "ajv-formats";
3
+ import { catalogCustomRendererSchema, catalogFilterSpecSchema, catalogItemRenderMapSchema, catalogListRenderMapSchema, catalogPresentationSpecSchema, catalogRendererSnippetRecordSchema, } from "./ui-spec-schema.js";
4
+ function errorsFromAjv(errors) {
5
+ if (!errors?.length)
6
+ return [];
7
+ return errors.map((e) => ({
8
+ path: (e.instancePath || e.schemaPath || "").toString(),
9
+ message: (e.message || "invalid").toString(),
10
+ }));
11
+ }
12
+ function validateWith(validator, value) {
13
+ const isValid = Boolean(validator(value));
14
+ return { isValid, errors: isValid ? [] : errorsFromAjv(validator.errors) };
15
+ }
16
+ // Keep tolerant; schemas themselves restrict known unions and required keys.
17
+ const Ajv = AjvImport.default ?? AjvImport;
18
+ const addFormats = addFormatsImport.default ?? addFormatsImport;
19
+ const ajv = new Ajv({
20
+ allErrors: true,
21
+ strict: false,
22
+ allowUnionTypes: true,
23
+ });
24
+ addFormats(ajv);
25
+ const vFilterSpec = ajv.compile(catalogFilterSpecSchema);
26
+ const vPresentationSpec = ajv.compile(catalogPresentationSpecSchema);
27
+ const vCustomRenderer = ajv.compile(catalogCustomRendererSchema);
28
+ const vRendererSnippetRecord = ajv.compile(catalogRendererSnippetRecordSchema);
29
+ const vListRenderMap = ajv.compile(catalogListRenderMapSchema);
30
+ const vItemRenderMap = ajv.compile(catalogItemRenderMapSchema);
31
+ export function validateCatalogFilterSpec(filterSpec) {
32
+ return validateWith(vFilterSpec, filterSpec);
33
+ }
34
+ export function validateCatalogPresentationSpec(presentationSpec) {
35
+ return validateWith(vPresentationSpec, presentationSpec);
36
+ }
37
+ export function validateCatalogCustomRenderer(customRenderer) {
38
+ return validateWith(vCustomRenderer, customRenderer);
39
+ }
40
+ export function validateCatalogRendererSnippetRecord(record) {
41
+ return validateWith(vRendererSnippetRecord, record);
42
+ }
43
+ export function validateCatalogListRenderMap(map) {
44
+ return validateWith(vListRenderMap, map);
45
+ }
46
+ export function validateCatalogItemRenderMap(map) {
47
+ return validateWith(vItemRenderMap, map);
48
+ }
49
+ /**
50
+ * Convenience validator for backoffice systems validating a persisted CatalogDescriptor.
51
+ * Only validates the optional UI-related portions if present.
52
+ */
53
+ export function validateCatalogDescriptorUiSpec(descriptor) {
54
+ if (!descriptor || typeof descriptor !== "object") {
55
+ return { isValid: false, errors: [{ path: "", message: "descriptor must be an object" }] };
56
+ }
57
+ const d = descriptor;
58
+ const errors = [];
59
+ if (d.filterSpec != null) {
60
+ const r = validateCatalogFilterSpec(d.filterSpec);
61
+ errors.push(...r.errors.map((e) => ({ ...e, path: `filterSpec${e.path ? ":" + e.path : ""}` })));
62
+ }
63
+ if (d.presentationSpec != null) {
64
+ const r = validateCatalogPresentationSpec(d.presentationSpec);
65
+ errors.push(...r.errors.map((e) => ({ ...e, path: `presentationSpec${e.path ? ":" + e.path : ""}` })));
66
+ }
67
+ if (d.customRenderer != null) {
68
+ const r = validateCatalogCustomRenderer(d.customRenderer);
69
+ errors.push(...r.errors.map((e) => ({ ...e, path: `customRenderer${e.path ? ":" + e.path : ""}` })));
70
+ }
71
+ return { isValid: errors.length === 0, errors };
72
+ }
73
+ //# sourceMappingURL=ui-spec-validate.js.map
@@ -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=jsx-snippets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-snippets.test.d.ts","sourceRoot":"","sources":["../../../test/unit/jsx-snippets.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { transpileJsxToModuleSource, typecheckRendererSnippetIo, unsafeCreateRendererFunction } from "../../src/jsx/index.js";
4
+ test("transpileJsxToModuleSource returns ESM code", async () => {
5
+ const src = `export default function Renderer(){ return <div>Hello</div>; }`;
6
+ const code = await transpileJsxToModuleSource({ jsxSource: src, isTsx: true, sourceFileName: "snippet.tsx" });
7
+ assert.ok(code.includes("export"), "should contain export in transpiled output");
8
+ });
9
+ test("typecheckRendererSnippetIo accepts list component signature", async () => {
10
+ const src = `
11
+ export default function Renderer(props: { map: import("../contracts/render-map.js").CatalogListRenderMap }) {
12
+ return <div>{String(props.map.catalogId)}</div>;
13
+ }
14
+ `;
15
+ const res = await typecheckRendererSnippetIo({ jsxSource: src, surface: "list", strict: true });
16
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
17
+ });
18
+ test("typecheckRendererSnippetIo rejects wrong surface I/O", async () => {
19
+ const src = `
20
+ export default function Renderer(props: { map: import("../contracts/render-map.js").CatalogListRenderMap }) {
21
+ return <div>{String(props.map.catalogId)}</div>;
22
+ }
23
+ `;
24
+ const res = await typecheckRendererSnippetIo({ jsxSource: src, surface: "item", strict: true });
25
+ assert.equal(res.isValid, false);
26
+ assert.ok(res.errors.length > 0);
27
+ });
28
+ test("unsafeCreateRendererFunction can load module default export", async () => {
29
+ const src = `export default (props) => "ok";`;
30
+ const code = await transpileJsxToModuleSource({ jsxSource: src, isTsx: false });
31
+ const fn = await unsafeCreateRendererFunction({ transpiledModuleSource: code });
32
+ assert.equal(typeof fn, "function");
33
+ assert.equal(fn({}), "ok");
34
+ });
35
+ //# sourceMappingURL=jsx-snippets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-snippets.test.js","sourceRoot":"","sources":["../../../test/unit/jsx-snippets.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAE9H,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;IAC7D,MAAM,GAAG,GAAG,gEAAgE,CAAC;IAC7E,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9G,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,4CAA4C,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,GAAG,GAAG;;;;CAIb,CAAC;IACA,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACtE,MAAM,GAAG,GAAG;;;;CAIb,CAAC;IACA,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;IAC7E,MAAM,GAAG,GAAG,iCAAiC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,MAAM,EAAE,GAAQ,MAAM,4BAA4B,CAAC,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACpC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7B,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,90 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { validateCatalogFilterSpec, validateCatalogPresentationSpec, validateCatalogCustomRenderer, validateCatalogRendererSnippetRecord, 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("validateCatalogCustomRenderer accepts snippetRef entry", () => {
39
+ const spec = {
40
+ item: { snippetRef: { snippetId: "orders:item:v1", catalogScoped: true }, receiveMap: "minimal" },
41
+ };
42
+ const res = validateCatalogCustomRenderer(spec);
43
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
44
+ });
45
+ test("validateCatalogRendererSnippetRecord accepts minimal record", () => {
46
+ const rec = { catalogId: "orders", surface: "list", jsxSource: "export default () => <div/>" };
47
+ const res = validateCatalogRendererSnippetRecord(rec);
48
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
49
+ });
50
+ test("validateCatalogListRenderMap accepts minimal map shape", () => {
51
+ const map = {
52
+ catalogId: "orders",
53
+ label: "Orders",
54
+ items: [{ itemId: "1", data: { name: "A" } }],
55
+ resolvedSources: {},
56
+ filters: { active: {} },
57
+ pagination: { page: 1, pageSize: 10, hasMore: false },
58
+ selection: [],
59
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
60
+ context: { mode: "view", displayContext: "grid" },
61
+ actions: {},
62
+ };
63
+ const res = validateCatalogListRenderMap(map);
64
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
65
+ });
66
+ test("validateCatalogItemRenderMap accepts minimal map shape", () => {
67
+ const map = {
68
+ catalogId: "orders",
69
+ itemId: "1",
70
+ item: { data: { name: "A" } },
71
+ resolvedSources: {},
72
+ capabilities: { canList: true, canGet: true, canCreate: false, canEdit: false, canDelete: false },
73
+ context: { mode: "view", displayContext: "form" },
74
+ actions: {},
75
+ };
76
+ const res = validateCatalogItemRenderMap(map);
77
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
78
+ });
79
+ test("validateCatalogDescriptorUiSpec validates only present ui parts", () => {
80
+ const descriptor = {
81
+ catalogId: "orders",
82
+ label: "Orders",
83
+ filterSpec: { filters: [] },
84
+ presentationSpec: { fields: [] },
85
+ customRenderer: { list: { component: "orders/custom-grid" } },
86
+ };
87
+ const res = validateCatalogDescriptorUiSpec(descriptor);
88
+ assert.equal(res.isValid, true, JSON.stringify(res.errors, null, 2));
89
+ });
90
+ //# 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.2.0",
3
+ "version": "2.0.1",
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,19 @@
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",
51
+ "esbuild": "^0.25.0",
43
52
  "firebase-admin": "^13.0.0",
44
- "@x12i/helpers": "^1.2.4"
53
+ "mongodb": "^6.0.0"
54
+ },
55
+ "optionalDependencies": {
56
+ "react": "^19.0.0",
57
+ "react-dom": "^19.0.0",
58
+ "typescript": "^5.0.0"
45
59
  },
46
60
  "devDependencies": {
47
61
  "@types/node": "^22.0.0",