@backstage/cli-module-build 0.0.0-nightly-20260317031259

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 (103) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +23 -0
  3. package/bin/backstage-cli-module-build +32 -0
  4. package/config/webpack-public-path.js +31 -0
  5. package/dist/commands/buildWorkspace.cjs.js +53 -0
  6. package/dist/commands/buildWorkspace.cjs.js.map +1 -0
  7. package/dist/commands/package/build/command.cjs.js +136 -0
  8. package/dist/commands/package/build/command.cjs.js.map +1 -0
  9. package/dist/commands/package/build/index.cjs.js +10 -0
  10. package/dist/commands/package/build/index.cjs.js.map +1 -0
  11. package/dist/commands/package/bundle/command.cjs.js +691 -0
  12. package/dist/commands/package/bundle/command.cjs.js.map +1 -0
  13. package/dist/commands/package/bundle/index.cjs.js +10 -0
  14. package/dist/commands/package/bundle/index.cjs.js.map +1 -0
  15. package/dist/commands/package/clean.cjs.js +21 -0
  16. package/dist/commands/package/clean.cjs.js.map +1 -0
  17. package/dist/commands/package/postpack.cjs.js +15 -0
  18. package/dist/commands/package/postpack.cjs.js.map +1 -0
  19. package/dist/commands/package/prepack.cjs.js +29 -0
  20. package/dist/commands/package/prepack.cjs.js.map +1 -0
  21. package/dist/commands/package/start/command.cjs.js +80 -0
  22. package/dist/commands/package/start/command.cjs.js.map +1 -0
  23. package/dist/commands/package/start/index.cjs.js +10 -0
  24. package/dist/commands/package/start/index.cjs.js.map +1 -0
  25. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js +34 -0
  26. package/dist/commands/package/start/resolveLinkedWorkspace.cjs.js.map +1 -0
  27. package/dist/commands/package/start/startBackend.cjs.js +46 -0
  28. package/dist/commands/package/start/startBackend.cjs.js.map +1 -0
  29. package/dist/commands/package/start/startFrontend.cjs.js +49 -0
  30. package/dist/commands/package/start/startFrontend.cjs.js.map +1 -0
  31. package/dist/commands/package/start/startPackage.cjs.js +53 -0
  32. package/dist/commands/package/start/startPackage.cjs.js.map +1 -0
  33. package/dist/commands/repo/build.cjs.js +149 -0
  34. package/dist/commands/repo/build.cjs.js.map +1 -0
  35. package/dist/commands/repo/clean.cjs.js +41 -0
  36. package/dist/commands/repo/clean.cjs.js.map +1 -0
  37. package/dist/commands/repo/start.cjs.js +199 -0
  38. package/dist/commands/repo/start.cjs.js.map +1 -0
  39. package/dist/index.cjs.js +74 -0
  40. package/dist/index.cjs.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/lib/buildBackend.cjs.js +81 -0
  43. package/dist/lib/buildBackend.cjs.js.map +1 -0
  44. package/dist/lib/buildFrontend.cjs.js +49 -0
  45. package/dist/lib/buildFrontend.cjs.js.map +1 -0
  46. package/dist/lib/builder/config.cjs.js +257 -0
  47. package/dist/lib/builder/config.cjs.js.map +1 -0
  48. package/dist/lib/builder/packager.cjs.js +131 -0
  49. package/dist/lib/builder/packager.cjs.js.map +1 -0
  50. package/dist/lib/builder/plugins.cjs.js +125 -0
  51. package/dist/lib/builder/plugins.cjs.js.map +1 -0
  52. package/dist/lib/builder/types.cjs.js +10 -0
  53. package/dist/lib/builder/types.cjs.js.map +1 -0
  54. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js +43 -0
  55. package/dist/lib/bundler/ConfigInjectingHtmlWebpackPlugin.cjs.js.map +1 -0
  56. package/dist/lib/bundler/bundle.cjs.js +189 -0
  57. package/dist/lib/bundler/bundle.cjs.js.map +1 -0
  58. package/dist/lib/bundler/config.cjs.js +309 -0
  59. package/dist/lib/bundler/config.cjs.js.map +1 -0
  60. package/dist/lib/bundler/hasReactDomClient.cjs.js +17 -0
  61. package/dist/lib/bundler/hasReactDomClient.cjs.js.map +1 -0
  62. package/dist/lib/bundler/linkWorkspaces.cjs.js +34 -0
  63. package/dist/lib/bundler/linkWorkspaces.cjs.js.map +1 -0
  64. package/dist/lib/bundler/moduleFederation.cjs.js +135 -0
  65. package/dist/lib/bundler/moduleFederation.cjs.js.map +1 -0
  66. package/dist/lib/bundler/optimization.cjs.js +68 -0
  67. package/dist/lib/bundler/optimization.cjs.js.map +1 -0
  68. package/dist/lib/bundler/packageDetection.cjs.js +124 -0
  69. package/dist/lib/bundler/packageDetection.cjs.js.map +1 -0
  70. package/dist/lib/bundler/paths.cjs.js +62 -0
  71. package/dist/lib/bundler/paths.cjs.js.map +1 -0
  72. package/dist/lib/bundler/server.cjs.js +231 -0
  73. package/dist/lib/bundler/server.cjs.js.map +1 -0
  74. package/dist/lib/bundler/transforms.cjs.js +145 -0
  75. package/dist/lib/bundler/transforms.cjs.js.map +1 -0
  76. package/dist/lib/config.cjs.js +94 -0
  77. package/dist/lib/config.cjs.js.map +1 -0
  78. package/dist/lib/entryPoints.cjs.js +49 -0
  79. package/dist/lib/entryPoints.cjs.js.map +1 -0
  80. package/dist/lib/ipc/IpcServer.cjs.js +60 -0
  81. package/dist/lib/ipc/IpcServer.cjs.js.map +1 -0
  82. package/dist/lib/ipc/ServerDataStore.cjs.js +36 -0
  83. package/dist/lib/ipc/ServerDataStore.cjs.js.map +1 -0
  84. package/dist/lib/optionsParser.cjs.js +22 -0
  85. package/dist/lib/optionsParser.cjs.js.map +1 -0
  86. package/dist/lib/packager/createDistWorkspace.cjs.js +252 -0
  87. package/dist/lib/packager/createDistWorkspace.cjs.js.map +1 -0
  88. package/dist/lib/packager/productionPack.cjs.js +160 -0
  89. package/dist/lib/packager/productionPack.cjs.js.map +1 -0
  90. package/dist/lib/publishing.cjs.js +40 -0
  91. package/dist/lib/publishing.cjs.js.map +1 -0
  92. package/dist/lib/role.cjs.js +24 -0
  93. package/dist/lib/role.cjs.js.map +1 -0
  94. package/dist/lib/runner/runBackend.cjs.js +136 -0
  95. package/dist/lib/runner/runBackend.cjs.js.map +1 -0
  96. package/dist/lib/typeDistProject.cjs.js +89 -0
  97. package/dist/lib/typeDistProject.cjs.js.map +1 -0
  98. package/dist/lib/urls.cjs.js +13 -0
  99. package/dist/lib/urls.cjs.js.map +1 -0
  100. package/dist/package.json.cjs.js +143 -0
  101. package/dist/package.json.cjs.js.map +1 -0
  102. package/package.json +113 -0
  103. package/templates/serve_index.html +27 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpcServer.cjs.js","sources":["../../../src/lib/ipc/IpcServer.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { serializeError } from '@backstage/errors';\nimport { ChildProcess } from 'node:child_process';\n\ninterface RequestMeta {\n generation: number;\n}\n\ntype MethodHandler<TRequest, TResponse> = (\n req: TRequest,\n meta: RequestMeta,\n) => Promise<TResponse>;\n\ninterface Request {\n id: number;\n method: string;\n body: unknown;\n type: string;\n}\n\nconst requestType = '@backstage/cli/channel/request';\nconst responseType = '@backstage/cli/channel/response';\n\nexport class IpcServer {\n #generation = 1;\n #methods = new Map<string, MethodHandler<any, any>>();\n\n addChild(child: ChildProcess) {\n const generation = this.#generation++;\n const sendMessage = child.send?.bind(child);\n if (!sendMessage) {\n return;\n }\n\n const messageListener = (request: Request) => {\n if (request.type !== requestType) {\n return;\n }\n\n const handler = this.#methods.get(request.method);\n if (!handler) {\n sendMessage({\n type: responseType,\n id: request.id,\n error: {\n name: 'NotFoundError',\n message: `No handler registered for method ${request.method}`,\n },\n });\n return;\n }\n\n Promise.resolve()\n .then(() => handler(request.body, { generation }))\n .then(response =>\n sendMessage({\n type: responseType,\n id: request.id,\n body: response,\n }),\n )\n .catch(error =>\n sendMessage({\n type: responseType,\n id: request.id,\n error: serializeError(error),\n }),\n );\n };\n\n child.addListener('message', messageListener as (req: unknown) => void);\n\n child.addListener('exit', () => {\n child.removeListener('message', messageListener);\n });\n }\n\n registerMethod<TRequest, TResponse>(\n method: string,\n handler: MethodHandler<TRequest, TResponse>,\n ) {\n if (this.#methods.has(method)) {\n throw new Error(`A handler is already registered for method ${method}`);\n }\n this.#methods.set(method, handler);\n }\n}\n"],"names":["serializeError"],"mappings":";;;;AAmCA,MAAM,WAAA,GAAc,gCAAA;AACpB,MAAM,YAAA,GAAe,iCAAA;AAEd,MAAM,SAAA,CAAU;AAAA,EACrB,WAAA,GAAc,CAAA;AAAA,EACd,QAAA,uBAAe,GAAA,EAAqC;AAAA,EAEpD,SAAS,KAAA,EAAqB;AAC5B,IAAA,MAAM,aAAa,IAAA,CAAK,WAAA,EAAA;AACxB,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAAqB;AAC5C,MAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,MAAM,CAAA;AAChD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,WAAA,CAAY;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,CAAA,iCAAA,EAAoC,OAAA,CAAQ,MAAM,CAAA;AAAA;AAC7D,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,OAAA,EAAQ,CACb,IAAA,CAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,UAAA,EAAY,CAAC,CAAA,CAChD,IAAA;AAAA,QAAK,cACJ,WAAA,CAAY;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,IAAA,EAAM;AAAA,SACP;AAAA,OACH,CACC,KAAA;AAAA,QAAM,WACL,WAAA,CAAY;AAAA,UACV,IAAA,EAAM,YAAA;AAAA,UACN,IAAI,OAAA,CAAQ,EAAA;AAAA,UACZ,KAAA,EAAOA,sBAAe,KAAK;AAAA,SAC5B;AAAA,OACH;AAAA,IACJ,CAAA;AAEA,IAAA,KAAA,CAAM,WAAA,CAAY,WAAW,eAAyC,CAAA;AAEtE,IAAA,KAAA,CAAM,WAAA,CAAY,QAAQ,MAAM;AAC9B,MAAA,KAAA,CAAM,cAAA,CAAe,WAAW,eAAe,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,cAAA,CACE,QACA,OAAA,EACA;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,MAAM,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,EACnC;AACF;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ class ServerDataStore {
4
+ static bind(server) {
5
+ const store = /* @__PURE__ */ new Map();
6
+ server.registerMethod(
7
+ "DevDataStore.save",
8
+ async (request, { generation }) => {
9
+ const { key, data } = request;
10
+ if (!key) {
11
+ throw new Error("Key is required in DevDataStore.save");
12
+ }
13
+ const item = store.get(key);
14
+ if (!item) {
15
+ store.set(key, { generation, data });
16
+ return { saved: true };
17
+ }
18
+ if (item.generation > generation) {
19
+ return { saved: false };
20
+ }
21
+ store.set(key, { generation, data });
22
+ return { saved: true };
23
+ }
24
+ );
25
+ server.registerMethod(
26
+ "DevDataStore.load",
27
+ async (request) => {
28
+ const item = store.get(request.key);
29
+ return { loaded: Boolean(item), data: item?.data };
30
+ }
31
+ );
32
+ }
33
+ }
34
+
35
+ exports.ServerDataStore = ServerDataStore;
36
+ //# sourceMappingURL=ServerDataStore.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerDataStore.cjs.js","sources":["../../../src/lib/ipc/ServerDataStore.ts"],"sourcesContent":["/*\n * Copyright 2023 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 { IpcServer } from './IpcServer';\n\ninterface StorageItem {\n generation: number;\n data: unknown;\n}\n\ninterface SaveRequest {\n key: string;\n data: unknown;\n}\n\ninterface SaveResponse {\n saved: boolean;\n}\n\ninterface LoadRequest {\n key: string;\n}\n\ninterface LoadResponse {\n loaded: boolean;\n data: unknown;\n}\n\nexport class ServerDataStore {\n static bind(server: IpcServer): void {\n const store = new Map<string, StorageItem>();\n\n server.registerMethod<SaveRequest, SaveResponse>(\n 'DevDataStore.save',\n async (request, { generation }) => {\n const { key, data } = request;\n if (!key) {\n throw new Error('Key is required in DevDataStore.save');\n }\n\n const item = store.get(key);\n\n if (!item) {\n store.set(key, { generation, data });\n return { saved: true };\n }\n\n if (item.generation > generation) {\n return { saved: false };\n }\n\n store.set(key, { generation, data });\n return { saved: true };\n },\n );\n\n server.registerMethod<LoadRequest, LoadResponse>(\n 'DevDataStore.load',\n async request => {\n const item = store.get(request.key);\n return { loaded: Boolean(item), data: item?.data };\n },\n );\n }\n}\n"],"names":[],"mappings":";;AAyCO,MAAM,eAAA,CAAgB;AAAA,EAC3B,OAAO,KAAK,MAAA,EAAyB;AACnC,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAE3C,IAAA,MAAA,CAAO,cAAA;AAAA,MACL,mBAAA;AAAA,MACA,OAAO,OAAA,EAAS,EAAE,UAAA,EAAW,KAAM;AACjC,QAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,OAAA;AACtB,QAAA,IAAI,CAAC,GAAA,EAAK;AACR,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAE1B,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,UAAA,EAAY,MAAM,CAAA;AACnC,UAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,QACvB;AAEA,QAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,UAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,QACxB;AAEA,QAAA,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,UAAA,EAAY,MAAM,CAAA;AACnC,QAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,MACvB;AAAA,KACF;AAEA,IAAA,MAAA,CAAO,cAAA;AAAA,MACL,mBAAA;AAAA,MACA,OAAM,OAAA,KAAW;AACf,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAClC,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AACF;;;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var node_util = require('node:util');
4
+ var shellQuote = require('shell-quote');
5
+
6
+ function createScriptOptionsParser(commandPath, options) {
7
+ const expectedScript = `backstage-cli ${commandPath.join(" ")}`;
8
+ return (scriptStr) => {
9
+ if (!scriptStr || !scriptStr.startsWith(expectedScript)) {
10
+ return void 0;
11
+ }
12
+ const argsStr = scriptStr.slice(expectedScript.length).trim();
13
+ const args = argsStr ? shellQuote.parse(argsStr).filter(
14
+ (e) => typeof e === "string"
15
+ ) : [];
16
+ const { values } = node_util.parseArgs({ args, strict: false, options });
17
+ return values;
18
+ };
19
+ }
20
+
21
+ exports.createScriptOptionsParser = createScriptOptionsParser;
22
+ //# sourceMappingURL=optionsParser.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optionsParser.cjs.js","sources":["../../src/lib/optionsParser.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { parseArgs, type ParseArgsConfig } from 'node:util';\nimport { parse as parseShellArgs } from 'shell-quote';\n\nexport function createScriptOptionsParser(\n commandPath: string[],\n options: ParseArgsConfig['options'],\n) {\n const expectedScript = `backstage-cli ${commandPath.join(' ')}`;\n\n return (scriptStr?: string) => {\n if (!scriptStr || !scriptStr.startsWith(expectedScript)) {\n return undefined;\n }\n\n const argsStr = scriptStr.slice(expectedScript.length).trim();\n const args = argsStr\n ? parseShellArgs(argsStr).filter(\n (e): e is string => typeof e === 'string',\n )\n : [];\n\n const { values } = parseArgs({ args, strict: false, options });\n return values;\n };\n}\n"],"names":["parseShellArgs","parseArgs"],"mappings":";;;;;AAkBO,SAAS,yBAAA,CACd,aACA,OAAA,EACA;AACA,EAAA,MAAM,cAAA,GAAiB,CAAA,cAAA,EAAiB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAE7D,EAAA,OAAO,CAAC,SAAA,KAAuB;AAC7B,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,UAAA,CAAW,cAAc,CAAA,EAAG;AACvD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAU,SAAA,CAAU,KAAA,CAAM,cAAA,CAAe,MAAM,EAAE,IAAA,EAAK;AAC5D,IAAA,MAAM,IAAA,GAAO,OAAA,GACTA,gBAAA,CAAe,OAAO,CAAA,CAAE,MAAA;AAAA,MACtB,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM;AAAA,QAEnC,EAAC;AAEL,IAAA,MAAM,EAAE,QAAO,GAAIC,mBAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,CAAA;AAC7D,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;;;;"}
@@ -0,0 +1,252 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var fs = require('fs-extra');
5
+ var node_path = require('node:path');
6
+ var os = require('node:os');
7
+ var tar = require('tar');
8
+ var partition = require('lodash/partition');
9
+ var cliCommon = require('@backstage/cli-common');
10
+ var _package = require('../../package.json.cjs.js');
11
+ var packager = require('../builder/packager.cjs.js');
12
+ var types = require('../builder/types.cjs.js');
13
+ var productionPack = require('./productionPack.cjs.js');
14
+ var cliNode = require('@backstage/cli-node');
15
+ var typeDistProject = require('../typeDistProject.cjs.js');
16
+
17
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
18
+
19
+ function _interopNamespaceCompat(e) {
20
+ if (e && typeof e === 'object' && 'default' in e) return e;
21
+ var n = Object.create(null);
22
+ if (e) {
23
+ Object.keys(e).forEach(function (k) {
24
+ if (k !== 'default') {
25
+ var d = Object.getOwnPropertyDescriptor(e, k);
26
+ Object.defineProperty(n, k, d.get ? d : {
27
+ enumerable: true,
28
+ get: function () { return e[k]; }
29
+ });
30
+ }
31
+ });
32
+ }
33
+ n.default = e;
34
+ return Object.freeze(n);
35
+ }
36
+
37
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
38
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
39
+ var tar__namespace = /*#__PURE__*/_interopNamespaceCompat(tar);
40
+ var partition__default = /*#__PURE__*/_interopDefaultCompat(partition);
41
+
42
+ const UNSAFE_PACKAGES = [
43
+ ...Object.keys(_package.dependencies),
44
+ ...Object.keys(_package.devDependencies)
45
+ ];
46
+ function prefixLogFunc(prefix, logFn) {
47
+ return (data) => {
48
+ for (const line of data.toString("utf8").split(/\r?\n/)) {
49
+ if (line) logFn(`${prefix}${line}`);
50
+ }
51
+ };
52
+ }
53
+ async function createDistWorkspace(packageNames, options = {}) {
54
+ const logger = options.logger ?? { log: console.log, warn: console.warn };
55
+ const targetDir = options.targetDir ?? await fs__default.default.mkdtemp(node_path.resolve(os.tmpdir(), "dist-workspace"));
56
+ const packages = await cliNode.PackageGraph.listTargetPackages();
57
+ const targets = await resolveLocalDependencies(packageNames, packages);
58
+ if (options.buildDependencies) {
59
+ const exclude = options.buildExcludes ?? [];
60
+ const configPaths = options.configPaths ?? [];
61
+ const toBuild = new Set(
62
+ targets.map((_) => _.name).filter((name) => !exclude.includes(name))
63
+ );
64
+ const standardBuilds = new Array();
65
+ const customBuild = new Array();
66
+ for (const pkg of packages) {
67
+ if (!toBuild.has(pkg.packageJson.name)) {
68
+ continue;
69
+ }
70
+ const role = pkg.packageJson.backstage?.role;
71
+ if (!role) {
72
+ logger.warn(
73
+ `Building ${pkg.packageJson.name} separately because it has no role`
74
+ );
75
+ customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });
76
+ continue;
77
+ }
78
+ const buildScript = pkg.packageJson.scripts?.build;
79
+ if (!buildScript) {
80
+ customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });
81
+ continue;
82
+ }
83
+ if (!buildScript.startsWith("backstage-cli package build")) {
84
+ logger.warn(
85
+ `Building ${pkg.packageJson.name} separately because it has a custom build script, '${buildScript}'`
86
+ );
87
+ customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });
88
+ continue;
89
+ }
90
+ if (cliNode.PackageRoles.getRoleInfo(role).output.includes("bundle")) {
91
+ logger.warn(
92
+ `Building ${pkg.packageJson.name} separately because it is a bundled package`
93
+ );
94
+ const args = buildScript.includes("--config") ? [] : configPaths.map((p) => ["--config", p]).flat();
95
+ customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name, args });
96
+ continue;
97
+ }
98
+ const outputs = packager.getOutputsForRole(role);
99
+ outputs.delete(types.Output.types);
100
+ if (outputs.size > 0) {
101
+ standardBuilds.push({
102
+ targetDir: pkg.dir,
103
+ packageJson: pkg.packageJson,
104
+ outputs,
105
+ logPrefix: `${chalk__default.default.cyan(
106
+ node_path.relative(cliCommon.targetPaths.rootDir, pkg.dir)
107
+ )}: `,
108
+ minify: options.minify,
109
+ workspacePackages: packages
110
+ });
111
+ }
112
+ }
113
+ await packager.buildPackages(standardBuilds);
114
+ if (customBuild.length > 0) {
115
+ await cliNode.runConcurrentTasks({
116
+ items: customBuild,
117
+ worker: async ({ name, dir, args }) => {
118
+ await cliCommon.run(["yarn", "run", "build", ...args || []], {
119
+ cwd: dir,
120
+ onStdout: prefixLogFunc(`${name}: `, logger.log),
121
+ onStderr: prefixLogFunc(`${name}: `, logger.warn)
122
+ }).waitForExit();
123
+ }
124
+ });
125
+ }
126
+ }
127
+ await moveToDistWorkspace(
128
+ targetDir,
129
+ targets,
130
+ Boolean(options.alwaysPack),
131
+ Boolean(options.enableFeatureDetection),
132
+ logger
133
+ );
134
+ const files = options.files ?? ["yarn.lock", "package.json"];
135
+ for (const file of files) {
136
+ const src = typeof file === "string" ? file : file.src;
137
+ const dest = typeof file === "string" ? file : file.dest;
138
+ await fs__default.default.copy(cliCommon.targetPaths.resolveRoot(src), node_path.resolve(targetDir, dest));
139
+ }
140
+ if (options.skeleton) {
141
+ const skeletonFiles = targets.map((target) => {
142
+ const dir = node_path.relative(cliCommon.targetPaths.rootDir, target.dir);
143
+ return node_path.join(dir, "package.json");
144
+ }).sort();
145
+ await tar__namespace.create(
146
+ {
147
+ file: node_path.resolve(targetDir, options.skeleton),
148
+ cwd: targetDir,
149
+ portable: true,
150
+ noMtime: true,
151
+ gzip: options.skeleton.endsWith(".gz")
152
+ },
153
+ skeletonFiles
154
+ );
155
+ }
156
+ return { targetDir, targets };
157
+ }
158
+ const FAST_PACK_SCRIPTS = [
159
+ void 0,
160
+ "backstage-cli prepack",
161
+ "backstage-cli package prepack"
162
+ ];
163
+ async function packToDirectory(options) {
164
+ const { packageDir, packageName, targetDir, logger } = options;
165
+ const archivePath = options.archivePath ?? node_path.resolve(targetDir, "temp-archive.tgz");
166
+ const prefix = `${packageName} [pack]: `;
167
+ await fs__default.default.ensureDir(targetDir);
168
+ await cliCommon.run(["yarn", "pack", "--filename", archivePath], {
169
+ cwd: packageDir,
170
+ onStdout: prefixLogFunc(prefix, logger.log),
171
+ onStderr: prefixLogFunc(prefix, logger.warn)
172
+ }).waitForExit();
173
+ await tar__namespace.extract({ file: archivePath, cwd: targetDir, strip: 1 });
174
+ await fs__default.default.remove(archivePath);
175
+ }
176
+ async function moveToDistWorkspace(workspaceDir, localPackages, alwaysPack, enableFeatureDetection, logger) {
177
+ const [fastPackPackages, slowPackPackages] = partition__default.default(
178
+ localPackages,
179
+ (pkg) => !alwaysPack && FAST_PACK_SCRIPTS.includes(pkg.packageJson.scripts?.prepack)
180
+ );
181
+ const featureDetectionProject = fastPackPackages.length > 0 && enableFeatureDetection ? await typeDistProject.createTypeDistProject() : void 0;
182
+ await Promise.all(
183
+ fastPackPackages.map(async (target) => {
184
+ logger.log(`Moving ${target.name} into dist workspace`);
185
+ const outputDir = node_path.relative(cliCommon.targetPaths.rootDir, target.dir);
186
+ const absoluteOutputPath = node_path.resolve(workspaceDir, outputDir);
187
+ await productionPack.productionPack({
188
+ packageDir: target.dir,
189
+ targetDir: absoluteOutputPath,
190
+ featureDetectionProject
191
+ });
192
+ })
193
+ );
194
+ async function pack(target, archive) {
195
+ logger.log(`Repacking ${target.name} into dist workspace`);
196
+ const absoluteOutputPath = node_path.resolve(
197
+ workspaceDir,
198
+ node_path.relative(cliCommon.targetPaths.rootDir, target.dir)
199
+ );
200
+ await packToDirectory({
201
+ packageDir: target.dir,
202
+ packageName: target.name,
203
+ targetDir: absoluteOutputPath,
204
+ archivePath: node_path.resolve(workspaceDir, archive),
205
+ logger
206
+ });
207
+ if (target.packageJson.bundled) {
208
+ const pkgJson = await fs__default.default.readJson(
209
+ node_path.resolve(absoluteOutputPath, "package.json")
210
+ );
211
+ delete pkgJson.dependencies;
212
+ delete pkgJson.devDependencies;
213
+ delete pkgJson.peerDependencies;
214
+ delete pkgJson.optionalDependencies;
215
+ await fs__default.default.writeJson(
216
+ node_path.resolve(absoluteOutputPath, "package.json"),
217
+ pkgJson,
218
+ {
219
+ spaces: 2
220
+ }
221
+ );
222
+ }
223
+ }
224
+ const [unsafePackages, safePackages] = partition__default.default(
225
+ slowPackPackages,
226
+ (p) => UNSAFE_PACKAGES.includes(p.name)
227
+ );
228
+ for (const target of unsafePackages) {
229
+ await pack(target, `temp-package.tgz`);
230
+ }
231
+ await cliNode.runConcurrentTasks({
232
+ items: safePackages.map((target, index) => ({ target, index })),
233
+ worker: async ({ target, index }) => {
234
+ await pack(target, `temp-package-${index}.tgz`);
235
+ }
236
+ });
237
+ }
238
+ async function resolveLocalDependencies(packageNames, packages) {
239
+ const packageGraph = cliNode.PackageGraph.fromPackages(packages);
240
+ const targetNames = packageGraph.collectPackageNames(packageNames, (node) => {
241
+ if (node.packageJson.bundled) {
242
+ return void 0;
243
+ }
244
+ return node.publishedLocalDependencies.keys();
245
+ });
246
+ return Array.from(targetNames).map((name) => packageGraph.get(name));
247
+ }
248
+
249
+ exports.createDistWorkspace = createDistWorkspace;
250
+ exports.packToDirectory = packToDirectory;
251
+ exports.resolveLocalDependencies = resolveLocalDependencies;
252
+ //# sourceMappingURL=createDistWorkspace.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDistWorkspace.cjs.js","sources":["../../../src/lib/packager/createDistWorkspace.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 fs from 'fs-extra';\nimport {\n join as joinPath,\n resolve as resolvePath,\n relative as relativePath,\n} from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as tar from 'tar';\nimport partition from 'lodash/partition';\n\nimport { run, targetPaths } from '@backstage/cli-common';\nimport {\n dependencies as cliDependencies,\n devDependencies as cliDevDependencies,\n} from '../../../package.json';\nimport {\n BuildOptions,\n buildPackages,\n getOutputsForRole,\n Output,\n} from '../builder';\nimport { productionPack } from './productionPack';\nimport {\n BackstagePackage,\n PackageRoles,\n PackageGraph,\n PackageGraphNode,\n runConcurrentTasks,\n} from '@backstage/cli-node';\nimport { createTypeDistProject } from '../typeDistProject';\n\n// These packages aren't safe to pack in parallel since the CLI depends on them\nconst UNSAFE_PACKAGES = [\n ...Object.keys(cliDependencies),\n ...Object.keys(cliDevDependencies),\n];\n\ntype FileEntry =\n | string\n | {\n src: string;\n dest: string;\n };\n\ntype Options = {\n /**\n * Target directory for the dist workspace, defaults to a temporary directory\n */\n targetDir?: string;\n\n /**\n * Configuration files to load during packaging.\n */\n configPaths?: string[];\n\n /**\n * Files to copy into the target workspace.\n *\n * Defaults to ['yarn.lock', 'package.json'].\n */\n files?: FileEntry[];\n\n /**\n * If set to true, the target packages are built before they are packaged into the workspace.\n */\n buildDependencies?: boolean;\n\n /**\n * When `buildDependencies` is set, this list of packages will not be built even if they are dependencies.\n */\n buildExcludes?: string[];\n\n /**\n * If set, creates a skeleton tarball that contains all package.json files\n * with the same structure as the workspace dir.\n */\n skeleton?: 'skeleton.tar' | 'skeleton.tar.gz';\n\n /**\n * If set to true, `yarn pack` is always preferred when creating the dist\n * workspace. This ensures correct workspace output at significant cost to\n * command performance.\n */\n alwaysPack?: boolean;\n\n /**\n * If set to true, the TypeScript feature detection will be enabled, which\n * annotates the package exports field with the `backstage` export type.\n */\n enableFeatureDetection?: boolean;\n\n /**\n * If set to true, the generated code will be minified.\n */\n minify?: boolean;\n\n /**\n * Optional logger to route console output through. When not provided,\n * output goes to `console.log` / `console.warn` as before.\n */\n logger?: {\n log(msg: string): void;\n warn(msg: string): void;\n };\n};\n\nfunction prefixLogFunc(prefix: string, logFn: (msg: string) => void) {\n return (data: Buffer) => {\n for (const line of data.toString('utf8').split(/\\r?\\n/)) {\n if (line) logFn(`${prefix}${line}`);\n }\n };\n}\n\n/**\n * Uses `yarn pack` to package local packages and unpacks them into a dist workspace.\n * The target workspace will end up containing dist version of each package and\n * will be suitable for packaging e.g. into a docker image.\n *\n * This creates a structure that is functionally similar to if the packages were\n * installed from npm, but uses Yarn workspaces to link to them at runtime.\n */\nexport async function createDistWorkspace(\n packageNames: string[],\n options: Options = {},\n) {\n const logger = options.logger ?? { log: console.log, warn: console.warn };\n\n const targetDir =\n options.targetDir ??\n (await fs.mkdtemp(resolvePath(tmpdir(), 'dist-workspace')));\n\n const packages = await PackageGraph.listTargetPackages();\n const targets = await resolveLocalDependencies(packageNames, packages);\n\n if (options.buildDependencies) {\n const exclude = options.buildExcludes ?? [];\n const configPaths = options.configPaths ?? [];\n\n const toBuild = new Set(\n targets.map(_ => _.name).filter(name => !exclude.includes(name)),\n );\n\n const standardBuilds = new Array<BuildOptions>();\n const customBuild = new Array<{\n dir: string;\n name: string;\n args?: string[];\n }>();\n\n for (const pkg of packages) {\n if (!toBuild.has(pkg.packageJson.name)) {\n continue;\n }\n const role = pkg.packageJson.backstage?.role;\n if (!role) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has no role`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n const buildScript = pkg.packageJson.scripts?.build;\n if (!buildScript) {\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (!buildScript.startsWith('backstage-cli package build')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it has a custom build script, '${buildScript}'`,\n );\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name });\n continue;\n }\n\n if (PackageRoles.getRoleInfo(role).output.includes('bundle')) {\n logger.warn(\n `Building ${pkg.packageJson.name} separately because it is a bundled package`,\n );\n const args = buildScript.includes('--config')\n ? []\n : configPaths.map(p => ['--config', p]).flat();\n customBuild.push({ dir: pkg.dir, name: pkg.packageJson.name, args });\n continue;\n }\n\n const outputs = getOutputsForRole(role);\n\n // No need to build and include types in the production runtime\n outputs.delete(Output.types);\n\n if (outputs.size > 0) {\n standardBuilds.push({\n targetDir: pkg.dir,\n packageJson: pkg.packageJson,\n outputs: outputs,\n logPrefix: `${chalk.cyan(\n relativePath(targetPaths.rootDir, pkg.dir),\n )}: `,\n minify: options.minify,\n workspacePackages: packages,\n });\n }\n }\n\n await buildPackages(standardBuilds);\n\n if (customBuild.length > 0) {\n await runConcurrentTasks({\n items: customBuild,\n worker: async ({ name, dir, args }) => {\n await run(['yarn', 'run', 'build', ...(args || [])], {\n cwd: dir,\n onStdout: prefixLogFunc(`${name}: `, logger.log),\n onStderr: prefixLogFunc(`${name}: `, logger.warn),\n }).waitForExit();\n },\n });\n }\n }\n\n await moveToDistWorkspace(\n targetDir,\n targets,\n Boolean(options.alwaysPack),\n Boolean(options.enableFeatureDetection),\n logger,\n );\n\n const files: FileEntry[] = options.files ?? ['yarn.lock', 'package.json'];\n\n for (const file of files) {\n const src = typeof file === 'string' ? file : file.src;\n const dest = typeof file === 'string' ? file : file.dest;\n await fs.copy(targetPaths.resolveRoot(src), resolvePath(targetDir, dest));\n }\n\n if (options.skeleton) {\n const skeletonFiles = targets\n .map(target => {\n const dir = relativePath(targetPaths.rootDir, target.dir);\n return joinPath(dir, 'package.json');\n })\n .sort();\n\n await tar.create(\n {\n file: resolvePath(targetDir, options.skeleton),\n cwd: targetDir,\n portable: true,\n noMtime: true,\n gzip: options.skeleton.endsWith('.gz'),\n },\n skeletonFiles,\n );\n }\n\n return { targetDir, targets };\n}\n\nconst FAST_PACK_SCRIPTS = [\n undefined,\n 'backstage-cli prepack',\n 'backstage-cli package prepack',\n];\n\n/**\n * Runs `yarn pack` on a single package and extracts the resulting tarball\n * into `targetDir`. This resolves `workspace:^` and `backstage:^` dependency\n * specs to concrete versions via yarn's `beforeWorkspacePacking` hook.\n */\nexport async function packToDirectory(options: {\n packageDir: string;\n packageName: string;\n targetDir: string;\n archivePath?: string;\n logger: { log(msg: string): void; warn(msg: string): void };\n}): Promise<void> {\n const { packageDir, packageName, targetDir, logger } = options;\n const archivePath =\n options.archivePath ?? resolvePath(targetDir, 'temp-archive.tgz');\n const prefix = `${packageName} [pack]: `;\n\n await fs.ensureDir(targetDir);\n await run(['yarn', 'pack', '--filename', archivePath], {\n cwd: packageDir,\n onStdout: prefixLogFunc(prefix, logger.log),\n onStderr: prefixLogFunc(prefix, logger.warn),\n }).waitForExit();\n\n await tar.extract({ file: archivePath, cwd: targetDir, strip: 1 });\n await fs.remove(archivePath);\n}\n\nasync function moveToDistWorkspace(\n workspaceDir: string,\n localPackages: PackageGraphNode[],\n alwaysPack: boolean,\n enableFeatureDetection: boolean,\n logger: { log(msg: string): void; warn(msg: string): void },\n): Promise<void> {\n const [fastPackPackages, slowPackPackages] = partition(\n localPackages,\n pkg =>\n !alwaysPack &&\n FAST_PACK_SCRIPTS.includes(pkg.packageJson.scripts?.prepack),\n );\n\n const featureDetectionProject =\n fastPackPackages.length > 0 && enableFeatureDetection\n ? await createTypeDistProject()\n : undefined;\n\n // New an improved flow where we avoid calling `yarn pack`\n await Promise.all(\n fastPackPackages.map(async target => {\n logger.log(`Moving ${target.name} into dist workspace`);\n\n const outputDir = relativePath(targetPaths.rootDir, target.dir);\n const absoluteOutputPath = resolvePath(workspaceDir, outputDir);\n await productionPack({\n packageDir: target.dir,\n targetDir: absoluteOutputPath,\n featureDetectionProject,\n });\n }),\n );\n\n // Old flow is below, which calls `yarn pack` and extracts the tarball\n\n async function pack(target: PackageGraphNode, archive: string) {\n logger.log(`Repacking ${target.name} into dist workspace`);\n const absoluteOutputPath = resolvePath(\n workspaceDir,\n relativePath(targetPaths.rootDir, target.dir),\n );\n await packToDirectory({\n packageDir: target.dir,\n packageName: target.name,\n targetDir: absoluteOutputPath,\n archivePath: resolvePath(workspaceDir, archive),\n logger,\n });\n\n // We remove the dependencies from package.json of packages that are marked\n // as bundled, so that yarn doesn't try to install them.\n if (target.packageJson.bundled) {\n const pkgJson = await fs.readJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n );\n delete pkgJson.dependencies;\n delete pkgJson.devDependencies;\n delete pkgJson.peerDependencies;\n delete pkgJson.optionalDependencies;\n\n await fs.writeJson(\n resolvePath(absoluteOutputPath, 'package.json'),\n pkgJson,\n {\n spaces: 2,\n },\n );\n }\n }\n\n const [unsafePackages, safePackages] = partition(slowPackPackages, p =>\n UNSAFE_PACKAGES.includes(p.name),\n );\n\n // The unsafe package are packed first one by one in order to avoid race conditions\n // where the CLI is being executed with broken dependencies.\n for (const target of unsafePackages) {\n await pack(target, `temp-package.tgz`);\n }\n\n // Repacking in parallel is much faster and safe for all packages outside of the Backstage repo\n await runConcurrentTasks({\n items: safePackages.map((target, index) => ({ target, index })),\n worker: async ({ target, index }) => {\n await pack(target, `temp-package-${index}.tgz`);\n },\n });\n}\n\n/**\n * Resolves the full set of local (workspace) packages that the given\n * package names transitively depend on via `publishedLocalDependencies`.\n * Packages marked as `bundled` have their own dependencies excluded.\n *\n * This is the same traversal that `createDistWorkspace` performs internally.\n * Callers must supply the monorepo package list obtained from\n * `PackageGraph.listTargetPackages()`.\n */\nexport async function resolveLocalDependencies(\n packageNames: string[],\n packages: BackstagePackage[],\n): Promise<PackageGraphNode[]> {\n const packageGraph = PackageGraph.fromPackages(packages);\n const targetNames = packageGraph.collectPackageNames(packageNames, node => {\n // Don't include dependencies of packages that are marked as bundled\n if (node.packageJson.bundled) {\n return undefined;\n }\n\n return node.publishedLocalDependencies.keys();\n });\n return Array.from(targetNames).map(name => packageGraph.get(name)!);\n}\n"],"names":["cliDependencies","cliDevDependencies","fs","resolvePath","tmpdir","PackageGraph","PackageRoles","getOutputsForRole","Output","chalk","relativePath","targetPaths","buildPackages","runConcurrentTasks","run","joinPath","tar","partition","createTypeDistProject","productionPack"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs-extra');
4
+ var npmPackList = require('npm-packlist');
5
+ var node_path = require('node:path');
6
+ var entryPoints = require('../entryPoints.cjs.js');
7
+ var typeDistProject = require('../typeDistProject.cjs.js');
8
+
9
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
10
+
11
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
12
+ var npmPackList__default = /*#__PURE__*/_interopDefaultCompat(npmPackList);
13
+
14
+ const PKG_PATH = "package.json";
15
+ const PKG_BACKUP_PATH = "package.json-prepack";
16
+ const SKIPPED_KEYS = ["access", "registry", "tag"];
17
+ const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx"];
18
+ async function productionPack(options) {
19
+ const { packageDir, targetDir } = options;
20
+ const pkgPath = node_path.resolve(packageDir, PKG_PATH);
21
+ const pkgContent = await fs__default.default.readFile(pkgPath, "utf8");
22
+ const pkg = JSON.parse(pkgContent);
23
+ if (!targetDir) {
24
+ await fs__default.default.writeFile(PKG_BACKUP_PATH, pkgContent);
25
+ }
26
+ await rewriteEntryPoints(pkg, packageDir, options.featureDetectionProject);
27
+ const publishConfig = pkg.publishConfig ?? {};
28
+ for (const key of Object.keys(publishConfig)) {
29
+ if (!SKIPPED_KEYS.includes(key)) {
30
+ pkg[key] = publishConfig[key];
31
+ }
32
+ }
33
+ if (pkg.bundled) {
34
+ delete pkg.dependencies;
35
+ delete pkg.devDependencies;
36
+ delete pkg.peerDependencies;
37
+ delete pkg.optionalDependencies;
38
+ }
39
+ if (targetDir) {
40
+ const filePaths = await npmPackList__default.default({
41
+ path: packageDir,
42
+ // This makes sure we use the updated package.json when listing files
43
+ packageJsonCache: /* @__PURE__ */ new Map([
44
+ [node_path.resolve(packageDir, PKG_PATH), pkg]
45
+ ])
46
+ // Seems like this parameter type is wrong,
47
+ });
48
+ await fs__default.default.ensureDir(targetDir);
49
+ for (const filePath of filePaths.sort()) {
50
+ const target = node_path.resolve(targetDir, filePath);
51
+ if (filePath === PKG_PATH) {
52
+ await fs__default.default.writeJson(target, pkg, { encoding: "utf8", spaces: 2 });
53
+ } else {
54
+ await fs__default.default.copy(node_path.resolve(packageDir, filePath), target);
55
+ }
56
+ }
57
+ } else {
58
+ await fs__default.default.writeJson(pkgPath, pkg, { encoding: "utf8", spaces: 2 });
59
+ }
60
+ }
61
+ async function revertProductionPack(packageDir) {
62
+ try {
63
+ await fs__default.default.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true });
64
+ const pkg = await fs__default.default.readJson(PKG_PATH);
65
+ const entryPoints$1 = entryPoints.readEntryPoints(pkg);
66
+ for (const entryPoint of entryPoints$1) {
67
+ if (entryPoint.mount !== "." && SCRIPT_EXTS.includes(entryPoint.ext)) {
68
+ await fs__default.default.remove(node_path.resolve(packageDir, entryPoint.name));
69
+ }
70
+ }
71
+ } catch (error) {
72
+ console.warn(
73
+ `Failed to restore package.json, ${error}. Your package will be fine but you may have ended up with some garbage in the repo.`
74
+ );
75
+ }
76
+ }
77
+ const EXPORT_MAP = {
78
+ import: ".esm.js",
79
+ require: ".cjs.js",
80
+ types: ".d.ts"
81
+ };
82
+ async function rewriteEntryPoints(pkg, packageDir, featureDetectionProject) {
83
+ const distPath = node_path.resolve(packageDir, "dist");
84
+ if (!await fs__default.default.pathExists(distPath)) {
85
+ return void 0;
86
+ }
87
+ const distFiles = await fs__default.default.readdir(distPath);
88
+ const outputExports = {};
89
+ const entryPoints$1 = entryPoints.readEntryPoints(pkg);
90
+ if (pkg.typesVersions) {
91
+ pkg.typesVersions = void 0;
92
+ }
93
+ for (const entryPoint of entryPoints$1) {
94
+ if (!SCRIPT_EXTS.includes(entryPoint.ext)) {
95
+ outputExports[entryPoint.mount] = entryPoint.path.replace(
96
+ /^(\.\/)?src\//,
97
+ "./dist/"
98
+ );
99
+ continue;
100
+ }
101
+ let exp = {};
102
+ for (const [key, ext] of Object.entries(EXPORT_MAP)) {
103
+ const name = `${entryPoint.name}${ext}`;
104
+ if (distFiles.includes(name)) {
105
+ exp[key] = `./${node_path.posix.join(`dist`, name)}`;
106
+ }
107
+ }
108
+ if (exp.types) {
109
+ if (!pkg.typesVersions) {
110
+ pkg.typesVersions = { "*": {} };
111
+ }
112
+ if (entryPoint.name !== "index") {
113
+ pkg.typesVersions["*"][entryPoint.name] = [
114
+ `dist/${entryPoint.name}.d.ts`
115
+ ];
116
+ }
117
+ }
118
+ exp.default = exp.require ?? exp.import;
119
+ if (exp.types && featureDetectionProject) {
120
+ const defaultFeatureType = pkg.backstage?.role && typeDistProject.getEntryPointDefaultFeatureType(
121
+ pkg.backstage?.role,
122
+ packageDir,
123
+ featureDetectionProject,
124
+ exp.types
125
+ );
126
+ if (defaultFeatureType) {
127
+ exp = { backstage: defaultFeatureType, ...exp };
128
+ pkg.backstage = pkg.backstage ?? {};
129
+ pkg.backstage.features = pkg.backstage.features ?? {};
130
+ pkg.backstage.features[entryPoint.mount] = defaultFeatureType;
131
+ }
132
+ }
133
+ if (entryPoint.mount === ".") {
134
+ if (exp.default) {
135
+ pkg.main = exp.default;
136
+ }
137
+ if (exp.import) {
138
+ pkg.module = exp.import;
139
+ }
140
+ if (exp.types) {
141
+ pkg.types = exp.types;
142
+ }
143
+ }
144
+ if (Object.keys(exp).length > 0) {
145
+ outputExports[entryPoint.mount] = exp;
146
+ }
147
+ }
148
+ if (pkg.typesVersions?.["*"]) {
149
+ pkg.typesVersions["*"]["package.json"] = ["package.json"];
150
+ }
151
+ if (pkg.exports) {
152
+ pkg.exports = outputExports;
153
+ pkg.exports["./package.json"] = "./package.json";
154
+ }
155
+ return void 0;
156
+ }
157
+
158
+ exports.productionPack = productionPack;
159
+ exports.revertProductionPack = revertProductionPack;
160
+ //# sourceMappingURL=productionPack.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"productionPack.cjs.js","sources":["../../../src/lib/packager/productionPack.ts"],"sourcesContent":["/*\n * Copyright 2023 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 fs from 'fs-extra';\nimport npmPackList from 'npm-packlist';\nimport { resolve as resolvePath, posix as posixPath } from 'node:path';\nimport { BackstagePackageJson } from '@backstage/cli-node';\nimport { readEntryPoints } from '../entryPoints';\nimport { getEntryPointDefaultFeatureType } from '../typeDistProject';\nimport { Project } from 'ts-morph';\n\nconst PKG_PATH = 'package.json';\nconst PKG_BACKUP_PATH = 'package.json-prepack';\n\nconst SKIPPED_KEYS = ['access', 'registry', 'tag'];\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx'];\n\ninterface ProductionPackOptions {\n packageDir: string;\n targetDir?: string;\n /**\n * Enables package feature detection using this TS-morph project.\n */\n featureDetectionProject?: Project;\n}\n\nexport async function productionPack(options: ProductionPackOptions) {\n const { packageDir, targetDir } = options;\n const pkgPath = resolvePath(packageDir, PKG_PATH);\n const pkgContent = await fs.readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(pkgContent) as BackstagePackageJson;\n\n // If we're making the update in-line, back up the package.json\n if (!targetDir) {\n await fs.writeFile(PKG_BACKUP_PATH, pkgContent);\n }\n\n // This mutates pkg to fill in index exports, so call it before applying publishConfig\n await rewriteEntryPoints(pkg, packageDir, options.featureDetectionProject);\n\n // TODO(Rugvip): Once exports are rolled out more broadly we should deprecate and remove this behavior\n const publishConfig = pkg.publishConfig ?? {};\n for (const key of Object.keys(publishConfig)) {\n if (!SKIPPED_KEYS.includes(key)) {\n (pkg as any)[key] = publishConfig[key as keyof typeof publishConfig];\n }\n }\n\n // We remove the dependencies from package.json of packages that are marked\n // as bundled, so that yarn doesn't try to install them.\n if (pkg.bundled) {\n delete pkg.dependencies;\n delete pkg.devDependencies;\n delete pkg.peerDependencies;\n delete pkg.optionalDependencies;\n }\n\n if (targetDir) {\n // Lists all dist files, respecting .npmignore, files field in package.json, etc.\n const filePaths = await npmPackList({\n path: packageDir,\n // This makes sure we use the updated package.json when listing files\n packageJsonCache: new Map([\n [resolvePath(packageDir, PKG_PATH), pkg],\n ]) as any, // Seems like this parameter type is wrong,\n });\n\n await fs.ensureDir(targetDir);\n for (const filePath of filePaths.sort()) {\n const target = resolvePath(targetDir, filePath);\n if (filePath === PKG_PATH) {\n await fs.writeJson(target, pkg, { encoding: 'utf8', spaces: 2 });\n } else {\n await fs.copy(resolvePath(packageDir, filePath), target);\n }\n }\n } else {\n await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 });\n }\n}\n\n// Reverts the changes made by productionPack when called without a targetDir.\nexport async function revertProductionPack(packageDir: string) {\n // postpack isn't called by yarn right now, so it needs to be called manually\n try {\n await fs.move(PKG_BACKUP_PATH, PKG_PATH, { overwrite: true });\n\n // Check if we're shipping types for other release stages, clean up in that case\n const pkg = await fs.readJson(PKG_PATH);\n\n // Remove any extra entrypoint backwards compatibility directories\n const entryPoints = readEntryPoints(pkg);\n for (const entryPoint of entryPoints) {\n if (entryPoint.mount !== '.' && SCRIPT_EXTS.includes(entryPoint.ext)) {\n await fs.remove(resolvePath(packageDir, entryPoint.name));\n }\n }\n } catch (error) {\n console.warn(\n `Failed to restore package.json, ${error}. ` +\n 'Your package will be fine but you may have ended up with some garbage in the repo.',\n );\n }\n}\n\nconst EXPORT_MAP = {\n import: '.esm.js',\n require: '.cjs.js',\n types: '.d.ts',\n};\n\n/**\n * Rewrites the exports field in package.json to point to dist files, as\n * well as returning a function that creates backwards compatibility\n * entry points for importers that don't support exports.\n */\nasync function rewriteEntryPoints(\n pkg: BackstagePackageJson,\n packageDir: string,\n featureDetectionProject?: Project,\n) {\n const distPath = resolvePath(packageDir, 'dist');\n if (!(await fs.pathExists(distPath))) {\n return undefined;\n }\n const distFiles = await fs.readdir(distPath);\n const outputExports = {} as Record<string, string | Record<string, string>>;\n\n const entryPoints = readEntryPoints(pkg);\n\n // Clear to ensure a clean slate before adding entries back in further down\n if (pkg.typesVersions) {\n pkg.typesVersions = undefined;\n }\n\n for (const entryPoint of entryPoints) {\n if (!SCRIPT_EXTS.includes(entryPoint.ext)) {\n // Non-script files (like CSS) get their paths rewritten from src/ to dist/\n outputExports[entryPoint.mount] = entryPoint.path.replace(\n /^(\\.\\/)?src\\//,\n './dist/',\n );\n continue;\n }\n\n let exp = {} as Record<string, string>;\n\n for (const [key, ext] of Object.entries(EXPORT_MAP)) {\n const name = `${entryPoint.name}${ext}`;\n if (distFiles.includes(name)) {\n exp[key] = `./${posixPath.join(`dist`, name)}`;\n }\n }\n\n // Our current tooling relies on the typesVersions field rather than export.*.types\n if (exp.types) {\n if (!pkg.typesVersions) {\n pkg.typesVersions = { '*': {} };\n }\n if (entryPoint.name !== 'index') {\n pkg.typesVersions['*'][entryPoint.name] = [\n `dist/${entryPoint.name}.d.ts`,\n ];\n }\n }\n\n exp.default = exp.require ?? exp.import;\n\n // Find the default export type for the entry point, if feature detection is active\n if (exp.types && featureDetectionProject) {\n const defaultFeatureType =\n pkg.backstage?.role &&\n getEntryPointDefaultFeatureType(\n pkg.backstage?.role,\n packageDir,\n featureDetectionProject,\n exp.types,\n );\n\n if (defaultFeatureType) {\n // This ensures that the `backstage` field is at the top of the\n // `exports` field in the package.json because order is important.\n // https://nodejs.org/docs/latest-v20.x/api/packages.html#conditional-exports\n //\n // Adding this to the `exports` field in the package.json is to temporarily\n // support any existing behavior that relies on this, however not all packages\n // have exports field in their package.json.\n exp = { backstage: defaultFeatureType, ...exp };\n\n // Add the default feature type to the backstage metadata in the package.json\n pkg.backstage = pkg.backstage ?? {};\n pkg.backstage.features = pkg.backstage.features ?? {};\n pkg.backstage.features[entryPoint.mount] = defaultFeatureType;\n }\n }\n\n if (entryPoint.mount === '.') {\n if (exp.default) {\n pkg.main = exp.default;\n }\n if (exp.import) {\n pkg.module = exp.import;\n }\n if (exp.types) {\n pkg.types = exp.types;\n }\n }\n\n if (Object.keys(exp).length > 0) {\n outputExports[entryPoint.mount] = exp;\n }\n }\n\n // Make sure package.json is also available in typesVersions if present\n if (pkg.typesVersions?.['*']) {\n pkg.typesVersions['*']['package.json'] = ['package.json'];\n }\n\n if (pkg.exports) {\n pkg.exports = outputExports;\n // We treat package.json as a fixed export that is always available in the published package\n pkg.exports['./package.json'] = './package.json';\n }\n\n return undefined;\n}\n"],"names":["resolvePath","fs","npmPackList","entryPoints","readEntryPoints","posixPath","getEntryPointDefaultFeatureType"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ function publishPreflightCheck(pkg) {
4
+ const { name, backstage } = pkg.packageJson;
5
+ if (!backstage || !name) {
6
+ return;
7
+ }
8
+ const { role } = backstage;
9
+ if (role === "backend-plugin" || role === "backend-plugin-module" || role === "frontend-plugin") {
10
+ if (!backstage.pluginId) {
11
+ throw new Error(
12
+ `Plugin package ${name} is missing a backstage.pluginId, please run 'backstage-cli repo fix --publish'`
13
+ );
14
+ }
15
+ }
16
+ if (role === "backend-plugin" || role === "frontend-plugin") {
17
+ if (!backstage.pluginPackages) {
18
+ throw new Error(
19
+ `Plugin package ${name} is missing a backstage.pluginPackages, please run 'backstage-cli repo fix --publish'`
20
+ );
21
+ }
22
+ }
23
+ if (backstage.pluginId && (role === "common-library" || role === "node-library" || role === "web-library")) {
24
+ if (!backstage.pluginPackages) {
25
+ throw new Error(
26
+ `Plugin library package ${name} is missing a backstage.pluginPackages, please run 'backstage-cli repo fix --publish'`
27
+ );
28
+ }
29
+ }
30
+ if (role === "backend-plugin-module" || role === "frontend-plugin-module") {
31
+ if (backstage.pluginId && !backstage.pluginPackage) {
32
+ throw new Error(
33
+ `Plugin module package ${name} is missing a backstage.pluginPackage, please run 'backstage-cli repo fix --publish'`
34
+ );
35
+ }
36
+ }
37
+ }
38
+
39
+ exports.publishPreflightCheck = publishPreflightCheck;
40
+ //# sourceMappingURL=publishing.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.cjs.js","sources":["../../src/lib/publishing.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { BackstagePackage } from '@backstage/cli-node';\n\n/**\n * A basic check that throws if a packages doesn't contain required backstage metadata for publishing\n */\nexport function publishPreflightCheck(pkg: BackstagePackage): void {\n const { name, backstage } = pkg.packageJson;\n if (!backstage || !name) {\n return;\n }\n\n const { role } = backstage;\n\n if (\n role === 'backend-plugin' ||\n role === 'backend-plugin-module' ||\n role === 'frontend-plugin'\n // TODO(Rugvip): We currently support plugin-less frontend modules for the new frontend system, but it needs a different solution\n // || role === 'frontend-plugin-module'\n ) {\n if (!backstage.pluginId) {\n throw new Error(\n `Plugin package ${name} is missing a backstage.pluginId, please run 'backstage-cli repo fix --publish'`,\n );\n }\n }\n\n if (role === 'backend-plugin' || role === 'frontend-plugin') {\n if (!backstage.pluginPackages) {\n throw new Error(\n `Plugin package ${name} is missing a backstage.pluginPackages, please run 'backstage-cli repo fix --publish'`,\n );\n }\n }\n\n if (\n backstage.pluginId &&\n (role === 'common-library' ||\n role === 'node-library' ||\n role === 'web-library')\n ) {\n if (!backstage.pluginPackages) {\n throw new Error(\n `Plugin library package ${name} is missing a backstage.pluginPackages, please run 'backstage-cli repo fix --publish'`,\n );\n }\n }\n\n if (role === 'backend-plugin-module' || role === 'frontend-plugin-module') {\n // TODO(Rugvip): Remove this .pluginId check once frontend modules are required to have a plugin ID\n if (backstage.pluginId && !backstage.pluginPackage) {\n throw new Error(\n `Plugin module package ${name} is missing a backstage.pluginPackage, please run 'backstage-cli repo fix --publish'`,\n );\n }\n }\n}\n"],"names":[],"mappings":";;AAqBO,SAAS,sBAAsB,GAAA,EAA6B;AACjE,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,GAAA,CAAI,WAAA;AAChC,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAK,GAAI,SAAA;AAEjB,EAAA,IACE,IAAA,KAAS,gBAAA,IACT,IAAA,KAAS,uBAAA,IACT,SAAS,iBAAA,EAGT;AACA,IAAA,IAAI,CAAC,UAAU,QAAA,EAAU;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kBAAkB,IAAI,CAAA,+EAAA;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,IAAA,KAAS,iBAAA,EAAmB;AAC3D,IAAA,IAAI,CAAC,UAAU,cAAA,EAAgB;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kBAAkB,IAAI,CAAA,qFAAA;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IACE,UAAU,QAAA,KACT,IAAA,KAAS,oBACR,IAAA,KAAS,cAAA,IACT,SAAS,aAAA,CAAA,EACX;AACA,IAAA,IAAI,CAAC,UAAU,cAAA,EAAgB;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,0BAA0B,IAAI,CAAA,qFAAA;AAAA,OAChC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,KAAS,uBAAA,IAA2B,IAAA,KAAS,wBAAA,EAA0B;AAEzE,IAAA,IAAI,SAAA,CAAU,QAAA,IAAY,CAAC,SAAA,CAAU,aAAA,EAAe;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,yBAAyB,IAAI,CAAA,oFAAA;AAAA,OAC/B;AAAA,IACF;AAAA,EACF;AACF;;;;"}