@supernovaio/cli 2.0.39 → 2.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/code-analyzer/analyzers/component-usage.d.ts +6 -0
  2. package/dist/code-analyzer/analyzers/component-usage.d.ts.map +1 -0
  3. package/dist/code-analyzer/analyzers/component-usage.js +344 -0
  4. package/dist/code-analyzer/analyzers/component-usage.js.map +1 -0
  5. package/dist/code-analyzer/analyzers/helpers.d.ts +11 -0
  6. package/dist/code-analyzer/analyzers/helpers.d.ts.map +1 -0
  7. package/dist/code-analyzer/analyzers/helpers.js +59 -0
  8. package/dist/code-analyzer/analyzers/helpers.js.map +1 -0
  9. package/dist/code-analyzer/analyzers/index.d.ts +8 -0
  10. package/dist/code-analyzer/analyzers/index.d.ts.map +1 -0
  11. package/dist/code-analyzer/analyzers/index.js +11 -0
  12. package/dist/code-analyzer/analyzers/index.js.map +1 -0
  13. package/dist/code-analyzer/analyzers/jsdoc.d.ts +3 -0
  14. package/dist/code-analyzer/analyzers/jsdoc.d.ts.map +1 -0
  15. package/dist/code-analyzer/analyzers/jsdoc.js +7 -0
  16. package/dist/code-analyzer/analyzers/jsdoc.js.map +1 -0
  17. package/dist/code-analyzer/analyzers/static-components.d.ts +3 -0
  18. package/dist/code-analyzer/analyzers/static-components.d.ts.map +1 -0
  19. package/dist/code-analyzer/analyzers/static-components.js +399 -0
  20. package/dist/code-analyzer/analyzers/static-components.js.map +1 -0
  21. package/dist/code-analyzer/analyzers/storybook-docs.d.ts +3 -0
  22. package/dist/code-analyzer/analyzers/storybook-docs.d.ts.map +1 -0
  23. package/dist/code-analyzer/analyzers/storybook-docs.js +163 -0
  24. package/dist/code-analyzer/analyzers/storybook-docs.js.map +1 -0
  25. package/dist/code-analyzer/analyzers/storybook-stories.d.ts +3 -0
  26. package/dist/code-analyzer/analyzers/storybook-stories.d.ts.map +1 -0
  27. package/dist/code-analyzer/analyzers/storybook-stories.js +91 -0
  28. package/dist/code-analyzer/analyzers/storybook-stories.js.map +1 -0
  29. package/dist/code-analyzer/analyzers/types.d.ts +88 -0
  30. package/dist/code-analyzer/analyzers/types.d.ts.map +1 -0
  31. package/dist/code-analyzer/analyzers/types.js +12 -0
  32. package/dist/code-analyzer/analyzers/types.js.map +1 -0
  33. package/dist/code-analyzer/analyzers/typescript-api.d.ts +3 -0
  34. package/dist/code-analyzer/analyzers/typescript-api.d.ts.map +1 -0
  35. package/dist/code-analyzer/analyzers/typescript-api.js +7 -0
  36. package/dist/code-analyzer/analyzers/typescript-api.js.map +1 -0
  37. package/dist/code-analyzer/components/analyze.d.ts +8 -0
  38. package/dist/code-analyzer/components/analyze.d.ts.map +1 -0
  39. package/dist/code-analyzer/components/analyze.js +38 -0
  40. package/dist/code-analyzer/components/analyze.js.map +1 -0
  41. package/dist/code-analyzer/components/mappers/component.d.ts +4 -0
  42. package/dist/code-analyzer/components/mappers/component.d.ts.map +1 -0
  43. package/dist/code-analyzer/components/mappers/component.js +20 -0
  44. package/dist/code-analyzer/components/mappers/component.js.map +1 -0
  45. package/dist/code-analyzer/components/mappers/property.d.ts +4 -0
  46. package/dist/code-analyzer/components/mappers/property.d.ts.map +1 -0
  47. package/dist/code-analyzer/components/mappers/property.js +19 -0
  48. package/dist/code-analyzer/components/mappers/property.js.map +1 -0
  49. package/dist/code-analyzer/components/parser/index.d.ts +6 -0
  50. package/dist/code-analyzer/components/parser/index.d.ts.map +1 -0
  51. package/dist/code-analyzer/components/parser/index.js +9 -0
  52. package/dist/code-analyzer/components/parser/index.js.map +1 -0
  53. package/dist/code-analyzer/components/parser/module-parser.d.ts +12 -0
  54. package/dist/code-analyzer/components/parser/module-parser.d.ts.map +1 -0
  55. package/dist/code-analyzer/components/parser/module-parser.js +116 -0
  56. package/dist/code-analyzer/components/parser/module-parser.js.map +1 -0
  57. package/dist/code-analyzer/components/parser/parser.d.ts +46 -0
  58. package/dist/code-analyzer/components/parser/parser.d.ts.map +1 -0
  59. package/dist/code-analyzer/components/parser/parser.js +904 -0
  60. package/dist/code-analyzer/components/parser/parser.js.map +1 -0
  61. package/dist/code-analyzer/components/parser/types.d.ts +123 -0
  62. package/dist/code-analyzer/components/parser/types.d.ts.map +1 -0
  63. package/dist/code-analyzer/components/parser/types.js +21 -0
  64. package/dist/code-analyzer/components/parser/types.js.map +1 -0
  65. package/dist/code-analyzer/components/parser/utils/build-filter.d.ts +3 -0
  66. package/dist/code-analyzer/components/parser/utils/build-filter.d.ts.map +1 -0
  67. package/dist/code-analyzer/components/parser/utils/build-filter.js +31 -0
  68. package/dist/code-analyzer/components/parser/utils/build-filter.js.map +1 -0
  69. package/dist/code-analyzer/components/parser/utils/filter-duplicates.d.ts +3 -0
  70. package/dist/code-analyzer/components/parser/utils/filter-duplicates.d.ts.map +1 -0
  71. package/dist/code-analyzer/components/parser/utils/filter-duplicates.js +17 -0
  72. package/dist/code-analyzer/components/parser/utils/filter-duplicates.js.map +1 -0
  73. package/dist/code-analyzer/components/parser/utils/is-react-component.d.ts +4 -0
  74. package/dist/code-analyzer/components/parser/utils/is-react-component.d.ts.map +1 -0
  75. package/dist/code-analyzer/components/parser/utils/is-react-component.js +43 -0
  76. package/dist/code-analyzer/components/parser/utils/is-react-component.js.map +1 -0
  77. package/dist/code-analyzer/components/parser/utils/trim-file-name.d.ts +2 -0
  78. package/dist/code-analyzer/components/parser/utils/trim-file-name.d.ts.map +1 -0
  79. package/dist/code-analyzer/components/parser/utils/trim-file-name.js +22 -0
  80. package/dist/code-analyzer/components/parser/utils/trim-file-name.js.map +1 -0
  81. package/dist/code-analyzer/components/types.d.ts +18 -0
  82. package/dist/code-analyzer/components/types.d.ts.map +1 -0
  83. package/dist/code-analyzer/components/types.js +5 -0
  84. package/dist/code-analyzer/components/types.js.map +1 -0
  85. package/dist/code-analyzer/components/utils/get-module-exports-path.d.ts +2 -0
  86. package/dist/code-analyzer/components/utils/get-module-exports-path.d.ts.map +1 -0
  87. package/dist/code-analyzer/components/utils/get-module-exports-path.js +60 -0
  88. package/dist/code-analyzer/components/utils/get-module-exports-path.js.map +1 -0
  89. package/dist/code-analyzer/index.d.ts +5 -0
  90. package/dist/code-analyzer/index.d.ts.map +1 -0
  91. package/dist/code-analyzer/index.js +8 -0
  92. package/dist/code-analyzer/index.js.map +1 -0
  93. package/dist/code-analyzer/orchestrator/index.d.ts +2 -0
  94. package/dist/code-analyzer/orchestrator/index.d.ts.map +1 -0
  95. package/dist/code-analyzer/orchestrator/index.js +5 -0
  96. package/dist/code-analyzer/orchestrator/index.js.map +1 -0
  97. package/dist/code-analyzer/orchestrator/run-analysis.d.ts +19 -0
  98. package/dist/code-analyzer/orchestrator/run-analysis.d.ts.map +1 -0
  99. package/dist/code-analyzer/orchestrator/run-analysis.js +109 -0
  100. package/dist/code-analyzer/orchestrator/run-analysis.js.map +1 -0
  101. package/dist/code-analyzer/snapshot/index.d.ts +2 -0
  102. package/dist/code-analyzer/snapshot/index.d.ts.map +1 -0
  103. package/dist/code-analyzer/snapshot/index.js +5 -0
  104. package/dist/code-analyzer/snapshot/index.js.map +1 -0
  105. package/dist/code-analyzer/snapshot/write-snapshot.d.ts +17 -0
  106. package/dist/code-analyzer/snapshot/write-snapshot.d.ts.map +1 -0
  107. package/dist/code-analyzer/snapshot/write-snapshot.js +60 -0
  108. package/dist/code-analyzer/snapshot/write-snapshot.js.map +1 -0
  109. package/dist/commands/analyze.d.ts +0 -1
  110. package/dist/commands/analyze.d.ts.map +1 -1
  111. package/dist/commands/analyze.js +25 -5
  112. package/dist/commands/analyze.js.map +1 -1
  113. package/dist/commands/components-import.js +3 -3
  114. package/dist/commands/components-import.js.map +1 -1
  115. package/dist/commands/publish-documentation.d.ts +2 -2
  116. package/dist/commands/run-local-exporter.js +2 -2
  117. package/dist/commands/run-local-exporter.js.map +1 -1
  118. package/dist/commands/storybook-import.d.ts +2 -2
  119. package/dist/commands/template-upload.d.ts +1 -0
  120. package/dist/commands/template-upload.d.ts.map +1 -1
  121. package/dist/commands/template-upload.js +57 -18
  122. package/dist/commands/template-upload.js.map +1 -1
  123. package/dist/docker-scripts/extract-private-packages-tarball.js +282 -0
  124. package/dist/types/config.d.ts +5 -5
  125. package/dist/types/types.js +2 -2
  126. package/dist/types/types.js.map +1 -1
  127. package/dist/utils/analyze-command.d.ts.map +1 -1
  128. package/dist/utils/analyze-command.js +30 -3
  129. package/dist/utils/analyze-command.js.map +1 -1
  130. package/dist/utils/discover.d.ts +2 -2
  131. package/dist/utils/discover.d.ts.map +1 -1
  132. package/dist/utils/discover.js +25 -23
  133. package/dist/utils/discover.js.map +1 -1
  134. package/dist/utils/figma-tokens-data-loader.js +2 -2
  135. package/dist/utils/figma-tokens-data-loader.js.map +1 -1
  136. package/dist/utils/run-exporter/exporter-utils.js +2 -2
  137. package/dist/utils/run-exporter/exporter-utils.js.map +1 -1
  138. package/dist/utils/validate-templates.d.ts +1 -1
  139. package/dist/utils/validate-templates.d.ts.map +1 -1
  140. package/dist/utils/validate-templates.js +4 -4
  141. package/dist/utils/validate-templates.js.map +1 -1
  142. package/oclif.manifest.json +13 -5
  143. package/package.json +8 -3
