@stackgenhq/backstage-plugin-stackgen-backend 0.3.6-beta.1

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 (66) hide show
  1. package/README.md +485 -0
  2. package/config.d.ts +39 -0
  3. package/dist/actions/core/assign_project_members_action.cjs.js +227 -0
  4. package/dist/actions/core/assign_project_members_action.cjs.js.map +1 -0
  5. package/dist/actions/core/create_appstack_action.cjs.js +953 -0
  6. package/dist/actions/core/create_appstack_action.cjs.js.map +1 -0
  7. package/dist/actions/core/create_project_action.cjs.js +243 -0
  8. package/dist/actions/core/create_project_action.cjs.js.map +1 -0
  9. package/dist/actions/core/download_iac_action.cjs.js +133 -0
  10. package/dist/actions/core/download_iac_action.cjs.js.map +1 -0
  11. package/dist/actions/core/set_environment_variable_values_action.cjs.js +121 -0
  12. package/dist/actions/core/set_environment_variable_values_action.cjs.js.map +1 -0
  13. package/dist/actions/core/set_state_backend_action.cjs.js +174 -0
  14. package/dist/actions/core/set_state_backend_action.cjs.js.map +1 -0
  15. package/dist/actions/exporter/export_iac_to_git_action.cjs.js +290 -0
  16. package/dist/actions/exporter/export_iac_to_git_action.cjs.js.map +1 -0
  17. package/dist/actions/exporter/list_vault_secrets_action.cjs.js +39 -0
  18. package/dist/actions/exporter/list_vault_secrets_action.cjs.js.map +1 -0
  19. package/dist/config/constants.cjs.js +23 -0
  20. package/dist/config/constants.cjs.js.map +1 -0
  21. package/dist/exporter/exportOverrides.cjs.js +27 -0
  22. package/dist/exporter/exportOverrides.cjs.js.map +1 -0
  23. package/dist/exporter/gitExporterConfigHttp.cjs.js +105 -0
  24. package/dist/exporter/gitExporterConfigHttp.cjs.js.map +1 -0
  25. package/dist/exporter/http.cjs.js +14 -0
  26. package/dist/exporter/http.cjs.js.map +1 -0
  27. package/dist/exporter/paths.cjs.js +25 -0
  28. package/dist/exporter/paths.cjs.js.map +1 -0
  29. package/dist/exporter/projectGitExporterTemplate.cjs.js +62 -0
  30. package/dist/exporter/projectGitExporterTemplate.cjs.js.map +1 -0
  31. package/dist/exporter/topologyResolve.cjs.js +71 -0
  32. package/dist/exporter/topologyResolve.cjs.js.map +1 -0
  33. package/dist/index.cjs.js +31 -0
  34. package/dist/index.cjs.js.map +1 -0
  35. package/dist/index.d.ts +224 -0
  36. package/dist/lib/extractArchive.cjs.js +62 -0
  37. package/dist/lib/extractArchive.cjs.js.map +1 -0
  38. package/dist/modules/stackgenExporterScaffolderModule.cjs.js +29 -0
  39. package/dist/modules/stackgenExporterScaffolderModule.cjs.js.map +1 -0
  40. package/dist/modules/stackgenUiProxiesModule.cjs.js +366 -0
  41. package/dist/modules/stackgenUiProxiesModule.cjs.js.map +1 -0
  42. package/dist/plugin/plugin.cjs.js +136 -0
  43. package/dist/plugin/plugin.cjs.js.map +1 -0
  44. package/dist/plugin/router.cjs.js +341 -0
  45. package/dist/plugin/router.cjs.js.map +1 -0
  46. package/dist/services/MappingsService/mappingsService.cjs.js +149 -0
  47. package/dist/services/MappingsService/mappingsService.cjs.js.map +1 -0
  48. package/dist/services/StackgenService/stackgenService.cjs.js +267 -0
  49. package/dist/services/StackgenService/stackgenService.cjs.js.map +1 -0
  50. package/dist/utils/api-objects.cjs.js +205 -0
  51. package/dist/utils/api-objects.cjs.js.map +1 -0
  52. package/dist/vendor/stackgen-api-client/index.cjs.js +47681 -0
  53. package/dist/vendor/stackgen-api-client/index.cjs.js.map +1 -0
  54. package/migrations/20250131055302_init.js +24 -0
  55. package/migrations/20250305123456_alter_type_associations.js +23 -0
  56. package/package.json +86 -0
  57. package/templates/appstack-configure-environment.yaml +81 -0
  58. package/templates/appstack-from-template.yaml +76 -0
  59. package/templates/appstack-with-modules.yaml +69 -0
  60. package/templates/appstack-with-resources.yaml +81 -0
  61. package/templates/export-iac.yaml +97 -0
  62. package/templates/full-infra-setup.yaml +156 -0
  63. package/templates/git_export_exporter_multi_scm.yaml +123 -0
  64. package/templates/project-advanced.yaml +77 -0
  65. package/templates/project-basic.yaml +39 -0
  66. package/templates/project-with-members.yaml +86 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export_iac_to_git_action.cjs.js","sources":["../../../src/actions/exporter/export_iac_to_git_action.ts"],"sourcesContent":["import { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { z } from 'zod';\nimport {\n resolveExporterAppstackId,\n resolveTopologyId,\n} from '../../exporter/topologyResolve';\nimport {\n createGitExporterConfiguration,\n listGitExporterConfigs,\n} from '../../exporter/gitExporterConfigHttp';\nimport {\n chooseGitTemplateFromTemplatesResponse,\n fetchProjectGitTemplates,\n} from '../../exporter/projectGitExporterTemplate';\nimport { buildExportOverrides } from '../../exporter/exportOverrides';\nimport {\n formatClientErrorMessage,\n getStackgenApiObjects,\n} from '../../utils/api-objects';\n\n/** Same shape as `stackGen:createProject` `project.gitConfig`; optional override when project templates are missing or ambiguous. */\nconst exportBootstrapGitConfigSchema = z.object({\n name: z.string().optional(),\n type: z.string().optional(),\n parameters: z.object({\n scmType: z.string().min(1),\n repoUrl: z.string().min(1),\n targetBranch: z.string().optional(),\n path: z.string().optional(),\n }),\n vaultReference: z.string().min(1),\n default: z.boolean().optional(),\n});\n\nconst exportToGitInputSchema = z.object({\n appstackName: z.string().min(1),\n teamId: z.string().min(1),\n appstackId: z.string().optional(),\n topologyId: z.string().optional(),\n /**\n * When set (non-empty), used as stack-exporter git `config_id`; skips listing and bootstrap.\n * Precedence: configId overrides gitConfig.\n */\n configId: z.string().optional(),\n /**\n * Optional bootstrap override. If omitted and no usable appstack config exists, the action loads\n * the project default git template and POSTs an appstack-scoped git config.\n * Ignored when configId is set.\n */\n gitConfig: exportBootstrapGitConfigSchema.optional(),\n /**\n * First-class git export controls (parity with the StackGen UI). Each maps to a\n * stack-exporter override key via `buildExportOverrides`; explicit `overrides`\n * entries for the same key win.\n */\n // Branch to base the change on (PR base / commit destination) -> `target_branch`.\n baseBranch: z.string().optional(),\n // Branch StackGen pushes changes to (source/head branch) -> `branch_format`.\n pushBranch: z.string().optional(),\n /**\n * When true, reuse the previous export push branch (`use_same_branch`).\n * Set by ExporterPushBranch when the field was prefilled from history and left unchanged.\n */\n useSameBranch: z.boolean().optional(),\n // When false, commit directly to the branch without opening a PR (`commit_only`). Defaults to creating a PR.\n createPr: z.boolean().optional(),\n overrides: z\n .array(\n z.object({\n key: z.string(),\n value: z.string(),\n }),\n )\n .optional(),\n});\n\nconst exportToGitOutputSchema = z.object({\n // Optional because a commit-only export (createPr=false) does not open a pull request.\n pullRequestUrl: z.string().url().optional(),\n externalLink: z.string().url().optional(),\n // Populated for commit-only exports: the branch StackGen committed the changes to.\n committedBranch: z.string().optional(),\n // Human-readable notes from stack-exporter (e.g. \"committed to branch X\").\n notes: z.string().optional(),\n});\n\ntype ExporterGitConfig = {\n id?: string;\n name?: string;\n type?: string;\n default?: boolean;\n};\n\nfunction normalizeConfig(raw: unknown): ExporterGitConfig | undefined {\n if (!raw || typeof raw !== 'object') {\n return undefined;\n }\n return raw as ExporterGitConfig;\n}\n\nfunction chooseConfig(\n configs: ExporterGitConfig[],\n appstackName: string,\n): ExporterGitConfig | undefined {\n const gitOnly = configs.filter(c => (c.type ?? '').toLowerCase() === 'git');\n const defaults = gitOnly.filter(c => c.default);\n\n if (defaults.length === 1) {\n return defaults[0];\n }\n if (defaults.length > 1) {\n throw new Error(\n `Multiple default git exporter configs found for \"${appstackName}\". ` +\n `Pass configId (ExporterGitConfigSelect) or gitConfig on stackGen:exportToGit, or reduce configs in stack-exporter.`,\n );\n }\n if (gitOnly.length === 1) {\n return gitOnly[0];\n }\n if (gitOnly.length > 1) {\n throw new Error(\n `Multiple git exporter configs found for \"${appstackName}\". ` +\n `Pass configId (ExporterGitConfigSelect) or gitConfig on stackGen:exportToGit, or mark one config as default in stack-exporter.`,\n );\n }\n return undefined;\n}\n\nfunction isCompleteGitConfig(\n gc: z.infer<typeof exportBootstrapGitConfigSchema> | undefined,\n): gc is z.infer<typeof exportBootstrapGitConfigSchema> & {\n parameters: { scmType: string; repoUrl: string };\n vaultReference: string;\n} {\n return Boolean(gc?.parameters?.scmType && gc?.parameters?.repoUrl && gc?.vaultReference);\n}\n\ntype ExportResponseLike = {\n externalLink?: string;\n notes?: string;\n metadata?: { head?: string };\n};\n\nfunction asExportResponse(raw: unknown): ExportResponseLike {\n return raw && typeof raw === 'object' ? (raw as ExportResponseLike) : {};\n}\n\nfunction parsePrUrl(raw: unknown): string | undefined {\n const data = asExportResponse(raw);\n const direct =\n typeof data.externalLink === 'string' ? data.externalLink.trim() : '';\n const notes = typeof data.notes === 'string' ? data.notes : '';\n const fromNotes = notes.match(/https?:\\/\\/[^\\s\"',)>\\]]+/i)?.[0] ?? '';\n const url = (direct || fromNotes).trim();\n return url || undefined;\n}\n\n/** Reads the branch StackGen committed to (exporter `metadata.head`) for commit-only exports. */\nfunction parseCommittedBranch(raw: unknown): string | undefined {\n const data = asExportResponse(raw);\n const head =\n typeof data.metadata?.head === 'string' ? data.metadata.head.trim() : '';\n return head || undefined;\n}\n\n/** Reads the human-readable export notes (e.g. \"committed to branch X\"). */\nfunction parseNotes(raw: unknown): string | undefined {\n const data = asExportResponse(raw);\n const notes = typeof data.notes === 'string' ? data.notes.trim() : '';\n return notes || undefined;\n}\n\nasync function bootstrapGitConfig(params: {\n config: Config;\n teamId: string;\n appstackId: string;\n appstackName: string;\n gitConfig: z.infer<typeof exportBootstrapGitConfigSchema> | undefined;\n logger: LoggerService;\n}): Promise<string> {\n const { config, teamId, appstackId, appstackName, gitConfig: gc, logger } = params;\n\n let bootstrap:\n | {\n name: string;\n scmType: string;\n repoUrl: string;\n targetBranch: string;\n path: string;\n tokenRef: string;\n }\n | undefined;\n\n if (isCompleteGitConfig(gc)) {\n bootstrap = {\n name: gc.name?.trim() || 'default-git-config',\n scmType: gc.parameters.scmType,\n repoUrl: gc.parameters.repoUrl,\n targetBranch: gc.parameters.targetBranch ?? 'main',\n path: gc.parameters.path ?? '/',\n tokenRef: gc.vaultReference,\n };\n } else {\n const templateBody = await fetchProjectGitTemplates(config, teamId, logger);\n bootstrap = chooseGitTemplateFromTemplatesResponse(templateBody);\n }\n\n if (!bootstrap) {\n throw new Error(\n `No git exporter config found for appstack \"${appstackName}\" and team \"${teamId}\", and no usable project git template ` +\n '(GET exporter /config/template). Ensure createProject included gitConfig, or pass gitConfig / configId on this action.',\n );\n }\n\n if (!appstackId?.trim()) {\n throw new Error(\n `Cannot create git exporter config for \"${appstackName}\": appstackId is required so the config is bound to the AppStack.`,\n );\n }\n\n const createdId = await createGitExporterConfiguration(\n config,\n {\n orgId: teamId,\n name: bootstrap.name,\n appstackId,\n scmType: bootstrap.scmType,\n repoUrl: bootstrap.repoUrl,\n targetBranch: bootstrap.targetBranch,\n path: bootstrap.path,\n secrets: { token_ref: bootstrap.tokenRef },\n },\n logger,\n );\n\n const usedExplicitGitConfig = isCompleteGitConfig(gc);\n logger.info(\n `Created git exporter config \"${createdId}\" for appstack \"${appstackId}\" ` +\n `(${usedExplicitGitConfig ? 'explicit gitConfig input' : 'project default git template'})`,\n );\n return createdId;\n}\n\nexport const exportAppStackToGitAction = (\n config: Config,\n _logger: LoggerService,\n) => {\n return createTemplateAction({\n id: 'stackGen:exportToGit',\n description:\n 'Exports an AppStack via stack-exporter (resolve topology, select or bootstrap appstack-scoped git config, run export)',\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => exportToGitInputSchema,\n output: () => exportToGitOutputSchema,\n },\n\n async handler(ctx) {\n try {\n const { appstackName, teamId } = ctx.input;\n const stackgenApis = getStackgenApiObjects(config);\n\n const resolvedAppstackId = await resolveExporterAppstackId({\n config,\n teamId,\n appstackId: ctx.input.appstackId,\n appstackName,\n logger: ctx.logger,\n });\n\n const topologyId =\n ctx.input.topologyId?.trim() ||\n (await resolveTopologyId({\n config,\n teamId,\n appstackId: ctx.input.appstackId,\n appstackName,\n logger: ctx.logger,\n }));\n if (!topologyId) {\n throw new Error(\n `Could not resolve topologyId for appstack \"${appstackName}\" in team \"${teamId}\". ` +\n 'Pass topologyId on stackGen:exportToGit or ensure the appstack exists in appcd /appstacks.',\n );\n }\n\n const explicitConfigId = ctx.input.configId?.trim();\n let selectedConfigId: string | undefined = explicitConfigId || undefined;\n\n if (!selectedConfigId && isCompleteGitConfig(ctx.input.gitConfig)) {\n selectedConfigId = await bootstrapGitConfig({\n config,\n teamId,\n appstackId: resolvedAppstackId,\n appstackName,\n gitConfig: ctx.input.gitConfig,\n logger: ctx.logger,\n });\n }\n\n if (!selectedConfigId) {\n const list = await listGitExporterConfigs(\n config,\n {\n orgId: teamId,\n type: 'git',\n appstackId: resolvedAppstackId,\n },\n ctx.logger,\n );\n const configs = list\n .map(normalizeConfig)\n .filter((c): c is ExporterGitConfig => Boolean(c?.id));\n const selected = chooseConfig(configs, appstackName);\n\n if (selected?.id) {\n selectedConfigId = selected.id;\n } else {\n selectedConfigId = await bootstrapGitConfig({\n config,\n teamId,\n appstackId: resolvedAppstackId,\n appstackName,\n gitConfig: ctx.input.gitConfig,\n logger: ctx.logger,\n });\n }\n }\n\n // Generated ExportRequestToJSON maps camelCase → snake_case wire keys.\n // Passing snake_case here drops topology_id / config_id on the wire.\n // buildExportOverrides uses string keys for template flexibility; generated\n // ExportRequest expects OverrideKey enum string literals.\n const overrides = buildExportOverrides({\n baseBranch: ctx.input.baseBranch,\n pushBranch: ctx.input.pushBranch,\n useSameBranch: ctx.input.useSameBranch,\n createPr: ctx.input.createPr,\n overrides: ctx.input.overrides,\n }) as Array<{\n key:\n | 'pr_title'\n | 'commit_msg'\n | 'branch_format'\n | 'use_same_branch'\n | 'target_branch'\n | 'commit_only'\n | 'body'\n | 'reference'\n | 'path';\n value: string;\n }>;\n\n const exportRes = await stackgenApis.exporterApiObj.exportIAC({\n orgId: teamId,\n exportRequest: {\n topologyId,\n appstackName,\n configId: selectedConfigId,\n overrides,\n },\n });\n\n const prUrl = parsePrUrl(exportRes);\n const committedBranch = parseCommittedBranch(exportRes);\n const notes = parseNotes(exportRes);\n\n // Commit-only export (createPr=false): stack-exporter commits to the push branch\n // and does not open a PR, so there is no pull request URL to require.\n if (ctx.input.createPr === false) {\n if (committedBranch) {\n ctx.output('committedBranch', committedBranch);\n }\n if (notes) {\n ctx.output('notes', notes);\n }\n if (prUrl) {\n ctx.output('pullRequestUrl', prUrl);\n ctx.output('externalLink', prUrl);\n }\n return;\n }\n\n if (!prUrl) {\n throw new Error('Export succeeded but no pull request URL was returned by stack-exporter');\n }\n\n ctx.output('pullRequestUrl', prUrl);\n ctx.output('externalLink', prUrl);\n if (committedBranch) {\n ctx.output('committedBranch', committedBranch);\n }\n if (notes) {\n ctx.output('notes', notes);\n }\n } catch (error) {\n const detail = await formatClientErrorMessage(error);\n ctx.logger.error(`Export to Git failed: ${detail}`);\n throw new Error(`Export to Git failed: ${detail}`);\n }\n },\n });\n};\n"],"names":["z","fetchProjectGitTemplates","chooseGitTemplateFromTemplatesResponse","createGitExporterConfiguration","createTemplateAction","getStackgenApiObjects","resolveExporterAppstackId","resolveTopologyId","listGitExporterConfigs","buildExportOverrides","formatClientErrorMessage"],"mappings":";;;;;;;;;;AAuBA,MAAM,8BAAA,GAAiCA,MAAE,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,UAAA,EAAYA,MAAE,MAAA,CAAO;AAAA,IACnB,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACzB,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACzB,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAClC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC3B,CAAA;AAAA,EACD,cAAA,EAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAChC,OAAA,EAASA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACvB,CAAC,CAAA;AAED,MAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EACtC,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC9B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9B,SAAA,EAAW,+BAA+B,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnD,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAEhC,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,aAAA,EAAeA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA,EAEpC,QAAA,EAAUA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,WAAWA,KAAA,CACR,KAAA;AAAA,IACCA,MAAE,MAAA,CAAO;AAAA,MACP,GAAA,EAAKA,MAAE,MAAA,EAAO;AAAA,MACd,KAAA,EAAOA,MAAE,MAAA;AAAO,KACjB;AAAA,IAEF,QAAA;AACL,CAAC,CAAA;AAED,MAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA;AAAA,EAEvC,gBAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC1C,cAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA;AAAA,EAExC,eAAA,EAAiBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAErC,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACpB,CAAC,CAAA;AASD,SAAS,gBAAgB,GAAA,EAA6C;AACpE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CACP,SACA,YAAA,EAC+B;AAC/B,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAA,CAAM,EAAE,IAAA,IAAQ,EAAA,EAAI,WAAA,EAAY,KAAM,KAAK,CAAA;AAC1E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAE9C,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oDAAoD,YAAY,CAAA,qHAAA;AAAA,KAElE;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4CAA4C,YAAY,CAAA,iIAAA;AAAA,KAE1D;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,oBACP,EAAA,EAIA;AACA,EAAA,OAAO,OAAA,CAAQ,IAAI,UAAA,EAAY,OAAA,IAAW,IAAI,UAAA,EAAY,OAAA,IAAW,IAAI,cAAc,CAAA;AACzF;AAQA,SAAS,iBAAiB,GAAA,EAAkC;AAC1D,EAAA,OAAO,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,GAAY,MAA6B,EAAC;AACzE;AAEA,SAAS,WAAW,GAAA,EAAkC;AACpD,EAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,EAAA,MAAM,MAAA,GACJ,OAAO,IAAA,CAAK,YAAA,KAAiB,WAAW,IAAA,CAAK,YAAA,CAAa,MAAK,GAAI,EAAA;AACrE,EAAA,MAAM,QAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,EAAA;AAC5D,EAAA,MAAM,YAAY,KAAA,CAAM,KAAA,CAAM,2BAA2B,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACnE,EAAA,MAAM,GAAA,GAAA,CAAO,MAAA,IAAU,SAAA,EAAW,IAAA,EAAK;AACvC,EAAA,OAAO,GAAA,IAAO,MAAA;AAChB;AAGA,SAAS,qBAAqB,GAAA,EAAkC;AAC9D,EAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,EAAA,MAAM,IAAA,GACJ,OAAO,IAAA,CAAK,QAAA,EAAU,IAAA,KAAS,WAAW,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,GAAI,EAAA;AACxE,EAAA,OAAO,IAAA,IAAQ,MAAA;AACjB;AAGA,SAAS,WAAW,GAAA,EAAkC;AACpD,EAAA,MAAM,IAAA,GAAO,iBAAiB,GAAG,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,WAAW,IAAA,CAAK,KAAA,CAAM,MAAK,GAAI,EAAA;AACnE,EAAA,OAAO,KAAA,IAAS,MAAA;AAClB;AAEA,eAAe,mBAAmB,MAAA,EAOd;AAClB,EAAA,MAAM,EAAE,QAAQ,MAAA,EAAQ,UAAA,EAAY,cAAc,SAAA,EAAW,EAAA,EAAI,QAAO,GAAI,MAAA;AAE5E,EAAA,IAAI,SAAA;AAWJ,EAAA,IAAI,mBAAA,CAAoB,EAAE,CAAA,EAAG;AAC3B,IAAA,SAAA,GAAY;AAAA,MACV,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,IAAA,EAAK,IAAK,oBAAA;AAAA,MACzB,OAAA,EAAS,GAAG,UAAA,CAAW,OAAA;AAAA,MACvB,OAAA,EAAS,GAAG,UAAA,CAAW,OAAA;AAAA,MACvB,YAAA,EAAc,EAAA,CAAG,UAAA,CAAW,YAAA,IAAgB,MAAA;AAAA,MAC5C,IAAA,EAAM,EAAA,CAAG,UAAA,CAAW,IAAA,IAAQ,GAAA;AAAA,MAC5B,UAAU,EAAA,CAAG;AAAA,KACf;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,YAAA,GAAe,MAAMC,mDAAA,CAAyB,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAC1E,IAAA,SAAA,GAAYC,kEAAuC,YAAY,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,2CAAA,EAA8C,YAAY,CAAA,YAAA,EAAe,MAAM,CAAA,4JAAA;AAAA,KAEjF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY,IAAA,EAAK,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,0CAA0C,YAAY,CAAA,iEAAA;AAAA,KACxD;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,MAAMC,oDAAA;AAAA,IACtB,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,UAAA;AAAA,MACA,SAAS,SAAA,CAAU,OAAA;AAAA,MACnB,SAAS,SAAA,CAAU,OAAA;AAAA,MACnB,cAAc,SAAA,CAAU,YAAA;AAAA,MACxB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,OAAA,EAAS,EAAE,SAAA,EAAW,SAAA,CAAU,QAAA;AAAS,KAC3C;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,qBAAA,GAAwB,oBAAoB,EAAE,CAAA;AACpD,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gCAAgC,SAAS,CAAA,gBAAA,EAAmB,UAAU,CAAA,GAAA,EAChE,qBAAA,GAAwB,6BAA6B,8BAA8B,CAAA,CAAA;AAAA,GAC3F;AACA,EAAA,OAAO,SAAA;AACT;AAEO,MAAM,yBAAA,GAA4B,CACvC,MAAA,EACA,OAAA,KACG;AACH,EAAA,OAAOC,yCAAA,CAAqB;AAAA,IAC1B,EAAA,EAAI,sBAAA;AAAA,IACJ,WAAA,EACE,uHAAA;AAAA,IACF,MAAA,EAAQ;AAAA;AAAA,MAEN,OAAO,MAAM,sBAAA;AAAA,MACb,QAAQ,MAAM;AAAA,KAChB;AAAA,IAEA,MAAM,QAAQ,GAAA,EAAK;AACjB,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,YAAA,EAAc,MAAA,EAAO,GAAI,GAAA,CAAI,KAAA;AACrC,QAAA,MAAM,YAAA,GAAeC,iCAAsB,MAAM,CAAA;AAEjD,QAAA,MAAM,kBAAA,GAAqB,MAAMC,yCAAA,CAA0B;AAAA,UACzD,MAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,EAAY,IAAI,KAAA,CAAM,UAAA;AAAA,UACtB,YAAA;AAAA,UACA,QAAQ,GAAA,CAAI;AAAA,SACb,CAAA;AAED,QAAA,MAAM,aACJ,GAAA,CAAI,KAAA,CAAM,YAAY,IAAA,EAAK,IAC1B,MAAMC,iCAAA,CAAkB;AAAA,UACvB,MAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA,EAAY,IAAI,KAAA,CAAM,UAAA;AAAA,UACtB,YAAA;AAAA,UACA,QAAQ,GAAA,CAAI;AAAA,SACb,CAAA;AACH,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,2CAAA,EAA8C,YAAY,CAAA,WAAA,EAAc,MAAM,CAAA,6FAAA;AAAA,WAEhF;AAAA,QACF;AAEA,QAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK;AAClD,QAAA,IAAI,mBAAuC,gBAAA,IAAoB,KAAA,CAAA;AAE/D,QAAA,IAAI,CAAC,gBAAA,IAAoB,mBAAA,CAAoB,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACjE,UAAA,gBAAA,GAAmB,MAAM,kBAAA,CAAmB;AAAA,YAC1C,MAAA;AAAA,YACA,MAAA;AAAA,YACA,UAAA,EAAY,kBAAA;AAAA,YACZ,YAAA;AAAA,YACA,SAAA,EAAW,IAAI,KAAA,CAAM,SAAA;AAAA,YACrB,QAAQ,GAAA,CAAI;AAAA,WACb,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,MAAM,OAAO,MAAMC,4CAAA;AAAA,YACjB,MAAA;AAAA,YACA;AAAA,cACE,KAAA,EAAO,MAAA;AAAA,cACP,IAAA,EAAM,KAAA;AAAA,cACN,UAAA,EAAY;AAAA,aACd;AAAA,YACA,GAAA,CAAI;AAAA,WACN;AACA,UAAA,MAAM,OAAA,GAAU,IAAA,CACb,GAAA,CAAI,eAAe,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAA8B,OAAA,CAAQ,CAAA,EAAG,EAAE,CAAC,CAAA;AACvD,UAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAS,YAAY,CAAA;AAEnD,UAAA,IAAI,UAAU,EAAA,EAAI;AAChB,YAAA,gBAAA,GAAmB,QAAA,CAAS,EAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,gBAAA,GAAmB,MAAM,kBAAA,CAAmB;AAAA,cAC1C,MAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA,EAAY,kBAAA;AAAA,cACZ,YAAA;AAAA,cACA,SAAA,EAAW,IAAI,KAAA,CAAM,SAAA;AAAA,cACrB,QAAQ,GAAA,CAAI;AAAA,aACb,CAAA;AAAA,UACH;AAAA,QACF;AAMA,QAAA,MAAM,YAAYC,oCAAA,CAAqB;AAAA,UACrC,UAAA,EAAY,IAAI,KAAA,CAAM,UAAA;AAAA,UACtB,UAAA,EAAY,IAAI,KAAA,CAAM,UAAA;AAAA,UACtB,aAAA,EAAe,IAAI,KAAA,CAAM,aAAA;AAAA,UACzB,QAAA,EAAU,IAAI,KAAA,CAAM,QAAA;AAAA,UACpB,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,SACtB,CAAA;AAcD,QAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,cAAA,CAAe,SAAA,CAAU;AAAA,UAC5D,KAAA,EAAO,MAAA;AAAA,UACP,aAAA,EAAe;AAAA,YACb,UAAA;AAAA,YACA,YAAA;AAAA,YACA,QAAA,EAAU,gBAAA;AAAA,YACV;AAAA;AACF,SACD,CAAA;AAED,QAAA,MAAM,KAAA,GAAQ,WAAW,SAAS,CAAA;AAClC,QAAA,MAAM,eAAA,GAAkB,qBAAqB,SAAS,CAAA;AACtD,QAAA,MAAM,KAAA,GAAQ,WAAW,SAAS,CAAA;AAIlC,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,QAAA,KAAa,KAAA,EAAO;AAChC,UAAA,IAAI,eAAA,EAAiB;AACnB,YAAA,GAAA,CAAI,MAAA,CAAO,mBAAmB,eAAe,CAAA;AAAA,UAC/C;AACA,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,UAC3B;AACA,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,GAAA,CAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA;AAClC,YAAA,GAAA,CAAI,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,KAAA,EAAO;AACV,UAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,QAC3F;AAEA,QAAA,GAAA,CAAI,MAAA,CAAO,kBAAkB,KAAK,CAAA;AAClC,QAAA,GAAA,CAAI,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAChC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,GAAA,CAAI,MAAA,CAAO,mBAAmB,eAAe,CAAA;AAAA,QAC/C;AACA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,QAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS,MAAMC,mCAAA,CAAyB,KAAK,CAAA;AACnD,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAClD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;;"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var pluginScaffolderNode = require('@backstage/plugin-scaffolder-node');
4
+ var zod = require('zod');
5
+ var paths = require('../../exporter/paths.cjs.js');
6
+ var apiObjects = require('../../utils/api-objects.cjs.js');
7
+
8
+ const inputSchema = zod.z.object({
9
+ orgId: zod.z.string().optional(),
10
+ category: zod.z.string().optional(),
11
+ subcategory: zod.z.string().optional(),
12
+ name: zod.z.string().optional()
13
+ });
14
+ function listVaultSecretsAction(config, _logger) {
15
+ return pluginScaffolderNode.createTemplateAction({
16
+ id: "stackGen:listVaultSecrets",
17
+ description: "List vault secrets (GET /secrets on stackgen-vault)",
18
+ schema: {
19
+ // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.
20
+ input: () => inputSchema,
21
+ output: (zImpl) => zImpl.object({ secretsJson: zImpl.string() })
22
+ },
23
+ async handler(ctx) {
24
+ const orgId = paths.readOrgId(config, ctx.input.orgId);
25
+ const stackgenApis = apiObjects.getStackgenApiObjects(config);
26
+ ctx.logger.info("stackGen:listVaultSecrets via generated client");
27
+ const response = await stackgenApis.vaultSecretApiObj.getSecrets({
28
+ orgId,
29
+ category: ctx.input.category,
30
+ subcategory: ctx.input.subcategory,
31
+ name: ctx.input.name
32
+ });
33
+ ctx.output("secretsJson", JSON.stringify(response));
34
+ }
35
+ });
36
+ }
37
+
38
+ exports.listVaultSecretsAction = listVaultSecretsAction;
39
+ //# sourceMappingURL=list_vault_secrets_action.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list_vault_secrets_action.cjs.js","sources":["../../../src/actions/exporter/list_vault_secrets_action.ts"],"sourcesContent":["import { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { z } from 'zod';\nimport { readOrgId } from '../../exporter/paths';\nimport { getStackgenApiObjects } from '../../utils/api-objects';\n\nconst inputSchema = z.object({\n orgId: z.string().optional(),\n category: z.string().optional(),\n subcategory: z.string().optional(),\n name: z.string().optional(),\n});\n\nexport function listVaultSecretsAction(\n config: Config,\n _logger: LoggerService,\n) {\n return createTemplateAction({\n id: 'stackGen:listVaultSecrets',\n description: 'List vault secrets (GET /secrets on stackgen-vault)',\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => inputSchema,\n output: zImpl => zImpl.object({ secretsJson: zImpl.string() }),\n },\n async handler(ctx) {\n const orgId = readOrgId(config, ctx.input.orgId);\n const stackgenApis = getStackgenApiObjects(config);\n ctx.logger.info('stackGen:listVaultSecrets via generated client');\n const response = await stackgenApis.vaultSecretApiObj.getSecrets({\n orgId,\n category: ctx.input.category,\n subcategory: ctx.input.subcategory as never,\n name: ctx.input.name,\n });\n ctx.output('secretsJson', JSON.stringify(response));\n },\n });\n}\n"],"names":["z","createTemplateAction","readOrgId","getStackgenApiObjects"],"mappings":";;;;;;;AAOA,MAAM,WAAA,GAAcA,MAAE,MAAA,CAAO;AAAA,EAC3B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC,CAAA;AAEM,SAAS,sBAAA,CACd,QACA,OAAA,EACA;AACA,EAAA,OAAOC,yCAAA,CAAqB;AAAA,IAC1B,EAAA,EAAI,2BAAA;AAAA,IACJ,WAAA,EAAa,qDAAA;AAAA,IACb,MAAA,EAAQ;AAAA;AAAA,MAEN,OAAO,MAAM,WAAA;AAAA,MACb,MAAA,EAAQ,WAAS,KAAA,CAAM,MAAA,CAAO,EAAE,WAAA,EAAa,KAAA,CAAM,MAAA,EAAO,EAAG;AAAA,KAC/D;AAAA,IACA,MAAM,QAAQ,GAAA,EAAK;AACjB,MAAA,MAAM,KAAA,GAAQC,eAAA,CAAU,MAAA,EAAQ,GAAA,CAAI,MAAM,KAAK,CAAA;AAC/C,MAAA,MAAM,YAAA,GAAeC,iCAAsB,MAAM,CAAA;AACjD,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,gDAAgD,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,iBAAA,CAAkB,UAAA,CAAW;AAAA,QAC/D,KAAA;AAAA,QACA,QAAA,EAAU,IAAI,KAAA,CAAM,QAAA;AAAA,QACpB,WAAA,EAAa,IAAI,KAAA,CAAM,WAAA;AAAA,QACvB,IAAA,EAAM,IAAI,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,GAAA,CAAI,MAAA,CAAO,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IACpD;AAAA,GACD,CAAA;AACH;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ const AzureCloudProvider = "azure";
4
+ const AWSCloudProvider = "aws";
5
+ const GCPCloudProvider = "gcp";
6
+ const CIVOCloudProvider = "civo";
7
+ const CloudProviders = [
8
+ AzureCloudProvider,
9
+ AWSCloudProvider,
10
+ GCPCloudProvider,
11
+ CIVOCloudProvider
12
+ ];
13
+ const IsValidCloudProvider = (provider) => {
14
+ return CloudProviders.includes(provider);
15
+ };
16
+
17
+ exports.AWSCloudProvider = AWSCloudProvider;
18
+ exports.AzureCloudProvider = AzureCloudProvider;
19
+ exports.CIVOCloudProvider = CIVOCloudProvider;
20
+ exports.CloudProviders = CloudProviders;
21
+ exports.GCPCloudProvider = GCPCloudProvider;
22
+ exports.IsValidCloudProvider = IsValidCloudProvider;
23
+ //# sourceMappingURL=constants.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs.js","sources":["../../src/config/constants.ts"],"sourcesContent":["export const AzureCloudProvider = \"azure\";\nexport const AWSCloudProvider = \"aws\";\nexport const GCPCloudProvider = \"gcp\";\nexport const CIVOCloudProvider = \"civo\";\n\nexport const CloudProviders = [\n AzureCloudProvider,\n AWSCloudProvider,\n GCPCloudProvider,\n CIVOCloudProvider,\n];\n\nexport const IsValidCloudProvider = (provider: string): boolean => {\n return CloudProviders.includes(provider);\n};\n"],"names":[],"mappings":";;AAAO,MAAM,kBAAA,GAAqB;AAC3B,MAAM,gBAAA,GAAmB;AACzB,MAAM,gBAAA,GAAmB;AACzB,MAAM,iBAAA,GAAoB;AAE1B,MAAM,cAAA,GAAiB;AAAA,EAC5B,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAEO,MAAM,oBAAA,GAAuB,CAAC,QAAA,KAA8B;AACjE,EAAA,OAAO,cAAA,CAAe,SAAS,QAAQ,CAAA;AACzC;;;;;;;;;"}
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ function buildExportOverrides(controls) {
4
+ const explicit = (controls.overrides ?? []).filter(
5
+ (o) => typeof o?.key === "string" && o.key.length > 0
6
+ );
7
+ const explicitKeys = new Set(explicit.map((o) => o.key));
8
+ const derived = [];
9
+ const baseBranch = controls.baseBranch?.trim();
10
+ if (baseBranch) {
11
+ derived.push({ key: "target_branch", value: baseBranch });
12
+ }
13
+ const pushBranch = controls.pushBranch?.trim();
14
+ if (pushBranch) {
15
+ derived.push({ key: "branch_format", value: pushBranch });
16
+ }
17
+ if (controls.useSameBranch === true) {
18
+ derived.push({ key: "use_same_branch", value: "true" });
19
+ }
20
+ if (controls.createPr === false) {
21
+ derived.push({ key: "commit_only", value: "true" });
22
+ }
23
+ return [...explicit, ...derived.filter((o) => !explicitKeys.has(o.key))];
24
+ }
25
+
26
+ exports.buildExportOverrides = buildExportOverrides;
27
+ //# sourceMappingURL=exportOverrides.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportOverrides.cjs.js","sources":["../../src/exporter/exportOverrides.ts"],"sourcesContent":["export type ExportOverride = { key: string; value: string };\n\n/** First-class git export controls, mirroring the StackGen UI push-to-git form. */\nexport type ExportOverrideControls = {\n /** Branch to base the change on. Maps to the exporter `target_branch` override (PR base / commit destination). */\n baseBranch?: string;\n /** Branch StackGen pushes changes to. Maps to the exporter `branch_format` override (source/head branch). */\n pushBranch?: string;\n /**\n * When true, reuse the previous export push branch (`use_same_branch=true`).\n * Set by the UI when push branch was prefilled from export history and left unchanged.\n */\n useSameBranch?: boolean;\n /** When false, commit directly to the branch without opening a PR (`commit_only=true`). Defaults to creating a PR. */\n createPr?: boolean;\n /** Raw exporter overrides passed through as-is (e.g. `pr_title`, `commit_msg`). */\n overrides?: ExportOverride[];\n};\n\n/**\n * buildExportOverrides translates the plugin's first-class git export controls into\n * the stack-exporter override contract, giving the Backstage plugin parity with the\n * StackGen UI (base branch, push branch, create PR). It exists so the mapping between\n * user-facing options and exporter override keys lives in one tested place instead of\n * being scattered across templates or duplicated per caller. Without it, callers would\n * have to know internal override keys (`target_branch`, `branch_format`, `commit_only`)\n * and there would be no single source of truth for conflict resolution.\n *\n * Mapping (identical to the StackGen UI):\n * baseBranch -> target_branch (branch to base the PR on / commit destination)\n * pushBranch -> branch_format (source branch StackGen pushes changes to)\n * useSameBranch -> use_same_branch=true (keep previous export head branch)\n * createPr=false -> commit_only=true (commit without opening a PR)\n *\n * Explicit `overrides` entries take precedence over the derived keys so advanced callers\n * can still fine-tune behavior; stack-exporter reads the first value per key, so explicit\n * entries are kept first and derived keys are only appended when not already set.\n */\nexport function buildExportOverrides(controls: ExportOverrideControls): ExportOverride[] {\n const explicit = (controls.overrides ?? []).filter(\n (o): o is ExportOverride => typeof o?.key === 'string' && o.key.length > 0,\n );\n const explicitKeys = new Set(explicit.map(o => o.key));\n\n const derived: ExportOverride[] = [];\n\n const baseBranch = controls.baseBranch?.trim();\n if (baseBranch) {\n derived.push({ key: 'target_branch', value: baseBranch });\n }\n\n const pushBranch = controls.pushBranch?.trim();\n if (pushBranch) {\n derived.push({ key: 'branch_format', value: pushBranch });\n }\n\n if (controls.useSameBranch === true) {\n derived.push({ key: 'use_same_branch', value: 'true' });\n }\n\n if (controls.createPr === false) {\n derived.push({ key: 'commit_only', value: 'true' });\n }\n\n return [...explicit, ...derived.filter(o => !explicitKeys.has(o.key))];\n}\n"],"names":[],"mappings":";;AAsCO,SAAS,qBAAqB,QAAA,EAAoD;AACvF,EAAA,MAAM,QAAA,GAAA,CAAY,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG,MAAA;AAAA,IAC1C,CAAC,MAA2B,OAAO,CAAA,EAAG,QAAQ,QAAA,IAAY,CAAA,CAAE,IAAI,MAAA,GAAS;AAAA,GAC3E;AACA,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,CAAC,CAAA;AAErD,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,IAAA,EAAK;AAC7C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,YAAY,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,IAAA,EAAK;AAC7C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,YAAY,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,QAAA,CAAS,kBAAkB,IAAA,EAAM;AACnC,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,QAAA,CAAS,aAAa,KAAA,EAAO;AAC/B,IAAA,OAAA,CAAQ,KAAK,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAC,CAAA;AACvE;;;;"}
@@ -0,0 +1,105 @@
1
+ 'use strict';
2
+
3
+ var apiObjects = require('../utils/api-objects.cjs.js');
4
+
5
+ function filterConfigsByAppstackId(configs, appstackId) {
6
+ const id = appstackId?.trim();
7
+ if (!id) {
8
+ return configs;
9
+ }
10
+ return configs.filter((c) => String(c.appstackId ?? "").trim() === id);
11
+ }
12
+ function toListItem(config) {
13
+ return {
14
+ id: config.id,
15
+ name: config.name,
16
+ type: config.type,
17
+ default: config.default,
18
+ appstackId: config.appstackId
19
+ };
20
+ }
21
+ async function listGitExporterConfigs(rootConfig, params, logger) {
22
+ const stackgenApis = apiObjects.getStackgenApiObjects(rootConfig);
23
+ logger.info(
24
+ `stack-exporter list configs (generated client) orgId=${params.orgId}${params.appstackId ? ` filter appstackId=${params.appstackId}` : ""}`
25
+ );
26
+ let list;
27
+ try {
28
+ const response = await stackgenApis.exporterConfigApiObj.getConfigs({
29
+ orgId: params.orgId,
30
+ type: params.type ?? "git"
31
+ });
32
+ list = Array.isArray(response) ? response : [];
33
+ } catch (error) {
34
+ const parsedError = await apiObjects.readClientError(error);
35
+ throw new Error(
36
+ `getConfigs failed: ${apiObjects.formatApiFailure(
37
+ parsedError.status,
38
+ parsedError.body,
39
+ parsedError.text,
40
+ parsedError.requestId
41
+ )}`
42
+ );
43
+ }
44
+ return filterConfigsByAppstackId(list, params.appstackId).map(toListItem);
45
+ }
46
+ function normalizeScmForExporter(t) {
47
+ const m = {
48
+ GITHUB: "github",
49
+ GITLAB: "gitlab",
50
+ BITBUCKET: "bitbucket",
51
+ // stack-exporter GitExporter expects `azuredev` (see azureDevSCMType), not `azuredevops`.
52
+ AZUREDEV: "azuredev"
53
+ };
54
+ return m[t] ?? t.toLowerCase();
55
+ }
56
+ async function createGitExporterConfiguration(rootConfig, params, logger) {
57
+ const stackgenApis = apiObjects.getStackgenApiObjects(rootConfig);
58
+ const bodyParams = {
59
+ scm_type: normalizeScmForExporter(params.scmType),
60
+ repo_url: params.repoUrl,
61
+ target_branch: params.targetBranch || "main",
62
+ path: params.path || "/"
63
+ };
64
+ if (params.stackgenIgnoreFile) {
65
+ bodyParams.stackgen_ignore_file = params.stackgenIgnoreFile;
66
+ }
67
+ const body = {
68
+ name: params.name,
69
+ type: "git",
70
+ parameters: bodyParams,
71
+ secrets: params.secrets,
72
+ ...params.appstackId ? { appstackId: params.appstackId } : {}
73
+ };
74
+ logger.info(
75
+ `stack-exporter create config (generated client)${params.appstackId ? ` appstackId=${params.appstackId}` : " (no appstackId)"}`
76
+ );
77
+ let payload;
78
+ try {
79
+ payload = await stackgenApis.exporterConfigApiObj.createConfig({
80
+ config: body,
81
+ orgId: params.orgId
82
+ });
83
+ } catch (error) {
84
+ const parsedError = await apiObjects.readClientError(error);
85
+ throw new Error(
86
+ `createConfig failed: ${apiObjects.formatApiFailure(
87
+ parsedError.status,
88
+ parsedError.body,
89
+ parsedError.text,
90
+ parsedError.requestId
91
+ )}`
92
+ );
93
+ }
94
+ const id = payload?.id;
95
+ if (!id) {
96
+ throw new Error("createConfig response missing id");
97
+ }
98
+ return id;
99
+ }
100
+
101
+ exports.createGitExporterConfiguration = createGitExporterConfiguration;
102
+ exports.filterConfigsByAppstackId = filterConfigsByAppstackId;
103
+ exports.listGitExporterConfigs = listGitExporterConfigs;
104
+ exports.normalizeScmForExporter = normalizeScmForExporter;
105
+ //# sourceMappingURL=gitExporterConfigHttp.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitExporterConfigHttp.cjs.js","sources":["../../src/exporter/gitExporterConfigHttp.ts"],"sourcesContent":["import type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n formatApiFailure,\n getStackgenApiObjects,\n readClientError,\n} from '../utils/api-objects';\n\nexport type ExporterGitConfigListItem = {\n id?: string;\n name?: string;\n type?: string;\n default?: boolean;\n appstackId?: string;\n};\n\ntype GeneratedExporterConfig = ExporterGitConfigListItem;\n\n/** Filters generated-client Config rows to a single appstack (client-side; see listGitExporterConfigs). */\nexport function filterConfigsByAppstackId<T extends { appstackId?: string }>(\n configs: T[],\n appstackId?: string,\n): T[] {\n const id = appstackId?.trim();\n if (!id) {\n return configs;\n }\n return configs.filter(c => String(c.appstackId ?? '').trim() === id);\n}\n\nfunction toListItem(config: GeneratedExporterConfig): ExporterGitConfigListItem {\n return {\n id: config.id,\n name: config.name,\n type: config.type,\n default: config.default,\n appstackId: config.appstackId,\n };\n}\n\n/**\n * Lists git exporter configs via the generated ConfigApi client.\n * Note: `getConfigs` must receive a response the client can parse as Config[] (a JSON array).\n * When `appstackId` is set we list git configs for the org and filter by `appstackId` on the\n * typed client models — passing `appstack_id` on GET /config returns a non-array body that\n * breaks the generated deserializer.\n */\nexport async function listGitExporterConfigs(\n rootConfig: Config,\n params: { orgId: string; appstackId?: string; type?: 'git' | 'blobstore' },\n logger: LoggerService,\n): Promise<ExporterGitConfigListItem[]> {\n const stackgenApis = getStackgenApiObjects(rootConfig);\n logger.info(\n `stack-exporter list configs (generated client) orgId=${params.orgId}${\n params.appstackId ? ` filter appstackId=${params.appstackId}` : ''\n }`,\n );\n\n let list: GeneratedExporterConfig[];\n try {\n const response = await stackgenApis.exporterConfigApiObj.getConfigs({\n orgId: params.orgId,\n type: params.type ?? 'git',\n });\n list = Array.isArray(response) ? response : [];\n } catch (error) {\n const parsedError = await readClientError(error);\n throw new Error(\n `getConfigs failed: ${formatApiFailure(\n parsedError.status,\n parsedError.body,\n parsedError.text,\n parsedError.requestId,\n )}`,\n );\n }\n\n return filterConfigsByAppstackId(list, params.appstackId).map(toListItem);\n}\n\nexport type GitExporterSecrets = {\n token?: string;\n token_ref?: string;\n};\n\nexport type CreateGitExporterConfigParams = {\n orgId: string | undefined;\n name: string;\n appstackId?: string;\n scmType: string;\n repoUrl: string;\n targetBranch: string;\n path: string;\n stackgenIgnoreFile?: string;\n secrets: GitExporterSecrets;\n};\n\n/** Maps createProject-style SCM enums to stack-exporter createConfig `scm_type` values. */\nexport function normalizeScmForExporter(t: string): string {\n const m: Record<string, string> = {\n GITHUB: 'github',\n GITLAB: 'gitlab',\n BITBUCKET: 'bitbucket',\n // stack-exporter GitExporter expects `azuredev` (see azureDevSCMType), not `azuredevops`.\n AZUREDEV: 'azuredev',\n };\n return m[t] ?? t.toLowerCase();\n}\n\nexport async function createGitExporterConfiguration(\n rootConfig: Config,\n params: CreateGitExporterConfigParams,\n logger: LoggerService,\n): Promise<string> {\n const stackgenApis = getStackgenApiObjects(rootConfig);\n\n const bodyParams: Record<string, string> = {\n scm_type: normalizeScmForExporter(params.scmType),\n repo_url: params.repoUrl,\n target_branch: params.targetBranch || 'main',\n path: params.path || '/',\n };\n if (params.stackgenIgnoreFile) {\n bodyParams.stackgen_ignore_file = params.stackgenIgnoreFile;\n }\n\n const body = {\n name: params.name,\n type: 'git',\n parameters: bodyParams,\n secrets: params.secrets,\n ...(params.appstackId ? { appstackId: params.appstackId } : {}),\n };\n\n logger.info(\n `stack-exporter create config (generated client)${\n params.appstackId ? ` appstackId=${params.appstackId}` : ' (no appstackId)'\n }`,\n );\n let payload;\n try {\n payload = await stackgenApis.exporterConfigApiObj.createConfig({\n config: body as never,\n orgId: params.orgId,\n });\n } catch (error) {\n const parsedError = await readClientError(error);\n throw new Error(\n `createConfig failed: ${formatApiFailure(\n parsedError.status,\n parsedError.body,\n parsedError.text,\n parsedError.requestId,\n )}`,\n );\n }\n const id = payload?.id;\n if (!id) {\n throw new Error('createConfig response missing id');\n }\n return id;\n}\n"],"names":["getStackgenApiObjects","readClientError","formatApiFailure"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ function apiErrorMessage(body, text = "") {
4
+ const o = body && typeof body === "object" ? body : {};
5
+ const msg = typeof o.message === "string" && o.message || typeof o.msg === "string" && o.msg || typeof o.error === "string" && o.error || text.slice(0, 500);
6
+ if (!Array.isArray(o.extras) || o.extras.length === 0) {
7
+ return msg;
8
+ }
9
+ const extras = o.extras.filter((e) => typeof e === "string" && e.length > 0).join("; ");
10
+ return extras ? `${msg}: ${extras}` : msg;
11
+ }
12
+
13
+ exports.apiErrorMessage = apiErrorMessage;
14
+ //# sourceMappingURL=http.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.cjs.js","sources":["../../src/exporter/http.ts"],"sourcesContent":["export type Json = Record<string, unknown>;\n\nexport function apiErrorMessage(body: unknown, text = ''): string {\n const o = (body && typeof body === 'object' ? body : {}) as Json;\n const msg =\n (typeof o.message === 'string' && o.message) ||\n (typeof o.msg === 'string' && o.msg) ||\n (typeof o.error === 'string' && o.error) ||\n text.slice(0, 500);\n\n if (!Array.isArray(o.extras) || o.extras.length === 0) {\n return msg;\n }\n\n const extras = o.extras\n .filter((e): e is string => typeof e === 'string' && e.length > 0)\n .join('; ');\n return extras ? `${msg}: ${extras}` : msg;\n}\n\n"],"names":[],"mappings":";;AAEO,SAAS,eAAA,CAAgB,IAAA,EAAe,IAAA,GAAO,EAAA,EAAY;AAChE,EAAA,MAAM,IAAK,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,EAAC;AACtD,EAAA,MAAM,GAAA,GACH,OAAO,CAAA,CAAE,OAAA,KAAY,YAAY,CAAA,CAAE,OAAA,IACnC,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,GAAA,IAC/B,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,EAAE,KAAA,IAClC,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAEnB,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACrD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAChE,KAAK,IAAI,CAAA;AACZ,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,GAAA;AACxC;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ function cleanBaseUrl(baseUrl) {
4
+ return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
5
+ }
6
+ function readOrgId(config, inputOrgId) {
7
+ const fromConfig = config.getOptionalString("stackGen.orgId");
8
+ return (inputOrgId ?? fromConfig)?.trim() || void 0;
9
+ }
10
+ function iacGenRoot(config) {
11
+ return config.getOptionalString("stackGen.iacGenBasePath") ?? "/iac-gen";
12
+ }
13
+ function exporterRoot(config) {
14
+ return config.getOptionalString("stackGen.exporterBasePath") ?? "/exporter/api/v1";
15
+ }
16
+ function vaultRoot(config) {
17
+ return config.getOptionalString("stackGen.vaultBasePath") ?? "/api/vault/v1";
18
+ }
19
+
20
+ exports.cleanBaseUrl = cleanBaseUrl;
21
+ exports.exporterRoot = exporterRoot;
22
+ exports.iacGenRoot = iacGenRoot;
23
+ exports.readOrgId = readOrgId;
24
+ exports.vaultRoot = vaultRoot;
25
+ //# sourceMappingURL=paths.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.cjs.js","sources":["../../src/exporter/paths.ts"],"sourcesContent":["import { Config } from '@backstage/config';\n\nexport function cleanBaseUrl(baseUrl: string): string {\n return baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n}\n\n/** Join base + path segment; path may start with / */\nexport function joinApiPath(base: string, segment: string): string {\n const b = cleanBaseUrl(base);\n const s = segment.startsWith('/') ? segment : `/${segment}`;\n return `${b}${s}`;\n}\n\nexport function readStackGenAuth(config: Config): { baseUrl: string; token: string } {\n return {\n baseUrl: cleanBaseUrl(config.getString('stackGen.baseUrl')),\n token: config.getString('stackGen.apiToken'),\n };\n}\n\nexport function readOrgId(\n config: Config,\n inputOrgId: string | undefined,\n): string | undefined {\n const fromConfig = config.getOptionalString('stackGen.orgId');\n return (inputOrgId ?? fromConfig)?.trim() || undefined;\n}\n\nexport function iacGenRoot(config: Config): string {\n return config.getOptionalString('stackGen.iacGenBasePath') ?? '/iac-gen';\n}\n\nexport function exporterRoot(config: Config): string {\n return config.getOptionalString('stackGen.exporterBasePath') ?? '/exporter/api/v1';\n}\n\nexport function vaultRoot(config: Config): string {\n return config.getOptionalString('stackGen.vaultBasePath') ?? '/api/vault/v1';\n}\n"],"names":[],"mappings":";;AAEO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,OAAO,OAAA,CAAQ,SAAS,GAAG,CAAA,GAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,OAAA;AACxD;AAgBO,SAAS,SAAA,CACd,QACA,UAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,iBAAA,CAAkB,gBAAgB,CAAA;AAC5D,EAAA,OAAA,CAAQ,UAAA,IAAc,UAAA,GAAa,IAAA,EAAK,IAAK,MAAA;AAC/C;AAEO,SAAS,WAAW,MAAA,EAAwB;AACjD,EAAA,OAAO,MAAA,CAAO,iBAAA,CAAkB,yBAAyB,CAAA,IAAK,UAAA;AAChE;AAEO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,OAAO,MAAA,CAAO,iBAAA,CAAkB,2BAA2B,CAAA,IAAK,kBAAA;AAClE;AAEO,SAAS,UAAU,MAAA,EAAwB;AAChD,EAAA,OAAO,MAAA,CAAO,iBAAA,CAAkB,wBAAwB,CAAA,IAAK,eAAA;AAC/D;;;;;;;;"}
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ var apiObjects = require('../utils/api-objects.cjs.js');
4
+
5
+ function readStringRecord(obj) {
6
+ return obj && typeof obj === "object" && obj !== null ? obj : {};
7
+ }
8
+ function isGitTemplateRow(t) {
9
+ if (t === null || typeof t !== "object") {
10
+ return false;
11
+ }
12
+ const type = String(t.type ?? "").trim().toLowerCase();
13
+ return type === "git";
14
+ }
15
+ function extractTemplateFields(t) {
16
+ const params = readStringRecord(t.parameters);
17
+ const secrets = readStringRecord(t.secrets);
18
+ const repoUrl = String(params.repo_url ?? params.repoUrl ?? "").trim();
19
+ const scmType = String(params.scm_type ?? params.scmType ?? "").trim();
20
+ const targetBranch = String(params.target_branch ?? params.targetBranch ?? "main").trim() || "main";
21
+ const rawPath = params.path;
22
+ const path = rawPath === void 0 || rawPath === null ? "/" : String(rawPath).trim() || "/";
23
+ const tokenRef = String(secrets.token_ref ?? secrets.tokenRef ?? "").trim();
24
+ const name = String(t.name ?? "default-git-config").trim() || "default-git-config";
25
+ if (!repoUrl || !scmType || !tokenRef) {
26
+ return void 0;
27
+ }
28
+ return { name, scmType, repoUrl, targetBranch, path, tokenRef };
29
+ }
30
+ function chooseGitTemplateFromTemplatesResponse(body) {
31
+ const root = readStringRecord(body);
32
+ const rawList = root.configTemplates ?? root.config_templates;
33
+ const list = Array.isArray(rawList) ? rawList : [];
34
+ const gitRecords = list.filter(isGitTemplateRow);
35
+ const defaults = gitRecords.filter((t) => t.default === true);
36
+ if (defaults.length === 1) {
37
+ return extractTemplateFields(defaults[0]);
38
+ }
39
+ if (defaults.length > 1) {
40
+ throw new Error(
41
+ "Multiple default git config templates exist for this project; remove extras or pass gitConfig on stackGen:exportToGit."
42
+ );
43
+ }
44
+ if (gitRecords.length === 1) {
45
+ return extractTemplateFields(gitRecords[0]);
46
+ }
47
+ if (gitRecords.length > 1) {
48
+ throw new Error(
49
+ "Multiple git config templates exist for this project; mark one as default or pass gitConfig on stackGen:exportToGit."
50
+ );
51
+ }
52
+ return void 0;
53
+ }
54
+ async function fetchProjectGitTemplates(rootConfig, orgId, logger) {
55
+ const stackgenApis = apiObjects.getStackgenApiObjects(rootConfig);
56
+ logger.info("stack-exporter list config templates (generated client)");
57
+ return stackgenApis.exporterConfigTemplatesApiObj.getConfigTemplates({ orgId });
58
+ }
59
+
60
+ exports.chooseGitTemplateFromTemplatesResponse = chooseGitTemplateFromTemplatesResponse;
61
+ exports.fetchProjectGitTemplates = fetchProjectGitTemplates;
62
+ //# sourceMappingURL=projectGitExporterTemplate.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectGitExporterTemplate.cjs.js","sources":["../../src/exporter/projectGitExporterTemplate.ts"],"sourcesContent":["import type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { getStackgenApiObjects } from '../utils/api-objects';\n\n/** Fields needed to POST an appstack-scoped git config (from project template or explicit input). */\nexport type GitTemplateBootstrapFields = {\n name: string;\n scmType: string;\n repoUrl: string;\n targetBranch: string;\n path: string;\n tokenRef: string;\n};\n\nfunction readStringRecord(obj: unknown): Record<string, unknown> {\n return obj && typeof obj === 'object' && obj !== null ? (obj as Record<string, unknown>) : {};\n}\n\nfunction isGitTemplateRow(t: unknown): t is Record<string, unknown> {\n if (t === null || typeof t !== 'object') {\n return false;\n }\n const type = String((t as Record<string, unknown>).type ?? '')\n .trim()\n .toLowerCase();\n return type === 'git';\n}\n\nfunction extractTemplateFields(t: Record<string, unknown>): GitTemplateBootstrapFields | undefined {\n const params = readStringRecord(t.parameters);\n const secrets = readStringRecord(t.secrets);\n const repoUrl = String(params.repo_url ?? params.repoUrl ?? '').trim();\n const scmType = String(params.scm_type ?? params.scmType ?? '').trim();\n const targetBranch = String(params.target_branch ?? params.targetBranch ?? 'main').trim() || 'main';\n const rawPath = params.path;\n const path =\n rawPath === undefined || rawPath === null\n ? '/'\n : String(rawPath).trim() || '/';\n const tokenRef = String(secrets.token_ref ?? secrets.tokenRef ?? '').trim();\n const name = String(t.name ?? 'default-git-config').trim() || 'default-git-config';\n if (!repoUrl || !scmType || !tokenRef) {\n return undefined;\n }\n return { name, scmType, repoUrl, targetBranch, path, tokenRef };\n}\n\n/**\n * Parses stack-exporter `GET /config/template` body and picks the default git template,\n * or the sole git template, mirroring chooseConfig heuristics.\n */\nexport function chooseGitTemplateFromTemplatesResponse(body: unknown): GitTemplateBootstrapFields | undefined {\n const root = readStringRecord(body);\n const rawList = root.configTemplates ?? root.config_templates;\n const list = Array.isArray(rawList) ? rawList : [];\n const gitRecords = list.filter(isGitTemplateRow);\n const defaults = gitRecords.filter(t => t.default === true);\n\n if (defaults.length === 1) {\n return extractTemplateFields(defaults[0]);\n }\n if (defaults.length > 1) {\n throw new Error(\n 'Multiple default git config templates exist for this project; remove extras or pass gitConfig on stackGen:exportToGit.',\n );\n }\n if (gitRecords.length === 1) {\n return extractTemplateFields(gitRecords[0]);\n }\n if (gitRecords.length > 1) {\n throw new Error(\n 'Multiple git config templates exist for this project; mark one as default or pass gitConfig on stackGen:exportToGit.',\n );\n }\n return undefined;\n}\n\n/**\n * Fetches project-level git exporter templates (created from createProject gitConfig).\n */\nexport async function fetchProjectGitTemplates(\n rootConfig: Config,\n orgId: string,\n logger: LoggerService,\n): Promise<unknown> {\n const stackgenApis = getStackgenApiObjects(rootConfig);\n logger.info('stack-exporter list config templates (generated client)');\n return stackgenApis.exporterConfigTemplatesApiObj.getConfigTemplates({ orgId });\n}\n"],"names":["getStackgenApiObjects"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var apiObjects = require('../utils/api-objects.cjs.js');
4
+
5
+ function appstackIdFromRow(row) {
6
+ return typeof row.appstackId === "string" ? row.appstackId.trim() : "";
7
+ }
8
+ function topologyIdFromRow(row) {
9
+ return typeof row.uuid === "string" ? row.uuid.trim() : "";
10
+ }
11
+ function rowMatchesLookup(row, wanted) {
12
+ if (row.archived) {
13
+ return false;
14
+ }
15
+ const rowName = String(row.name ?? "").trim();
16
+ if (wanted.name && rowName === wanted.name) {
17
+ return true;
18
+ }
19
+ const wantedId = wanted.id?.trim();
20
+ if (!wantedId) {
21
+ return false;
22
+ }
23
+ return appstackIdFromRow(row) === wantedId || topologyIdFromRow(row) === wantedId;
24
+ }
25
+ async function findAppcdAppStack(params) {
26
+ const { config, teamId, appstackId, appstackName } = params;
27
+ const stackgenApis = apiObjects.getStackgenApiObjects(config);
28
+ const name = appstackName?.trim();
29
+ const id = appstackId?.trim();
30
+ if (!name && !id) {
31
+ throw new Error("appstackName or appstackId is required");
32
+ }
33
+ const list = await stackgenApis.appStacksApiObj.getAppStacks({
34
+ ...name ? { name } : {},
35
+ orgId: teamId
36
+ });
37
+ const rows = Array.isArray(list) ? list : [];
38
+ const match = rows.find((row) => rowMatchesLookup(row, { name, id }));
39
+ if (!match) {
40
+ throw new Error(
41
+ id ? `Appstack id '${id}' not found in org '${teamId}' via /appstacks` : `Appstack '${name}' not found in org '${teamId}' via /appstacks`
42
+ );
43
+ }
44
+ return match;
45
+ }
46
+ async function resolveTopologyId(params) {
47
+ const match = await findAppcdAppStack(params);
48
+ const topologyId = topologyIdFromRow(match);
49
+ if (!topologyId) {
50
+ throw new Error(
51
+ `Appstack '${params.appstackName || params.appstackId}' found but missing topology uuid`
52
+ );
53
+ }
54
+ return topologyId;
55
+ }
56
+ async function resolveExporterAppstackId(params) {
57
+ const { logger } = params;
58
+ const match = await findAppcdAppStack(params);
59
+ const exporterId = appstackIdFromRow(match);
60
+ if (!exporterId) {
61
+ throw new Error(
62
+ `No appcd appstackId found${params.appstackName ? ` for "${params.appstackName}"` : ""}${params.appstackId ? ` (lookup id ${params.appstackId})` : ""} in org "${params.teamId}" via /appstacks.`
63
+ );
64
+ }
65
+ logger.info(`Resolved exporter appstackId ${exporterId}`);
66
+ return exporterId;
67
+ }
68
+
69
+ exports.resolveExporterAppstackId = resolveExporterAppstackId;
70
+ exports.resolveTopologyId = resolveTopologyId;
71
+ //# sourceMappingURL=topologyResolve.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topologyResolve.cjs.js","sources":["../../src/exporter/topologyResolve.ts"],"sourcesContent":["import { LoggerService } from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { getStackgenApiObjects } from '../utils/api-objects';\n\ntype AppcdAppStack = {\n uuid?: string;\n appstackId?: string;\n name?: string;\n archived?: boolean;\n};\n\nfunction appstackIdFromRow(row: AppcdAppStack): string {\n return typeof row.appstackId === 'string' ? row.appstackId.trim() : '';\n}\n\nfunction topologyIdFromRow(row: AppcdAppStack): string {\n return typeof row.uuid === 'string' ? row.uuid.trim() : '';\n}\n\nfunction rowMatchesLookup(\n row: AppcdAppStack,\n wanted: { name?: string; id?: string },\n): boolean {\n if (row.archived) {\n return false;\n }\n const rowName = String(row.name ?? '').trim();\n if (wanted.name && rowName === wanted.name) {\n return true;\n }\n const wantedId = wanted.id?.trim();\n if (!wantedId) {\n return false;\n }\n // Match by exporter appstackId or topology uuid.\n return (\n appstackIdFromRow(row) === wantedId || topologyIdFromRow(row) === wantedId\n );\n}\n\n/**\n * `GET /appcd/api/v1/appstacks?name=&orgId=` via generated getAppStacks (array response).\n * Row fields: `appstackId` (exporter binding), `uuid` (topology id).\n */\nasync function findAppcdAppStack(params: {\n config: Config;\n teamId: string;\n appstackId?: string;\n appstackName?: string;\n}): Promise<AppcdAppStack> {\n const { config, teamId, appstackId, appstackName } = params;\n const stackgenApis = getStackgenApiObjects(config);\n const name = appstackName?.trim();\n const id = appstackId?.trim();\n\n if (!name && !id) {\n throw new Error('appstackName or appstackId is required');\n }\n\n const list = await stackgenApis.appStacksApiObj.getAppStacks({\n ...(name ? { name } : {}),\n orgId: teamId,\n });\n const rows: AppcdAppStack[] = Array.isArray(list) ? list : [];\n const match = rows.find(row => rowMatchesLookup(row, { name, id }));\n if (!match) {\n throw new Error(\n id\n ? `Appstack id '${id}' not found in org '${teamId}' via /appstacks`\n : `Appstack '${name}' not found in org '${teamId}' via /appstacks`,\n );\n }\n return match;\n}\n\n/** Topology id (`uuid`) from appcd `GET /appstacks`. */\nexport async function resolveTopologyId(params: {\n config: Config;\n teamId: string;\n appstackId?: string;\n appstackName?: string;\n logger: LoggerService;\n}): Promise<string> {\n const match = await findAppcdAppStack(params);\n const topologyId = topologyIdFromRow(match);\n if (!topologyId) {\n throw new Error(\n `Appstack '${params.appstackName || params.appstackId}' found but missing topology uuid`,\n );\n }\n return topologyId;\n}\n\n/**\n * Exporter config binding id from appcd `GET /appstacks`.\n * Returns `appstackId`, never topology `uuid`.\n */\nexport async function resolveExporterAppstackId(params: {\n config: Config;\n teamId: string;\n appstackId?: string;\n appstackName?: string;\n logger: LoggerService;\n}): Promise<string> {\n const { logger } = params;\n const match = await findAppcdAppStack(params);\n const exporterId = appstackIdFromRow(match);\n if (!exporterId) {\n throw new Error(\n `No appcd appstackId found${\n params.appstackName ? ` for \"${params.appstackName}\"` : ''\n }${params.appstackId ? ` (lookup id ${params.appstackId})` : ''} in org \"${\n params.teamId\n }\" via /appstacks.`,\n );\n }\n logger.info(`Resolved exporter appstackId ${exporterId}`);\n return exporterId;\n}\n"],"names":["getStackgenApiObjects"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var plugin = require('./plugin/plugin.cjs.js');
6
+ var create_appstack_action = require('./actions/core/create_appstack_action.cjs.js');
7
+ var create_project_action = require('./actions/core/create_project_action.cjs.js');
8
+ var download_iac_action = require('./actions/core/download_iac_action.cjs.js');
9
+ var set_state_backend_action = require('./actions/core/set_state_backend_action.cjs.js');
10
+ var assign_project_members_action = require('./actions/core/assign_project_members_action.cjs.js');
11
+ var set_environment_variable_values_action = require('./actions/core/set_environment_variable_values_action.cjs.js');
12
+ var export_iac_to_git_action = require('./actions/exporter/export_iac_to_git_action.cjs.js');
13
+ var list_vault_secrets_action = require('./actions/exporter/list_vault_secrets_action.cjs.js');
14
+ var stackgenUiProxiesModule = require('./modules/stackgenUiProxiesModule.cjs.js');
15
+ var stackgenExporterScaffolderModule = require('./modules/stackgenExporterScaffolderModule.cjs.js');
16
+
17
+
18
+
19
+ exports.default = plugin.stackGenPlugin;
20
+ exports.createAppStackAction = create_appstack_action.createAppStackAction;
21
+ exports.createProjectAction = create_project_action.createProjectAction;
22
+ exports.downloadIaCAction = download_iac_action.downloadIaCAction;
23
+ exports.setStateBackendAction = set_state_backend_action.setStateBackendAction;
24
+ exports.assignProjectMembersAction = assign_project_members_action.assignProjectMembersAction;
25
+ exports.setEnvironmentVariableValuesAction = set_environment_variable_values_action.setEnvironmentVariableValuesAction;
26
+ exports.exportAppStackToGitAction = export_iac_to_git_action.exportAppStackToGitAction;
27
+ exports.listVaultSecretsAction = list_vault_secrets_action.listVaultSecretsAction;
28
+ exports.stackgenUiProxiesModule = stackgenUiProxiesModule.stackgenUiProxiesModule;
29
+ exports.stackgenVaultSecretsModule = stackgenUiProxiesModule.stackgenUiProxiesModule;
30
+ exports.stackgenExporterScaffolderModule = stackgenExporterScaffolderModule.stackgenExporterScaffolderModule;
31
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}