@lssm/example.integration-hub 0.0.0-canary-20251221114240 → 0.0.0-canary-20251221144710
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/dist/connection/connection.enum.d.ts +2 -2
- package/dist/connection/connection.operation.d.ts +27 -27
- package/dist/connection/connection.operation.js +2 -1
- package/dist/connection/connection.operation.js.map +1 -1
- package/dist/connection/connection.schema.d.ts +16 -16
- package/dist/integration/integration.contracts.d.ts +25 -25
- package/dist/integration/integration.contracts.js +2 -1
- package/dist/integration/integration.contracts.js.map +1 -1
- package/dist/integration/integration.enum.d.ts +2 -2
- package/dist/integration/integration.schema.d.ts +16 -16
- package/dist/libs/contracts/dist/_virtual/rolldown_runtime.js +6 -0
- package/dist/libs/contracts/dist/_virtual/rolldown_runtime.js.map +1 -0
- package/dist/libs/contracts/dist/capabilities/index.js +1 -0
- package/dist/libs/contracts/dist/client/react/feature-render.js +2 -1
- package/dist/libs/contracts/dist/client/react/form-render.js +1 -0
- package/dist/libs/contracts/dist/data-views/data-views.js +1 -0
- package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +2 -2
- package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -1
- package/dist/libs/contracts/dist/features.js +1 -0
- package/dist/libs/contracts/dist/forms/forms.js +1 -0
- package/dist/libs/contracts/dist/index.js +23 -9
- package/dist/libs/contracts/dist/index.js.map +1 -0
- package/dist/libs/contracts/dist/install.js +1 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +2 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js.map +1 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +2 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js.map +1 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +2 -1
- package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js.map +1 -1
- package/dist/libs/contracts/dist/integrations/{contracts.js → operations.js} +4 -3
- package/dist/libs/contracts/dist/integrations/operations.js.map +1 -0
- package/dist/libs/contracts/dist/knowledge/{contracts.js → operations.js} +4 -3
- package/dist/libs/contracts/dist/knowledge/operations.js.map +1 -0
- package/dist/libs/contracts/dist/llm/exporters.js +1 -0
- package/dist/libs/contracts/dist/llm/exporters.js.map +1 -1
- package/dist/libs/contracts/dist/onboarding-base.js +2 -1
- package/dist/libs/contracts/dist/onboarding-base.js.map +1 -1
- package/dist/libs/contracts/dist/operations/index.js +2 -0
- package/dist/libs/contracts/dist/{operation.js → operations/operation.js} +1 -1
- package/dist/libs/contracts/dist/operations/operation.js.map +1 -0
- package/dist/libs/contracts/dist/operations/registry.js +2 -0
- package/dist/libs/contracts/dist/presentations/index.js +2 -0
- package/dist/libs/contracts/dist/presentations/presentations.js +2 -0
- package/dist/libs/contracts/dist/{presentations.v2.js → presentations/transform-engine.js} +2 -2
- package/dist/libs/contracts/dist/presentations/transform-engine.js.map +1 -0
- package/dist/libs/contracts/dist/registry-utils.js +24 -0
- package/dist/libs/contracts/dist/registry-utils.js.map +1 -0
- package/dist/libs/contracts/dist/server/mcp/registerPresentations.js +3 -2
- package/dist/libs/contracts/dist/workflow/index.js +1 -0
- package/dist/libs/contracts/dist/workflow/spec.js +1 -0
- package/dist/libs/contracts/dist/workspace-config/contractsrc-schema.js +25 -1
- package/dist/libs/contracts/dist/workspace-config/contractsrc-schema.js.map +1 -1
- package/dist/sync/sync.contracts.d.ts +125 -125
- package/dist/sync/sync.contracts.js +2 -1
- package/dist/sync/sync.contracts.js.map +1 -1
- package/dist/sync/sync.enum.d.ts +4 -4
- package/dist/sync/sync.enum.d.ts.map +1 -1
- package/dist/sync/sync.schema.d.ts +85 -85
- package/package.json +12 -12
- package/dist/libs/contracts/dist/integrations/contracts.js.map +0 -1
- package/dist/libs/contracts/dist/knowledge/contracts.js.map +0 -1
- package/dist/libs/contracts/dist/operation.js.map +0 -1
- package/dist/libs/contracts/dist/presentations.js +0 -1
- package/dist/libs/contracts/dist/presentations.v2.js.map +0 -1
- package/dist/libs/contracts/dist/registry.js +0 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "react";
|
|
2
2
|
import TurndownService from "turndown";
|
|
3
3
|
|
|
4
|
-
//#region ../../libs/contracts/dist/presentations.
|
|
4
|
+
//#region ../../libs/contracts/dist/presentations/transform-engine.js
|
|
5
5
|
/**
|
|
6
6
|
* Pluggable transform engine that renders descriptors to various targets
|
|
7
7
|
* and runs validators (e.g., basic metadata checks, PII redaction policies).
|
|
@@ -9,4 +9,4 @@ import TurndownService from "turndown";
|
|
|
9
9
|
const turndown = new TurndownService();
|
|
10
10
|
|
|
11
11
|
//#endregion
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=transform-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-engine.js","names":[],"sources":["../../../../../../../libs/contracts/dist/presentations/transform-engine.js"],"sourcesContent":["import { schemaToMarkdown } from \"../schema-to-markdown.js\";\nimport React from \"react\";\nimport TurndownService from \"turndown\";\n\n//#region src/presentations/transform-engine.ts\n/**\n* Pluggable transform engine that renders descriptors to various targets\n* and runs validators (e.g., basic metadata checks, PII redaction policies).\n*/\nconst turndown = new TurndownService();\nfunction renderTextNode(node) {\n\tconst text = node.text ?? \"\";\n\tif (!node.marks || node.marks.length === 0) return text;\n\treturn node.marks.reduce((acc, mark) => {\n\t\tswitch (mark.type) {\n\t\t\tcase \"bold\": return `**${acc}**`;\n\t\t\tcase \"italic\": return `*${acc}*`;\n\t\t\tcase \"underline\": return `__${acc}__`;\n\t\t\tcase \"strike\": return `~~${acc}~~`;\n\t\t\tcase \"code\": return `\\`${acc}\\``;\n\t\t\tcase \"link\": {\n\t\t\t\tconst href = mark.attrs?.href ?? \"\";\n\t\t\t\treturn href ? `[${acc}](${href})` : acc;\n\t\t\t}\n\t\t\tdefault: return acc;\n\t\t}\n\t}, text);\n}\nfunction renderInline(nodes) {\n\tif (!nodes?.length) return \"\";\n\treturn nodes.map((child) => renderNode(child)).join(\"\");\n}\nfunction renderList(nodes, ordered = false) {\n\tif (!nodes?.length) return \"\";\n\tlet counter = 1;\n\treturn nodes.map((item) => {\n\t\tconst body = renderInline(item.content ?? []);\n\t\tif (!body) return \"\";\n\t\treturn `${ordered ? `${counter++}. ` : \"- \"}${body}`;\n\t}).filter(Boolean).join(\"\\n\");\n}\nfunction renderNode(node) {\n\tswitch (node.type) {\n\t\tcase \"doc\": return renderInline(node.content);\n\t\tcase \"paragraph\": {\n\t\t\tconst text = renderInline(node.content);\n\t\t\treturn text.trim().length ? text : \"\";\n\t\t}\n\t\tcase \"heading\": {\n\t\t\tconst levelAttr = node.attrs?.level;\n\t\t\tconst levelVal = typeof levelAttr === \"number\" ? levelAttr : 1;\n\t\t\tconst level = Math.min(Math.max(levelVal, 1), 6);\n\t\t\treturn `${\"#\".repeat(level)} ${renderInline(node.content)}`.trim();\n\t\t}\n\t\tcase \"bullet_list\": return renderList(node.content, false);\n\t\tcase \"ordered_list\": return renderList(node.content, true);\n\t\tcase \"list_item\": return renderInline(node.content);\n\t\tcase \"blockquote\": return renderInline(node.content).split(\"\\n\").map((line) => `> ${line}`).join(\"\\n\");\n\t\tcase \"code_block\": {\n\t\t\tconst body = renderInline(node.content);\n\t\t\treturn body ? `\\`\\`\\`\\n${body}\\n\\`\\`\\`` : \"\";\n\t\t}\n\t\tcase \"horizontal_rule\": return \"---\";\n\t\tcase \"hard_break\": return \"\\n\";\n\t\tcase \"text\": return renderTextNode(node);\n\t\tdefault:\n\t\t\tif (node.text) return renderTextNode(node);\n\t\t\treturn \"\";\n\t}\n}\nfunction blockNoteToMarkdown(docJson) {\n\tif (typeof docJson === \"string\") return docJson;\n\tif (docJson && typeof docJson === \"object\" && \"html\" in docJson) {\n\t\tconst html = String(docJson.html);\n\t\treturn turndown.turndown(html);\n\t}\n\tconst root = docJson;\n\tif (root?.type === \"doc\" || root?.content) return (root.content ?? []).map((n) => renderNode(n)).filter(Boolean).join(\"\\n\\n\").trim();\n\ttry {\n\t\treturn JSON.stringify(docJson, null, 2);\n\t} catch {\n\t\treturn String(docJson);\n\t}\n}\nvar TransformEngine = class {\n\trenderers = /* @__PURE__ */ new Map();\n\tvalidators = [];\n\tregister(renderer) {\n\t\tconst arr = this.renderers.get(renderer.target) ?? [];\n\t\tarr.push(renderer);\n\t\tthis.renderers.set(renderer.target, arr);\n\t\treturn this;\n\t}\n\t/**\n\t* Register a renderer that will be tried BEFORE existing renderers for the same target.\n\t* Useful for custom renderers that should take priority over default ones.\n\t*/\n\tprependRegister(renderer) {\n\t\tconst arr = this.renderers.get(renderer.target) ?? [];\n\t\tarr.unshift(renderer);\n\t\tthis.renderers.set(renderer.target, arr);\n\t\treturn this;\n\t}\n\taddValidator(v) {\n\t\tthis.validators.push(v);\n\t\treturn this;\n\t}\n\tasync render(target, desc, ctx) {\n\t\tif (!desc.targets.includes(target)) throw new Error(`Target ${target} not declared for ${desc.meta.name}.v${desc.meta.version}`);\n\t\tfor (const v of this.validators) await v.validate(desc, target, ctx);\n\t\tconst arr = this.renderers.get(target) ?? [];\n\t\tfor (const r of arr) try {\n\t\t\treturn await r.render(desc, ctx);\n\t\t} catch (_e) {}\n\t\tthrow new Error(`No renderer available for ${target}`);\n\t}\n};\n/** Create a TransformEngine instance with default markdown/json/xml renderers. */\nfunction createDefaultTransformEngine() {\n\tconst engine = new TransformEngine();\n\tconst applyPii = (desc, obj) => {\n\t\tconst clone = JSON.parse(JSON.stringify(obj));\n\t\tconst paths = desc.policy?.pii ?? [];\n\t\tconst setAtPath = (root, path) => {\n\t\t\tconst segs = path.replace(/^\\//, \"\").replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\").filter(Boolean);\n\t\t\tlet cur = root;\n\t\t\tfor (let i = 0; i < segs.length - 1; i++) {\n\t\t\t\tconst k = segs[i];\n\t\t\t\tif (!k) continue;\n\t\t\t\tif (cur && typeof cur === \"object\" && k in cur) cur = cur[k];\n\t\t\t\telse return;\n\t\t\t}\n\t\t\tconst last = segs[segs.length - 1];\n\t\t\tif (cur && typeof cur === \"object\" && last && last in cur) cur[last] = \"[REDACTED]\";\n\t\t};\n\t\tfor (const p of paths) setAtPath(clone, p);\n\t\treturn clone;\n\t};\n\tengine.register({\n\t\ttarget: \"markdown\",\n\t\tasync render(desc, ctx) {\n\t\t\tlet data = ctx?.data;\n\t\t\tif (!data && ctx?.fetchData) data = await ctx.fetchData();\n\t\t\tif (desc.source.type === \"component\" && desc.source.props && data !== void 0) {\n\t\t\t\tconst isArray = Array.isArray(data);\n\t\t\t\tconst isSimpleObject = !isArray && typeof data === \"object\" && data !== null && !Object.values(data).some((v) => Array.isArray(v) || typeof v === \"object\" && v !== null);\n\t\t\t\tif (isArray || isSimpleObject) return {\n\t\t\t\t\tmimeType: \"text/markdown\",\n\t\t\t\t\tbody: schemaToMarkdown(desc.source.props, data, {\n\t\t\t\t\t\ttitle: desc.meta.description ?? desc.meta.name,\n\t\t\t\t\t\tdescription: `${desc.meta.name} v${desc.meta.version}`\n\t\t\t\t\t})\n\t\t\t\t};\n\t\t\t\tthrow new Error(`Complex data structure for ${desc.meta.name} - expecting custom renderer`);\n\t\t\t}\n\t\t\tif (desc.source.type === \"blocknotejs\") {\n\t\t\t\tconst redacted = applyPii(desc, { text: blockNoteToMarkdown(desc.source.docJson) });\n\t\t\t\treturn {\n\t\t\t\t\tmimeType: \"text/markdown\",\n\t\t\t\t\tbody: String(redacted.text)\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (desc.source.type === \"component\" && data !== void 0) throw new Error(`No schema (source.props) available for ${desc.meta.name} - expecting custom renderer`);\n\t\t\tif (desc.source.type === \"component\") return {\n\t\t\t\tmimeType: \"text/markdown\",\n\t\t\t\tbody: `${`# ${desc.meta.name} v${desc.meta.version}`}${desc.meta.description ? `\\n\\n${desc.meta.description}` : \"\"}${desc.meta.tags && desc.meta.tags.length ? `\\n\\nTags: ${desc.meta.tags.join(\", \")}` : \"\"}${desc.meta.owners && desc.meta.owners.length ? `\\n\\nOwners: ${desc.meta.owners.join(\", \")}` : \"\"}${`\\n\\nComponent: \\`${desc.source.componentKey}\\``}${desc.policy?.pii?.length ? `\\n\\nRedacted paths: ${desc.policy.pii.map((p) => `\\`${p}\\``).join(\", \")}` : \"\"}`\n\t\t\t};\n\t\t\tthrow new Error(\"unsupported\");\n\t\t}\n\t});\n\tengine.register({\n\t\ttarget: \"application/json\",\n\t\tasync render(desc) {\n\t\t\tconst payload = applyPii(desc, {\n\t\t\t\tmeta: desc.meta,\n\t\t\t\tsource: desc.source\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tmimeType: \"application/json\",\n\t\t\t\tbody: JSON.stringify(payload, null, 2)\n\t\t\t};\n\t\t}\n\t});\n\tengine.register({\n\t\ttarget: \"application/xml\",\n\t\tasync render(desc) {\n\t\t\tconst json = applyPii(desc, {\n\t\t\t\tmeta: desc.meta,\n\t\t\t\tsource: desc.source\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tmimeType: \"application/xml\",\n\t\t\t\tbody: `<presentation name=\"${desc.meta.name}\" version=\"${desc.meta.version}\"><json>${encodeURIComponent(JSON.stringify(json))}</json></presentation>`\n\t\t\t};\n\t\t}\n\t});\n\treturn engine;\n}\n/** Register a default React target renderer that returns a serializable descriptor. */\nfunction registerDefaultReactRenderer(engine) {\n\tengine.register({\n\t\ttarget: \"react\",\n\t\tasync render(desc) {\n\t\t\tif (desc.source.type === \"component\") {\n\t\t\t\tconst props = desc.source.props ? desc.source.props.getZod().safeParse({}).success ? {} : void 0 : void 0;\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"react_component\",\n\t\t\t\t\tcomponentKey: desc.source.componentKey,\n\t\t\t\t\tprops\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: \"blocknotejs\",\n\t\t\t\tdocJson: desc.source.docJson,\n\t\t\t\tblockConfig: desc.source.blockConfig\n\t\t\t};\n\t\t}\n\t});\n\treturn engine;\n}\n/**\n* Add basic validators (e.g., meta.description presence) to the engine.\n*/\nfunction registerBasicValidation(engine) {\n\tengine.addValidator({ validate(desc) {\n\t\tif (!desc.meta.description || desc.meta.description.length < 3) throw new Error(`Presentation ${desc.meta.name}.v${desc.meta.version} missing meta.description`);\n\t} });\n\treturn engine;\n}\n/**\n* Register a React-to-markdown renderer that renders React components to HTML\n* and converts them to markdown using turndown.\n* This renderer takes priority over the default metadata-only renderer.\n*/\nfunction registerReactToMarkdownRenderer(engine, componentMap) {\n\tconst turndownService = new TurndownService({\n\t\theadingStyle: \"atx\",\n\t\tcodeBlockStyle: \"fenced\",\n\t\tbulletListMarker: \"-\"\n\t});\n\tturndownService.addRule(\"link\", {\n\t\tfilter: \"a\",\n\t\treplacement: (content, node) => {\n\t\t\tconst href = node.href;\n\t\t\tif (href && content) return `[${content}](${href})`;\n\t\t\treturn content || \"\";\n\t\t}\n\t});\n\tengine.prependRegister({\n\t\ttarget: \"markdown\",\n\t\tasync render(desc, _ctx) {\n\t\t\tif (desc.source.type !== \"component\") throw new Error(\"React-to-markdown renderer only handles component presentations\");\n\t\t\tconst { renderToStaticMarkup } = await import(\"react-dom/server\");\n\t\t\tconst Component = componentMap[desc.source.componentKey];\n\t\t\tif (!Component) throw new Error(`Component ${desc.source.componentKey} not found in componentMap`);\n\t\t\tlet html;\n\t\t\ttry {\n\t\t\t\thtml = renderToStaticMarkup(React.createElement(Component, desc.source.props ? {} : void 0));\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`Failed to render component ${desc.source.componentKey}: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t\t}\n\t\t\tlet markdown;\n\t\t\ttry {\n\t\t\t\tmarkdown = turndownService.turndown(html);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new Error(`Failed to convert HTML to markdown: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n\t\t\t}\n\t\t\tif (desc.policy?.pii && desc.policy.pii.length > 0) return {\n\t\t\t\tmimeType: \"text/markdown\",\n\t\t\t\tbody: markdown.replace(/\\[REDACTED\\]/g, \"[REDACTED]\")\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tmimeType: \"text/markdown\",\n\t\t\t\tbody: markdown\n\t\t\t};\n\t\t}\n\t});\n\treturn engine;\n}\n\n//#endregion\nexport { TransformEngine, createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer, registerReactToMarkdownRenderer };"],"mappings":";;;;;;;;AASA,MAAM,WAAW,IAAI,iBAAiB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { __esmMin } from "./_virtual/rolldown_runtime.js";
|
|
2
|
+
|
|
3
|
+
//#region ../../libs/contracts/dist/registry-utils.js
|
|
4
|
+
var GroupingStrategies;
|
|
5
|
+
var init_registry_utils = __esmMin(() => {
|
|
6
|
+
GroupingStrategies = {
|
|
7
|
+
byTag: (item) => item.meta.tags?.[0] ?? "untagged",
|
|
8
|
+
byAllTags: (item) => item.meta.tags?.length ? item.meta.tags : ["untagged"],
|
|
9
|
+
byOwner: (item) => item.meta.owners?.[0] ?? "unowned",
|
|
10
|
+
byDomain: (item) => {
|
|
11
|
+
return (item.meta.name ?? item.meta.key ?? "").split(".")[0] ?? "default";
|
|
12
|
+
},
|
|
13
|
+
byStability: (item) => item.meta.stability ?? "stable",
|
|
14
|
+
byUrlPath: (level) => (item) => {
|
|
15
|
+
if (!item.path) return "root";
|
|
16
|
+
return item.path.split("/").filter(Boolean).slice(0, level).join("/") || "root";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
init_registry_utils();
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { GroupingStrategies, init_registry_utils };
|
|
24
|
+
//# sourceMappingURL=registry-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-utils.js","names":[],"sources":["../../../../../../libs/contracts/dist/registry-utils.js"],"sourcesContent":["import { __esmMin, __export } from \"./_virtual/rolldown_runtime.js\";\n\n//#region src/registry-utils.ts\nvar registry_utils_exports = /* @__PURE__ */ __export({\n\tGroupingStrategies: () => GroupingStrategies,\n\tfilterBy: () => filterBy,\n\tgetUniqueDomains: () => getUniqueDomains,\n\tgetUniqueOwners: () => getUniqueOwners,\n\tgetUniqueTags: () => getUniqueTags,\n\tgroupBy: () => groupBy,\n\tgroupByMultiple: () => groupByMultiple,\n\tgroupByToArray: () => groupByToArray\n});\n/**\n* Filter items by criteria.\n* All criteria are combined with AND logic.\n*/\nfunction filterBy(items, filter) {\n\treturn items.filter((item) => {\n\t\tif (filter.tags?.length) {\n\t\t\tif (!filter.tags.some((tag) => item.meta.tags?.includes(tag))) return false;\n\t\t}\n\t\tif (filter.owners?.length) {\n\t\t\tif (!filter.owners.some((owner) => item.meta.owners?.includes(owner))) return false;\n\t\t}\n\t\tif (filter.stability?.length) {\n\t\t\tif (!filter.stability.includes(item.meta.stability ?? \"stable\")) return false;\n\t\t}\n\t\tif (filter.domain) {\n\t\t\tif (GroupingStrategies.byDomain(item) !== filter.domain) return false;\n\t\t}\n\t\tif (filter.namePattern) {\n\t\t\tconst name = item.meta.name ?? item.meta.key ?? \"\";\n\t\t\tconst pattern = filter.namePattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\");\n\t\t\tif (!new RegExp(`^${pattern}$`, \"i\").test(name)) return false;\n\t\t}\n\t\treturn true;\n\t});\n}\n/**\n* Group items by key function.\n*/\nfunction groupBy(items, keyFn) {\n\tconst groups = /* @__PURE__ */ new Map();\n\tfor (const item of items) {\n\t\tconst key = keyFn(item);\n\t\tconst existing = groups.get(key);\n\t\tif (existing) existing.push(item);\n\t\telse groups.set(key, [item]);\n\t}\n\treturn groups;\n}\n/**\n* Group items by key function, returning array format.\n*/\nfunction groupByToArray(items, keyFn) {\n\tconst map = groupBy(items, keyFn);\n\treturn Array.from(map.entries()).map(([key, items$1]) => ({\n\t\tkey,\n\t\titems: items$1\n\t}));\n}\n/**\n* Group items where one item can belong to multiple groups.\n* Useful for byAllTags grouping.\n*/\nfunction groupByMultiple(items, keysFn) {\n\tconst groups = /* @__PURE__ */ new Map();\n\tfor (const item of items) {\n\t\tconst keys = keysFn(item);\n\t\tfor (const key of keys) {\n\t\t\tconst existing = groups.get(key);\n\t\t\tif (existing) existing.push(item);\n\t\t\telse groups.set(key, [item]);\n\t\t}\n\t}\n\treturn groups;\n}\n/**\n* Get unique tags from a collection of items.\n*/\nfunction getUniqueTags(items) {\n\tconst tags = /* @__PURE__ */ new Set();\n\tfor (const item of items) for (const tag of item.meta.tags ?? []) tags.add(tag);\n\treturn Array.from(tags).sort();\n}\n/**\n* Get unique owners from a collection of items.\n*/\nfunction getUniqueOwners(items) {\n\tconst owners = /* @__PURE__ */ new Set();\n\tfor (const item of items) for (const owner of item.meta.owners ?? []) owners.add(owner);\n\treturn Array.from(owners).sort();\n}\n/**\n* Get unique domains from a collection of items.\n*/\nfunction getUniqueDomains(items) {\n\tconst domains = /* @__PURE__ */ new Set();\n\tfor (const item of items) domains.add(GroupingStrategies.byDomain(item));\n\treturn Array.from(domains).sort();\n}\nvar GroupingStrategies;\nvar init_registry_utils = __esmMin(() => {\n\tGroupingStrategies = {\n\t\tbyTag: (item) => item.meta.tags?.[0] ?? \"untagged\",\n\t\tbyAllTags: (item) => item.meta.tags?.length ? item.meta.tags : [\"untagged\"],\n\t\tbyOwner: (item) => item.meta.owners?.[0] ?? \"unowned\",\n\t\tbyDomain: (item) => {\n\t\t\treturn (item.meta.name ?? item.meta.key ?? \"\").split(\".\")[0] ?? \"default\";\n\t\t},\n\t\tbyStability: (item) => item.meta.stability ?? \"stable\",\n\t\tbyUrlPath: (level) => (item) => {\n\t\t\tif (!item.path) return \"root\";\n\t\t\treturn item.path.split(\"/\").filter(Boolean).slice(0, level).join(\"/\") || \"root\";\n\t\t}\n\t};\n});\n\n//#endregion\ninit_registry_utils();\nexport { GroupingStrategies, filterBy, getUniqueDomains, getUniqueOwners, getUniqueTags, groupBy, groupByMultiple, groupByToArray, init_registry_utils, registry_utils_exports };"],"mappings":";;;AAsGA,IAAI;AACJ,IAAI,sBAAsB,eAAe;AACxC,sBAAqB;EACpB,QAAQ,SAAS,KAAK,KAAK,OAAO,MAAM;EACxC,YAAY,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,OAAO,CAAC,WAAW;EAC3E,UAAU,SAAS,KAAK,KAAK,SAAS,MAAM;EAC5C,WAAW,SAAS;AACnB,WAAQ,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM;;EAEjE,cAAc,SAAS,KAAK,KAAK,aAAa;EAC9C,YAAY,WAAW,SAAS;AAC/B,OAAI,CAAC,KAAK,KAAM,QAAO;AACvB,UAAO,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI;;EAE1E;EACA;AAGF,qBAAqB"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import "../../presentations.
|
|
2
|
-
import "../../presentations.js";
|
|
1
|
+
import "../../presentations/transform-engine.js";
|
|
2
|
+
import "../../presentations/presentations.js";
|
|
3
|
+
import "../../presentations/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "../registry-utils.js";
|
|
@@ -55,6 +55,26 @@ const OpenApiConfigSchema = z$1.object({
|
|
|
55
55
|
export: OpenApiExportConfigSchema.optional()
|
|
56
56
|
});
|
|
57
57
|
/**
|
|
58
|
+
* Grouping strategy for organizing specs.
|
|
59
|
+
*/
|
|
60
|
+
const GroupingStrategySchema = z$1.enum([
|
|
61
|
+
"by-tag",
|
|
62
|
+
"by-owner",
|
|
63
|
+
"by-domain",
|
|
64
|
+
"by-url-path-single",
|
|
65
|
+
"by-url-path-multi",
|
|
66
|
+
"by-feature",
|
|
67
|
+
"none"
|
|
68
|
+
]);
|
|
69
|
+
/**
|
|
70
|
+
* Grouping rule configuration.
|
|
71
|
+
*/
|
|
72
|
+
const GroupingRuleSchema = z$1.object({
|
|
73
|
+
strategy: GroupingStrategySchema,
|
|
74
|
+
urlPathLevel: z$1.number().optional(),
|
|
75
|
+
pattern: z$1.string().optional()
|
|
76
|
+
});
|
|
77
|
+
/**
|
|
58
78
|
* Output directory conventions for generated specs.
|
|
59
79
|
*/
|
|
60
80
|
const FolderConventionsSchema = z$1.object({
|
|
@@ -62,7 +82,11 @@ const FolderConventionsSchema = z$1.object({
|
|
|
62
82
|
operations: z$1.string().default("operations/commands|queries"),
|
|
63
83
|
events: z$1.string().default("events"),
|
|
64
84
|
presentations: z$1.string().default("presentations"),
|
|
65
|
-
forms: z$1.string().default("forms")
|
|
85
|
+
forms: z$1.string().default("forms"),
|
|
86
|
+
groupByFeature: z$1.boolean().default(true),
|
|
87
|
+
operationsGrouping: GroupingRuleSchema.optional(),
|
|
88
|
+
modelsGrouping: GroupingRuleSchema.optional(),
|
|
89
|
+
eventsGrouping: GroupingRuleSchema.optional()
|
|
66
90
|
});
|
|
67
91
|
/**
|
|
68
92
|
* Full ContractSpec configuration schema (.contractsrc.json).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractsrc-schema.js","names":[],"sources":["../../../../../../../libs/contracts/dist/workspace-config/contractsrc-schema.js"],"sourcesContent":["import * as z$1 from \"zod\";\n\n//#region src/workspace-config/contractsrc-schema.ts\n/**\n* ContractSpec configuration schema definitions.\n*\n* These schemas define the structure of .contractsrc.json files\n* and are shared across CLI tools and libraries.\n*/\n/**\n* OpenAPI source configuration for import/sync/validate operations.\n*/\nconst OpenApiSourceConfigSchema = z$1.object({\n\tname: z$1.string(),\n\turl: z$1.url().optional(),\n\tfile: z$1.string().optional(),\n\tsyncMode: z$1.enum([\n\t\t\"import\",\n\t\t\"sync\",\n\t\t\"validate\"\n\t]).default(\"validate\"),\n\ttags: z$1.array(z$1.string()).optional(),\n\texclude: z$1.array(z$1.string()).optional(),\n\tinclude: z$1.array(z$1.string()).optional(),\n\tprefix: z$1.string().optional(),\n\tdefaultStability: z$1.enum([\n\t\t\"experimental\",\n\t\t\"beta\",\n\t\t\"stable\",\n\t\t\"deprecated\"\n\t]).optional(),\n\tdefaultAuth: z$1.enum([\n\t\t\"anonymous\",\n\t\t\"user\",\n\t\t\"admin\"\n\t]).optional(),\n\tdefaultOwners: z$1.array(z$1.string()).optional()\n});\nconst OpenApiExportConfigSchema = z$1.object({\n\toutputPath: z$1.string().default(\"./openapi.json\"),\n\tformat: z$1.enum([\"json\", \"yaml\"]).default(\"json\"),\n\ttitle: z$1.string().optional(),\n\tversion: z$1.string().optional(),\n\tdescription: z$1.string().optional(),\n\tservers: z$1.array(z$1.object({\n\t\turl: z$1.string(),\n\t\tdescription: z$1.string().optional()\n\t})).optional()\n});\n/**\n* OpenAPI configuration section.\n*/\nconst OpenApiConfigSchema = z$1.object({\n\tsources: z$1.array(OpenApiSourceConfigSchema).optional(),\n\texport: OpenApiExportConfigSchema.optional()\n});\n/**\n* Output directory conventions for generated specs.\n*/\nconst FolderConventionsSchema = z$1.object({\n\tmodels: z$1.string().default(\"models\"),\n\toperations: z$1.string().default(\"operations/commands|queries\"),\n\tevents: z$1.string().default(\"events\"),\n\tpresentations: z$1.string().default(\"presentations\"),\n\tforms: z$1.string().default(\"forms\")\n});\n/**\n* Full ContractSpec configuration schema (.contractsrc.json).\n*/\nconst ContractsrcSchema = z$1.object({\n\taiProvider: z$1.enum([\n\t\t\"claude\",\n\t\t\"openai\",\n\t\t\"ollama\",\n\t\t\"custom\"\n\t]).default(\"claude\"),\n\taiModel: z$1.string().optional(),\n\tagentMode: z$1.enum([\n\t\t\"simple\",\n\t\t\"cursor\",\n\t\t\"claude-code\",\n\t\t\"openai-codex\"\n\t]).default(\"simple\"),\n\tcustomEndpoint: z$1.url().nullable().optional(),\n\tcustomApiKey: z$1.string().nullable().optional(),\n\toutputDir: z$1.string().default(\"./src\"),\n\tconventions: FolderConventionsSchema,\n\tdefaultOwners: z$1.array(z$1.string()).default([]),\n\tdefaultTags: z$1.array(z$1.string()).default([]),\n\tpackages: z$1.array(z$1.string()).optional(),\n\texcludePackages: z$1.array(z$1.string()).optional(),\n\trecursive: z$1.boolean().optional(),\n\topenapi: OpenApiConfigSchema.optional()\n});\n/**\n* Default configuration values.\n*/\nconst DEFAULT_CONTRACTSRC = {\n\taiProvider: \"claude\",\n\tagentMode: \"simple\",\n\toutputDir: \"./src\",\n\tconventions: {\n\t\tmodels: \"models\",\n\t\toperations: \"interactions/commands|queries\",\n\t\tevents: \"events\",\n\t\tpresentations: \"presentations\",\n\t\tforms: \"forms\"\n\t},\n\tdefaultOwners: [],\n\tdefaultTags: []\n};\n\n//#endregion\nexport { ContractsrcSchema, DEFAULT_CONTRACTSRC, FolderConventionsSchema, OpenApiConfigSchema, OpenApiExportConfigSchema, OpenApiSourceConfigSchema };"],"mappings":";;;;;;;;;;;;AAYA,MAAM,4BAA4B,IAAI,OAAO;CAC5C,MAAM,IAAI,QAAQ;CAClB,KAAK,IAAI,KAAK,CAAC,UAAU;CACzB,MAAM,IAAI,QAAQ,CAAC,UAAU;CAC7B,UAAU,IAAI,KAAK;EAClB;EACA;EACA;EACA,CAAC,CAAC,QAAQ,WAAW;CACtB,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CACxC,SAAS,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CAC3C,SAAS,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CAC3C,QAAQ,IAAI,QAAQ,CAAC,UAAU;CAC/B,kBAAkB,IAAI,KAAK;EAC1B;EACA;EACA;EACA;EACA,CAAC,CAAC,UAAU;CACb,aAAa,IAAI,KAAK;EACrB;EACA;EACA;EACA,CAAC,CAAC,UAAU;CACb,eAAe,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CACjD,CAAC;AACF,MAAM,4BAA4B,IAAI,OAAO;CAC5C,YAAY,IAAI,QAAQ,CAAC,QAAQ,iBAAiB;CAClD,QAAQ,IAAI,KAAK,CAAC,QAAQ,OAAO,CAAC,CAAC,QAAQ,OAAO;CAClD,OAAO,IAAI,QAAQ,CAAC,UAAU;CAC9B,SAAS,IAAI,QAAQ,CAAC,UAAU;CAChC,aAAa,IAAI,QAAQ,CAAC,UAAU;CACpC,SAAS,IAAI,MAAM,IAAI,OAAO;EAC7B,KAAK,IAAI,QAAQ;EACjB,aAAa,IAAI,QAAQ,CAAC,UAAU;EACpC,CAAC,CAAC,CAAC,UAAU;CACd,CAAC;;;;AAIF,MAAM,sBAAsB,IAAI,OAAO;CACtC,SAAS,IAAI,MAAM,0BAA0B,CAAC,UAAU;CACxD,QAAQ,0BAA0B,UAAU;CAC5C,CAAC;;;;AAIF,MAAM,0BAA0B,IAAI,OAAO;CAC1C,QAAQ,IAAI,QAAQ,CAAC,QAAQ,SAAS;CACtC,YAAY,IAAI,QAAQ,CAAC,QAAQ,8BAA8B;CAC/D,QAAQ,IAAI,QAAQ,CAAC,QAAQ,SAAS;CACtC,eAAe,IAAI,QAAQ,CAAC,QAAQ,gBAAgB;CACpD,OAAO,IAAI,QAAQ,CAAC,QAAQ,QAAQ;CACpC,CAAC;;;;AAIF,MAAM,oBAAoB,IAAI,OAAO;CACpC,YAAY,IAAI,KAAK;EACpB;EACA;EACA;EACA;EACA,CAAC,CAAC,QAAQ,SAAS;CACpB,SAAS,IAAI,QAAQ,CAAC,UAAU;CAChC,WAAW,IAAI,KAAK;EACnB;EACA;EACA;EACA;EACA,CAAC,CAAC,QAAQ,SAAS;CACpB,gBAAgB,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU;CAC/C,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU;CAChD,WAAW,IAAI,QAAQ,CAAC,QAAQ,QAAQ;CACxC,aAAa;CACb,eAAe,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAClD,aAAa,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;CAChD,UAAU,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CAC5C,iBAAiB,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,UAAU;CACnD,WAAW,IAAI,SAAS,CAAC,UAAU;CACnC,SAAS,oBAAoB,UAAU;CACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"contractsrc-schema.js","names":[],"sources":["../../../../../../../libs/contracts/dist/workspace-config/contractsrc-schema.js"],"sourcesContent":["import * as z$1 from \"zod\";\n\n//#region src/workspace-config/contractsrc-schema.ts\n/**\n* ContractSpec configuration schema definitions.\n*\n* These schemas define the structure of .contractsrc.json files\n* and are shared across CLI tools and libraries.\n*/\n/**\n* OpenAPI source configuration for import/sync/validate operations.\n*/\nconst OpenApiSourceConfigSchema = z$1.object({\n\tname: z$1.string(),\n\turl: z$1.url().optional(),\n\tfile: z$1.string().optional(),\n\tsyncMode: z$1.enum([\n\t\t\"import\",\n\t\t\"sync\",\n\t\t\"validate\"\n\t]).default(\"validate\"),\n\ttags: z$1.array(z$1.string()).optional(),\n\texclude: z$1.array(z$1.string()).optional(),\n\tinclude: z$1.array(z$1.string()).optional(),\n\tprefix: z$1.string().optional(),\n\tdefaultStability: z$1.enum([\n\t\t\"experimental\",\n\t\t\"beta\",\n\t\t\"stable\",\n\t\t\"deprecated\"\n\t]).optional(),\n\tdefaultAuth: z$1.enum([\n\t\t\"anonymous\",\n\t\t\"user\",\n\t\t\"admin\"\n\t]).optional(),\n\tdefaultOwners: z$1.array(z$1.string()).optional()\n});\nconst OpenApiExportConfigSchema = z$1.object({\n\toutputPath: z$1.string().default(\"./openapi.json\"),\n\tformat: z$1.enum([\"json\", \"yaml\"]).default(\"json\"),\n\ttitle: z$1.string().optional(),\n\tversion: z$1.string().optional(),\n\tdescription: z$1.string().optional(),\n\tservers: z$1.array(z$1.object({\n\t\turl: z$1.string(),\n\t\tdescription: z$1.string().optional()\n\t})).optional()\n});\n/**\n* OpenAPI configuration section.\n*/\nconst OpenApiConfigSchema = z$1.object({\n\tsources: z$1.array(OpenApiSourceConfigSchema).optional(),\n\texport: OpenApiExportConfigSchema.optional()\n});\n/**\n* Grouping strategy for organizing specs.\n*/\nconst GroupingStrategySchema = z$1.enum([\n\t\"by-tag\",\n\t\"by-owner\",\n\t\"by-domain\",\n\t\"by-url-path-single\",\n\t\"by-url-path-multi\",\n\t\"by-feature\",\n\t\"none\"\n]);\n/**\n* Grouping rule configuration.\n*/\nconst GroupingRuleSchema = z$1.object({\n\tstrategy: GroupingStrategySchema,\n\turlPathLevel: z$1.number().optional(),\n\tpattern: z$1.string().optional()\n});\n/**\n* Output directory conventions for generated specs.\n*/\nconst FolderConventionsSchema = z$1.object({\n\tmodels: z$1.string().default(\"models\"),\n\toperations: z$1.string().default(\"operations/commands|queries\"),\n\tevents: z$1.string().default(\"events\"),\n\tpresentations: z$1.string().default(\"presentations\"),\n\tforms: z$1.string().default(\"forms\"),\n\tgroupByFeature: z$1.boolean().default(true),\n\toperationsGrouping: GroupingRuleSchema.optional(),\n\tmodelsGrouping: GroupingRuleSchema.optional(),\n\teventsGrouping: GroupingRuleSchema.optional()\n});\n/**\n* Full ContractSpec configuration schema (.contractsrc.json).\n*/\nconst ContractsrcSchema = z$1.object({\n\taiProvider: z$1.enum([\n\t\t\"claude\",\n\t\t\"openai\",\n\t\t\"ollama\",\n\t\t\"custom\"\n\t]).default(\"claude\"),\n\taiModel: z$1.string().optional(),\n\tagentMode: z$1.enum([\n\t\t\"simple\",\n\t\t\"cursor\",\n\t\t\"claude-code\",\n\t\t\"openai-codex\"\n\t]).default(\"simple\"),\n\tcustomEndpoint: z$1.url().nullable().optional(),\n\tcustomApiKey: z$1.string().nullable().optional(),\n\toutputDir: z$1.string().default(\"./src\"),\n\tconventions: FolderConventionsSchema,\n\tdefaultOwners: z$1.array(z$1.string()).default([]),\n\tdefaultTags: z$1.array(z$1.string()).default([]),\n\tpackages: z$1.array(z$1.string()).optional(),\n\texcludePackages: z$1.array(z$1.string()).optional(),\n\trecursive: z$1.boolean().optional(),\n\topenapi: OpenApiConfigSchema.optional()\n});\n/**\n* Default configuration values.\n*/\nconst DEFAULT_CONTRACTSRC = {\n\taiProvider: \"claude\",\n\tagentMode: \"simple\",\n\toutputDir: \"./src\",\n\tconventions: {\n\t\tmodels: \"models\",\n\t\toperations: \"interactions/commands|queries\",\n\t\tevents: \"events\",\n\t\tpresentations: \"presentations\",\n\t\tforms: \"forms\",\n\t\tgroupByFeature: true\n\t},\n\tdefaultOwners: [],\n\tdefaultTags: []\n};\n\n//#endregion\nexport { ContractsrcSchema, DEFAULT_CONTRACTSRC, FolderConventionsSchema, GroupingRuleSchema, GroupingStrategySchema, OpenApiConfigSchema, OpenApiExportConfigSchema, OpenApiSourceConfigSchema };"],"mappings":"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"}
|