@@ -1 +1 @@
1
- {"version":3,"file":"run-local-exporter.js","sources":["../../src/commands/run-local-exporter.ts"],"sourceRoot":"","sourcesContent":["//\n// run-exporter.ts\n// Supernova CLI\n//\n// Created by Jiri Trecak.\n// Copyright © Supernova.io. All rights reserved.\n//\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Imports\n\nimport { Flags } from \"@oclif/core\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport pulsarCoreTypes from \"@supernova-studio/pulsar-core\"\n// eslint-disable-next-line n/no-extraneous-import\nimport pulsarLanguageTypes from \"@supernova-studio/pulsar-language\"\nimport axios from \"axios\"\nimport * as fs from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport path from \"node:path\"\n// eslint-disable-next-line no-restricted-imports\nimport { z } from \"zod\"\n\nimport { SentryCommand } from \"../types/index.js\"\nimport { exportConfiguration } from \"../utils/run-exporter/exporter-utils.js\"\nimport { getWritableVersion } from \"../utils/sdk.js\"\n\nconst require = createRequire(import.meta.url)\nconst pulsarCoreProvider = require(\"@supernova-studio/pulsar-core\") as typeof pulsarCoreTypes\nconst pulsarLanguageProvider = require(\"@supernova-studio/pulsar-language\") as typeof pulsarLanguageTypes\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Definition\n\ninterface RunLocalExporterFlags {\n allowOverridingOutput: boolean\n apiKey: string\n brandId?: string\n designSystemId: string\n exporterDir: string\n outputDir: string\n proxyUrl?: string\n themeId?: string\n}\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Configuration\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Tool implementation\n\n/** Command that describes the structure of provided design system */\nexport class RunLocalExporter extends SentryCommand<object> {\n // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n // MARK: - Command configuration\n\n // How this command can be run\n static aliases = [\"run-local-exporter\"]\n // Command help description\n static description = \"Run local exporter package\"\n // Examples how to use the command\n static examples = [\n `$ @supernovaio/cli run-local-exporter \\\n --apiKey=\"[API_KEY]\" \\\n --designSystemId=\"[DESIGN_SYSTEM_ID]\" \\\n --themeId=\"[THEME_ID]\" \\\n --brandId=\"[BRAND_ID]\" \\\n --exporterDir=\"[./path/to/exporter/dir]\" \\\n --outputDir=\"[./path/to/output/dir]\" \\\n --allowOverridingOutput\n `,\n ]\n // Static flags to enable / disable features\n static flags = {\n allowOverridingOutput: Flags.boolean({\n default: false,\n description:\n \"When enabled, CLI will override output in the output directory if same files where present. When disabled, encountering the same file with throw an error.\",\n required: false,\n }),\n apiKey: Flags.string({ description: \"API key to use for accessing Supernova instance\", required: true }),\n brandId: Flags.string({\n description:\n \"Brand to export. Will only be used when exporter has usesBrands: true, but then it is required to be provided\",\n required: false,\n }),\n designSystemId: Flags.string({ description: \"Design System to export from\", required: true }),\n exporterDir: Flags.string({ description: \"Path to exporter package\", required: true }),\n outputDir: Flags.string({\n description: \"Path to output folder. Must be empty, unless `forceClearOutputDir` is set\",\n required: true,\n }),\n proxyUrl: Flags.string({\n description: \"When set, CLI will use provided proxy URL for all requests\",\n hidden: true,\n required: false,\n }),\n themeId: Flags.string({\n description: \"Theme to export. Will only be used when exporter has usesThemes: true, and is optional\",\n required: false,\n }),\n }\n\n get commandId(): string {\n return RunLocalExporter.id\n }\n\n get configSchema() {\n return z.object({})\n }\n\n // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n // MARK: - Command runtime\n\n @SentryTraced()\n async executeExporter(\n flags: RunLocalExporterFlags,\n versionId: string,\n ): Promise<{\n logger: pulsarLanguageTypes.PLLogger\n result: Error | pulsarCoreTypes.PCEngineExporterProcessingResult\n success: boolean\n }> {\n // Log engine\n const logger = new pulsarLanguageProvider.PLLogger()\n\n // Initialize pulsar engine and export\n const pulsarEngine = new pulsarCoreProvider.PCPulsar(pulsarCoreTypes.PCPulsarExporterMode.full, logger)\n try {\n // Load pulsar with local URL\n await pulsarEngine.initiateWithLocalFolderURL(flags.exporterDir, pulsarCoreTypes.PCExporterEnvironment.ci)\n\n // Prepare configuration\n const config = exportConfiguration({\n apiKey: flags.apiKey,\n brandId: flags.brandId,\n dsId: flags.designSystemId,\n environment: this.env,\n exportPath: flags.exporterDir,\n logger,\n proxyUrl: flags.proxyUrl,\n themeId: flags.themeId,\n versionId,\n })\n\n // Set logo overrides\n const result = await pulsarEngine.executeExporter(config, false)\n return {\n logger,\n result,\n success: true,\n }\n } catch (error) {\n // Return error\n return {\n logger,\n result: error as Error,\n success: false,\n }\n }\n }\n\n @SentryTraced()\n async run(): Promise<void> {\n const { flags } = await this.parse(RunLocalExporter)\n\n // Execute exporter\n // Get workspace -> design system –> version\n const { version } = await getWritableVersion(flags)\n const result = await this.executeExporter(flags, version.id)\n\n // Log user logs from the execution\n // Note this is currently not used because console.log is directly routed to the stdout and we have no control over it. Pulsar must be updated before this is doable\n if (flags.log) {\n this.logRun(result.logger)\n }\n\n if (result.success) {\n // Write result to output\n await this.writeToBuildPath(result.result as pulsarCoreTypes.PCEngineExporterProcessingResult, flags)\n this.log(\"Export finished successfully\")\n } else {\n // Catch write error\n this.error(`Export failed: ${(result.result as Error).message}`, {\n code: \"ERR_EXPORT_FAILED\",\n })\n }\n }\n\n /** Download file into memory using Axios */\n @SentryTraced()\n private async downloadFileToMemory(fileUrl: string): Promise<Buffer> {\n const response = await axios({\n method: \"get\",\n responseType: \"arraybuffer\",\n url: fileUrl,\n })\n\n return Buffer.from(response.data)\n }\n\n /** Ensure directory exists - if it doesn't create it, recursively */\n @SentryTraced()\n private ensureDirectoryExists(filePath: string, forceLastFragmentIsDirectory: boolean = false) {\n // If the last fragment of path is forced, even paths without / are treated as dirs\n if (forceLastFragmentIsDirectory && !filePath.endsWith(\"/\")) {\n filePath += \"/\"\n }\n\n // Only make directory if it doesn't exist\n if (fs.existsSync(filePath)) {\n return\n }\n\n fs.mkdirSync(filePath, { recursive: true })\n }\n\n /** Log run to output */\n private logRun(logger: pulsarLanguageTypes.PLLogger) {\n for (const log of logger.logs) {\n let message = log.message.trim()\n if (message.startsWith('\"')) {\n message = message.slice(1)\n }\n\n if (message.endsWith('\"')) {\n message = message.slice(0, Math.max(0, message.length - 1))\n }\n\n console.log(`[user]` + message)\n }\n }\n\n @SentryTraced()\n private async writeToBuildPath(\n result: pulsarCoreTypes.PCEngineExporterProcessingResult,\n flags: RunLocalExporterFlags,\n ) {\n // Create build directory if it doesn't exist, otherwise keep as it is. It should never be deleted!\n if (!fs.existsSync(flags.outputDir)) {\n this.ensureDirectoryExists(flags.outputDir)\n }\n\n // If overriding is disabled, test every possible file and if it exists, throw an error\n if (!flags.allowOverridingOutput) {\n for (const file of result.emittedFiles) {\n const destination = path.join(flags.outputDir, file.path)\n if (fs.existsSync(destination)) {\n throw new Error(\n `Exporter produced file for destination ${destination} but that file already exists. Enable --allowOverridingOutput option to allow overriding`,\n )\n }\n }\n }\n\n // Temporary structure to hold file contents\n const filesToWrite: { content: Buffer | string; filePath: string }[] = []\n\n // Function to process a single file\n const processFile = async (file: pulsarCoreTypes.PCEngineFileDescriptor) => {\n const filePath = path.join(flags.outputDir, ...file.path.split(\"/\"))\n const fileDirectory = path.dirname(filePath)\n this.ensureDirectoryExists(fileDirectory)\n\n switch (file.type) {\n case \"copy_file\": {\n const fileContent = fs.readFileSync(file.content)\n filesToWrite.push({ content: fileContent, filePath })\n\n break\n }\n\n case \"copy_file_remote\": {\n const fileContent = await this.downloadFileToMemory(file.content)\n filesToWrite.push({ content: fileContent, filePath })\n\n break\n }\n\n case \"string\": {\n filesToWrite.push({ content: file.content, filePath })\n\n break\n }\n // No default\n }\n }\n\n // Process all files in chunks to speed up the process\n const chunkSize = 4\n for (let i = 0; i < result.emittedFiles.length; i += chunkSize) {\n const chunk = result.emittedFiles.slice(i, i + chunkSize)\n await Promise.all(chunk.map(file => processFile(file)))\n }\n\n // Write all files from the temporary structure to the filesystem as a final step - this is to avoid partial writes\n for (const { content, filePath } of filesToWrite) {\n fs.writeFileSync(filePath, content)\n }\n }\n}\n"],"names":[],"mappings":"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","debug_id":"6527a13c-6053-52be-afab-5c291afa6669"}
1
+ {"version":3,"file":"run-local-exporter.js","sources":["../../src/commands/run-local-exporter.ts"],"sourceRoot":"","sourcesContent":["//\n// run-exporter.ts\n// Supernova CLI\n//\n// Created by Jiri Trecak.\n// Copyright © Supernova.io. All rights reserved.\n//\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Imports\n\nimport { Flags } from \"@oclif/core\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport pulsarCoreTypes from \"@supernova-studio/pulsar-core\"\n \nimport pulsarLanguageTypes from \"@supernova-studio/pulsar-language\"\nimport axios from \"axios\"\nimport * as fs from \"node:fs\"\nimport { createRequire } from \"node:module\"\nimport path from \"node:path\"\n \nimport { z } from \"zod\"\n\nimport { SentryCommand } from \"../types/index.js\"\nimport { exportConfiguration } from \"../utils/run-exporter/exporter-utils.js\"\nimport { getWritableVersion } from \"../utils/sdk.js\"\n\nconst require = createRequire(import.meta.url)\nconst pulsarCoreProvider = require(\"@supernova-studio/pulsar-core\") as typeof pulsarCoreTypes\nconst pulsarLanguageProvider = require(\"@supernova-studio/pulsar-language\") as typeof pulsarLanguageTypes\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Definition\n\ninterface RunLocalExporterFlags {\n allowOverridingOutput: boolean\n apiKey: string\n brandId?: string\n designSystemId: string\n exporterDir: string\n outputDir: string\n proxyUrl?: string\n themeId?: string\n}\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Configuration\n\n// --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n// MARK: - Tool implementation\n\n/** Command that describes the structure of provided design system */\nexport class RunLocalExporter extends SentryCommand<object> {\n // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n // MARK: - Command configuration\n\n // How this command can be run\n static aliases = [\"run-local-exporter\"]\n // Command help description\n static description = \"Run local exporter package\"\n // Examples how to use the command\n static examples = [\n `$ @supernovaio/cli run-local-exporter \\\n --apiKey=\"[API_KEY]\" \\\n --designSystemId=\"[DESIGN_SYSTEM_ID]\" \\\n --themeId=\"[THEME_ID]\" \\\n --brandId=\"[BRAND_ID]\" \\\n --exporterDir=\"[./path/to/exporter/dir]\" \\\n --outputDir=\"[./path/to/output/dir]\" \\\n --allowOverridingOutput\n `,\n ]\n // Static flags to enable / disable features\n static flags = {\n allowOverridingOutput: Flags.boolean({\n default: false,\n description:\n \"When enabled, CLI will override output in the output directory if same files where present. When disabled, encountering the same file with throw an error.\",\n required: false,\n }),\n apiKey: Flags.string({ description: \"API key to use for accessing Supernova instance\", required: true }),\n brandId: Flags.string({\n description:\n \"Brand to export. Will only be used when exporter has usesBrands: true, but then it is required to be provided\",\n required: false,\n }),\n designSystemId: Flags.string({ description: \"Design System to export from\", required: true }),\n exporterDir: Flags.string({ description: \"Path to exporter package\", required: true }),\n outputDir: Flags.string({\n description: \"Path to output folder. Must be empty, unless `forceClearOutputDir` is set\",\n required: true,\n }),\n proxyUrl: Flags.string({\n description: \"When set, CLI will use provided proxy URL for all requests\",\n hidden: true,\n required: false,\n }),\n themeId: Flags.string({\n description: \"Theme to export. Will only be used when exporter has usesThemes: true, and is optional\",\n required: false,\n }),\n }\n\n get commandId(): string {\n return RunLocalExporter.id\n }\n\n get configSchema() {\n return z.object({})\n }\n\n // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---\n // MARK: - Command runtime\n\n @SentryTraced()\n async executeExporter(\n flags: RunLocalExporterFlags,\n versionId: string,\n ): Promise<{\n logger: pulsarLanguageTypes.PLLogger\n result: Error | pulsarCoreTypes.PCEngineExporterProcessingResult\n success: boolean\n }> {\n // Log engine\n const logger = new pulsarLanguageProvider.PLLogger()\n\n // Initialize pulsar engine and export\n const pulsarEngine = new pulsarCoreProvider.PCPulsar(pulsarCoreTypes.PCPulsarExporterMode.full, logger)\n try {\n // Load pulsar with local URL\n await pulsarEngine.initiateWithLocalFolderURL(flags.exporterDir, pulsarCoreTypes.PCExporterEnvironment.ci)\n\n // Prepare configuration\n const config = exportConfiguration({\n apiKey: flags.apiKey,\n brandId: flags.brandId,\n dsId: flags.designSystemId,\n environment: this.env,\n exportPath: flags.exporterDir,\n logger,\n proxyUrl: flags.proxyUrl,\n themeId: flags.themeId,\n versionId,\n })\n\n // Set logo overrides\n const result = await pulsarEngine.executeExporter(config, false)\n return {\n logger,\n result,\n success: true,\n }\n } catch (error) {\n // Return error\n return {\n logger,\n result: error as Error,\n success: false,\n }\n }\n }\n\n @SentryTraced()\n async run(): Promise<void> {\n const { flags } = await this.parse(RunLocalExporter)\n\n // Execute exporter\n // Get workspace -> design system –> version\n const { version } = await getWritableVersion(flags)\n const result = await this.executeExporter(flags, version.id)\n\n // Log user logs from the execution\n // Note this is currently not used because console.log is directly routed to the stdout and we have no control over it. Pulsar must be updated before this is doable\n if (flags.log) {\n this.logRun(result.logger)\n }\n\n if (result.success) {\n // Write result to output\n await this.writeToBuildPath(result.result as pulsarCoreTypes.PCEngineExporterProcessingResult, flags)\n this.log(\"Export finished successfully\")\n } else {\n // Catch write error\n this.error(`Export failed: ${(result.result as Error).message}`, {\n code: \"ERR_EXPORT_FAILED\",\n })\n }\n }\n\n /** Download file into memory using Axios */\n @SentryTraced()\n private async downloadFileToMemory(fileUrl: string): Promise<Buffer> {\n const response = await axios({\n method: \"get\",\n responseType: \"arraybuffer\",\n url: fileUrl,\n })\n\n return Buffer.from(response.data)\n }\n\n /** Ensure directory exists - if it doesn't create it, recursively */\n @SentryTraced()\n private ensureDirectoryExists(filePath: string, forceLastFragmentIsDirectory: boolean = false) {\n // If the last fragment of path is forced, even paths without / are treated as dirs\n if (forceLastFragmentIsDirectory && !filePath.endsWith(\"/\")) {\n filePath += \"/\"\n }\n\n // Only make directory if it doesn't exist\n if (fs.existsSync(filePath)) {\n return\n }\n\n fs.mkdirSync(filePath, { recursive: true })\n }\n\n /** Log run to output */\n private logRun(logger: pulsarLanguageTypes.PLLogger) {\n for (const log of logger.logs) {\n let message = log.message.trim()\n if (message.startsWith('\"')) {\n message = message.slice(1)\n }\n\n if (message.endsWith('\"')) {\n message = message.slice(0, Math.max(0, message.length - 1))\n }\n\n console.log(`[user]` + message)\n }\n }\n\n @SentryTraced()\n private async writeToBuildPath(\n result: pulsarCoreTypes.PCEngineExporterProcessingResult,\n flags: RunLocalExporterFlags,\n ) {\n // Create build directory if it doesn't exist, otherwise keep as it is. It should never be deleted!\n if (!fs.existsSync(flags.outputDir)) {\n this.ensureDirectoryExists(flags.outputDir)\n }\n\n // If overriding is disabled, test every possible file and if it exists, throw an error\n if (!flags.allowOverridingOutput) {\n for (const file of result.emittedFiles) {\n const destination = path.join(flags.outputDir, file.path)\n if (fs.existsSync(destination)) {\n throw new Error(\n `Exporter produced file for destination ${destination} but that file already exists. Enable --allowOverridingOutput option to allow overriding`,\n )\n }\n }\n }\n\n // Temporary structure to hold file contents\n const filesToWrite: { content: Buffer | string; filePath: string }[] = []\n\n // Function to process a single file\n const processFile = async (file: pulsarCoreTypes.PCEngineFileDescriptor) => {\n const filePath = path.join(flags.outputDir, ...file.path.split(\"/\"))\n const fileDirectory = path.dirname(filePath)\n this.ensureDirectoryExists(fileDirectory)\n\n switch (file.type) {\n case \"copy_file\": {\n const fileContent = fs.readFileSync(file.content)\n filesToWrite.push({ content: fileContent, filePath })\n\n break\n }\n\n case \"copy_file_remote\": {\n const fileContent = await this.downloadFileToMemory(file.content)\n filesToWrite.push({ content: fileContent, filePath })\n\n break\n }\n\n case \"string\": {\n filesToWrite.push({ content: file.content, filePath })\n\n break\n }\n // No default\n }\n }\n\n // Process all files in chunks to speed up the process\n const chunkSize = 4\n for (let i = 0; i < result.emittedFiles.length; i += chunkSize) {\n const chunk = result.emittedFiles.slice(i, i + chunkSize)\n await Promise.all(chunk.map(file => processFile(file)))\n }\n\n // Write all files from the temporary structure to the filesystem as a final step - this is to avoid partial writes\n for (const { content, filePath } of filesToWrite) {\n fs.writeFileSync(filePath, content)\n }\n }\n}\n"],"names":[],"mappings":"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","debug_id":"7748230d-2c61-5564-8be1-3d3f1df02a86"}
@@ -8,17 +8,17 @@ declare const ImportStorybookConfig: z.ZodObject<{
8
8
  sourceId: z.ZodOptional<z.ZodString>;
9
9
  publicAccess: z.ZodOptional<z.ZodBoolean>;
10
10
  }, "strip", z.ZodTypeAny, {
11
+ name?: string | undefined;
11
12
  designSystemId?: string | undefined;
12
13
  sourceId?: string | undefined;
13
14
  brandId?: string | undefined;
14
- name?: string | undefined;
15
15
  from?: string | undefined;
16
16
  publicAccess?: boolean | undefined;
17
17
  }, {
18
+ name?: string | undefined;
18
19
  designSystemId?: string | undefined;
19
20
  sourceId?: string | undefined;
20
21
  brandId?: string | undefined;
21
- name?: string | undefined;
22
22
  from?: string | undefined;
23
23
  publicAccess?: boolean | undefined;
24
24
  }>;
