@supernovaio/cli 2.0.40 → 2.0.41

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.
@@ -1,6 +1,5 @@
1
1
  import { AnalyzeCommandBase } from "../utils/analyze-command.js";
2
2
  export default class Analyze extends AnalyzeCommandBase {
3
- static hidden: boolean;
4
3
  static description: string;
5
4
  static examples: string[];
6
5
  static flags: {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,6BAA6B,CAAA;AAE9E,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,OAAgB,MAAM,UAAO;IAC7B,OAAgB,WAAW,SAA0E;IACrG,OAAgB,QAAQ,WAGvB;IACD,OAAgB,KAAK;;;;;;MAAe;IAGvB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,6BAA6B,CAAA;AAoB9E,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,OAAgB,WAAW,SAA+B;IAC1D,OAAgB,QAAQ,WAKvB;IACD,OAAgB,KAAK;;;;;;MAAe;IAGvB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="72f138af-8f7b-5b85-8570-234d6a37d37d")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3f3af4ca-e4e7-5c00-a85c-e086b173db13")}catch(e){}}();
3
3
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
4
4
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5
5
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -10,13 +10,33 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
11
11
  };
12
12
  import { SentryTraced } from "@sentry/nestjs";
13
+ import fs from "node:fs";
14
+ import path from "node:path";
15
+ import { fileURLToPath } from "node:url";
13
16
  import { AnalyzeCommandBase, analyzeFlags } from "../utils/analyze-command.js";
