@scenar/cli 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/example-bundle/embed.js +1 -0
  2. package/example-bundle/pack-manifest.json +6 -0
  3. package/package.json +4 -8
  4. package/src/__tests__/embed-loader.test.ts +29 -0
  5. package/src/__tests__/embed-snippet.test.ts +48 -1
  6. package/src/__tests__/install-command.test.ts +97 -0
  7. package/src/__tests__/local-url.test.ts +17 -0
  8. package/src/__tests__/run-install.test.ts +222 -0
  9. package/src/api.d.ts +3 -1
  10. package/src/api.d.ts.map +1 -1
  11. package/src/api.js +3 -1
  12. package/src/api.js.map +1 -1
  13. package/src/api.ts +10 -1
  14. package/src/commands/install.d.ts +3 -0
  15. package/src/commands/install.d.ts.map +1 -0
  16. package/src/commands/install.js +67 -0
  17. package/src/commands/install.js.map +1 -0
  18. package/src/commands/install.ts +89 -0
  19. package/src/commands/pack.js +2 -2
  20. package/src/commands/pack.js.map +1 -1
  21. package/src/commands/pack.ts +2 -2
  22. package/src/commands/publish.d.ts.map +1 -1
  23. package/src/commands/publish.js +3 -1
  24. package/src/commands/publish.js.map +1 -1
  25. package/src/commands/publish.ts +5 -1
  26. package/src/commands/serve.d.ts.map +1 -1
  27. package/src/commands/serve.js +3 -2
  28. package/src/commands/serve.js.map +1 -1
  29. package/src/commands/serve.ts +5 -2
  30. package/src/commands/try.js +1 -1
  31. package/src/commands/try.ts +1 -1
  32. package/src/{deploy → embed}/embed-snippet.d.ts +16 -0
  33. package/src/embed/embed-snippet.d.ts.map +1 -0
  34. package/src/{deploy → embed}/embed-snippet.js +27 -0
  35. package/src/embed/embed-snippet.js.map +1 -0
  36. package/src/{deploy → embed}/embed-snippet.ts +28 -0
  37. package/src/index.d.ts.map +1 -1
  38. package/src/index.js +3 -5
  39. package/src/index.js.map +1 -1
  40. package/src/index.ts +3 -5
  41. package/src/install/run-install.d.ts +72 -0
  42. package/src/install/run-install.d.ts.map +1 -0
  43. package/src/install/run-install.js +378 -0
  44. package/src/install/run-install.js.map +1 -0
  45. package/src/install/run-install.ts +461 -0
  46. package/src/install/scaffold.d.ts +29 -0
  47. package/src/install/scaffold.d.ts.map +1 -0
  48. package/src/install/scaffold.js +233 -0
  49. package/src/install/scaffold.js.map +1 -0
  50. package/src/install/scaffold.ts +255 -0
  51. package/src/pack/embed-loader.d.ts +18 -0
  52. package/src/pack/embed-loader.d.ts.map +1 -0
  53. package/src/pack/embed-loader.js +25 -0
  54. package/src/pack/embed-loader.js.map +1 -0
  55. package/src/pack/embed-loader.ts +27 -0
  56. package/src/pack/pack-manifest.d.ts +1 -1
  57. package/src/pack/pack-manifest.d.ts.map +1 -1
  58. package/src/pack/pack-manifest.ts +1 -1
  59. package/src/pack/run-pack.d.ts.map +1 -1
  60. package/src/pack/run-pack.js +6 -0
  61. package/src/pack/run-pack.js.map +1 -1
  62. package/src/pack/run-pack.ts +7 -0
  63. package/src/publish/publish-flow.d.ts +3 -3
  64. package/src/publish/publish-flow.js +3 -3
  65. package/src/publish/publish-flow.ts +3 -3
  66. package/src/publish/run-publish.d.ts +2 -0
  67. package/src/publish/run-publish.d.ts.map +1 -1
  68. package/src/publish/run-publish.js +3 -2
  69. package/src/publish/run-publish.js.map +1 -1
  70. package/src/publish/run-publish.ts +5 -2
  71. package/src/render/detect-render-export.d.ts +2 -2
  72. package/src/render/detect-render-export.js +2 -2
  73. package/src/render/detect-render-export.ts +2 -2
  74. package/src/serve/local-url.d.ts +8 -0
  75. package/src/serve/local-url.d.ts.map +1 -0
  76. package/src/serve/local-url.js +21 -0
  77. package/src/serve/local-url.js.map +1 -0
  78. package/src/serve/local-url.ts +20 -0
  79. package/src/serve/run-serve.d.ts +2 -0
  80. package/src/serve/run-serve.d.ts.map +1 -1
  81. package/src/serve/run-serve.js +4 -3
  82. package/src/serve/run-serve.js.map +1 -1
  83. package/src/serve/run-serve.ts +6 -3
  84. package/tsconfig.tsbuildinfo +1 -1
  85. package/src/__tests__/deploy-command.test.ts +0 -45
  86. package/src/__tests__/deploy-flow.test.ts +0 -125
  87. package/src/__tests__/deploy-upload.test.ts +0 -39
  88. package/src/commands/deploy.d.ts +0 -3
  89. package/src/commands/deploy.d.ts.map +0 -1
  90. package/src/commands/deploy.js +0 -150
  91. package/src/commands/deploy.js.map +0 -1
  92. package/src/commands/deploy.ts +0 -186
  93. package/src/commands/preview.d.ts +0 -3
  94. package/src/commands/preview.d.ts.map +0 -1
  95. package/src/commands/preview.js +0 -93
  96. package/src/commands/preview.js.map +0 -1
  97. package/src/commands/preview.ts +0 -138
  98. package/src/deploy/client.d.ts +0 -20
  99. package/src/deploy/client.d.ts.map +0 -1
  100. package/src/deploy/client.js +0 -22
  101. package/src/deploy/client.js.map +0 -1
  102. package/src/deploy/client.ts +0 -28
  103. package/src/deploy/deploy-flow.d.ts +0 -78
  104. package/src/deploy/deploy-flow.d.ts.map +0 -1
  105. package/src/deploy/deploy-flow.js +0 -53
  106. package/src/deploy/deploy-flow.js.map +0 -1
  107. package/src/deploy/deploy-flow.ts +0 -115
  108. package/src/deploy/embed-snippet.d.ts.map +0 -1
  109. package/src/deploy/embed-snippet.js.map +0 -1
  110. package/src/deploy/upload.d.ts +0 -10
  111. package/src/deploy/upload.d.ts.map +0 -1
  112. package/src/deploy/upload.js +0 -23
  113. package/src/deploy/upload.js.map +0 -1
  114. package/src/deploy/upload.ts +0 -29