@@ -13,6 +13,7 @@ export default class TemplateUpload extends SentryCommand<TemplateUploadConfig>
13
13
  force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
14
  npmToken: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
15
  discover: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ tarball: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
17
  debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
18
  };
18
19
  get commandId(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"template-upload.d.ts","sourceRoot":"","sources":["../../src/commands/template-upload.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAIhC,OAAO,EAAe,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAc9D,QAAA,MAAM,oBAAoB,gDAAe,CAAA;AAEzC,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAahE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAC7E,OAAgB,IAAI,KAAK;IACzB,OAAgB,WAAW,SAAqD;IAChF,OAAgB,QAAQ,WAA0D;IAClF,OAAgB,MAAM,EAAE,OAAO,CAAQ;IACvC,OAAgB,KAAK;;;;;;;MA4BpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;IAGY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA8FnB,oBAAoB;IAMlC,OAAO,CAAC,cAAc;YAIR,cAAc;YAId,kBAAkB;YAclB,gBAAgB;YAyBhB,eAAe;YAkBf,mBAAmB;YA0BnB,iCAAiC;CA8FhD"}
1
+ {"version":3,"file":"template-upload.d.ts","sourceRoot":"","sources":["../../src/commands/template-upload.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAIhC,OAAO,EAAe,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAc9D,QAAA,MAAM,oBAAoB,gDAAe,CAAA;AAEzC,KAAK,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AA0BhE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAC7E,OAAgB,IAAI,KAAK;IACzB,OAAgB,WAAW,SAAqD;IAChF,OAAgB,QAAQ,WAA0D;IAClF,OAAgB,MAAM,EAAE,OAAO,CAAQ;IACvC,OAAgB,KAAK;;;;;;;;MAgCpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAEhD;IAGY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YA8GnB,oBAAoB;IAMlC,OAAO,CAAC,cAAc;YAIR,cAAc;YAId,kBAAkB;YAclB,gBAAgB;YA+BhB,eAAe;YAkBf,mBAAmB;YA0BnB,iCAAiC;CA4FhD"}
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b80a82ae-3a40-5488-a3cf-4d8210ab28a6")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="84a19802-6890-54fa-9a50-d82741f529e8")}catch(e){}}();
3
3
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
4
4
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5
5
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -17,6 +17,7 @@ import { exec as execCallback } from "node:child_process";
17
17
  import * as fs from "node:fs/promises";
18
18
  import path from "node:path";
19
19
  import { promisify } from "node:util";
20
+ import { fileURLToPath } from "node:url";
20
21
  import { z } from "zod";
21
22
  import fsx from "fs-extra";
22
23
  import crypto from "node:crypto";
@@ -24,10 +25,10 @@ import { commonFlags, SentryCommand } from "../types/index.js";
24
25
  import { sleep } from "../utils/common.js";
25
26
  import { tmpdir } from "node:os";
26
27
  import { discoverAndUpdatePackageJson, discoverFilesForTemplates } from "../utils/discover.js";
27
- import { validateTemplates, fileExists } from "../utils/validate-templates.js";
28
+ import { fileExists, validateTemplates } from "../utils/validate-templates.js";
28
29
  const exec = promisify(execCallback);
29
30
  const TemplateUploadConfig = z.object({});
30
- const dockerfileTemplate = `
31
+ const dockerfileTemplateLegacy = `
31
32
  FROM node:22-slim
32
33
 
33
34
  RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*
@@ -38,6 +39,18 @@ COPY . .
38
39
  RUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc
39
40
  RUN node docker-scripts/extract-private-packages.js
40
41
  `;
42
+ const dockerfileTemplateTarball = `
43
+ FROM node:22-slim
44
+
45
+ RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*
46
+
47
+ WORKDIR /home/user
48
+
49
+ COPY . .
50
+ RUN {{ npmTokenSecretMount }} npm i
51
+ RUN node docker-scripts/extract-private-packages-tarball.js
52
+ RUN if [ -f .npmrc ]; then truncate -s 0 .npmrc; fi && if [ -f .supernova-private-deps-rewritten ]; then npm i; fi
53
+ `;
41
54
  export default class TemplateUpload extends SentryCommand {
42
55
  static args = {};
43
56
  static description = "Upload component container template to Supernova";
@@ -64,6 +77,10 @@ export default class TemplateUpload extends SentryCommand {
64
77
  description: "Run template and pattern discovery before upload to update package.json",
65
78
  required: false,
66
79
  }),
80
+ tarball: Flags.boolean({
81
+ description: "Use tarball-based private dependency bundling flow (experimental)",
82
+ required: false,
83
+ }),
67
84
  debug: Flags.boolean({
68
85
  description: "Preserve shell directory and App.tsx on template build failures for debugging",
69
86
  required: false,
@@ -116,6 +133,17 @@ export default class TemplateUpload extends SentryCommand {
116
133
  }
117
134
  if (pkg.supernova?.privateDependencies) {
118
135
  this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`);
136
+ const hasWildcardPrivateDependency = pkg.supernova.privateDependencies.some(dependency => isPrivateDependencyScopePattern(dependency));
137
+ if (hasWildcardPrivateDependency && !flags.tarball) {
138
+ this.error(`Wildcard privateDependencies entries (e.g. "@scope/*") require --tarball mode`);
139
+ }
140
+ if (!flags.tarball) {
141
+ for (const dependency of pkg.supernova.privateDependencies) {
142
+ if (!pkg.dependencies[dependency]) {
143
+ this.error(`Private dependency ${dependency} is not listed in 'dependencies'`);
144
+ }
145
+ }
146
+ }
119
147
  if (!(await fileExists(path.join(process.cwd(), ".npmrc")))) {
120
148
  this.error(`CLI needs private NPM registry access to be able to bundle private dependencies.\n` +
121
149
  `Please provide .npmrc file in the root directory and include neccessary access tokens.`);
@@ -144,7 +172,7 @@ export default class TemplateUpload extends SentryCommand {
144
172
  const buildDir = await this.createBuildDir();
145
173
  try {
146
174
  await this.prepareBuildFolder(buildDir);
147
- await this.buildDockerImage(buildDir, url, flags.npmToken);
175
+ await this.buildDockerImage(buildDir, url, flags.npmToken, flags.tarball ?? false);
148
176
  await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url);
149
177
  await this.remoteTemplateBuild(apiClient, buildData.build.id);
150
178
  this.log(`✅ Template has been successfully uploaded`);
@@ -170,15 +198,16 @@ export default class TemplateUpload extends SentryCommand {
170
198
  return !src.includes("node_modules/") && !src.includes(".git/") && !src.includes(".out/");
171
199
  },
172
200
  });
173
- const cliSrcPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
201
+ const cliSrcPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
174
202
  await fsx.copy(path.join(cliSrcPath, "docker-scripts"), path.join(buildDir, "docker-scripts"));
175
203
  }
