@telorun/cli 0.12.0 → 0.13.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 +2 -2
- package/README.md +63 -13
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +23 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/upgrade.d.ts +55 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +319 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/package.json +10 -6
- package/dist/generated/runtime-deps.json +0 -6
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SUSTAINABLE USE LICENSE (Fair-code)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026
|
|
3
|
+
Copyright (c) 2026 CodeNet Sp. z o.o.
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to use, copy, modify, and distribute the Software for any purpose—including commercial purposes—subject to the following conditions:
|
|
6
6
|
|
|
@@ -14,4 +14,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
14
14
|
|
|
15
15
|
5. DISCLAIMER: The Software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software.
|
|
16
16
|
|
|
17
|
-
For commercial licensing, managed hosting exemptions, or enterprise inquiries, please contact
|
|
17
|
+
For commercial licensing, managed hosting exemptions, or enterprise inquiries, please contact <contact@codenet.pl>.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Telo CLI
|
|
2
2
|
|
|
3
|
-
The Telo CLI is the command-line interface for the Telo kernel. It loads and runs YAML manifests on your local machine, watches them for changes during development, statically validates them with `telo check`, pre-installs controllers with `telo install`, and publishes module manifests to the Telo registry with `telo publish`.
|
|
3
|
+
The Telo CLI is the command-line interface for the Telo kernel. It loads and runs YAML manifests on your local machine, watches them for changes during development, statically validates them with `telo check`, pre-installs controllers with `telo install`, refreshes `Telo.Import` pins with `telo upgrade`, and publishes module manifests to the Telo registry with `telo publish`.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -54,7 +54,7 @@ telo publish ./modules/my-module/telo.yaml --skip-controllers
|
|
|
54
54
|
|
|
55
55
|
**Environment:**
|
|
56
56
|
|
|
57
|
-
- `TELO_REGISTRY_TOKEN` — Bearer token for the registry's publish endpoint. The CLI adds it as `Authorization: Bearer <token>` on each PUT; without it, the server returns 401. Operators receive a token from whoever administers the registry
|
|
57
|
+
- `TELO_REGISTRY_TOKEN` — Bearer token for the registry's publish endpoint. The CLI adds it as `Authorization: Bearer <token>` on each PUT; without it, the server returns 401. Operators receive a token from whoever administers the registry. Example:
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
60
|
TELO_REGISTRY_TOKEN=<token> telo publish ./modules/my-module/telo.yaml
|
|
@@ -149,22 +149,81 @@ Installing 20 controllers for apps/my-app/telo.yaml
|
|
|
149
149
|
**Typical Dockerfile usage:**
|
|
150
150
|
|
|
151
151
|
```dockerfile
|
|
152
|
-
FROM telorun/
|
|
152
|
+
FROM telorun/node:latest-slim as build
|
|
153
153
|
WORKDIR /srv
|
|
154
154
|
COPY apps/my-app/ apps/my-app/
|
|
155
155
|
COPY modules/ modules/
|
|
156
156
|
RUN telo install apps/my-app/telo.yaml
|
|
157
157
|
|
|
158
|
-
FROM telorun/
|
|
158
|
+
FROM telorun/node:latest-slim as production
|
|
159
159
|
WORKDIR /srv
|
|
160
160
|
COPY --from=build /srv /srv
|
|
161
161
|
CMD ["apps/my-app/telo.yaml"]
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
+
Available image variants:
|
|
165
|
+
|
|
166
|
+
- `telorun/node:<version>` — debian base, no rust toolchain.
|
|
167
|
+
- `telorun/node:<version>-slim` — debian-slim base, no rust toolchain (smallest footprint; recommended for production).
|
|
168
|
+
- `telorun/node:<version>-rust-<rust-version>` — debian + rust toolchain (controllers that compile native deps at install time).
|
|
169
|
+
- `telorun/node:<version>-rust-<rust-version>-slim` — slim + rust toolchain.
|
|
170
|
+
|
|
171
|
+
Pin to an exact CLI version for reproducible builds; `latest`, `<major>`, and `<major>.<minor>` are rolling tags.
|
|
172
|
+
|
|
164
173
|
The build stage materializes `<manifest-dir>/.telo/npm/` and `<manifest-dir>/.telo/manifests/`; the production stage is a single `COPY` and does no network I/O at boot.
|
|
165
174
|
|
|
166
175
|
---
|
|
167
176
|
|
|
177
|
+
### `telo upgrade <paths..>`
|
|
178
|
+
|
|
179
|
+
Scans one or more manifests for `Telo.Import` declarations whose `source` is a registry ref (`<namespace>/<name>@<version>`), queries the registry for the latest published version of each, and rewrites the `source` field in place when a newer version is available. The rewrite operates at the byte level: only the version characters of changed `source:` values are spliced into the original file. Comments, indentation, folded block scalars (`>-` / `|`), quote style on the `source:` value, and every other byte outside the rewritten ranges are preserved exactly. The on-disk YAML is mutated only when at least one import in the file changes.
|
|
180
|
+
|
|
181
|
+
Accepts the same path shapes as `check` / `install`: a manifest file, a directory containing a `telo.yaml`, or several of those mixed. The command never follows imports recursively — only the imports declared in the files you pass on the command line are inspected.
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
telo upgrade ./apps/my-app/telo.yaml
|
|
185
|
+
telo upgrade ./apps/my-app # directory → ./apps/my-app/telo.yaml
|
|
186
|
+
telo upgrade ./apps/a ./apps/b --dry-run
|
|
187
|
+
telo upgrade ./manifest.yaml --include-prerelease
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Options:**
|
|
191
|
+
|
|
192
|
+
- `--registry-url <url>` — Base URL for the Telo registry. Falls back to `TELO_REGISTRY_URL`, then `https://registry.telo.run`. Matches the `install` / `run` fallback chain.
|
|
193
|
+
- `--include-prerelease` — Consider versions with a SemVer prerelease segment (e.g. `1.0.0-beta.1`) when picking the latest. Off by default — prereleases are ignored unless the flag is set.
|
|
194
|
+
- `--dry-run` — Show the proposed rewrites without touching any files.
|
|
195
|
+
|
|
196
|
+
**Behavior per import:**
|
|
197
|
+
|
|
198
|
+
| Pinned version state | Action | Log marker |
|
|
199
|
+
| --- | --- | --- |
|
|
200
|
+
| Equal to the latest published | leave unchanged | `= already at <ver>` |
|
|
201
|
+
| Lower than the latest, and itself in the registry | rewrite to latest | `↑ <old> → <new>` |
|
|
202
|
+
| Not present in the registry's version list | rewrite to latest (repair) — flagged with `(pinned version not in registry)`. Direction can be downward if the broken pin is higher than anything published. | `↑` or `↓` |
|
|
203
|
+
| Module not found (404) / no eligible versions after filtering | leave unchanged, report | `! no published versions in registry` |
|
|
204
|
+
| `source` is not a `<namespace>/<name>@<version>` ref (relative path, HTTP URL, alias) | leave unchanged | `· skipped (not a registry ref)` |
|
|
205
|
+
|
|
206
|
+
A non-existent pin is always treated as broken and repaired against the registry — leaving an unbootable pin in place would defeat the point of the command — but the rewrite is annotated so the action is visible. Network or non-404 registry errors are surfaced per import and produce a non-zero exit code; other imports in the same file still get processed.
|
|
207
|
+
|
|
208
|
+
**Environment:**
|
|
209
|
+
|
|
210
|
+
- `TELO_REGISTRY_URL` — Default registry URL used when `--registry-url` is omitted.
|
|
211
|
+
|
|
212
|
+
**Example output:**
|
|
213
|
+
|
|
214
|
+
```text
|
|
215
|
+
Upgrading apps/my-app/telo.yaml
|
|
216
|
+
↑ std/run 0.2.4 → 0.2.7
|
|
217
|
+
= std/http-server already at 2.0.0
|
|
218
|
+
↓ std/foo 9.9.9 → 0.4.1 (pinned version not in registry)
|
|
219
|
+
! std/does-not-exist no published versions in registry
|
|
220
|
+
· ../sibling skipped (not a registry ref)
|
|
221
|
+
|
|
222
|
+
2 upgraded, 1 already current, 2 skipped
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
168
227
|
### `telo [manifest]`
|
|
169
228
|
|
|
170
229
|
Load and run a Telo manifest.
|
|
@@ -258,12 +317,3 @@ You can run manifests directly from URLs without downloading them:
|
|
|
258
317
|
```bash
|
|
259
318
|
telo https://example.com/my-manifest.yaml
|
|
260
319
|
```
|
|
261
|
-
|
|
262
|
-
## Status
|
|
263
|
-
|
|
264
|
-
The CLI is part of the Telo project and follows the same early prototype status. The command-line interface and behavior may change.
|
|
265
|
-
|
|
266
|
-
## See Also
|
|
267
|
-
|
|
268
|
-
- [Telo Kernel](../kernel/README.md) - Core concepts and resource types
|
|
269
|
-
- [Modules](../modules/README.md) - Available built-in modules
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ import { checkCommand } from "./commands/check.js";
|
|
|
5
5
|
import { installCommand } from "./commands/install.js";
|
|
6
6
|
import { publishCommand } from "./commands/publish.js";
|
|
7
7
|
import { runCommand } from "./commands/run.js";
|
|
8
|
+
import { upgradeCommand } from "./commands/upgrade.js";
|
|
8
9
|
let cli = yargs(hideBin(process.argv))
|
|
9
10
|
.scriptName("telo")
|
|
10
11
|
.usage("$0 <command> [options]");
|
|
@@ -12,6 +13,7 @@ cli = checkCommand(cli);
|
|
|
12
13
|
cli = installCommand(cli);
|
|
13
14
|
cli = publishCommand(cli);
|
|
14
15
|
cli = runCommand(cli);
|
|
16
|
+
cli = upgradeCommand(cli);
|
|
15
17
|
cli
|
|
16
18
|
.option("verbose", {
|
|
17
19
|
type: "boolean",
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACnC,UAAU,CAAC,MAAM,CAAC;KAClB,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAEnC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAe,CAAC;AACtC,GAAG,GAAG,cAAc,CAAC,GAAG,CAAe,CAAC;AACxC,GAAG,GAAG,cAAc,CAAC,GAAG,CAAe,CAAC;AACxC,GAAG,GAAG,UAAU,CAAC,GAAG,CAAe,CAAC;AACpC,GAAG,GAAG,cAAc,CAAC,GAAG,CAAe,CAAC;AAExC,GAAG;KACA,MAAM,CAAC,SAAS,EAAE;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,wBAAwB;CACnC,CAAC;KACD,MAAM,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,8BAA8B;CACzC,CAAC;KACD,MAAM,CAAC,kBAAkB,EAAE;IAC1B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,4BAA4B;CACvC,CAAC;KACD,MAAM,CAAC,OAAO,EAAE;IACf,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,2CAA2C;CACtD,CAAC;KACD,aAAa,CAAC,CAAC,EAAE,yCAAyC,CAAC;KAC3D,MAAM,EAAE;KACR,IAAI,EAAE;KACN,OAAO,EAAE;KACT,KAAK,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAqGlC,wBAAsB,GAAG,CAAC,IAAI,EAAE;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HhB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAmD5C"}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Kernel, LocalFileSource, LocalManifestCacheSource, resolveEntryDir, } from "@telorun/kernel";
|
|
1
|
+
import { Kernel, LocalFileSource, LocalManifestCacheSource, resolveEntryDir, writeManifestCache, } from "@telorun/kernel";
|
|
2
2
|
import * as dotenv from "dotenv";
|
|
3
3
|
import * as fs from "fs";
|
|
4
4
|
import * as path from "path";
|
|
@@ -157,6 +157,28 @@ export async function run(argv) {
|
|
|
157
157
|
}
|
|
158
158
|
loadEnvFiles(argv.path);
|
|
159
159
|
await kernel.load(argv.path);
|
|
160
|
+
// Write-through to `<entry-dir>/.telo/manifests/` after the first
|
|
161
|
+
// successful load. Same persistence path as `telo install` — reuses
|
|
162
|
+
// `writeManifestCache` so cache contents converge no matter which
|
|
163
|
+
// command populates them. Idempotent: a graph whose files all came
|
|
164
|
+
// from `file://` sources (cache hit) results in no writes, since
|
|
165
|
+
// `cachePathForCanonical` returns null for non-cacheable schemes.
|
|
166
|
+
// On read-only filesystems (e.g. baked Docker images) we surface the
|
|
167
|
+
// error but do not abort — caching is an optimization.
|
|
168
|
+
if (entryDir) {
|
|
169
|
+
const graph = kernel.getLoadedGraph();
|
|
170
|
+
if (graph) {
|
|
171
|
+
try {
|
|
172
|
+
await writeManifestCache(graph, entryDir, registryUrl ?? "https://registry.telo.run");
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
// Warnings belong on stderr — stdout is reserved for the
|
|
176
|
+
// manifest's own output (consumers may pipe `telo run` into
|
|
177
|
+
// jq / a downstream process).
|
|
178
|
+
process.stderr.write(`${log.warn(`[manifest-cache] write failed: ${err instanceof Error ? err.message : String(err)}`)}\n`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
160
182
|
await kernel.start();
|
|
161
183
|
if (kernel.exitCode !== 0) {
|
|
162
184
|
process.exit(kernel.exitCode);
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,wBAAwB,EACxB,eAAe,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,kBAAkB,GAEnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;;;GAIG;AACH,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;QACxE,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAID,SAAS,cAAc,CAAC,MAAc,EAAE,GAAW;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyC,CAAC;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,SAAS,SAAS,CAAC,QAAgB;QACjC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC9C,0EAA0E;QAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnF,IAAI,OAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC9B,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACpB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC9C,IAAI,QAAQ;oBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACrC,cAAc,CAAC,GAAG,CAChB,QAAQ,EACR,UAAU,CAAC,GAAG,EAAE;oBACd,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAChC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC,EAAE,GAAG,CAAC,CACR,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,yBAAyB;QACnC,CAAC;QACD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,yEAAyE;YACzE,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;gBACvC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,MAAM;wBAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,UAAU,YAAY,CAAC,QAAgB;QAC1C,+CAA+C;QAC/C,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QACpC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,uCAAuC;YACvC,iDAAiD;YACjD,yDAAyD;YACzD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,SAAS,OAAO;QACd,MAAM,GAAG,KAAK,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QACzD,cAAc,CAAC,KAAK,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE;YAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAQzB;IACC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,qFAAqF;QACrF,8EAA8E;QAC9E,uEAAuE;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACtE,0EAA0E;QAC1E,wEAAwE;QACxE,uEAAuE;QACvE,qCAAqC;QACrC,MAAM,OAAO,GAAqB,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,uEAAuE;YACvE,sDAAsD;YACtD,OAAO,CAAC,IAAI,CACV,IAAI,wBAAwB,CAC1B,QAAQ,EACR,WAAW,IAAI,2BAA2B,CAC3C,CACF,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;YAChB,WAAW;YACX,OAAO;SACR,CAAC,CAAC;QACH,qEAAqE;QACrE,wEAAwE;QACxE,4CAA4C;QAC5C,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;YACzD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YAC5D,MAAM,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAChD,GAAG,CAAC,IAAI,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,WAAW,GAAuB,IAAI,CAAC;QAE3C,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,IAAI,IAAI,CAAC,KAAK;gBAAE,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAClD,WAAW,EAAE,OAAO,EAAE,CAAC;YACvB,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,uEAAuE;YACvE,2DAA2D;YAC3D,uEAAuE;YACvE,iEAAiE;YACjE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAEjC,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC/B,yCAAyC;gBACzC,wDAAwD;gBACxD,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,kEAAkE;QAClE,oEAAoE;QACpE,kEAAkE;QAClE,mEAAmE;QACnE,iEAAiE;QACjE,kEAAkE;QAClE,qEAAqE;QACrE,uDAAuD;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,MAAM,kBAAkB,CACtB,KAAK,EACL,QAAQ,EACR,WAAW,IAAI,2BAA2B,CAC3C,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,yDAAyD;oBACzD,4DAA4D;oBAC5D,8BAA8B;oBAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,GAAG,CAAC,IAAI,CAAC,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CACtG,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,KAAK;YACvB,CAAC,CAAC,IAAI,CAAC,IAAI;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAI,KAAa,EAAE,WAA8C,CAAC;QAChF,MAAM,KAAK,GAAwB,QAAQ,EAAE,MAAM;YACjD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC;gBACE;oBACE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC/D,IAAI,EAAG,KAAa,EAAE,IAAI;iBAC3B;aACF,CAAC;QACN,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACxE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACvE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,UAAU,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,UAAU,SAAS,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/F,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,WAAW,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAW;IACpC,OAAO,KAAK,CAAC,OAAO,CAClB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,EACrC,sDAAsD,EACtD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;SACE,UAAU,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,uEAAuE;QACjF,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,IAAI;KACnB,CAAC;SACD,MAAM,CAAC,cAAc,EAAE;QACtB,IAAI,EAAE,QAAQ;QACd,QAAQ,EACN,qEAAqE;KACxE,CAAC;SACD,MAAM,CAAC,KAAK,CAAC,EAClB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,kEAAkE;QAClE,kEAAkE;QAClE,sEAAsE;QACtE,oBAAoB;QACpB,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;YAChC,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI;YAC7D,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,IAAI;gBAAE,SAAS;YACzB,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,uEAAuE;gBACvE,0EAA0E;gBAC1E,wEAAwE;gBACxE,0DAA0D;gBAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,CAAC,EAAE,CAAC;gBAClE,SAAS;YACX,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,GAAG,CAAC,EAAE,GAAI,IAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { Argv } from "yargs";
|
|
2
|
+
import { type Logger } from "../logger.js";
|
|
3
|
+
interface ParsedRef {
|
|
4
|
+
namespace: string;
|
|
5
|
+
name: string;
|
|
6
|
+
/** Normalized SemVer string (no `v` prefix), or `null` if the pin is not valid SemVer. */
|
|
7
|
+
version: string | null;
|
|
8
|
+
/** Raw version segment as written in the YAML — preserved for diagnostic output. */
|
|
9
|
+
rawVersion: string;
|
|
10
|
+
}
|
|
11
|
+
/** Parse `<namespace>/<name>@<version>`. Exported for tests. */
|
|
12
|
+
export declare function parseModuleRef(source: string): ParsedRef | null;
|
|
13
|
+
/** Exported for tests. */
|
|
14
|
+
export declare function pickLatest(versions: string[], includePrerelease: boolean): string | null;
|
|
15
|
+
interface ImportUpgrade {
|
|
16
|
+
packagePath: string;
|
|
17
|
+
from: string;
|
|
18
|
+
to: string;
|
|
19
|
+
}
|
|
20
|
+
interface UpgradeResult {
|
|
21
|
+
changed: boolean;
|
|
22
|
+
upgrades: ImportUpgrade[];
|
|
23
|
+
unchanged: number;
|
|
24
|
+
skipped: number;
|
|
25
|
+
errors: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Pure string-in / string-out core of the upgrade command. No filesystem
|
|
29
|
+
* access — `upgradeOne` is the disk-backed wrapper. Exported so tests can
|
|
30
|
+
* exercise the parse / fetch / decision pipeline without a tmpdir.
|
|
31
|
+
*
|
|
32
|
+
* The returned `content` is the rewritten YAML when `result.changed === true`,
|
|
33
|
+
* and the original `content` (byte-identical) when nothing matched.
|
|
34
|
+
*/
|
|
35
|
+
export declare function upgradeManifest(args: {
|
|
36
|
+
content: string;
|
|
37
|
+
registryUrl: string;
|
|
38
|
+
includePrerelease: boolean;
|
|
39
|
+
log: Logger;
|
|
40
|
+
/** Optional label printed in the "Upgrading <name>" header. */
|
|
41
|
+
displayName?: string;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
content: string;
|
|
44
|
+
result: UpgradeResult;
|
|
45
|
+
}>;
|
|
46
|
+
export declare function upgradeOne(inputPath: string, registryUrl: string, includePrerelease: boolean, dryRun: boolean, log: Logger): Promise<UpgradeResult>;
|
|
47
|
+
export declare function upgrade(argv: {
|
|
48
|
+
paths: string[];
|
|
49
|
+
registryUrl?: string;
|
|
50
|
+
includePrerelease: boolean;
|
|
51
|
+
dryRun: boolean;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
export declare function upgradeCommand(yargs: Argv): Argv;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=upgrade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAIzD,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuB/D;AA6BD,0BAA0B;AAC1B,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOxF;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAiBD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,CAAC,CA8ItD;AAyDD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,OAAO,EAC1B,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,aAAa,CAAC,CAqCxB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CA8BhD"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { defaultCustomTags } from "@telorun/templating";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import semver from "semver";
|
|
5
|
+
import { parseAllDocuments } from "yaml";
|
|
6
|
+
import { createLogger } from "../logger.js";
|
|
7
|
+
const DEFAULT_REGISTRY_URL = "https://registry.telo.run";
|
|
8
|
+
/** Parse `<namespace>/<name>@<version>`. Exported for tests. */
|
|
9
|
+
export function parseModuleRef(source) {
|
|
10
|
+
const atIdx = source.lastIndexOf("@");
|
|
11
|
+
if (atIdx <= 0 || atIdx === source.length - 1)
|
|
12
|
+
return null;
|
|
13
|
+
const modulePath = source.slice(0, atIdx);
|
|
14
|
+
const slashIdx = modulePath.indexOf("/");
|
|
15
|
+
if (slashIdx <= 0 || slashIdx === modulePath.length - 1)
|
|
16
|
+
return null;
|
|
17
|
+
const namespace = modulePath.slice(0, slashIdx);
|
|
18
|
+
const name = modulePath.slice(slashIdx + 1);
|
|
19
|
+
const rawVersion = source.slice(atIdx + 1);
|
|
20
|
+
if (!namespace || !name || !rawVersion)
|
|
21
|
+
return null;
|
|
22
|
+
// Registry refs are strictly `<namespace>/<name>@<version>` — exactly one
|
|
23
|
+
// slash. A second slash means we're looking at a relative path or a URL
|
|
24
|
+
// disguised as a ref; either way it would resolve to a bogus `/ns/a/b` URL
|
|
25
|
+
// and surface as "no published versions" instead of being treated as
|
|
26
|
+
// non-registry.
|
|
27
|
+
if (name.includes("/"))
|
|
28
|
+
return null;
|
|
29
|
+
// Reject anything that doesn't look like a module ref so we don't try to
|
|
30
|
+
// upgrade HTTP URLs, relative paths, etc.
|
|
31
|
+
if (namespace.includes("://") || namespace.includes(":") || namespace.startsWith(".")) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
// semver.valid() tolerates a `v` prefix and returns the cleaned form.
|
|
35
|
+
return { namespace, name, version: semver.valid(rawVersion), rawVersion };
|
|
36
|
+
}
|
|
37
|
+
async function fetchPublishedVersions(registryUrl, namespace, name) {
|
|
38
|
+
const base = registryUrl.replace(/\/+$/, "");
|
|
39
|
+
const url = `${base}/${namespace}/${name}`;
|
|
40
|
+
const res = await fetch(url, { headers: { accept: "application/json" } });
|
|
41
|
+
if (res.status === 404)
|
|
42
|
+
return null;
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
throw new Error(`Registry returned ${res.status} ${res.statusText} for ${namespace}/${name}`);
|
|
45
|
+
}
|
|
46
|
+
const body = (await res.json());
|
|
47
|
+
if (!Array.isArray(body.versions))
|
|
48
|
+
return [];
|
|
49
|
+
// Normalize via semver.valid so downstream string-equality matches on the
|
|
50
|
+
// pin compare the same canonical form (handles `v` prefix, whitespace, etc).
|
|
51
|
+
return body.versions
|
|
52
|
+
.map((v) => semver.valid(v))
|
|
53
|
+
.filter((v) => v !== null);
|
|
54
|
+
}
|
|
55
|
+
/** Exported for tests. */
|
|
56
|
+
export function pickLatest(versions, includePrerelease) {
|
|
57
|
+
const eligible = includePrerelease
|
|
58
|
+
? versions
|
|
59
|
+
: versions.filter((v) => semver.prerelease(v) === null);
|
|
60
|
+
if (eligible.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
// semver.rcompare puts the highest precedence first.
|
|
63
|
+
return [...eligible].sort(semver.rcompare)[0];
|
|
64
|
+
}
|
|
65
|
+
/** Mirror LocalFileSource: a directory path resolves to `<dir>/telo.yaml`. */
|
|
66
|
+
function resolveManifestPath(inputPath) {
|
|
67
|
+
const resolved = path.resolve(process.cwd(), inputPath);
|
|
68
|
+
let stat;
|
|
69
|
+
try {
|
|
70
|
+
stat = fs.statSync(resolved);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return { filePath: resolved, error: err instanceof Error ? err.message : String(err) };
|
|
74
|
+
}
|
|
75
|
+
if (stat.isDirectory()) {
|
|
76
|
+
return { filePath: path.join(resolved, "telo.yaml") };
|
|
77
|
+
}
|
|
78
|
+
return { filePath: resolved };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Pure string-in / string-out core of the upgrade command. No filesystem
|
|
82
|
+
* access — `upgradeOne` is the disk-backed wrapper. Exported so tests can
|
|
83
|
+
* exercise the parse / fetch / decision pipeline without a tmpdir.
|
|
84
|
+
*
|
|
85
|
+
* The returned `content` is the rewritten YAML when `result.changed === true`,
|
|
86
|
+
* and the original `content` (byte-identical) when nothing matched.
|
|
87
|
+
*/
|
|
88
|
+
export async function upgradeManifest(args) {
|
|
89
|
+
const { content, registryUrl, includePrerelease, log, displayName } = args;
|
|
90
|
+
const result = {
|
|
91
|
+
changed: false,
|
|
92
|
+
upgrades: [],
|
|
93
|
+
unchanged: 0,
|
|
94
|
+
skipped: 0,
|
|
95
|
+
errors: 0,
|
|
96
|
+
};
|
|
97
|
+
const docs = parseAllDocuments(content, { customTags: defaultCustomTags() });
|
|
98
|
+
if (displayName !== undefined) {
|
|
99
|
+
console.log(`\nUpgrading ${log.dim(displayName)}`);
|
|
100
|
+
}
|
|
101
|
+
const edits = [];
|
|
102
|
+
for (const doc of docs) {
|
|
103
|
+
const json = doc.toJSON();
|
|
104
|
+
if (!json || json.kind !== "Telo.Import")
|
|
105
|
+
continue;
|
|
106
|
+
const source = json.source;
|
|
107
|
+
if (typeof source !== "string")
|
|
108
|
+
continue;
|
|
109
|
+
const ref = parseModuleRef(source);
|
|
110
|
+
if (!ref) {
|
|
111
|
+
console.log(` ${log.dim("·")} ${source} ${log.dim("skipped (not a registry ref)")}`);
|
|
112
|
+
result.skipped++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
let published;
|
|
116
|
+
try {
|
|
117
|
+
published = await fetchPublishedVersions(registryUrl, ref.namespace, ref.name);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
console.error(` ${log.error("✗")} ${ref.namespace}/${ref.name} ` +
|
|
121
|
+
(err instanceof Error ? err.message : String(err)));
|
|
122
|
+
result.errors++;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (published === null || published.length === 0) {
|
|
126
|
+
console.log(` ${log.warn("!")} ${ref.namespace}/${ref.name} ${log.dim("no published versions in registry")}`);
|
|
127
|
+
result.skipped++;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const best = pickLatest(published, includePrerelease);
|
|
131
|
+
if (!best) {
|
|
132
|
+
// Versions exist but none pass the prerelease filter / semver parser.
|
|
133
|
+
console.log(` ${log.warn("!")} ${ref.namespace}/${ref.name} ${log.dim("no eligible versions in registry")}`);
|
|
134
|
+
result.skipped++;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (!ref.version) {
|
|
138
|
+
console.log(` ${log.warn("!")} ${ref.namespace}/${ref.name} ${log.dim(`unparseable current version (${ref.rawVersion})`)}`);
|
|
139
|
+
result.skipped++;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const currentPublished = published.some((v) => semver.eq(v, ref.version));
|
|
143
|
+
const cmp = semver.compare(best, ref.version);
|
|
144
|
+
// The pinned version is in the registry and matches the latest pick — nothing to do.
|
|
145
|
+
if (currentPublished && cmp === 0) {
|
|
146
|
+
console.log(` ${log.ok("=")} ${ref.namespace}/${ref.name} ${log.dim(`already at ${ref.version}`)}`);
|
|
147
|
+
result.unchanged++;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// currentPublished && cmp < 0 shouldn't be possible — `best` is the max of
|
|
151
|
+
// `published`, and `currentPublished` means the pin is in that list. Keep a
|
|
152
|
+
// defensive branch so we don't silently swallow it.
|
|
153
|
+
if (currentPublished && cmp < 0) {
|
|
154
|
+
console.log(` ${log.ok("=")} ${ref.namespace}/${ref.name} ${log.dim(`already at ${ref.version}`)}`);
|
|
155
|
+
result.unchanged++;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const edit = buildSourceEdit(doc, content, `${ref.namespace}/${ref.name}@${best}`);
|
|
159
|
+
if (!edit) {
|
|
160
|
+
// No range info — extremely unlikely for a freshly parsed doc, but bail
|
|
161
|
+
// out loudly rather than silently dropping the rewrite.
|
|
162
|
+
console.error(` ${log.error("✗")} ${ref.namespace}/${ref.name} source scalar has no range — skipping`);
|
|
163
|
+
result.errors++;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
edits.push(edit);
|
|
167
|
+
result.changed = true;
|
|
168
|
+
result.upgrades.push({
|
|
169
|
+
packagePath: `${ref.namespace}/${ref.name}`,
|
|
170
|
+
from: ref.version,
|
|
171
|
+
to: best,
|
|
172
|
+
});
|
|
173
|
+
if (currentPublished) {
|
|
174
|
+
// Pinned version exists in the registry, just older — straight upgrade.
|
|
175
|
+
console.log(` ${log.ok("↑")} ${ref.namespace}/${ref.name} ${ref.version} → ${log.ok(best)}`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Pinned version NOT in the registry — broken pin, repair to latest
|
|
179
|
+
// regardless of direction.
|
|
180
|
+
const arrow = cmp >= 0 ? log.ok("↑") : log.warn("↓");
|
|
181
|
+
console.log(` ${arrow} ${ref.namespace}/${ref.name} ${ref.version} → ${log.ok(best)} ${log.warn("(pinned version not in registry)")}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { content: applyEdits(content, edits), result };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Build a byte-level edit for a `Telo.Import` doc's `source:` scalar.
|
|
188
|
+
* Returns `null` when the parser didn't attach a range to the node — this
|
|
189
|
+
* shouldn't happen for plain `parseAllDocuments` output but we don't want to
|
|
190
|
+
* crash on weird inputs.
|
|
191
|
+
*
|
|
192
|
+
* Quote style is preserved: if the original scalar was written as
|
|
193
|
+
* `source: "std/run@0.2.4"` we re-emit `"std/run@0.2.7"`; plain stays plain.
|
|
194
|
+
*/
|
|
195
|
+
function buildSourceEdit(
|
|
196
|
+
// `Document` from yaml v2 — typed as unknown here to avoid leaking the
|
|
197
|
+
// import into the public signature of this helper.
|
|
198
|
+
doc, content, newPin) {
|
|
199
|
+
const node = doc.get("source", true);
|
|
200
|
+
if (!node || typeof node !== "object")
|
|
201
|
+
return null;
|
|
202
|
+
const range = node.range;
|
|
203
|
+
if (!Array.isArray(range) || range.length < 2)
|
|
204
|
+
return null;
|
|
205
|
+
const start = range[0];
|
|
206
|
+
const end = range[1];
|
|
207
|
+
if (typeof start !== "number" || typeof end !== "number")
|
|
208
|
+
return null;
|
|
209
|
+
// Inspect the original byte slice to decide whether to wrap the new value.
|
|
210
|
+
// The parsed scalar's `range[0..1]` covers the quotes (when quoted), so we
|
|
211
|
+
// check the first/last char against `"` and `'` rather than relying on
|
|
212
|
+
// `node.type`, which is fine but adds another yaml-internal dependency.
|
|
213
|
+
const original = content.slice(start, end);
|
|
214
|
+
let newText;
|
|
215
|
+
if (original.startsWith('"') && original.endsWith('"')) {
|
|
216
|
+
newText = `"${newPin}"`;
|
|
217
|
+
}
|
|
218
|
+
else if (original.startsWith("'") && original.endsWith("'")) {
|
|
219
|
+
newText = `'${newPin}'`;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
newText = newPin;
|
|
223
|
+
}
|
|
224
|
+
return { start, end, newText };
|
|
225
|
+
}
|
|
226
|
+
function applyEdits(content, edits) {
|
|
227
|
+
if (edits.length === 0)
|
|
228
|
+
return content;
|
|
229
|
+
// Reverse offset order keeps earlier ranges valid as we splice later ones in.
|
|
230
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
231
|
+
let out = content;
|
|
232
|
+
for (const e of sorted) {
|
|
233
|
+
out = out.slice(0, e.start) + e.newText + out.slice(e.end);
|
|
234
|
+
}
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
export async function upgradeOne(inputPath, registryUrl, includePrerelease, dryRun, log) {
|
|
238
|
+
const { filePath, error: resolveError } = resolveManifestPath(inputPath);
|
|
239
|
+
const displayPath = path.relative(process.cwd(), filePath);
|
|
240
|
+
if (resolveError) {
|
|
241
|
+
console.error(`${displayPath} ${log.error("error")} ${resolveError}`);
|
|
242
|
+
return { changed: false, upgrades: [], unchanged: 0, skipped: 0, errors: 1 };
|
|
243
|
+
}
|
|
244
|
+
let content;
|
|
245
|
+
try {
|
|
246
|
+
content = fs.readFileSync(filePath, "utf-8");
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
console.error(`${displayPath} ${log.error("error")} cannot read file: ` +
|
|
250
|
+
(err instanceof Error ? err.message : String(err)));
|
|
251
|
+
return { changed: false, upgrades: [], unchanged: 0, skipped: 0, errors: 1 };
|
|
252
|
+
}
|
|
253
|
+
const { content: nextContent, result } = await upgradeManifest({
|
|
254
|
+
content,
|
|
255
|
+
registryUrl,
|
|
256
|
+
includePrerelease,
|
|
257
|
+
log,
|
|
258
|
+
displayName: displayPath,
|
|
259
|
+
});
|
|
260
|
+
if (result.changed && !dryRun) {
|
|
261
|
+
fs.writeFileSync(filePath, nextContent, "utf-8");
|
|
262
|
+
}
|
|
263
|
+
if (result.changed && dryRun) {
|
|
264
|
+
console.log(` ${log.dim(`dry-run: ${result.upgrades.length} import(s) would be updated`)}`);
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
export async function upgrade(argv) {
|
|
269
|
+
const log = createLogger(false);
|
|
270
|
+
const registryUrl = argv.registryUrl ?? process.env.TELO_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;
|
|
271
|
+
let totalUpgrades = 0;
|
|
272
|
+
let totalUnchanged = 0;
|
|
273
|
+
let totalSkipped = 0;
|
|
274
|
+
let totalErrors = 0;
|
|
275
|
+
for (const p of argv.paths) {
|
|
276
|
+
const r = await upgradeOne(p, registryUrl, argv.includePrerelease, argv.dryRun, log);
|
|
277
|
+
totalUpgrades += r.upgrades.length;
|
|
278
|
+
totalUnchanged += r.unchanged;
|
|
279
|
+
totalSkipped += r.skipped;
|
|
280
|
+
totalErrors += r.errors;
|
|
281
|
+
}
|
|
282
|
+
const parts = [];
|
|
283
|
+
parts.push(`${totalUpgrades} upgraded${argv.dryRun && totalUpgrades > 0 ? log.dim(" (dry-run)") : ""}`);
|
|
284
|
+
if (totalUnchanged > 0)
|
|
285
|
+
parts.push(log.dim(`${totalUnchanged} already current`));
|
|
286
|
+
if (totalSkipped > 0)
|
|
287
|
+
parts.push(log.dim(`${totalSkipped} skipped`));
|
|
288
|
+
if (totalErrors > 0)
|
|
289
|
+
parts.push(log.error(`${totalErrors} error${totalErrors !== 1 ? "s" : ""}`));
|
|
290
|
+
console.log(`\n${parts.join(", ")}`);
|
|
291
|
+
if (totalErrors > 0)
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
export function upgradeCommand(yargs) {
|
|
295
|
+
return yargs.command("upgrade <paths..>", "Bump Telo.Import sources to the latest published version in the registry", (y) => y
|
|
296
|
+
.positional("paths", {
|
|
297
|
+
describe: "Paths to YAML manifests to upgrade",
|
|
298
|
+
type: "string",
|
|
299
|
+
array: true,
|
|
300
|
+
demandOption: true,
|
|
301
|
+
})
|
|
302
|
+
.option("registry-url", {
|
|
303
|
+
type: "string",
|
|
304
|
+
describe: "Base URL for the telo module registry. Overrides TELO_REGISTRY_URL.",
|
|
305
|
+
})
|
|
306
|
+
.option("include-prerelease", {
|
|
307
|
+
type: "boolean",
|
|
308
|
+
default: false,
|
|
309
|
+
describe: "Include pre-release versions (e.g. 1.0.0-beta.1) when picking the latest",
|
|
310
|
+
})
|
|
311
|
+
.option("dry-run", {
|
|
312
|
+
type: "boolean",
|
|
313
|
+
default: false,
|
|
314
|
+
describe: "Show what would change without writing to disk",
|
|
315
|
+
}), async (argv) => {
|
|
316
|
+
await upgrade(argv);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAe,MAAM,cAAc,CAAC;AAEzD,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAWzD,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IACpD,0EAA0E;IAC1E,wEAAwE;IACxE,2EAA2E;IAC3E,qEAAqE;IACrE,gBAAgB;IAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,yEAAyE;IACzE,0CAA0C;IAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;AAC5E,CAAC;AAQD,KAAK,UAAU,sBAAsB,CACnC,WAAmB,EACnB,SAAiB,EACjB,IAAY;IAEZ,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,QAAQ,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7C,0EAA0E;IAC1E,6EAA6E;IAC7E,OAAO,IAAI,CAAC,QAAQ;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,0BAA0B;AAC1B,MAAM,UAAU,UAAU,CAAC,QAAkB,EAAE,iBAA0B;IACvE,MAAM,QAAQ,GAAG,iBAAiB;QAChC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,qDAAqD;IACrD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAgBD,8EAA8E;AAC9E,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACxD,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAOrC;IACC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE3E,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;KACV,CAAC;IAEF,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAE7E,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAgBD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;YAAE,SAAS;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QAEzC,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,SAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI;gBACnD,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACrD,CAAC;YACF,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,CACpG,CAAC;YACF,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,sEAAsE;YACtE,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,kCAAkC,CAAC,EAAE,CACnG,CAAC;YACF,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,CAClH,CAAC;YACF,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,OAAQ,CAAC,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAE9C,qFAAqF;QACrF,IAAI,gBAAgB,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAC1F,CAAC;YACF,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,2EAA2E;QAC3E,4EAA4E;QAC5E,oDAAoD;QACpD,IAAI,gBAAgB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAC1F,CAAC;YACF,MAAM,CAAC,SAAS,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,wEAAwE;YACxE,wDAAwD;YACxD,OAAO,CAAC,KAAK,CACX,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,yCAAyC,CAC3F,CAAC;YACF,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnB,WAAW,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE;YAC3C,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,EAAE,EAAE,IAAI;SACT,CAAC,CAAC;QAEH,IAAI,gBAAgB,EAAE,CAAC;YACrB,wEAAwE;YACxE,OAAO,CAAC,GAAG,CACT,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CACnF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,2BAA2B;YAC3B,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAC9H,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe;AACtB,uEAAuE;AACvE,mDAAmD;AACnD,GAAuD,EACvD,OAAe,EACf,MAAc;IAEd,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,KAAK,GAAI,IAA4B,CAAC,KAAK,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEtE,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,wEAAwE;IACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,OAAe,CAAC;IACpB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC;IAC1B,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,UAAU,CACjB,OAAe,EACf,KAA6D;IAE7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,8EAA8E;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,GAAG,GAAG,OAAO,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB,EACjB,WAAmB,EACnB,iBAA0B,EAC1B,MAAe,EACf,GAAW;IAEX,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE3D,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,GAAG,WAAW,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAsB;YACzD,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACrD,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC;QAC7D,OAAO;QACP,WAAW;QACX,iBAAiB;QACjB,GAAG;QACH,WAAW,EAAE,WAAW;KACzB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,6BAA6B,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAK7B;IACC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,oBAAoB,CAAC;IAE5E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrF,aAAa,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnC,cAAc,IAAI,CAAC,CAAC,SAAS,CAAC;QAC9B,YAAY,IAAI,CAAC,CAAC,OAAO,CAAC;QAC1B,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACR,GAAG,aAAa,YAAY,IAAI,CAAC,MAAM,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5F,CAAC;IACF,IAAI,cAAc,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,kBAAkB,CAAC,CAAC,CAAC;IACjF,IAAI,YAAY,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC;IACrE,IAAI,WAAW,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,WAAW,SAAS,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAClG,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAW;IACxC,OAAO,KAAK,CAAC,OAAO,CAClB,mBAAmB,EACnB,0EAA0E,EAC1E,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;SACE,UAAU,CAAC,OAAO,EAAE;QACnB,QAAQ,EAAE,oCAAoC;QAC9C,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,IAAI;KACnB,CAAC;SACD,MAAM,CAAC,cAAc,EAAE;QACtB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,qEAAqE;KAChF,CAAC;SACD,MAAM,CAAC,oBAAoB,EAAE;QAC5B,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,0EAA0E;KACrF,CAAC;SACD,MAAM,CAAC,SAAS,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,gDAAgD;KAC3D,CAAC,EACN,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,OAAO,CAAC,IAAW,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telorun/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Telo CLI - Command-line interface for the Telo runtime.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"telo",
|
|
@@ -34,20 +34,23 @@
|
|
|
34
34
|
"dist"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@telorun/analyzer": "0.
|
|
38
|
-
"@telorun/ide-support": "0.4.
|
|
39
|
-
"@telorun/kernel": "0.
|
|
40
|
-
"@telorun/sdk": "0.
|
|
41
|
-
"@telorun/templating": "0.
|
|
37
|
+
"@telorun/analyzer": "0.12.0",
|
|
38
|
+
"@telorun/ide-support": "0.4.8",
|
|
39
|
+
"@telorun/kernel": "0.13.0",
|
|
40
|
+
"@telorun/sdk": "0.12.0",
|
|
41
|
+
"@telorun/templating": "0.3.0",
|
|
42
42
|
"dotenv": "^17.4.0",
|
|
43
43
|
"minimatch": "^10.2.5",
|
|
44
44
|
"packageurl-js": "^2.0.1",
|
|
45
|
+
"semver": "^7.7.3",
|
|
45
46
|
"yaml": "^2.8.3",
|
|
46
47
|
"yargs": "^17.7.2"
|
|
47
48
|
},
|
|
48
49
|
"devDependencies": {
|
|
49
50
|
"@types/node": "^20.0.0",
|
|
51
|
+
"@types/semver": "^7.7.1",
|
|
50
52
|
"@types/yargs": "^17.0.33",
|
|
53
|
+
"nock": "^14.0.15",
|
|
51
54
|
"typescript": "^5.0.0",
|
|
52
55
|
"vitest": "^2.1.8"
|
|
53
56
|
},
|
|
@@ -60,6 +63,7 @@
|
|
|
60
63
|
"dotenv": "$dotenv",
|
|
61
64
|
"minimatch": "$minimatch",
|
|
62
65
|
"packageurl-js": "$packageurl-js",
|
|
66
|
+
"semver": "$semver",
|
|
63
67
|
"yaml": "$yaml",
|
|
64
68
|
"yargs": "$yargs"
|
|
65
69
|
},
|