@backstage/cli-node 0.2.15 → 0.2.16-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage/cli-node
2
2
 
3
+ ## 0.2.16-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 4e8c726: Updated to use new utilities from `@backstage/cli-common`.
8
+ - Updated dependencies
9
+ - @backstage/cli-common@0.1.16-next.1
10
+
11
+ ## 0.2.16-next.0
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+ - @backstage/cli-common@0.1.16-next.0
17
+ - @backstage/errors@1.2.7
18
+ - @backstage/types@1.2.2
19
+
3
20
  ## 0.2.15
4
21
 
5
22
  ### Patch Changes
@@ -1,20 +1,21 @@
1
1
  'use strict';
2
2
 
3
3
  var errors = require('@backstage/errors');
4
- var util = require('../util.cjs.js');
4
+ var paths = require('../paths.cjs.js');
5
+ var cliCommon = require('@backstage/cli-common');
5
6
 
6
7
  async function runGit(...args) {
7
8
  try {
8
- const { stdout } = await util.execFile("git", args, {
9
- shell: true,
10
- cwd: util.paths.targetRoot
9
+ const stdout = await cliCommon.runOutput(["git", ...args], {
10
+ cwd: paths.paths.targetRoot
11
11
  });
12
12
  return stdout.trim().split(/\r\n|\r|\n/);
13
13
  } catch (error) {
14
14
  errors.assertError(error);
15
- if (error.stderr || typeof error.code === "number") {
16
- const stderr = error.stderr?.toString("utf8");
17
- const msg = stderr?.trim() ?? `with exit code ${error.code}`;
15
+ if ("code" in error && typeof error.code === "number") {
16
+ const code = error.code;
17
+ const stderr = error.stderr;
18
+ const msg = stderr?.trim() ?? `with exit code ${code}`;
18
19
  throw new Error(`git ${args[0]} failed, ${msg}`);
19
20
  }
20
21
  throw new errors.ForwardedError("Unknown execution error", error);
@@ -53,10 +54,8 @@ class GitUtils {
53
54
  showRef = base;
54
55
  } catch {
55
56
  }
56
- const { stdout } = await util.execFile("git", ["show", `${showRef}:${path}`], {
57
- shell: true,
58
- cwd: util.paths.targetRoot,
59
- maxBuffer: 1024 * 1024 * 50
57
+ const stdout = await cliCommon.runOutput(["git", "show", `${showRef}:${path}`], {
58
+ cwd: paths.paths.targetRoot
60
59
  });
61
60
  return stdout;
62
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GitUtils.cjs.js","sources":["../../src/git/GitUtils.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { assertError, ForwardedError } from '@backstage/errors';\nimport { execFile, paths } from '../util';\n\n/**\n * Run a git command, trimming the output splitting it into lines.\n */\nexport async function runGit(...args: string[]) {\n try {\n const { stdout } = await execFile('git', args, {\n shell: true,\n cwd: paths.targetRoot,\n });\n return stdout.trim().split(/\\r\\n|\\r|\\n/);\n } catch (error) {\n assertError(error);\n if (error.stderr || typeof error.code === 'number') {\n const stderr = (error.stderr as undefined | Buffer)?.toString('utf8');\n const msg = stderr?.trim() ?? `with exit code ${error.code}`;\n throw new Error(`git ${args[0]} failed, ${msg}`);\n }\n throw new ForwardedError('Unknown execution error', error);\n }\n}\n\n/**\n * Utilities for working with git.\n *\n * @public\n */\nexport class GitUtils {\n /**\n * Returns a sorted list of all files that have changed since the merge base\n * of the provided `ref` and HEAD, as well as all files that are not tracked by git.\n */\n static async listChangedFiles(ref: string) {\n if (!ref) {\n throw new Error('ref is required');\n }\n\n let diffRef = ref;\n try {\n const [base] = await runGit('merge-base', 'HEAD', ref);\n diffRef = base;\n } catch {\n // silently fall back to using the ref directly if merge base is not available\n }\n\n const tracked = await runGit('diff', '--name-only', diffRef);\n const untracked = await runGit(\n 'ls-files',\n '--others',\n '--exclude-standard',\n );\n\n return Array.from(new Set([...tracked, ...untracked]));\n }\n\n /**\n * Returns the contents of a file at a specific ref.\n */\n static async readFileAtRef(path: string, ref: string) {\n let showRef = ref;\n try {\n const [base] = await runGit('merge-base', 'HEAD', ref);\n showRef = base;\n } catch {\n // silently fall back to using the ref directly if merge base is not available\n }\n\n const { stdout } = await execFile('git', ['show', `${showRef}:${path}`], {\n shell: true,\n cwd: paths.targetRoot,\n maxBuffer: 1024 * 1024 * 50,\n });\n return stdout;\n }\n}\n"],"names":["execFile","paths","assertError","ForwardedError"],"mappings":";;;;;AAsBA,eAAsB,UAAU,IAAA,EAAgB;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMA,aAAA,CAAS,OAAO,IAAA,EAAM;AAAA,MAC7C,KAAA,EAAO,IAAA;AAAA,MACP,KAAKC,UAAA,CAAM;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,YAAY,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAAC,kBAAA,CAAY,KAAK,CAAA;AACjB,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAClD,MAAA,MAAM,MAAA,GAAU,KAAA,CAAM,MAAA,EAA+B,QAAA,CAAS,MAAM,CAAA;AACpE,MAAA,MAAM,MAAM,MAAA,EAAQ,IAAA,EAAK,IAAK,CAAA,eAAA,EAAkB,MAAM,IAAI,CAAA,CAAA;AAC1D,MAAA,MAAM,IAAI,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,IAAIC,qBAAA,CAAe,yBAAA,EAA2B,KAAK,CAAA;AAAA,EAC3D;AACF;AAOO,MAAM,QAAA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,aAAa,iBAAiB,GAAA,EAAa;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,OAAA,GAAU,GAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,MAAA,CAAO,YAAA,EAAc,QAAQ,GAAG,CAAA;AACrD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,EAAQ,eAAe,OAAO,CAAA;AAC3D,IAAA,MAAM,YAAY,MAAM,MAAA;AAAA,MACtB,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,GAAG,SAAS,CAAC,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,aAAA,CAAc,IAAA,EAAc,GAAA,EAAa;AACpD,IAAA,IAAI,OAAA,GAAU,GAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,MAAA,CAAO,YAAA,EAAc,QAAQ,GAAG,CAAA;AACrD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMH,aAAA,CAAS,KAAA,EAAO,CAAC,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,EAAG;AAAA,MACvE,KAAA,EAAO,IAAA;AAAA,MACP,KAAKC,UAAA,CAAM,UAAA;AAAA,MACX,SAAA,EAAW,OAAO,IAAA,GAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;;;"}
1
+ {"version":3,"file":"GitUtils.cjs.js","sources":["../../src/git/GitUtils.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { assertError, ForwardedError } from '@backstage/errors';\nimport { paths } from '../paths';\nimport { runOutput } from '@backstage/cli-common';\n\n/**\n * Run a git command, trimming the output splitting it into lines.\n */\nexport async function runGit(...args: string[]) {\n try {\n const stdout = await runOutput(['git', ...args], {\n cwd: paths.targetRoot,\n });\n return stdout.trim().split(/\\r\\n|\\r|\\n/);\n } catch (error) {\n assertError(error);\n if (\n 'code' in error &&\n typeof (error as { code?: number }).code === 'number'\n ) {\n const code = (error as { code?: number }).code;\n const stderr = (error as { stderr?: string }).stderr;\n const msg = stderr?.trim() ?? `with exit code ${code}`;\n throw new Error(`git ${args[0]} failed, ${msg}`);\n }\n throw new ForwardedError('Unknown execution error', error);\n }\n}\n\n/**\n * Utilities for working with git.\n *\n * @public\n */\nexport class GitUtils {\n /**\n * Returns a sorted list of all files that have changed since the merge base\n * of the provided `ref` and HEAD, as well as all files that are not tracked by git.\n */\n static async listChangedFiles(ref: string) {\n if (!ref) {\n throw new Error('ref is required');\n }\n\n let diffRef = ref;\n try {\n const [base] = await runGit('merge-base', 'HEAD', ref);\n diffRef = base;\n } catch {\n // silently fall back to using the ref directly if merge base is not available\n }\n\n const tracked = await runGit('diff', '--name-only', diffRef);\n const untracked = await runGit(\n 'ls-files',\n '--others',\n '--exclude-standard',\n );\n\n return Array.from(new Set([...tracked, ...untracked]));\n }\n\n /**\n * Returns the contents of a file at a specific ref.\n */\n static async readFileAtRef(path: string, ref: string) {\n let showRef = ref;\n try {\n const [base] = await runGit('merge-base', 'HEAD', ref);\n showRef = base;\n } catch {\n // silently fall back to using the ref directly if merge base is not available\n }\n\n const stdout = await runOutput(['git', 'show', `${showRef}:${path}`], {\n cwd: paths.targetRoot,\n });\n return stdout;\n }\n}\n"],"names":["runOutput","paths","assertError","ForwardedError"],"mappings":";;;;;;AAuBA,eAAsB,UAAU,IAAA,EAAgB;AAC9C,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,MAAMA,mBAAA,CAAU,CAAC,KAAA,EAAO,GAAG,IAAI,CAAA,EAAG;AAAA,MAC/C,KAAKC,WAAA,CAAM;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,YAAY,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAAC,kBAAA,CAAY,KAAK,CAAA;AACjB,IAAA,IACE,MAAA,IAAU,KAAA,IACV,OAAQ,KAAA,CAA4B,SAAS,QAAA,EAC7C;AACA,MAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,MAAA,MAAM,SAAU,KAAA,CAA8B,MAAA;AAC9C,MAAA,MAAM,GAAA,GAAM,MAAA,EAAQ,IAAA,EAAK,IAAK,kBAAkB,IAAI,CAAA,CAAA;AACpD,MAAA,MAAM,IAAI,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,CAAC,CAAC,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,IAAIC,qBAAA,CAAe,yBAAA,EAA2B,KAAK,CAAA;AAAA,EAC3D;AACF;AAOO,MAAM,QAAA,CAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,aAAa,iBAAiB,GAAA,EAAa;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,OAAA,GAAU,GAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,MAAA,CAAO,YAAA,EAAc,QAAQ,GAAG,CAAA;AACrD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,MAAA,EAAQ,eAAe,OAAO,CAAA;AAC3D,IAAA,MAAM,YAAY,MAAM,MAAA;AAAA,MACtB,UAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,OAAA,EAAS,GAAG,SAAS,CAAC,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,aAAA,CAAc,IAAA,EAAc,GAAA,EAAa;AACpD,IAAA,IAAI,OAAA,GAAU,GAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,IAAI,CAAA,GAAI,MAAM,MAAA,CAAO,YAAA,EAAc,QAAQ,GAAG,CAAA;AACrD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,MAAA,GAAS,MAAMH,mBAAA,CAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,EAAG;AAAA,MACpE,KAAKC,WAAA,CAAM;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var path = require('path');
4
4
  var getPackages = require('@manypkg/get-packages');
5
- var util = require('../util.cjs.js');
5
+ var paths = require('../paths.cjs.js');
6
6
  var GitUtils = require('../git/GitUtils.cjs.js');
7
7
  var Lockfile = require('./Lockfile.cjs.js');
8
8
 
@@ -21,7 +21,7 @@ class PackageGraph extends Map {
21
21
  * Lists all local packages in a monorepo.
22
22
  */
23
23
  static async listTargetPackages() {
24
- const { packages } = await getPackages.getPackages(util.paths.targetDir);
24
+ const { packages } = await getPackages.getPackages(paths.paths.targetDir);
25
25
  return packages;
26
26
  }
27
27
  /**
@@ -132,7 +132,7 @@ class PackageGraph extends Map {
132
132
  const dirMap = new Map(
133
133
  Array.from(this.values()).map((pkg) => [
134
134
  // relative from root, convert to posix, and add a / at the end
135
- path__default.default.relative(util.paths.targetRoot, pkg.dir).split(path__default.default.sep).join(path__default.default.posix.sep) + path__default.default.posix.sep,
135
+ path__default.default.relative(paths.paths.targetRoot, pkg.dir).split(path__default.default.sep).join(path__default.default.posix.sep) + path__default.default.posix.sep,
136
136
  pkg
137
137
  ])
138
138
  );
@@ -158,7 +158,7 @@ class PackageGraph extends Map {
158
158
  let otherLockfile;
159
159
  try {
160
160
  thisLockfile = await Lockfile.Lockfile.load(
161
- util.paths.resolveTargetRoot("yarn.lock")
161
+ paths.paths.resolveTargetRoot("yarn.lock")
162
162
  );
163
163
  otherLockfile = Lockfile.Lockfile.parse(
164
164
  await GitUtils.GitUtils.readFileAtRef("yarn.lock", options.ref)
@@ -1 +1 @@
1
- {"version":3,"file":"PackageGraph.cjs.js","sources":["../../src/monorepo/PackageGraph.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 path from 'path';\nimport { getPackages, Package } from '@manypkg/get-packages';\nimport { paths } from '../util';\nimport { PackageRole } from '../roles';\nimport { GitUtils } from '../git';\nimport { Lockfile } from './Lockfile';\nimport { JsonValue } from '@backstage/types';\n\n/**\n * A list of the feature types we want to extract from the project\n * and include in the metadata\n *\n * @public\n */\nexport const packageFeatureType = [\n '@backstage/BackendFeature',\n '@backstage/BackstagePlugin',\n '@backstage/FrontendPlugin',\n '@backstage/FrontendModule',\n] as const;\n\n/**\n * @public\n */\nexport type BackstagePackageFeatureType = (typeof packageFeatureType)[number];\n\n/**\n * Known fields in Backstage package.json files.\n *\n * @public\n */\nexport interface BackstagePackageJson {\n name: string;\n version: string;\n private?: boolean;\n\n main?: string;\n module?: string;\n types?: string;\n\n scripts?: {\n [key: string]: string;\n };\n // The `bundled` field is a field known within Backstage, it means\n // that the package bundles all of its dependencies in its build output.\n bundled?: boolean;\n\n type?: 'module' | 'commonjs';\n\n backstage?: {\n role?: PackageRole;\n moved?: string;\n\n /**\n * If set to `true`, the package will be treated as an internal package\n * where any imports will be inlined into the consuming package.\n *\n * When set to `true`, the top-level `private` field must be set to `true`\n * as well.\n */\n inline?: boolean;\n\n /**\n * The ID of the plugin if this is a plugin package. Must always be set for plugin and module packages, and may be set for library packages. A `null` value means that the package is explicitly not a plugin package.\n */\n pluginId?: string | null;\n\n /**\n * The parent plugin package of a module. Must always and only be set for module packages.\n */\n pluginPackage?: string;\n\n /**\n * All packages that are part of the plugin. Must always and only be set for plugin packages and plugin library packages.\n */\n pluginPackages?: string[];\n\n /**\n * The feature types exported from the package, indexed by path.\n */\n features?: Record<string, BackstagePackageFeatureType>;\n };\n\n exports?: JsonValue;\n typesVersions?: Record<string, Record<string, string[]>>;\n\n files?: string[];\n\n publishConfig?: {\n access?: 'public' | 'restricted';\n directory?: string;\n registry?: string;\n };\n\n repository?:\n | string\n | {\n type: string;\n url: string;\n directory: string;\n };\n\n dependencies?: {\n [key: string]: string;\n };\n peerDependencies?: {\n [key: string]: string;\n };\n devDependencies?: {\n [key: string]: string;\n };\n optionalDependencies?: {\n [key: string]: string;\n };\n}\n\n/**\n * A local Backstage monorepo package\n *\n * @public\n */\nexport type BackstagePackage = {\n dir: string;\n packageJson: BackstagePackageJson;\n};\n\n/**\n * A local package in the monorepo package graph.\n *\n * @public\n */\nexport type PackageGraphNode = {\n /** The name of the package */\n name: string;\n /** The directory of the package */\n dir: string;\n /** The package data of the package itself */\n packageJson: BackstagePackageJson;\n\n /** All direct local dependencies of the package */\n allLocalDependencies: Map<string, PackageGraphNode>;\n /** All direct local dependencies that will be present in the published package */\n publishedLocalDependencies: Map<string, PackageGraphNode>;\n /** Local dependencies */\n localDependencies: Map<string, PackageGraphNode>;\n /** Local devDependencies */\n localDevDependencies: Map<string, PackageGraphNode>;\n /** Local optionalDependencies */\n localOptionalDependencies: Map<string, PackageGraphNode>;\n\n /** All direct incoming local dependencies of the package */\n allLocalDependents: Map<string, PackageGraphNode>;\n /** All direct incoming local dependencies that will be present in the published package */\n publishedLocalDependents: Map<string, PackageGraphNode>;\n /** Incoming local dependencies */\n localDependents: Map<string, PackageGraphNode>;\n /** Incoming local devDependencies */\n localDevDependents: Map<string, PackageGraphNode>;\n /** Incoming local optionalDependencies */\n localOptionalDependents: Map<string, PackageGraphNode>;\n};\n\n/**\n * Represents a local Backstage monorepo package graph.\n *\n * @public\n */\nexport class PackageGraph extends Map<string, PackageGraphNode> {\n /**\n * Lists all local packages in a monorepo.\n */\n static async listTargetPackages(): Promise<BackstagePackage[]> {\n const { packages } = await getPackages(paths.targetDir);\n\n return packages as BackstagePackage[];\n }\n\n /**\n * Creates a package graph from a list of local packages.\n */\n static fromPackages(packages: Package[]): PackageGraph {\n const graph = new PackageGraph();\n\n // Add all local packages to the graph\n for (const pkg of packages) {\n const name = pkg.packageJson.name;\n const existingPkg = graph.get(name);\n if (existingPkg) {\n throw new Error(\n `Duplicate package name '${name}' at ${pkg.dir} and ${existingPkg.dir}`,\n );\n }\n\n graph.set(name, {\n name,\n dir: pkg.dir,\n packageJson: pkg.packageJson as BackstagePackageJson,\n\n allLocalDependencies: new Map(),\n publishedLocalDependencies: new Map(),\n localDependencies: new Map(),\n localDevDependencies: new Map(),\n localOptionalDependencies: new Map(),\n\n allLocalDependents: new Map(),\n publishedLocalDependents: new Map(),\n localDependents: new Map(),\n localDevDependents: new Map(),\n localOptionalDependents: new Map(),\n });\n }\n\n // Populate the local dependency structure\n for (const node of graph.values()) {\n for (const depName of Object.keys(node.packageJson.dependencies || {})) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.publishedLocalDependencies.set(depName, depPkg);\n node.localDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.publishedLocalDependents.set(node.name, node);\n depPkg.localDependents.set(node.name, node);\n }\n }\n for (const depName of Object.keys(\n node.packageJson.devDependencies || {},\n )) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.localDevDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.localDevDependents.set(node.name, node);\n }\n }\n for (const depName of Object.keys(\n node.packageJson.optionalDependencies || {},\n )) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.publishedLocalDependencies.set(depName, depPkg);\n node.localOptionalDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.publishedLocalDependents.set(node.name, node);\n depPkg.localOptionalDependents.set(node.name, node);\n }\n }\n }\n\n return graph;\n }\n\n /**\n * Traverses the package graph and collects a set of package names.\n *\n * The traversal starts at the provided list names, and continues\n * throughout all the names returned by the `collectFn`, which is\n * called once for each seen package.\n */\n collectPackageNames(\n startingPackageNames: string[],\n collectFn: (pkg: PackageGraphNode) => Iterable<string> | undefined,\n ): Set<string> {\n const targets = new Set<string>();\n const searchNames = startingPackageNames.slice();\n\n while (searchNames.length) {\n const name = searchNames.pop()!;\n\n if (targets.has(name)) {\n continue;\n }\n\n const node = this.get(name);\n if (!node) {\n throw new Error(`Package '${name}' not found`);\n }\n\n targets.add(name);\n\n const collected = collectFn(node);\n if (collected) {\n searchNames.push(...collected);\n }\n }\n\n return targets;\n }\n\n /**\n * Lists all packages that have changed since a given git ref.\n *\n * @remarks\n *\n * If the `analyzeLockfile` option is set to true, the change detection will\n * also consider changes to the dependency management lockfile.\n */\n async listChangedPackages(options: {\n ref: string;\n analyzeLockfile?: boolean;\n }) {\n const changedFiles = await GitUtils.listChangedFiles(options.ref);\n\n const dirMap = new Map(\n Array.from(this.values()).map(pkg => [\n // relative from root, convert to posix, and add a / at the end\n path\n .relative(paths.targetRoot, pkg.dir)\n .split(path.sep)\n .join(path.posix.sep) + path.posix.sep,\n pkg,\n ]),\n );\n const packageDirs = Array.from(dirMap.keys());\n\n const result = new Array<PackageGraphNode>();\n let searchIndex = 0;\n\n changedFiles.sort();\n packageDirs.sort();\n\n for (const packageDir of packageDirs) {\n // Skip through changes that appear before our package dir\n while (\n searchIndex < changedFiles.length &&\n changedFiles[searchIndex] < packageDir\n ) {\n searchIndex += 1;\n }\n\n // Check if we arrived at a match, otherwise we move on to the next package dir\n if (changedFiles[searchIndex]?.startsWith(packageDir)) {\n searchIndex += 1;\n\n result.push(dirMap.get(packageDir)!);\n\n // Skip through the rest of the changed files for the same package\n while (changedFiles[searchIndex]?.startsWith(packageDir)) {\n searchIndex += 1;\n }\n }\n }\n\n if (changedFiles.includes('yarn.lock') && options.analyzeLockfile) {\n // Load the lockfile in the working tree and the one at the ref and diff them\n let thisLockfile: Lockfile;\n let otherLockfile: Lockfile;\n try {\n thisLockfile = await Lockfile.load(\n paths.resolveTargetRoot('yarn.lock'),\n );\n otherLockfile = Lockfile.parse(\n await GitUtils.readFileAtRef('yarn.lock', options.ref),\n );\n } catch (error) {\n console.warn(\n `Failed to read lockfiles, assuming all packages have changed, ${error}`,\n );\n return Array.from(this.values());\n }\n const diff = thisLockfile.diff(otherLockfile);\n\n // Create a simplified dependency graph only keeps track of package names\n const graph = thisLockfile.createSimplifiedDependencyGraph();\n\n // Merge the dependency graph from the other lockfile into this one in\n // order to be able to detect removals accurately.\n {\n const otherGraph = thisLockfile.createSimplifiedDependencyGraph();\n for (const [name, dependencies] of otherGraph) {\n const node = graph.get(name);\n if (node) {\n dependencies.forEach(d => node.add(d));\n } else {\n graph.set(name, dependencies);\n }\n }\n }\n\n // The check is simplified by only considering the package names rather\n // than the exact version range queries that were changed.\n // TODO(Rugvip): Use a more exact check\n const changedPackages = new Set(\n [...diff.added, ...diff.changed, ...diff.removed].map(e => e.name),\n );\n\n // Starting with our set of changed packages from the diff, we loop through\n // the full graph and add any package that has a dependency on a changed package.\n // We keep looping until all transitive dependencies have been detected.\n let changed = false;\n do {\n changed = false;\n for (const [name, dependencies] of graph) {\n if (changedPackages.has(name)) {\n continue;\n }\n for (const dep of dependencies) {\n if (changedPackages.has(dep)) {\n changed = true;\n changedPackages.add(name);\n break;\n }\n }\n }\n } while (changed);\n\n // Add all local packages that had a transitive dependency change to the result set\n for (const node of this.values()) {\n if (changedPackages.has(node.name) && !result.includes(node)) {\n result.push(node);\n }\n }\n }\n\n return result;\n }\n}\n"],"names":["getPackages","paths","GitUtils","path","Lockfile"],"mappings":"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"}
1
+ {"version":3,"file":"PackageGraph.cjs.js","sources":["../../src/monorepo/PackageGraph.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 path from 'path';\nimport { getPackages, Package } from '@manypkg/get-packages';\nimport { paths } from '../paths';\nimport { PackageRole } from '../roles';\nimport { GitUtils } from '../git';\nimport { Lockfile } from './Lockfile';\nimport { JsonValue } from '@backstage/types';\n\n/**\n * A list of the feature types we want to extract from the project\n * and include in the metadata\n *\n * @public\n */\nexport const packageFeatureType = [\n '@backstage/BackendFeature',\n '@backstage/BackstagePlugin',\n '@backstage/FrontendPlugin',\n '@backstage/FrontendModule',\n] as const;\n\n/**\n * @public\n */\nexport type BackstagePackageFeatureType = (typeof packageFeatureType)[number];\n\n/**\n * Known fields in Backstage package.json files.\n *\n * @public\n */\nexport interface BackstagePackageJson {\n name: string;\n version: string;\n private?: boolean;\n\n main?: string;\n module?: string;\n types?: string;\n\n scripts?: {\n [key: string]: string;\n };\n // The `bundled` field is a field known within Backstage, it means\n // that the package bundles all of its dependencies in its build output.\n bundled?: boolean;\n\n type?: 'module' | 'commonjs';\n\n backstage?: {\n role?: PackageRole;\n moved?: string;\n\n /**\n * If set to `true`, the package will be treated as an internal package\n * where any imports will be inlined into the consuming package.\n *\n * When set to `true`, the top-level `private` field must be set to `true`\n * as well.\n */\n inline?: boolean;\n\n /**\n * The ID of the plugin if this is a plugin package. Must always be set for plugin and module packages, and may be set for library packages. A `null` value means that the package is explicitly not a plugin package.\n */\n pluginId?: string | null;\n\n /**\n * The parent plugin package of a module. Must always and only be set for module packages.\n */\n pluginPackage?: string;\n\n /**\n * All packages that are part of the plugin. Must always and only be set for plugin packages and plugin library packages.\n */\n pluginPackages?: string[];\n\n /**\n * The feature types exported from the package, indexed by path.\n */\n features?: Record<string, BackstagePackageFeatureType>;\n };\n\n exports?: JsonValue;\n typesVersions?: Record<string, Record<string, string[]>>;\n\n files?: string[];\n\n publishConfig?: {\n access?: 'public' | 'restricted';\n directory?: string;\n registry?: string;\n };\n\n repository?:\n | string\n | {\n type: string;\n url: string;\n directory: string;\n };\n\n dependencies?: {\n [key: string]: string;\n };\n peerDependencies?: {\n [key: string]: string;\n };\n devDependencies?: {\n [key: string]: string;\n };\n optionalDependencies?: {\n [key: string]: string;\n };\n}\n\n/**\n * A local Backstage monorepo package\n *\n * @public\n */\nexport type BackstagePackage = {\n dir: string;\n packageJson: BackstagePackageJson;\n};\n\n/**\n * A local package in the monorepo package graph.\n *\n * @public\n */\nexport type PackageGraphNode = {\n /** The name of the package */\n name: string;\n /** The directory of the package */\n dir: string;\n /** The package data of the package itself */\n packageJson: BackstagePackageJson;\n\n /** All direct local dependencies of the package */\n allLocalDependencies: Map<string, PackageGraphNode>;\n /** All direct local dependencies that will be present in the published package */\n publishedLocalDependencies: Map<string, PackageGraphNode>;\n /** Local dependencies */\n localDependencies: Map<string, PackageGraphNode>;\n /** Local devDependencies */\n localDevDependencies: Map<string, PackageGraphNode>;\n /** Local optionalDependencies */\n localOptionalDependencies: Map<string, PackageGraphNode>;\n\n /** All direct incoming local dependencies of the package */\n allLocalDependents: Map<string, PackageGraphNode>;\n /** All direct incoming local dependencies that will be present in the published package */\n publishedLocalDependents: Map<string, PackageGraphNode>;\n /** Incoming local dependencies */\n localDependents: Map<string, PackageGraphNode>;\n /** Incoming local devDependencies */\n localDevDependents: Map<string, PackageGraphNode>;\n /** Incoming local optionalDependencies */\n localOptionalDependents: Map<string, PackageGraphNode>;\n};\n\n/**\n * Represents a local Backstage monorepo package graph.\n *\n * @public\n */\nexport class PackageGraph extends Map<string, PackageGraphNode> {\n /**\n * Lists all local packages in a monorepo.\n */\n static async listTargetPackages(): Promise<BackstagePackage[]> {\n const { packages } = await getPackages(paths.targetDir);\n\n return packages as BackstagePackage[];\n }\n\n /**\n * Creates a package graph from a list of local packages.\n */\n static fromPackages(packages: Package[]): PackageGraph {\n const graph = new PackageGraph();\n\n // Add all local packages to the graph\n for (const pkg of packages) {\n const name = pkg.packageJson.name;\n const existingPkg = graph.get(name);\n if (existingPkg) {\n throw new Error(\n `Duplicate package name '${name}' at ${pkg.dir} and ${existingPkg.dir}`,\n );\n }\n\n graph.set(name, {\n name,\n dir: pkg.dir,\n packageJson: pkg.packageJson as BackstagePackageJson,\n\n allLocalDependencies: new Map(),\n publishedLocalDependencies: new Map(),\n localDependencies: new Map(),\n localDevDependencies: new Map(),\n localOptionalDependencies: new Map(),\n\n allLocalDependents: new Map(),\n publishedLocalDependents: new Map(),\n localDependents: new Map(),\n localDevDependents: new Map(),\n localOptionalDependents: new Map(),\n });\n }\n\n // Populate the local dependency structure\n for (const node of graph.values()) {\n for (const depName of Object.keys(node.packageJson.dependencies || {})) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.publishedLocalDependencies.set(depName, depPkg);\n node.localDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.publishedLocalDependents.set(node.name, node);\n depPkg.localDependents.set(node.name, node);\n }\n }\n for (const depName of Object.keys(\n node.packageJson.devDependencies || {},\n )) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.localDevDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.localDevDependents.set(node.name, node);\n }\n }\n for (const depName of Object.keys(\n node.packageJson.optionalDependencies || {},\n )) {\n const depPkg = graph.get(depName);\n if (depPkg) {\n node.allLocalDependencies.set(depName, depPkg);\n node.publishedLocalDependencies.set(depName, depPkg);\n node.localOptionalDependencies.set(depName, depPkg);\n\n depPkg.allLocalDependents.set(node.name, node);\n depPkg.publishedLocalDependents.set(node.name, node);\n depPkg.localOptionalDependents.set(node.name, node);\n }\n }\n }\n\n return graph;\n }\n\n /**\n * Traverses the package graph and collects a set of package names.\n *\n * The traversal starts at the provided list names, and continues\n * throughout all the names returned by the `collectFn`, which is\n * called once for each seen package.\n */\n collectPackageNames(\n startingPackageNames: string[],\n collectFn: (pkg: PackageGraphNode) => Iterable<string> | undefined,\n ): Set<string> {\n const targets = new Set<string>();\n const searchNames = startingPackageNames.slice();\n\n while (searchNames.length) {\n const name = searchNames.pop()!;\n\n if (targets.has(name)) {\n continue;\n }\n\n const node = this.get(name);\n if (!node) {\n throw new Error(`Package '${name}' not found`);\n }\n\n targets.add(name);\n\n const collected = collectFn(node);\n if (collected) {\n searchNames.push(...collected);\n }\n }\n\n return targets;\n }\n\n /**\n * Lists all packages that have changed since a given git ref.\n *\n * @remarks\n *\n * If the `analyzeLockfile` option is set to true, the change detection will\n * also consider changes to the dependency management lockfile.\n */\n async listChangedPackages(options: {\n ref: string;\n analyzeLockfile?: boolean;\n }) {\n const changedFiles = await GitUtils.listChangedFiles(options.ref);\n\n const dirMap = new Map(\n Array.from(this.values()).map(pkg => [\n // relative from root, convert to posix, and add a / at the end\n path\n .relative(paths.targetRoot, pkg.dir)\n .split(path.sep)\n .join(path.posix.sep) + path.posix.sep,\n pkg,\n ]),\n );\n const packageDirs = Array.from(dirMap.keys());\n\n const result = new Array<PackageGraphNode>();\n let searchIndex = 0;\n\n changedFiles.sort();\n packageDirs.sort();\n\n for (const packageDir of packageDirs) {\n // Skip through changes that appear before our package dir\n while (\n searchIndex < changedFiles.length &&\n changedFiles[searchIndex] < packageDir\n ) {\n searchIndex += 1;\n }\n\n // Check if we arrived at a match, otherwise we move on to the next package dir\n if (changedFiles[searchIndex]?.startsWith(packageDir)) {\n searchIndex += 1;\n\n result.push(dirMap.get(packageDir)!);\n\n // Skip through the rest of the changed files for the same package\n while (changedFiles[searchIndex]?.startsWith(packageDir)) {\n searchIndex += 1;\n }\n }\n }\n\n if (changedFiles.includes('yarn.lock') && options.analyzeLockfile) {\n // Load the lockfile in the working tree and the one at the ref and diff them\n let thisLockfile: Lockfile;\n let otherLockfile: Lockfile;\n try {\n thisLockfile = await Lockfile.load(\n paths.resolveTargetRoot('yarn.lock'),\n );\n otherLockfile = Lockfile.parse(\n await GitUtils.readFileAtRef('yarn.lock', options.ref),\n );\n } catch (error) {\n console.warn(\n `Failed to read lockfiles, assuming all packages have changed, ${error}`,\n );\n return Array.from(this.values());\n }\n const diff = thisLockfile.diff(otherLockfile);\n\n // Create a simplified dependency graph only keeps track of package names\n const graph = thisLockfile.createSimplifiedDependencyGraph();\n\n // Merge the dependency graph from the other lockfile into this one in\n // order to be able to detect removals accurately.\n {\n const otherGraph = thisLockfile.createSimplifiedDependencyGraph();\n for (const [name, dependencies] of otherGraph) {\n const node = graph.get(name);\n if (node) {\n dependencies.forEach(d => node.add(d));\n } else {\n graph.set(name, dependencies);\n }\n }\n }\n\n // The check is simplified by only considering the package names rather\n // than the exact version range queries that were changed.\n // TODO(Rugvip): Use a more exact check\n const changedPackages = new Set(\n [...diff.added, ...diff.changed, ...diff.removed].map(e => e.name),\n );\n\n // Starting with our set of changed packages from the diff, we loop through\n // the full graph and add any package that has a dependency on a changed package.\n // We keep looping until all transitive dependencies have been detected.\n let changed = false;\n do {\n changed = false;\n for (const [name, dependencies] of graph) {\n if (changedPackages.has(name)) {\n continue;\n }\n for (const dep of dependencies) {\n if (changedPackages.has(dep)) {\n changed = true;\n changedPackages.add(name);\n break;\n }\n }\n }\n } while (changed);\n\n // Add all local packages that had a transitive dependency change to the result set\n for (const node of this.values()) {\n if (changedPackages.has(node.name) && !result.includes(node)) {\n result.push(node);\n }\n }\n }\n\n return result;\n }\n}\n"],"names":["getPackages","paths","GitUtils","path","Lockfile"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var util = require('../util.cjs.js');
3
+ var paths = require('../paths.cjs.js');
4
4
  var fs = require('fs-extra');
5
5
 
6
6
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -8,7 +8,7 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
8
8
  var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
9
9
 
10
10
  async function isMonoRepo() {
11
- const rootPackageJsonPath = util.paths.resolveTargetRoot("package.json");
11
+ const rootPackageJsonPath = paths.paths.resolveTargetRoot("package.json");
12
12
  try {
13
13
  const pkg = await fs__default.default.readJson(rootPackageJsonPath);
14
14
  return Boolean(pkg?.workspaces?.packages);
@@ -1 +1 @@
1
- {"version":3,"file":"isMonoRepo.cjs.js","sources":["../../src/monorepo/isMonoRepo.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { paths } from '../util';\nimport fs from 'fs-extra';\n\n/**\n * Returns try if the current project is a monorepo.\n *\n * @public\n */\nexport async function isMonoRepo(): Promise<boolean> {\n const rootPackageJsonPath = paths.resolveTargetRoot('package.json');\n try {\n const pkg = await fs.readJson(rootPackageJsonPath);\n return Boolean(pkg?.workspaces?.packages);\n } catch (error) {\n return false;\n }\n}\n"],"names":["paths","fs"],"mappings":";;;;;;;;;AAwBA,eAAsB,UAAA,GAA+B;AACnD,EAAA,MAAM,mBAAA,GAAsBA,UAAA,CAAM,iBAAA,CAAkB,cAAc,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,mBAAA,CAAG,QAAA,CAAS,mBAAmB,CAAA;AACjD,IAAA,OAAO,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}
1
+ {"version":3,"file":"isMonoRepo.cjs.js","sources":["../../src/monorepo/isMonoRepo.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { paths } from '../paths';\nimport fs from 'fs-extra';\n\n/**\n * Returns try if the current project is a monorepo.\n *\n * @public\n */\nexport async function isMonoRepo(): Promise<boolean> {\n const rootPackageJsonPath = paths.resolveTargetRoot('package.json');\n try {\n const pkg = await fs.readJson(rootPackageJsonPath);\n return Boolean(pkg?.workspaces?.packages);\n } catch (error) {\n return false;\n }\n}\n"],"names":["paths","fs"],"mappings":";;;;;;;;;AAwBA,eAAsB,UAAA,GAA+B;AACnD,EAAA,MAAM,mBAAA,GAAsBA,WAAA,CAAM,iBAAA,CAAkB,cAAc,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,mBAAA,CAAG,QAAA,CAAS,mBAAmB,CAAA;AACjD,IAAA,OAAO,OAAA,CAAQ,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ var cliCommon = require('@backstage/cli-common');
4
+
5
+ const paths = cliCommon.findPaths(__dirname);
6
+
7
+ exports.paths = paths;
8
+ //# sourceMappingURL=paths.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.cjs.js","sources":["../src/paths.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 { findPaths } from '@backstage/cli-common';\n\n/* eslint-disable-next-line no-restricted-syntax */\nexport const paths = findPaths(__dirname);\n"],"names":["findPaths"],"mappings":";;;;AAmBO,MAAM,KAAA,GAAQA,oBAAU,SAAS;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/cli-node",
3
- "version": "0.2.15",
3
+ "version": "0.2.16-next.1",
4
4
  "description": "Node.js library for Backstage CLIs",
5
5
  "backstage": {
6
6
  "role": "node-library"
@@ -31,9 +31,9 @@
31
31
  "test": "backstage-cli package test"
32
32
  },
33
33
  "dependencies": {
34
- "@backstage/cli-common": "^0.1.15",
35
- "@backstage/errors": "^1.2.7",
36
- "@backstage/types": "^1.2.2",
34
+ "@backstage/cli-common": "0.1.16-next.1",
35
+ "@backstage/errors": "1.2.7",
36
+ "@backstage/types": "1.2.2",
37
37
  "@manypkg/get-packages": "^1.1.3",
38
38
  "@yarnpkg/parsers": "^3.0.0",
39
39
  "fs-extra": "^11.2.0",
@@ -41,9 +41,9 @@
41
41
  "zod": "^3.22.4"
42
42
  },
43
43
  "devDependencies": {
44
- "@backstage/backend-test-utils": "^1.10.0",
45
- "@backstage/cli": "^0.34.5",
46
- "@backstage/test-utils": "^1.7.13"
44
+ "@backstage/backend-test-utils": "1.10.1-next.0",
45
+ "@backstage/cli": "0.34.6-next.1",
46
+ "@backstage/test-utils": "1.7.14-next.0"
47
47
  },
48
48
  "typesVersions": {
49
49
  "*": {
package/dist/util.cjs.js DELETED
@@ -1,13 +0,0 @@
1
- 'use strict';
2
-
3
- var child_process = require('child_process');
4
- var util = require('util');
5
- var cliCommon = require('@backstage/cli-common');
6
- require('@backstage/errors');
7
-
8
- const execFile = util.promisify(child_process.execFile);
9
- const paths = cliCommon.findPaths(__dirname);
10
-
11
- exports.execFile = execFile;
12
- exports.paths = paths;
13
- //# sourceMappingURL=util.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.cjs.js","sources":["../src/util.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 {\n ChildProcess,\n execFile as execFileCb,\n spawn,\n SpawnOptions,\n} from 'child_process';\nimport { promisify } from 'util';\nimport { findPaths } from '@backstage/cli-common';\nimport { ExitCodeError } from './errors';\n\nexport const execFile = promisify(execFileCb);\n\n/* eslint-disable-next-line no-restricted-syntax */\nexport const paths = findPaths(__dirname);\n\n/**\n * A function that can be used to log data from a child process\n *\n * @public\n */\nexport type LogFunc = (data: Buffer) => void;\n\n/**\n * Options for running a child process\n *\n * @public\n */\nexport type SpawnOptionsPartialEnv = Omit<SpawnOptions, 'env'> & {\n env?: Partial<NodeJS.ProcessEnv>;\n // Pipe stdout to this log function\n stdoutLogFunc?: LogFunc;\n // Pipe stderr to this log function\n stderrLogFunc?: LogFunc;\n};\n\n// Runs a child command, returning a promise that is only resolved if the child exits with code 0.\nexport async function run(\n name: string,\n args: string[] = [],\n options: SpawnOptionsPartialEnv = {},\n) {\n const { stdoutLogFunc, stderrLogFunc } = options;\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n FORCE_COLOR: 'true',\n ...(options.env ?? {}),\n };\n\n const stdio = [\n 'inherit',\n stdoutLogFunc ? 'pipe' : 'inherit',\n stderrLogFunc ? 'pipe' : 'inherit',\n ] as ('inherit' | 'pipe')[];\n\n const child = spawn(name, args, {\n stdio,\n shell: true,\n ...options,\n env,\n });\n\n if (stdoutLogFunc && child.stdout) {\n child.stdout.on('data', stdoutLogFunc);\n }\n if (stderrLogFunc && child.stderr) {\n child.stderr.on('data', stderrLogFunc);\n }\n\n await waitForExit(child, name);\n}\n\nasync function waitForExit(\n child: ChildProcess & { exitCode: number | null },\n name?: string,\n): Promise<void> {\n if (typeof child.exitCode === 'number') {\n if (child.exitCode) {\n throw new ExitCodeError(child.exitCode, name);\n }\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n child.once('error', error => reject(error));\n child.once('exit', code => {\n if (code) {\n reject(new ExitCodeError(code, name));\n } else {\n resolve();\n }\n });\n });\n}\n"],"names":["promisify","execFileCb","findPaths"],"mappings":";;;;;;;AA0BO,MAAM,QAAA,GAAWA,eAAUC,sBAAU;AAGrC,MAAM,KAAA,GAAQC,oBAAU,SAAS;;;;;"}