@@ -0,0 +1,378 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { parse as parseYaml } from "yaml";
5
+ import { scaffoldProject } from "./scaffold.js";
6
+ /**
7
+ * Bootstrap a Scenar demos project: scaffold (if empty), record the requested
8
+ * component packages as ordinary dependencies, and run the package manager.
9
+ *
10
+ * The command is intentionally resolver-agnostic — it only writes dependency
11
+ * entries and delegates resolution to the package manager — so a positional
12
+ * argument can be a registry version, a `workspace:*` spec, a `file:`/`link:`
13
+ * path, or a git URL. Dependency resolution is the package manager's job, not
14
+ * ours.
15
+ */
16
+ export function runInstall(options) {
17
+ const cwd = path.resolve(options.cwd);
18
+ const pkgPath = path.join(cwd, "package.json");
19
+ // --- 1. Scaffold a fresh project if there's no package.json yet. ---
20
+ let scaffolded = false;
21
+ let scaffold = { created: [] };
22
+ if (!fs.existsSync(pkgPath)) {
23
+ scaffold = scaffoldProject(cwd);
24
+ scaffolded = true;
25
+ options.onLog(`\x1b[36m●\x1b[0m Scaffolded a new Scenar demos project`);
26
+ for (const file of scaffold.created) {
27
+ options.onLog(` \x1b[32m✓\x1b[0m ${file}`);
28
+ }
29
+ }
30
+ // --- 2. Detect workspace + package manager. ---
31
+ const workspaceRoot = findWorkspaceRoot(cwd);
32
+ const packageManager = options.packageManager ?? detectPackageManager(workspaceRoot ?? cwd);
33
+ const installDir = workspaceRoot ?? cwd;
34
+ // --- 3. Record the requested packages as dependencies. ---
35
+ const added = options.packages.map((raw) => parseSpec(raw, cwd));
36
+ if (added.length > 0) {
37
+ const memberNames = workspaceRoot
38
+ ? workspaceMemberNames(workspaceRoot)
39
+ : new Set();
40
+ mergeDependencies(pkgPath, added, { packageManager, memberNames });
41
+ options.onLog(`\x1b[36m●\x1b[0m Added dependencies`);
42
+ for (const spec of added) {
43
+ options.onLog(` \x1b[32m✓\x1b[0m ${spec.name}`);
44
+ }
45
+ }
46
+ // --- 4. Install. ---
47
+ let installRan = false;
48
+ if (!options.skipInstall) {
49
+ options.onLog(`\n\x1b[36m●\x1b[0m Installing with ${packageManager}` +
50
+ (workspaceRoot ? ` (workspace root: ${path.relative(cwd, installDir) || "."})` : ""));
51
+ runPackageManagerInstall(packageManager, installDir);
52
+ installRan = true;
53
+ // Bare registry specs were written as "*"; pin them to what actually
54
+ // resolved so the project gets a clean, reproducible package.json.
55
+ pinResolvedRanges(pkgPath, added);
56
+ }
57
+ return {
58
+ scaffolded,
59
+ scaffoldCreated: scaffold.created,
60
+ added,
61
+ packageManager,
62
+ workspaceRoot,
63
+ installRan,
64
+ };
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Dependency-spec parsing
68
+ // ---------------------------------------------------------------------------
69
+ /** Locator-prefixed specs whose name lives in the target, not the string. */
70
+ const PATH_SPEC_RE = /^(file:|link:)(.+)$/;
71
+ const URL_SPEC_RE = /^(git\+|git:|https?:|github:|bitbucket:|gitlab:)/;
72
+ /**
73
+ * Parse one positional install argument into a `{ name, range }` pair.
74
+ *
75
+ * Handles the common forms (`name`, `name@range`, `@scope/name`,
76
+ * `@scope/name@range`), resolves `file:`/`link:` names from the target's
77
+ * `package.json`, and rejects git/URL specs that carry no package name (the
78
+ * user should add those to `package.json` directly, then re-run).
79
+ */
80
+ export function parseSpec(raw, cwd) {
81
+ const spec = raw.trim();
82
+ const pathMatch = PATH_SPEC_RE.exec(spec);
83
+ if (pathMatch) {
84
+ const target = path.resolve(cwd, pathMatch[2]);
85
+ const name = readPackageName(target);
86
+ if (!name) {
87
+ throw new Error(`could not read a package name from "${spec}". Make sure the path ` +
88
+ `points at a directory containing a package.json.`);
89
+ }
90
+ return { name, range: spec };
91
+ }
92
+ if (URL_SPEC_RE.test(spec)) {
93
+ throw new Error(`git/URL dependency "${spec}" has no package name. Add it to ` +
94
+ `package.json (e.g. "your-pkg": "${spec}") and run \`scenar install\`.`);
95
+ }
96
+ // name | name@range | @scope/name | @scope/name@range
97
+ const scoped = spec.startsWith("@");
98
+ const at = spec.indexOf("@", scoped ? 1 : 0);
99
+ if (at === -1)
100
+ return { name: spec, range: "" };
101
+ return { name: spec.slice(0, at), range: spec.slice(at + 1) };
102
+ }
103
+ /**
104
+ * Merge parsed specs into `dependencies`, idempotently. Existing pins are kept
105
+ * when the user passed a bare name; an explicit range always wins. Bare names
106
+ * that match a workspace member become `workspace:*` (pnpm/yarn) or `*` (npm),
107
+ * and other bare names default to `*` (pinned post-install).
108
+ */
109
+ function mergeDependencies(pkgPath, specs, ctx) {
110
+ const pkg = readJson(pkgPath);
111
+ const deps = { ...(pkg.dependencies ?? {}) };
112
+ for (const { name, range } of specs) {
113
+ if (range === "" && deps[name])
114
+ continue; // keep existing pin
115
+ if (range !== "") {
116
+ deps[name] = range;
117
+ }
118
+ else if (ctx.memberNames.has(name)) {
119
+ deps[name] =
120
+ ctx.packageManager === "npm" ? "*" : "workspace:*";
121
+ }
122
+ else {
123
+ deps[name] = "*";
124
+ }
125
+ }
126
+ pkg.dependencies = sortKeys(deps);
127
+ writeJson(pkgPath, pkg);
128
+ }
129
+ /**
130
+ * Replace any `"*"` dependency ranges with `^<installed version>` after a
131
+ * successful install, so a bare `scenar install @foo/bar` yields a clean,
132
+ * reproducible pin. Best-effort: workspace specs and unresolved packages are
133
+ * left untouched.
134
+ */
135
+ function pinResolvedRanges(pkgPath, specs) {
136
+ const pkg = readJson(pkgPath);
137
+ const deps = pkg.dependencies ?? {};
138
+ const nodeModules = path.join(path.dirname(pkgPath), "node_modules");
139
+ let changed = false;
140
+ for (const name of new Set(specs.map((s) => s.name))) {
141
+ if (deps[name] !== "*")
142
+ continue;
143
+ const version = readPackageVersion(path.join(nodeModules, name));
144
+ if (version) {
145
+ deps[name] = `^${version}`;
146
+ changed = true;
147
+ }
148
+ }
149
+ if (changed) {
150
+ pkg.dependencies = deps;
151
+ writeJson(pkgPath, pkg);
152
+ }
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Workspace + package-manager detection
156
+ // ---------------------------------------------------------------------------
157
+ /**
158
+ * Walk up from `startDir` to find the nearest workspace root that actually
159
+ * contains `startDir` as a member — a directory with a `pnpm-workspace.yaml`
160
+ * or a `package.json` `workspaces` field whose globs match `startDir`. Returns
161
+ * null when the project is standalone.
162
+ */
163
+ export function findWorkspaceRoot(startDir) {
164
+ let dir = path.resolve(startDir);
165
+ // The project's own package.json is never its workspace root, so start above.
166
+ let current = path.dirname(dir);
167
+ while (true) {
168
+ const globs = readWorkspaceGlobs(current);
169
+ if (globs && matchesAnyGlob(path.relative(current, dir), globs)) {
170
+ return current;
171
+ }
172
+ const parent = path.dirname(current);
173
+ if (parent === current)
174
+ return null;
175
+ current = parent;
176
+ }
177
+ }
178
+ /** Read workspace package globs from pnpm-workspace.yaml or package.json. */
179
+ function readWorkspaceGlobs(dir) {
180
+ const pnpmManifest = path.join(dir, "pnpm-workspace.yaml");
181
+ if (fs.existsSync(pnpmManifest)) {
182
+ try {
183
+ const parsed = parseYaml(fs.readFileSync(pnpmManifest, "utf-8"));
184
+ if (Array.isArray(parsed?.packages))
185
+ return parsed.packages;
186
+ }
187
+ catch {
188
+ // Malformed manifest — fall through to package.json.
189
+ }
190
+ }
191
+ const pkgPath = path.join(dir, "package.json");
192
+ if (fs.existsSync(pkgPath)) {
193
+ try {
194
+ const pkg = readJson(pkgPath);
195
+ const ws = pkg.workspaces;
196
+ if (Array.isArray(ws))
197
+ return ws;
198
+ if (ws && Array.isArray(ws.packages)) {
199
+ return ws.packages;
200
+ }
201
+ }
202
+ catch {
203
+ // Ignore unreadable package.json.
204
+ }
205
+ }
206
+ return null;
207
+ }
208
+ /** Test a member path (relative to the workspace root) against workspace globs. */
209
+ function matchesAnyGlob(relMember, globs) {
210
+ const normalized = relMember.split(path.sep).join("/");
211
+ return globs.some((glob) => globToRegExp(glob).test(normalized));
212
+ }
213
+ /**
214
+ * Convert a workspace glob (e.g. `packages/*`, `apps/**`) to a RegExp. Supports
215
+ * the `*` (one segment) and `**` (any depth) wildcards that workspace manifests
216
+ * use; everything else is matched literally.
217
+ */
218
+ function globToRegExp(glob) {
219
+ const trimmed = glob.replace(/\/+$/, "");
220
+ let re = "";
221
+ for (let i = 0; i < trimmed.length; i++) {
222
+ const c = trimmed[i];
223
+ if (c === "*") {
224
+ if (trimmed[i + 1] === "*") {
225
+ re += ".*";
226
+ i++;
227
+ if (trimmed[i + 1] === "/")
228
+ i++;
229
+ }
230
+ else {
231
+ re += "[^/]*";
232
+ }
233
+ }
234
+ else if (/[.+?^${}()|[\]\\]/.test(c)) {
235
+ re += "\\" + c;
236
+ }
237
+ else {
238
+ re += c;
239
+ }
240
+ }
241
+ return new RegExp(`^${re}$`);
242
+ }
243
+ /** Collect the package names of all workspace members under `root`. */
244
+ function workspaceMemberNames(root) {
245
+ const names = new Set();
246
+ const globs = readWorkspaceGlobs(root);
247
+ if (!globs)
248
+ return names;
249
+ for (const glob of globs) {
250
+ for (const memberDir of expandGlobDirs(root, glob)) {
251
+ const name = readPackageName(memberDir);
252
+ if (name)
253
+ names.add(name);
254
+ }
255
+ }
256
+ return names;
257
+ }
258
+ /**
259
+ * Expand a single workspace glob into existing member directories. Only the
260
+ * `pkgs/*` and `pkgs/**` shapes that workspace manifests use are supported;
261
+ * each candidate is kept only if it contains a `package.json`.
262
+ */
263
+ function expandGlobDirs(root, glob) {
264
+ const trimmed = glob.replace(/\/+$/, "");
265
+ const parts = trimmed.split("/");
266
+ let dirs = [root];
267
+ for (const part of parts) {
268
+ const next = [];
269
+ for (const dir of dirs) {
270
+ if (part === "*" || part === "**") {
271
+ for (const entry of safeReaddir(dir)) {
272
+ const full = path.join(dir, entry.name);
273
+ if (entry.isDirectory())
274
+ next.push(full);
275
+ }
276
+ }
277
+ else {
278
+ const full = path.join(dir, part);
279
+ if (fs.existsSync(full))
280
+ next.push(full);
281
+ }
282
+ }
283
+ dirs = next;
284
+ }
285
+ return dirs.filter((dir) => fs.existsSync(path.join(dir, "package.json")));
286
+ }
287
+ /**
288
+ * Detect the package manager by the nearest lockfile, walking up from `dir`.
289
+ * Defaults to npm when nothing is found.
290
+ */
291
+ export function detectPackageManager(dir) {
292
+ let current = path.resolve(dir);
293
+ while (true) {
294
+ if (fs.existsSync(path.join(current, "pnpm-lock.yaml")))
295
+ return "pnpm";
296
+ if (fs.existsSync(path.join(current, "yarn.lock")))
297
+ return "yarn";
298
+ if (fs.existsSync(path.join(current, "package-lock.json")))
299
+ return "npm";
300
+ const parent = path.dirname(current);
301
+ if (parent === current)
302
+ return "npm";
303
+ current = parent;
304
+ }
305
+ }
306
+ // ---------------------------------------------------------------------------
307
+ // Subprocess
308
+ // ---------------------------------------------------------------------------
309
+ /** Run `<pm> install` in `dir`, throwing a clear error on failure. */
310
+ function runPackageManagerInstall(pm, dir) {
311
+ const result = spawnSync(pm, ["install"], {
312
+ cwd: dir,
313
+ stdio: "inherit",
314
+ // Windows resolves npm/yarn/pnpm via the shell.
315
+ shell: process.platform === "win32",
316
+ });
317
+ if (result.error) {
318
+ const code = result.error.code;
319
+ if (code === "ENOENT") {
320
+ throw new Error(`${pm} was not found on your PATH. Install it, or pass ` +
321
+ `--package-manager <npm|yarn|pnpm>.`);
322
+ }
323
+ throw result.error;
324
+ }
325
+ if (typeof result.status === "number" && result.status !== 0) {
326
+ throw new Error(`${pm} install failed (exit code ${result.status}). If a package is ` +
327
+ `private or unpublished, check your registry access and authentication.`);
328
+ }
329
+ }
330
+ // ---------------------------------------------------------------------------
331
+ // JSON / fs helpers
332
+ // ---------------------------------------------------------------------------
333
+ function readJson(file) {
334
+ return JSON.parse(fs.readFileSync(file, "utf-8"));
335
+ }
336
+ function writeJson(file, value) {
337
+ fs.writeFileSync(file, JSON.stringify(value, null, 2) + "\n", "utf-8");
338
+ }
339
+ function readPackageName(dir) {
340
+ const pkgPath = path.join(dir, "package.json");
341
+ if (!fs.existsSync(pkgPath))
342
+ return null;
343
+ try {
344
+ const name = readJson(pkgPath).name;
345
+ return typeof name === "string" && name.length > 0 ? name : null;
346
+ }
347
+ catch {
348
+ return null;
349
+ }
350
+ }
351
+ function readPackageVersion(dir) {
352
+ const pkgPath = path.join(dir, "package.json");
353
+ if (!fs.existsSync(pkgPath))
354
+ return null;
355
+ try {
356
+ const version = readJson(pkgPath).version;
357
+ return typeof version === "string" && version.length > 0 ? version : null;
358
+ }
359
+ catch {
360
+ return null;
361
+ }
362
+ }
363
+ function safeReaddir(dir) {
364
+ try {
365
+ return fs.readdirSync(dir, { withFileTypes: true });
366
+ }
367
+ catch {
368
+ return [];
369
+ }
370
+ }
371
+ /** Sort object keys so generated package.json deps stay stable across runs. */
372
+ function sortKeys(obj) {
373
+ const sorted = {};
374
+ for (const key of Object.keys(obj).sort())
375
+ sorted[key] = obj[key];
376
+ return sorted;
377
+ }
378
+ //# sourceMappingURL=run-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-install.js","sourceRoot":"","sources":["../../../src/install/run-install.ts"],"names":[],"mappings":"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"}