Give each CLI module its own paths instead of importing from lib/

Each module file that needs paths now calls findPaths(__dirname) directly from
@backstage/cli-common. This removes the coupling between modules and lib/paths,
and will continue to work when modules are extracted into separate packages since
each package's __dirname resolves to its own root.

Added hierarchical caching to findOwnDir in cli-common so that the filesystem
walk only happens once per package - subsequent calls from sibling directories
hit the cache at a common ancestor.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Patrik Oldsberg
2026-02-21 12:43:29 +01:00
parent 158bfe8a69
commit 56bd494b0c
52 changed files with 219 additions and 237 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/cli-common': patch
---
Added hierarchical caching to `findOwnDir`, avoiding redundant filesystem walks when `findPaths` is called from multiple locations within the same package.
+42 -6
View File
@@ -84,15 +84,45 @@ export function findRootPath(
);
}
// Hierarchical cache for ownDir lookups. When we resolve a searchDir to its
// package root, we also cache every intermediate directory along the way. This
// means sibling directories only need to walk up until they hit a cached ancestor.
const ownDirCache = new Map<string, string>();
// Finds the root of a given package
export function findOwnDir(searchDir: string) {
const path = findRootPath(searchDir, () => true);
if (!path) {
throw new Error(
`No package.json found while searching for package root of ${searchDir}`,
);
const visited: string[] = [];
let dir = searchDir;
for (let i = 0; i < 1000; i++) {
const cached = ownDirCache.get(dir);
if (cached !== undefined) {
for (const d of visited) {
ownDirCache.set(d, cached);
}
return cached;
}
visited.push(dir);
const packagePath = resolvePath(dir, 'package.json');
if (fs.existsSync(packagePath)) {
for (const d of visited) {
ownDirCache.set(d, dir);
}
return dir;
}
const newDir = dirname(dir);
if (newDir === dir) {
break;
}
dir = newDir;
}
return path;
throw new Error(
`No package.json found while searching for package root of ${searchDir}`,
);
}
// Finds the root of the monorepo that the package exists in. Only accessible when running inside Backstage repo.
@@ -110,6 +140,12 @@ export function findOwnRootDir(ownDir: string) {
/**
* Find paths related to a package and its execution context.
*
* This function is cheap to call repeatedly. The package root lookup is cached
* hierarchically, so calls from different subdirectories within the same package
* only walk the filesystem once. Prefer calling this eagerly at module scope
* rather than sharing a single instance across modules — this keeps modules
* independent and works correctly when they are split into separate packages.
*
* @public
* @example
*
@@ -23,7 +23,10 @@ import {
PackageGraph,
PackageRoles,
} from '@backstage/cli-node';
import { paths } from '../../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { buildFrontend } from '../../../lib/buildFrontend';
import { buildBackend } from '../../../lib/buildBackend';
import { isValidUrl } from '../../../lib/urls';
@@ -18,7 +18,10 @@ import { OptionValues } from 'commander';
import { startPackage } from './startPackage';
import { resolveLinkedWorkspace } from './resolveLinkedWorkspace';
import { findRoleFromCommand } from '../../../lib/role';
import { paths } from '../../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export async function command(opts: OptionValues): Promise<void> {
await startPackage({
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import { resolve as resolvePath } from 'node:path';
import { paths } from '../../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { runBackend } from '../../../lib/runner';
interface StartBackendOptions {
@@ -20,7 +20,10 @@ import {
getModuleFederationRemoteOptions,
serveBundle,
} from '../../../../build/lib/bundler';
import { paths } from '../../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { BackstagePackageJson } from '@backstage/cli-node';
import { hasReactDomClient } from '../../../../build/lib/bundler/hasReactDomClient';
@@ -18,7 +18,10 @@ import chalk from 'chalk';
import { Command, OptionValues } from 'commander';
import { relative as relativePath } from 'node:path';
import { buildPackages, getOutputsForRole } from '../../lib/builder';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import {
BackstagePackage,
PackageGraph,
@@ -17,7 +17,10 @@
import { PackageGraph } from '@backstage/cli-node';
import { findTargetPackages } from './start';
import { posix } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
const mocks = {
app: {
@@ -20,7 +20,10 @@ import {
PackageRole,
} from '@backstage/cli-node';
import { relative as relativePath } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { resolveLinkedWorkspace } from '../package/start/resolveLinkedWorkspace';
import { startPackage } from '../package/start/startPackage';
import { parseArgs } from 'node:util';
@@ -39,7 +39,10 @@ import {
import { forwardFileImports, cssEntryPoints } from './plugins';
import { BuildOptions, Output } from './types';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { BackstagePackageJson } from '@backstage/cli-node';
import { readEntryPoints } from '../entryPoints';
@@ -18,7 +18,10 @@ import fs from 'fs-extra';
import { rollup, RollupOptions } from 'rollup';
import chalk from 'chalk';
import { relative as relativePath, resolve as resolvePath } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { makeRollupConfigs } from './config';
import { BuildOptions, Output } from './types';
import { PackageRoles, runConcurrentTasks } from '@backstage/cli-node';
@@ -25,11 +25,14 @@ import { TsCheckerRspackPlugin } from 'ts-checker-rspack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import ModuleScopePlugin from 'react-dev-utils/ModuleScopePlugin';
import { ModuleFederationPlugin } from '@module-federation/enhanced/rspack';
import { paths as cliPaths } from '../../paths';
import fs from 'fs-extra';
import { optimization as optimizationConfig } from './optimization';
import pickBy from 'lodash/pickBy';
import { runOutput } from '@backstage/cli-common';
import { runOutput, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const cliPaths = findPaths(__dirname);
import { transforms } from './transforms';
import { version } from '../../../../lib/version';
import yn from 'yn';
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export function hasReactDomClient() {
try {
@@ -17,7 +17,10 @@
import { relative as relativePath } from 'node:path';
import { getPackages } from '@manypkg/get-packages';
import { rspack } from '@rspack/core';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
/**
* This returns of collection of plugins that links a separate workspace into
@@ -20,7 +20,10 @@ import chokidar from 'chokidar';
import fs from 'fs-extra';
import PQueue from 'p-queue';
import { dirname, join as joinPath, resolve as resolvePath } from 'node:path';
import { paths as cliPaths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const cliPaths = findPaths(__dirname);
const DETECTED_MODULES_MODULE_NAME = '__backstage-autodetected-plugins__';
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import { resolve as resolvePath } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export type BundlingPathsOptions = {
// bundle entrypoint, e.g. 'src/index'
@@ -22,7 +22,10 @@ import openBrowser from 'react-dev-utils/openBrowser';
import { rspack } from '@rspack/core';
import { RspackDevServer } from '@rspack/dev-server';
import { paths as libPaths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const libPaths = findPaths(__dirname);
import { loadCliConfig } from '../../../config/lib/config';
import { createConfig, resolveBaseUrl, resolveEndpoint } from './config';
import { createDetectedModulesEntryPoint } from './packageDetection';
@@ -24,8 +24,11 @@ import {
import { tmpdir } from 'node:os';
import * as tar from 'tar';
import partition from 'lodash/partition';
import { paths } from '../../paths';
import { run } from '@backstage/cli-common';
import { run, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import {
dependencies as cliDependencies,
devDependencies as cliDevDependencies,
@@ -20,12 +20,13 @@ import { findRoleFromCommand } from './role';
const mockDir = createMockDirectory();
jest.mock('../paths', () => ({
paths: {
jest.mock('@backstage/cli-common', () => ({
...jest.requireActual('@backstage/cli-common'),
findPaths: () => ({
resolveTarget(filename: string) {
return mockDir.resolve(filename);
},
},
}),
}));
describe('findRoleFromCommand', () => {
+4 -1
View File
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import { OptionValues } from 'commander';
import { paths } from '../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { PackageRoles, PackageRole } from '@backstage/cli-node';
export async function findRoleFromCommand(
@@ -21,7 +21,10 @@ import { IpcServer, ServerDataStore } from '../ipc';
import debounce from 'lodash/debounce';
import { fileURLToPath } from 'node:url';
import { isAbsolute as isAbsolutePath } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import spawn from 'cross-spawn';
const loaderArgs = [
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -16,7 +16,10 @@
import { ConfigSources, loadConfigSchema } from '@backstage/config-loader';
import { AppConfig, ConfigReader } from '@backstage/config';
import { paths } from '../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { getPackages } from '@manypkg/get-packages';
import { PackageGraph } from '@backstage/cli-node';
import { resolve as resolvePath } from 'node:path';
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -18,7 +18,10 @@ import fs from 'fs-extra';
import chalk from 'chalk';
import { stringify as stringifyYaml } from 'yaml';
import inquirer, { Question, Answers } from 'inquirer';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { GithubCreateAppServer } from './GithubCreateAppServer';
import openBrowser from 'react-dev-utils/openBrowser';
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -16,8 +16,11 @@
import { version as cliVersion } from '../../../../package.json';
import os from 'node:os';
import { runOutput } from '@backstage/cli-common';
import { paths } from '../paths';
import { runOutput, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { Lockfile } from '../../../lib/versioning';
import { BackstagePackageJson, PackageGraph } from '@backstage/cli-node';
import { minimatch } from 'minimatch';
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import { OptionValues } from 'commander';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { ESLint } from 'eslint';
export default async (directories: string[], opts: OptionValues) => {
@@ -25,7 +25,10 @@ import {
Lockfile,
runWorkerQueueThreads,
} from '@backstage/cli-node';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { createScriptOptionsParser } from '../../../../lib/optionsParser';
import { SuccessCache } from '../../../../lib/cache/SuccessCache';
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -15,7 +15,10 @@
*/
import fs from 'fs-extra';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export default async function clean() {
await fs.remove(paths.resolveTarget('dist'));
@@ -18,7 +18,10 @@ import {
productionPack,
revertProductionPack,
} from '../../../../modules/build/lib/packager/productionPack';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import fs from 'fs-extra';
import { publishPreflightCheck } from '../../lib/publishing';
import { createTypeDistProject } from '../../../../lib/typeDistProject';
@@ -17,8 +17,11 @@
import fs from 'fs-extra';
import { resolve as resolvePath } from 'node:path';
import { PackageGraph } from '@backstage/cli-node';
import { paths } from '../../paths';
import { run } from '@backstage/cli-common';
import { run, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export async function command(): Promise<void> {
const packages = await PackageGraph.listTargetPackages();
@@ -29,7 +29,10 @@ import {
relative as relativePath,
extname,
} from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { publishPreflightCheck } from '../../lib/publishing';
const SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx', '.json'];
@@ -19,7 +19,10 @@ import { ESLint } from 'eslint';
import { OptionValues } from 'commander';
import { relative as relativePath } from 'node:path';
import { PackageGraph } from '@backstage/cli-node';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export async function command(opts: OptionValues) {
const packages = await PackageGraph.listTargetPackages();
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -18,7 +18,10 @@ import fs from 'fs-extra';
import { resolve as resolvePath } from 'node:path';
import { getPackages } from '@manypkg/get-packages';
import { PackageRoles } from '@backstage/cli-node';
import { paths } from '../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export default async () => {
const { packages } = await getPackages(paths.targetDir);
@@ -13,7 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { BACKSTAGE_JSON, bootstrapEnvProxyAgents } from '@backstage/cli-common';
import { BACKSTAGE_JSON, bootstrapEnvProxyAgents, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
bootstrapEnvProxyAgents();
@@ -25,7 +28,7 @@ import semver from 'semver';
import { OptionValues } from 'commander';
import { isError, NotFoundError } from '@backstage/errors';
import { resolve as resolvePath } from 'node:path';
import { paths } from '../../paths';
import { getHasYarnPlugin } from '../../../../lib/yarnPlugin';
import {
fetchPackageInfo,
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import path from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
const TEAM_ID_RE = /^@[-\w]+\/[-\w]+$/;
const USER_ID_RE = /^@[-\w]+$/;
@@ -25,7 +25,10 @@ import upperCase from 'lodash/upperCase';
import upperFirst from 'lodash/upperFirst';
import lowerFirst from 'lodash/lowerFirst';
import { Lockfile } from '../../../../lib/versioning';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { createPackageVersionProvider } from '../../../../lib/version';
import { getHasYarnPlugin } from '../../../../lib/yarnPlugin';
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import upperFirst from 'lodash/upperFirst';
import camelCase from 'lodash/camelCase';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { Task } from '../tasks';
import { PortableTemplateInput } from '../types';
@@ -17,7 +17,10 @@
import { relative as relativePath } from 'node:path';
import { writeTemplateContents } from './writeTemplateContents';
import { createMockDirectory } from '@backstage/backend-test-utils';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
const baseConfig = {
version: '0.1.0',
@@ -17,12 +17,15 @@
import fs from 'fs-extra';
import { dirname, resolve as resolvePath } from 'node:path';
import { paths } from '../../paths';
import { PortableTemplate, PortableTemplateInput } from '../types';
import { ForwardedError, InputError } from '@backstage/errors';
import { isMonoRepo as getIsMonoRepo } from '@backstage/cli-node';
import { PortableTemplater } from './PortableTemplater';
import { isChildPath } from '@backstage/cli-common';
import { isChildPath, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
export async function writeTemplateContents(
template: PortableTemplate,
@@ -16,7 +16,10 @@
import inquirer, { DistinctQuestion } from 'inquirer';
import { getCodeownersFilePath, parseOwnerIds } from '../codeowners';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import {
PortableTemplateConfig,
PortableTemplateInput,
@@ -20,7 +20,10 @@ import recursiveReaddir from 'recursive-readdir';
import { resolve as resolvePath, relative as relativePath } from 'node:path';
import { dirname } from 'node:path';
import { parse as parseYaml } from 'yaml';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import {
PortableTemplateFile,
PortableTemplatePointer,
@@ -16,7 +16,10 @@
import fs from 'fs-extra';
import { resolve as resolvePath, dirname, isAbsolute } from 'node:path';
import { paths } from '../../paths';
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { defaultTemplates } from '../defaultTemplates';
import {
PortableTemplateConfig,
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);
@@ -15,8 +15,11 @@
*/
import { Command, OptionValues } from 'commander';
import { paths } from '../../paths';
import { runCheck } from '@backstage/cli-common';
import { runCheck, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
function includesAnyOf(hayStack: string[], ...needles: string[]) {
for (const needle of needles) {
@@ -23,8 +23,11 @@ import { run as runJest, yargsOptions as jestYargsOptions } from 'jest-cli';
import { relative as relativePath } from 'node:path';
import { Command, OptionValues } from 'commander';
import { Lockfile, PackageGraph } from '@backstage/cli-node';
import { paths } from '../../paths';
import { runCheck, runOutput } from '@backstage/cli-common';
import { runCheck, runOutput, findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
const paths = findPaths(__dirname);
import { isChildPath } from '@backstage/cli-common';
import { SuccessCache } from '../../../../lib/cache/SuccessCache';
-20
View File
@@ -1,20 +0,0 @@
/*
* Copyright 2020 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { findPaths } from '@backstage/cli-common';
/* eslint-disable-next-line no-restricted-syntax */
export const paths = findPaths(__dirname);