176
- async buildDockerImage(buildDir, imageUrl, npmToken) {
204
+ async buildDockerImage(buildDir, imageUrl, npmToken, useTarballPrivateDeps) {
177
205
  action.start("🔨 Building docker image");
178
206
  let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`;
179
207
  if (npmToken)
180
208
  cmd += ` --secret id=NPM_TOKEN`;
181
209
  cmd += " -f - .";
210
+ const dockerfileTemplate = useTarballPrivateDeps ? dockerfileTemplateTarball : dockerfileTemplateLegacy;
182
211
  const dockerfile = dockerfileTemplate.replace("{{ npmTokenSecretMount }}", npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN="$(cat /run/secrets/NPM_TOKEN)"` : "");
183
212
  const subprocess = exec(cmd, {
184
213
  env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,
@@ -273,15 +302,13 @@ export default class TemplateUpload extends SentryCommand {
273
302
  }
274
303
  const message = thumbnailFiles.length > 0 ? `uploaded ${thumbnailFiles.length} thumbnail(s)` : "no thumbnails to upload";
275
304
  action.stop(message);
276
- const templatesWithUrls = Object.entries(templates).map(([id, template]) => {
277
- return {
278
- id,
279
- name: template.name,
280
- description: template.description,
281
- thumbnailUrl: thumbnailUrlMap[id],
282
- files: template.files,
283
- };
284
- });
305
+ const templatesWithUrls = Object.entries(templates).map(([id, template]) => ({
306
+ id,
307
+ name: template.name,
308
+ description: template.description,
309
+ thumbnailUrl: thumbnailUrlMap[id],
310
+ files: template.files,
311
+ }));
285
312
  return templatesWithUrls;
286
313
  }
287
314
  }
@@ -313,13 +340,25 @@ async function readPackageJson() {
313
340
  if (typeof d !== "string") {
314
341
  throw new TypeError(`supernova.privateDependencies[${i}] must be a string`);
315
342
  }
316
- if (!pkg.dependencies[d]) {
317
- throw new Error(`Private dependency ${d} is not listed in 'dependencies'`);
343
+ if (!isValidPrivateDependencyEntry(d)) {
344
+ throw new TypeError(`supernova.privateDependencies[${i}] must be a package name or scope wildcard like "@example/*"`);
318
345
  }
319
346
  }
320
347
  }
321
348
  return pkg;
322
349
  }
