@backstage/cli 0.28.0-next.1 → 0.28.0

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 (157) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/config/jest.js +9 -1
  3. package/config/jestCacheResultProcessor.cjs +23 -0
  4. package/config/jestSwcTransform.js +4 -1
  5. package/dist/commands/build/buildBackend.cjs.js +65 -0
  6. package/dist/commands/build/buildFrontend.cjs.js +57 -0
  7. package/dist/commands/build/command.cjs.js +75 -0
  8. package/dist/commands/build/index.cjs.js +8 -0
  9. package/dist/commands/buildWorkspace.cjs.js +24 -0
  10. package/dist/commands/clean/clean.cjs.js +19 -0
  11. package/dist/{cjs/docs-BGyA6jwW.cjs.js → commands/config/docs.cjs.js} +4 -12
  12. package/dist/{cjs/print-Dd6aChXU.cjs.js → commands/config/print.cjs.js} +4 -12
  13. package/dist/{cjs/schema-D93FRhBL.cjs.js → commands/config/schema.cjs.js} +4 -12
  14. package/dist/commands/config/validate.cjs.js +19 -0
  15. package/dist/{cjs/index-j193pV_Y.cjs.js → commands/create-github-app/GithubCreateAppServer.cjs.js} +2 -110
  16. package/dist/commands/create-github-app/index.cjs.js +117 -0
  17. package/dist/commands/index.cjs.js +231 -0
  18. package/dist/{cjs/info-DuAv1Tsx.cjs.js → commands/info.cjs.js} +13 -17
  19. package/dist/{cjs/lint-BwiDJkjE.cjs.js → commands/lint.cjs.js} +10 -10
  20. package/dist/commands/migrate/packageExports.cjs.js +17 -0
  21. package/dist/{cjs/packageLintConfigs-DeUGBP17.cjs.js → commands/migrate/packageLintConfigs.cjs.js} +2 -10
  22. package/dist/{cjs/packageRole-Iuv9NRii.cjs.js → commands/migrate/packageRole.cjs.js} +5 -8
  23. package/dist/{cjs/packageScripts-DX6dilK6.cjs.js → commands/migrate/packageScripts.cjs.js} +1 -1
  24. package/dist/{cjs/reactRouterDeps-CR-hjviw.cjs.js → commands/migrate/reactRouterDeps.cjs.js} +1 -1
  25. package/dist/commands/new/new.cjs.js +101 -0
  26. package/dist/commands/pack.cjs.js +29 -0
  27. package/dist/commands/repo/build.cjs.js +113 -0
  28. package/dist/{cjs/clean-a6Q4k9Vm.cjs.js → commands/repo/clean.cjs.js} +5 -10
  29. package/dist/{cjs/fix-COitqgqm.cjs.js → commands/repo/fix.cjs.js} +8 -13
  30. package/dist/commands/repo/lint.cjs.js +205 -0
  31. package/dist/{cjs/list-deprecations-CtUaQgaP.cjs.js → commands/repo/list-deprecations.cjs.js} +7 -12
  32. package/dist/commands/repo/optionsParser.cjs.js +37 -0
  33. package/dist/commands/repo/test.cjs.js +277 -0
  34. package/dist/commands/start/command.cjs.js +48 -0
  35. package/dist/commands/start/index.cjs.js +8 -0
  36. package/dist/commands/start/startBackend.cjs.js +112 -0
  37. package/dist/commands/start/startFrontend.cjs.js +47 -0
  38. package/dist/{cjs/test-COxIko8N.cjs.js → commands/test.cjs.js} +6 -12
  39. package/dist/{cjs/bump-BHEh5ytx.cjs.js → commands/versions/bump.cjs.js} +21 -190
  40. package/dist/commands/versions/migrate.cjs.js +112 -0
  41. package/dist/index.cjs.js +29 -7
  42. package/dist/lib/builder/config.cjs.js +199 -0
  43. package/dist/lib/builder/packager.cjs.js +131 -0
  44. package/dist/lib/builder/plugins.cjs.js +71 -0
  45. package/dist/lib/builder/types.cjs.js +11 -0
  46. package/dist/lib/bundler/LinkedPackageResolvePlugin.cjs.js +47 -0
  47. package/dist/lib/bundler/backend.cjs.js +36 -0
  48. package/dist/{cjs/buildBackend-CkhZWCz1.cjs.js → lib/bundler/bundle.cjs.js} +31 -117
  49. package/dist/lib/bundler/config.cjs.js +491 -0
  50. package/dist/lib/bundler/hasReactDomClient.cjs.js +17 -0
  51. package/dist/lib/bundler/moduleFederation.cjs.js +28 -0
  52. package/dist/lib/bundler/optimization.cjs.js +67 -0
  53. package/dist/lib/bundler/packageDetection.cjs.js +117 -0
  54. package/dist/lib/bundler/paths.cjs.js +60 -0
  55. package/dist/lib/bundler/server.cjs.js +286 -0
  56. package/dist/lib/bundler/transforms.cjs.js +172 -0
  57. package/dist/lib/codeowners/codeowners.cjs.js +92 -0
  58. package/dist/{cjs/config-DBpmZirN.cjs.js → lib/config.cjs.js} +6 -6
  59. package/dist/{cjs/entryPoints-coip0t-x.cjs.js → lib/entryPoints.cjs.js} +1 -1
  60. package/dist/lib/errors.cjs.js +45 -0
  61. package/dist/lib/experimental/IpcServer.cjs.js +60 -0
  62. package/dist/lib/experimental/ServerDataStore.cjs.js +36 -0
  63. package/dist/lib/experimental/startBackendExperimental.cjs.js +128 -0
  64. package/dist/lib/new/FactoryRegistry.cjs.js +96 -0
  65. package/dist/lib/new/factories/backendModule.cjs.js +82 -0
  66. package/dist/lib/new/factories/backendPlugin.cjs.js +78 -0
  67. package/dist/lib/new/factories/common/prompts.cjs.js +57 -0
  68. package/dist/lib/new/factories/common/tasks.cjs.js +66 -0
  69. package/dist/lib/new/factories/common/util.cjs.js +16 -0
  70. package/dist/lib/new/factories/frontendPlugin.cjs.js +107 -0
  71. package/dist/lib/new/factories/index.cjs.js +24 -0
  72. package/dist/lib/new/factories/nodeLibraryPackage.cjs.js +57 -0
  73. package/dist/lib/new/factories/pluginCommon.cjs.js +58 -0
  74. package/dist/lib/new/factories/pluginNode.cjs.js +58 -0
  75. package/dist/lib/new/factories/pluginWeb.cjs.js +58 -0
  76. package/dist/lib/new/factories/scaffolderModule.cjs.js +90 -0
  77. package/dist/lib/new/factories/webLibraryPackage.cjs.js +57 -0
  78. package/dist/lib/new/types.cjs.js +8 -0
  79. package/dist/lib/packager/createDistWorkspace.cjs.js +219 -0
  80. package/dist/{cjs/productionPack-BxoMbBkH.cjs.js → lib/packager/productionPack.cjs.js} +8 -96
  81. package/dist/{cjs/parallel-BszNaKyc.cjs.js → lib/parallel.cjs.js} +2 -1
  82. package/dist/lib/paths.cjs.js +8 -0
  83. package/dist/{cjs/publishing-DQtsKTbc.cjs.js → lib/publishing.cjs.js} +1 -1
  84. package/dist/{cjs/role-BjiBExhi.cjs.js → lib/role.cjs.js} +3 -3
  85. package/dist/{cjs/run-CpZGNJQr.cjs.js → lib/run.cjs.js} +6 -5
  86. package/dist/{cjs/svgrTemplate-BTjBQ3by.cjs.js → lib/svgrTemplate.cjs.js} +1 -1
  87. package/dist/lib/tasks.cjs.js +188 -0
  88. package/dist/lib/typeDistProject.cjs.js +94 -0
  89. package/dist/lib/urls.cjs.js +13 -0
  90. package/dist/lib/version.cjs.js +94 -0
  91. package/dist/{cjs/yarn-6FNAgNBK.cjs.js → lib/versioning/Lockfile.cjs.js} +1 -31
  92. package/dist/lib/versioning/packages.cjs.js +75 -0
  93. package/dist/lib/yarn.cjs.js +34 -0
  94. package/dist/packages/backend-defaults/package.json.cjs.js +6 -0
  95. package/dist/packages/backend-plugin-api/package.json.cjs.js +6 -0
  96. package/dist/packages/backend-test-utils/package.json.cjs.js +6 -0
  97. package/dist/packages/catalog-client/package.json.cjs.js +6 -0
  98. package/dist/packages/cli/package.json.cjs.js +171 -0
  99. package/dist/packages/config/package.json.cjs.js +6 -0
  100. package/dist/packages/core-app-api/package.json.cjs.js +6 -0
  101. package/dist/packages/core-components/package.json.cjs.js +6 -0
  102. package/dist/packages/core-plugin-api/package.json.cjs.js +6 -0
  103. package/dist/packages/dev-utils/package.json.cjs.js +6 -0
  104. package/dist/packages/errors/package.json.cjs.js +6 -0
  105. package/dist/packages/test-utils/package.json.cjs.js +6 -0
  106. package/dist/packages/theme/package.json.cjs.js +6 -0
  107. package/dist/plugins/auth-backend/package.json.cjs.js +6 -0
  108. package/dist/plugins/auth-backend-module-guest-provider/package.json.cjs.js +6 -0
  109. package/dist/plugins/catalog-node/package.json.cjs.js +6 -0
  110. package/dist/plugins/scaffolder-node/package.json.cjs.js +6 -0
  111. package/dist/plugins/scaffolder-node-test-utils/package.json.cjs.js +6 -0
  112. package/package.json +55 -25
  113. package/templates/default-backend-plugin/README.md.hbs +22 -8
  114. package/templates/default-backend-plugin/dev/index.ts.hbs +60 -0
  115. package/templates/default-backend-plugin/package.json.hbs +5 -5
  116. package/templates/default-backend-plugin/src/index.ts.hbs +0 -1
  117. package/templates/default-backend-plugin/src/plugin.test.ts.hbs +85 -0
  118. package/templates/default-backend-plugin/src/plugin.ts.hbs +16 -14
  119. package/templates/default-backend-plugin/src/router.test.ts +67 -0
  120. package/templates/default-backend-plugin/src/router.ts +51 -0
  121. package/templates/default-backend-plugin/src/services/TodoListService/createTodoListService.ts +100 -0
  122. package/templates/default-backend-plugin/src/services/TodoListService/index.ts +1 -0
  123. package/templates/default-backend-plugin/src/services/TodoListService/types.ts +27 -0
  124. package/templates/scaffolder-module/package.json.hbs +3 -1
  125. package/templates/scaffolder-module/src/actions/example.test.ts +24 -0
  126. package/templates/scaffolder-module/src/actions/{example/example.ts → example.ts} +7 -3
  127. package/templates/scaffolder-module/src/index.ts.hbs +1 -1
  128. package/templates/scaffolder-module/src/{actions/example/module.ts → module.ts} +3 -3
  129. package/dist/cjs/build-CQdcGuBr.cjs.js +0 -194
  130. package/dist/cjs/buildWorkspace-CZPp9oRm.cjs.js +0 -53
  131. package/dist/cjs/clean-W6nxsHeK.cjs.js +0 -22
  132. package/dist/cjs/createDistWorkspace-DdHPGSMS.cjs.js +0 -576
  133. package/dist/cjs/index-BXv4Xa2e.cjs.js +0 -625
  134. package/dist/cjs/index-CGuAP7nv.cjs.js +0 -131
  135. package/dist/cjs/index-b1ouG3q6.cjs.js +0 -518
  136. package/dist/cjs/lint-Dsiocf9K.cjs.js +0 -91
  137. package/dist/cjs/moduleFederation-DmStnvEg.cjs.js +0 -910
  138. package/dist/cjs/new-CEnFhTT-.cjs.js +0 -1043
  139. package/dist/cjs/pack-XLRcGJqH.cjs.js +0 -34
  140. package/dist/cjs/packageExports-BJBwdvUH.cjs.js +0 -27
  141. package/dist/cjs/test-JcLI2pPM.cjs.js +0 -126
  142. package/dist/cjs/validate-CELljsEX.cjs.js +0 -28
  143. package/templates/default-backend-plugin/dev/index.ts +0 -9
  144. package/templates/default-backend-plugin/src/service/router.test.ts +0 -30
  145. package/templates/default-backend-plugin/src/service/router.ts +0 -28
  146. package/templates/scaffolder-module/src/actions/example/example.test.ts +0 -32
  147. package/templates/scaffolder-module/src/actions/example/index.ts +0 -7
  148. package/templates/scaffolder-module/src/actions/index.ts +0 -1
  149. /package/templates/default-backend-module/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  150. /package/templates/default-backend-plugin/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  151. /package/templates/default-common-plugin-package/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  152. /package/templates/default-node-plugin-package/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  153. /package/templates/default-plugin/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  154. /package/templates/default-react-plugin-package/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  155. /package/templates/node-library-package/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  156. /package/templates/scaffolder-module/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
  157. /package/templates/web-library-package/{.eslintrc.js → .eslintrc.js.hbs} +0 -0
