@uipath/maestro-builder-sdk 5.2.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.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/dist/bindings-v2.d.ts +37 -0
- package/dist/bindings-v2.js +155 -0
- package/dist/bindings.d.ts +6 -0
- package/dist/bindings.js +6 -0
- package/dist/bpmn/bpmn-expr-check.d.ts +41 -0
- package/dist/bpmn/bpmn-expr-check.js +218 -0
- package/dist/bpmn/bpmn-sdk.d.ts +2257 -0
- package/dist/bpmn/bpmn-sdk.js +1476 -0
- package/dist/bpmn/check-cli.d.ts +3 -0
- package/dist/bpmn/check-cli.js +32 -0
- package/dist/bpmn/check.d.ts +25 -0
- package/dist/bpmn/check.js +430 -0
- package/dist/bpmn/compile-cli.d.ts +3 -0
- package/dist/bpmn/compile-cli.js +60 -0
- package/dist/bpmn/connector.d.ts +56 -0
- package/dist/bpmn/connector.js +199 -0
- package/dist/bpmn/decompile-cli.d.ts +8 -0
- package/dist/bpmn/decompile-cli.js +54 -0
- package/dist/bpmn/decompile.d.ts +6 -0
- package/dist/bpmn/decompile.js +1108 -0
- package/dist/bpmn/format-profile.d.ts +27 -0
- package/dist/bpmn/format-profile.js +11 -0
- package/dist/bpmn/intsvc.d.ts +77 -0
- package/dist/bpmn/intsvc.js +155 -0
- package/dist/bpmn/load.d.ts +4 -0
- package/dist/bpmn/load.js +22 -0
- package/dist/bpmn/merge-cli.d.ts +3 -0
- package/dist/bpmn/merge-cli.js +45 -0
- package/dist/bpmn/merge.d.ts +19 -0
- package/dist/bpmn/merge.js +293 -0
- package/dist/bpmn/registry-types.json +1869 -0
- package/dist/bpmn/serialize.d.ts +28 -0
- package/dist/bpmn/serialize.js +757 -0
- package/dist/bpmn/tidy-cli.d.ts +2 -0
- package/dist/bpmn/tidy-cli.js +39 -0
- package/dist/bpmn/typed-node.d.ts +382 -0
- package/dist/bpmn/typed-node.js +551 -0
- package/dist/bpmn/uipath-moddle.v1.json +823 -0
- package/dist/bpmn/xml-ranges.d.ts +45 -0
- package/dist/bpmn/xml-ranges.js +151 -0
- package/dist/case/case-expr-check.d.ts +35 -0
- package/dist/case/case-expr-check.js +85 -0
- package/dist/case/case-sdk.d.ts +1282 -0
- package/dist/case/case-sdk.js +923 -0
- package/dist/case/check-cli.d.ts +3 -0
- package/dist/case/check-cli.js +31 -0
- package/dist/case/check.d.ts +18 -0
- package/dist/case/check.js +456 -0
- package/dist/case/compile-cli.d.ts +3 -0
- package/dist/case/compile-cli.js +291 -0
- package/dist/case/decompile-cli.d.ts +9 -0
- package/dist/case/decompile-cli.js +117 -0
- package/dist/case/decompile.d.ts +187 -0
- package/dist/case/decompile.js +1170 -0
- package/dist/case/entry-points.d.ts +79 -0
- package/dist/case/entry-points.js +118 -0
- package/dist/case/format-profile.d.ts +60 -0
- package/dist/case/format-profile.js +79 -0
- package/dist/case/ids.d.ts +24 -0
- package/dist/case/ids.js +76 -0
- package/dist/case/load.d.ts +12 -0
- package/dist/case/load.js +32 -0
- package/dist/case/preserve.d.ts +133 -0
- package/dist/case/preserve.js +105 -0
- package/dist/case/serialize.d.ts +10 -0
- package/dist/case/serialize.js +1414 -0
- package/dist/check-cli.d.ts +3 -0
- package/dist/check-cli.js +118 -0
- package/dist/check.d.ts +146 -0
- package/dist/check.js +4898 -0
- package/dist/cli/commands/bpmn.d.ts +2 -0
- package/dist/cli/commands/bpmn.js +73 -0
- package/dist/cli/commands/case.d.ts +2 -0
- package/dist/cli/commands/case.js +60 -0
- package/dist/cli/commands/flow.d.ts +2 -0
- package/dist/cli/commands/flow.js +99 -0
- package/dist/cli/commands/registry.d.ts +10 -0
- package/dist/cli/commands/registry.js +170 -0
- package/dist/cli/common.d.ts +30 -0
- package/dist/cli/common.js +92 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli-run.d.ts +2 -0
- package/dist/cli-run.js +42 -0
- package/dist/compile-cli.d.ts +3 -0
- package/dist/compile-cli.js +160 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.js +201 -0
- package/dist/core/actions.d.ts +3244 -0
- package/dist/core/actions.js +1062 -0
- package/dist/core/binding-messages.d.ts +1 -0
- package/dist/core/binding-messages.js +16 -0
- package/dist/core/bindings.d.ts +12 -0
- package/dist/core/bindings.js +67 -0
- package/dist/core/ceql.d.ts +73 -0
- package/dist/core/ceql.js +272 -0
- package/dist/core/cli-spelling.d.ts +39 -0
- package/dist/core/cli-spelling.js +62 -0
- package/dist/core/connector-raw-node.d.ts +21 -0
- package/dist/core/connector-raw-node.js +47 -0
- package/dist/core/connectors.d.ts +184 -0
- package/dist/core/connectors.js +128 -0
- package/dist/core/expr-check.d.ts +93 -0
- package/dist/core/expr-check.js +186 -0
- package/dist/core/expr.d.ts +323 -0
- package/dist/core/expr.js +400 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.js +10 -0
- package/dist/core/library.d.ts +440 -0
- package/dist/core/library.js +1183 -0
- package/dist/core/list-envelope.d.ts +45 -0
- package/dist/core/list-envelope.js +97 -0
- package/dist/core/lookup-store.d.ts +22 -0
- package/dist/core/lookup-store.js +85 -0
- package/dist/core/lookups.d.ts +227 -0
- package/dist/core/lookups.js +231 -0
- package/dist/core/node-classes.d.ts +234 -0
- package/dist/core/node-classes.js +158 -0
- package/dist/core/script-return.d.ts +68 -0
- package/dist/core/script-return.js +197 -0
- package/dist/core/stable-id.d.ts +28 -0
- package/dist/core/stable-id.js +37 -0
- package/dist/core-definitions.json +16249 -0
- package/dist/decompile-cli.d.ts +3 -0
- package/dist/decompile-cli.js +131 -0
- package/dist/decompile.d.ts +138 -0
- package/dist/decompile.js +2482 -0
- package/dist/emit.d.ts +10 -0
- package/dist/emit.js +60 -0
- package/dist/event-filters.d.ts +130 -0
- package/dist/event-filters.js +137 -0
- package/dist/flow-expr-check.d.ts +17 -0
- package/dist/flow-expr-check.js +193 -0
- package/dist/flow-sdk.d.ts +1341 -0
- package/dist/flow-sdk.js +1164 -0
- package/dist/flow-variables.d.ts +13 -0
- package/dist/flow-variables.js +42 -0
- package/dist/format-profile.d.ts +72 -0
- package/dist/format-profile.js +97 -0
- package/dist/generators/_connections.py +287 -0
- package/dist/generators/_events.py +355 -0
- package/dist/generators/_lookups.py +114 -0
- package/dist/generators/_naming.py +185 -0
- package/dist/generators/_objects.py +299 -0
- package/dist/generators/_resolve.py +273 -0
- package/dist/generators/convert_library_to_md.py +1441 -0
- package/dist/generators/extract_library.py +125 -0
- package/dist/generators/generate_connectors_ts.py +936 -0
- package/dist/generators/generate_library_json.py +2527 -0
- package/dist/generators/generate_triggers_ts.py +110 -0
- package/dist/generators/materialize_registry.py +155 -0
- package/dist/generators/prepare_connector.py +1688 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +35 -0
- package/dist/ixp-definition.json +1982 -0
- package/dist/library.d.ts +6 -0
- package/dist/library.js +6 -0
- package/dist/load.d.ts +16 -0
- package/dist/load.js +95 -0
- package/dist/merge-cli.d.ts +3 -0
- package/dist/merge-cli.js +47 -0
- package/dist/merge.d.ts +125 -0
- package/dist/merge.js +0 -0
- package/dist/migrate.d.ts +15 -0
- package/dist/migrate.js +245 -0
- package/dist/node-runtime.d.ts +3 -0
- package/dist/node-runtime.js +22 -0
- package/dist/package-name.d.ts +17 -0
- package/dist/package-name.js +17 -0
- package/dist/ref-resolve.d.ts +77 -0
- package/dist/ref-resolve.js +170 -0
- package/dist/registry/cache.d.ts +55 -0
- package/dist/registry/cache.js +134 -0
- package/dist/registry/curated-overlay.d.ts +16 -0
- package/dist/registry/curated-overlay.js +62 -0
- package/dist/registry/extractor.d.ts +22 -0
- package/dist/registry/extractor.js +18 -0
- package/dist/registry/materialize-bin.d.ts +2 -0
- package/dist/registry/materialize-bin.js +7 -0
- package/dist/registry/materialize-cli.d.ts +1 -0
- package/dist/registry/materialize-cli.js +46 -0
- package/dist/registry/materializer.d.ts +23 -0
- package/dist/registry/materializer.js +34 -0
- package/dist/registry/path-cli.d.ts +1 -0
- package/dist/registry/path-cli.js +56 -0
- package/dist/registry/prepare-cli.d.ts +62 -0
- package/dist/registry/prepare-cli.js +185 -0
- package/dist/registry/pull-cli.d.ts +1 -0
- package/dist/registry/pull-cli.js +274 -0
- package/dist/registry/python.d.ts +26 -0
- package/dist/registry/python.js +46 -0
- package/dist/registry/search-cli.d.ts +52 -0
- package/dist/registry/search-cli.js +159 -0
- package/dist/schema-version.d.ts +165 -0
- package/dist/schema-version.js +148 -0
- package/dist/serialize.d.ts +64 -0
- package/dist/serialize.js +6398 -0
- package/lib/README.md +112 -0
- package/lib/library-json.samples/index.json +158 -0
- package/lib/library-json.samples/invariant-collections.json +83 -0
- package/lib/library-json.samples/list-envelopes.json +123 -0
- package/lib/library-json.samples/uipath-atlassian-jira/create-issue@1.0.0.json +131 -0
- package/lib/library-json.samples/uipath-atlassian-jira/create-issue@1.0.0.v1def.json +306 -0
- package/lib/library-json.samples/uipath-atlassian-jira/generic/create_issue/create@1.0.0.json +86 -0
- package/lib/library-json.samples/uipath-atlassian-jira/generic/create_issue/create@1.0.0.v1def.json +208 -0
- package/lib/library-json.samples/uipath-atlassian-jira/get-issue@1.0.0.json +2040 -0
- package/lib/library-json.samples/uipath-atlassian-jira/get-issue@1.0.0.v1def.json +195 -0
- package/lib/library-json.samples/uipath-google-vertex/execute-google-vertex-agent@1.0.0.json +169 -0
- package/lib/library-json.samples/uipath-google-vertex/execute-google-vertex-agent@1.0.0.v1def.json +209 -0
- package/lib/library-json.samples/uipath-http-webhook/event-http-webhook@1.0.0.json +63 -0
- package/lib/library-json.samples/uipath-http-webhook/event-http-webhook@1.0.0.v1def.json +262 -0
- package/lib/library-json.samples/uipath-http-webhook/trigger-http-webhook@1.0.0.json +63 -0
- package/lib/library-json.samples/uipath-http-webhook/trigger-http-webhook@1.0.0.v1def.json +213 -0
- package/lib/library-json.samples/uipath-microsoft-azureactivedirectory/list-groups@1.0.0.json +227 -0
- package/lib/library-json.samples/uipath-microsoft-azureactivedirectory/list-groups@1.0.0.v1def.json +373 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/event-file-created@1.0.0.json +116 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/event-file-created@1.0.0.v1def.json +369 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/event-list-item-added@1.0.0.json +56 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/event-list-item-added@1.0.0.v1def.json +256 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/trigger-file-created@1.0.0.json +116 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/trigger-file-created@1.0.0.v1def.json +320 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/trigger-list-item-added@1.0.0.json +56 -0
- package/lib/library-json.samples/uipath-microsoft-onedrive/trigger-list-item-added@1.0.0.v1def.json +207 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/event-email-received@1.0.0.json +107 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/event-email-received@1.0.0.v1def.json +264 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/send-email@1.0.0.json +142 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/send-email@1.0.0.v1def.json +306 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/trigger-email-received@1.0.0.json +107 -0
- package/lib/library-json.samples/uipath-microsoft-outlook365/trigger-email-received@1.0.0.v1def.json +217 -0
- package/lib/library-json.samples/uipath-microsoft-powerautomate/invoke-a-microsoft-power-automate-flow@1.0.0.json +85 -0
- package/lib/library-json.samples/uipath-microsoft-powerautomate/invoke-a-microsoft-power-automate-flow@1.0.0.v1def.json +209 -0
- package/lib/library-json.samples/uipath-salesforce-slack/send-message-to-user@1.0.0.json +755 -0
- package/lib/library-json.samples/uipath-salesforce-slack/send-message-to-user@1.0.0.v1def.json +513 -0
- package/lib/library-json.samples/uipath-uipath-dataservice/query-entity-records@1.0.0.json +122 -0
- package/lib/library-json.samples/uipath-uipath-dataservice/query-entity-records@1.0.0.v1def.json +227 -0
- package/package.json +85 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate statically-typed TypeScript connector-TRIGGER descriptors from the
|
|
3
|
+
canonical trigger catalog (`registry-triggers.json`).
|
|
4
|
+
|
|
5
|
+
The catalog is IDENTITY ONLY — `{ NodeType, DisplayName, Description, Version,
|
|
6
|
+
connectorKey }` — because a trigger's field schema (`where`/`filters`/output)
|
|
7
|
+
is schema-dynamic: `uip … registry get <trigger>` refuses to return it without a
|
|
8
|
+
live `--connection-id`. So this generator emits DISCOVERY descriptors: one
|
|
9
|
+
`triggerDescriptor()` const per event, carrying its `connector`/`event`/`version`
|
|
10
|
+
so `onEvent`/`waitForEvent` take it in place of the stringly `{ connector, event }`,
|
|
11
|
+
while `where`/output stay loose (`Record<string, string>` / `unknown`). A
|
|
12
|
+
connection-scoped `prepare-trigger` (C4) narrows those later; the surface here is
|
|
13
|
+
unchanged.
|
|
14
|
+
|
|
15
|
+
One module per connector, mirroring `generate_connectors_ts.py`:
|
|
16
|
+
|
|
17
|
+
connectors/<connector-key>.triggers.ts
|
|
18
|
+
/** Issue Created — (Jira) Trigger when a new issue is created. */
|
|
19
|
+
export const IssueCreated = triggerDescriptor()({
|
|
20
|
+
connector: 'uipath-atlassian-jira',
|
|
21
|
+
event: 'issue-created',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
displayName: 'Issue Created',
|
|
24
|
+
} as const);
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
generate_triggers_ts.py --triggers <registry-triggers.json> --output <ts-dir>
|
|
28
|
+
[--import <specifier>] [--connectors a,b,c]
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import argparse
|
|
33
|
+
import json
|
|
34
|
+
import re
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
|
|
37
|
+
TRIGGER_PREFIX = "uipath.connector.trigger."
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def pascal(event_id: str) -> str:
|
|
41
|
+
return "".join(w[:1].upper() + w[1:] for w in re.split(r"[^A-Za-z0-9]+", event_id) if w) or "Event"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def event_id(node_type: str) -> str:
|
|
45
|
+
# uipath.connector.trigger.<key>.<event> → <event> (the last dotted segment)
|
|
46
|
+
return node_type.rsplit(".", 1)[-1]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def emit_trigger(t: dict, seen: set) -> list[str]:
|
|
50
|
+
node_type = t["NodeType"]
|
|
51
|
+
ev = event_id(node_type)
|
|
52
|
+
name = pascal(ev)
|
|
53
|
+
while name in seen: # de-collide within a connector module
|
|
54
|
+
name += "_"
|
|
55
|
+
seen.add(name)
|
|
56
|
+
version = t.get("Version", "1.0.0")
|
|
57
|
+
label = t.get("DisplayName") or ev
|
|
58
|
+
desc = str(t.get("Description") or "").strip().replace("\n", " ")
|
|
59
|
+
|
|
60
|
+
doc = f"{label} — {desc}" if desc else label
|
|
61
|
+
doc = doc.replace("*/", "* /") # never let a description close the doc comment early
|
|
62
|
+
lines = [f"/** {doc} */"]
|
|
63
|
+
lines.append(f"export const {name} = triggerDescriptor()({{")
|
|
64
|
+
lines.append(f" connector: {json.dumps(t['connectorKey'])},")
|
|
65
|
+
lines.append(f" event: {json.dumps(ev)},")
|
|
66
|
+
lines.append(f" version: {json.dumps(version)},")
|
|
67
|
+
lines.append(f" displayName: {json.dumps(label)},")
|
|
68
|
+
lines.append("} as const);")
|
|
69
|
+
return lines
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def main() -> None:
|
|
73
|
+
ap = argparse.ArgumentParser()
|
|
74
|
+
ap.add_argument("--triggers", required=True, help="path to registry-triggers.json")
|
|
75
|
+
ap.add_argument("--output", required=True)
|
|
76
|
+
ap.add_argument("--import", dest="imp", default="@uipath/maestro-builder-sdk",
|
|
77
|
+
help="module specifier for `import { triggerDescriptor }`")
|
|
78
|
+
ap.add_argument("--connectors", default="", help="csv subset of connector keys (default: all)")
|
|
79
|
+
args = ap.parse_args()
|
|
80
|
+
|
|
81
|
+
catalog = json.loads(Path(args.triggers).read_text())
|
|
82
|
+
triggers = catalog["triggers"] if isinstance(catalog, dict) else catalog
|
|
83
|
+
subset = {c for c in args.connectors.split(",") if c} or None
|
|
84
|
+
|
|
85
|
+
by_conn: dict[str, list[dict]] = {}
|
|
86
|
+
for t in triggers:
|
|
87
|
+
nt = t.get("NodeType", "")
|
|
88
|
+
if not nt.startswith(TRIGGER_PREFIX):
|
|
89
|
+
continue # catalog is trigger-only, but be defensive
|
|
90
|
+
ck = t["connectorKey"]
|
|
91
|
+
if subset and ck not in subset:
|
|
92
|
+
continue
|
|
93
|
+
by_conn.setdefault(ck, []).append(t)
|
|
94
|
+
|
|
95
|
+
out_dir = Path(args.output)
|
|
96
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
97
|
+
written = 0
|
|
98
|
+
for ck, ts in sorted(by_conn.items()):
|
|
99
|
+
seen: set = set()
|
|
100
|
+
body = [f"import {{ triggerDescriptor }} from {json.dumps(args.imp)};", ""]
|
|
101
|
+
for t in sorted(ts, key=lambda x: x["NodeType"]):
|
|
102
|
+
body += emit_trigger(t, seen)
|
|
103
|
+
body.append("")
|
|
104
|
+
(out_dir / f"{ck}.triggers.ts").write_text("\n".join(body).rstrip() + "\n")
|
|
105
|
+
written += 1
|
|
106
|
+
print(f"generated {written} trigger module(s) → {out_dir}")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if __name__ == "__main__":
|
|
110
|
+
main()
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Materialize connector Markdown and TypeScript from canonical library JSON."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import os
|
|
8
|
+
import shutil
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
HERE = Path(__file__).resolve().parent
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def parse_args() -> argparse.Namespace:
|
|
18
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
"--library-json",
|
|
21
|
+
required=True,
|
|
22
|
+
help="Canonical connector library directory containing index.json",
|
|
23
|
+
)
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
"--library-md",
|
|
26
|
+
help="Destination directory for generated Markdown. Omit to skip it — "
|
|
27
|
+
"the Markdown is a pure function of the library JSON, so there is "
|
|
28
|
+
"no reason to regenerate 2,472 pages to add one descriptor.",
|
|
29
|
+
)
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"--connectors",
|
|
32
|
+
help="Destination directory for generated TypeScript descriptors. "
|
|
33
|
+
"Omit to skip TypeScript generation: every compiler diagnostic "
|
|
34
|
+
"comes from the library JSON, so the modules serve an editor's "
|
|
35
|
+
"autocomplete and a project importing none does not need them.",
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument(
|
|
38
|
+
"--connector-subset",
|
|
39
|
+
default="",
|
|
40
|
+
help="Comma-separated connector keys to emit instead of all of them",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--import",
|
|
44
|
+
dest="module_import",
|
|
45
|
+
default="@uipath/maestro-builder-sdk",
|
|
46
|
+
help="Module specifier used by generated TypeScript descriptors",
|
|
47
|
+
)
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"--triggers",
|
|
50
|
+
help="Optional registry-triggers.json used to generate trigger descriptors",
|
|
51
|
+
)
|
|
52
|
+
return parser.parse_args()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def run(script: str, *args: str) -> None:
|
|
56
|
+
subprocess.run([sys.executable, str(HERE / script), *args], check=True)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def main() -> int:
|
|
60
|
+
args = parse_args()
|
|
61
|
+
library_json = Path(args.library_json).resolve()
|
|
62
|
+
library_md = Path(args.library_md).resolve() if args.library_md else None
|
|
63
|
+
connectors = Path(args.connectors).resolve() if args.connectors else None
|
|
64
|
+
|
|
65
|
+
if not (library_json / "index.json").is_file():
|
|
66
|
+
print(
|
|
67
|
+
f"materialize-registry: missing {library_json / 'index.json'}",
|
|
68
|
+
file=sys.stderr,
|
|
69
|
+
)
|
|
70
|
+
return 1
|
|
71
|
+
|
|
72
|
+
outputs = ([library_md] if library_md else []) + ([connectors] if connectors else [])
|
|
73
|
+
if library_json in outputs or len(set(outputs)) != len(outputs):
|
|
74
|
+
print(
|
|
75
|
+
"materialize-registry: input and output directories must be distinct",
|
|
76
|
+
file=sys.stderr,
|
|
77
|
+
)
|
|
78
|
+
return 1
|
|
79
|
+
|
|
80
|
+
if connectors is not None:
|
|
81
|
+
if connectors.exists():
|
|
82
|
+
shutil.rmtree(connectors)
|
|
83
|
+
connectors.mkdir(parents=True)
|
|
84
|
+
|
|
85
|
+
if library_md is not None:
|
|
86
|
+
# Generate beside the target and swap, exactly as pull-cli does for
|
|
87
|
+
# library-json: the converter wipes and rewrites its output directory,
|
|
88
|
+
# and two `registry pull`s racing on the shared final path (a coding
|
|
89
|
+
# agent issues tool calls in parallel) left one of them with
|
|
90
|
+
# `shutil.rmtree` → "Directory not empty" mid-write (2026-09-01).
|
|
91
|
+
staging = library_md.with_name(f"{library_md.name}.tmp-{os.getpid()}")
|
|
92
|
+
if staging.exists():
|
|
93
|
+
shutil.rmtree(staging)
|
|
94
|
+
run(
|
|
95
|
+
"convert_library_to_md.py",
|
|
96
|
+
"--source",
|
|
97
|
+
str(library_json),
|
|
98
|
+
"--output",
|
|
99
|
+
str(staging),
|
|
100
|
+
)
|
|
101
|
+
if staging.is_dir():
|
|
102
|
+
previous = library_md.with_name(f"{library_md.name}.old-{os.getpid()}")
|
|
103
|
+
if library_md.exists():
|
|
104
|
+
library_md.rename(previous)
|
|
105
|
+
staging.rename(library_md)
|
|
106
|
+
if previous.exists():
|
|
107
|
+
shutil.rmtree(previous, ignore_errors=True)
|
|
108
|
+
if connectors is not None:
|
|
109
|
+
connectors_args = [
|
|
110
|
+
"--library", str(library_json),
|
|
111
|
+
"--output", str(connectors),
|
|
112
|
+
"--import", args.module_import,
|
|
113
|
+
]
|
|
114
|
+
if args.connector_subset:
|
|
115
|
+
connectors_args += ["--connectors", args.connector_subset]
|
|
116
|
+
run("generate_connectors_ts.py", *connectors_args)
|
|
117
|
+
|
|
118
|
+
if connectors is not None and args.triggers:
|
|
119
|
+
triggers = Path(args.triggers).resolve()
|
|
120
|
+
if not triggers.is_file():
|
|
121
|
+
print(
|
|
122
|
+
f"materialize-registry: missing trigger catalog {triggers}",
|
|
123
|
+
file=sys.stderr,
|
|
124
|
+
)
|
|
125
|
+
return 1
|
|
126
|
+
run(
|
|
127
|
+
"generate_triggers_ts.py",
|
|
128
|
+
"--triggers",
|
|
129
|
+
str(triggers),
|
|
130
|
+
"--output",
|
|
131
|
+
str(connectors),
|
|
132
|
+
"--import",
|
|
133
|
+
args.module_import,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
markdown_count = (
|
|
137
|
+
sum(1 for path in library_md.rglob("*.md") if path.is_file())
|
|
138
|
+
if library_md is not None
|
|
139
|
+
else 0
|
|
140
|
+
)
|
|
141
|
+
connector_count = (
|
|
142
|
+
sum(1 for path in connectors.glob("*.ts") if path.is_file())
|
|
143
|
+
if connectors is not None
|
|
144
|
+
else 0
|
|
145
|
+
)
|
|
146
|
+
print(
|
|
147
|
+
"materialize-registry: "
|
|
148
|
+
f"generated {markdown_count} markdown file(s) and "
|
|
149
|
+
f"{connector_count} TypeScript module(s)"
|
|
150
|
+
)
|
|
151
|
+
return 0
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
sys.exit(main())
|