350
+ function isPrivateDependencyScopePattern(entry) {
351
+ return entry.endsWith("/*");
352
+ }
353
+ function isValidPrivateDependencyEntry(entry) {
354
+ if (!entry || entry.includes(" "))
355
+ return false;
356
+ if (isPrivateDependencyScopePattern(entry)) {
357
+ const scope = entry.slice(0, -2);
358
+ return scope.startsWith("@") && !scope.includes("/");
359
+ }
360
+ return true;
361
+ }
323
362
  function imageUrl(build) {
324
363
  return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`;
325
364
  }
@@ -381,4 +420,4 @@ async function getFileSize(filePath) {
381
420
  return stats.size;
382
421
  }
383
422
  //# sourceMappingURL=template-upload.js.map
384
- //# debugId=b80a82ae-3a40-5488-a3cf-4d8210ab28a6
423
+ //# debugId=84a19802-6890-54fa-9a50-d82741f529e8
@@ -1 +1 @@
1
- {"version":3,"file":"template-upload.js","sources":["../../src/commands/template-upload.ts"],"sourceRoot":"","sourcesContent":["import fetch from \"node-fetch\"\nimport { Flags } from \"@oclif/core\"\nimport { action } from \"@oclif/core/ux\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport { exec as execCallback } from \"node:child_process\"\nimport * as fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { z, ZodType } from \"zod\"\nimport fsx from \"fs-extra\"\nimport crypto from \"node:crypto\"\n\nimport { commonFlags, SentryCommand } from \"../types/index.js\"\n\nimport {\n DTOSandboxTemplateBuildCreateResponse,\n DTOSandboxTemplateBuildCreateInput,\n SupernovaApiClient,\n} from \"@supernova-studio/client\"\nimport { sleep } from \"../utils/common.js\"\nimport { tmpdir } from \"node:os\"\nimport { discoverAndUpdatePackageJson, discoverFilesForTemplates } from \"../utils/discover.js\"\nimport { validateTemplates, fileExists, TemplatePreset } from \"../utils/validate-templates.js\"\n\nconst exec = promisify(execCallback)\n\nconst TemplateUploadConfig = z.object({})\n\ntype TemplateUploadConfig = z.infer<typeof TemplateUploadConfig>\n\nconst dockerfileTemplate = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc\nRUN node docker-scripts/extract-private-packages.js\n`\nexport default class TemplateUpload extends SentryCommand<TemplateUploadConfig> {\n static override args = {}\n static override description = \"Upload component container template to Supernova\"\n static override examples = [\"<%= config.bin %> <%= command.id %> TemplateUpload \"]\n static override hidden: boolean = false\n static override flags = {\n ...commonFlags,\n workspaceId: Flags.string({ char: \"w\", description: \"Workspace ID to upload the template to\", required: false }),\n designSystemId: Flags.string({\n char: \"d\",\n description: \"Design system ID to upload the template to\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description:\n \"Allows overwriting already published version of this template if it exists. This flag has no effect on new versions.\",\n required: false,\n }),\n npmToken: Flags.string({\n description:\n \"Allows passing NPM token as a Docker secret. The token will be available as a NPM_TOKEN env variable\",\n required: false,\n }),\n discover: Flags.boolean({\n description: \"Run template and pattern discovery before upload to update package.json\",\n required: false,\n }),\n debug: Flags.boolean({\n description: \"Preserve shell directory and App.tsx on template build failures for debugging\",\n required: false,\n hidden: true,\n }),\n }\n\n get commandId(): string {\n return TemplateUpload.id\n }\n\n get configSchema(): ZodType<TemplateUploadConfig> {\n return TemplateUploadConfig\n }\n\n @SentryTraced()\n public async run(): Promise<void> {\n const apiClient = await this.apiClient()\n const { flags } = await this.parse()\n\n // Update package.json with discovered names/descriptions if requested\n if (flags.discover) {\n action.start(\"🔍 Running template and pattern discovery\")\n try {\n const { templates, patterns } = await discoverAndUpdatePackageJson(process.cwd())\n action.stop(`found ${Object.keys(templates).length} templates, ${Object.keys(patterns).length} patterns`)\n } catch (error) {\n action.stop(\"failed\")\n if (error instanceof Error) this.error(`Discovery failed: ${error.message}`)\n else throw error\n }\n }\n\n // Check if this is discover-only mode\n const isDiscoverOnly = flags.discover && !flags.workspaceId && !flags.designSystemId\n\n if (isDiscoverOnly) {\n this.log(\"✅ Discovery completed. Use --workspaceId and --designSystemId to upload templates.\")\n return\n }\n\n // Validate required flags for upload\n if (!flags.workspaceId) {\n this.error(\"Missing required flag workspaceId\")\n }\n if (!flags.designSystemId) {\n this.error(\"Missing required flag designSystemId\")\n }\n\n // Read package json\n let pkg\n try {\n pkg = await readPackageJson()\n } catch (error) {\n if (error instanceof Error) this.error(`Failed to read or parse package.json: ${error.message}`)\n else throw error\n }\n\n if (pkg.supernova?.privateDependencies) {\n this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`)\n\n if (!(await fileExists(path.join(process.cwd(), \".npmrc\")))) {\n this.error(\n `CLI needs private NPM registry access to be able to bundle private dependencies.\\n` +\n `Please provide .npmrc file in the root directory and include neccessary access tokens.`,\n )\n }\n } else {\n this.warn(`package.json doesn't contain 'supernova.privateDependencies' declaration.`)\n this.warn(`Dependencies coming from private registries will fail`)\n }\n\n let templatesWithThumbnailUrls: DTOSandboxTemplateBuildCreateInput[\"templates\"] | undefined\n\n if (pkg.supernova?.templates) {\n // Always enrich templates from package.json with discovered files/thumbnails info on the fly\n const templates = await discoverFilesForTemplates(pkg.supernova.templates, process.cwd())\n\n await validateTemplates(templates, this, flags.debug)\n templatesWithThumbnailUrls = await this.uploadThumbnailsAndBuildTemplates(apiClient, flags.workspaceId, templates)\n }\n\n // Request build\n const buildData = await apiClient.sandboxes.builds.start({\n workspaceId: flags.workspaceId,\n designSystemId: flags.designSystemId,\n name: pkg.name,\n version: pkg.version,\n isExistingVersionUpdateAllowed: flags.force ?? false,\n templates: templatesWithThumbnailUrls,\n })\n\n // Build image\n const url = imageUrl(buildData)\n\n await this.validateDockerDaemon()\n const buildDir = await this.createBuildDir()\n\n try {\n await this.prepareBuildFolder(buildDir)\n await this.buildDockerImage(buildDir, url, flags.npmToken)\n await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url)\n await this.remoteTemplateBuild(apiClient, buildData.build.id)\n\n this.log(`✅ Template has been successfully uploaded`)\n } finally {\n await this.deleteBuildDir(buildDir)\n }\n }\n\n private async validateDockerDaemon() {\n await exec(\"docker info\").catch(() => {\n this.error(`Docker is not available, please start docker daemon and try again`)\n })\n }\n\n private createBuildDir(): Promise<string> {\n return fs.mkdtemp(path.join(tmpdir(), \"supernova-template-bundle-\"))\n }\n\n private async deleteBuildDir(buildDir: string) {\n await fs.rm(buildDir, { recursive: true, force: true })\n }\n\n private async prepareBuildFolder(buildDir: string) {\n // Move working directory to temp folder from where it will be built\n await fsx.copy(process.cwd(), buildDir, {\n filter(src) {\n return !src.includes(\"node_modules/\") && !src.includes(\".git/\") && !src.includes(\".out/\")\n },\n })\n\n // Inject Supernova scripts\n const cliSrcPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), \"..\")\n\n await fsx.copy(path.join(cliSrcPath, \"docker-scripts\"), path.join(buildDir, \"docker-scripts\"))\n }\n\n private async buildDockerImage(buildDir: string, imageUrl: string, npmToken: string | undefined) {\n action.start(\"🔨 Building docker image\")\n\n let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`\n if (npmToken) cmd += ` --secret id=NPM_TOKEN`\n cmd += \" -f - .\"\n\n const dockerfile = dockerfileTemplate.replace(\n \"{{ npmTokenSecretMount }}\",\n npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN=\"$(cat /run/secrets/NPM_TOKEN)\"` : \"\",\n )\n\n const subprocess = exec(cmd, {\n env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,\n cwd: buildDir,\n })\n\n subprocess.child.stdin!.write(dockerfile)\n subprocess.child.stdin!.end()\n\n await subprocess\n\n action.stop(\"done\")\n }\n\n private async pushDockerImage(buildDir: string, dockerHost: string, imageUrl: string) {\n const response = await fetch(`https://${dockerHost}/v2/`)\n if (response.status === 401) {\n // Requires auth\n const { accessToken } = (await this.apiClient()).config\n const loginProcess = exec(`docker login ${dockerHost} -u cli --password-stdin`)\n loginProcess.child.stdin!.write(accessToken)\n loginProcess.child.stdin!.end()\n await loginProcess\n }\n\n action.start(\"⬆️ Uploading docker image to Supernova\")\n await exec(`docker push ${imageUrl}`, {\n cwd: buildDir,\n })\n action.stop(\"done\")\n }\n\n private async remoteTemplateBuild(client: SupernovaApiClient, buildId: string) {\n action.start(\"📦 Creating template with the image\")\n\n // Trigger remote build phase\n await client.sandboxes.builds.finalize(buildId)\n\n // Poll every 2 seconds for roughly 5 minutes\n const pollIntervalMs = 2000\n const timeoutMs = 5 * 60 * 1000\n\n const startTime = Date.now()\n\n let build\n do {\n await sleep(pollIntervalMs)\n build = (await client.sandboxes.builds.get(buildId)).build\n } while (build.state === \"Building\" && Date.now() - startTime < timeoutMs)\n\n // Verify build state\n if (build.state !== \"Success\") {\n this.error(`Template creation failed`)\n }\n\n action.stop(\"done\")\n }\n\n private async uploadThumbnailsAndBuildTemplates(\n apiClient: SupernovaApiClient,\n workspaceId: string,\n templates: { [key: string]: TemplatePreset },\n ): Promise<DTOSandboxTemplateBuildCreateInput[\"templates\"]> {\n // Validate template names are unique\n const templateNames = Object.values(templates).map(t => t.name)\n const duplicateNames = templateNames.filter((name, index) => templateNames.indexOf(name) !== index)\n if (duplicateNames.length > 0) {\n throw new Error(\n `Duplicate template names found: ${[...new Set(duplicateNames)].join(\", \")}. Each template must have a unique name.`,\n )\n }\n\n const templateCount = Object.keys(templates).length\n action.start(`📸 Processing ${templateCount} template(s)`)\n\n const thumbnailFiles: Array<{\n name: string\n size: number\n checksum: string\n originalPath: string\n templateId: string\n }> = []\n\n // Validate thumbnail files\n for (const [templateId, template] of Object.entries(templates)) {\n if (!template.thumbnail) continue\n\n const validation = await validateThumbnailFile(templateId, template.thumbnail, this)\n if (!validation) continue\n\n try {\n const checksum = await calculateFileChecksum(validation.fullPath)\n thumbnailFiles.push({\n name: validation.name,\n size: validation.size,\n checksum,\n originalPath: validation.fullPath,\n templateId,\n })\n } catch (error) {\n this.warn(\n `Failed to calculate checksum for ${validation.fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n )\n continue\n }\n }\n\n let thumbnailUrlMap: { [templateId: string]: string } = {}\n\n if (thumbnailFiles.length > 0) {\n try {\n // Request upload URLs from API\n const uploadResponse = await apiClient.files.upload({\n ownerType: \"Workspace\",\n workspaceId,\n files: thumbnailFiles.map(({ name, size, checksum }) => ({ name, size, checksum })),\n })\n\n // Upload files to signed URLs\n await uploadFilesToUrls(uploadResponse.uploadUrls, uploadResponse.files, thumbnailFiles)\n\n await apiClient.files.finalizeUpload({\n ownerType: \"Workspace\",\n workspaceId,\n fileIds: uploadResponse.uploadUrls.map(f => f.fileId),\n })\n\n // Map template IDs to their uploaded thumbnail URLs\n thumbnailUrlMap = buildTemplateUrlMap(thumbnailFiles, uploadResponse.files)\n } catch (error) {\n this.warn(`Failed to upload thumbnails: ${error instanceof Error ? error.message : String(error)}`)\n this.warn(\"Continuing without uploaded thumbnails...\")\n // Don't error out completely, just continue without uploaded thumbnails\n }\n }\n\n const message =\n thumbnailFiles.length > 0 ? `uploaded ${thumbnailFiles.length} thumbnail(s)` : \"no thumbnails to upload\"\n action.stop(message)\n\n const templatesWithUrls = Object.entries(templates).map(([id, template]) => {\n return {\n id,\n name: template.name,\n description: template.description,\n thumbnailUrl: thumbnailUrlMap[id],\n files: template.files,\n }\n })\n\n return templatesWithUrls\n }\n}\n\ntype PackageJson = {\n name: string\n version: string\n dependencies: Record<string, string>\n supernova:\n | {\n privateDependencies: string[] | undefined\n templates?: {\n [key: string]: TemplatePreset\n }\n }\n | undefined\n}\n\nasync function readPackageJson(): Promise<PackageJson> {\n const pkgPath = path.join(process.cwd(), \"package.json\")\n\n if (!(await fileExists(pkgPath))) throw new Error(`package.json file was not found in the current directory`)\n\n const raw = await fs.readFile(pkgPath, \"utf8\")\n const pkg = JSON.parse(raw)\n\n if (typeof pkg !== \"object\" || pkg === null) throw new Error(`Error parsing package.json: not a json`)\n\n if (typeof pkg.name !== \"string\") throw new Error(`Error parsing package.json: 'name' must be defined`)\n if (typeof pkg.version !== \"string\") throw new Error(`Error parsing package.json: 'version' must be defined`)\n if (typeof pkg.dependencies !== \"object\" || pkg.dependencies === null)\n throw new Error(`Error parsing package.json: 'dependencies' must be defined`)\n\n if (pkg.supernova?.privateDependencies) {\n const privateDependencies = pkg.supernova?.privateDependencies\n if (!Array.isArray(privateDependencies)) throw new TypeError(`supernova.privateDependencies must be an array`)\n\n for (const [i, d] of privateDependencies.entries()) {\n if (typeof d !== \"string\") {\n throw new TypeError(`supernova.privateDependencies[${i}] must be a string`)\n }\n\n if (!pkg.dependencies[d]) {\n throw new Error(`Private dependency ${d} is not listed in 'dependencies'`)\n }\n }\n }\n\n return pkg\n}\n\nfunction imageUrl(build: DTOSandboxTemplateBuildCreateResponse) {\n return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`\n}\n\nasync function validateThumbnailFile(\n templateId: string,\n thumbnailPath: string,\n logger: { warn: (msg: string) => void },\n): Promise<{ name: string; size: number; fullPath: string } | undefined> {\n const allowedExtensions = [\".png\", \".jpg\", \".jpeg\", \".svg\", \".webp\"]\n const maxFileSize = 10 * 1024 * 1024 // 10 MB in bytes\n\n const fullPath = path.resolve(thumbnailPath)\n const name = path.basename(thumbnailPath)\n\n if (!(await fileExists(fullPath))) {\n logger.warn(`Thumbnail file not found for template ${templateId}: ${thumbnailPath}`)\n return undefined\n }\n\n const extension = path.extname(thumbnailPath).toLowerCase()\n if (!allowedExtensions.includes(extension)) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} has unsupported format. Allowed formats: ${allowedExtensions.join(\", \")}`,\n )\n return undefined\n }\n\n const size = await getFileSize(fullPath)\n if (size > maxFileSize) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} is too large (${(size / 1024 / 1024).toFixed(2)}MB). Maximum size is 10MB.`,\n )\n return undefined\n }\n\n return { name, size, fullPath }\n}\n\nasync function uploadFilesToUrls(\n uploadUrls: Array<{ fileId: string; uploadUrl: string }>,\n fileResponses: Array<{ id: string; name: string; size: number }>,\n thumbnailFiles: Array<{ name: string; size: number; originalPath: string; templateId: string }>,\n): Promise<void> {\n const uploadTasks = uploadUrls.map(async uploadUrl => {\n const fileResponse = fileResponses.find(f => f.id === uploadUrl.fileId)\n const thumbnailFile = thumbnailFiles.find(f => f.name === fileResponse?.name && f.size === fileResponse?.size)\n\n if (thumbnailFile) {\n const fileBuffer = await fs.readFile(thumbnailFile.originalPath)\n await fetch(uploadUrl.uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n })\n }\n })\n\n await Promise.all(uploadTasks)\n}\n\nfunction buildTemplateUrlMap(\n thumbnailFiles: Array<{ templateId: string; checksum: string }>,\n fileResponses: Array<{ url: string; deduplicationKey: string }>,\n): { [templateId: string]: string } {\n const thumbnailUrlMap: { [templateId: string]: string } = {}\n\n for (const thumbnailFile of thumbnailFiles) {\n const fileResponse = fileResponses.find(f => f.deduplicationKey === thumbnailFile.checksum)\n if (fileResponse) {\n thumbnailUrlMap[thumbnailFile.templateId] = fileResponse.url\n }\n }\n\n return thumbnailUrlMap\n}\n\nasync function calculateFileChecksum(filePath: string): Promise<string> {\n const fileBuffer = await fs.readFile(filePath)\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", fileBuffer)\n return Buffer.from(hashBuffer).toString(\"hex\")\n}\n\nasync function getFileSize(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return stats.size\n}\n"],"names":[],"mappings":"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","debug_id":"b80a82ae-3a40-5488-a3cf-4d8210ab28a6"}
1
+ {"version":3,"file":"template-upload.js","sources":["../../src/commands/template-upload.ts"],"sourceRoot":"","sourcesContent":["import fetch from \"node-fetch\"\nimport { Flags } from \"@oclif/core\"\nimport { action } from \"@oclif/core/ux\"\nimport { SentryTraced } from \"@sentry/nestjs\"\nimport { exec as execCallback } from \"node:child_process\"\nimport * as fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { fileURLToPath } from \"node:url\"\nimport { z, ZodType } from \"zod\"\nimport fsx from \"fs-extra\"\nimport crypto from \"node:crypto\"\n\nimport { commonFlags, SentryCommand } from \"../types/index.js\"\n\nimport {\n DTOSandboxTemplateBuildCreateInput,\n DTOSandboxTemplateBuildCreateResponse,\n SupernovaApiClient,\n} from \"@supernova-studio/client\"\nimport { sleep } from \"../utils/common.js\"\nimport { tmpdir } from \"node:os\"\nimport { discoverAndUpdatePackageJson, discoverFilesForTemplates } from \"../utils/discover.js\"\nimport { fileExists, TemplatePreset, validateTemplates } from \"../utils/validate-templates.js\"\n\nconst exec = promisify(execCallback)\n\nconst TemplateUploadConfig = z.object({})\n\ntype TemplateUploadConfig = z.infer<typeof TemplateUploadConfig>\n\nconst dockerfileTemplateLegacy = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i && truncate -s 0 .npmrc\nRUN node docker-scripts/extract-private-packages.js\n`\n\nconst dockerfileTemplateTarball = `\nFROM node:22-slim\n\nRUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /home/user\n\nCOPY . .\nRUN {{ npmTokenSecretMount }} npm i\nRUN node docker-scripts/extract-private-packages-tarball.js\nRUN if [ -f .npmrc ]; then truncate -s 0 .npmrc; fi && if [ -f .supernova-private-deps-rewritten ]; then npm i; fi\n`\nexport default class TemplateUpload extends SentryCommand<TemplateUploadConfig> {\n static override args = {}\n static override description = \"Upload component container template to Supernova\"\n static override examples = [\"<%= config.bin %> <%= command.id %> TemplateUpload \"]\n static override hidden: boolean = false\n static override flags = {\n ...commonFlags,\n workspaceId: Flags.string({ char: \"w\", description: \"Workspace ID to upload the template to\", required: false }),\n designSystemId: Flags.string({\n char: \"d\",\n description: \"Design system ID to upload the template to\",\n required: false,\n }),\n force: Flags.boolean({\n char: \"f\",\n description:\n \"Allows overwriting already published version of this template if it exists. This flag has no effect on new versions.\",\n required: false,\n }),\n npmToken: Flags.string({\n description:\n \"Allows passing NPM token as a Docker secret. The token will be available as a NPM_TOKEN env variable\",\n required: false,\n }),\n discover: Flags.boolean({\n description: \"Run template and pattern discovery before upload to update package.json\",\n required: false,\n }),\n tarball: Flags.boolean({\n description: \"Use tarball-based private dependency bundling flow (experimental)\",\n required: false,\n }),\n debug: Flags.boolean({\n description: \"Preserve shell directory and App.tsx on template build failures for debugging\",\n required: false,\n hidden: true,\n }),\n }\n\n get commandId(): string {\n return TemplateUpload.id\n }\n\n get configSchema(): ZodType<TemplateUploadConfig> {\n return TemplateUploadConfig\n }\n\n @SentryTraced()\n public async run(): Promise<void> {\n const apiClient = await this.apiClient()\n const { flags } = await this.parse()\n\n // Update package.json with discovered names/descriptions if requested\n if (flags.discover) {\n action.start(\"🔍 Running template and pattern discovery\")\n try {\n const { templates, patterns } = await discoverAndUpdatePackageJson(process.cwd())\n action.stop(`found ${Object.keys(templates).length} templates, ${Object.keys(patterns).length} patterns`)\n } catch (error) {\n action.stop(\"failed\")\n if (error instanceof Error) this.error(`Discovery failed: ${error.message}`)\n else throw error\n }\n }\n\n // Check if this is discover-only mode\n const isDiscoverOnly = flags.discover && !flags.workspaceId && !flags.designSystemId\n\n if (isDiscoverOnly) {\n this.log(\"✅ Discovery completed. Use --workspaceId and --designSystemId to upload templates.\")\n return\n }\n\n // Validate required flags for upload\n if (!flags.workspaceId) {\n this.error(\"Missing required flag workspaceId\")\n }\n\n if (!flags.designSystemId) {\n this.error(\"Missing required flag designSystemId\")\n }\n\n // Read package json\n let pkg\n try {\n pkg = await readPackageJson()\n } catch (error) {\n if (error instanceof Error) this.error(`Failed to read or parse package.json: ${error.message}`)\n else throw error\n }\n\n if (pkg.supernova?.privateDependencies) {\n this.log(`Following packages will be linked as private dependencies: ${pkg.supernova.privateDependencies}`)\n\n const hasWildcardPrivateDependency = pkg.supernova.privateDependencies.some(dependency =>\n isPrivateDependencyScopePattern(dependency),\n )\n if (hasWildcardPrivateDependency && !flags.tarball) {\n this.error(`Wildcard privateDependencies entries (e.g. \"@scope/*\") require --tarball mode`)\n }\n\n if (!flags.tarball) {\n for (const dependency of pkg.supernova.privateDependencies) {\n if (!pkg.dependencies[dependency]) {\n this.error(`Private dependency ${dependency} is not listed in 'dependencies'`)\n }\n }\n }\n\n if (!(await fileExists(path.join(process.cwd(), \".npmrc\")))) {\n this.error(\n `CLI needs private NPM registry access to be able to bundle private dependencies.\\n` +\n `Please provide .npmrc file in the root directory and include neccessary access tokens.`,\n )\n }\n } else {\n this.warn(`package.json doesn't contain 'supernova.privateDependencies' declaration.`)\n this.warn(`Dependencies coming from private registries will fail`)\n }\n\n let templatesWithThumbnailUrls: DTOSandboxTemplateBuildCreateInput[\"templates\"] | undefined\n\n if (pkg.supernova?.templates) {\n // Always enrich templates from package.json with discovered files/thumbnails info on the fly\n const templates = await discoverFilesForTemplates(pkg.supernova.templates, process.cwd())\n\n await validateTemplates(templates, this, flags.debug)\n templatesWithThumbnailUrls = await this.uploadThumbnailsAndBuildTemplates(apiClient, flags.workspaceId, templates)\n }\n\n // Request build\n const buildData = await apiClient.sandboxes.builds.start({\n workspaceId: flags.workspaceId,\n designSystemId: flags.designSystemId,\n name: pkg.name,\n version: pkg.version,\n isExistingVersionUpdateAllowed: flags.force ?? false,\n templates: templatesWithThumbnailUrls,\n })\n\n // Build image\n const url = imageUrl(buildData)\n\n await this.validateDockerDaemon()\n const buildDir = await this.createBuildDir()\n\n try {\n await this.prepareBuildFolder(buildDir)\n await this.buildDockerImage(buildDir, url, flags.npmToken, flags.tarball ?? false)\n await this.pushDockerImage(buildDir, buildData.dockerRegistryDomain, url)\n await this.remoteTemplateBuild(apiClient, buildData.build.id)\n\n this.log(`✅ Template has been successfully uploaded`)\n } finally {\n await this.deleteBuildDir(buildDir)\n }\n }\n\n private async validateDockerDaemon() {\n await exec(\"docker info\").catch(() => {\n this.error(`Docker is not available, please start docker daemon and try again`)\n })\n }\n\n private createBuildDir(): Promise<string> {\n return fs.mkdtemp(path.join(tmpdir(), \"supernova-template-bundle-\"))\n }\n\n private async deleteBuildDir(buildDir: string) {\n await fs.rm(buildDir, { recursive: true, force: true })\n }\n\n private async prepareBuildFolder(buildDir: string) {\n // Move working directory to temp folder from where it will be built\n await fsx.copy(process.cwd(), buildDir, {\n filter(src) {\n return !src.includes(\"node_modules/\") && !src.includes(\".git/\") && !src.includes(\".out/\")\n },\n })\n\n // Inject Supernova scripts\n const cliSrcPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\")\n\n await fsx.copy(path.join(cliSrcPath, \"docker-scripts\"), path.join(buildDir, \"docker-scripts\"))\n }\n\n private async buildDockerImage(\n buildDir: string,\n imageUrl: string,\n npmToken: string | undefined,\n useTarballPrivateDeps: boolean,\n ) {\n action.start(\"🔨 Building docker image\")\n\n let cmd = `docker build -t ${imageUrl} --pull --platform linux/amd64`\n if (npmToken) cmd += ` --secret id=NPM_TOKEN`\n cmd += \" -f - .\"\n\n const dockerfileTemplate = useTarballPrivateDeps ? dockerfileTemplateTarball : dockerfileTemplateLegacy\n const dockerfile = dockerfileTemplate.replace(\n \"{{ npmTokenSecretMount }}\",\n npmToken ? `--mount=type=secret,id=NPM_TOKEN NPM_TOKEN=\"$(cat /run/secrets/NPM_TOKEN)\"` : \"\",\n )\n\n const subprocess = exec(cmd, {\n env: npmToken ? { ...process.env, NPM_TOKEN: npmToken } : process.env,\n cwd: buildDir,\n })\n\n subprocess.child.stdin!.write(dockerfile)\n subprocess.child.stdin!.end()\n\n await subprocess\n\n action.stop(\"done\")\n }\n\n private async pushDockerImage(buildDir: string, dockerHost: string, imageUrl: string) {\n const response = await fetch(`https://${dockerHost}/v2/`)\n if (response.status === 401) {\n // Requires auth\n const { accessToken } = (await this.apiClient()).config\n const loginProcess = exec(`docker login ${dockerHost} -u cli --password-stdin`)\n loginProcess.child.stdin!.write(accessToken)\n loginProcess.child.stdin!.end()\n await loginProcess\n }\n\n action.start(\"⬆️ Uploading docker image to Supernova\")\n await exec(`docker push ${imageUrl}`, {\n cwd: buildDir,\n })\n action.stop(\"done\")\n }\n\n private async remoteTemplateBuild(client: SupernovaApiClient, buildId: string) {\n action.start(\"📦 Creating template with the image\")\n\n // Trigger remote build phase\n await client.sandboxes.builds.finalize(buildId)\n\n // Poll every 2 seconds for roughly 5 minutes\n const pollIntervalMs = 2000\n const timeoutMs = 5 * 60 * 1000\n\n const startTime = Date.now()\n\n let build\n do {\n await sleep(pollIntervalMs)\n build = (await client.sandboxes.builds.get(buildId)).build\n } while (build.state === \"Building\" && Date.now() - startTime < timeoutMs)\n\n // Verify build state\n if (build.state !== \"Success\") {\n this.error(`Template creation failed`)\n }\n\n action.stop(\"done\")\n }\n\n private async uploadThumbnailsAndBuildTemplates(\n apiClient: SupernovaApiClient,\n workspaceId: string,\n templates: { [key: string]: TemplatePreset },\n ): Promise<DTOSandboxTemplateBuildCreateInput[\"templates\"]> {\n // Validate template names are unique\n const templateNames = Object.values(templates).map(t => t.name)\n const duplicateNames = templateNames.filter((name, index) => templateNames.indexOf(name) !== index)\n if (duplicateNames.length > 0) {\n throw new Error(\n `Duplicate template names found: ${[...new Set(duplicateNames)].join(\", \")}. Each template must have a unique name.`,\n )\n }\n\n const templateCount = Object.keys(templates).length\n action.start(`📸 Processing ${templateCount} template(s)`)\n\n const thumbnailFiles: Array<{\n name: string\n size: number\n checksum: string\n originalPath: string\n templateId: string\n }> = []\n\n // Validate thumbnail files\n for (const [templateId, template] of Object.entries(templates)) {\n if (!template.thumbnail) continue\n\n const validation = await validateThumbnailFile(templateId, template.thumbnail, this)\n if (!validation) continue\n\n try {\n const checksum = await calculateFileChecksum(validation.fullPath)\n thumbnailFiles.push({\n name: validation.name,\n size: validation.size,\n checksum,\n originalPath: validation.fullPath,\n templateId,\n })\n } catch (error) {\n this.warn(\n `Failed to calculate checksum for ${validation.fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n )\n continue\n }\n }\n\n let thumbnailUrlMap: { [templateId: string]: string } = {}\n\n if (thumbnailFiles.length > 0) {\n try {\n // Request upload URLs from API\n const uploadResponse = await apiClient.files.upload({\n ownerType: \"Workspace\",\n workspaceId,\n files: thumbnailFiles.map(({ name, size, checksum }) => ({ name, size, checksum })),\n })\n\n // Upload files to signed URLs\n await uploadFilesToUrls(uploadResponse.uploadUrls, uploadResponse.files, thumbnailFiles)\n\n await apiClient.files.finalizeUpload({\n ownerType: \"Workspace\",\n workspaceId,\n fileIds: uploadResponse.uploadUrls.map(f => f.fileId),\n })\n\n // Map template IDs to their uploaded thumbnail URLs\n thumbnailUrlMap = buildTemplateUrlMap(thumbnailFiles, uploadResponse.files)\n } catch (error) {\n this.warn(`Failed to upload thumbnails: ${error instanceof Error ? error.message : String(error)}`)\n this.warn(\"Continuing without uploaded thumbnails...\")\n // Don't error out completely, just continue without uploaded thumbnails\n }\n }\n\n const message =\n thumbnailFiles.length > 0 ? `uploaded ${thumbnailFiles.length} thumbnail(s)` : \"no thumbnails to upload\"\n action.stop(message)\n\n const templatesWithUrls = Object.entries(templates).map(([id, template]) => ({\n id,\n name: template.name,\n description: template.description,\n thumbnailUrl: thumbnailUrlMap[id],\n files: template.files,\n }))\n\n return templatesWithUrls\n }\n}\n\ntype PackageJson = {\n name: string\n version: string\n dependencies: Record<string, string>\n supernova:\n | {\n privateDependencies: string[] | undefined\n templates?: {\n [key: string]: TemplatePreset\n }\n }\n | undefined\n}\n\nasync function readPackageJson(): Promise<PackageJson> {\n const pkgPath = path.join(process.cwd(), \"package.json\")\n\n if (!(await fileExists(pkgPath))) throw new Error(`package.json file was not found in the current directory`)\n\n const raw = await fs.readFile(pkgPath, \"utf8\")\n const pkg = JSON.parse(raw)\n\n if (typeof pkg !== \"object\" || pkg === null) throw new Error(`Error parsing package.json: not a json`)\n\n if (typeof pkg.name !== \"string\") throw new Error(`Error parsing package.json: 'name' must be defined`)\n if (typeof pkg.version !== \"string\") throw new Error(`Error parsing package.json: 'version' must be defined`)\n if (typeof pkg.dependencies !== \"object\" || pkg.dependencies === null)\n throw new Error(`Error parsing package.json: 'dependencies' must be defined`)\n\n if (pkg.supernova?.privateDependencies) {\n const privateDependencies = pkg.supernova?.privateDependencies\n if (!Array.isArray(privateDependencies)) throw new TypeError(`supernova.privateDependencies must be an array`)\n\n for (const [i, d] of privateDependencies.entries()) {\n if (typeof d !== \"string\") {\n throw new TypeError(`supernova.privateDependencies[${i}] must be a string`)\n }\n\n if (!isValidPrivateDependencyEntry(d)) {\n throw new TypeError(\n `supernova.privateDependencies[${i}] must be a package name or scope wildcard like \"@example/*\"`,\n )\n }\n }\n }\n\n return pkg\n}\n\nfunction isPrivateDependencyScopePattern(entry: string): boolean {\n return entry.endsWith(\"/*\")\n}\n\nfunction isValidPrivateDependencyEntry(entry: string): boolean {\n if (!entry || entry.includes(\" \")) return false\n if (isPrivateDependencyScopePattern(entry)) {\n const scope = entry.slice(0, -2)\n return scope.startsWith(\"@\") && !scope.includes(\"/\")\n }\n\n return true\n}\n\nfunction imageUrl(build: DTOSandboxTemplateBuildCreateResponse) {\n return `${build.dockerRegistryDomain}${build.build.dockerImagePath}`\n}\n\nasync function validateThumbnailFile(\n templateId: string,\n thumbnailPath: string,\n logger: { warn: (msg: string) => void },\n): Promise<{ name: string; size: number; fullPath: string } | undefined> {\n const allowedExtensions = [\".png\", \".jpg\", \".jpeg\", \".svg\", \".webp\"]\n const maxFileSize = 10 * 1024 * 1024 // 10 MB in bytes\n\n const fullPath = path.resolve(thumbnailPath)\n const name = path.basename(thumbnailPath)\n\n if (!(await fileExists(fullPath))) {\n logger.warn(`Thumbnail file not found for template ${templateId}: ${thumbnailPath}`)\n return undefined\n }\n\n const extension = path.extname(thumbnailPath).toLowerCase()\n if (!allowedExtensions.includes(extension)) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} has unsupported format. Allowed formats: ${allowedExtensions.join(\", \")}`,\n )\n return undefined\n }\n\n const size = await getFileSize(fullPath)\n if (size > maxFileSize) {\n logger.warn(\n `Thumbnail file ${name} for template ${templateId} is too large (${(size / 1024 / 1024).toFixed(2)}MB). Maximum size is 10MB.`,\n )\n return undefined\n }\n\n return { name, size, fullPath }\n}\n\nasync function uploadFilesToUrls(\n uploadUrls: Array<{ fileId: string; uploadUrl: string }>,\n fileResponses: Array<{ id: string; name: string; size: number }>,\n thumbnailFiles: Array<{ name: string; size: number; originalPath: string; templateId: string }>,\n): Promise<void> {\n const uploadTasks = uploadUrls.map(async uploadUrl => {\n const fileResponse = fileResponses.find(f => f.id === uploadUrl.fileId)\n const thumbnailFile = thumbnailFiles.find(f => f.name === fileResponse?.name && f.size === fileResponse?.size)\n\n if (thumbnailFile) {\n const fileBuffer = await fs.readFile(thumbnailFile.originalPath)\n await fetch(uploadUrl.uploadUrl, {\n method: \"PUT\",\n body: fileBuffer,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n })\n }\n })\n\n await Promise.all(uploadTasks)\n}\n\nfunction buildTemplateUrlMap(\n thumbnailFiles: Array<{ templateId: string; checksum: string }>,\n fileResponses: Array<{ url: string; deduplicationKey: string }>,\n): { [templateId: string]: string } {\n const thumbnailUrlMap: { [templateId: string]: string } = {}\n\n for (const thumbnailFile of thumbnailFiles) {\n const fileResponse = fileResponses.find(f => f.deduplicationKey === thumbnailFile.checksum)\n if (fileResponse) {\n thumbnailUrlMap[thumbnailFile.templateId] = fileResponse.url\n }\n }\n\n return thumbnailUrlMap\n}\n\nasync function calculateFileChecksum(filePath: string): Promise<string> {\n const fileBuffer = await fs.readFile(filePath)\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", fileBuffer)\n return Buffer.from(hashBuffer).toString(\"hex\")\n}\n\nasync function getFileSize(filePath: string): Promise<number> {\n const stats = await fs.stat(filePath)\n return stats.size\n}\n"],"names":[],"mappings":"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","debug_id":"84a19802-6890-54fa-9a50-d82741f529e8"}