@@ -0,0 +1,117 @@
1
+ 'use strict';
2
+
3
+ var config = require('@backstage/config');
4
+ var chokidar = require('chokidar');
5
+ var fs = require('fs-extra');
6
+ var PQueue = require('p-queue');
7
+ var path = require('path');
8
+ var paths = require('../paths.cjs.js');
9
+
10
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
11
+
12
+ var chokidar__default = /*#__PURE__*/_interopDefaultCompat(chokidar);
13
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
14
+ var PQueue__default = /*#__PURE__*/_interopDefaultCompat(PQueue);
15
+
16
+ const DETECTED_MODULES_MODULE_NAME = "__backstage-autodetected-plugins__";
17
+ function readPackageDetectionConfig(config$1) {
18
+ const packages = config$1.getOptional("app.experimental.packages");
19
+ if (packages === void 0 || packages === null) {
20
+ return void 0;
21
+ }
22
+ if (typeof packages === "string") {
23
+ if (packages !== "all") {
24
+ throw new Error(
25
+ `Invalid app.experimental.packages mode, got '${packages}', expected 'all'`
26
+ );
27
+ }
28
+ return {};
29
+ }
30
+ if (typeof packages !== "object" || Array.isArray(packages)) {
31
+ throw new Error(
32
+ "Invalid config at 'app.experimental.packages', expected object"
33
+ );
34
+ }
35
+ const packagesConfig = new config.ConfigReader(
36
+ packages,
37
+ "app.experimental.packages"
38
+ );
39
+ return {
40
+ include: packagesConfig.getOptionalStringArray("include"),
41
+ exclude: packagesConfig.getOptionalStringArray("exclude")
42
+ };
43
+ }
44
+ async function detectPackages(targetPath, { include, exclude }) {
45
+ const pkg = await fs__default.default.readJson(
46
+ path.resolve(targetPath, "package.json")
47
+ );
48
+ return Object.keys(pkg.dependencies ?? {}).flatMap((depName) => {
49
+ if (exclude?.includes(depName)) {
50
+ return [];
51
+ }
52
+ if (include && !include.includes(depName)) {
53
+ return [];
54
+ }
55
+ try {
56
+ const depPackageJson = require(require.resolve(
57
+ `${depName}/package.json`,
58
+ { paths: [targetPath] }
59
+ ));
60
+ if (["frontend-plugin", "frontend-plugin-module"].includes(
61
+ depPackageJson.backstage?.role ?? ""
62
+ )) {
63
+ const exp = depPackageJson.exports;
64
+ if (exp && typeof exp === "object" && "./alpha" in exp) {
65
+ return [
66
+ { name: depName, import: depName },
67
+ { name: depName, export: "./alpha", import: `${depName}/alpha` }
68
+ ];
69
+ }
70
+ return [{ name: depName, import: depName }];
71
+ }
72
+ } catch {
73
+ }
74
+ return [];
75
+ });
76
+ }
77
+ const writeQueue = new PQueue__default.default({ concurrency: 1 });
78
+ async function writeDetectedPackagesModule(pkgs) {
79
+ const requirePackageScript = pkgs?.map(
80
+ (pkg) => `{ name: ${JSON.stringify(pkg.name)}, export: ${JSON.stringify(
81
+ pkg.export
82
+ )}, default: require('${pkg.import}').default }`
83
+ ).join(",");
84
+ await writeQueue.add(
85
+ () => fs__default.default.writeFile(
86
+ path.join(
87
+ paths.paths.targetRoot,
88
+ "node_modules",
89
+ `${DETECTED_MODULES_MODULE_NAME}.js`
90
+ ),
91
+ `window['__@backstage/discovered__'] = { modules: [${requirePackageScript}] };`
92
+ )
93
+ );
94
+ }
95
+ async function createDetectedModulesEntryPoint(options) {
96
+ const { config, watch, targetPath } = options;
97
+ const detectionConfig = readPackageDetectionConfig(config);
98
+ if (!detectionConfig) {
99
+ return [];
100
+ }
101
+ if (watch) {
102
+ const watcher = chokidar__default.default.watch(path.resolve(targetPath, "package.json"));
103
+ watcher.on("change", async () => {
104
+ await writeDetectedPackagesModule(
105
+ await detectPackages(targetPath, detectionConfig)
106
+ );
107
+ watch();
108
+ });
109
+ }
110
+ await writeDetectedPackagesModule(
111
+ await detectPackages(targetPath, detectionConfig)
112
+ );
113
+ return [DETECTED_MODULES_MODULE_NAME];
114
+ }
115
+
116
+ exports.createDetectedModulesEntryPoint = createDetectedModulesEntryPoint;
117
+ //# sourceMappingURL=packageDetection.cjs.js.map
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs-extra');
4
+ var path = require('path');
5
+ var paths = require('../paths.cjs.js');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
8
+
9
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
10
+
11
+ function resolveBundlingPaths(options) {
12
+ const { entry, targetDir = paths.paths.targetDir } = options;
13
+ const resolveTargetModule = (pathString) => {
14
+ for (const ext of ["mjs", "js", "ts", "tsx", "jsx"]) {
15
+ const filePath = path.resolve(targetDir, `${pathString}.${ext}`);
16
+ if (fs__default.default.pathExistsSync(filePath)) {
17
+ return filePath;
18
+ }
19
+ }
20
+ return path.resolve(targetDir, `${pathString}.js`);
21
+ };
22
+ let targetPublic = void 0;
23
+ let targetHtml = path.resolve(targetDir, "public/index.html");
24
+ if (fs__default.default.pathExistsSync(targetHtml)) {
25
+ targetPublic = path.resolve(targetDir, "public");
26
+ } else {
27
+ targetHtml = path.resolve(targetDir, `${entry}.html`);
28
+ if (!fs__default.default.pathExistsSync(targetHtml)) {
29
+ targetHtml = paths.paths.resolveOwn("templates/serve_index.html");
30
+ }
31
+ }
32
+ const targetRunFile = path.resolve(targetDir, "src/run.ts");
33
+ const runFileExists = fs__default.default.pathExistsSync(targetRunFile);
34
+ return {
35
+ targetHtml,
36
+ targetPublic,
37
+ targetPath: path.resolve(targetDir, "."),
38
+ targetRunFile: runFileExists ? targetRunFile : void 0,
39
+ targetDist: path.resolve(targetDir, options.dist ?? "dist"),
40
+ targetAssets: path.resolve(targetDir, "assets"),
41
+ targetSrc: path.resolve(targetDir, "src"),
42
+ targetDev: path.resolve(targetDir, "dev"),
43
+ targetEntry: resolveTargetModule(entry),
44
+ targetTsConfig: paths.paths.resolveTargetRoot("tsconfig.json"),
45
+ targetPackageJson: path.resolve(targetDir, "package.json"),
46
+ rootNodeModules: paths.paths.resolveTargetRoot("node_modules"),
47
+ root: paths.paths.targetRoot
48
+ };
49
+ }
50
+ async function resolveOptionalBundlingPaths(options) {
51
+ const resolvedPaths = resolveBundlingPaths(options);
52
+ if (await fs__default.default.pathExists(resolvedPaths.targetEntry)) {
53
+ return resolvedPaths;
54
+ }
55
+ return void 0;
56
+ }
57
+
58
+ exports.resolveBundlingPaths = resolveBundlingPaths;
59
+ exports.resolveOptionalBundlingPaths = resolveOptionalBundlingPaths;
60
+ //# sourceMappingURL=paths.cjs.js.map
@@ -0,0 +1,286 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var fs = require('fs-extra');
5
+ var openBrowser = require('react-dev-utils/openBrowser');
6
+ var webpack = require('webpack');
7
+ var WebpackDevServer = require('webpack-dev-server');
8
+ var paths$1 = require('../paths.cjs.js');
9
+ var config = require('../config.cjs.js');
10
+ var config$1 = require('./config.cjs.js');
11
+ var packageDetection = require('./packageDetection.cjs.js');
12
+ var paths = require('./paths.cjs.js');
13
+ var hasReactDomClient = require('./hasReactDomClient.cjs.js');
14
+
15
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
16
+
17
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
18
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
19
+ var openBrowser__default = /*#__PURE__*/_interopDefaultCompat(openBrowser);
20
+ var webpack__default = /*#__PURE__*/_interopDefaultCompat(webpack);
21
+ var WebpackDevServer__default = /*#__PURE__*/_interopDefaultCompat(WebpackDevServer);
22
+
23
+ async function serveBundle(options) {
24
+ const paths$2 = paths.resolveBundlingPaths(options);
25
+ const targetPkg = await fs__default.default.readJson(paths$2.targetPackageJson);
26
+ if (options.verifyVersions) {
27
+ if (targetPkg.dependencies?.["react-router"]?.includes("beta") || targetPkg.dependencies?.["react-router-dom"]?.includes("beta")) {
28
+ console.warn(
29
+ chalk__default.default.yellow(`
30
+ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be removed in a future release.
31
+ Please migrate to use React Router v6 stable.
32
+ See https://backstage.io/docs/tutorials/react-router-stable-migration
33
+ `)
34
+ );
35
+ }
36
+ }
37
+ checkReactVersion();
38
+ const { name } = await fs__default.default.readJson(paths$1.paths.resolveTarget("package.json"));
39
+ let webpackServer = void 0;
40
+ let viteServer = void 0;
41
+ let latestFrontendAppConfigs = [];
42
+ const cliConfig = await config.loadCliConfig({
43
+ args: options.configPaths,
44
+ fromPackage: name,
45
+ withFilteredKeys: true,
46
+ watch(appConfigs) {
47
+ latestFrontendAppConfigs = appConfigs;
48
+ webpackServer?.invalidate();
49
+ viteServer?.restart();
50
+ }
51
+ });
52
+ latestFrontendAppConfigs = cliConfig.frontendAppConfigs;
53
+ const appBaseUrl = cliConfig.frontendConfig.getOptionalString("app.baseUrl");
54
+ const backendBaseUrl = cliConfig.frontendConfig.getOptionalString("backend.baseUrl");
55
+ if (appBaseUrl && appBaseUrl === backendBaseUrl) {
56
+ console.log(
57
+ chalk__default.default.yellow(
58
+ `\u26A0\uFE0F Conflict between app baseUrl and backend baseUrl:
59
+
60
+ app.baseUrl: ${appBaseUrl}
61
+ backend.baseUrl: ${backendBaseUrl}
62
+
63
+ Must have unique hostname and/or ports.
64
+
65
+ This can be resolved by changing app.baseUrl and backend.baseUrl to point to their respective local development ports.
66
+ `
67
+ )
68
+ );
69
+ }
70
+ const { frontendConfig, fullConfig } = cliConfig;
71
+ const url = config$1.resolveBaseUrl(frontendConfig, options.moduleFederation);
72
+ const { host, port } = config$1.resolveEndpoint(
73
+ frontendConfig,
74
+ options.moduleFederation
75
+ );
76
+ const detectedModulesEntryPoint = await packageDetection.createDetectedModulesEntryPoint({
77
+ config: fullConfig,
78
+ targetPath: paths$2.targetPath,
79
+ watch() {
80
+ webpackServer?.invalidate();
81
+ viteServer?.restart();
82
+ }
83
+ });
84
+ const rspack = process.env.EXPERIMENTAL_RSPACK ? require("@rspack/core") : void 0;
85
+ const commonConfigOptions = {
86
+ ...options,
87
+ checksEnabled: options.checksEnabled,
88
+ isDev: true,
89
+ baseUrl: url,
90
+ frontendConfig,
91
+ rspack,
92
+ getFrontendAppConfigs: () => {
93
+ return latestFrontendAppConfigs;
94
+ }
95
+ };
96
+ const config$2 = await config$1.createConfig(paths$2, {
97
+ ...commonConfigOptions,
98
+ additionalEntryPoints: detectedModulesEntryPoint,
99
+ moduleFederation: options.moduleFederation
100
+ });
101
+ if (process.env.EXPERIMENTAL_VITE) {
102
+ const vite = require("vite");
103
+ const { default: viteReact } = require("@vitejs/plugin-react");
104
+ const { default: viteYaml } = require("@modyfi/vite-plugin-yaml");
105
+ const { nodePolyfills: viteNodePolyfills } = require("vite-plugin-node-polyfills");
106
+ const { createHtmlPlugin: viteHtml } = require("vite-plugin-html");
107
+ viteServer = await vite.createServer({
108
+ define: {
109
+ "process.argv": JSON.stringify(process.argv),
110
+ "process.env.APP_CONFIG": JSON.stringify(cliConfig.frontendAppConfigs),
111
+ // This allows for conditional imports of react-dom/client, since there's no way
112
+ // to check for presence of it in source code without module resolution errors.
113
+ "process.env.HAS_REACT_DOM_CLIENT": JSON.stringify(hasReactDomClient.hasReactDomClient())
114
+ },
115
+ optimizeDeps: {
116
+ esbuildOptions: {
117
+ plugins: [
118
+ {
119
+ name: "custom-define",
120
+ setup(build) {
121
+ const define = build.initialOptions.define ||= {};
122
+ define["process.env.HAS_REACT_DOM_CLIENT"] = JSON.stringify(
123
+ hasReactDomClient.hasReactDomClient()
124
+ );
125
+ define["process.env.NODE_ENV"] = JSON.stringify("development");
126
+ }
127
+ }
128
+ ]
129
+ }
130
+ },
131
+ plugins: [
132
+ viteReact(),
133
+ viteNodePolyfills({
134
+ include: [
135
+ "buffer",
136
+ "events",
137
+ "fs",
138
+ "http",
139
+ "https",
140
+ "os",
141
+ "path",
142
+ "process",
143
+ "querystring",
144
+ "stream",
145
+ "url",
146
+ "util",
147
+ "zlib"
148
+ ],
149
+ globals: {
150
+ global: true,
151
+ Buffer: true,
152
+ process: true
153
+ }
154
+ }),
155
+ viteYaml(),
156
+ viteHtml({
157
+ entry: paths$2.targetEntry,
158
+ // todo(blam): we should look at contributing to thPe plugin here
159
+ // to support absolute paths, but works in the interim at least.
160
+ template: "public/index.html",
161
+ inject: {
162
+ data: {
163
+ config: frontendConfig,
164
+ publicPath: config$2.output?.publicPath
165
+ }
166
+ }
167
+ })
168
+ ],
169
+ server: {
170
+ host,
171
+ port
172
+ },
173
+ publicDir: paths$2.targetPublic,
174
+ root: paths$2.targetPath
175
+ });
176
+ } else {
177
+ const bundler = rspack ?? webpack__default.default;
178
+ const DevServer = rspack ? require("@rspack/dev-server").RspackDevServer : WebpackDevServer__default.default;
179
+ const publicPaths = await paths.resolveOptionalBundlingPaths({
180
+ entry: "src/index-public-experimental",
181
+ dist: "dist/public"
182
+ });
183
+ if (publicPaths) {
184
+ console.log(
185
+ chalk__default.default.yellow(
186
+ `\u26A0\uFE0F WARNING: The app /public entry point is an experimental feature that may receive immediate breaking changes.`
187
+ )
188
+ );
189
+ }
190
+ const compiler = publicPaths ? bundler([config$2, await config$1.createConfig(publicPaths, commonConfigOptions)]) : bundler(config$2);
191
+ webpackServer = new DevServer(
192
+ {
193
+ hot: !process.env.CI,
194
+ devMiddleware: {
195
+ publicPath: config$2.output?.publicPath,
196
+ stats: "errors-warnings"
197
+ },
198
+ static: paths$2.targetPublic ? {
199
+ publicPath: config$2.output?.publicPath,
200
+ directory: paths$2.targetPublic
201
+ } : void 0,
202
+ historyApiFallback: options.moduleFederation?.mode === "remote" ? false : {
203
+ // Paths with dots should still use the history fallback.
204
+ // See https://github.com/facebookincubator/create-react-app/issues/387.
205
+ disableDotRule: true,
206
+ // The index needs to be rewritten relative to the new public path, including subroutes.
207
+ index: `${config$2.output?.publicPath}index.html`
208
+ },
209
+ server: url.protocol === "https:" ? {
210
+ type: "https",
211
+ options: {
212
+ cert: fullConfig.getString("app.https.certificate.cert"),
213
+ key: fullConfig.getString("app.https.certificate.key")
214
+ }
215
+ } : {},
216
+ host,
217
+ port,
218
+ proxy: targetPkg.proxy,
219
+ // When the dev server is behind a proxy, the host and public hostname differ
220
+ allowedHosts: [url.hostname],
221
+ client: {
222
+ webSocketURL: { hostname: host, port }
223
+ },
224
+ headers: {
225
+ "Access-Control-Allow-Origin": "*",
226
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
227
+ "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
228
+ }
229
+ },
230
+ compiler
231
+ );
232
+ }
233
+ await viteServer?.listen();
234
+ await new Promise(async (resolve, reject) => {
235
+ if (webpackServer) {
236
+ webpackServer.startCallback((err) => {
237
+ if (err) {
238
+ reject(err);
239
+ return;
240
+ }
241
+ resolve();
242
+ });
243
+ } else {
244
+ resolve();
245
+ }
246
+ });
247
+ if (!options.skipOpenBrowser) {
248
+ openBrowser__default.default(url.href);
249
+ }
250
+ const waitForExit = async () => {
251
+ for (const signal of ["SIGINT", "SIGTERM"]) {
252
+ process.on(signal, () => {
253
+ webpackServer?.stop();
254
+ viteServer?.close();
255
+ process.exit();
256
+ });
257
+ }
258
+ return new Promise(() => {
259
+ });
260
+ };
261
+ return waitForExit;
262
+ }
263
+ function checkReactVersion() {
264
+ try {
265
+ const reactPkgPath = require.resolve("react/package.json", {
266
+ paths: [paths$1.paths.targetRoot]
267
+ });
268
+ const reactPkg = require(reactPkgPath);
269
+ if (reactPkg.version.startsWith("16.")) {
270
+ console.log(
271
+ chalk__default.default.yellow(
272
+ `
273
+ \u26A0\uFE0F \u26A0\uFE0F
274
+ \u26A0\uFE0F You are using React version 16, which is deprecated for use in Backstage. \u26A0\uFE0F
275
+ \u26A0\uFE0F Please upgrade to React 17 by updating your packages/app dependencies. \u26A0\uFE0F
276
+ \u26A0\uFE0F \u26A0\uFE0F
277
+ `
278
+ )
279
+ );
280
+ }
281
+ } catch {
282
+ }
283
+ }
284
+
285
+ exports.serveBundle = serveBundle;
286
+ //# sourceMappingURL=server.cjs.js.map
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ var MiniCssExtractPlugin = require('mini-css-extract-plugin');
4
+ var svgrTemplate = require('../svgrTemplate.cjs.js');
5
+
6
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
7
+
8
+ var MiniCssExtractPlugin__default = /*#__PURE__*/_interopDefaultCompat(MiniCssExtractPlugin);
9
+
10
+ const transforms = (options) => {
11
+ const { isDev, isBackend, rspack } = options;
12
+ const CssExtractRspackPlugin = rspack ? rspack.CssExtractRspackPlugin : MiniCssExtractPlugin__default.default;
13
+ function insertBeforeJssStyles(element) {
14
+ const head = document.head;
15
+ const firstJssNode = head.querySelector("style[data-jss]");
16
+ if (!firstJssNode) {
17
+ head.appendChild(element);
18
+ } else {
19
+ head.insertBefore(element, firstJssNode);
20
+ }
21
+ }
22
+ const loaders = [
23
+ {
24
+ test: /\.(tsx?)$/,
25
+ exclude: /node_modules/,
26
+ use: [
27
+ {
28
+ loader: rspack ? "builtin:swc-loader" : require.resolve("swc-loader"),
29
+ options: {
30
+ jsc: {
31
+ target: "es2022",
32
+ externalHelpers: !isBackend,
33
+ parser: {
34
+ syntax: "typescript",
35
+ tsx: !isBackend,
36
+ dynamicImport: true
37
+ },
38
+ transform: {
39
+ react: isBackend ? void 0 : {
40
+ runtime: "automatic",
41
+ refresh: isDev
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ test: /\.(jsx?|mjs|cjs)$/,
51
+ exclude: /node_modules/,
52
+ use: [
53
+ {
54
+ loader: rspack ? "builtin:swc-loader" : require.resolve("swc-loader"),
55
+ options: {
56
+ jsc: {
57
+ target: "es2022",
58
+ externalHelpers: !isBackend,
59
+ parser: {
60
+ syntax: "ecmascript",
61
+ jsx: !isBackend,
62
+ dynamicImport: true
63
+ },
64
+ transform: {
65
+ react: isBackend ? void 0 : {
66
+ runtime: "automatic",
67
+ refresh: isDev
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ ]
74
+ },
75
+ {
76
+ test: /\.(js|mjs|cjs)$/,
77
+ resolve: {
78
+ fullySpecified: false
79
+ }
80
+ },
81
+ {
82
+ test: [/\.icon\.svg$/],
83
+ use: [
84
+ {
85
+ loader: rspack ? "builtin:swc-loader" : require.resolve("swc-loader"),
86
+ options: {
87
+ jsc: {
88
+ target: "es2022",
89
+ externalHelpers: !isBackend,
90
+ parser: {
91
+ syntax: "ecmascript",
92
+ jsx: !isBackend,
93
+ dynamicImport: true
94
+ }
95
+ }
96
+ }
97
+ },
98
+ {
99
+ loader: require.resolve("@svgr/webpack"),
100
+ options: { babel: false, template: svgrTemplate.svgrTemplate }
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ test: [
106
+ /\.bmp$/,
107
+ /\.gif$/,
108
+ /\.jpe?g$/,
109
+ /\.png$/,
110
+ /\.frag$/,
111
+ /\.vert$/,
112
+ { and: [/\.svg$/, { not: [/\.icon\.svg$/] }] },
113
+ /\.xml$/,
114
+ /\.ico$/
115
+ ],
116
+ type: "asset/resource",
117
+ generator: {
118
+ filename: "static/[name].[hash:8].[ext]"
119
+ }
120
+ },
121
+ {
122
+ test: /\.(eot|woff|woff2|ttf)$/i,
123
+ type: "asset/resource",
124
+ generator: {
125
+ filename: "static/[name].[hash][ext][query]"
126
+ }
127
+ },
128
+ {
129
+ test: /\.ya?ml$/,
130
+ use: require.resolve("yml-loader")
131
+ },
132
+ {
133
+ include: /\.(md)$/,
134
+ type: "asset/resource",
135
+ generator: {
136
+ filename: "static/[name].[hash][ext][query]"
137
+ }
138
+ },
139
+ {
140
+ test: /\.css$/i,
141
+ use: [
142
+ isDev ? {
143
+ loader: require.resolve("style-loader"),
144
+ options: {
145
+ insert: insertBeforeJssStyles
146
+ }
147
+ } : CssExtractRspackPlugin.loader,
148
+ {
149
+ loader: require.resolve("css-loader"),
150
+ options: {
151
+ sourceMap: true
152
+ }
153
+ }
154
+ ]
155
+ }
156
+ ];
157
+ const plugins = new Array();
158
+ if (!isDev) {
159
+ plugins.push(
160
+ new CssExtractRspackPlugin({
161
+ filename: "static/[name].[contenthash:8].css",
162
+ chunkFilename: "static/[name].[id].[contenthash:8].css",
163
+ insert: insertBeforeJssStyles
164
+ // Only applies to async chunks
165
+ })
166
+ );
167
+ }
168
+ return { loaders, plugins };
169
+ };
170
+
171
+ exports.transforms = transforms;
172
+ //# sourceMappingURL=transforms.cjs.js.map