@supernovaio/cli 2.0.41 → 2.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code-analyzer/analyzers/component-usage.js.map +1 -1
- package/dist/code-analyzer/analyzers/helpers.js.map +1 -1
- package/dist/code-analyzer/analyzers/index.js.map +1 -1
- package/dist/code-analyzer/analyzers/jsdoc.js.map +1 -1
- package/dist/code-analyzer/analyzers/static-components.js.map +1 -1
- package/dist/code-analyzer/analyzers/storybook-docs.js.map +1 -1
- package/dist/code-analyzer/analyzers/storybook-stories.js.map +1 -1
- package/dist/code-analyzer/analyzers/types.js.map +1 -1
- package/dist/code-analyzer/analyzers/typescript-api.js.map +1 -1
- package/dist/code-analyzer/components/analyze.js.map +1 -1
- package/dist/code-analyzer/components/mappers/component.js.map +1 -1
- package/dist/code-analyzer/components/mappers/property.js.map +1 -1
- package/dist/code-analyzer/components/parser/index.js.map +1 -1
- package/dist/code-analyzer/components/parser/module-parser.js.map +1 -1
- package/dist/code-analyzer/components/parser/parser.js.map +1 -1
- package/dist/code-analyzer/components/parser/types.js.map +1 -1
- package/dist/code-analyzer/components/parser/utils/build-filter.js.map +1 -1
- package/dist/code-analyzer/components/parser/utils/filter-duplicates.js.map +1 -1
- package/dist/code-analyzer/components/parser/utils/is-react-component.js.map +1 -1
- package/dist/code-analyzer/components/parser/utils/trim-file-name.js.map +1 -1
- package/dist/code-analyzer/components/types.js.map +1 -1
- package/dist/code-analyzer/components/utils/get-module-exports-path.js.map +1 -1
- package/dist/code-analyzer/index.js.map +1 -1
- package/dist/code-analyzer/orchestrator/index.js.map +1 -1
- package/dist/code-analyzer/orchestrator/run-analysis.js.map +1 -1
- package/dist/code-analyzer/snapshot/index.js.map +1 -1
- package/dist/code-analyzer/snapshot/write-snapshot.js.map +1 -1
- package/dist/commands/analyze/adoption.js.map +1 -1
- package/dist/commands/analyze/components.js.map +1 -1
- package/dist/commands/analyze/status.js.map +1 -1
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/components-import.js.map +1 -1
- package/dist/commands/describe-design-system.js.map +1 -1
- package/dist/commands/describe-workspaces.js.map +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/publish-documentation.js.map +1 -1
- package/dist/commands/run-local-exporter.js.map +1 -1
- package/dist/commands/storybook-import.js.map +1 -1
- package/dist/commands/sync-tokens.js.map +1 -1
- package/dist/commands/template-upload.d.ts +4 -1
- package/dist/commands/template-upload.d.ts.map +1 -1
- package/dist/commands/template-upload.js +83 -48
- package/dist/commands/template-upload.js.map +1 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/hooks/postrun/save-config.js.map +1 -1
- package/dist/hooks/prerun/load-config.js.map +1 -1
- package/dist/hooks/prerun/sentry.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/vault.service.js.map +1 -1
- package/dist/types/base-command.js.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/environment.js.map +1 -1
- package/dist/types/flags.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/login.js.map +1 -1
- package/dist/types/not-authorized.error.js.map +1 -1
- package/dist/types/sentry-command.js.map +1 -1
- package/dist/types/types.js.map +1 -1
- package/dist/utils/analyze-command.js.map +1 -1
- package/dist/utils/analyze-status.js.map +1 -1
- package/dist/utils/api-client.js.map +1 -1
- package/dist/utils/common.js.map +1 -1
- package/dist/utils/config.service.js.map +1 -1
- package/dist/utils/discover.d.ts +1 -1
- package/dist/utils/discover.d.ts.map +1 -1
- package/dist/utils/discover.js +5 -5
- package/dist/utils/discover.js.map +1 -1
- package/dist/utils/figma-tokens-data-loader.js.map +1 -1
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/run-exporter/exporter-utils.js.map +1 -1
- package/dist/utils/sdk.js.map +1 -1
- package/dist/utils/validate-templates.js.map +1 -1
- package/oclif.manifest.json +24 -7
- package/package.json +10 -10
- package/dist/docker-scripts/extract-private-packages.js +0 -74
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.service.js","sources":["../../src/services/vault.service.ts"],"sourceRoot":"","sourcesContent":["import { SentryTraced } from \"@sentry/nestjs\"\nimport { jwtDecode } from \"jwt-decode\"\nimport * as fs from \"node:fs\"\nimport * as os from \"node:os\"\nimport path from \"node:path\"\nimport type _keytar from \"keytar\"\nimport { TargetEnv } from \"../types/environment.js\"\nimport { EnvTokens, EnvTokensSchema, Tokens } from \"../types/login.js\"\nimport { NotAuthorizedError } from \"../types/not-authorized.error.js\"\nimport { AuthService } from \"./auth.service.js\"\n\nlet _keytarCache: typeof _keytar | undefined\n\nasync function importKeytar() {\n if (_keytarCache) return _keytarCache\n _keytarCache = (await import(\"keytar\")).default\n return _keytarCache\n}\n\nexport interface IVault {\n deletePassword: (serviceName: string, account: string) => Promise<void>\n getPassword: (serviceName: string, account: string) => Promise<null | string>\n setPassword: (serviceName: string, account: string, password: string) => Promise<void>\n}\n\nexport class KeytarVault implements IVault {\n async deletePassword(serviceName: string, account: string): Promise<void> {\n const kt = await importKeytar()\n await kt.deletePassword(serviceName, account)\n }\n\n async getPassword(serviceName: string, account: string): Promise<null | string> {\n const kt = await importKeytar()\n return kt.getPassword(serviceName, account)\n }\n\n async setPassword(serviceName: string, account: string, password: string): Promise<void> {\n const kt = await importKeytar()\n await kt.setPassword(serviceName, account, password)\n }\n}\n\nexport class VaultService {\n private readonly serviceName = \"Supernova\"\n\n constructor(\n private readonly authService: AuthService = new AuthService(),\n private readonly vault: IVault = new KeytarVault(),\n ) {}\n\n @SentryTraced()\n public async deleteTokensFromVault(env: TargetEnv) {\n try {\n await this.vault.deletePassword(this.serviceName, `${env}_access_token`)\n await this.vault.deletePassword(this.serviceName, `${env}_refresh_token`)\n } catch {\n this.storeTokensInFile(env, null)\n }\n }\n\n @SentryTraced()\n public async getLoggedInUserSub(env: TargetEnv): Promise<string | undefined> {\n const tokens = await this.tryGetTokensFromVault(env)\n if (!tokens) return undefined\n\n const decoded = jwtDecode<{ sub?: string }>(tokens.accessToken)\n return decoded.sub\n }\n\n @SentryTraced()\n public getTokensFromFile(env: TargetEnv): Tokens | undefined {\n const filePath = this.tokensFilePath()\n\n if (!fs.existsSync(filePath)) {\n return undefined\n }\n\n const fileContent = fs.readFileSync(filePath, \"utf8\")\n const data = JSON.parse(fileContent)\n return data[env] ?? {}\n }\n\n @SentryTraced()\n public async tryGetTokensFromVault(env: TargetEnv): Promise<Tokens | null> {\n if (process.env.SUPERNOVA_TOKEN) {\n return { accessToken: process.env.SUPERNOVA_TOKEN }\n }\n\n let accessToken: string | undefined\n let refreshToken: string | undefined\n try {\n accessToken = (await this.vault.getPassword(this.serviceName, `${env}_access_token`)) ?? undefined\n refreshToken = (await this.vault.getPassword(this.serviceName, `${env}_refresh_token`)) ?? undefined\n } catch {\n const tokens = this.getTokensFromFile(env)\n if (tokens) {\n accessToken = tokens.accessToken\n refreshToken = tokens.refreshToken\n }\n }\n\n if (!accessToken) {\n return null\n }\n\n const freshTokens = refreshToken ? await this.refreshTokens(env, accessToken, refreshToken) : undefined\n if (freshTokens) {\n return freshTokens\n }\n\n return { accessToken, refreshToken }\n }\n\n @SentryTraced()\n public async getTokensFromVault(env: TargetEnv): Promise<Tokens> {\n const tokens = await this.tryGetTokensFromVault(env)\n if (!tokens) throw new NotAuthorizedError()\n return tokens\n }\n\n @SentryTraced()\n public async refreshTokens(env: TargetEnv, accessToken: string, refreshToken: string): Promise<Tokens | undefined> {\n const decoded = jwtDecode<{ exp?: number }>(accessToken)\n const currentTime = Math.floor(Date.now() / 1000)\n if (decoded.exp && decoded.exp < currentTime + 300) {\n const freshTokens = await this.authService.refreshToken(env, refreshToken)\n if (!freshTokens) {\n await this.deleteTokensFromVault(env)\n throw new NotAuthorizedError()\n }\n\n await this.storeTokensToVault(freshTokens, env)\n return freshTokens\n }\n\n return undefined\n }\n\n @SentryTraced()\n public storeTokensInFile(env: TargetEnv, tokens: null | Tokens) {\n const supernovaDir = this.supernovaDir()\n const filePath = path.join(supernovaDir, \"tokens.json\")\n\n if (!fs.existsSync(supernovaDir)) {\n fs.mkdirSync(supernovaDir, { recursive: true })\n }\n\n let data: EnvTokens = {}\n if (fs.existsSync(filePath)) {\n const fileContent = fs.readFileSync(filePath, \"utf8\")\n data = EnvTokensSchema.parse(JSON.parse(fileContent))\n }\n\n if (tokens) data[env] = tokens\n else delete data[env]\n\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), \"utf8\")\n }\n\n @SentryTraced()\n public async storeTokensToVault({ accessToken, refreshToken }: Tokens, env: TargetEnv) {\n try {\n await this.vault.setPassword(this.serviceName, `${env}_access_token`, accessToken)\n if (refreshToken) {\n await this.vault.setPassword(this.serviceName, `${env}_refresh_token`, refreshToken)\n }\n } catch {\n this.storeTokensInFile(env, { accessToken, refreshToken })\n }\n }\n\n public supernovaDir(): string {\n const homeDir = os.homedir()\n return path.join(homeDir, \".supernova\")\n }\n\n public tokensFilePath(): string {\n const homeDir = this.supernovaDir()\n return path.join(homeDir, \"tokens.json\")\n }\n}\n"],"names":[],"mappings":"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","debug_id":"1ae5b45e-6c76-59ae-8787-71b5df4c3714"}
|
|
1
|
+
{"version":3,"file":"vault.service.js","sources":["../../src/services/vault.service.ts"],"sourceRoot":"","sourcesContent":["import { SentryTraced } from \"@sentry/nestjs\"\nimport { jwtDecode } from \"jwt-decode\"\nimport * as fs from \"node:fs\"\nimport * as os from \"node:os\"\nimport path from \"node:path\"\nimport type _keytar from \"keytar\"\nimport { TargetEnv } from \"../types/environment.js\"\nimport { EnvTokens, EnvTokensSchema, Tokens } from \"../types/login.js\"\nimport { NotAuthorizedError } from \"../types/not-authorized.error.js\"\nimport { AuthService } from \"./auth.service.js\"\n\nlet _keytarCache: typeof _keytar | undefined\n\nasync function importKeytar() {\n if (_keytarCache) return _keytarCache\n _keytarCache = (await import(\"keytar\")).default\n return _keytarCache\n}\n\nexport interface IVault {\n deletePassword: (serviceName: string, account: string) => Promise<void>\n getPassword: (serviceName: string, account: string) => Promise<null | string>\n setPassword: (serviceName: string, account: string, password: string) => Promise<void>\n}\n\nexport class KeytarVault implements IVault {\n async deletePassword(serviceName: string, account: string): Promise<void> {\n const kt = await importKeytar()\n await kt.deletePassword(serviceName, account)\n }\n\n async getPassword(serviceName: string, account: string): Promise<null | string> {\n const kt = await importKeytar()\n return kt.getPassword(serviceName, account)\n }\n\n async setPassword(serviceName: string, account: string, password: string): Promise<void> {\n const kt = await importKeytar()\n await kt.setPassword(serviceName, account, password)\n }\n}\n\nexport class VaultService {\n private readonly serviceName = \"Supernova\"\n\n constructor(\n private readonly authService: AuthService = new AuthService(),\n private readonly vault: IVault = new KeytarVault(),\n ) {}\n\n @SentryTraced()\n public async deleteTokensFromVault(env: TargetEnv) {\n try {\n await this.vault.deletePassword(this.serviceName, `${env}_access_token`)\n await this.vault.deletePassword(this.serviceName, `${env}_refresh_token`)\n } catch {\n this.storeTokensInFile(env, null)\n }\n }\n\n @SentryTraced()\n public async getLoggedInUserSub(env: TargetEnv): Promise<string | undefined> {\n const tokens = await this.tryGetTokensFromVault(env)\n if (!tokens) return undefined\n\n const decoded = jwtDecode<{ sub?: string }>(tokens.accessToken)\n return decoded.sub\n }\n\n @SentryTraced()\n public getTokensFromFile(env: TargetEnv): Tokens | undefined {\n const filePath = this.tokensFilePath()\n\n if (!fs.existsSync(filePath)) {\n return undefined\n }\n\n const fileContent = fs.readFileSync(filePath, \"utf8\")\n const data = JSON.parse(fileContent)\n return data[env] ?? {}\n }\n\n @SentryTraced()\n public async tryGetTokensFromVault(env: TargetEnv): Promise<Tokens | null> {\n if (process.env.SUPERNOVA_TOKEN) {\n return { accessToken: process.env.SUPERNOVA_TOKEN }\n }\n\n let accessToken: string | undefined\n let refreshToken: string | undefined\n try {\n accessToken = (await this.vault.getPassword(this.serviceName, `${env}_access_token`)) ?? undefined\n refreshToken = (await this.vault.getPassword(this.serviceName, `${env}_refresh_token`)) ?? undefined\n } catch {\n const tokens = this.getTokensFromFile(env)\n if (tokens) {\n accessToken = tokens.accessToken\n refreshToken = tokens.refreshToken\n }\n }\n\n if (!accessToken) {\n return null\n }\n\n const freshTokens = refreshToken ? await this.refreshTokens(env, accessToken, refreshToken) : undefined\n if (freshTokens) {\n return freshTokens\n }\n\n return { accessToken, refreshToken }\n }\n\n @SentryTraced()\n public async getTokensFromVault(env: TargetEnv): Promise<Tokens> {\n const tokens = await this.tryGetTokensFromVault(env)\n if (!tokens) throw new NotAuthorizedError()\n return tokens\n }\n\n @SentryTraced()\n public async refreshTokens(env: TargetEnv, accessToken: string, refreshToken: string): Promise<Tokens | undefined> {\n const decoded = jwtDecode<{ exp?: number }>(accessToken)\n const currentTime = Math.floor(Date.now() / 1000)\n if (decoded.exp && decoded.exp < currentTime + 300) {\n const freshTokens = await this.authService.refreshToken(env, refreshToken)\n if (!freshTokens) {\n await this.deleteTokensFromVault(env)\n throw new NotAuthorizedError()\n }\n\n await this.storeTokensToVault(freshTokens, env)\n return freshTokens\n }\n\n return undefined\n }\n\n @SentryTraced()\n public storeTokensInFile(env: TargetEnv, tokens: null | Tokens) {\n const supernovaDir = this.supernovaDir()\n const filePath = path.join(supernovaDir, \"tokens.json\")\n\n if (!fs.existsSync(supernovaDir)) {\n fs.mkdirSync(supernovaDir, { recursive: true })\n }\n\n let data: EnvTokens = {}\n if (fs.existsSync(filePath)) {\n const fileContent = fs.readFileSync(filePath, \"utf8\")\n data = EnvTokensSchema.parse(JSON.parse(fileContent))\n }\n\n if (tokens) data[env] = tokens\n else delete data[env]\n\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), \"utf8\")\n }\n\n @SentryTraced()\n public async storeTokensToVault({ accessToken, refreshToken }: Tokens, env: TargetEnv) {\n try {\n await this.vault.setPassword(this.serviceName, `${env}_access_token`, accessToken)\n if (refreshToken) {\n await this.vault.setPassword(this.serviceName, `${env}_refresh_token`, refreshToken)\n }\n } catch {\n this.storeTokensInFile(env, { accessToken, refreshToken })\n }\n }\n\n public supernovaDir(): string {\n const homeDir = os.homedir()\n return path.join(homeDir, \".supernova\")\n }\n\n public tokensFilePath(): string {\n const homeDir = this.supernovaDir()\n return path.join(homeDir, \"tokens.json\")\n }\n}\n"],"names":[],"mappings":"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","debugId":"1ae5b45e-6c76-59ae-8787-71b5df4c3714"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-command.js","sources":["../../src/types/base-command.ts"],"sourceRoot":"","sourcesContent":["import { Command } from \"@oclif/core\"\nimport * as Sentry from \"@sentry/node\"\nimport { DTODesignSystem, SupernovaApiClient } from \"@supernova-studio/client\"\nimport inquirer from \"inquirer\"\nimport { z } from \"zod\"\n\nimport { getApiClient } from \"../utils/api-client.js\"\nimport { SupernovaConfigService } from \"../utils/config.service.js\"\nimport { getTargetEnv, TargetEnv } from \"./environment.js\"\n\nconst hasAccess = (role?: DTODesignSystem[\"role\"]) =>\n role && [\"Admin\", \"Contributor\", \"Creator\", \"Owner\"].includes(role)\n\nexport abstract class BaseCommand<T extends object> extends Command {\n protected env: TargetEnv = getTargetEnv()\n protected configService = SupernovaConfigService.getInstance()\n private _apiClient: SupernovaApiClient | undefined\n\n abstract get commandId(): string\n abstract get configSchema(): z.ZodType<T>\n\n protected async apiClient() {\n if (this._apiClient) return this._apiClient\n\n const apiClient = await getApiClient(this.env)\n\n const { user: me } = await apiClient.users.getMe()\n Sentry.setUser({ id: me.id })\n\n return apiClient\n }\n\n protected async init() {\n await super.init()\n\n if (this.env !== \"production\") {\n this.log(`Using ${this.env} environment`)\n }\n }\n\n protected async promptBrandId(designSystemId: string, versionId?: string): Promise<string> {\n const client = await this.apiClient()\n const brandsEndpoint = client.designSystems.versions.brands\n\n const { brands } = await brandsEndpoint.list(designSystemId, versionId ?? \"head\")\n\n const options = brands.map(b => ({ name: b.meta.name, value: b.persistentId }))\n if (options.length === 1) return options[0].value\n\n return this.prompt(\"Select a brand:\", options)\n }\n\n protected async promptDesignSystemId(): Promise<string> {\n const { designSystems: client } = await this.apiClient()\n const { designSystems, workspaces } = await client.listUserDesignSystems()\n const workspaceById = new Map(workspaces.map(ws => [ws.id, ws]))\n const dsNameCount = designSystems.reduce((acc, { meta: { name }, role }) => {\n if (hasAccess(role)) acc.set(name, (acc.get(name) ?? 0) + 1)\n\n return acc\n }, new Map<string, number>())\n\n if (designSystems.length === 0) {\n this.error(\"You don't have any design system.\")\n }\n\n const dsIds = designSystems\n .sort(({ meta: { name: a } }, { meta: { name: b } }) => a.localeCompare(b))\n .map(({ id, meta: { name }, role, workspaceId }) => ({\n id,\n name: (dsNameCount.get(name) ?? 0) > 1 ? `${name} (${workspaceById.get(workspaceId)?.profile?.name})` : name,\n role,\n }))\n .filter(({ role }) => hasAccess(role))\n\n if (dsIds.length === 0) {\n this.error(\"You don't have access to any design system.\")\n }\n\n if (dsIds.length === 1) {\n return dsIds[0].id\n }\n\n return this.prompt(\n \"Select a design system:\",\n dsIds.map(({ id, name }) => ({\n name,\n value: id,\n })),\n )\n }\n\n protected async getVersionId(designSystemId: string, versionId?: string): Promise<string> {\n if (versionId) return versionId\n const { versions } = (await this.apiClient()).designSystems\n const verIds = (await versions.list(designSystemId)).designSystemVersions.map(({ id, meta: { name } }) => ({\n id,\n name,\n }))\n\n if (verIds.length === 1) {\n return verIds[0].id\n }\n\n return this.prompt(\n \"Select a version:\",\n verIds.map(wrk => ({\n name: wrk.name,\n value: wrk.id,\n })),\n )\n }\n\n protected async getWorkspaceId(workspaceId?: string): Promise<string> {\n if (workspaceId) return workspaceId\n const { workspaces } = await this.apiClient()\n const wrks = (await workspaces.list()).membership.map(\n ({\n workspace: {\n id,\n profile: { name },\n },\n }) => ({ id, name }),\n )\n\n if (wrks.length === 1) {\n return wrks[0].id\n }\n\n return this.prompt(\n \"Select a workspace:\",\n wrks.map(wrk => ({\n name: wrk.name,\n value: wrk.id,\n })),\n )\n }\n\n private async prompt(message: string, choices: { name: string; value: string }[]) {\n const choice = await inquirer.prompt([\n {\n choices: [...choices, { name: \"Exit\", value: \"exit\" }],\n message,\n name: \"selected\",\n type: \"list\",\n },\n ])\n\n return choice.selected as string\n }\n}\n"],"names":[],"mappings":"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","
|
|
1
|
+
{"version":3,"file":"base-command.js","sources":["../../src/types/base-command.ts"],"sourceRoot":"","sourcesContent":["import { Command } from \"@oclif/core\"\nimport * as Sentry from \"@sentry/node\"\nimport { DTODesignSystem, SupernovaApiClient } from \"@supernova-studio/client\"\nimport inquirer from \"inquirer\"\nimport { z } from \"zod\"\n\nimport { getApiClient } from \"../utils/api-client.js\"\nimport { SupernovaConfigService } from \"../utils/config.service.js\"\nimport { getTargetEnv, TargetEnv } from \"./environment.js\"\n\nconst hasAccess = (role?: DTODesignSystem[\"role\"]) =>\n role && [\"Admin\", \"Contributor\", \"Creator\", \"Owner\"].includes(role)\n\nexport abstract class BaseCommand<T extends object> extends Command {\n protected env: TargetEnv = getTargetEnv()\n protected configService = SupernovaConfigService.getInstance()\n private _apiClient: SupernovaApiClient | undefined\n\n abstract get commandId(): string\n abstract get configSchema(): z.ZodType<T>\n\n protected async apiClient() {\n if (this._apiClient) return this._apiClient\n\n const apiClient = await getApiClient(this.env)\n\n const { user: me } = await apiClient.users.getMe()\n Sentry.setUser({ id: me.id })\n\n return apiClient\n }\n\n protected async init() {\n await super.init()\n\n if (this.env !== \"production\") {\n this.log(`Using ${this.env} environment`)\n }\n }\n\n protected async promptBrandId(designSystemId: string, versionId?: string): Promise<string> {\n const client = await this.apiClient()\n const brandsEndpoint = client.designSystems.versions.brands\n\n const { brands } = await brandsEndpoint.list(designSystemId, versionId ?? \"head\")\n\n const options = brands.map(b => ({ name: b.meta.name, value: b.persistentId }))\n if (options.length === 1) return options[0].value\n\n return this.prompt(\"Select a brand:\", options)\n }\n\n protected async promptDesignSystemId(): Promise<string> {\n const { designSystems: client } = await this.apiClient()\n const { designSystems, workspaces } = await client.listUserDesignSystems()\n const workspaceById = new Map(workspaces.map(ws => [ws.id, ws]))\n const dsNameCount = designSystems.reduce((acc, { meta: { name }, role }) => {\n if (hasAccess(role)) acc.set(name, (acc.get(name) ?? 0) + 1)\n\n return acc\n }, new Map<string, number>())\n\n if (designSystems.length === 0) {\n this.error(\"You don't have any design system.\")\n }\n\n const dsIds = designSystems\n .sort(({ meta: { name: a } }, { meta: { name: b } }) => a.localeCompare(b))\n .map(({ id, meta: { name }, role, workspaceId }) => ({\n id,\n name: (dsNameCount.get(name) ?? 0) > 1 ? `${name} (${workspaceById.get(workspaceId)?.profile?.name})` : name,\n role,\n }))\n .filter(({ role }) => hasAccess(role))\n\n if (dsIds.length === 0) {\n this.error(\"You don't have access to any design system.\")\n }\n\n if (dsIds.length === 1) {\n return dsIds[0].id\n }\n\n return this.prompt(\n \"Select a design system:\",\n dsIds.map(({ id, name }) => ({\n name,\n value: id,\n })),\n )\n }\n\n protected async getVersionId(designSystemId: string, versionId?: string): Promise<string> {\n if (versionId) return versionId\n const { versions } = (await this.apiClient()).designSystems\n const verIds = (await versions.list(designSystemId)).designSystemVersions.map(({ id, meta: { name } }) => ({\n id,\n name,\n }))\n\n if (verIds.length === 1) {\n return verIds[0].id\n }\n\n return this.prompt(\n \"Select a version:\",\n verIds.map(wrk => ({\n name: wrk.name,\n value: wrk.id,\n })),\n )\n }\n\n protected async getWorkspaceId(workspaceId?: string): Promise<string> {\n if (workspaceId) return workspaceId\n const { workspaces } = await this.apiClient()\n const wrks = (await workspaces.list()).membership.map(\n ({\n workspace: {\n id,\n profile: { name },\n },\n }) => ({ id, name }),\n )\n\n if (wrks.length === 1) {\n return wrks[0].id\n }\n\n return this.prompt(\n \"Select a workspace:\",\n wrks.map(wrk => ({\n name: wrk.name,\n value: wrk.id,\n })),\n )\n }\n\n private async prompt(message: string, choices: { name: string; value: string }[]) {\n const choice = await inquirer.prompt([\n {\n choices: [...choices, { name: \"Exit\", value: \"exit\" }],\n message,\n name: \"selected\",\n type: \"list\",\n },\n ])\n\n return choice.selected as string\n }\n}\n"],"names":[],"mappings":"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","debugId":"3c88dddb-c4e4-5734-93dd-f6bf5c033b83"}
|
package/dist/types/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../src/types/config.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nconst safeString = z.string().optional().catch(undefined)\nconst safeBoolean = z.boolean().optional().catch(undefined)\n\nexport const SupernovaConfigStorybook = z.object({\n designSystemId: safeString,\n sourceId: safeString,\n brandId: safeString,\n name: safeString,\n from: safeString,\n publicAccess: safeBoolean,\n})\n\nexport const SupernovaConfigAnalyze = z.object({\n repoId: safeString,\n packages: z.array(z.string()).optional().catch(undefined),\n excludedPackages: z.array(z.string()).optional().catch(undefined),\n})\n\nexport const SupernovaConfig = z\n .object({\n designSystemId: safeString,\n analyze: SupernovaConfigAnalyze.optional().catch(undefined),\n storybook: SupernovaConfigStorybook.optional().catch(undefined),\n })\n .catch({})\n\nexport type SupernovaConfigAnalyze = z.infer<typeof SupernovaConfigAnalyze>\nexport type SupernovaConfigStorybook = z.infer<typeof SupernovaConfigStorybook>\nexport type SupernovaConfig = z.infer<typeof SupernovaConfig>\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AACzD,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,WAAW;CAC1B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,UAAU;IAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACzD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAClE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3D,SAAS,EAAE,wBAAwB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAChE,CAAC;KACD,KAAK,CAAC,EAAE,CAAC,CAAA","
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../src/types/config.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nconst safeString = z.string().optional().catch(undefined)\nconst safeBoolean = z.boolean().optional().catch(undefined)\n\nexport const SupernovaConfigStorybook = z.object({\n designSystemId: safeString,\n sourceId: safeString,\n brandId: safeString,\n name: safeString,\n from: safeString,\n publicAccess: safeBoolean,\n})\n\nexport const SupernovaConfigAnalyze = z.object({\n repoId: safeString,\n packages: z.array(z.string()).optional().catch(undefined),\n excludedPackages: z.array(z.string()).optional().catch(undefined),\n})\n\nexport const SupernovaConfig = z\n .object({\n designSystemId: safeString,\n analyze: SupernovaConfigAnalyze.optional().catch(undefined),\n storybook: SupernovaConfigStorybook.optional().catch(undefined),\n })\n .catch({})\n\nexport type SupernovaConfigAnalyze = z.infer<typeof SupernovaConfigAnalyze>\nexport type SupernovaConfigStorybook = z.infer<typeof SupernovaConfigStorybook>\nexport type SupernovaConfig = z.infer<typeof SupernovaConfig>\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AACzD,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,cAAc,EAAE,UAAU;IAC1B,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,YAAY,EAAE,WAAW;CAC1B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,UAAU;IAClB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IACzD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAClE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;IAC3D,SAAS,EAAE,wBAAwB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CAChE,CAAC;KACD,KAAK,CAAC,EAAE,CAAC,CAAA","debugId":"9b045bdf-c47c-5f62-b737-feb24a9c85bf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sources":["../../src/types/environment.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nconst allTargetEnvs = [\"demo\", \"development\", \"local\", \"production\", \"staging\"] as const\n\nexport const TargetEnv = z.enum(allTargetEnvs)\nexport type TargetEnv = z.infer<typeof TargetEnv>\n\nconst DevTargetEnvAlias = z.enum([\"dev\", \"develop\"])\nconst StagingTargetEnvAlias = z.enum([\"stg\"])\n\nconst defaultTargetEnv: TargetEnv = \"production\"\n\nexport function getTargetEnv(): TargetEnv {\n if (process.env.SUPERNOVA_ENV) {\n const raw = process.env.SUPERNOVA_ENV.toLowerCase()\n\n const baseParseResult = TargetEnv.safeParse(raw)\n if (baseParseResult.success) return baseParseResult.data\n\n const devAliasParseResult = DevTargetEnvAlias.safeParse(raw)\n if (devAliasParseResult.success) return \"development\"\n\n const stgAliasParseResult = StagingTargetEnvAlias.safeParse(raw)\n if (stgAliasParseResult.success) return \"staging\"\n\n console.warn(`Incorrect value of SUPERNOVA_ENV variable, allowed options are: [${allTargetEnvs.join(\",\")}] `)\n console.warn(`Using defaut env instead (${defaultTargetEnv})`)\n }\n\n return defaultTargetEnv\n}\n\nconst authServerUrlMap: Record<TargetEnv, string> = {\n demo: \"https://auth-2.demo.supernova.io/api/plugin-oauth\",\n development: \"https://auth-2.dev.supernova.io/api/plugin-oauth\",\n local: `https://auth-2.dev.supernova.io/api/plugin-oauth`,\n production: \"https://auth-2.supernova.io/api/plugin-oauth\",\n staging: \"https://auth-2.staging.supernova.io/api/plugin-oauth\",\n}\n\nexport function authUrlForEnvironment(env: TargetEnv): string {\n return authServerUrlMap[env]\n}\n\nexport function storybookUrlForEnvironment(env: TargetEnv): string {\n switch (env) {\n case \"demo\":\n return \"https://storybook.demo.sst.supernova.io\"\n case \"development\":\n return \"https://storybook.dev.supernova.io\"\n case \"local\":\n return `https://storybook.${getLocalStageName()}.sst.supernova.io`\n case \"production\":\n return \"https://storybook.supernova.io\"\n case \"staging\":\n return \"https://storybook.staging.supernova.io\"\n }\n}\n\nexport function apiHostForEnvironment(env: TargetEnv): string {\n switch (env) {\n case \"demo\":\n return \"api.demo.supernova.io\"\n case \"development\":\n return \"api.dev.supernova.io\"\n case \"local\":\n return `api-5.${getLocalStageName()}.sst.supernova.io`\n case \"production\":\n return \"api.supernova.io\"\n case \"staging\":\n return \"api.staging.supernova.io\"\n }\n}\n\nexport function apiUrlForEnvironment(env: TargetEnv, version = \"/v2\") {\n return `https://${apiHostForEnvironment(env)}/api${version ?? \"\"}`\n}\n\nfunction getLocalStageName() {\n const parseResult = z.string().safeParse(process.env.SUPERNOVA_STAGE_NAME)\n if (!parseResult.success) {\n throw new Error(`To use local environment, SUPERNOVA_STAGE_NAME variable must be set`)\n }\n\n return parseResult.data\n}\n"],"names":[],"mappings":"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","
|
|
1
|
+
{"version":3,"file":"environment.js","sources":["../../src/types/environment.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nconst allTargetEnvs = [\"demo\", \"development\", \"local\", \"production\", \"staging\"] as const\n\nexport const TargetEnv = z.enum(allTargetEnvs)\nexport type TargetEnv = z.infer<typeof TargetEnv>\n\nconst DevTargetEnvAlias = z.enum([\"dev\", \"develop\"])\nconst StagingTargetEnvAlias = z.enum([\"stg\"])\n\nconst defaultTargetEnv: TargetEnv = \"production\"\n\nexport function getTargetEnv(): TargetEnv {\n if (process.env.SUPERNOVA_ENV) {\n const raw = process.env.SUPERNOVA_ENV.toLowerCase()\n\n const baseParseResult = TargetEnv.safeParse(raw)\n if (baseParseResult.success) return baseParseResult.data\n\n const devAliasParseResult = DevTargetEnvAlias.safeParse(raw)\n if (devAliasParseResult.success) return \"development\"\n\n const stgAliasParseResult = StagingTargetEnvAlias.safeParse(raw)\n if (stgAliasParseResult.success) return \"staging\"\n\n console.warn(`Incorrect value of SUPERNOVA_ENV variable, allowed options are: [${allTargetEnvs.join(\",\")}] `)\n console.warn(`Using defaut env instead (${defaultTargetEnv})`)\n }\n\n return defaultTargetEnv\n}\n\nconst authServerUrlMap: Record<TargetEnv, string> = {\n demo: \"https://auth-2.demo.supernova.io/api/plugin-oauth\",\n development: \"https://auth-2.dev.supernova.io/api/plugin-oauth\",\n local: `https://auth-2.dev.supernova.io/api/plugin-oauth`,\n production: \"https://auth-2.supernova.io/api/plugin-oauth\",\n staging: \"https://auth-2.staging.supernova.io/api/plugin-oauth\",\n}\n\nexport function authUrlForEnvironment(env: TargetEnv): string {\n return authServerUrlMap[env]\n}\n\nexport function storybookUrlForEnvironment(env: TargetEnv): string {\n switch (env) {\n case \"demo\":\n return \"https://storybook.demo.sst.supernova.io\"\n case \"development\":\n return \"https://storybook.dev.supernova.io\"\n case \"local\":\n return `https://storybook.${getLocalStageName()}.sst.supernova.io`\n case \"production\":\n return \"https://storybook.supernova.io\"\n case \"staging\":\n return \"https://storybook.staging.supernova.io\"\n }\n}\n\nexport function apiHostForEnvironment(env: TargetEnv): string {\n switch (env) {\n case \"demo\":\n return \"api.demo.supernova.io\"\n case \"development\":\n return \"api.dev.supernova.io\"\n case \"local\":\n return `api-5.${getLocalStageName()}.sst.supernova.io`\n case \"production\":\n return \"api.supernova.io\"\n case \"staging\":\n return \"api.staging.supernova.io\"\n }\n}\n\nexport function apiUrlForEnvironment(env: TargetEnv, version = \"/v2\") {\n return `https://${apiHostForEnvironment(env)}/api${version ?? \"\"}`\n}\n\nfunction getLocalStageName() {\n const parseResult = z.string().safeParse(process.env.SUPERNOVA_STAGE_NAME)\n if (!parseResult.success) {\n throw new Error(`To use local environment, SUPERNOVA_STAGE_NAME variable must be set`)\n }\n\n return parseResult.data\n}\n"],"names":[],"mappings":"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","debugId":"4389fbbf-c288-522d-b176-14db9080a77d"}
|
package/dist/types/flags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sources":["../../src/types/flags.ts"],"sourceRoot":"","sourcesContent":["export const commonFlags = {\n // environment: Flags.string({\n // char: \"e\",\n // default: defaultTargetEnv,\n // description: \"Target environment (demo, development, local, production, staging)\",\n // options: targetEnvs,\n // }),\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,EAO1B,CAAA","
|
|
1
|
+
{"version":3,"file":"flags.js","sources":["../../src/types/flags.ts"],"sourceRoot":"","sourcesContent":["export const commonFlags = {\n // environment: Flags.string({\n // char: \"e\",\n // default: defaultTargetEnv,\n // description: \"Target environment (demo, development, local, production, staging)\",\n // options: targetEnvs,\n // }),\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,EAO1B,CAAA","debugId":"b0a73fd5-1d34-51dd-a176-2a438149bb89"}
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourceRoot":"","sourcesContent":["export * from \"./base-command.js\"\nexport * from \"./environment.js\"\nexport * from \"./flags.js\"\nexport * from \"./login.js\"\nexport * from \"./not-authorized.error.js\"\nexport * from \"./sentry-command.js\"\nexport * from \"./types.js\"\n"],"names":[],"mappings":";;AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/types/index.ts"],"sourceRoot":"","sourcesContent":["export * from \"./base-command.js\"\nexport * from \"./environment.js\"\nexport * from \"./flags.js\"\nexport * from \"./login.js\"\nexport * from \"./not-authorized.error.js\"\nexport * from \"./sentry-command.js\"\nexport * from \"./types.js\"\n"],"names":[],"mappings":";;AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,YAAY,CAAA","debugId":"173becec-07fa-539f-8201-3b533f3a99e4"}
|
package/dist/types/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sources":["../../src/types/login.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nimport { TargetEnv } from \"./environment.js\"\n\nexport const TokensSchema = z.object({\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n})\n\nconst PendingStatusTokensSchema = z.object({\n status: z.literal(\"Pending\"),\n tokens: z.never().optional(),\n})\n\nconst SuccessStatusTokensSchema = z.object({\n status: z.literal(\"Success\"),\n tokens: TokensSchema,\n})\n\nexport const StatusTokensSchema = z.discriminatedUnion(\"status\", [PendingStatusTokensSchema, SuccessStatusTokensSchema])\n\nexport const TokensResponseSchema = z.object({\n result: StatusTokensSchema,\n})\n\nexport const RefreshTokenResponseSchema = z.object({\n result: z.object({\n tokens: TokensSchema,\n }),\n})\n\nexport const AuthResponseSchema = z.object({\n result: z.object({\n authorizeUrl: z.string(),\n readKey: z.string(),\n }),\n})\n\nexport const EnvTokensSchema = z.record(TargetEnv, TokensSchema.optional())\n\nexport type AuthResponse = z.infer<typeof AuthResponseSchema>\nexport type Tokens = z.infer<typeof TokensSchema>\nexport type TokensResponse = z.infer<typeof TokensResponseSchema>\nexport type RefreshTokenResponse = z.infer<typeof RefreshTokenResponseSchema>\nexport type EnvTokens = z.infer<typeof EnvTokensSchema>\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,YAAY;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAA;AAExH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,kBAAkB;CAC3B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,YAAY;KACrB,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA","
|
|
1
|
+
{"version":3,"file":"login.js","sources":["../../src/types/login.ts"],"sourceRoot":"","sourcesContent":["import { z } from \"zod\"\n\nimport { TargetEnv } from \"./environment.js\"\n\nexport const TokensSchema = z.object({\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n})\n\nconst PendingStatusTokensSchema = z.object({\n status: z.literal(\"Pending\"),\n tokens: z.never().optional(),\n})\n\nconst SuccessStatusTokensSchema = z.object({\n status: z.literal(\"Success\"),\n tokens: TokensSchema,\n})\n\nexport const StatusTokensSchema = z.discriminatedUnion(\"status\", [PendingStatusTokensSchema, SuccessStatusTokensSchema])\n\nexport const TokensResponseSchema = z.object({\n result: StatusTokensSchema,\n})\n\nexport const RefreshTokenResponseSchema = z.object({\n result: z.object({\n tokens: TokensSchema,\n }),\n})\n\nexport const AuthResponseSchema = z.object({\n result: z.object({\n authorizeUrl: z.string(),\n readKey: z.string(),\n }),\n})\n\nexport const EnvTokensSchema = z.record(TargetEnv, TokensSchema.optional())\n\nexport type AuthResponse = z.infer<typeof AuthResponseSchema>\nexport type Tokens = z.infer<typeof TokensSchema>\nexport type TokensResponse = z.infer<typeof TokensResponseSchema>\nexport type RefreshTokenResponse = z.infer<typeof RefreshTokenResponseSchema>\nexport type EnvTokens = z.infer<typeof EnvTokensSchema>\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,YAAY;CACrB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC,CAAA;AAExH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,kBAAkB;CAC3B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,YAAY;KACrB,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAA","debugId":"d59bf6dd-21c7-5c1d-a78b-e5afed2781e3"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"not-authorized.error.js","sources":["../../src/types/not-authorized.error.ts"],"sourceRoot":"","sourcesContent":["export class NotAuthorizedError extends Error {\n public readonly code: string\n\n constructor(message: string = \"Not authorized. Login first, please.\", code: string = \"NOT_AUTHORIZED\") {\n super(message)\n this.name = \"NotAuthorizedError\"\n this.code = code\n\n Object.setPrototypeOf(this, new.target.prototype)\n }\n\n public getFormattedMessage(): string {\n return `[${this.code}] ${this.message}`\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3B,IAAI,CAAQ;IAE5B,YAAY,UAAkB,sCAAsC,EAAE,OAAe,gBAAgB;QACnG,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAEhB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAA;IACzC,CAAC;CACF","
|
|
1
|
+
{"version":3,"file":"not-authorized.error.js","sources":["../../src/types/not-authorized.error.ts"],"sourceRoot":"","sourcesContent":["export class NotAuthorizedError extends Error {\n public readonly code: string\n\n constructor(message: string = \"Not authorized. Login first, please.\", code: string = \"NOT_AUTHORIZED\") {\n super(message)\n this.name = \"NotAuthorizedError\"\n this.code = code\n\n Object.setPrototypeOf(this, new.target.prototype)\n }\n\n public getFormattedMessage(): string {\n return `[${this.code}] ${this.message}`\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3B,IAAI,CAAQ;IAE5B,YAAY,UAAkB,sCAAsC,EAAE,OAAe,gBAAgB;QACnG,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAEhB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAA;IACzC,CAAC;CACF","debugId":"c359bb46-9233-5028-9291-8c705c29f580"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry-command.js","sources":["../../src/types/sentry-command.ts"],"sourceRoot":"","sourcesContent":["import { Config } from \"@oclif/core/config\"\nimport { CommandError, Input, ParserOutput } from \"@oclif/core/interfaces\"\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-expect-error\nimport { ArgOutput, FlagOutput } from \"@oclif/core/lib/interfaces/parser.js\"\nimport * as Sentry from \"@sentry/node\"\nimport { isAxiosError } from \"axios\"\n\nimport { BaseCommand } from \"./base-command.js\"\nimport { NotAuthorizedError } from \"./not-authorized.error.js\"\nimport { CLIError } from \"@oclif/core/errors\"\nimport { RequestExecutorError } from \"@supernova-studio/client\"\n\nexport abstract class SentryCommand<T extends object> extends BaseCommand<T> {\n protected constructor(argv: string[], config: Config) {\n super(argv, config)\n }\n\n async catch(error: CommandError & { oclif?: { exit: number } }) {\n if (!(error instanceof CLIError)) {\n let { message } = error\n if (error instanceof RequestExecutorError) {\n message = error.errorCode ? `${error.errorCode}: ${error.getDisplayMessage()}` : error.getDisplayMessage()\n }\n\n // Invocations of `this.error(...)` from command classes will already be logged, no need to repeat\n this.logToStderr(message)\n }\n\n if (error.oclif) throw error\n if (error instanceof NotAuthorizedError) throw error\n\n if (isAxiosError(error)) {\n const captureMetadata = {\n code: error.code,\n message: error.message,\n response: {\n status: error.response?.status,\n data: error.response?.data,\n },\n }\n\n Sentry.captureMessage(`Axios error metadata: ${JSON.stringify(captureMetadata)}`)\n }\n\n Sentry.captureException(error)\n this.logToStderr(`Something went wrong. Please try again later.`)\n }\n\n async finally() {}\n\n public async parse<F extends FlagOutput, B extends FlagOutput, A extends ArgOutput>(\n options?: Input<F, B, A>,\n argv?: string[],\n ): Promise<ParserOutput<F, B, A>> {\n Sentry.addBreadcrumb({\n category: \"command\",\n data: {\n commandName: this.id,\n },\n level: \"debug\",\n message: \"Starting command parse\",\n })\n\n const parsed = await super.parse(options, argv)\n const span = Sentry.getActiveSpan()\n if (span) {\n span.setAttributes({\n args: Object.keys(parsed.args),\n designSystemId: parsed.flags.designSystemId,\n flags: Object.keys(parsed.flags),\n workspaceId: parsed.flags.workspaceId,\n })\n }\n\n Sentry.addBreadcrumb({\n category: \"command\",\n data: {\n result: \"success\",\n },\n level: \"debug\",\n message: \"Command parse completed\",\n })\n\n return parsed\n }\n}\n"],"names":[],"mappings":";;AAKA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAE/D,MAAM,OAAgB,aAAgC,SAAQ,WAAc;IAC1E,YAAsB,IAAc,EAAE,MAAc;QAClD,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkD;QAC5D,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;YACjC,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;YACvB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAA;YAC5G,CAAC;YAGD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC3B,CAAC;QAED,IAAI,KAAK,CAAC,KAAK;YAAE,MAAM,KAAK,CAAA;QAC5B,IAAI,KAAK,YAAY,kBAAkB;YAAE,MAAM,KAAK,CAAA;QAEpD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE;oBACR,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;oBAC9B,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI;iBAC3B;aACF,CAAA;YAED,MAAM,CAAC,cAAc,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QACnF,CAAC;QAED,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,CAAC,+CAA+C,CAAC,CAAA;IACnE,CAAC;IAED,KAAK,CAAC,OAAO,KAAI,CAAC;IAEX,KAAK,CAAC,KAAK,CAChB,OAAwB,EACxB,IAAe;QAEf,MAAM,CAAC,aAAa,CAAC;YACnB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,EAAE;aACrB;YACD,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,EAAE,CAAA;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,aAAa,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC9B,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc;gBAC3C,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAChC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;aACtC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,CAAC,aAAa,CAAC;YACnB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE;gBACJ,MAAM,EAAE,SAAS;aAClB;YACD,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,yBAAyB;SACnC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;CACF","
|
|
1
|
+
{"version":3,"file":"sentry-command.js","sources":["../../src/types/sentry-command.ts"],"sourceRoot":"","sourcesContent":["import { Config } from \"@oclif/core/config\"\nimport { CommandError, Input, ParserOutput } from \"@oclif/core/interfaces\"\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-expect-error\nimport { ArgOutput, FlagOutput } from \"@oclif/core/lib/interfaces/parser.js\"\nimport * as Sentry from \"@sentry/node\"\nimport { isAxiosError } from \"axios\"\n\nimport { BaseCommand } from \"./base-command.js\"\nimport { NotAuthorizedError } from \"./not-authorized.error.js\"\nimport { CLIError } from \"@oclif/core/errors\"\nimport { RequestExecutorError } from \"@supernova-studio/client\"\n\nexport abstract class SentryCommand<T extends object> extends BaseCommand<T> {\n protected constructor(argv: string[], config: Config) {\n super(argv, config)\n }\n\n async catch(error: CommandError & { oclif?: { exit: number } }) {\n if (!(error instanceof CLIError)) {\n let { message } = error\n if (error instanceof RequestExecutorError) {\n message = error.errorCode ? `${error.errorCode}: ${error.getDisplayMessage()}` : error.getDisplayMessage()\n }\n\n // Invocations of `this.error(...)` from command classes will already be logged, no need to repeat\n this.logToStderr(message)\n }\n\n if (error.oclif) throw error\n if (error instanceof NotAuthorizedError) throw error\n\n if (isAxiosError(error)) {\n const captureMetadata = {\n code: error.code,\n message: error.message,\n response: {\n status: error.response?.status,\n data: error.response?.data,\n },\n }\n\n Sentry.captureMessage(`Axios error metadata: ${JSON.stringify(captureMetadata)}`)\n }\n\n Sentry.captureException(error)\n this.logToStderr(`Something went wrong. Please try again later.`)\n }\n\n async finally() {}\n\n public async parse<F extends FlagOutput, B extends FlagOutput, A extends ArgOutput>(\n options?: Input<F, B, A>,\n argv?: string[],\n ): Promise<ParserOutput<F, B, A>> {\n Sentry.addBreadcrumb({\n category: \"command\",\n data: {\n commandName: this.id,\n },\n level: \"debug\",\n message: \"Starting command parse\",\n })\n\n const parsed = await super.parse(options, argv)\n const span = Sentry.getActiveSpan()\n if (span) {\n span.setAttributes({\n args: Object.keys(parsed.args),\n designSystemId: parsed.flags.designSystemId,\n flags: Object.keys(parsed.flags),\n workspaceId: parsed.flags.workspaceId,\n })\n }\n\n Sentry.addBreadcrumb({\n category: \"command\",\n data: {\n result: \"success\",\n },\n level: \"debug\",\n message: \"Command parse completed\",\n })\n\n return parsed\n }\n}\n"],"names":[],"mappings":"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","debugId":"1c987440-1376-543e-9e9e-ec6ae376bf8f"}
|
package/dist/types/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../src/types/types.ts"],"sourceRoot":"","sourcesContent":["//\n// types.ts\n// Supernova CLI\n//\n// Created by Jiri Trecak.\n// Copyright © Supernova.io. All rights reserved.\n//\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Imports\n\n \nimport * as pulsar from \"@supernova-studio/pulsar-language\"\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Types\n\nexport interface ExportConfiguration {\n accessToken: string\n apiUrl: string\n apiVersion?: string\n brandId?: string\n debugMode?: boolean\n designSystemId: string\n designSystemVersionId: string\n exportPath: string\n logger: pulsar.PLLogger\n proxyUrl?: string\n themeId?: string\n}\n\nexport enum ErrorCode {\n designSystemDescriptionFailed = \"ERR_DESIGN_SYSTEM_DESCRIPTION_FAILED\",\n documentationPublishingFailed = \"ERR_DOCUMENTATION_PUBLISHING_FAILED\",\n exportFailed = \"ERR_EXPORT_FAILED\",\n tokenSyncFailed = \"ERR_TOKEN_SYNC_FAILED\",\n workspaceDescriptionFailed = \"ERR_WORKSPACE_DESCRIPTION_FAILED\",\n}\n"],"names":[],"mappings":";;AA+BA,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,mFAAsE,CAAA;IACtE,kFAAqE,CAAA;IACrE,+CAAkC,CAAA;IAClC,sDAAyC,CAAA;IACzC,4EAA+D,CAAA;AACjE,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB","
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../src/types/types.ts"],"sourceRoot":"","sourcesContent":["//\n// types.ts\n// Supernova CLI\n//\n// Created by Jiri Trecak.\n// Copyright © Supernova.io. All rights reserved.\n//\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Imports\n\n \nimport * as pulsar from \"@supernova-studio/pulsar-language\"\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Types\n\nexport interface ExportConfiguration {\n accessToken: string\n apiUrl: string\n apiVersion?: string\n brandId?: string\n debugMode?: boolean\n designSystemId: string\n designSystemVersionId: string\n exportPath: string\n logger: pulsar.PLLogger\n proxyUrl?: string\n themeId?: string\n}\n\nexport enum ErrorCode {\n designSystemDescriptionFailed = \"ERR_DESIGN_SYSTEM_DESCRIPTION_FAILED\",\n documentationPublishingFailed = \"ERR_DOCUMENTATION_PUBLISHING_FAILED\",\n exportFailed = \"ERR_EXPORT_FAILED\",\n tokenSyncFailed = \"ERR_TOKEN_SYNC_FAILED\",\n workspaceDescriptionFailed = \"ERR_WORKSPACE_DESCRIPTION_FAILED\",\n}\n"],"names":[],"mappings":";;AA+BA,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,mFAAsE,CAAA;IACtE,kFAAqE,CAAA;IACrE,+CAAkC,CAAA;IAClC,sDAAyC,CAAA;IACzC,4EAA+D,CAAA;AACjE,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB","debugId":"21376bfd-ee7e-512e-8733-59f08ad6cbff"}
|
|
@@ -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 { 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":";;AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAW,MAAM,KAAK,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9D,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAA;AA2DF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC5E,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,2DAA2D;QACxE,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,mEAAmE;QAChF,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,mDAAmD;QAChE,OAAO,EAAE,KAAK;KACf,CAAC;IACF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;QACpB,WAAW,EAAE,2DAA2D;QACxE,OAAO,EAAE,KAAK;KACf,CAAC;CACH,CAAA;AAED,MAAM,OAAgB,kBAAmB,SAAQ,aAAmC;IAClF,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IACzC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,0BAA0B,CAAA;IACnC,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,KAA2B,EAAE,WAAwB;QAClF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAA;QACvC,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAA;QAC3C,MAAM,wBAAwB,GAAG,MAAM,EAAE,cAAc,CAAA;QAEvD,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACvD,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACtE,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAA;QACrF,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;QAC5E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAA;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAA;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAA;QACpC,MAAM,qBAAqB,GAAG,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAA;QAC9E,MAAM,aAAa,GAAG,MAAM;YAC1B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC;gBACE,SAAS,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1C,cAAc,EAAE,qBAAqB,IAAI,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC7E,CAAA;QAEL,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;YAC/C,iBAAiB;YACjB,gBAAgB;YAChB,OAAO;YACP,WAAW;SACZ,CAAC,CAAA;QAEF,MAAM,cAAc,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,EAAE,CACrE,4BAA4B,CAAC;YAC3B,eAAe;YACf,KAAK;YACL,OAAO;YACP,KAAK,EAAE,gBAAgB,CAAC,MAAM;SAC/B,CAAC,CACH,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,YAAY,cAAc,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,GAAG,CAAC,eAAe,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;QAE/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrB,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,eAAe,GAAG,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;YACpF,IAAI,CAAC,GAAG,CACN,GAAG,aAAa,CAAC,QAAQ,IAAI,WAAW,CAAC,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,aAAa,CAAC,YAAY,UAAU,aAAa,CAAC,SAAS,GAAG,eAAe,EAAE,CACzK,CAAA;QACH,CAAC;QAED,MAAM,eAAe,GAA6B,EAAE,CAAA;QACpD,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,IAAI,iBAAiB,GAAG,CAAC,CAAA;QACzB,IAAI,mBAAmB,GAAG,CAAC,CAAA;QAE3B,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAA;QAC9B,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAA;YAE3F,IAAI,CAAC,GAAG,CACN,GAAG,QAAQ,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,SAAS,SAAS,YAAY,EAAE,CACxH,CAAA;YAED,IAAI,eAAe,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,aAAa,EAAE,CAAC;gBAChE,MAAM,kBAAkB,GAAG,oCAAoC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;gBAC3F,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;oBACjC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;gBAChC,CAAC;gBAED,cAAc,IAAI,CAAC,CAAA;gBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,kBAAkB,EAAE,CAAC,CAAA;gBAC/G,SAAQ;YACV,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,4CAA4C,mBAAmB,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;YAC5G,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC;gBAC3C,cAAc,EAAE,qBAAqB;gBACrC,YAAY,EAAE,KAAK,CAAC,OAAO;gBAC3B,UAAU,EAAE,aAAa,CAAC,UAAU;gBACpC,IAAI,EAAE,eAAe,CAAC,QAAQ;gBAC9B,WAAW,EAAE,aAAa,CAAC,OAAO;gBAClC,gBAAgB,EAAE,mCAAmC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACnG,CAAC,CAAA;YAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,KAAK,OAAO,IAAI,kBAAkB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;YACxG,IAAI,eAAe,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtD,cAAc,IAAI,CAAC,CAAA;gBACnB,iBAAiB,IAAI,CAAC,CAAA;gBACtB,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAA;gBAC9G,SAAQ;YACV,CAAC;YAED,IAAI,eAAe,CAAC,QAAQ,KAAK,YAAY,IAAI,cAAc,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxF,cAAc,IAAI,CAAC,CAAA;gBACnB,mBAAmB,IAAI,CAAC,CAAA;gBACxB,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAA;gBAChH,SAAQ;YACV,CAAC;YAED,IAAI,eAAe,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9C,IAAI,CAAC,GAAG,CACN,GAAG,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,cAAc,CAAC,UAAU,WAAW,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,CACjK,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CACN,GAAG,QAAQ,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,cAAc,CAAC,UAAU,WAAW,2BAA2B,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,CACzL,CAAA;YACH,CAAC;YAED,eAAe,CAAC,IAAI,CAAC;gBACnB,eAAe,EAAE,cAAc,CAAC,UAAU;gBAC1C,YAAY;gBACZ,SAAS;gBACT,MAAM;gBACN,eAAe,EAAE,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC;gBACvD,WAAW,EAAE,eAAe,CAAC,QAAQ;gBACrC,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,CAAC,oBAAoB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,YAAY,cAAc,EAAE,CAAC,CAAA;QACtC,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,kBAAkB,iBAAiB,EAAE,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,oBAAoB,mBAAmB,EAAE,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAA;YACrG,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,oBAAoB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;QAEtD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,oBAAoB,CAAC;gBACxB,aAAa;gBACb,cAAc,EAAE,qBAAqB;gBACrC,gBAAgB;gBAChB,QAAQ,EAAE,iBAAiB;gBAC3B,MAAM;aACP,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAC7C,OAAM;QACR,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,aAAa,CAAA;QACnD,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAC7B,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,UAAU,CAC5C,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACpC,IAAI,CAAC,cAAc,CAAC;YAClB,SAAS;YACT,cAAc;YACd,QAAQ,EAAE,gBAAgB,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC;YAClE,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CACH,CACF,CAAA;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CACxC,CAAC,MAAM,EAAmC,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAC1E,CAAA;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,cAAc,CACtB,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAC5C,GAAG,aAAa,CAAC,MAAM,6BAA6B,CACrD,CAAA;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAC/B,IAAI,CAAC,GAAG,CAAC,uBAAuB,eAAe,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;QACnF,IAAI,CAAC,GAAG,CAAC,iBAAiB,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QACzG,IAAI,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QAE/F,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC;YAClD,SAAS;YACT,cAAc;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,oBAAoB,CAAC;YACxB,aAAa;YACb,cAAc;YACd,gBAAgB;YAChB,QAAQ,EAAE,iBAAiB;YAC3B,MAAM;SACP,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,2FAA2F,CAAC,CAAA;YACrG,OAAM;QACR,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QAC5B,MAAM,kBAAkB,CAAC;YACvB,SAAS;YACT,cAAc;YACd,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SACtC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,mBAAmB,aAAa,CAAC,eAAe,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,GAAG,CAAC,aAAa,eAAe,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3E,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjB,CAAC;IAEO,oBAAoB,CAAC,KAM5B;QACC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;QAEnF,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE;gBACP,GAAG,aAAa;gBAChB,MAAM;gBACN,QAAQ;gBACR,gBAAgB;aACjB;YACD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAY5B;QACC,MAAM,EACJ,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,SAAS,EACT,MAAM,EACN,eAAe,EACf,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,GACT,GAAG,KAAK,CAAA;QACT,MAAM,QAAQ,GAAG,wBAAwB,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,CAAA;QAEpE,MAAM,WAAW,GAAG;YAClB,eAAe,EAAE,KAAK,CAAC,QAAQ;YAC/B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,SAAS;YAC5B,cAAc;YACd,MAAM;YACN,eAAe;YACf,WAAW,EAAE,gBAAgB,CAAC,WAAW,CAAC;SAC3C,CAAA;QAED,IAAI,CAAC,GAAG,CACN,GAAG,QAAQ,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,YAAY,QAAQ,UAAU,SAAS,SAAS,YAAY,cAAc,eAAe,EAAE,CAC5J,CAAA;QACD,IAAI,YAAwC,CAAA;QAC5C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAgD,QAAQ,EAAE,WAAW,CAAC,CAAA;YAC3G,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;YACnC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACrD,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC,0CAA0C,WAAW,IAAI,CAAC,CAAA;QACvE,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,6DAA6D,WAAW,IAAI,CAAC,CAAA;QAC1F,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE;gBACrD,OAAO,EAAE;oBACP,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;oBACtC,cAAc,EAAE,iBAAiB;iBAClC;aACF,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACrD,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;YAC7C,IAAI,CAAC,KAAK,CAAC,mCAAmC,WAAW,IAAI,CAAC,CAAA;QAChE,CAAC;QAED,MAAM,YAAY,GAAG,mBAAmB,YAAY,CAAC,UAAU,WAAW,CAAA;QAC1E,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,sBAAsB,YAAY,CAAC,UAAU,EAAE,CAAC,CAAA;QACpG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACrD,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;YACpC,IAAI,CAAC,KAAK,CAAC,6BAA6B,WAAW,IAAI,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAGhC;QACC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;QAC3C,MAAM,cAAc,GAAG,6BAA6B,CAAA;QACpD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;QACnD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAgD,cAAc,EAAE;gBACnG,cAAc;aACf,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CACN,GAAG,YAAY,CAAC,MAAM,CAAC,uBAAuB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,eAAe,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAC3I,CAAA;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;YAClD,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;YACvC,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,6BAA6B,CACzC,YAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAA;QACxB,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;QAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE1E,OAAO;YACL,OAAO;YACP,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM;YACjD,QAAQ;YACR,SAAS,EAAE,OAAO,CAAC,UAAU;SAC9B,CAAA;IACH,CAAC;IAEO,YAAY,CAAC,IAAY,EAAE,KAAc;QAC/C,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAA;YACrC,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAChH,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,eAAe,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACtF,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACvF,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,WAA8B;IACtD,OAAO,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAA;AAC9D,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAsB,CAAA;IAC7F,OAAO,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,uBAAuB,CAAC,KAKhC;IACC,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,IAAI,KAAK,CAAC,WAAW,KAAK,YAAY,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CACT,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAkB,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7D,SAAS,EAAE,KAAK;YAChB,UAAU;YACV,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC,CACJ,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CACT,GAAG,4BAA4B,CAAC;YAC9B,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CACH,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,4BAA4B,CAAC,KAIrC;IACC,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAC9D,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC/C,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,CAAC,CAAA;IAE5G,IAAI,oBAAoB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;IAC1F,CAAC;IAED,OAAO,oBAAoB;SACxB,MAAM,CAAC,UAAU,CAAC,EAAE;QACnB,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;QAC/C,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACnF,CAAC,CAAC;SACD,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAClB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,OAAgB;KAC3B,CAAC,CAAC,CAAA;AACP,CAAC;AAMD,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAA;IACjE,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAA;QACjE,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,oBAAoB,CAAA;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,6BAA6B,CAAC,OAAO,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAyB,CAAA;IACxG,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC;QACjE,CAAC,CAAC,eAAe,CAAC,UAAU;QAC5B,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;IAEhD,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;YACtD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBAC3D,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,CAAC;YAED,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAQ;QACV,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnE,SAAQ;QACV,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,SAAQ;YACV,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBACxD,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAe;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACnE,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAQ;QACV,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,iBAAiB,EAAE;QACnD,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,KAAK;QACV,MAAM,EAAE;YACN,YAAY;YACZ,aAAa;YACb,kBAAkB;YAClB,aAAa;YACb,gBAAgB;YAChB,YAAY;YACZ,oBAAoB;YACpB,WAAW;SACZ;QACD,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CACnB,CAAA;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAe,EACf,oBAA8B,EAC9B,iBAA2B;IAE3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACzG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAE/B,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;YAC3B,SAAQ;QACV,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;QAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7E,SAAQ;QACV,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAoB;IAC9C,OAAO,2BAA2B,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,2BAA2B,CAAC,YAAoB;IACvD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAA;IAC5E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAA2B,CAAA;QAC9F,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE,CAAA;QAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC;AAED,SAAS,mCAAmC,CAAC,WAAmB;IAC9D,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AAC7D,CAAC;AAED,SAAS,oBAAoB,CAAC,KAI7B;IACC,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;IACjE,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAA;IAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;IACpD,CAAC;IAED,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,UAAU,EAAE,CAAC;QAClD,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QACtD,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;IACpD,CAAC;IAED,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,2BAA2B,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAA;IACxG,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;QAC5D,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;IAC1D,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3E,IAAI,cAAc,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;QACrD,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAA;IACnD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA6B;IACxD,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;AACtE,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAqB,EAAE,WAAmB;IACtE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;QAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,SAAQ;QACV,CAAC;QAED,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAsB,CAAA;YAC7F,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACrC,OAAO,UAAU,CAAA;YACnB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB;IACxC,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CACpH,CAAA;AACH,CAAC;AAED,SAAS,oCAAoC,CAAC,UAA6B;IACzE,OAAO,WAAW,mBAAmB,CAAC,UAAU,CAAC,iLAAiL,CAAA;AACpO,CAAC;AAED,SAAS,4BAA4B,CAAC,KAKrC;IACC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IACxD,MAAM,aAAa,GAAG,oBAAoB,CAAC;QACzC,UAAU,EAAE,eAAe,CAAC,UAAU;QACtC,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,WAAW,EAAE,eAAe,CAAC,QAAQ;KACtC,CAAC,CAAA;IAEF,OAAO;QACL,aAAa;QACb,eAAe;QACf,YAAY,EAAE,mBAAmB,CAAC,eAAe,CAAC,UAAU,CAAC;QAC7D,SAAS,EAAE,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC;QACtF,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC;KACjD,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,gBAAmC;IAC7D,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,MAAM,CAAA;IAC7F,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAA;IACnF,OAAO,GAAG,UAAU,gBAAgB,KAAK,QAAQ,CAAA;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,QAA2B;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,KAAa,EAAE,KAAa;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAChD,OAAO,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,GAAG,CAAA;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,UAAkB;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,GAAG,CAAA;IAC9D,IAAI,YAAY,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7C,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAA;AACnF,CAAC;AAED,SAAS,YAAY,CAAC,MAA0C;IAC9D,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;KACN,CAAA;IAEV,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAA;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;KACX,CAAA;IAEV,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAA;AACtD,CAAC","debug_id":"b1b0f3f1-2050-5c37-9714-32da972b95c4"}
|
|
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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","debugId":"b1b0f3f1-2050-5c37-9714-32da972b95c4"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-status.js","sources":["../../src/utils/analyze-status.ts"],"sourceRoot":"","sourcesContent":["import { action } from \"@oclif/core/ux\"\nimport { isAxiosError } from \"axios\"\n\nimport { sleep } from \"./common.js\"\nimport { createApiClient } from \"./http-client.js\"\n\ntype ProcessingRunStatus = \"Processing\" | \"Processed\" | \"Failed\"\n\ntype ProcessRunsResponse = {\n runs: Array<{\n createdAt: string\n errorSummary: string | null\n failedComponentsCount: number\n finishedAt: string | null\n processingRunId: string\n snapshotIds: string[]\n startedAt: string\n status: ProcessingRunStatus\n updatedAt: string\n }>\n}\n\ntype ApiEnvelope<T> = { result: T }\n\nconst WATCH_INTERVAL_SECONDS = 3\nconst WATCH_TIMEOUT_SECONDS = 900\n\nexport async function watchAnalyzeStatus(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n error(message: string): never\n}): Promise<void> {\n const spinner = new AnalyzeStatusSpinner()\n const startedAt = Date.now()\n const timeoutMs = WATCH_TIMEOUT_SECONDS * 1000\n\n spinner.start(\"Watching processing runs\")\n\n try {\n while (true) {\n const { runs } = await fetchAnalyzeRuns(input)\n const activeRuns = runs.filter(run => run.status === \"Processing\")\n const elapsed = Math.floor((Date.now() - startedAt) / 1000)\n spinner.update(`Processing snapshots activeRuns=${activeRuns.length} elapsed=${formatElapsed(elapsed)}`)\n\n if (activeRuns.length === 0) {\n spinner.stop(`DONE processing activeRuns=0 elapsed=${formatElapsed(elapsed)}`)\n return\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n spinner.stop()\n input.error(`Timed out waiting for processing runs after ${WATCH_TIMEOUT_SECONDS}s.`)\n }\n\n await sleep(WATCH_INTERVAL_SECONDS * 1000)\n }\n } finally {\n spinner.stop()\n }\n}\n\nasync function fetchAnalyzeRuns(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n error(message: string): never\n}): Promise<ProcessRunsResponse> {\n const endpoint = `/code-snapshots/process-status/${encodeURIComponent(input.designSystemId)}`\n try {\n const response = await input.apiClient.get<ApiEnvelope<ProcessRunsResponse>>(endpoint)\n return response.data.result\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 404) {\n input.error(\"Status endpoint is not deployed on this backend yet. Deploy backend and try again.\")\n }\n\n throw error\n }\n}\n\nfunction formatElapsed(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`\n}\n\nclass AnalyzeStatusSpinner {\n private spinnerFrames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"]\n private spinnerIndex = 0\n private spinnerInterval: NodeJS.Timeout | null = null\n private spinnerMessage = \"\"\n\n start(initialMessage: string): void {\n this.spinnerMessage = initialMessage\n if (!process.stdout.isTTY) {\n action.start(initialMessage)\n return\n }\n\n this.spinnerInterval = setInterval(() => {\n const frame = this.spinnerFrames[this.spinnerIndex++ % this.spinnerFrames.length]\n process.stdout.write(`\\r${frame} ${this.spinnerMessage}\\u001B[K`)\n }, 80)\n }\n\n update(message: string): void {\n this.spinnerMessage = message\n }\n\n stop(finalMessage?: string): void {\n if (!process.stdout.isTTY) {\n if (finalMessage) {\n action.stop(finalMessage)\n } else {\n action.stop()\n }\n\n return\n }\n\n if (this.spinnerInterval) {\n clearInterval(this.spinnerInterval)\n this.spinnerInterval = null\n }\n\n if (finalMessage) {\n process.stdout.write(`\\r${finalMessage}\\u001B[K\\n`)\n } else {\n process.stdout.write(\"\\r\\u001B[K\")\n }\n }\n}\n"],"names":[],"mappings":"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","
|
|
1
|
+
{"version":3,"file":"analyze-status.js","sources":["../../src/utils/analyze-status.ts"],"sourceRoot":"","sourcesContent":["import { action } from \"@oclif/core/ux\"\nimport { isAxiosError } from \"axios\"\n\nimport { sleep } from \"./common.js\"\nimport { createApiClient } from \"./http-client.js\"\n\ntype ProcessingRunStatus = \"Processing\" | \"Processed\" | \"Failed\"\n\ntype ProcessRunsResponse = {\n runs: Array<{\n createdAt: string\n errorSummary: string | null\n failedComponentsCount: number\n finishedAt: string | null\n processingRunId: string\n snapshotIds: string[]\n startedAt: string\n status: ProcessingRunStatus\n updatedAt: string\n }>\n}\n\ntype ApiEnvelope<T> = { result: T }\n\nconst WATCH_INTERVAL_SECONDS = 3\nconst WATCH_TIMEOUT_SECONDS = 900\n\nexport async function watchAnalyzeStatus(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n error(message: string): never\n}): Promise<void> {\n const spinner = new AnalyzeStatusSpinner()\n const startedAt = Date.now()\n const timeoutMs = WATCH_TIMEOUT_SECONDS * 1000\n\n spinner.start(\"Watching processing runs\")\n\n try {\n while (true) {\n const { runs } = await fetchAnalyzeRuns(input)\n const activeRuns = runs.filter(run => run.status === \"Processing\")\n const elapsed = Math.floor((Date.now() - startedAt) / 1000)\n spinner.update(`Processing snapshots activeRuns=${activeRuns.length} elapsed=${formatElapsed(elapsed)}`)\n\n if (activeRuns.length === 0) {\n spinner.stop(`DONE processing activeRuns=0 elapsed=${formatElapsed(elapsed)}`)\n return\n }\n\n if (Date.now() - startedAt >= timeoutMs) {\n spinner.stop()\n input.error(`Timed out waiting for processing runs after ${WATCH_TIMEOUT_SECONDS}s.`)\n }\n\n await sleep(WATCH_INTERVAL_SECONDS * 1000)\n }\n } finally {\n spinner.stop()\n }\n}\n\nasync function fetchAnalyzeRuns(input: {\n apiClient: Awaited<ReturnType<typeof createApiClient>>\n designSystemId: string\n error(message: string): never\n}): Promise<ProcessRunsResponse> {\n const endpoint = `/code-snapshots/process-status/${encodeURIComponent(input.designSystemId)}`\n try {\n const response = await input.apiClient.get<ApiEnvelope<ProcessRunsResponse>>(endpoint)\n return response.data.result\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 404) {\n input.error(\"Status endpoint is not deployed on this backend yet. Deploy backend and try again.\")\n }\n\n throw error\n }\n}\n\nfunction formatElapsed(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}`\n}\n\nclass AnalyzeStatusSpinner {\n private spinnerFrames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"]\n private spinnerIndex = 0\n private spinnerInterval: NodeJS.Timeout | null = null\n private spinnerMessage = \"\"\n\n start(initialMessage: string): void {\n this.spinnerMessage = initialMessage\n if (!process.stdout.isTTY) {\n action.start(initialMessage)\n return\n }\n\n this.spinnerInterval = setInterval(() => {\n const frame = this.spinnerFrames[this.spinnerIndex++ % this.spinnerFrames.length]\n process.stdout.write(`\\r${frame} ${this.spinnerMessage}\\u001B[K`)\n }, 80)\n }\n\n update(message: string): void {\n this.spinnerMessage = message\n }\n\n stop(finalMessage?: string): void {\n if (!process.stdout.isTTY) {\n if (finalMessage) {\n action.stop(finalMessage)\n } else {\n action.stop()\n }\n\n return\n }\n\n if (this.spinnerInterval) {\n clearInterval(this.spinnerInterval)\n this.spinnerInterval = null\n }\n\n if (finalMessage) {\n process.stdout.write(`\\r${finalMessage}\\u001B[K\\n`)\n } else {\n process.stdout.write(\"\\r\\u001B[K\")\n }\n }\n}\n"],"names":[],"mappings":"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","debugId":"7d5388d6-d783-5ba8-a8ae-467aeaff909e"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sources":["../../src/utils/api-client.ts"],"sourceRoot":"","sourcesContent":["import { SupernovaApiClient } from \"@supernova-studio/client\"\n\nimport { VaultService } from \"../services/vault.service.js\"\nimport { apiHostForEnvironment, TargetEnv } from \"../types/environment.js\"\n\nconst vaultService = new VaultService()\n\nexport const getApiClient = async (env: TargetEnv): Promise<SupernovaApiClient> => {\n const { accessToken } = await vaultService.getTokensFromVault(env)\n return new SupernovaApiClient({ accessToken, host: apiHostForEnvironment(env) })\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAa,MAAM,yBAAyB,CAAA;AAE1E,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAA;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAc,EAA+B,EAAE;IAChF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAClE,OAAO,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAClF,CAAC,CAAA","
|
|
1
|
+
{"version":3,"file":"api-client.js","sources":["../../src/utils/api-client.ts"],"sourceRoot":"","sourcesContent":["import { SupernovaApiClient } from \"@supernova-studio/client\"\n\nimport { VaultService } from \"../services/vault.service.js\"\nimport { apiHostForEnvironment, TargetEnv } from \"../types/environment.js\"\n\nconst vaultService = new VaultService()\n\nexport const getApiClient = async (env: TargetEnv): Promise<SupernovaApiClient> => {\n const { accessToken } = await vaultService.getTokensFromVault(env)\n return new SupernovaApiClient({ accessToken, host: apiHostForEnvironment(env) })\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAa,MAAM,yBAAyB,CAAA;AAE1E,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAA;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAc,EAA+B,EAAE;IAChF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAClE,OAAO,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAClF,CAAC,CAAA","debugId":"be31c3bd-5572-5d4b-b7ef-54f87120cb9f"}
|
package/dist/utils/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sources":["../../src/utils/common.ts"],"sourceRoot":"","sourcesContent":["export async function sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms)\n })\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAU;IACpC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC","
|
|
1
|
+
{"version":3,"file":"common.js","sources":["../../src/utils/common.ts"],"sourceRoot":"","sourcesContent":["export async function sleep(ms: number): Promise<void> {\n return new Promise(resolve => {\n setTimeout(resolve, ms)\n })\n}\n"],"names":[],"mappings":";;AAAA,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAU;IACpC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC","debugId":"8afc96d7-d78f-5cda-aeee-65f2828b68de"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.js","sources":["../../src/utils/config.service.ts"],"sourceRoot":"","sourcesContent":["import * as fs from \"node:fs\"\n\nimport { SupernovaConfig } from \"../types/config.js\"\n\nconst configFileName = \"supernova.config.json\"\n\nexport class SupernovaConfigService {\n private static instance: SupernovaConfigService\n private configCache: SupernovaConfig | null = null\n\n public static getInstance(): SupernovaConfigService {\n if (!SupernovaConfigService.instance) {\n SupernovaConfigService.instance = new SupernovaConfigService()\n }\n\n return SupernovaConfigService.instance\n }\n\n public get(): SupernovaConfig | null {\n if (this.configCache) return this.configCache\n if (!fs.existsSync(this.configPath)) return null\n\n try {\n const configString = fs.readFileSync(this.configPath, \"utf8\")\n const configJson = JSON.parse(configString)\n const configParseResult = SupernovaConfig.safeParse(configJson)\n\n if (configParseResult.success) {\n this.configCache = configParseResult.data\n }\n\n return this.configCache\n } catch (error) {\n throw new Error(`Could not read ${configFileName} file: ${(error as { message: string }).message}`)\n }\n }\n\n public update(configUpdate: Partial<SupernovaConfig>): void {\n const fullConfig = {\n ...this.get(),\n ...configUpdate,\n }\n\n this.write(fullConfig)\n }\n\n private write(config: SupernovaConfig): void {\n fs.writeFileSync(this.configPath, `${JSON.stringify(config, null, 2)}\\n`)\n this.configCache = config\n }\n\n private get configPath(): string {\n return configFileName\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,cAAc,GAAG,uBAAuB,CAAA;AAE9C,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,CAAwB;IACvC,WAAW,GAA2B,IAAI,CAAA;IAE3C,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAChE,CAAC;QAED,OAAO,sBAAsB,CAAC,QAAQ,CAAA;IACxC,CAAC;IAEM,GAAG;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAA;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QAEhD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC3C,MAAM,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAE/D,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAA;YAC3C,CAAC;YAED,OAAO,IAAI,CAAC,WAAW,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,cAAc,UAAW,KAA6B,CAAC,OAAO,EAAE,CAAC,CAAA;QACrG,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,YAAsC;QAClD,MAAM,UAAU,GAAG;YACjB,GAAG,IAAI,CAAC,GAAG,EAAE;YACb,GAAG,YAAY;SAChB,CAAA;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACxB,CAAC;IAEO,KAAK,CAAC,MAAuB;QACnC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACzE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,cAAc,CAAA;IACvB,CAAC;CACF","
|
|
1
|
+
{"version":3,"file":"config.service.js","sources":["../../src/utils/config.service.ts"],"sourceRoot":"","sourcesContent":["import * as fs from \"node:fs\"\n\nimport { SupernovaConfig } from \"../types/config.js\"\n\nconst configFileName = \"supernova.config.json\"\n\nexport class SupernovaConfigService {\n private static instance: SupernovaConfigService\n private configCache: SupernovaConfig | null = null\n\n public static getInstance(): SupernovaConfigService {\n if (!SupernovaConfigService.instance) {\n SupernovaConfigService.instance = new SupernovaConfigService()\n }\n\n return SupernovaConfigService.instance\n }\n\n public get(): SupernovaConfig | null {\n if (this.configCache) return this.configCache\n if (!fs.existsSync(this.configPath)) return null\n\n try {\n const configString = fs.readFileSync(this.configPath, \"utf8\")\n const configJson = JSON.parse(configString)\n const configParseResult = SupernovaConfig.safeParse(configJson)\n\n if (configParseResult.success) {\n this.configCache = configParseResult.data\n }\n\n return this.configCache\n } catch (error) {\n throw new Error(`Could not read ${configFileName} file: ${(error as { message: string }).message}`)\n }\n }\n\n public update(configUpdate: Partial<SupernovaConfig>): void {\n const fullConfig = {\n ...this.get(),\n ...configUpdate,\n }\n\n this.write(fullConfig)\n }\n\n private write(config: SupernovaConfig): void {\n fs.writeFileSync(this.configPath, `${JSON.stringify(config, null, 2)}\\n`)\n this.configCache = config\n }\n\n private get configPath(): string {\n return configFileName\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,cAAc,GAAG,uBAAuB,CAAA;AAE9C,MAAM,OAAO,sBAAsB;IACzB,MAAM,CAAC,QAAQ,CAAwB;IACvC,WAAW,GAA2B,IAAI,CAAA;IAE3C,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;QAChE,CAAC;QAED,OAAO,sBAAsB,CAAC,QAAQ,CAAA;IACxC,CAAC;IAEM,GAAG;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAA;QAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QAEhD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC3C,MAAM,iBAAiB,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAE/D,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAA;YAC3C,CAAC;YAED,OAAO,IAAI,CAAC,WAAW,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,cAAc,UAAW,KAA6B,CAAC,OAAO,EAAE,CAAC,CAAA;QACrG,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,YAAsC;QAClD,MAAM,UAAU,GAAG;YACjB,GAAG,IAAI,CAAC,GAAG,EAAE;YACb,GAAG,YAAY;SAChB,CAAA;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACxB,CAAC;IAEO,KAAK,CAAC,MAAuB;QACnC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACzE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,CAAC;IAED,IAAY,UAAU;QACpB,OAAO,cAAc,CAAA;IACvB,CAAC;CACF","debugId":"efbafcda-4ef1-5d66-945d-590f1730640c"}
|
package/dist/utils/discover.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/utils/discover.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/utils/discover.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,WAAW;IACnB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAA;CAChC;AAMD,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOlE;AA0cD,wBAAsB,4BAA4B,CAChD,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC,CAc5D;AAED,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,EACxE,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,CAAC,CAKtB;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,SAAS,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,CAAC,CAqB5D"}
|