17
+ const fallbackAnalyzeHelpDescription = [
18
+ "Analyze components and package adoption for one or more packages.",
19
+ "Runs both scanners (`components` and `usage`) for each package target.",
20
+ "By default, generated snapshots are uploaded to Supernova and processing is tracked until completion.",
21
+ "Use `--dryRun` to keep results local only and skip upload, or `--noWait` to exit after processing starts.",
22
+ ].join("\n");
23
+ const loadAnalyzeHelpDescription = () => {
24
+ const commandFilePath = fileURLToPath(import.meta.url);
25
+ const docsPath = path.resolve(path.dirname(commandFilePath), "../../docs/code-analysis.md");
26
+ try {
27
+ return fs.readFileSync(docsPath, "utf8").trim();
28
+ }
29
+ catch {
30
+ return fallbackAnalyzeHelpDescription;
31
+ }
32
+ };
14
33
  export default class Analyze extends AnalyzeCommandBase {
15
- static hidden = true;
16
- static description = "Analyze components and adoption, then push all snapshots to Supernova";
34
+ static description = loadAnalyzeHelpDescription();
17
35
  static examples = [
18
- "<%= config.bin %> <%= command.id %> --designSystemId 123 --package @acme/ds",
36
+ "<%= config.bin %> <%= command.id %> --package @acme/ds --dryRun",
37
+ "<%= config.bin %> <%= command.id %> --designSystemId 1234 --package @acme/ds",
19
38
  "<%= config.bin %> <%= command.id %> --package @acme/ds --package @acme/icons",
39
+ "<%= config.bin %> analyze status --designSystemId 1234",
20
40
  ];
21
41
  static flags = analyzeFlags;
22
42
  async run() {
@@ -31,4 +51,4 @@ __decorate([
31
51
  __metadata("design:returntype", Promise)
32
52
  ], Analyze.prototype, "run", null);
33
53
  //# sourceMappingURL=analyze.js.map
34
- //# debugId=72f138af-8f7b-5b85-8570-234d6a37d37d
54
+ //# debugId=3f3af4ca-e4e7-5c00-a85c-e086b173db13
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sources":["../../src/commands/analyze.ts"],"sourceRoot":"","sourcesContent":["import { SentryTraced } from \"@sentry/nestjs\"\n\nimport { AnalyzeCommandBase, analyzeFlags } from \"../utils/analyze-command.js\"\n\nexport default class Analyze extends AnalyzeCommandBase {\n static override hidden = true\n static override description = \"Analyze components and adoption, then push all snapshots to Supernova\"\n static override examples = [\n \"<%= config.bin %> <%= command.id %> --designSystemId 123 --package @acme/ds\",\n \"<%= config.bin %> <%= command.id %> --package @acme/ds --package @acme/icons\",\n ]\n static override flags = analyzeFlags\n\n @SentryTraced()\n public async run(): Promise<void> {\n const { flags } = await this.parse(Analyze)\n await this.executeAnalyze(flags, \"all\")\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE9E,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,MAAM,CAAU,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAU,WAAW,GAAG,uEAAuE,CAAA;IACrG,MAAM,CAAU,QAAQ,GAAG;QACzB,6EAA6E;QAC7E,8EAA8E;KAC/E,CAAA;IACD,MAAM,CAAU,KAAK,GAAG,YAAY,CAAA;IAGvB,AAAN,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;;AAHY;IADZ,YAAY,EAAE;;;;kCAId","debug_id":"72f138af-8f7b-5b85-8570-234d6a37d37d"}
1
+ {"version":3,"file":"analyze.js","sources":["../../src/commands/analyze.ts"],"sourceRoot":"","sourcesContent":["import { SentryTraced } from \"@sentry/nestjs\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { AnalyzeCommandBase, analyzeFlags } from \"../utils/analyze-command.js\"\n\nconst fallbackAnalyzeHelpDescription = [\n \"Analyze components and package adoption for one or more packages.\",\n \"Runs both scanners (`components` and `usage`) for each package target.\",\n \"By default, generated snapshots are uploaded to Supernova and processing is tracked until completion.\",\n \"Use `--dryRun` to keep results local only and skip upload, or `--noWait` to exit after processing starts.\",\n].join(\"\\n\")\n\nconst loadAnalyzeHelpDescription = (): string => {\n const commandFilePath = fileURLToPath(import.meta.url)\n const docsPath = path.resolve(path.dirname(commandFilePath), \"../../docs/code-analysis.md\")\n\n try {\n return fs.readFileSync(docsPath, \"utf8\").trim()\n } catch {\n return fallbackAnalyzeHelpDescription\n }\n}\n\nexport default class Analyze extends AnalyzeCommandBase {\n static override description = loadAnalyzeHelpDescription()\n static override examples = [\n \"<%= config.bin %> <%= command.id %> --package @acme/ds --dryRun\",\n \"<%= config.bin %> <%= command.id %> --designSystemId 1234 --package @acme/ds\",\n \"<%= config.bin %> <%= command.id %> --package @acme/ds --package @acme/icons\",\n \"<%= config.bin %> analyze status --designSystemId 1234\",\n ]\n static override flags = analyzeFlags\n\n @SentryTraced()\n public async run(): Promise<void> {\n const { flags } = await this.parse(Analyze)\n await this.executeAnalyze(flags, \"all\")\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE9E,MAAM,8BAA8B,GAAG;IACrC,mEAAmE;IACnE,wEAAwE;IACxE,uGAAuG;IACvG,2GAA2G;CAC5G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,0BAA0B,GAAG,GAAW,EAAE;IAC9C,MAAM,eAAe,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,6BAA6B,CAAC,CAAA;IAE3F,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,8BAA8B,CAAA;IACvC,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,MAAM,CAAU,WAAW,GAAG,0BAA0B,EAAE,CAAA;IAC1D,MAAM,CAAU,QAAQ,GAAG;QACzB,iEAAiE;QACjE,8EAA8E;QAC9E,8EAA8E;QAC9E,wDAAwD;KACzD,CAAA;IACD,MAAM,CAAU,KAAK,GAAG,YAAY,CAAA;IAGvB,AAAN,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;;AAHY;IADZ,YAAY,EAAE;;;;kCAId","debug_id":"3f3af4ca-e4e7-5c00-a85c-e086b173db13"}
@@ -13,6 +13,7 @@ export default class TemplateUpload extends SentryCommand<TemplateUploadConfig>
13
13
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  npmToken: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
15
  discover: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ tarball: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
17
  debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
18
  };
18
19
  get commandId(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"template-upload.d.ts","sourceRoot":"","sources":["../../src/commands/template-upload.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAIhC,OAAO,EAAe,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAc9D,QAAA,MAAM,oBAAoB,gDAAe,CAAA;AAEzC,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAahE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAC7E,OAAgB,IAAI,KAAK;IACzB,OAAgB,WAAW,SAAqD;IAChF,OAAgB,QAAQ,WAA0D;IAClF,OAAgB,MAAM,EAAE,OAAO,CAAQ;IACvC,OAAgB,KAAK;;;;;;;MA4BpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;IAGY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA+FnB,oBAAoB;IAMlC,OAAO,CAAC,cAAc;YAIR,cAAc;YAId,kBAAkB;YAclB,gBAAgB;YAyBhB,eAAe;YAkBf,mBAAmB;YA0BnB,iCAAiC;CA4FhD"}
1
+ {"version":3,"file":"template-upload.d.ts","sourceRoot":"","sources":["../../src/commands/template-upload.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAIhC,OAAO,EAAe,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAc9D,QAAA,MAAM,oBAAoB,gDAAe,CAAA;AAEzC,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AA0BhE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAC7E,OAAgB,IAAI,KAAK;IACzB,OAAgB,WAAW,SAAqD;IAChF,OAAgB,QAAQ,WAA0D;IAClF,OAAgB,MAAM,EAAE,OAAO,CAAQ;IACvC,OAAgB,KAAK;;;;;;;;MAgCpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;IAGY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA8GnB,oBAAoB;IAMlC,OAAO,CAAC,cAAc;YAIR,cAAc;YAId,kBAAkB;YAclB,gBAAgB;YA+BhB,eAAe;YAkBf,mBAAmB;YA0BnB,iCAAiC;CA4FhD"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5532f0d2-8d38-51ea-b865-7958893e3079")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="84a19802-6890-54fa-9a50-d82741f529e8")}catch(e){}}();
3
3
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
4
4
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5
5
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -17,6 +17,7 @@ import { exec as execCallback } from "node:child_process";
17
17
  import * as fs from "node:fs/promises";
18
18
  import path from "node:path";
19
19
  import { promisify } from "node:util";
20
+ import { fileURLToPath } from "node:url";
20
21
  import { z } from "zod";
21
22
  import fsx from "fs-extra";
22
23
  import crypto from "node:crypto";
@@ -27,7 +28,7 @@ import { discoverAndUpdatePackageJson, discoverFilesForTemplates } from "../util
27
28
  import { fileExists, validateTemplates } from "../utils/validate-templates.js";
28
29
  const exec = promisify(execCallback);
29
30
  const TemplateUploadConfig = z.object({});
30
- const dockerfileTemplate = `
31
+ const dockerfileTemplateLegacy = `
31
32
  FROM node:22-slim
32
33
 
33
34
  RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*
@@ -38,6 +39,18 @@ COPY . .
38
39
  RUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc
39
40
  RUN node docker-scripts/extract-private-packages.js
40
41
  `;
42
+ const dockerfileTemplateTarball = `
43
+ FROM node:22-slim
44
+
45
+ RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*
46
+
47
+ WORKDIR /home/user
48
+
49
+ COPY . .
50
+ RUN {{ npmTokenSecretMount }} npm i
51
+ RUN node docker-scripts/extract-private-packages-tarball.js
52
+ RUN if [ -f .npmrc ]; then truncate -s 0 .npmrc; fi && if [ -f .supernova-private-deps-rewritten ]; then npm i; fi
53
+ `;
41
54
  export default class TemplateUpload extends SentryCommand {
42
55
  static args = {};
43
56
  static description = "Upload component container template to Supernova";
@@ -64,6 +77,10 @@ export default class TemplateUpload extends SentryCommand {
64
77
  description: "Run template and pattern discovery before upload to update package.json",
65
78
  required: false,
66
79
  }),
80
+ tarball: Flags.boolean({
81
+ description: "Use tarball-based private dependency bundling flow (experimental)",
82
+ required: false,
83
+ }),
67
84
  debug: Flags.boolean({
68
85
  description: "Preserve shell directory and App.tsx on template build failures for debugging",
69
86
  required: false,
@@ -116,6 +133,17 @@ export default class TemplateUpload extends SentryCommand {
116
133
  }
117
134
  if (pkg.supernova?.privateDependencies) {
118
135
  this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`);
136
+ const hasWildcardPrivateDependency = pkg.supernova.privateDependencies.some(dependency => isPrivateDependencyScopePattern(dependency));
137
+ if (hasWildcardPrivateDependency && !flags.tarball) {
138
+ this.error(`Wildcard privateDependencies entries (e.g. "@scope/*") require --tarball mode`);
139
+ }
140
+ if (!flags.tarball) {
141
+ for (const dependency of pkg.supernova.privateDependencies) {
142
+ if (!pkg.dependencies[dependency]) {
143
+ this.error(`Private dependency ${dependency} is not listed in 'dependencies'`);
144
+ }
145
+ }
146
+ }
119
147
  if (!(await fileExists(path.join(process.cwd(), ".npmrc")))) {
120
148
  this.error(`CLI needs private NPM registry access to be able to bundle private dependencies.\n` +
121
149
  `Please provide .npmrc file in the root directory and include neccessary access tokens.`);
@@ -144,7 +172,7 @@ export default class TemplateUpload extends SentryCommand {
144
172
  const buildDir = await this.createBuildDir();
145
173
  try {
146
174
  await this.prepareBuildFolder(buildDir);
147
- await this.buildDockerImage(buildDir, url, flags.npmToken);
175
+ await this.buildDockerImage(buildDir, url, flags.npmToken, flags.tarball ?? false);
148
176
  await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url);
149
177
  await this.remoteTemplateBuild(apiClient, buildData.build.id);
150
178
  this.log(`✅ Template has been successfully uploaded`);
@@ -170,15 +198,16 @@ export default class TemplateUpload extends SentryCommand {
170
198
  return !src.includes("node_modules/") && !src.includes(".git/") && !src.includes(".out/");
171
199
  },
172
200
  });
173
- const cliSrcPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
201
+ const cliSrcPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
174
202
  await fsx.copy(path.join(cliSrcPath, "docker-scripts"), path.join(buildDir, "docker-scripts"));
175
203
  }
176
- async buildDockerImage(buildDir, imageUrl, npmToken) {
204
+ async buildDockerImage(buildDir, imageUrl, npmToken, useTarballPrivateDeps) {
177
205
  action.start("🔨 Building docker image");
178
206
  let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`;
179
207
  if (npmToken)
180
208
  cmd += ` --secret id=NPM_TOKEN`;
181
209
  cmd += " -f - .";
210
+ const dockerfileTemplate = useTarballPrivateDeps ? dockerfileTemplateTarball : dockerfileTemplateLegacy;
182
211
  const dockerfile = dockerfileTemplate.replace("{{ npmTokenSecretMount }}", npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN="$(cat /run/secrets/NPM_TOKEN)"` : "");
183
212
  const subprocess = exec(cmd, {
184
213
  env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,
@@ -311,13 +340,25 @@ async function readPackageJson() {
311
340
  if (typeof d !== "string") {
312
341
  throw new TypeError(`supernova.privateDependencies[${i}] must be a string`);
313
342
  }
314
- if (!pkg.dependencies[d]) {
315
- throw new Error(`Private dependency ${d} is not listed in 'dependencies'`);
343
+ if (!isValidPrivateDependencyEntry(d)) {
344
+ throw new TypeError(`supernova.privateDependencies[${i}] must be a package name or scope wildcard like "@example/*"`);
316
345
  }
317
346
  }
318
347
  }
319
348
  return pkg;
320
349
  }
350
+ function isPrivateDependencyScopePattern(entry) {
351
+ return entry.endsWith("/*");
352
+ }
353
+ function isValidPrivateDependencyEntry(entry) {
354
+ if (!entry || entry.includes(" "))
355
+ return false;
356
+ if (isPrivateDependencyScopePattern(entry)) {
357
+ const scope = entry.slice(0, -2);
358
+ return scope.startsWith("@") && !scope.includes("/");
359
+ }
360
+ return true;
361
+ }
321
362
  function imageUrl(build) {
322
363
  return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`;
323
364
  }
@@ -379,4 +420,4 @@ async function getFileSize(filePath) {
379
420
  return stats.size;
380
421
  }
381
422
  //# sourceMappingURL=template-upload.js.map
382
- //# debugId=5532f0d2-8d38-51ea-b865-7958893e3079
423
+ //# debugId=84a19802-6890-54fa-9a50-d82741f529e8
@@ -1 +1 @@
1
- {"version":3,"file":"template-upload.js","sources":["../../src/commands/template-upload.ts"],"sourceRoot":"","sourcesContent":["import fetch from \"node-fetch\"\nimport { Flags } from \"@oclif/core\"\nimport { action } from \"@oclif/core/ux\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport { exec as execCallback } from \"node:child_process\"\nimport * as fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { z, ZodType } from \"zod\"\nimport fsx from \"fs-extra\"\nimport crypto from \"node:crypto\"\n\nimport { commonFlags, SentryCommand } from \"../types/index.js\"\n\nimport {\n DTOSandboxTemplateBuildCreateInput,\n DTOSandboxTemplateBuildCreateResponse,\n SupernovaApiClient,\n} from \"@supernova-studio/client\"\nimport { sleep } from \"../utils/common.js\"\nimport { tmpdir } from \"node:os\"\nimport { discoverAndUpdatePackageJson, discoverFilesForTemplates } from \"../utils/discover.js\"\nimport { fileExists, TemplatePreset, validateTemplates } from \"../utils/validate-templates.js\"\n\nconst exec = promisify(execCallback)\n\nconst TemplateUploadConfig = z.object({})\n\ntype TemplateUploadConfig = z.infer<typeof TemplateUploadConfig>\n\nconst dockerfileTemplate = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc\nRUN node docker-scripts/extract-private-packages.js\n`\nexport default class TemplateUpload extends SentryCommand<TemplateUploadConfig> {\n static override args = {}\n static override description = \"Upload component container template to Supernova\"\n static override examples = [\"<%= config.bin %> <%= command.id %> TemplateUpload \"]\n static override hidden: boolean = false\n static override flags = {\n ...commonFlags,\n workspaceId: Flags.string({ char: \"w\", description: \"Workspace ID to upload the template to\", required: false }),\n designSystemId: Flags.string({\n char: \"d\",\n description: \"Design system ID to upload the template to\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description:\n \"Allows overwriting already published version of this template if it exists. This flag has no effect on new versions.\",\n required: false,\n }),\n npmToken: Flags.string({\n description:\n \"Allows passing NPM token as a Docker secret. The token will be available as a NPM_TOKEN env variable\",\n required: false,\n }),\n discover: Flags.boolean({\n description: \"Run template and pattern discovery before upload to update package.json\",\n required: false,\n }),\n debug: Flags.boolean({\n description: \"Preserve shell directory and App.tsx on template build failures for debugging\",\n required: false,\n hidden: true,\n }),\n }\n\n get commandId(): string {\n return TemplateUpload.id\n }\n\n get configSchema(): ZodType<TemplateUploadConfig> {\n return TemplateUploadConfig\n }\n\n @SentryTraced()\n public async run(): Promise<void> {\n const apiClient = await this.apiClient()\n const { flags } = await this.parse()\n\n // Update package.json with discovered names/descriptions if requested\n if (flags.discover) {\n action.start(\"🔍 Running template and pattern discovery\")\n try {\n const { templates, patterns } = await discoverAndUpdatePackageJson(process.cwd())\n action.stop(`found ${Object.keys(templates).length} templates, ${Object.keys(patterns).length} patterns`)\n } catch (error) {\n action.stop(\"failed\")\n if (error instanceof Error) this.error(`Discovery failed: ${error.message}`)\n else throw error\n }\n }\n\n // Check if this is discover-only mode\n const isDiscoverOnly = flags.discover && !flags.workspaceId && !flags.designSystemId\n\n if (isDiscoverOnly) {\n this.log(\"✅ Discovery completed. Use --workspaceId and --designSystemId to upload templates.\")\n return\n }\n\n // Validate required flags for upload\n if (!flags.workspaceId) {\n this.error(\"Missing required flag workspaceId\")\n }\n\n if (!flags.designSystemId) {\n this.error(\"Missing required flag designSystemId\")\n }\n\n // Read package json\n let pkg\n try {\n pkg = await readPackageJson()\n } catch (error) {\n if (error instanceof Error) this.error(`Failed to read or parse package.json: ${error.message}`)\n else throw error\n }\n\n if (pkg.supernova?.privateDependencies) {\n this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`)\n\n if (!(await fileExists(path.join(process.cwd(), \".npmrc\")))) {\n this.error(\n `CLI needs private NPM registry access to be able to bundle private dependencies.\\n` +\n `Please provide .npmrc file in the root directory and include neccessary access tokens.`,\n )\n }\n } else {\n this.warn(`package.json doesn't contain 'supernova.privateDependencies' declaration.`)\n this.warn(`Dependencies coming from private registries will fail`)\n }\n\n let templatesWithThumbnailUrls: DTOSandboxTemplateBuildCreateInput[\"templates\"] | undefined\n\n if (pkg.supernova?.templates) {\n // Always enrich templates from package.json with discovered files/thumbnails info on the fly\n const templates = await discoverFilesForTemplates(pkg.supernova.templates, process.cwd())\n\n await validateTemplates(templates, this, flags.debug)\n templatesWithThumbnailUrls = await this.uploadThumbnailsAndBuildTemplates(apiClient, flags.workspaceId, templates)\n }\n\n // Request build\n const buildData = await apiClient.sandboxes.builds.start({\n workspaceId: flags.workspaceId,\n designSystemId: flags.designSystemId,\n name: pkg.name,\n version: pkg.version,\n isExistingVersionUpdateAllowed: flags.force ?? false,\n templates: templatesWithThumbnailUrls,\n })\n\n // Build image\n const url = imageUrl(buildData)\n\n await this.validateDockerDaemon()\n const buildDir = await this.createBuildDir()\n\n try {\n await this.prepareBuildFolder(buildDir)\n await this.buildDockerImage(buildDir, url, flags.npmToken)\n await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url)\n await this.remoteTemplateBuild(apiClient, buildData.build.id)\n\n this.log(`✅ Template has been successfully uploaded`)\n } finally {\n await this.deleteBuildDir(buildDir)\n }\n }\n\n private async validateDockerDaemon() {\n await exec(\"docker info\").catch(() => {\n this.error(`Docker is not available, please start docker daemon and try again`)\n })\n }\n\n private createBuildDir(): Promise<string> {\n return fs.mkdtemp(path.join(tmpdir(), \"supernova-template-bundle-\"))\n }\n\n private async deleteBuildDir(buildDir: string) {\n await fs.rm(buildDir, { recursive: true, force: true })\n }\n\n private async prepareBuildFolder(buildDir: string) {\n // Move working directory to temp folder from where it will be built\n await fsx.copy(process.cwd(), buildDir, {\n filter(src) {\n return !src.includes(\"node_modules/\") && !src.includes(\".git/\") && !src.includes(\".out/\")\n },\n })\n\n // Inject Supernova scripts\n const cliSrcPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), \"..\")\n\n await fsx.copy(path.join(cliSrcPath, \"docker-scripts\"), path.join(buildDir, \"docker-scripts\"))\n }\n\n private async buildDockerImage(buildDir: string, imageUrl: string, npmToken: string | undefined) {\n action.start(\"🔨 Building docker image\")\n\n let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`\n if (npmToken) cmd += ` --secret id=NPM_TOKEN`\n cmd += \" -f - .\"\n\n const dockerfile = dockerfileTemplate.replace(\n \"{{ npmTokenSecretMount }}\",\n npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN=\"$(cat /run/secrets/NPM_TOKEN)\"` : \"\",\n )\n\n const subprocess = exec(cmd, {\n env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,\n cwd: buildDir,\n })\n\n subprocess.child.stdin!.write(dockerfile)\n subprocess.child.stdin!.end()\n\n await subprocess\n\n action.stop(\"done\")\n }\n\n private async pushDockerImage(buildDir: string, dockerHost: string, imageUrl: string) {\n const response = await fetch(`https://${dockerHost}/v2/`)\n if (response.status === 401) {\n // Requires auth\n const { accessToken } = (await this.apiClient()).config\n const loginProcess = exec(`docker login ${dockerHost} -u cli --password-stdin`)\n loginProcess.child.stdin!.write(accessToken)\n loginProcess.child.stdin!.end()\n await loginProcess\n }\n\n action.start(\"⬆️ Uploading docker image to Supernova\")\n await exec(`docker push ${imageUrl}`, {\n cwd: buildDir,\n })\n action.stop(\"done\")\n }\n\n private async remoteTemplateBuild(client: SupernovaApiClient, buildId: string) {\n action.start(\"📦 Creating template with the image\")\n\n // Trigger remote build phase\n await client.sandboxes.builds.finalize(buildId)\n\n // Poll every 2 seconds for roughly 5 minutes\n const pollIntervalMs = 2000\n const timeoutMs = 5 * 60 * 1000\n\n const startTime = Date.now()\n\n let build\n do {\n await sleep(pollIntervalMs)\n build = (await client.sandboxes.builds.get(buildId)).build\n } while (build.state === \"Building\" && Date.now() - startTime < timeoutMs)\n\n // Verify build state\n if (build.state !== \"Success\") {\n this.error(`Template creation failed`)\n }\n\n action.stop(\"done\")\n }\n\n private async uploadThumbnailsAndBuildTemplates(\n apiClient: SupernovaApiClient,\n workspaceId: string,\n templates: { [key: string]: TemplatePreset },\n ): Promise<DTOSandboxTemplateBuildCreateInput[\"templates\"]> {\n // Validate template names are unique\n const templateNames = Object.values(templates).map(t => t.name)\n const duplicateNames = templateNames.filter((name, index) => templateNames.indexOf(name) !== index)\n if (duplicateNames.length > 0) {\n throw new Error(\n `Duplicate template names found: ${[...new Set(duplicateNames)].join(\", \")}. Each template must have a unique name.`,\n )\n }\n\n const templateCount = Object.keys(templates).length\n action.start(`📸 Processing ${templateCount} template(s)`)\n\n const thumbnailFiles: Array<{\n name: string\n size: number\n checksum: string\n originalPath: string\n templateId: string\n }> = []\n\n // Validate thumbnail files\n for (const [templateId, template] of Object.entries(templates)) {\n if (!template.thumbnail) continue\n\n const validation = await validateThumbnailFile(templateId, template.thumbnail, this)\n if (!validation) continue\n\n try {\n const checksum = await calculateFileChecksum(validation.fullPath)\n thumbnailFiles.push({\n name: validation.name,\n size: validation.size,\n checksum,\n originalPath: validation.fullPath,\n templateId,\n })\n } catch (error) {\n this.warn(\n `Failed to calculate checksum for ${validation.fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n )\n continue\n }\n }\n\n let thumbnailUrlMap: { [templateId: string]: string } = {}\n\n if (thumbnailFiles.length > 0) {\n try {\n // Request upload URLs from API\n const uploadResponse = await apiClient.files.upload({\n ownerType: \"Workspace\",\n workspaceId,\n files: thumbnailFiles.map(({ name, size, checksum }) => ({ name, size, checksum })),\n })\n\n // Upload files to signed URLs\n await uploadFilesToUrls(uploadResponse.uploadUrls, uploadResponse.files, thumbnailFiles)\n\n await apiClient.files.finalizeUpload({\n ownerType: \"Workspace\",\n workspaceId,\n fileIds: uploadResponse.uploadUrls.map(f => f.fileId),\n })\n\n // Map template IDs to their uploaded thumbnail URLs\n thumbnailUrlMap = buildTemplateUrlMap(thumbnailFiles, uploadResponse.files)\n } catch (error) {\n this.warn(`Failed to upload thumbnails: ${error instanceof Error ? error.message : String(error)}`)\n this.warn(\"Continuing without uploaded thumbnails...\")\n // Don't error out completely, just continue without uploaded thumbnails\n }\n }\n\n const message =\n thumbnailFiles.length > 0 ? `uploaded ${thumbnailFiles.length} thumbnail(s)` : \"no thumbnails to upload\"\n action.stop(message)\n\n const templatesWithUrls = Object.entries(templates).map(([id, template]) => ({\n id,\n name: template.name,\n description: template.description,\n thumbnailUrl: thumbnailUrlMap[id],\n files: template.files,\n }))\n\n return templatesWithUrls\n }\n}\n\ntype PackageJson = {\n name: string\n version: string\n dependencies: Record<string, string>\n supernova:\n | {\n privateDependencies: string[] | undefined\n templates?: {\n [key: string]: TemplatePreset\n }\n }\n | undefined\n}\n\nasync function readPackageJson(): Promise<PackageJson> {\n const pkgPath = path.join(process.cwd(), \"package.json\")\n\n if (!(await fileExists(pkgPath))) throw new Error(`package.json file was not found in the current directory`)\n\n const raw = await fs.readFile(pkgPath, \"utf8\")\n const pkg = JSON.parse(raw)\n\n if (typeof pkg !== \"object\" || pkg === null) throw new Error(`Error parsing package.json: not a json`)\n\n if (typeof pkg.name !== \"string\") throw new Error(`Error parsing package.json: 'name' must be defined`)\n if (typeof pkg.version !== \"string\") throw new Error(`Error parsing package.json: 'version' must be defined`)\n if (typeof pkg.dependencies !== \"object\" || pkg.dependencies === null)\n throw new Error(`Error parsing package.json: 'dependencies' must be defined`)\n\n if (pkg.supernova?.privateDependencies) {\n const privateDependencies = pkg.supernova?.privateDependencies\n if (!Array.isArray(privateDependencies)) throw new TypeError(`supernova.privateDependencies must be an array`)\n\n for (const [i, d] of privateDependencies.entries()) {\n if (typeof d !== \"string\") {\n throw new TypeError(`supernova.privateDependencies[${i}] must be a string`)\n }\n\n if (!pkg.dependencies[d]) {\n throw new Error(`Private dependency ${d} is not listed in 'dependencies'`)\n }\n }\n }\n\n return pkg\n}\n\nfunction imageUrl(build: DTOSandboxTemplateBuildCreateResponse) {\n return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`\n}\n\nasync function validateThumbnailFile(\n templateId: string,\n thumbnailPath: string,\n logger: { warn: (msg: string) => void },\n): Promise<{ name: string; size: number; fullPath: string } | undefined> {\n const allowedExtensions = [\".png\", \".jpg\", \".jpeg\", \".svg\", \".webp\"]\n const maxFileSize = 10 * 1024 * 1024 // 10 MB in bytes\n\n const fullPath = path.resolve(thumbnailPath)\n const name = path.basename(thumbnailPath)\n\n if (!(await fileExists(fullPath))) {\n logger.warn(`Thumbnail file not found for template ${templateId}: ${thumbnailPath}`)\n return undefined\n }\n\n const extension = path.extname(thumbnailPath).toLowerCase()\n if (!allowedExtensions.includes(extension)) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} has unsupported format. Allowed formats: ${allowedExtensions.join(\", \")}`,\n )\n return undefined\n }\n\n const size = await getFileSize(fullPath)\n if (size > maxFileSize) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} is too large (${(size / 1024 / 1024).toFixed(2)}MB). Maximum size is 10MB.`,\n )\n return undefined\n }\n\n return { name, size, fullPath }\n}\n\nasync function uploadFilesToUrls(\n uploadUrls: Array<{ fileId: string; uploadUrl: string }>,\n fileResponses: Array<{ id: string; name: string; size: number }>,\n thumbnailFiles: Array<{ name: string; size: number; originalPath: string; templateId: string }>,\n): Promise<void> {\n const uploadTasks = uploadUrls.map(async uploadUrl => {\n const fileResponse = fileResponses.find(f => f.id === uploadUrl.fileId)\n const thumbnailFile = thumbnailFiles.find(f => f.name === fileResponse?.name && f.size === fileResponse?.size)\n\n if (thumbnailFile) {\n const fileBuffer = await fs.readFile(thumbnailFile.originalPath)\n await fetch(uploadUrl.uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n })\n }\n })\n\n await Promise.all(uploadTasks)\n}\n\nfunction buildTemplateUrlMap(\n thumbnailFiles: Array<{ templateId: string; checksum: string }>,\n fileResponses: Array<{ url: string; deduplicationKey: string }>,\n): { [templateId: string]: string } {\n const thumbnailUrlMap: { [templateId: string]: string } = {}\n\n for (const thumbnailFile of thumbnailFiles) {\n const fileResponse = fileResponses.find(f => f.deduplicationKey === thumbnailFile.checksum)\n if (fileResponse) {\n thumbnailUrlMap[thumbnailFile.templateId] = fileResponse.url\n }\n }\n\n return thumbnailUrlMap\n}\n\nasync function calculateFileChecksum(filePath: string): Promise<string> {\n const fileBuffer = await fs.readFile(filePath)\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", fileBuffer)\n return Buffer.from(hashBuffer).toString(\"hex\")\n}\n\nasync function getFileSize(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return stats.size\n}\n"],"names":[],"mappings":"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","debug_id":"5532f0d2-8d38-51ea-b865-7958893e3079"}
1
+ {"version":3,"file":"template-upload.js","sources":["../../src/commands/template-upload.ts"],"sourceRoot":"","sourcesContent":["import fetch from \"node-fetch\"\nimport { Flags } from \"@oclif/core\"\nimport { action } from \"@oclif/core/ux\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport { exec as execCallback } from \"node:child_process\"\nimport * as fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { fileURLToPath } from \"node:url\"\nimport { z, ZodType } from \"zod\"\nimport fsx from \"fs-extra\"\nimport crypto from \"node:crypto\"\n\nimport { commonFlags, SentryCommand } from \"../types/index.js\"\n\nimport {\n DTOSandboxTemplateBuildCreateInput,\n DTOSandboxTemplateBuildCreateResponse,\n SupernovaApiClient,\n} from \"@supernova-studio/client\"\nimport { sleep } from \"../utils/common.js\"\nimport { tmpdir } from \"node:os\"\nimport { discoverAndUpdatePackageJson, discoverFilesForTemplates } from \"../utils/discover.js\"\nimport { fileExists, TemplatePreset, validateTemplates } from \"../utils/validate-templates.js\"\n\nconst exec = promisify(execCallback)\n\nconst TemplateUploadConfig = z.object({})\n\ntype TemplateUploadConfig = z.infer<typeof TemplateUploadConfig>\n\nconst dockerfileTemplateLegacy = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc\nRUN node docker-scripts/extract-private-packages.js\n`\n\nconst dockerfileTemplateTarball = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i\nRUN node docker-scripts/extract-private-packages-tarball.js\nRUN if [ -f .npmrc ]; then truncate -s 0 .npmrc; fi && if [ -f .supernova-private-deps-rewritten ]; then npm i; fi\n`\nexport default class TemplateUpload extends SentryCommand<TemplateUploadConfig> {\n static override args = {}\n static override description = \"Upload component container template to Supernova\"\n static override examples = [\"<%= config.bin %> <%= command.id %> TemplateUpload \"]\n static override hidden: boolean = false\n static override flags = {\n ...commonFlags,\n workspaceId: Flags.string({ char: \"w\", description: \"Workspace ID to upload the template to\", required: false }),\n designSystemId: Flags.string({\n char: \"d\",\n description: \"Design system ID to upload the template to\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description:\n \"Allows overwriting already published version of this template if it exists. This flag has no effect on new versions.\",\n required: false,\n }),\n npmToken: Flags.string({\n description:\n \"Allows passing NPM token as a Docker secret. The token will be available as a NPM_TOKEN env variable\",\n required: false,\n }),\n discover: Flags.boolean({\n description: \"Run template and pattern discovery before upload to update package.json\",\n required: false,\n }),\n tarball: Flags.boolean({\n description: \"Use tarball-based private dependency bundling flow (experimental)\",\n required: false,\n }),\n debug: Flags.boolean({\n description: \"Preserve shell directory and App.tsx on template build failures for debugging\",\n required: false,\n hidden: true,\n }),\n }\n\n get commandId(): string {\n return TemplateUpload.id\n }\n\n get configSchema(): ZodType<TemplateUploadConfig> {\n return TemplateUploadConfig\n }\n\n @SentryTraced()\n public async run(): Promise<void> {\n const apiClient = await this.apiClient()\n const { flags } = await this.parse()\n\n // Update package.json with discovered names/descriptions if requested\n if (flags.discover) {\n action.start(\"🔍 Running template and pattern discovery\")\n try {\n const { templates, patterns } = await discoverAndUpdatePackageJson(process.cwd())\n action.stop(`found ${Object.keys(templates).length} templates, ${Object.keys(patterns).length} patterns`)\n } catch (error) {\n action.stop(\"failed\")\n if (error instanceof Error) this.error(`Discovery failed: ${error.message}`)\n else throw error\n }\n }\n\n // Check if this is discover-only mode\n const isDiscoverOnly = flags.discover && !flags.workspaceId && !flags.designSystemId\n\n if (isDiscoverOnly) {\n this.log(\"✅ Discovery completed. Use --workspaceId and --designSystemId to upload templates.\")\n return\n }\n\n // Validate required flags for upload\n if (!flags.workspaceId) {\n this.error(\"Missing required flag workspaceId\")\n }\n\n if (!flags.designSystemId) {\n this.error(\"Missing required flag designSystemId\")\n }\n\n // Read package json\n let pkg\n try {\n pkg = await readPackageJson()\n } catch (error) {\n if (error instanceof Error) this.error(`Failed to read or parse package.json: ${error.message}`)\n else throw error\n }\n\n if (pkg.supernova?.privateDependencies) {\n this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`)\n\n const hasWildcardPrivateDependency = pkg.supernova.privateDependencies.some(dependency =>\n isPrivateDependencyScopePattern(dependency),\n )\n if (hasWildcardPrivateDependency && !flags.tarball) {\n this.error(`Wildcard privateDependencies entries (e.g. \"@scope/*\") require --tarball mode`)\n }\n\n if (!flags.tarball) {\n for (const dependency of pkg.supernova.privateDependencies) {\n if (!pkg.dependencies[dependency]) {\n this.error(`Private dependency ${dependency} is not listed in 'dependencies'`)\n }\n }\n }\n\n if (!(await fileExists(path.join(process.cwd(), \".npmrc\")))) {\n this.error(\n `CLI needs private NPM registry access to be able to bundle private dependencies.\\n` +\n `Please provide .npmrc file in the root directory and include neccessary access tokens.`,\n )\n }\n } else {\n this.warn(`package.json doesn't contain 'supernova.privateDependencies' declaration.`)\n this.warn(`Dependencies coming from private registries will fail`)\n }\n\n let templatesWithThumbnailUrls: DTOSandboxTemplateBuildCreateInput[\"templates\"] | undefined\n\n if (pkg.supernova?.templates) {\n // Always enrich templates from package.json with discovered files/thumbnails info on the fly\n const templates = await discoverFilesForTemplates(pkg.supernova.templates, process.cwd())\n\n await validateTemplates(templates, this, flags.debug)\n templatesWithThumbnailUrls = await this.uploadThumbnailsAndBuildTemplates(apiClient, flags.workspaceId, templates)\n }\n\n // Request build\n const buildData = await apiClient.sandboxes.builds.start({\n workspaceId: flags.workspaceId,\n designSystemId: flags.designSystemId,\n name: pkg.name,\n version: pkg.version,\n isExistingVersionUpdateAllowed: flags.force ?? false,\n templates: templatesWithThumbnailUrls,\n })\n\n // Build image\n const url = imageUrl(buildData)\n\n await this.validateDockerDaemon()\n const buildDir = await this.createBuildDir()\n\n try {\n await this.prepareBuildFolder(buildDir)\n await this.buildDockerImage(buildDir, url, flags.npmToken, flags.tarball ?? false)\n await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url)\n await this.remoteTemplateBuild(apiClient, buildData.build.id)\n\n this.log(`✅ Template has been successfully uploaded`)\n } finally {\n await this.deleteBuildDir(buildDir)\n }\n }\n\n private async validateDockerDaemon() {\n await exec(\"docker info\").catch(() => {\n this.error(`Docker is not available, please start docker daemon and try again`)\n })\n }\n\n private createBuildDir(): Promise<string> {\n return fs.mkdtemp(path.join(tmpdir(), \"supernova-template-bundle-\"))\n }\n\n private async deleteBuildDir(buildDir: string) {\n await fs.rm(buildDir, { recursive: true, force: true })\n }\n\n private async prepareBuildFolder(buildDir: string) {\n // Move working directory to temp folder from where it will be built\n await fsx.copy(process.cwd(), buildDir, {\n filter(src) {\n return !src.includes(\"node_modules/\") && !src.includes(\".git/\") && !src.includes(\".out/\")\n },\n })\n\n // Inject Supernova scripts\n const cliSrcPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\")\n\n await fsx.copy(path.join(cliSrcPath, \"docker-scripts\"), path.join(buildDir, \"docker-scripts\"))\n }\n\n private async buildDockerImage(\n buildDir: string,\n imageUrl: string,\n npmToken: string | undefined,\n useTarballPrivateDeps: boolean,\n ) {\n action.start(\"🔨 Building docker image\")\n\n let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`\n if (npmToken) cmd += ` --secret id=NPM_TOKEN`\n cmd += \" -f - .\"\n\n const dockerfileTemplate = useTarballPrivateDeps ? dockerfileTemplateTarball : dockerfileTemplateLegacy\n const dockerfile = dockerfileTemplate.replace(\n \"{{ npmTokenSecretMount }}\",\n npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN=\"$(cat /run/secrets/NPM_TOKEN)\"` : \"\",\n )\n\n const subprocess = exec(cmd, {\n env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,\n cwd: buildDir,\n })\n\n subprocess.child.stdin!.write(dockerfile)\n subprocess.child.stdin!.end()\n\n await subprocess\n\n action.stop(\"done\")\n }\n\n private async pushDockerImage(buildDir: string, dockerHost: string, imageUrl: string) {\n const response = await fetch(`https://${dockerHost}/v2/`)\n if (response.status === 401) {\n // Requires auth\n const { accessToken } = (await this.apiClient()).config\n const loginProcess = exec(`docker login ${dockerHost} -u cli --password-stdin`)\n loginProcess.child.stdin!.write(accessToken)\n loginProcess.child.stdin!.end()\n await loginProcess\n }\n\n action.start(\"⬆️ Uploading docker image to Supernova\")\n await exec(`docker push ${imageUrl}`, {\n cwd: buildDir,\n })\n action.stop(\"done\")\n }\n\n private async remoteTemplateBuild(client: SupernovaApiClient, buildId: string) {\n action.start(\"📦 Creating template with the image\")\n\n // Trigger remote build phase\n await client.sandboxes.builds.finalize(buildId)\n\n // Poll every 2 seconds for roughly 5 minutes\n const pollIntervalMs = 2000\n const timeoutMs = 5 * 60 * 1000\n\n const startTime = Date.now()\n\n let build\n do {\n await sleep(pollIntervalMs)\n build = (await client.sandboxes.builds.get(buildId)).build\n } while (build.state === \"Building\" && Date.now() - startTime < timeoutMs)\n\n // Verify build state\n if (build.state !== \"Success\") {\n this.error(`Template creation failed`)\n }\n\n action.stop(\"done\")\n }\n\n private async uploadThumbnailsAndBuildTemplates(\n apiClient: SupernovaApiClient,\n workspaceId: string,\n templates: { [key: string]: TemplatePreset },\n ): Promise<DTOSandboxTemplateBuildCreateInput[\"templates\"]> {\n // Validate template names are unique\n const templateNames = Object.values(templates).map(t => t.name)\n const duplicateNames = templateNames.filter((name, index) => templateNames.indexOf(name) !== index)\n if (duplicateNames.length > 0) {\n throw new Error(\n `Duplicate template names found: ${[...new Set(duplicateNames)].join(\", \")}. Each template must have a unique name.`,\n )\n }\n\n const templateCount = Object.keys(templates).length\n action.start(`📸 Processing ${templateCount} template(s)`)\n\n const thumbnailFiles: Array<{\n name: string\n size: number\n checksum: string\n originalPath: string\n templateId: string\n }> = []\n\n // Validate thumbnail files\n for (const [templateId, template] of Object.entries(templates)) {\n if (!template.thumbnail) continue\n\n const validation = await validateThumbnailFile(templateId, template.thumbnail, this)\n if (!validation) continue\n\n try {\n const checksum = await calculateFileChecksum(validation.fullPath)\n thumbnailFiles.push({\n name: validation.name,\n size: validation.size,\n checksum,\n originalPath: validation.fullPath,\n templateId,\n })\n } catch (error) {\n this.warn(\n `Failed to calculate checksum for ${validation.fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n )\n continue\n }\n }\n\n let thumbnailUrlMap: { [templateId: string]: string } = {}\n\n if (thumbnailFiles.length > 0) {\n try {\n // Request upload URLs from API\n const uploadResponse = await apiClient.files.upload({\n ownerType: \"Workspace\",\n workspaceId,\n files: thumbnailFiles.map(({ name, size, checksum }) => ({ name, size, checksum })),\n })\n\n // Upload files to signed URLs\n await uploadFilesToUrls(uploadResponse.uploadUrls, uploadResponse.files, thumbnailFiles)\n\n await apiClient.files.finalizeUpload({\n ownerType: \"Workspace\",\n workspaceId,\n fileIds: uploadResponse.uploadUrls.map(f => f.fileId),\n })\n\n // Map template IDs to their uploaded thumbnail URLs\n thumbnailUrlMap = buildTemplateUrlMap(thumbnailFiles, uploadResponse.files)\n } catch (error) {\n this.warn(`Failed to upload thumbnails: ${error instanceof Error ? error.message : String(error)}`)\n this.warn(\"Continuing without uploaded thumbnails...\")\n // Don't error out completely, just continue without uploaded thumbnails\n }\n }\n\n const message =\n thumbnailFiles.length > 0 ? `uploaded ${thumbnailFiles.length} thumbnail(s)` : \"no thumbnails to upload\"\n action.stop(message)\n\n const templatesWithUrls = Object.entries(templates).map(([id, template]) => ({\n id,\n name: template.name,\n description: template.description,\n thumbnailUrl: thumbnailUrlMap[id],\n files: template.files,\n }))\n\n return templatesWithUrls\n }\n}\n\ntype PackageJson = {\n name: string\n version: string\n dependencies: Record<string, string>\n supernova:\n | {\n privateDependencies: string[] | undefined\n templates?: {\n [key: string]: TemplatePreset\n }\n }\n | undefined\n}\n\nasync function readPackageJson(): Promise<PackageJson> {\n const pkgPath = path.join(process.cwd(), \"package.json\")\n\n if (!(await fileExists(pkgPath))) throw new Error(`package.json file was not found in the current directory`)\n\n const raw = await fs.readFile(pkgPath, \"utf8\")\n const pkg = JSON.parse(raw)\n\n if (typeof pkg !== \"object\" || pkg === null) throw new Error(`Error parsing package.json: not a json`)\n\n if (typeof pkg.name !== \"string\") throw new Error(`Error parsing package.json: 'name' must be defined`)\n if (typeof pkg.version !== \"string\") throw new Error(`Error parsing package.json: 'version' must be defined`)\n if (typeof pkg.dependencies !== \"object\" || pkg.dependencies === null)\n throw new Error(`Error parsing package.json: 'dependencies' must be defined`)\n\n if (pkg.supernova?.privateDependencies) {\n const privateDependencies = pkg.supernova?.privateDependencies\n if (!Array.isArray(privateDependencies)) throw new TypeError(`supernova.privateDependencies must be an array`)\n\n for (const [i, d] of privateDependencies.entries()) {\n if (typeof d !== \"string\") {\n throw new TypeError(`supernova.privateDependencies[${i}] must be a string`)\n }\n\n if (!isValidPrivateDependencyEntry(d)) {\n throw new TypeError(\n `supernova.privateDependencies[${i}] must be a package name or scope wildcard like \"@example/*\"`,\n )\n }\n }\n }\n\n return pkg\n}\n\nfunction isPrivateDependencyScopePattern(entry: string): boolean {\n return entry.endsWith(\"/*\")\n}\n\nfunction isValidPrivateDependencyEntry(entry: string): boolean {\n if (!entry || entry.includes(\" \")) return false\n if (isPrivateDependencyScopePattern(entry)) {\n const scope = entry.slice(0, -2)\n return scope.startsWith(\"@\") && !scope.includes(\"/\")\n }\n\n return true\n}\n\nfunction imageUrl(build: DTOSandboxTemplateBuildCreateResponse) {\n return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`\n}\n\nasync function validateThumbnailFile(\n templateId: string,\n thumbnailPath: string,\n logger: { warn: (msg: string) => void },\n): Promise<{ name: string; size: number; fullPath: string } | undefined> {\n const allowedExtensions = [\".png\", \".jpg\", \".jpeg\", \".svg\", \".webp\"]\n const maxFileSize = 10 * 1024 * 1024 // 10 MB in bytes\n\n const fullPath = path.resolve(thumbnailPath)\n const name = path.basename(thumbnailPath)\n\n if (!(await fileExists(fullPath))) {\n logger.warn(`Thumbnail file not found for template ${templateId}: ${thumbnailPath}`)\n return undefined\n }\n\n const extension = path.extname(thumbnailPath).toLowerCase()\n if (!allowedExtensions.includes(extension)) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} has unsupported format. Allowed formats: ${allowedExtensions.join(\", \")}`,\n )\n return undefined\n }\n\n const size = await getFileSize(fullPath)\n if (size > maxFileSize) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} is too large (${(size / 1024 / 1024).toFixed(2)}MB). Maximum size is 10MB.`,\n )\n return undefined\n }\n\n return { name, size, fullPath }\n}\n\nasync function uploadFilesToUrls(\n uploadUrls: Array<{ fileId: string; uploadUrl: string }>,\n fileResponses: Array<{ id: string; name: string; size: number }>,\n thumbnailFiles: Array<{ name: string; size: number; originalPath: string; templateId: string }>,\n): Promise<void> {\n const uploadTasks = uploadUrls.map(async uploadUrl => {\n const fileResponse = fileResponses.find(f => f.id === uploadUrl.fileId)\n const thumbnailFile = thumbnailFiles.find(f => f.name === fileResponse?.name && f.size === fileResponse?.size)\n\n if (thumbnailFile) {\n const fileBuffer = await fs.readFile(thumbnailFile.originalPath)\n await fetch(uploadUrl.uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n })\n }\n })\n\n await Promise.all(uploadTasks)\n}\n\nfunction buildTemplateUrlMap(\n thumbnailFiles: Array<{ templateId: string; checksum: string }>,\n fileResponses: Array<{ url: string; deduplicationKey: string }>,\n): { [templateId: string]: string } {\n const thumbnailUrlMap: { [templateId: string]: string } = {}\n\n for (const thumbnailFile of thumbnailFiles) {\n const fileResponse = fileResponses.find(f => f.deduplicationKey === thumbnailFile.checksum)\n if (fileResponse) {\n thumbnailUrlMap[thumbnailFile.templateId] = fileResponse.url\n }\n }\n\n return thumbnailUrlMap\n}\n\nasync function calculateFileChecksum(filePath: string): Promise<string> {\n const fileBuffer = await fs.readFile(filePath)\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", fileBuffer)\n return Buffer.from(hashBuffer).toString(\"hex\")\n}\n\nasync function getFileSize(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return stats.size\n}\n"],"names":[],"mappings":"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","debug_id":"84a19802-6890-54fa-9a50-d82741f529e8"}
@@ -0,0 +1,282 @@
1
+ import { execFileSync } from "node:child_process"
2
+ import fs from "node:fs"
3
+ import path from "node:path"
4
+
5
+ const PRIVATE_DEPS_DIR_NAME = "private-deps"
6
+ const REWRITE_MARKER_FILE = ".supernova-private-deps-rewritten"
7
+ const NPM_PUBLIC_REGISTRY_HOST = "registry.npmjs.org"
8
+
9
+ ;(() => {
10
+ const packageJsonPath = path.join(process.cwd(), "package.json")
11
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString())
12
+ const packageLock = readPackageLockJson()
13
+
14
+ const declaredPrivateDependencies = packageJson.supernova?.privateDependencies
15
+ if (declaredPrivateDependencies && !Array.isArray(declaredPrivateDependencies)) {
16
+ throw new TypeError(
17
+ `supernova.privateDependencies must be an array, example: "privateDependencies": ["@example/package"]`,
18
+ )
19
+ }
20
+
21
+ const parsedDeclaredPrivateDependencies = declaredPrivateDependencies
22
+ ? validateAndParseDeclaredPrivateDependencies(declaredPrivateDependencies)
23
+ : {exactDependencies: [], scopePatterns: []}
24
+ const detectedByLockfileHost = detectPrivateDependenciesFromPackageLock(packageLock)
25
+ const detectedByPrivateDependencyScopes = detectPrivateDependenciesFromScopePatterns(
26
+ packageLock,
27
+ parsedDeclaredPrivateDependencies.scopePatterns,
28
+ packageJson,
29
+ )
30
+ const detectedPrivateDependencies = [...new Set([...detectedByLockfileHost, ...detectedByPrivateDependencyScopes])]
31
+ const privateDependencies = [...new Set([...detectedPrivateDependencies, ...parsedDeclaredPrivateDependencies.exactDependencies])]
32
+
33
+ if (privateDependencies.length === 0) return
34
+
35
+ console.log(
36
+ `private dependency detection: lockfileHost=${detectedByLockfileHost.length}, scopePattern=${detectedByPrivateDependencyScopes.length}, fallback=${parsedDeclaredPrivateDependencies.exactDependencies.length}, total=${privateDependencies.length}`,
37
+ )
38
+ if (detectedByLockfileHost.length > 0) {
39
+ console.log(`lockfile-host private deps: ${detectedByLockfileHost.join(", ")}`)
40
+ }
41
+
42
+ if (parsedDeclaredPrivateDependencies.scopePatterns.length > 0) {
43
+ console.log(
44
+ `configured private dependency scope patterns: ${parsedDeclaredPrivateDependencies.scopePatterns.join(", ")}`,
45
+ )
46
+ }
47
+
48
+ if (detectedByPrivateDependencyScopes.length > 0) {
49
+ console.log(`scope-detected private deps: ${detectedByPrivateDependencyScopes.join(", ")}`)
50
+ }
51
+
52
+ if (parsedDeclaredPrivateDependencies.exactDependencies.length > 0) {
53
+ console.log(`fallback private deps: ${parsedDeclaredPrivateDependencies.exactDependencies.join(", ")}`)
54
+ }
55
+
56
+ const privateDepsDir = path.join(process.cwd(), PRIVATE_DEPS_DIR_NAME)
57
+ fs.rmSync(privateDepsDir, { recursive: true, force: true })
58
+ fs.mkdirSync(privateDepsDir, { recursive: true })
59
+
60
+ if (typeof packageJson.dependencies !== "object" || packageJson.dependencies === null) {
61
+ packageJson.dependencies = {}
62
+ }
63
+
64
+ for (const dependency of privateDependencies) {
65
+ // Create a tarball from already installed dependency source.
66
+ const src = resolveDependencySourceFullPath(dependency, packageLock)
67
+ if (!src) {
68
+ throw new Error(`Private dependency ${dependency} must be present in node_modules`)
69
+ }
70
+
71
+ try {
72
+ const tarballFileName = packDependencyTarball(src, privateDepsDir)
73
+ packageJson.dependencies[dependency] = `file:${getDependencyTarballRelativePath(tarballFileName)}`
74
+ console.log(`packed ${dependency} -> private-deps/${tarballFileName}`)
75
+ } catch (error) {
76
+ console.error(`Couldn't pack dependency ${dependency} from ${src}`)
77
+ throw error
78
+ }
79
+ }
80
+
81
+ fs.writeFileSync(packageJsonPath, Buffer.from(JSON.stringify(packageJson, null, 2) + "\n"))
82
+ fs.writeFileSync(path.join(process.cwd(), REWRITE_MARKER_FILE), "")
83
+ console.log(`rewritten root dependencies to file: tarballs and created ${REWRITE_MARKER_FILE}`)
84
+ })()
85
+
86
+ function validateAndParseDeclaredPrivateDependencies(privateDependencies) {
87
+ const exactDependencies = []
88
+ const scopePatterns = []
89
+
90
+ for (const [i, d] of privateDependencies.entries()) {
91
+ if (typeof d !== "string") {
92
+ throw new TypeError(`Invalid value at supernova.privateDependencies[${i}]: '${d}'`)
93
+ }
94
+
95
+ if (!isValidPrivateDependencyEntry(d)) {
96
+ throw new TypeError(
97
+ `supernova.privateDependencies[${i}] must be a package name or scope wildcard like "@example/*"`,
98
+ )
99
+ }
100
+
101
+ if (isPrivateDependencyScopePattern(d)) {
102
+ scopePatterns.push(d)
103
+ } else {
104
+ exactDependencies.push(d)
105
+ }
106
+ }
107
+
108
+ return {exactDependencies, scopePatterns}
109
+ }
110
+
111
+ function readPackageLockJson() {
112
+ const packageLockPath = path.join(process.cwd(), "package-lock.json")
113
+ if (!fs.existsSync(packageLockPath)) {
114
+ return null
115
+ }
116
+
117
+ try {
118
+ return JSON.parse(fs.readFileSync(packageLockPath, "utf8"))
119
+ } catch {
120
+ return null
121
+ }
122
+ }
123
+
124
+ function detectPrivateDependenciesFromPackageLock(packageLock) {
125
+ if (!packageLock || typeof packageLock !== "object" || !packageLock.packages || typeof packageLock.packages !== "object") {
126
+ return []
127
+ }
128
+
129
+ const privatePackages = new Set()
130
+
131
+ for (const [packagePath, packageMeta] of Object.entries(packageLock.packages)) {
132
+ const packageName = extractPackageNameFromLockfilePath(packagePath)
133
+ if (!packageName || !packageMeta || typeof packageMeta !== "object") {
134
+ continue
135
+ }
136
+
137
+ const {resolved} = packageMeta
138
+ if (typeof resolved !== "string") {
139
+ continue
140
+ }
141
+
142
+ if (isPrivateResolvedUrl(resolved)) {
143
+ privatePackages.add(packageName)
144
+ }
145
+ }
146
+
147
+ return [...privatePackages].sort()
148
+ }
149
+
150
+ function detectPrivateDependenciesFromScopePatterns(packageLock, privateDependencyScopePatterns, packageJson) {
151
+ if (privateDependencyScopePatterns.length === 0) return []
152
+
153
+ const packageNames = new Set(collectPackageNamesFromPackageLock(packageLock))
154
+ if (packageNames.size === 0) {
155
+ for (const depName of Object.keys(packageJson.dependencies ?? {})) {
156
+ packageNames.add(depName)
157
+ }
158
+ }
159
+
160
+ return [...packageNames]
161
+ .filter(packageName => matchesAnyPrivateDependencyScopePattern(packageName, privateDependencyScopePatterns))
162
+ .sort()
163
+ }
164
+
165
+ function collectPackageNamesFromPackageLock(packageLock) {
166
+ if (!packageLock || typeof packageLock !== "object" || !packageLock.packages || typeof packageLock.packages !== "object") {
167
+ return []
168
+ }
169
+
170
+ const names = new Set()
171
+ for (const packagePath of Object.keys(packageLock.packages)) {
172
+ const packageName = extractPackageNameFromLockfilePath(packagePath)
173
+ if (packageName) {
174
+ names.add(packageName)
175
+ }
176
+ }
177
+
178
+ return [...names]
179
+ }
180
+
181
+ function matchesAnyPrivateDependencyScopePattern(packageName, privateDependencyScopePatterns) {
182
+ return privateDependencyScopePatterns.some(pattern => {
183
+ const scope = pattern.slice(0, -2)
184
+ return packageName === scope || packageName.startsWith(`${scope}/`)
185
+ })
186
+ }
187
+
188
+ function isPrivateDependencyScopePattern(entry) {
189
+ return typeof entry === "string" && entry.endsWith("/*")
190
+ }
191
+
192
+ function isValidPrivateDependencyEntry(entry) {
193
+ if (!entry || typeof entry !== "string" || entry.includes(" ")) return false
194
+ if (isPrivateDependencyScopePattern(entry)) {
195
+ const scope = entry.slice(0, -2)
196
+ return scope.startsWith("@") && !scope.includes("/")
197
+ }
198
+
199
+ return true
200
+ }
201
+
202
+ function isPrivateResolvedUrl(resolved) {
203
+ if (!resolved || resolved.startsWith("file:")) return false
204
+
205
+ let url
206
+ try {
207
+ url = new URL(resolved)
208
+ } catch {
209
+ return false
210
+ }
211
+
212
+ return url.hostname !== NPM_PUBLIC_REGISTRY_HOST
213
+ }
214
+
215
+ function extractPackageNameFromLockfilePath(packagePath) {
216
+ if (typeof packagePath !== "string" || packagePath.length === 0) return null
217
+ const segments = packagePath.split("/")
218
+
219
+ for (let i = segments.length - 1; i >= 0; i--) {
220
+ if (segments[i] !== "node_modules") continue
221
+ const first = segments[i + 1]
222
+ if (!first) return null
223
+
224
+ if (first.startsWith("@")) {
225
+ const second = segments[i + 2]
226
+ return second ? `${first}/${second}` : null
227
+ }
228
+
229
+ return first
230
+ }
231
+
232
+ return null
233
+ }
234
+
235
+ function resolveDependencySourceFullPath(packageName, packageLock) {
236
+ const topLevelPath = path.join(process.cwd(), "node_modules", packageName)
237
+ if (fs.existsSync(topLevelPath)) {
238
+ return topLevelPath
239
+ }
240
+
241
+ if (!packageLock || typeof packageLock !== "object" || !packageLock.packages || typeof packageLock.packages !== "object") {
242
+ return null
243
+ }
244
+
245
+ const candidatePaths = Object.keys(packageLock.packages)
246
+ .filter(packagePath => extractPackageNameFromLockfilePath(packagePath) === packageName)
247
+ .filter(packagePath => packagePath.length > 0)
248
+ .sort((a, b) => a.split("/").length - b.split("/").length)
249
+
250
+ for (const packagePath of candidatePaths) {
251
+ const fullPath = path.join(process.cwd(), packagePath)
252
+ if (fs.existsSync(fullPath)) {
253
+ return fullPath
254
+ }
255
+ }
256
+
257
+ return null
258
+ }
259
+
260
+ function packDependencyTarball(sourcePath, destinationDir) {
261
+ const output = execFileSync("npm", ["pack", sourcePath, "--pack-destination", destinationDir], {
262
+ encoding: "utf8",
263
+ })
264
+
265
+ const lines = output
266
+ .trim()
267
+ .split("\n")
268
+ .map(line => line.trim())
269
+ .filter(Boolean)
270
+ const tarballFileName = lines.at(-1)
271
+ if (!tarballFileName) {
272
+ throw new Error(`npm pack did not return tarball name for ${sourcePath}`)
273
+ }
274
+
275
+ return tarballFileName
276
+ }
277
+
278
+ function getDependencyTarballRelativePath(tarballFileName) {
279
+ return path.join(".", PRIVATE_DEPS_DIR_NAME, tarballFileName)
280
+ }
281
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5c2f1f89-00b6-5b9e-b68c-e052e419d440")}catch(e){}}();
282
+ //# debugId=5c2f1f89-00b6-5b9e-b68c-e052e419d440
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-command.d.ts","sourceRoot":"","sources":["../../src/utils/analyze-command.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKjD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;EAMrC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,OAAO,CAAA;AAwDxD,eAAO,MAAM,YAAY;;;;;;CAmBxB,CAAA;AAED,8BAAsB,kBAAmB,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAClF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;cAEe,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmOpG,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,oBAAoB;YAoBd,cAAc;YAkFd,kBAAkB;YAuBlB,6BAA6B;IAgB3C,OAAO,CAAC,YAAY;CAWrB"}
1
+ {"version":3,"file":"analyze-command.d.ts","sourceRoot":"","sources":["../../src/utils/analyze-command.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKjD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;EAMrC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,YAAY,GAAG,OAAO,CAAA;AAwDxD,eAAO,MAAM,YAAY;;;;;;CAmBxB,CAAA;AAED,8BAAsB,kBAAmB,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAClF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;cAEe,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmOpG,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,oBAAoB;YAoBd,cAAc;YAkFd,kBAAkB;YAuBlB,6BAA6B;IAgB3C,OAAO,CAAC,YAAY;CAWrB"}
@@ -1,9 +1,10 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="48ae5534-bfe7-5b1e-a760-916b78e71f6d")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b1b0f3f1-2050-5c37-9714-32da972b95c4")}catch(e){}}();
3
3
  import { Flags } from "@oclif/core";
4
4
  import { runCodeAnalysis } from "../code-analyzer/orchestrator/run-analysis.js";
5
5
  import AdmZip from "adm-zip";
6
6
  import axios, { isAxiosError } from "axios";
7
+ import { globSync } from "glob";
7
8
  import crypto from "node:crypto";
8
9
  import fs from "node:fs";
9
10
  import path from "node:path";
@@ -390,6 +391,13 @@ function resolveCandidatePackageDirs(rootDir) {
390
391
  if (workspacePackageDirs.length > 0) {
391
392
  return workspacePackageDirs;
392
393
  }
394
+ const rootPackageJsonPath = path.join(rootDir, "package.json");
395
+ if (!fs.existsSync(rootPackageJsonPath)) {
396
+ const recursivePackageDirs = resolveRecursivePackageDirs(rootDir);
397
+ if (recursivePackageDirs.length > 0) {
398
+ return recursivePackageDirs;
399
+ }
400
+ }
393
401
  return resolveDirectChildPackageDirs(rootDir);
394
402
  }
395
403
  function resolveWorkspacePackageDirs(rootDir) {
@@ -446,6 +454,25 @@ function resolveDirectChildPackageDirs(rootDir) {
446
454
  }
447
455
  return result;
448
456
  }
457
+ function resolveRecursivePackageDirs(rootDir) {
458
+ const packageJsonPaths = globSync("**/package.json", {
459
+ absolute: true,
460
+ cwd: rootDir,
461
+ dot: false,
462
+ ignore: [
463
+ "**/.git/**",
464
+ "**/.next/**",
465
+ "**/.supernova/**",
466
+ "**/build/**",
467
+ "**/coverage/**",
468
+ "**/dist/**",
469
+ "**/node_modules/**",
470
+ "**/out/**",
471
+ ],
472
+ nodir: true,
473
+ });
474
+ return [...new Set(packageJsonPaths.map(packageJsonPath => path.dirname(packageJsonPath)))].sort((a, b) => a.localeCompare(b));
475
+ }
449
476
  function resolveComponentPackageNames(rootDir, candidatePackageDirs, componentPackages) {
450
477
  const byName = new Map(candidatePackageDirs.map(packageDir => [readPackageName(packageDir), packageDir]));
451
478
  const names = new Set();
@@ -603,4 +630,4 @@ function formatStatus(status) {
603
630
  return `${colors[status]}${labels[status]}\u001B[0m`;
604
631
  }
605
632
  //# sourceMappingURL=analyze-command.js.map
606
- //# debugId=48ae5534-bfe7-5b1e-a760-916b78e71f6d
633
+ //# debugId=b1b0f3f1-2050-5c37-9714-32da972b95c4
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-command.js","sources":["../../src/utils/analyze-command.ts"],"sourceRoot":"","sourcesContent":["import { Flags } from \"@oclif/core\"\nimport { runCodeAnalysis } from \"../code-analyzer/orchestrator/run-analysis.js\"\nimport AdmZip from \"adm-zip\"\nimport axios, { isAxiosError } from \"axios\"\nimport crypto from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { z, ZodType } from \"zod\"\n\nimport { SentryCommand } from \"../types/index.js\"\nimport { SupernovaConfigAnalyze } from \"../types/config.js\"\nimport { watchAnalyzeStatus } from \"./analyze-status.js\"\nimport { createApiClient } from \"./http-client.js\"\n\nexport const AnalyzeCommandConfigSchema = z.object({\n exclude: z.array(z.string()).optional(),\n designSystemId: z.string().optional(),\n package: z.union([z.string(), z.array(z.string())]).optional(),\n dryRun: z.boolean().optional(),\n noWait: z.boolean().optional(),\n})\n\nexport type AnalyzeCommandConfig = z.infer<typeof AnalyzeCommandConfigSchema>\nexport type ScannerType = \"all\" | \"components\" | \"usage\"\ntype UploadScannerType = Exclude<ScannerType, \"all\">\n\ntype SnapshotUploadInitResponse = {\n fileId: string\n snapshotId: string\n uploadUrl: string\n}\n\ntype StartProcessingRunResponse = {\n processingRunId: string\n snapshotIds: string[]\n}\n\ntype ApiResultEnvelope<T> = {\n result: T\n}\n\ntype AnalyzeTarget = {\n importFrom: string | string[]\n rootDir: string\n}\n\ntype ExecutionTarget = {\n discovery: boolean\n importFrom: string | string[]\n rootDir: string\n scanType: UploadScannerType\n}\n\ntype PreparedSnapshotUpload = {\n localSnapshotId: string\n packageLabel: string\n pathLabel: string\n repoId: string\n repoPackageName: string\n scannerType: UploadScannerType\n snapshotRoot: string\n targetId: string\n}\n\ntype PlannedExecutionTarget = {\n analyzeTarget: AnalyzeTarget | null\n executionTarget: ExecutionTarget\n packageLabel: string\n pathLabel: string\n targetId: string\n}\n\ntype ComponentUsageSnapshot = {\n meta?: {\n importFromPackages?: string[]\n }\n records?: Record<string, { count?: number }>\n}\n\nexport const analyzeFlags = {\n designSystemId: Flags.string({ char: \"d\", description: \"Design system ID\" }),\n package: Flags.string({\n char: \"p\",\n description: \"Package name eg. @design-system-package. Can be repeated.\",\n multiple: true,\n }),\n exclude: Flags.string({\n description: \"Path to exclude from stories/docs/adoption scan. Can be repeated.\",\n multiple: true,\n }),\n dryRun: Flags.boolean({\n description: \"Run and write local snapshot only. Never uploads.\",\n default: false,\n }),\n noWait: Flags.boolean({\n description: \"Start processing and exit without waiting for completion.\",\n default: false,\n }),\n}\n\nexport abstract class AnalyzeCommandBase extends SentryCommand<AnalyzeCommandConfig> {\n get commandId(): string {\n return this.id ?? this.constructor.name\n }\n\n get configSchema(): ZodType<AnalyzeCommandConfig> {\n return AnalyzeCommandConfigSchema\n }\n\n protected async executeAnalyze(flags: AnalyzeCommandConfig, scannerType: ScannerType): Promise<void> {\n const rootDir = process.cwd()\n const config = this.configService.get()\n const analyzeConfig = config?.analyze ?? {}\n const configuredDesignSystemId = config?.designSystemId\n\n const packageFlags = normalizeStringList(flags.package)\n const configuredPackages = normalizeStringList(analyzeConfig.packages)\n const componentPackages = packageFlags.length > 0 ? packageFlags : configuredPackages\n if (componentPackages.length === 0) {\n this.error(\"Parameter --package is required.\")\n }\n\n const excludedPackages = normalizeStringList(analyzeConfig.excludedPackages)\n const repoId = analyzeConfig.repoId ?? crypto.randomUUID()\n const dryRun = flags.dryRun ?? false\n const noWait = flags.noWait ?? false\n const analyzeDesignSystemId = flags.designSystemId ?? configuredDesignSystemId\n const uploadContext = dryRun\n ? null\n : {\n apiClient: await createApiClient(this.env),\n designSystemId: analyzeDesignSystemId ?? (await this.promptDesignSystemId()),\n }\n\n const executionTargets = resolveExecutionTargets({\n componentPackages,\n excludedPackages,\n rootDir,\n scannerType,\n })\n\n const plannedTargets = executionTargets.map((executionTarget, index) =>\n createPlannedExecutionTarget({\n executionTarget,\n index,\n rootDir,\n total: executionTargets.length,\n }),\n )\n\n this.logPhase(\"Analyze started\")\n this.log(`Root: ${path.basename(rootDir) || rootDir}`)\n this.log(`Targets: ${plannedTargets.length}`)\n this.log(`Scan types: ${summarizeScanTypes(executionTargets)}`)\n\n this.logPhase(\"Plan\")\n for (const plannedTarget of plannedTargets) {\n const discoverySuffix = plannedTarget.executionTarget.discovery ? \" discovery\" : \"\"\n this.log(\n `${plannedTarget.targetId} ${padScanType(plannedTarget.executionTarget.scanType)} pkg=${plannedTarget.packageLabel} path=${plannedTarget.pathLabel}${discoverySuffix}`,\n )\n }\n\n const preparedUploads: PreparedSnapshotUpload[] = []\n let skippedTargets = 0\n let skippedNoAdoption = 0\n let skippedNoComponents = 0\n\n this.logPhase(\"Analyze phase\")\n for (const plannedTarget of plannedTargets) {\n const { analyzeTarget, executionTarget, packageLabel, pathLabel, targetId } = plannedTarget\n\n this.log(\n `${targetId} ${formatStatus(\"start\")} ${padScanType(executionTarget.scanType)} path=${pathLabel} pkg=${packageLabel}`,\n )\n\n if (executionTarget.scanType === \"components\" && !analyzeTarget) {\n const nodeModulesMessage = createMissingComponentsSourceMessage(executionTarget.importFrom)\n if (scannerType === \"components\") {\n this.error(nodeModulesMessage)\n }\n\n skippedTargets += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} ${nodeModulesMessage}`)\n continue\n }\n\n if (!analyzeTarget) {\n this.error(`Analyze target could not be resolved for ${stringifyImportFrom(executionTarget.importFrom)}.`)\n }\n\n const analysisResult = await runCodeAnalysis({\n designSystemId: analyzeDesignSystemId,\n excludePaths: flags.exclude,\n importFrom: analyzeTarget.importFrom,\n mode: executionTarget.scanType,\n projectRoot: analyzeTarget.rootDir,\n snapshotBaseRoot: shouldWriteSnapshotsToExecutionRoot(analyzeTarget.rootDir) ? rootDir : undefined,\n })\n\n const hasUsage = executionTarget.scanType === \"usage\" && hasUsageInSnapshot(analysisResult.snapshotRoot)\n if (executionTarget.scanType === \"usage\" && !hasUsage) {\n skippedTargets += 1\n skippedNoAdoption += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} no adoption detected`)\n continue\n }\n\n if (executionTarget.scanType === \"components\" && analysisResult.components.length === 0) {\n skippedTargets += 1\n skippedNoComponents += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} no components detected`)\n continue\n }\n\n if (executionTarget.scanType === \"components\") {\n this.log(\n `${targetId} ${formatStatus(\"done\")} ${padScanType(executionTarget.scanType)} snapshot=${analysisResult.snapshotId} count=${analysisResult.components.length}`,\n )\n } else {\n this.log(\n `${targetId} ${formatStatus(\"done\")} ${padScanType(executionTarget.scanType)} snapshot=${analysisResult.snapshotId} count=${countUsageRecordsInSnapshot(analysisResult.snapshotRoot)}`,\n )\n }\n\n preparedUploads.push({\n localSnapshotId: analysisResult.snapshotId,\n packageLabel,\n pathLabel,\n repoId,\n repoPackageName: readPackageName(analyzeTarget.rootDir),\n scannerType: executionTarget.scanType,\n snapshotRoot: analysisResult.snapshotRoot,\n targetId,\n })\n }\n\n this.logPhase(\"Analyze summary\")\n this.log(`Local snapshots: ${preparedUploads.length}`)\n this.log(`Skipped: ${skippedTargets}`)\n if (skippedNoAdoption > 0) {\n this.log(`- no adoption: ${skippedNoAdoption}`)\n }\n\n if (skippedNoComponents > 0) {\n this.log(`- no components: ${skippedNoComponents}`)\n }\n\n if (preparedUploads.length === 0) {\n this.log(\"No analyzable results found. You are likely running the command from the wrong directory.\")\n return\n }\n\n this.log(`Ready to upload: ${preparedUploads.length}`)\n\n if (dryRun) {\n this.persistAnalyzeConfig({\n analyzeConfig,\n designSystemId: analyzeDesignSystemId,\n excludedPackages,\n packages: componentPackages,\n repoId,\n })\n this.log(\"Upload skipped (dry-run enabled).\")\n return\n }\n\n if (!uploadContext) {\n this.error(\"Upload context is missing.\")\n }\n\n const { apiClient, designSystemId } = uploadContext\n this.logPhase(\"Upload phase\")\n const uploadResults = await Promise.allSettled(\n preparedUploads.map((upload, index) =>\n this.uploadSnapshot({\n apiClient,\n designSystemId,\n uploadId: formatSequenceId(\"U\", index + 1, preparedUploads.length),\n repoId: upload.repoId,\n repoPackageName: upload.repoPackageName,\n scannerType: upload.scannerType,\n snapshotRoot: upload.snapshotRoot,\n localSnapshotId: upload.localSnapshotId,\n packageLabel: upload.packageLabel,\n pathLabel: upload.pathLabel,\n targetId: upload.targetId,\n }),\n ),\n )\n const failedUploads = uploadResults.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n )\n\n if (failedUploads.length > 0) {\n throw new AggregateError(\n failedUploads.map(failure => failure.reason),\n `${failedUploads.length} snapshot upload(s) failed.`,\n )\n }\n\n this.logPhase(\"Upload summary\")\n this.log(`Uploaded snapshots: ${preparedUploads.length}/${preparedUploads.length}`)\n this.log(`- components: ${preparedUploads.filter(upload => upload.scannerType === \"components\").length}`)\n this.log(`- usage: ${preparedUploads.filter(upload => upload.scannerType === \"usage\").length}`)\n\n const processingRun = await this.startProcessingRun({\n apiClient,\n designSystemId,\n })\n\n this.persistAnalyzeConfig({\n analyzeConfig,\n designSystemId,\n excludedPackages,\n packages: componentPackages,\n repoId,\n })\n\n if (noWait) {\n this.log(\"Processing continues in the background. Use `supernova analyze status` to check progress.\")\n return\n }\n\n this.logPhase(\"Watch phase\")\n await watchAnalyzeStatus({\n apiClient,\n designSystemId,\n error: message => this.error(message),\n })\n\n this.logPhase(\"Analyze complete\")\n this.log(`Processing run: ${processingRun.processingRunId}`)\n this.log(`Uploaded: ${preparedUploads.length}/${preparedUploads.length}`)\n }\n\n private logPhase(title: string): void {\n this.log(\"\")\n this.log(title)\n }\n\n private persistAnalyzeConfig(input: {\n analyzeConfig: SupernovaConfigAnalyze | Record<string, never>\n designSystemId?: string\n excludedPackages: string[]\n packages: string[]\n repoId: string\n }): void {\n const { analyzeConfig, designSystemId, excludedPackages, packages, repoId } = input\n\n this.configService.update({\n analyze: {\n ...analyzeConfig,\n repoId,\n packages,\n excludedPackages,\n },\n ...(designSystemId ? { designSystemId } : {}),\n })\n }\n\n private async uploadSnapshot(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n localSnapshotId: string\n packageLabel: string\n pathLabel: string\n repoId: string\n repoPackageName: string\n scannerType: UploadScannerType\n snapshotRoot: string\n targetId: string\n uploadId: string\n }): Promise<void> {\n const {\n apiClient,\n designSystemId,\n localSnapshotId,\n packageLabel,\n pathLabel,\n repoId,\n repoPackageName,\n scannerType,\n snapshotRoot,\n targetId,\n uploadId,\n } = input\n const initPath = `/code-snapshots/upload`\n const local = await this.createArchiveFromSnapshotRoot(snapshotRoot)\n\n const initPayload = {\n archiveChecksum: local.checksum,\n archiveName: local.archiveName,\n archiveSize: local.sizeBytes,\n designSystemId,\n repoId,\n repoPackageName,\n scannerType: toApiScannerType(scannerType),\n }\n\n this.log(\n `${uploadId} ${formatStatus(\"start\")} ${padScanType(scannerType)} source=${targetId} path=${pathLabel} pkg=${packageLabel} snapshot=${localSnapshotId}`,\n )\n let initResponse: SnapshotUploadInitResponse\n try {\n const response = await apiClient.post<ApiResultEnvelope<SnapshotUploadInitResponse>>(initPath, initPayload)\n initResponse = response.data.result\n this.log(`${uploadId} INIT ${formatStatus(\"done\")}`)\n } catch (error) {\n this.log(`${uploadId} INIT ${formatStatus(\"fail\")}`)\n this.logHttpError(\"upload init\", error)\n this.error(`Snapshot upload initialization failed (${scannerType}).`)\n }\n\n if (!initResponse.uploadUrl) {\n this.error(`Snapshot upload init response does not contain uploadUrl (${scannerType}).`)\n }\n\n try {\n await axios.put(initResponse.uploadUrl, local.archive, {\n headers: {\n \"Content-Length\": local.archive.length,\n \"Content-Type\": \"application/zip\",\n },\n })\n this.log(`${uploadId} PUT ${formatStatus(\"done\")}`)\n } catch (error) {\n this.log(`${uploadId} PUT ${formatStatus(\"fail\")}`)\n this.logHttpError(\"signed upload PUT\", error)\n this.error(`Snapshot archive upload failed (${scannerType}).`)\n }\n\n const finalizePath = `/code-snapshots/${initResponse.snapshotId}/finalize`\n try {\n await apiClient.post(finalizePath, {})\n this.log(`${uploadId} FINAL ${formatStatus(\"done\")} remoteSnapshotId=${initResponse.snapshotId}`)\n } catch (error) {\n this.log(`${uploadId} FINAL ${formatStatus(\"fail\")}`)\n this.logHttpError(\"finalize\", error)\n this.error(`Snapshot finalize failed (${scannerType}).`)\n }\n }\n\n private async startProcessingRun(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n }): Promise<StartProcessingRunResponse> {\n const { apiClient, designSystemId } = input\n const processingPath = `/code-snapshots/process-run`\n this.logPhase(\"Processing phase\")\n this.log(`${formatStatus(\"start\")} processing run`)\n try {\n const response = await apiClient.post<ApiResultEnvelope<StartProcessingRunResponse>>(processingPath, {\n designSystemId,\n })\n this.log(\n `${formatStatus(\"done\")} processing run id=${response.data.result.processingRunId} snapshots=${response.data.result.snapshotIds.length}`,\n )\n return response.data.result\n } catch (error) {\n this.log(`${formatStatus(\"fail\")} processing run`)\n this.logHttpError(\"process-run\", error)\n this.error(\"Failed to start batch processing run.\")\n }\n }\n\n private async createArchiveFromSnapshotRoot(\n snapshotRoot: string,\n ): Promise<{ archive: Buffer; archiveName: string; checksum: string; sizeBytes: number }> {\n const zip = new AdmZip()\n zip.addLocalFolder(snapshotRoot)\n const archive = zip.toBuffer()\n const checksum = crypto.createHash(\"sha256\").update(archive).digest(\"hex\")\n\n return {\n archive,\n archiveName: `${path.basename(snapshotRoot)}.zip`,\n checksum,\n sizeBytes: archive.byteLength,\n }\n }\n\n private logHttpError(step: string, error: unknown): void {\n if (isAxiosError(error)) {\n const status = error.response?.status\n const data =\n typeof error.response?.data === \"string\" ? error.response.data : JSON.stringify(error.response?.data, null, 2)\n this.log(`${step}, http error${status ? ` ${status}` : \"\"}: ${data ?? error.message}`)\n return\n }\n\n this.log(`${step}, error: ${error instanceof Error ? error.message : String(error)}`)\n }\n}\n\nfunction toApiScannerType(scannerType: UploadScannerType): \"Components\" | \"Usage\" {\n return scannerType === \"components\" ? \"Components\" : \"Usage\"\n}\n\nfunction readPackageName(rootDir: string): string {\n const packageJsonPath = path.join(rootDir, \"package.json\")\n if (!fs.existsSync(packageJsonPath)) {\n return path.basename(rootDir)\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: string }\n return packageJson.name ?? path.basename(rootDir)\n}\n\nfunction resolveExecutionTargets(input: {\n componentPackages: string[]\n excludedPackages: string[]\n rootDir: string\n scannerType: ScannerType\n}): ExecutionTarget[] {\n const result: ExecutionTarget[] = []\n\n if (input.scannerType === \"components\" || input.scannerType === \"all\") {\n result.push(\n ...input.componentPackages.map<ExecutionTarget>(importFrom => ({\n discovery: false,\n importFrom,\n rootDir: input.rootDir,\n scanType: \"components\",\n })),\n )\n }\n\n if (input.scannerType === \"usage\" || input.scannerType === \"all\") {\n result.push(\n ...resolveUsageExecutionTargets({\n componentPackages: input.componentPackages,\n excludedPackages: input.excludedPackages,\n rootDir: input.rootDir,\n }),\n )\n }\n\n return result\n}\n\nfunction resolveUsageExecutionTargets(input: {\n componentPackages: string[]\n excludedPackages: string[]\n rootDir: string\n}): ExecutionTarget[] {\n const { componentPackages, excludedPackages, rootDir } = input\n const candidatePackageDirs = resolveCandidatePackageDirs(rootDir)\n const excludedNames = new Set(excludedPackages)\n const componentPackageNames = resolveComponentPackageNames(rootDir, candidatePackageDirs, componentPackages)\n\n if (candidatePackageDirs.length <= 1) {\n const rootPackageName = readPackageName(rootDir)\n if (excludedNames.has(rootPackageName)) {\n return []\n }\n\n return [{ discovery: false, importFrom: componentPackages, rootDir, scanType: \"usage\" }]\n }\n\n return candidatePackageDirs\n .filter(packageDir => {\n const packageName = readPackageName(packageDir)\n return !excludedNames.has(packageName) && !componentPackageNames.has(packageName)\n })\n .map(packageDir => ({\n discovery: true,\n importFrom: componentPackages,\n rootDir: packageDir,\n scanType: \"usage\" as const,\n }))\n}\n\ntype WorkspacePackageJson = {\n workspaces?: string[] | { packages?: string[] }\n}\n\nfunction resolveCandidatePackageDirs(rootDir: string): string[] {\n const workspacePackageDirs = resolveWorkspacePackageDirs(rootDir)\n if (workspacePackageDirs.length > 0) {\n return workspacePackageDirs\n }\n\n return resolveDirectChildPackageDirs(rootDir)\n}\n\nfunction resolveWorkspacePackageDirs(rootDir: string): string[] {\n const rootPackageJsonPath = path.join(rootDir, \"package.json\")\n if (!fs.existsSync(rootPackageJsonPath)) {\n return []\n }\n\n const rootPackageJson = JSON.parse(fs.readFileSync(rootPackageJsonPath, \"utf8\")) as WorkspacePackageJson\n const workspacePatterns = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : (rootPackageJson.workspaces?.packages ?? [])\n\n const packageDirs: string[] = []\n for (const pattern of workspacePatterns) {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\")\n if (!normalized.includes(\"*\")) {\n const workspaceDir = path.resolve(rootDir, normalized)\n if (fs.existsSync(path.join(workspaceDir, \"package.json\"))) {\n packageDirs.push(workspaceDir)\n }\n\n continue\n }\n\n if (!normalized.endsWith(\"/*\")) {\n continue\n }\n\n const baseDir = path.resolve(rootDir, normalized.slice(0, -2))\n if (!fs.existsSync(baseDir) || !fs.statSync(baseDir).isDirectory()) {\n continue\n }\n\n for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n const candidate = path.join(baseDir, entry.name)\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n packageDirs.push(candidate)\n }\n }\n }\n\n return [...new Set(packageDirs)]\n}\n\nfunction resolveDirectChildPackageDirs(rootDir: string): string[] {\n if (!fs.existsSync(rootDir) || !fs.statSync(rootDir).isDirectory()) {\n return []\n }\n\n const result: string[] = []\n for (const entry of fs.readdirSync(rootDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n const packageDir = path.join(rootDir, entry.name)\n if (fs.existsSync(path.join(packageDir, \"package.json\"))) {\n result.push(packageDir)\n }\n }\n\n return result\n}\n\nfunction resolveComponentPackageNames(\n rootDir: string,\n candidatePackageDirs: string[],\n componentPackages: string[],\n): Set<string> {\n const byName = new Map(candidatePackageDirs.map(packageDir => [readPackageName(packageDir), packageDir]))\n const names = new Set<string>()\n\n for (const componentPackage of componentPackages) {\n if (byName.has(componentPackage)) {\n names.add(componentPackage)\n continue\n }\n\n const explicitPath = path.resolve(rootDir, componentPackage)\n if (!fs.existsSync(explicitPath) || !fs.statSync(explicitPath).isDirectory()) {\n continue\n }\n\n names.add(readPackageName(explicitPath))\n }\n\n return names\n}\n\nfunction hasUsageInSnapshot(snapshotRoot: string): boolean {\n return countUsageRecordsInSnapshot(snapshotRoot) > 0\n}\n\nfunction countUsageRecordsInSnapshot(snapshotRoot: string): number {\n const usageFilePath = path.join(snapshotRoot, \"raw\", \"component-usage.json\")\n if (!fs.existsSync(usageFilePath)) {\n return 0\n }\n\n try {\n const usageJson = JSON.parse(fs.readFileSync(usageFilePath, \"utf8\")) as ComponentUsageSnapshot\n const usageRecords = usageJson.records ?? {}\n return Object.values(usageRecords).filter(item => (item.count ?? 0) > 0).length\n } catch {\n return 0\n }\n}\n\nfunction shouldWriteSnapshotsToExecutionRoot(projectRoot: string): boolean {\n return projectRoot.split(path.sep).includes(\"node_modules\")\n}\n\nfunction resolveAnalyzeTarget(input: {\n importFrom: string | string[]\n rootDir: string\n scannerType: UploadScannerType\n}): AnalyzeTarget | null {\n if (input.scannerType === \"usage\") {\n return { importFrom: input.importFrom, rootDir: input.rootDir }\n }\n\n const importFrom = Array.isArray(input.importFrom) ? input.importFrom[0] : input.importFrom\n if (!importFrom) {\n return { importFrom: \".\", rootDir: input.rootDir }\n }\n\n if (readPackageName(input.rootDir) === importFrom) {\n if (hasSourceEntry(input.rootDir)) {\n return { importFrom: \"src\", rootDir: input.rootDir }\n }\n\n return { importFrom: \".\", rootDir: input.rootDir }\n }\n\n const workspacePackageDir = findPackageDirByName(resolveCandidatePackageDirs(input.rootDir), importFrom)\n if (workspacePackageDir) {\n if (hasSourceEntry(workspacePackageDir)) {\n return { importFrom: \"src\", rootDir: workspacePackageDir }\n }\n\n return { importFrom: \".\", rootDir: workspacePackageDir }\n }\n\n const explicitPath = path.resolve(input.rootDir, importFrom)\n if (fs.existsSync(explicitPath) && fs.statSync(explicitPath).isDirectory()) {\n if (hasSourceEntry(explicitPath)) {\n return { importFrom: \"src\", rootDir: explicitPath }\n }\n\n return { importFrom: \".\", rootDir: explicitPath }\n }\n\n return null\n}\n\nfunction normalizeStringList(value?: string | string[]): string[] {\n if (!value) {\n return []\n }\n\n const list = Array.isArray(value) ? value : [value]\n return [...new Set(list.map(item => item.trim()).filter(Boolean))]\n}\n\nfunction stringifyImportFrom(importFrom: string | string[]): string {\n return Array.isArray(importFrom) ? importFrom.join(\",\") : importFrom\n}\n\nfunction findPackageDirByName(packageDirs: string[], packageName: string): string | null {\n for (const packageDir of packageDirs) {\n const packageJsonPath = path.join(packageDir, \"package.json\")\n if (!fs.existsSync(packageJsonPath)) {\n continue\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: string }\n if (packageJson.name === packageName) {\n return packageDir\n }\n } catch {\n continue\n }\n }\n\n return null\n}\n\nfunction hasSourceEntry(packageDir: string): boolean {\n return (\n fs.existsSync(path.join(packageDir, \"src\", \"index.ts\")) || fs.existsSync(path.join(packageDir, \"src\", \"index.tsx\"))\n )\n}\n\nfunction createMissingComponentsSourceMessage(importFrom: string | string[]): string {\n return `Package ${stringifyImportFrom(importFrom)} could not be resolved from local source. Component analysis must run against source code, so the components scan was skipped. Run the command from the package source instead.`\n}\n\nfunction createPlannedExecutionTarget(input: {\n executionTarget: ExecutionTarget\n index: number\n rootDir: string\n total: number\n}): PlannedExecutionTarget {\n const { executionTarget, index, rootDir, total } = input\n const analyzeTarget = resolveAnalyzeTarget({\n importFrom: executionTarget.importFrom,\n rootDir: executionTarget.rootDir,\n scannerType: executionTarget.scanType,\n })\n\n return {\n analyzeTarget,\n executionTarget,\n packageLabel: stringifyImportFrom(executionTarget.importFrom),\n pathLabel: formatPathLabel(rootDir, analyzeTarget?.rootDir ?? executionTarget.rootDir),\n targetId: formatSequenceId(\"\", index + 1, total),\n }\n}\n\nfunction summarizeScanTypes(executionTargets: ExecutionTarget[]): string {\n const components = executionTargets.filter(target => target.scanType === \"components\").length\n const usage = executionTargets.filter(target => target.scanType === \"usage\").length\n return `${components} components, ${usage} usage`\n}\n\nfunction padScanType(scanType: UploadScannerType): string {\n return scanType.padEnd(\"components\".length, \" \")\n}\n\nfunction formatSequenceId(prefix: string, index: number, total: number): string {\n const width = String(total).length\n const left = String(index).padStart(width, \"0\")\n const right = String(total).padStart(width, \"0\")\n return `[${prefix}${left}/${right}]`\n}\n\nfunction formatPathLabel(rootDir: string, targetPath: string): string {\n const relativePath = path.relative(rootDir, targetPath) || \".\"\n if (relativePath.length <= 48) {\n return relativePath\n }\n\n const segments = relativePath.split(path.sep)\n return segments.length > 2 ? `.../${segments.slice(-2).join(\"/\")}` : relativePath\n}\n\nfunction formatStatus(status: \"done\" | \"fail\" | \"skip\" | \"start\"): string {\n const labels = {\n done: \"DONE \",\n fail: \"FAIL \",\n skip: \"SKIP \",\n start: \"START\",\n } as const\n\n const colorEnabled = process.stdout.isTTY && !process.env.NO_COLOR\n if (!colorEnabled) {\n return labels[status]\n }\n\n const colors = {\n done: \"\\u001B[32m\",\n fail: \"\\u001B[31m\",\n skip: \"\\u001B[33m\",\n start: \"\\u001B[36m\",\n } as const\n\n return `${colors[status]}${labels[status]}\\u001B[0m`\n}\n"],"names":[],"mappings":"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","debug_id":"48ae5534-bfe7-5b1e-a760-916b78e71f6d"}
1
+ {"version":3,"file":"analyze-command.js","sources":["../../src/utils/analyze-command.ts"],"sourceRoot":"","sourcesContent":["import { Flags } from \"@oclif/core\"\nimport { runCodeAnalysis } from \"../code-analyzer/orchestrator/run-analysis.js\"\nimport AdmZip from \"adm-zip\"\nimport axios, { isAxiosError } from \"axios\"\nimport { globSync } from \"glob\"\nimport crypto from \"node:crypto\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport { z, ZodType } from \"zod\"\n\nimport { SentryCommand } from \"../types/index.js\"\nimport { SupernovaConfigAnalyze } from \"../types/config.js\"\nimport { watchAnalyzeStatus } from \"./analyze-status.js\"\nimport { createApiClient } from \"./http-client.js\"\n\nexport const AnalyzeCommandConfigSchema = z.object({\n exclude: z.array(z.string()).optional(),\n designSystemId: z.string().optional(),\n package: z.union([z.string(), z.array(z.string())]).optional(),\n dryRun: z.boolean().optional(),\n noWait: z.boolean().optional(),\n})\n\nexport type AnalyzeCommandConfig = z.infer<typeof AnalyzeCommandConfigSchema>\nexport type ScannerType = \"all\" | \"components\" | \"usage\"\ntype UploadScannerType = Exclude<ScannerType, \"all\">\n\ntype SnapshotUploadInitResponse = {\n fileId: string\n snapshotId: string\n uploadUrl: string\n}\n\ntype StartProcessingRunResponse = {\n processingRunId: string\n snapshotIds: string[]\n}\n\ntype ApiResultEnvelope<T> = {\n result: T\n}\n\ntype AnalyzeTarget = {\n importFrom: string | string[]\n rootDir: string\n}\n\ntype ExecutionTarget = {\n discovery: boolean\n importFrom: string | string[]\n rootDir: string\n scanType: UploadScannerType\n}\n\ntype PreparedSnapshotUpload = {\n localSnapshotId: string\n packageLabel: string\n pathLabel: string\n repoId: string\n repoPackageName: string\n scannerType: UploadScannerType\n snapshotRoot: string\n targetId: string\n}\n\ntype PlannedExecutionTarget = {\n analyzeTarget: AnalyzeTarget | null\n executionTarget: ExecutionTarget\n packageLabel: string\n pathLabel: string\n targetId: string\n}\n\ntype ComponentUsageSnapshot = {\n meta?: {\n importFromPackages?: string[]\n }\n records?: Record<string, { count?: number }>\n}\n\nexport const analyzeFlags = {\n designSystemId: Flags.string({ char: \"d\", description: \"Design system ID\" }),\n package: Flags.string({\n char: \"p\",\n description: \"Package name eg. @design-system-package. Can be repeated.\",\n multiple: true,\n }),\n exclude: Flags.string({\n description: \"Path to exclude from stories/docs/adoption scan. Can be repeated.\",\n multiple: true,\n }),\n dryRun: Flags.boolean({\n description: \"Run and write local snapshot only. Never uploads.\",\n default: false,\n }),\n noWait: Flags.boolean({\n description: \"Start processing and exit without waiting for completion.\",\n default: false,\n }),\n}\n\nexport abstract class AnalyzeCommandBase extends SentryCommand<AnalyzeCommandConfig> {\n get commandId(): string {\n return this.id ?? this.constructor.name\n }\n\n get configSchema(): ZodType<AnalyzeCommandConfig> {\n return AnalyzeCommandConfigSchema\n }\n\n protected async executeAnalyze(flags: AnalyzeCommandConfig, scannerType: ScannerType): Promise<void> {\n const rootDir = process.cwd()\n const config = this.configService.get()\n const analyzeConfig = config?.analyze ?? {}\n const configuredDesignSystemId = config?.designSystemId\n\n const packageFlags = normalizeStringList(flags.package)\n const configuredPackages = normalizeStringList(analyzeConfig.packages)\n const componentPackages = packageFlags.length > 0 ? packageFlags : configuredPackages\n if (componentPackages.length === 0) {\n this.error(\"Parameter --package is required.\")\n }\n\n const excludedPackages = normalizeStringList(analyzeConfig.excludedPackages)\n const repoId = analyzeConfig.repoId ?? crypto.randomUUID()\n const dryRun = flags.dryRun ?? false\n const noWait = flags.noWait ?? false\n const analyzeDesignSystemId = flags.designSystemId ?? configuredDesignSystemId\n const uploadContext = dryRun\n ? null\n : {\n apiClient: await createApiClient(this.env),\n designSystemId: analyzeDesignSystemId ?? (await this.promptDesignSystemId()),\n }\n\n const executionTargets = resolveExecutionTargets({\n componentPackages,\n excludedPackages,\n rootDir,\n scannerType,\n })\n\n const plannedTargets = executionTargets.map((executionTarget, index) =>\n createPlannedExecutionTarget({\n executionTarget,\n index,\n rootDir,\n total: executionTargets.length,\n }),\n )\n\n this.logPhase(\"Analyze started\")\n this.log(`Root: ${path.basename(rootDir) || rootDir}`)\n this.log(`Targets: ${plannedTargets.length}`)\n this.log(`Scan types: ${summarizeScanTypes(executionTargets)}`)\n\n this.logPhase(\"Plan\")\n for (const plannedTarget of plannedTargets) {\n const discoverySuffix = plannedTarget.executionTarget.discovery ? \" discovery\" : \"\"\n this.log(\n `${plannedTarget.targetId} ${padScanType(plannedTarget.executionTarget.scanType)} pkg=${plannedTarget.packageLabel} path=${plannedTarget.pathLabel}${discoverySuffix}`,\n )\n }\n\n const preparedUploads: PreparedSnapshotUpload[] = []\n let skippedTargets = 0\n let skippedNoAdoption = 0\n let skippedNoComponents = 0\n\n this.logPhase(\"Analyze phase\")\n for (const plannedTarget of plannedTargets) {\n const { analyzeTarget, executionTarget, packageLabel, pathLabel, targetId } = plannedTarget\n\n this.log(\n `${targetId} ${formatStatus(\"start\")} ${padScanType(executionTarget.scanType)} path=${pathLabel} pkg=${packageLabel}`,\n )\n\n if (executionTarget.scanType === \"components\" && !analyzeTarget) {\n const nodeModulesMessage = createMissingComponentsSourceMessage(executionTarget.importFrom)\n if (scannerType === \"components\") {\n this.error(nodeModulesMessage)\n }\n\n skippedTargets += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} ${nodeModulesMessage}`)\n continue\n }\n\n if (!analyzeTarget) {\n this.error(`Analyze target could not be resolved for ${stringifyImportFrom(executionTarget.importFrom)}.`)\n }\n\n const analysisResult = await runCodeAnalysis({\n designSystemId: analyzeDesignSystemId,\n excludePaths: flags.exclude,\n importFrom: analyzeTarget.importFrom,\n mode: executionTarget.scanType,\n projectRoot: analyzeTarget.rootDir,\n snapshotBaseRoot: shouldWriteSnapshotsToExecutionRoot(analyzeTarget.rootDir) ? rootDir : undefined,\n })\n\n const hasUsage = executionTarget.scanType === \"usage\" && hasUsageInSnapshot(analysisResult.snapshotRoot)\n if (executionTarget.scanType === \"usage\" && !hasUsage) {\n skippedTargets += 1\n skippedNoAdoption += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} no adoption detected`)\n continue\n }\n\n if (executionTarget.scanType === \"components\" && analysisResult.components.length === 0) {\n skippedTargets += 1\n skippedNoComponents += 1\n this.log(`${targetId} ${formatStatus(\"skip\")} ${padScanType(executionTarget.scanType)} no components detected`)\n continue\n }\n\n if (executionTarget.scanType === \"components\") {\n this.log(\n `${targetId} ${formatStatus(\"done\")} ${padScanType(executionTarget.scanType)} snapshot=${analysisResult.snapshotId} count=${analysisResult.components.length}`,\n )\n } else {\n this.log(\n `${targetId} ${formatStatus(\"done\")} ${padScanType(executionTarget.scanType)} snapshot=${analysisResult.snapshotId} count=${countUsageRecordsInSnapshot(analysisResult.snapshotRoot)}`,\n )\n }\n\n preparedUploads.push({\n localSnapshotId: analysisResult.snapshotId,\n packageLabel,\n pathLabel,\n repoId,\n repoPackageName: readPackageName(analyzeTarget.rootDir),\n scannerType: executionTarget.scanType,\n snapshotRoot: analysisResult.snapshotRoot,\n targetId,\n })\n }\n\n this.logPhase(\"Analyze summary\")\n this.log(`Local snapshots: ${preparedUploads.length}`)\n this.log(`Skipped: ${skippedTargets}`)\n if (skippedNoAdoption > 0) {\n this.log(`- no adoption: ${skippedNoAdoption}`)\n }\n\n if (skippedNoComponents > 0) {\n this.log(`- no components: ${skippedNoComponents}`)\n }\n\n if (preparedUploads.length === 0) {\n this.log(\"No analyzable results found. You are likely running the command from the wrong directory.\")\n return\n }\n\n this.log(`Ready to upload: ${preparedUploads.length}`)\n\n if (dryRun) {\n this.persistAnalyzeConfig({\n analyzeConfig,\n designSystemId: analyzeDesignSystemId,\n excludedPackages,\n packages: componentPackages,\n repoId,\n })\n this.log(\"Upload skipped (dry-run enabled).\")\n return\n }\n\n if (!uploadContext) {\n this.error(\"Upload context is missing.\")\n }\n\n const { apiClient, designSystemId } = uploadContext\n this.logPhase(\"Upload phase\")\n const uploadResults = await Promise.allSettled(\n preparedUploads.map((upload, index) =>\n this.uploadSnapshot({\n apiClient,\n designSystemId,\n uploadId: formatSequenceId(\"U\", index + 1, preparedUploads.length),\n repoId: upload.repoId,\n repoPackageName: upload.repoPackageName,\n scannerType: upload.scannerType,\n snapshotRoot: upload.snapshotRoot,\n localSnapshotId: upload.localSnapshotId,\n packageLabel: upload.packageLabel,\n pathLabel: upload.pathLabel,\n targetId: upload.targetId,\n }),\n ),\n )\n const failedUploads = uploadResults.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n )\n\n if (failedUploads.length > 0) {\n throw new AggregateError(\n failedUploads.map(failure => failure.reason),\n `${failedUploads.length} snapshot upload(s) failed.`,\n )\n }\n\n this.logPhase(\"Upload summary\")\n this.log(`Uploaded snapshots: ${preparedUploads.length}/${preparedUploads.length}`)\n this.log(`- components: ${preparedUploads.filter(upload => upload.scannerType === \"components\").length}`)\n this.log(`- usage: ${preparedUploads.filter(upload => upload.scannerType === \"usage\").length}`)\n\n const processingRun = await this.startProcessingRun({\n apiClient,\n designSystemId,\n })\n\n this.persistAnalyzeConfig({\n analyzeConfig,\n designSystemId,\n excludedPackages,\n packages: componentPackages,\n repoId,\n })\n\n if (noWait) {\n this.log(\"Processing continues in the background. Use `supernova analyze status` to check progress.\")\n return\n }\n\n this.logPhase(\"Watch phase\")\n await watchAnalyzeStatus({\n apiClient,\n designSystemId,\n error: message => this.error(message),\n })\n\n this.logPhase(\"Analyze complete\")\n this.log(`Processing run: ${processingRun.processingRunId}`)\n this.log(`Uploaded: ${preparedUploads.length}/${preparedUploads.length}`)\n }\n\n private logPhase(title: string): void {\n this.log(\"\")\n this.log(title)\n }\n\n private persistAnalyzeConfig(input: {\n analyzeConfig: SupernovaConfigAnalyze | Record<string, never>\n designSystemId?: string\n excludedPackages: string[]\n packages: string[]\n repoId: string\n }): void {\n const { analyzeConfig, designSystemId, excludedPackages, packages, repoId } = input\n\n this.configService.update({\n analyze: {\n ...analyzeConfig,\n repoId,\n packages,\n excludedPackages,\n },\n ...(designSystemId ? { designSystemId } : {}),\n })\n }\n\n private async uploadSnapshot(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n localSnapshotId: string\n packageLabel: string\n pathLabel: string\n repoId: string\n repoPackageName: string\n scannerType: UploadScannerType\n snapshotRoot: string\n targetId: string\n uploadId: string\n }): Promise<void> {\n const {\n apiClient,\n designSystemId,\n localSnapshotId,\n packageLabel,\n pathLabel,\n repoId,\n repoPackageName,\n scannerType,\n snapshotRoot,\n targetId,\n uploadId,\n } = input\n const initPath = `/code-snapshots/upload`\n const local = await this.createArchiveFromSnapshotRoot(snapshotRoot)\n\n const initPayload = {\n archiveChecksum: local.checksum,\n archiveName: local.archiveName,\n archiveSize: local.sizeBytes,\n designSystemId,\n repoId,\n repoPackageName,\n scannerType: toApiScannerType(scannerType),\n }\n\n this.log(\n `${uploadId} ${formatStatus(\"start\")} ${padScanType(scannerType)} source=${targetId} path=${pathLabel} pkg=${packageLabel} snapshot=${localSnapshotId}`,\n )\n let initResponse: SnapshotUploadInitResponse\n try {\n const response = await apiClient.post<ApiResultEnvelope<SnapshotUploadInitResponse>>(initPath, initPayload)\n initResponse = response.data.result\n this.log(`${uploadId} INIT ${formatStatus(\"done\")}`)\n } catch (error) {\n this.log(`${uploadId} INIT ${formatStatus(\"fail\")}`)\n this.logHttpError(\"upload init\", error)\n this.error(`Snapshot upload initialization failed (${scannerType}).`)\n }\n\n if (!initResponse.uploadUrl) {\n this.error(`Snapshot upload init response does not contain uploadUrl (${scannerType}).`)\n }\n\n try {\n await axios.put(initResponse.uploadUrl, local.archive, {\n headers: {\n \"Content-Length\": local.archive.length,\n \"Content-Type\": \"application/zip\",\n },\n })\n this.log(`${uploadId} PUT ${formatStatus(\"done\")}`)\n } catch (error) {\n this.log(`${uploadId} PUT ${formatStatus(\"fail\")}`)\n this.logHttpError(\"signed upload PUT\", error)\n this.error(`Snapshot archive upload failed (${scannerType}).`)\n }\n\n const finalizePath = `/code-snapshots/${initResponse.snapshotId}/finalize`\n try {\n await apiClient.post(finalizePath, {})\n this.log(`${uploadId} FINAL ${formatStatus(\"done\")} remoteSnapshotId=${initResponse.snapshotId}`)\n } catch (error) {\n this.log(`${uploadId} FINAL ${formatStatus(\"fail\")}`)\n this.logHttpError(\"finalize\", error)\n this.error(`Snapshot finalize failed (${scannerType}).`)\n }\n }\n\n private async startProcessingRun(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n }): Promise<StartProcessingRunResponse> {\n const { apiClient, designSystemId } = input\n const processingPath = `/code-snapshots/process-run`\n this.logPhase(\"Processing phase\")\n this.log(`${formatStatus(\"start\")} processing run`)\n try {\n const response = await apiClient.post<ApiResultEnvelope<StartProcessingRunResponse>>(processingPath, {\n designSystemId,\n })\n this.log(\n `${formatStatus(\"done\")} processing run id=${response.data.result.processingRunId} snapshots=${response.data.result.snapshotIds.length}`,\n )\n return response.data.result\n } catch (error) {\n this.log(`${formatStatus(\"fail\")} processing run`)\n this.logHttpError(\"process-run\", error)\n this.error(\"Failed to start batch processing run.\")\n }\n }\n\n private async createArchiveFromSnapshotRoot(\n snapshotRoot: string,\n ): Promise<{ archive: Buffer; archiveName: string; checksum: string; sizeBytes: number }> {\n const zip = new AdmZip()\n zip.addLocalFolder(snapshotRoot)\n const archive = zip.toBuffer()\n const checksum = crypto.createHash(\"sha256\").update(archive).digest(\"hex\")\n\n return {\n archive,\n archiveName: `${path.basename(snapshotRoot)}.zip`,\n checksum,\n sizeBytes: archive.byteLength,\n }\n }\n\n private logHttpError(step: string, error: unknown): void {\n if (isAxiosError(error)) {\n const status = error.response?.status\n const data =\n typeof error.response?.data === \"string\" ? error.response.data : JSON.stringify(error.response?.data, null, 2)\n this.log(`${step}, http error${status ? ` ${status}` : \"\"}: ${data ?? error.message}`)\n return\n }\n\n this.log(`${step}, error: ${error instanceof Error ? error.message : String(error)}`)\n }\n}\n\nfunction toApiScannerType(scannerType: UploadScannerType): \"Components\" | \"Usage\" {\n return scannerType === \"components\" ? \"Components\" : \"Usage\"\n}\n\nfunction readPackageName(rootDir: string): string {\n const packageJsonPath = path.join(rootDir, \"package.json\")\n if (!fs.existsSync(packageJsonPath)) {\n return path.basename(rootDir)\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: string }\n return packageJson.name ?? path.basename(rootDir)\n}\n\nfunction resolveExecutionTargets(input: {\n componentPackages: string[]\n excludedPackages: string[]\n rootDir: string\n scannerType: ScannerType\n}): ExecutionTarget[] {\n const result: ExecutionTarget[] = []\n\n if (input.scannerType === \"components\" || input.scannerType === \"all\") {\n result.push(\n ...input.componentPackages.map<ExecutionTarget>(importFrom => ({\n discovery: false,\n importFrom,\n rootDir: input.rootDir,\n scanType: \"components\",\n })),\n )\n }\n\n if (input.scannerType === \"usage\" || input.scannerType === \"all\") {\n result.push(\n ...resolveUsageExecutionTargets({\n componentPackages: input.componentPackages,\n excludedPackages: input.excludedPackages,\n rootDir: input.rootDir,\n }),\n )\n }\n\n return result\n}\n\nfunction resolveUsageExecutionTargets(input: {\n componentPackages: string[]\n excludedPackages: string[]\n rootDir: string\n}): ExecutionTarget[] {\n const { componentPackages, excludedPackages, rootDir } = input\n const candidatePackageDirs = resolveCandidatePackageDirs(rootDir)\n const excludedNames = new Set(excludedPackages)\n const componentPackageNames = resolveComponentPackageNames(rootDir, candidatePackageDirs, componentPackages)\n\n if (candidatePackageDirs.length <= 1) {\n const rootPackageName = readPackageName(rootDir)\n if (excludedNames.has(rootPackageName)) {\n return []\n }\n\n return [{ discovery: false, importFrom: componentPackages, rootDir, scanType: \"usage\" }]\n }\n\n return candidatePackageDirs\n .filter(packageDir => {\n const packageName = readPackageName(packageDir)\n return !excludedNames.has(packageName) && !componentPackageNames.has(packageName)\n })\n .map(packageDir => ({\n discovery: true,\n importFrom: componentPackages,\n rootDir: packageDir,\n scanType: \"usage\" as const,\n }))\n}\n\ntype WorkspacePackageJson = {\n workspaces?: string[] | { packages?: string[] }\n}\n\nfunction resolveCandidatePackageDirs(rootDir: string): string[] {\n const workspacePackageDirs = resolveWorkspacePackageDirs(rootDir)\n if (workspacePackageDirs.length > 0) {\n return workspacePackageDirs\n }\n\n const rootPackageJsonPath = path.join(rootDir, \"package.json\")\n if (!fs.existsSync(rootPackageJsonPath)) {\n const recursivePackageDirs = resolveRecursivePackageDirs(rootDir)\n if (recursivePackageDirs.length > 0) {\n return recursivePackageDirs\n }\n }\n\n return resolveDirectChildPackageDirs(rootDir)\n}\n\nfunction resolveWorkspacePackageDirs(rootDir: string): string[] {\n const rootPackageJsonPath = path.join(rootDir, \"package.json\")\n if (!fs.existsSync(rootPackageJsonPath)) {\n return []\n }\n\n const rootPackageJson = JSON.parse(fs.readFileSync(rootPackageJsonPath, \"utf8\")) as WorkspacePackageJson\n const workspacePatterns = Array.isArray(rootPackageJson.workspaces)\n ? rootPackageJson.workspaces\n : (rootPackageJson.workspaces?.packages ?? [])\n\n const packageDirs: string[] = []\n for (const pattern of workspacePatterns) {\n const normalized = pattern.replaceAll(\"\\\\\", \"/\")\n if (!normalized.includes(\"*\")) {\n const workspaceDir = path.resolve(rootDir, normalized)\n if (fs.existsSync(path.join(workspaceDir, \"package.json\"))) {\n packageDirs.push(workspaceDir)\n }\n\n continue\n }\n\n if (!normalized.endsWith(\"/*\")) {\n continue\n }\n\n const baseDir = path.resolve(rootDir, normalized.slice(0, -2))\n if (!fs.existsSync(baseDir) || !fs.statSync(baseDir).isDirectory()) {\n continue\n }\n\n for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n const candidate = path.join(baseDir, entry.name)\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n packageDirs.push(candidate)\n }\n }\n }\n\n return [...new Set(packageDirs)]\n}\n\nfunction resolveDirectChildPackageDirs(rootDir: string): string[] {\n if (!fs.existsSync(rootDir) || !fs.statSync(rootDir).isDirectory()) {\n return []\n }\n\n const result: string[] = []\n for (const entry of fs.readdirSync(rootDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue\n }\n\n const packageDir = path.join(rootDir, entry.name)\n if (fs.existsSync(path.join(packageDir, \"package.json\"))) {\n result.push(packageDir)\n }\n }\n\n return result\n}\n\nfunction resolveRecursivePackageDirs(rootDir: string): string[] {\n const packageJsonPaths = globSync(\"**/package.json\", {\n absolute: true,\n cwd: rootDir,\n dot: false,\n ignore: [\n \"**/.git/**\",\n \"**/.next/**\",\n \"**/.supernova/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/dist/**\",\n \"**/node_modules/**\",\n \"**/out/**\",\n ],\n nodir: true,\n })\n\n return [...new Set(packageJsonPaths.map(packageJsonPath => path.dirname(packageJsonPath)))].sort((a, b) =>\n a.localeCompare(b),\n )\n}\n\nfunction resolveComponentPackageNames(\n rootDir: string,\n candidatePackageDirs: string[],\n componentPackages: string[],\n): Set<string> {\n const byName = new Map(candidatePackageDirs.map(packageDir => [readPackageName(packageDir), packageDir]))\n const names = new Set<string>()\n\n for (const componentPackage of componentPackages) {\n if (byName.has(componentPackage)) {\n names.add(componentPackage)\n continue\n }\n\n const explicitPath = path.resolve(rootDir, componentPackage)\n if (!fs.existsSync(explicitPath) || !fs.statSync(explicitPath).isDirectory()) {\n continue\n }\n\n names.add(readPackageName(explicitPath))\n }\n\n return names\n}\n\nfunction hasUsageInSnapshot(snapshotRoot: string): boolean {\n return countUsageRecordsInSnapshot(snapshotRoot) > 0\n}\n\nfunction countUsageRecordsInSnapshot(snapshotRoot: string): number {\n const usageFilePath = path.join(snapshotRoot, \"raw\", \"component-usage.json\")\n if (!fs.existsSync(usageFilePath)) {\n return 0\n }\n\n try {\n const usageJson = JSON.parse(fs.readFileSync(usageFilePath, \"utf8\")) as ComponentUsageSnapshot\n const usageRecords = usageJson.records ?? {}\n return Object.values(usageRecords).filter(item => (item.count ?? 0) > 0).length\n } catch {\n return 0\n }\n}\n\nfunction shouldWriteSnapshotsToExecutionRoot(projectRoot: string): boolean {\n return projectRoot.split(path.sep).includes(\"node_modules\")\n}\n\nfunction resolveAnalyzeTarget(input: {\n importFrom: string | string[]\n rootDir: string\n scannerType: UploadScannerType\n}): AnalyzeTarget | null {\n if (input.scannerType === \"usage\") {\n return { importFrom: input.importFrom, rootDir: input.rootDir }\n }\n\n const importFrom = Array.isArray(input.importFrom) ? input.importFrom[0] : input.importFrom\n if (!importFrom) {\n return { importFrom: \".\", rootDir: input.rootDir }\n }\n\n if (readPackageName(input.rootDir) === importFrom) {\n if (hasSourceEntry(input.rootDir)) {\n return { importFrom: \"src\", rootDir: input.rootDir }\n }\n\n return { importFrom: \".\", rootDir: input.rootDir }\n }\n\n const workspacePackageDir = findPackageDirByName(resolveCandidatePackageDirs(input.rootDir), importFrom)\n if (workspacePackageDir) {\n if (hasSourceEntry(workspacePackageDir)) {\n return { importFrom: \"src\", rootDir: workspacePackageDir }\n }\n\n return { importFrom: \".\", rootDir: workspacePackageDir }\n }\n\n const explicitPath = path.resolve(input.rootDir, importFrom)\n if (fs.existsSync(explicitPath) && fs.statSync(explicitPath).isDirectory()) {\n if (hasSourceEntry(explicitPath)) {\n return { importFrom: \"src\", rootDir: explicitPath }\n }\n\n return { importFrom: \".\", rootDir: explicitPath }\n }\n\n return null\n}\n\nfunction normalizeStringList(value?: string | string[]): string[] {\n if (!value) {\n return []\n }\n\n const list = Array.isArray(value) ? value : [value]\n return [...new Set(list.map(item => item.trim()).filter(Boolean))]\n}\n\nfunction stringifyImportFrom(importFrom: string | string[]): string {\n return Array.isArray(importFrom) ? importFrom.join(\",\") : importFrom\n}\n\nfunction findPackageDirByName(packageDirs: string[], packageName: string): string | null {\n for (const packageDir of packageDirs) {\n const packageJsonPath = path.join(packageDir, \"package.json\")\n if (!fs.existsSync(packageJsonPath)) {\n continue\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: string }\n if (packageJson.name === packageName) {\n return packageDir\n }\n } catch {\n continue\n }\n }\n\n return null\n}\n\nfunction hasSourceEntry(packageDir: string): boolean {\n return (\n fs.existsSync(path.join(packageDir, \"src\", \"index.ts\")) || fs.existsSync(path.join(packageDir, \"src\", \"index.tsx\"))\n )\n}\n\nfunction createMissingComponentsSourceMessage(importFrom: string | string[]): string {\n return `Package ${stringifyImportFrom(importFrom)} could not be resolved from local source. Component analysis must run against source code, so the components scan was skipped. Run the command from the package source instead.`\n}\n\nfunction createPlannedExecutionTarget(input: {\n executionTarget: ExecutionTarget\n index: number\n rootDir: string\n total: number\n}): PlannedExecutionTarget {\n const { executionTarget, index, rootDir, total } = input\n const analyzeTarget = resolveAnalyzeTarget({\n importFrom: executionTarget.importFrom,\n rootDir: executionTarget.rootDir,\n scannerType: executionTarget.scanType,\n })\n\n return {\n analyzeTarget,\n executionTarget,\n packageLabel: stringifyImportFrom(executionTarget.importFrom),\n pathLabel: formatPathLabel(rootDir, analyzeTarget?.rootDir ?? executionTarget.rootDir),\n targetId: formatSequenceId(\"\", index + 1, total),\n }\n}\n\nfunction summarizeScanTypes(executionTargets: ExecutionTarget[]): string {\n const components = executionTargets.filter(target => target.scanType === \"components\").length\n const usage = executionTargets.filter(target => target.scanType === \"usage\").length\n return `${components} components, ${usage} usage`\n}\n\nfunction padScanType(scanType: UploadScannerType): string {\n return scanType.padEnd(\"components\".length, \" \")\n}\n\nfunction formatSequenceId(prefix: string, index: number, total: number): string {\n const width = String(total).length\n const left = String(index).padStart(width, \"0\")\n const right = String(total).padStart(width, \"0\")\n return `[${prefix}${left}/${right}]`\n}\n\nfunction formatPathLabel(rootDir: string, targetPath: string): string {\n const relativePath = path.relative(rootDir, targetPath) || \".\"\n if (relativePath.length <= 48) {\n return relativePath\n }\n\n const segments = relativePath.split(path.sep)\n return segments.length > 2 ? `.../${segments.slice(-2).join(\"/\")}` : relativePath\n}\n\nfunction formatStatus(status: \"done\" | \"fail\" | \"skip\" | \"start\"): string {\n const labels = {\n done: \"DONE \",\n fail: \"FAIL \",\n skip: \"SKIP \",\n start: \"START\",\n } as const\n\n const colorEnabled = process.stdout.isTTY && !process.env.NO_COLOR\n if (!colorEnabled) {\n return labels[status]\n }\n\n const colors = {\n done: \"\\u001B[32m\",\n fail: \"\\u001B[31m\",\n skip: \"\\u001B[33m\",\n start: \"\\u001B[36m\",\n } as const\n\n return `${colors[status]}${labels[status]}\\u001B[0m`\n}\n"],"names":[],"mappings":"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","debug_id":"b1b0f3f1-2050-5c37-9714-32da972b95c4"}
@@ -3,10 +3,12 @@
3
3
  "analyze": {
4
4
  "aliases": [],
5
5
  "args": {},
6
- "description": "Analyze components and adoption, then push all snapshots to Supernova",
6
+ "description": "# Analyze Code And Push Snapshots\n\nUse `supernova analyze` to run the full code snapshot pipeline, or `supernova analyze <components|adoption>` for a targeted scan.\n\nAnalyze scans your design system source code, its components, and package adoption across your codebase. Supernova turns the captured metadata and adoption signals into product knowledge that enhances prototyping and AI-assisted documentation flows.\n\n## Typical Flows\n\n### 1. Full Pipeline\n\nRun both components and adoption analysis.\n\n```bash\nsupernova analyze --package @design-system-package\n```\n\nIf you already have packages configured in `supernova.config.json`, you can omit `--package`.\n\nFor multiple packages, repeat the flag:\n\n```bash\nsupernova analyze --package @design-system-package --package @icons-package\n```\n\n### 2. Components Only\n\nScan only the component package metadata.\n\n```bash\nsupernova analyze components --package @design-system-package\n```\n\n### 3. Adoption Only\n\nScan only package adoption in consumer code.\n\n```bash\nsupernova analyze adoption --package @design-system-package\n```\n\n## Command Overview\n\n```bash\nsupernova analyze [components|adoption] --package <package-name> [--package <package-name>...]\n```\n\n## Related Commands\n\n```bash\nsupernova analyze status [--designSystemId <id>]\n```\n\n## Arguments\n\n| Name | Required | Description |\n| --- | --- | --- |\n| `[components\\|adoption]` | No | Optional targeted analyzer mode. Omit it to run the full pipeline. |\n\n## Flags\n\n| Flag | Short | Required | Description |\n| --- | --- | --- | --- |\n| `--package <value>` | `-p` | Conditionally | Package name. Repeatable. Required only when `analyze.packages` is not already stored in `supernova.config.json`. |\n| `--designSystemId <id>` | `-d` | No | Design system ID. If omitted, the CLI uses the root `designSystemId` from `supernova.config.json` or prompts before upload. |\n| `--exclude <path>` | | No | Exclude paths from analyzers. Repeatable. |\n| `--dryRun` | | No | Write local snapshots only and skip upload. |\n| `--no-wait` | | No | Upload snapshots and start processing, but do not wait for backend processing to finish. Useful for CI. |\n\n## Config File\n\nThe CLI reads and writes `supernova.config.json` in the current working directory. If the file does not exist yet, running the command creates it when analyze settings are persisted.\n\nExample:\n\n```json\n{\n \"designSystemId\": \"123\",\n \"analyze\": {\n \"repoId\": \"7c8e9b6b-4c0a-4dbd-8f78-2d5c3d6a9f10\",\n \"packages\": [\"@design-system-package\"],\n \"excludedPackages\": [\"excluded-package\"]\n }\n}\n```\n\nThis means later runs can be shorter. For example, if `packages` is already stored, you can run:\n\n```bash\nsupernova analyze\n```\n\nThe analyze section currently stores:\n\n- `designSystemId`\n- `analyze.repoId`\n- `analyze.packages`\n- `analyze.excludedPackages`\n\n## What Gets Created\n\nThe analyzer writes snapshot artifacts under:\n\n```text\n<package>/.supernova/snapshots/<snapshotId>/\n```\n\nMain files:\n\n- `raw/*.json` analyzer outputs\n\n## Monorepo Behavior\n\nFor `supernova analyze` and `supernova analyze adoption`, the CLI resolves multiple package targets in monorepos.\n\nRules:\n\n- components scans run once per `analyze.packages`\n- adoption scans run per workspace package, excluding `packages` and `excludedPackages`\n- adoption scans include all configured packages in each snapshot\n- targets with zero adoption are skipped\n\n## Upload And Processing Behavior\n\n1. CLI uploads snapshot archive(s)\n2. CLI finalizes each snapshot upload\n3. CLI starts a processing run for all uploaded snapshots\n4. CLI waits for processing to finish by default\n\nUse `--no-wait` to skip the final polling step, for example in CI.\n\n### `analyze status`\n\nUse `supernova analyze status` to watch the processing state of uploaded snapshots for the current user.\n\nOptional flag:\n\n- `--designSystemId <id>` or `-d`: skip interactive design system selection. If omitted, the command uses the root `designSystemId` from `supernova.config.json` when available.\n\nThe command keeps polling until there are no active processing runs left, or until it times out.\n\n## Dry Run\n\nUse this to verify scan output without uploading anything:\n\n```bash\nsupernova analyze adoption \\\n --package @design-system-package \\\n --dryRun\n```",
7
7
  "examples": [
8
- "<%= config.bin %> <%= command.id %> --designSystemId 123 --package @acme/ds",
9
- "<%= config.bin %> <%= command.id %> --package @acme/ds --package @acme/icons"
8
+ "<%= config.bin %> <%= command.id %> --package @acme/ds --dryRun",
9
+ "<%= config.bin %> <%= command.id %> --designSystemId 1234 --package @acme/ds",
10
+ "<%= config.bin %> <%= command.id %> --package @acme/ds --package @acme/icons",
11
+ "<%= config.bin %> analyze status --designSystemId 1234"
10
12
  ],
11
13
  "flags": {
12
14
  "designSystemId": {
@@ -46,7 +48,6 @@
46
48
  }
47
49
  },
48
50
  "hasDynamicHelp": false,
49
- "hidden": true,
50
51
  "hiddenAliases": [],
51
52
  "id": "analyze",
52
53
  "pluginAlias": "@supernovaio/cli",
@@ -617,6 +618,13 @@
617
618
  "allowNo": false,
618
619
  "type": "boolean"
619
620
  },
621
+ "tarball": {
622
+ "description": "Use tarball-based private dependency bundling flow (experimental)",
623
+ "name": "tarball",
624
+ "required": false,
625
+ "allowNo": false,
626
+ "type": "boolean"
627
+ },
620
628
  "debug": {
621
629
  "description": "Preserve shell directory and App.tsx on template build failures for debugging",
622
630
  "hidden": true,
@@ -819,5 +827,5 @@
819
827
  ]
820
828
  }
821
829
  },
822
- "version": "2.0.40"
830
+ "version": "2.0.41"
823
831
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@supernovaio/cli",
3
3
  "description": "Supernova.io Command Line Interface",
4
- "version": "2.0.40",
4
+ "version": "2.0.41",
5
5
  "author": "Supernova.io",
6
6
  "bin": {
7
7
  "supernova": "./bin/run"