@backstage/create-app 0.9.1-next.0 → 0.9.1-next.2

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 (56) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/createApp.cjs.js +56 -0
  3. package/dist/createApp.cjs.js.map +1 -1
  4. package/dist/lib/tasks.cjs.js +10 -0
  5. package/dist/lib/tasks.cjs.js.map +1 -1
  6. package/dist/package.json.cjs.js +1 -1
  7. package/dist/packages/app-defaults/package.json.cjs.js +1 -1
  8. package/dist/packages/backend-defaults/package.json.cjs.js +1 -1
  9. package/dist/packages/cli/package.json.cjs.js +1 -1
  10. package/dist/packages/cli-defaults/package.json.cjs.js +1 -1
  11. package/dist/packages/core-app-api/package.json.cjs.js +1 -1
  12. package/dist/packages/core-compat-api/package.json.cjs.js +1 -1
  13. package/dist/packages/core-components/package.json.cjs.js +1 -1
  14. package/dist/packages/core-plugin-api/package.json.cjs.js +1 -1
  15. package/dist/packages/frontend-defaults/package.json.cjs.js +1 -1
  16. package/dist/packages/frontend-plugin-api/package.json.cjs.js +1 -1
  17. package/dist/packages/frontend-test-utils/package.json.cjs.js +1 -1
  18. package/dist/packages/integration-react/package.json.cjs.js +1 -1
  19. package/dist/packages/repo-tools/package.json.cjs.js +1 -1
  20. package/dist/packages/test-utils/package.json.cjs.js +1 -1
  21. package/dist/plugins/api-docs/package.json.cjs.js +1 -1
  22. package/dist/plugins/app-backend/package.json.cjs.js +1 -1
  23. package/dist/plugins/app-module-user-settings/package.json.cjs.js +1 -1
  24. package/dist/plugins/app-react/package.json.cjs.js +1 -1
  25. package/dist/plugins/app-visualizer/package.json.cjs.js +1 -1
  26. package/dist/plugins/auth/package.json.cjs.js +1 -1
  27. package/dist/plugins/auth-backend/package.json.cjs.js +1 -1
  28. package/dist/plugins/catalog/package.json.cjs.js +1 -1
  29. package/dist/plugins/catalog-backend/package.json.cjs.js +1 -1
  30. package/dist/plugins/catalog-backend-module-logs/package.json.cjs.js +1 -1
  31. package/dist/plugins/catalog-backend-module-scaffolder-entity-model/package.json.cjs.js +1 -1
  32. package/dist/plugins/catalog-graph/package.json.cjs.js +1 -1
  33. package/dist/plugins/catalog-import/package.json.cjs.js +1 -1
  34. package/dist/plugins/catalog-react/package.json.cjs.js +1 -1
  35. package/dist/plugins/kubernetes/package.json.cjs.js +1 -1
  36. package/dist/plugins/kubernetes-backend/package.json.cjs.js +1 -1
  37. package/dist/plugins/mcp-actions-backend/package.json.cjs.js +1 -1
  38. package/dist/plugins/notifications/package.json.cjs.js +1 -1
  39. package/dist/plugins/notifications-backend/package.json.cjs.js +1 -1
  40. package/dist/plugins/org/package.json.cjs.js +1 -1
  41. package/dist/plugins/permission-react/package.json.cjs.js +1 -1
  42. package/dist/plugins/scaffolder/package.json.cjs.js +1 -1
  43. package/dist/plugins/scaffolder-backend/package.json.cjs.js +1 -1
  44. package/dist/plugins/scaffolder-backend-module-github/package.json.cjs.js +1 -1
  45. package/dist/plugins/search/package.json.cjs.js +1 -1
  46. package/dist/plugins/search-react/package.json.cjs.js +1 -1
  47. package/dist/plugins/signals/package.json.cjs.js +1 -1
  48. package/dist/plugins/signals-react/package.json.cjs.js +1 -1
  49. package/dist/plugins/techdocs/package.json.cjs.js +1 -1
  50. package/dist/plugins/techdocs-backend/package.json.cjs.js +1 -1
  51. package/dist/plugins/techdocs-module-addons-contrib/package.json.cjs.js +1 -1
  52. package/dist/plugins/techdocs-react/package.json.cjs.js +1 -1
  53. package/dist/plugins/user-settings/package.json.cjs.js +1 -1
  54. package/package.json +3 -3
  55. package/templates/default-app/packages/backend/Dockerfile +0 -13
  56. package/templates/legacy-app/packages/backend/Dockerfile +0 -13
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @backstage/create-app
2
2
 
3
+ ## 0.9.1-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 943687f: Generated backend Dockerfiles no longer disable the Node.js snapshot or install native build dependencies for the Scaffolder.
8
+ - 9138f34: Added a GitHub Actions CI workflow to the default app template. New Backstage instances created with `create-app` now include a `.github/workflows/ci.yml` that runs lint, type checking, tests, configuration validation, and a Docker image build on every pull request.
9
+ - 2828e31: Added a prerequisites check when creating a new app that validates Node.js LTS version and Yarn availability before proceeding, and warns if Python is not found.
10
+
11
+ ## 0.9.1-next.1
12
+
13
+ ### Patch Changes
14
+
15
+ - Bumped create-app version.
16
+
3
17
  ## 0.9.1-next.0
4
18
 
5
19
  ### Patch Changes
@@ -18,7 +18,63 @@ var os__default = /*#__PURE__*/_interopDefaultCompat(os);
18
18
  var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
19
19
 
20
20
  const DEFAULT_BRANCH = "master";
21
+ const SUPPORTED_NODE_VERSIONS = ["22.x", "24.x"];
21
22
  var createApp = async (opts) => {
23
+ let hasPrerequisiteError = false;
24
+ const supportedMajors = SUPPORTED_NODE_VERSIONS.map(
25
+ (v) => parseInt(v.split(".")[0], 10)
26
+ );
27
+ const [major, minor, patch] = process.versions.node.split(".").map(Number);
28
+ const yarn = await tasks.tryCommandForVersion("yarn -v");
29
+ let python = await tasks.tryCommandForVersion("python3 --version");
30
+ if (python.error) {
31
+ python = await tasks.tryCommandForVersion("python --version");
32
+ }
33
+ tasks.Task.log();
34
+ tasks.Task.log("Prerequisites check...");
35
+ tasks.Task.log();
36
+ tasks.Task.log(` Node version is: ${major}.${minor}.${patch}`);
37
+ tasks.Task.log(` Yarn version is: ${yarn.version}`);
38
+ tasks.Task.log(` Python version is: ${python.version.replace(/^Python\s+/, "")}`);
39
+ if (yarn.error) {
40
+ tasks.Task.error(
41
+ "Yarn is not available. Please install Yarn before creating a Backstage app."
42
+ );
43
+ hasPrerequisiteError = true;
44
+ }
45
+ if (python.error) {
46
+ tasks.Task.log(
47
+ chalk__default.default.yellow(
48
+ "Warning: Python is not available. Python is required by node-gyp for some native dependencies."
49
+ )
50
+ );
51
+ }
52
+ if (major % 2 !== 0) {
53
+ tasks.Task.error(
54
+ `Node version ${major} is an odd-numbered release and is not a supported LTS version. Please use an even-numbered LTS version (${SUPPORTED_NODE_VERSIONS.join(
55
+ " or "
56
+ )}).`
57
+ );
58
+ hasPrerequisiteError = true;
59
+ } else if (!supportedMajors.includes(major)) {
60
+ tasks.Task.error(
61
+ `Node version ${major} is not a supported LTS version. Please use a supported version (${SUPPORTED_NODE_VERSIONS.join(
62
+ " or "
63
+ )}).`
64
+ );
65
+ hasPrerequisiteError = true;
66
+ }
67
+ if (hasPrerequisiteError) {
68
+ tasks.Task.log(
69
+ "It seems that something went wrong when validating the prerequisites \u{1F914}"
70
+ );
71
+ tasks.Task.log(
72
+ "For help with setting up prerequisites, see https://backstage.io/docs/getting-started/#prerequisites"
73
+ );
74
+ tasks.Task.error("\u{1F525} Failed to validate needed prerequisites!");
75
+ tasks.Task.exit(1);
76
+ return;
77
+ }
22
78
  const answers = await inquirer__default.default.prompt([
23
79
  {
24
80
  type: "input",
@@ -1 +1 @@
1
- {"version":3,"file":"createApp.cjs.js","sources":["../src/createApp.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport { OptionValues } from 'commander';\nimport inquirer, { Answers } from 'inquirer';\nimport { resolve as resolvePath } from 'node:path';\nimport { targetPaths, findOwnPaths } from '@backstage/cli-common';\nimport os from 'node:os';\nimport fs from 'fs-extra';\nimport {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n moveAppTask,\n templatingTask,\n tryInitGitRepository,\n readGitConfig,\n fetchYarnLockSeedTask,\n} from './lib/tasks';\n\nconst DEFAULT_BRANCH = 'master';\n\nexport default async (opts: OptionValues): Promise<void> => {\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n default: 'backstage',\n message: chalk.blue('Enter a name for the app [required]'),\n validate: (value: any) => {\n if (!value) {\n return chalk.red('Please enter a name for the app');\n } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {\n return chalk.red(\n 'App name must be lowercase and contain only letters, digits, and dashes.',\n );\n }\n return true;\n },\n when: (a: Answers) => {\n const envName = process.env.BACKSTAGE_APP_NAME;\n if (envName) {\n a.name = envName;\n return false;\n }\n return true;\n },\n },\n ]);\n\n // Pick the built-in template based on the --legacy flag\n /* eslint-disable-next-line no-restricted-syntax */\n const ownPaths = findOwnPaths(__dirname);\n const builtInTemplate = opts.legacy\n ? ownPaths.resolve('templates/legacy-app')\n : ownPaths.resolve('templates/default-app');\n\n // Use `--template-path` argument as template when specified. Otherwise, use the default template.\n const templateDir = opts.templatePath\n ? targetPaths.resolve(opts.templatePath)\n : builtInTemplate;\n\n // Use `--path` argument as application directory when specified, otherwise\n // create a directory using `answers.name`\n const appDir = opts.path\n ? resolvePath(targetPaths.dir, opts.path)\n : resolvePath(targetPaths.dir, answers.name);\n\n Task.log();\n Task.log('Creating the app...');\n\n try {\n const gitConfig = await readGitConfig();\n\n if (opts.path) {\n // Template directly to specified path\n\n Task.section('Checking that supplied path exists');\n await checkPathExistsTask(appDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, opts.path, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n } else {\n // Template to temporary location, and then move files\n\n Task.section('Checking if the directory is available');\n await checkAppExistsTask(targetPaths.dir, answers.name);\n\n Task.section('Creating a temporary app directory');\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), answers.name));\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n const fetchedYarnLockSeed = await fetchYarnLockSeedTask(appDir);\n\n if (gitConfig) {\n if (await tryInitGitRepository(appDir)) {\n // Since we don't know whether we were able to init git before we\n // try, we can't track the actual task execution\n Task.forItem('init', 'git repository', async () => {});\n }\n }\n\n if (!opts.skipInstall) {\n Task.section('Installing dependencies');\n await buildAppTask(appDir);\n }\n\n Task.log();\n Task.log(\n chalk.green(`🥇 Successfully created ${chalk.cyan(answers.name)}`),\n );\n Task.log();\n\n if (!fetchedYarnLockSeed) {\n Task.log(\n chalk.yellow(\n [\n 'Warning: Failed to fetch the yarn.lock seed file.',\n ' You may end up with incompatible dependencies that break the app.',\n ' If you run into any errors, please search the issues at',\n ' https://github.com/backstage/backstage/issues for potential solutions',\n ].join('\\n'),\n ),\n );\n }\n\n Task.section('All set! Now you might want to');\n if (opts.skipInstall) {\n Task.log(\n ` Install the dependencies: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn install`,\n )}`,\n );\n }\n Task.log(\n ` Run the app: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn start`,\n )}`,\n );\n Task.log(\n ' Set up the software catalog: https://backstage.io/docs/features/software-catalog/configuration',\n );\n Task.log(' Add authentication: https://backstage.io/docs/auth/');\n Task.log();\n Task.exit();\n } catch (error) {\n Task.error(String(error));\n\n Task.log('It seems that something went wrong when creating the app 🤔');\n\n Task.error('🔥 Failed to create app!');\n Task.exit(1);\n }\n};\n"],"names":["inquirer","chalk","findOwnPaths","targetPaths","resolvePath","Task","readGitConfig","checkPathExistsTask","templatingTask","checkAppExistsTask","fs","os","moveAppTask","fetchYarnLockSeedTask","tryInitGitRepository","buildAppTask"],"mappings":"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"}
1
+ {"version":3,"file":"createApp.cjs.js","sources":["../src/createApp.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport { OptionValues } from 'commander';\nimport inquirer, { Answers } from 'inquirer';\nimport { resolve as resolvePath } from 'node:path';\nimport { targetPaths, findOwnPaths } from '@backstage/cli-common';\nimport os from 'node:os';\nimport fs from 'fs-extra';\nimport {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n moveAppTask,\n templatingTask,\n tryInitGitRepository,\n readGitConfig,\n fetchYarnLockSeedTask,\n tryCommandForVersion,\n} from './lib/tasks';\n\nconst DEFAULT_BRANCH = 'master';\n// Uses the same 'N.x' format as GitHub Actions node-version matrices for easy find-and-replace.\n// Keep in sync with the engines.node field in the root package.json.\nconst SUPPORTED_NODE_VERSIONS = ['22.x', '24.x'];\n\nexport default async (opts: OptionValues): Promise<void> => {\n // Prerequisite check — runs before the interactive prompt to fail fast\n let hasPrerequisiteError = false;\n const supportedMajors = SUPPORTED_NODE_VERSIONS.map(v =>\n parseInt(v.split('.')[0], 10),\n );\n const [major, minor, patch] = process.versions.node.split('.').map(Number);\n const yarn = await tryCommandForVersion('yarn -v');\n let python = await tryCommandForVersion('python3 --version');\n if (python.error) {\n python = await tryCommandForVersion('python --version');\n }\n\n Task.log();\n Task.log('Prerequisites check...');\n Task.log();\n Task.log(` Node version is: ${major}.${minor}.${patch}`);\n Task.log(` Yarn version is: ${yarn.version}`);\n Task.log(` Python version is: ${python.version.replace(/^Python\\s+/, '')}`);\n\n if (yarn.error) {\n Task.error(\n 'Yarn is not available. Please install Yarn before creating a Backstage app.',\n );\n hasPrerequisiteError = true;\n }\n\n if (python.error) {\n Task.log(\n chalk.yellow(\n 'Warning: Python is not available. Python is required by node-gyp for some native dependencies.',\n ),\n );\n }\n\n if (major % 2 !== 0) {\n Task.error(\n `Node version ${major} is an odd-numbered release and is not a supported LTS version. Please use an even-numbered LTS version (${SUPPORTED_NODE_VERSIONS.join(\n ' or ',\n )}).`,\n );\n hasPrerequisiteError = true;\n } else if (!supportedMajors.includes(major)) {\n Task.error(\n `Node version ${major} is not a supported LTS version. Please use a supported version (${SUPPORTED_NODE_VERSIONS.join(\n ' or ',\n )}).`,\n );\n hasPrerequisiteError = true;\n }\n\n if (hasPrerequisiteError) {\n Task.log(\n 'It seems that something went wrong when validating the prerequisites 🤔',\n );\n Task.log(\n 'For help with setting up prerequisites, see https://backstage.io/docs/getting-started/#prerequisites',\n );\n\n Task.error('🔥 Failed to validate needed prerequisites!');\n Task.exit(1);\n return;\n }\n\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n default: 'backstage',\n message: chalk.blue('Enter a name for the app [required]'),\n validate: (value: any) => {\n if (!value) {\n return chalk.red('Please enter a name for the app');\n } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {\n return chalk.red(\n 'App name must be lowercase and contain only letters, digits, and dashes.',\n );\n }\n return true;\n },\n when: (a: Answers) => {\n const envName = process.env.BACKSTAGE_APP_NAME;\n if (envName) {\n a.name = envName;\n return false;\n }\n return true;\n },\n },\n ]);\n\n // Pick the built-in template based on the --legacy flag\n /* eslint-disable-next-line no-restricted-syntax */\n const ownPaths = findOwnPaths(__dirname);\n const builtInTemplate = opts.legacy\n ? ownPaths.resolve('templates/legacy-app')\n : ownPaths.resolve('templates/default-app');\n\n // Use `--template-path` argument as template when specified. Otherwise, use the default template.\n const templateDir = opts.templatePath\n ? targetPaths.resolve(opts.templatePath)\n : builtInTemplate;\n\n // Use `--path` argument as application directory when specified, otherwise\n // create a directory using `answers.name`\n const appDir = opts.path\n ? resolvePath(targetPaths.dir, opts.path)\n : resolvePath(targetPaths.dir, answers.name);\n\n Task.log();\n Task.log('Creating the app...');\n\n try {\n const gitConfig = await readGitConfig();\n\n if (opts.path) {\n // Template directly to specified path\n\n Task.section('Checking that supplied path exists');\n await checkPathExistsTask(appDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, opts.path, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n } else {\n // Template to temporary location, and then move files\n\n Task.section('Checking if the directory is available');\n await checkAppExistsTask(targetPaths.dir, answers.name);\n\n Task.section('Creating a temporary app directory');\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), answers.name));\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n const fetchedYarnLockSeed = await fetchYarnLockSeedTask(appDir);\n\n if (gitConfig) {\n if (await tryInitGitRepository(appDir)) {\n // Since we don't know whether we were able to init git before we\n // try, we can't track the actual task execution\n Task.forItem('init', 'git repository', async () => {});\n }\n }\n\n if (!opts.skipInstall) {\n Task.section('Installing dependencies');\n await buildAppTask(appDir);\n }\n\n Task.log();\n Task.log(\n chalk.green(`🥇 Successfully created ${chalk.cyan(answers.name)}`),\n );\n Task.log();\n\n if (!fetchedYarnLockSeed) {\n Task.log(\n chalk.yellow(\n [\n 'Warning: Failed to fetch the yarn.lock seed file.',\n ' You may end up with incompatible dependencies that break the app.',\n ' If you run into any errors, please search the issues at',\n ' https://github.com/backstage/backstage/issues for potential solutions',\n ].join('\\n'),\n ),\n );\n }\n\n Task.section('All set! Now you might want to');\n if (opts.skipInstall) {\n Task.log(\n ` Install the dependencies: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn install`,\n )}`,\n );\n }\n Task.log(\n ` Run the app: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn start`,\n )}`,\n );\n Task.log(\n ' Set up the software catalog: https://backstage.io/docs/features/software-catalog/configuration',\n );\n Task.log(' Add authentication: https://backstage.io/docs/auth/');\n Task.log();\n Task.exit();\n } catch (error) {\n Task.error(String(error));\n\n Task.log('It seems that something went wrong when creating the app 🤔');\n\n Task.error('🔥 Failed to create app!');\n Task.exit(1);\n }\n};\n"],"names":["tryCommandForVersion","Task","chalk","inquirer","findOwnPaths","targetPaths","resolvePath","readGitConfig","checkPathExistsTask","templatingTask","checkAppExistsTask","fs","os","moveAppTask","fetchYarnLockSeedTask","tryInitGitRepository","buildAppTask"],"mappings":"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"}
@@ -223,6 +223,15 @@ async function fetchYarnLockSeedTask(dir) {
223
223
  return false;
224
224
  }
225
225
  }
226
+ async function tryCommandForVersion(command) {
227
+ try {
228
+ const result = await exec(command);
229
+ const version = (result.stdout || result.stderr).trim();
230
+ return { version: version || "N/A", error: void 0 };
231
+ } catch (error) {
232
+ return { version: "N/A", error: String(error) };
233
+ }
234
+ }
226
235
 
227
236
  exports.Task = Task;
228
237
  exports.buildAppTask = buildAppTask;
@@ -232,5 +241,6 @@ exports.fetchYarnLockSeedTask = fetchYarnLockSeedTask;
232
241
  exports.moveAppTask = moveAppTask;
233
242
  exports.readGitConfig = readGitConfig;
234
243
  exports.templatingTask = templatingTask;
244
+ exports.tryCommandForVersion = tryCommandForVersion;
235
245
  exports.tryInitGitRepository = tryInitGitRepository;
236
246
  //# sourceMappingURL=tasks.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.cjs.js","sources":["../../src/lib/tasks.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport handlebars from 'handlebars';\nimport ora from 'ora';\nimport recursive from 'recursive-readdir';\nimport {\n basename,\n dirname,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { exec as execCb } from 'node:child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'node:util';\nimport os from 'node:os';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst TEN_MINUTES_MS = 1000 * 60 * 10;\nconst exec = promisify(execCb);\n\nexport type GitConfig = {\n defaultBranch?: string;\n};\n\nexport class Task {\n static log(name: string = '') {\n process.stdout.write(`${chalk.green(name)}\\n`);\n }\n\n static error(message: string = '') {\n process.stdout.write(`\\n${chalk.red(message)}\\n\\n`);\n }\n\n static section(name: string) {\n const title = chalk.green(`${name}:`);\n process.stdout.write(`\\n ${title}\\n`);\n }\n\n static exit(code: number = 0) {\n process.exit(code);\n }\n\n static async forItem(\n task: string,\n item: string,\n taskFunc: () => Promise<void>,\n ): Promise<void> {\n const paddedTask = chalk.green(task.padEnd(TASK_NAME_MAX_LENGTH));\n\n const spinner = ora({\n prefixText: chalk.green(` ${paddedTask}${chalk.cyan(item)}`),\n spinner: 'arc',\n color: 'green',\n }).start();\n\n try {\n await taskFunc();\n spinner.succeed();\n } catch (error) {\n spinner.fail();\n throw error;\n }\n }\n}\n\n/**\n * Generate a templated backstage project\n *\n * @param templateDir - location containing template files\n * @param destinationDir - location to save templated project\n * @param context - template parameters\n * @param excludedDirs - template files to exclude\n */\nexport async function templatingTask(\n templateDir: string,\n destinationDir: string,\n context: any,\n) {\n const files = await recursive(templateDir).catch(error => {\n throw new Error(`Failed to read template directory: ${error.message}`);\n });\n\n for (const file of files) {\n const filePath = relativePath(templateDir, file);\n\n const destinationFile = resolvePath(destinationDir, filePath);\n await fs.ensureDir(dirname(destinationFile));\n\n if (file.endsWith('.hbs')) {\n await Task.forItem('templating', basename(file), async () => {\n const destination = destinationFile.replace(/\\.hbs$/, '');\n\n const template = await fs.readFile(file);\n const compiled = handlebars.compile(template.toString());\n const contents = compiled(\n { name: basename(destination), ...context },\n {\n helpers: {\n version(name: keyof typeof packageVersions) {\n if (name in packageVersions) {\n return packageVersions[name];\n }\n throw new Error(`No version available for package ${name}`);\n },\n },\n },\n );\n\n await fs.writeFile(destination, contents).catch(error => {\n throw new Error(\n `Failed to create file: ${destination}: ${error.message}`,\n );\n });\n });\n } else {\n await Task.forItem('copying', basename(file), async () => {\n await fs.copyFile(file, destinationFile).catch(error => {\n const destination = destinationFile;\n throw new Error(\n `Failed to copy file to ${destination} : ${error.message}`,\n );\n });\n });\n }\n }\n}\n\n/**\n * Verify that application target does not already exist\n *\n * @param rootDir - The directory to create application folder `name`\n * @param name - The specified name of the application\n * @Throws Error - If directory with name of `destination` already exists\n */\nexport async function checkAppExistsTask(rootDir: string, name: string) {\n await Task.forItem('checking', name, async () => {\n const destination = resolvePath(rootDir, name);\n\n if (await fs.pathExists(destination)) {\n const existing = chalk.cyan(destination.replace(`${rootDir}/`, ''));\n throw new Error(\n `A directory with the same name already exists: ${existing}\\nPlease try again with a different app name`,\n );\n }\n });\n}\n\n/**\n * Verify that application `path` exists, otherwise create the directory\n *\n * @param path - target to create directory\n * @throws if `path` is a file, or `fs.mkdir` fails\n */\nexport async function checkPathExistsTask(path: string) {\n await Task.forItem('checking', path, async () => {\n try {\n await fs.mkdirs(path);\n } catch (error) {\n // will fail if a file already exists at given `path`\n throw new Error(`Failed to create app directory: ${error.message}`);\n }\n });\n}\n\n/**\n * Run `yarn install` and `run tsc` in application directory\n *\n * @param appDir - location of application to build\n */\nexport async function buildAppTask(appDir: string) {\n process.chdir(appDir);\n\n const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n await exec(cmd).catch(error => {\n process.stdout.write(error.stderr);\n process.stdout.write(error.stdout);\n throw new Error(`Could not execute command ${chalk.cyan(cmd)}`);\n });\n });\n };\n\n const installTimeout = setTimeout(() => {\n Task.error(\n \"\\n⏱️ It's taking a long time to install dependencies, you may want to exit (Ctrl-C) and run 'yarn install' and 'yarn tsc' manually\",\n );\n }, TEN_MINUTES_MS);\n\n await runCmd('yarn install').finally(() => clearTimeout(installTimeout));\n await runCmd('yarn tsc');\n}\n\n/**\n * Move temporary directory to destination application folder\n *\n * @param tempDir - source path to copy files from\n * @param destination - target path to copy files\n * @param id - item ID\n * @throws if `fs.move` fails\n */\nexport async function moveAppTask(\n tempDir: string,\n destination: string,\n id: string,\n) {\n await Task.forItem('moving', id, async () => {\n await fs\n .move(tempDir, destination)\n .catch(error => {\n throw new Error(\n `Failed to move app from ${tempDir} to ${destination}: ${error.message}`,\n );\n })\n .finally(() => {\n // remove temporary files on both success and failure\n fs.removeSync(tempDir);\n });\n });\n}\n\n/**\n * Read git configs by creating a temp folder and initializing a repo\n *\n * @throws if `exec` fails\n */\nexport async function readGitConfig(): Promise<GitConfig | undefined> {\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'git-temp-dir-'));\n\n try {\n await exec('git init', { cwd: tempDir });\n await exec('git commit --allow-empty -m \"Initial commit\"', {\n cwd: tempDir,\n });\n\n const getDefaultBranch = await exec(\n 'git branch --format=\"%(refname:short)\"',\n { cwd: tempDir },\n );\n\n return {\n defaultBranch: getDefaultBranch.stdout?.trim() || undefined,\n };\n } catch (error) {\n return undefined;\n } finally {\n await fs.rm(tempDir, { recursive: true });\n }\n}\n\n/**\n * Initializes a git repository in the destination folder if possible\n *\n * @param dir - source path to initialize git repository in\n * @returns true if git repository was initialized\n */\nexport async function tryInitGitRepository(dir: string) {\n try {\n // Check if we're already in a git repo\n await exec('git rev-parse --is-inside-work-tree', { cwd: dir });\n return false;\n } catch {\n /* ignored */\n }\n\n try {\n await exec('git init', { cwd: dir });\n await exec('git add .', { cwd: dir });\n await exec('git commit -m \"Initial commit\"', { cwd: dir });\n return true;\n } catch (error) {\n try {\n await fs.rm(resolvePath(dir, '.git'), { recursive: true, force: true });\n } catch {\n throw new Error('Failed to remove .git folder');\n }\n\n return false;\n }\n}\n\n/**\n * This fetches the yarn.lock seed file at https://github.com/backstage/backstage/blob/master/packages/create-app/seed-yarn.lock\n * Its purpose is to lock individual dependencies with broken releases to known working versions.\n * This flow is decoupled from the release of the create-app package in order to avoid\n * the need to re-publish the create-app package whenever we want to update the seed file.\n *\n * @returns true if the yarn.lock seed file was fetched successfully\n */\nexport async function fetchYarnLockSeedTask(dir: string) {\n try {\n await Task.forItem('fetching', 'yarn.lock seed', async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\n 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',\n {\n signal: controller.signal,\n },\n );\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(\n `Request failed with status ${res.status} ${res.statusText}`,\n );\n }\n\n const initialYarnLockContent = await res.text();\n\n await fs.writeFile(\n resolvePath(dir, 'yarn.lock'),\n initialYarnLockContent\n .split('\\n')\n .filter(l => !l.startsWith('//'))\n .join('\\n'),\n 'utf8',\n );\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["promisify","execCb","chalk","ora","recursive","relativePath","resolvePath","fs","dirname","basename","handlebars","packageVersions","os"],"mappings":"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"}
1
+ {"version":3,"file":"tasks.cjs.js","sources":["../../src/lib/tasks.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport handlebars from 'handlebars';\nimport ora from 'ora';\nimport recursive from 'recursive-readdir';\nimport {\n basename,\n dirname,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { exec as execCb } from 'node:child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'node:util';\nimport os from 'node:os';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst TEN_MINUTES_MS = 1000 * 60 * 10;\nconst exec = promisify(execCb);\n\nexport type GitConfig = {\n defaultBranch?: string;\n};\n\nexport class Task {\n static log(name: string = '') {\n process.stdout.write(`${chalk.green(name)}\\n`);\n }\n\n static error(message: string = '') {\n process.stdout.write(`\\n${chalk.red(message)}\\n\\n`);\n }\n\n static section(name: string) {\n const title = chalk.green(`${name}:`);\n process.stdout.write(`\\n ${title}\\n`);\n }\n\n static exit(code: number = 0) {\n process.exit(code);\n }\n\n static async forItem(\n task: string,\n item: string,\n taskFunc: () => Promise<void>,\n ): Promise<void> {\n const paddedTask = chalk.green(task.padEnd(TASK_NAME_MAX_LENGTH));\n\n const spinner = ora({\n prefixText: chalk.green(` ${paddedTask}${chalk.cyan(item)}`),\n spinner: 'arc',\n color: 'green',\n }).start();\n\n try {\n await taskFunc();\n spinner.succeed();\n } catch (error) {\n spinner.fail();\n throw error;\n }\n }\n}\n\n/**\n * Generate a templated backstage project\n *\n * @param templateDir - location containing template files\n * @param destinationDir - location to save templated project\n * @param context - template parameters\n * @param excludedDirs - template files to exclude\n */\nexport async function templatingTask(\n templateDir: string,\n destinationDir: string,\n context: any,\n) {\n const files = await recursive(templateDir).catch(error => {\n throw new Error(`Failed to read template directory: ${error.message}`);\n });\n\n for (const file of files) {\n const filePath = relativePath(templateDir, file);\n\n const destinationFile = resolvePath(destinationDir, filePath);\n await fs.ensureDir(dirname(destinationFile));\n\n if (file.endsWith('.hbs')) {\n await Task.forItem('templating', basename(file), async () => {\n const destination = destinationFile.replace(/\\.hbs$/, '');\n\n const template = await fs.readFile(file);\n const compiled = handlebars.compile(template.toString());\n const contents = compiled(\n { name: basename(destination), ...context },\n {\n helpers: {\n version(name: keyof typeof packageVersions) {\n if (name in packageVersions) {\n return packageVersions[name];\n }\n throw new Error(`No version available for package ${name}`);\n },\n },\n },\n );\n\n await fs.writeFile(destination, contents).catch(error => {\n throw new Error(\n `Failed to create file: ${destination}: ${error.message}`,\n );\n });\n });\n } else {\n await Task.forItem('copying', basename(file), async () => {\n await fs.copyFile(file, destinationFile).catch(error => {\n const destination = destinationFile;\n throw new Error(\n `Failed to copy file to ${destination} : ${error.message}`,\n );\n });\n });\n }\n }\n}\n\n/**\n * Verify that application target does not already exist\n *\n * @param rootDir - The directory to create application folder `name`\n * @param name - The specified name of the application\n * @Throws Error - If directory with name of `destination` already exists\n */\nexport async function checkAppExistsTask(rootDir: string, name: string) {\n await Task.forItem('checking', name, async () => {\n const destination = resolvePath(rootDir, name);\n\n if (await fs.pathExists(destination)) {\n const existing = chalk.cyan(destination.replace(`${rootDir}/`, ''));\n throw new Error(\n `A directory with the same name already exists: ${existing}\\nPlease try again with a different app name`,\n );\n }\n });\n}\n\n/**\n * Verify that application `path` exists, otherwise create the directory\n *\n * @param path - target to create directory\n * @throws if `path` is a file, or `fs.mkdir` fails\n */\nexport async function checkPathExistsTask(path: string) {\n await Task.forItem('checking', path, async () => {\n try {\n await fs.mkdirs(path);\n } catch (error) {\n // will fail if a file already exists at given `path`\n throw new Error(`Failed to create app directory: ${error.message}`);\n }\n });\n}\n\n/**\n * Run `yarn install` and `run tsc` in application directory\n *\n * @param appDir - location of application to build\n */\nexport async function buildAppTask(appDir: string) {\n process.chdir(appDir);\n\n const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n await exec(cmd).catch(error => {\n process.stdout.write(error.stderr);\n process.stdout.write(error.stdout);\n throw new Error(`Could not execute command ${chalk.cyan(cmd)}`);\n });\n });\n };\n\n const installTimeout = setTimeout(() => {\n Task.error(\n \"\\n⏱️ It's taking a long time to install dependencies, you may want to exit (Ctrl-C) and run 'yarn install' and 'yarn tsc' manually\",\n );\n }, TEN_MINUTES_MS);\n\n await runCmd('yarn install').finally(() => clearTimeout(installTimeout));\n await runCmd('yarn tsc');\n}\n\n/**\n * Move temporary directory to destination application folder\n *\n * @param tempDir - source path to copy files from\n * @param destination - target path to copy files\n * @param id - item ID\n * @throws if `fs.move` fails\n */\nexport async function moveAppTask(\n tempDir: string,\n destination: string,\n id: string,\n) {\n await Task.forItem('moving', id, async () => {\n await fs\n .move(tempDir, destination)\n .catch(error => {\n throw new Error(\n `Failed to move app from ${tempDir} to ${destination}: ${error.message}`,\n );\n })\n .finally(() => {\n // remove temporary files on both success and failure\n fs.removeSync(tempDir);\n });\n });\n}\n\n/**\n * Read git configs by creating a temp folder and initializing a repo\n *\n * @throws if `exec` fails\n */\nexport async function readGitConfig(): Promise<GitConfig | undefined> {\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'git-temp-dir-'));\n\n try {\n await exec('git init', { cwd: tempDir });\n await exec('git commit --allow-empty -m \"Initial commit\"', {\n cwd: tempDir,\n });\n\n const getDefaultBranch = await exec(\n 'git branch --format=\"%(refname:short)\"',\n { cwd: tempDir },\n );\n\n return {\n defaultBranch: getDefaultBranch.stdout?.trim() || undefined,\n };\n } catch (error) {\n return undefined;\n } finally {\n await fs.rm(tempDir, { recursive: true });\n }\n}\n\n/**\n * Initializes a git repository in the destination folder if possible\n *\n * @param dir - source path to initialize git repository in\n * @returns true if git repository was initialized\n */\nexport async function tryInitGitRepository(dir: string) {\n try {\n // Check if we're already in a git repo\n await exec('git rev-parse --is-inside-work-tree', { cwd: dir });\n return false;\n } catch {\n /* ignored */\n }\n\n try {\n await exec('git init', { cwd: dir });\n await exec('git add .', { cwd: dir });\n await exec('git commit -m \"Initial commit\"', { cwd: dir });\n return true;\n } catch (error) {\n try {\n await fs.rm(resolvePath(dir, '.git'), { recursive: true, force: true });\n } catch {\n throw new Error('Failed to remove .git folder');\n }\n\n return false;\n }\n}\n\n/**\n * This fetches the yarn.lock seed file at https://github.com/backstage/backstage/blob/master/packages/create-app/seed-yarn.lock\n * Its purpose is to lock individual dependencies with broken releases to known working versions.\n * This flow is decoupled from the release of the create-app package in order to avoid\n * the need to re-publish the create-app package whenever we want to update the seed file.\n *\n * @returns true if the yarn.lock seed file was fetched successfully\n */\nexport async function fetchYarnLockSeedTask(dir: string) {\n try {\n await Task.forItem('fetching', 'yarn.lock seed', async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\n 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',\n {\n signal: controller.signal,\n },\n );\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(\n `Request failed with status ${res.status} ${res.statusText}`,\n );\n }\n\n const initialYarnLockContent = await res.text();\n\n await fs.writeFile(\n resolvePath(dir, 'yarn.lock'),\n initialYarnLockContent\n .split('\\n')\n .filter(l => !l.startsWith('//'))\n .join('\\n'),\n 'utf8',\n );\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tries to get the version from a given command if possible\n *\n * @param command - command to run\n * @returns object - version with the version found and N/A if not found, error contains any error and undefined otherwise\n */\nexport async function tryCommandForVersion(command: string) {\n try {\n const result = await exec(command);\n\n const version = (result.stdout || result.stderr).trim();\n return { version: version || 'N/A', error: undefined };\n } catch (error) {\n return { version: 'N/A', error: String(error) };\n }\n}\n"],"names":["promisify","execCb","chalk","ora","recursive","relativePath","resolvePath","fs","dirname","basename","handlebars","packageVersions","os"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.54.0-next.0";
3
+ var version = "1.54.0-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.7.11-next.0";
3
+ var version = "1.7.11-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.17.6-next.0";
3
+ var version = "0.17.7-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.36.4";
3
+ var version = "0.36.5-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.1.4";
3
+ var version = "0.1.5-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.20.4-next.0";
3
+ var version = "1.20.4-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.5.14-next.0";
3
+ var version = "0.5.14-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.18.13-next.0";
3
+ var version = "0.18.13-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.12.8";
3
+ var version = "1.12.9-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.5.5-next.0";
3
+ var version = "0.5.5-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.17.3";
3
+ var version = "0.18.0-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.6.3-next.0";
3
+ var version = "0.6.3-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.2.20";
3
+ var version = "1.2.21-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.18.1-next.0";
3
+ var version = "0.18.1-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.7.21-next.0";
3
+ var version = "1.7.21-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.14.4-next.0";
3
+ var version = "0.14.4-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.5.17-next.0";
3
+ var version = "0.5.17-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.1.1-next.0";
3
+ var version = "0.1.1-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.2.5";
3
+ var version = "0.2.6-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.2.7-next.0";
3
+ var version = "0.2.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.1.11-next.0";
3
+ var version = "0.1.11-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.30.0-next.0";
3
+ var version = "0.30.0-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "2.0.8-next.0";
3
+ var version = "2.0.8-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "3.8.2-next.0";
3
+ var version = "3.9.0-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.1.25-next.0";
3
+ var version = "0.1.25-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.2.23-next.0";
3
+ var version = "0.2.23-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.6.7-next.0";
3
+ var version = "0.6.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.13.16-next.0";
3
+ var version = "0.13.16-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "3.2.1-next.0";
3
+ var version = "3.2.1-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.12.22-next.0";
3
+ var version = "0.12.22-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.21.7-next.0";
3
+ var version = "0.21.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.2.1-next.0";
3
+ var version = "0.2.1-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.5.20-next.0";
3
+ var version = "0.5.20-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.6.8-next.0";
3
+ var version = "0.6.8-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.7.7-next.0";
3
+ var version = "0.7.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.5.3";
3
+ var version = "0.5.4-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.38.2-next.0";
3
+ var version = "1.38.2-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "4.0.3-next.0";
3
+ var version = "4.0.3-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.9.12-next.0";
3
+ var version = "0.9.12-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.7.7-next.0";
3
+ var version = "1.7.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.11.7-next.0";
3
+ var version = "1.11.7-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.0.34-next.0";
3
+ var version = "0.0.34-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.0.24";
3
+ var version = "0.0.25-next.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.18.0-next.0";
3
+ var version = "1.18.0-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "2.2.3-next.0";
3
+ var version = "2.2.3-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.1.39-next.0";
3
+ var version = "1.1.39-next.2";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.3.14-next.0";
3
+ var version = "1.3.14-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.9.6-next.0";
3
+ var version = "0.9.6-next.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/create-app",
3
- "version": "0.9.1-next.0",
3
+ "version": "0.9.1-next.2",
4
4
  "description": "A CLI that helps you create your own Backstage app",
5
5
  "backstage": {
6
6
  "role": "cli"
@@ -53,8 +53,8 @@
53
53
  "recursive-readdir": "^2.2.2"
54
54
  },
55
55
  "devDependencies": {
56
- "@backstage/backend-test-utils": "1.11.6-next.0",
57
- "@backstage/cli": "0.36.4",
56
+ "@backstage/backend-test-utils": "1.11.6-next.1",
57
+ "@backstage/cli": "0.36.5-next.1",
58
58
  "@types/command-exists": "^1.2.0",
59
59
  "@types/fs-extra": "^11.0.0",
60
60
  "@types/inquirer": "^8.1.3",
@@ -17,16 +17,6 @@
17
17
 
18
18
  FROM node:24-trixie-slim
19
19
 
20
- # Set Python interpreter for `node-gyp` to use
21
- ENV PYTHON=/usr/bin/python3
22
-
23
- # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend.
24
- RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
25
- --mount=type=cache,target=/var/lib/apt,sharing=locked \
26
- apt-get update && \
27
- apt-get install -y --no-install-recommends python3 g++ build-essential && \
28
- rm -rf /var/lib/apt/lists/*
29
-
30
20
  # Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image,
31
21
  # in which case you should also move better-sqlite3 to "devDependencies" in package.json.
32
22
  RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
@@ -51,9 +41,6 @@ COPY --chown=node:node backstage.json ./
51
41
  # This switches many Node.js dependencies to production mode.
52
42
  ENV NODE_ENV=production
53
43
 
54
- # This disables node snapshot for Node 20 to work with the Scaffolder
55
- ENV NODE_OPTIONS="--no-node-snapshot"
56
-
57
44
  # Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
58
45
  # The skeleton contains the package.json of each package in the monorepo,
59
46
  # and along with yarn.lock and the root package.json, that's enough to run yarn install.
@@ -17,16 +17,6 @@
17
17
 
18
18
  FROM node:24-trixie-slim
19
19
 
20
- # Set Python interpreter for `node-gyp` to use
21
- ENV PYTHON=/usr/bin/python3
22
-
23
- # Install isolate-vm dependencies, these are needed by the @backstage/plugin-scaffolder-backend.
24
- RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
25
- --mount=type=cache,target=/var/lib/apt,sharing=locked \
26
- apt-get update && \
27
- apt-get install -y --no-install-recommends python3 g++ build-essential && \
28
- rm -rf /var/lib/apt/lists/*
29
-
30
20
  # Install sqlite3 dependencies. You can skip this if you don't use sqlite3 in the image,
31
21
  # in which case you should also move better-sqlite3 to "devDependencies" in package.json.
32
22
  RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
@@ -51,9 +41,6 @@ COPY --chown=node:node backstage.json ./
51
41
  # This switches many Node.js dependencies to production mode.
52
42
  ENV NODE_ENV=production
53
43
 
54
- # This disables node snapshot for Node 20 to work with the Scaffolder
55
- ENV NODE_OPTIONS="--no-node-snapshot"
56
-
57
44
  # Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
58
45
  # The skeleton contains the package.json of each package in the monorepo,
59
46
  # and along with yarn.lock and the root package.json, that's enough to run yarn install.