@backstage/cli-node 0.3.4 → 0.3.5-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/auth/CliAuth.cjs.js.map +1 -1
- package/dist/auth/authIdentifiers.cjs.js.map +1 -1
- package/dist/auth/httpJson.cjs.js.map +1 -1
- package/dist/auth/secretStore.cjs.js.map +1 -1
- package/dist/auth/storage.cjs.js.map +1 -1
- package/dist/cache/SuccessCache.cjs.js.map +1 -1
- package/dist/cli-internal/src/InternalCliModule.cjs.js.map +1 -1
- package/dist/cli-internal/src/InternalCommandNode.cjs.js.map +1 -1
- package/dist/cli-internal/src/knownPluginPackages.cjs.js.map +1 -1
- package/dist/cli-module/CommandGraph.cjs.js.map +1 -1
- package/dist/cli-module/createCliModule.cjs.js.map +1 -1
- package/dist/cli-module/runCli.cjs.js.map +1 -1
- package/dist/cli-module/runCliModule.cjs.js.map +1 -1
- package/dist/concurrency/concurrency.cjs.js.map +1 -1
- package/dist/concurrency/runConcurrentTasks.cjs.js.map +1 -1
- package/dist/concurrency/runWorkerQueueThreads.cjs.js.map +1 -1
- package/dist/git/GitUtils.cjs.js.map +1 -1
- package/dist/index.cjs.js +3 -0
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +14 -1
- package/dist/input/parseInput.cjs.js +43 -0
- package/dist/input/parseInput.cjs.js.map +1 -0
- package/dist/monorepo/Lockfile.cjs.js.map +1 -1
- package/dist/monorepo/PackageGraph.cjs.js.map +1 -1
- package/dist/monorepo/isMonoRepo.cjs.js.map +1 -1
- package/dist/opaque-internal/src/OpaqueType.cjs.js.map +1 -1
- package/dist/roles/PackageRoles.cjs.js.map +1 -1
- package/dist/yarn/yarnPlugin.cjs.js.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @backstage/cli-node
|
|
2
2
|
|
|
3
|
+
## 0.3.5-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3d6721d: Add intent-based CLI modules for catalog, scaffolder, and search.
|
|
8
|
+
|
|
9
|
+
New modules provide domain-oriented subcommands that talk directly to the corresponding plugins' REST APIs:
|
|
10
|
+
|
|
11
|
+
- `@backstage/cli-module-catalog`: `catalog list`, `catalog get`, `catalog validate`, `catalog register`, `catalog unregister`
|
|
12
|
+
- `@backstage/cli-module-scaffolder`: `template list`, `template execute`, `template dry-run`
|
|
13
|
+
- `@backstage/cli-module-search`: `search`, `docs search`
|
|
14
|
+
|
|
15
|
+
The commands support human-readable and JSON output, positional entity and template references, repeatable `key=value` filters and inputs, comma-separated fields and search types, and file-based catalog entity and template input.
|
|
16
|
+
|
|
17
|
+
`@backstage/cli-node` now provides shared parsers for repeatable `key=value` inputs and comma-separated lists.
|
|
18
|
+
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
- @backstage/errors@1.3.2-next.0
|
|
21
|
+
- @backstage/cli-common@0.3.2-next.0
|
|
22
|
+
|
|
3
23
|
## 0.3.4
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CliAuth.cjs.js","sources":["../../src/auth/CliAuth.ts"],"sourcesContent":["/*\n * Copyright 2025 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 type StoredInstance,\n getSelectedInstance,\n getInstanceMetadata,\n updateInstanceMetadata,\n updateInstance,\n accessTokenNeedsRefresh,\n} from './storage';\nimport { getSecretStore, type SecretStore } from './secretStore';\nimport { getAuthInstanceService } from './authIdentifiers';\nimport { httpJson } from './httpJson';\nimport { z } from 'zod/v3';\n\nconst TokenResponseSchema = z.object({\n access_token: z.string().min(1),\n token_type: z.string().min(1),\n expires_in: z.number().positive().finite(),\n refresh_token: z.string().min(1).optional(),\n});\n\n/**\n * Options for creating a {@link CliAuth} instance.\n *\n * @public\n */\nexport interface CliAuthCreateOptions {\n /**\n * An explicit instance name to resolve. When omitted the currently\n * selected instance is used.\n */\n instanceName?: string;\n}\n\n/**\n * Manages authentication state for Backstage CLI commands.\n *\n * Reads the currently selected (or explicitly named) auth instance from\n * the on-disk instance store, transparently refreshes expired access\n * tokens, and exposes helpers that other CLI modules need to talk to a\n * Backstage backend.\n *\n * @public\n */\nexport class CliAuth {\n readonly #secretStore: SecretStore;\n #instance: StoredInstance;\n\n /**\n * Resolve the current auth instance and return a ready-to-use\n * {@link CliAuth} object. Throws when no instance can be found.\n */\n static async create(options?: CliAuthCreateOptions): Promise<CliAuth> {\n const instance = await getSelectedInstance(options?.instanceName);\n const secretStore = await getSecretStore();\n return new CliAuth(instance, secretStore);\n }\n\n private constructor(instance: StoredInstance, secretStore: SecretStore) {\n this.#instance = instance;\n this.#secretStore = secretStore;\n }\n\n /** Returns the name of the resolved auth instance. */\n getInstanceName(): string {\n return this.#instance.name;\n }\n\n /** Returns the base URL of the resolved auth instance. */\n getBaseUrl(): string {\n return this.#instance.baseUrl;\n }\n\n /**\n * Returns a valid access token, refreshing it first if the current\n * token is expired or about to expire.\n */\n async getAccessToken(): Promise<string> {\n if (accessTokenNeedsRefresh(this.#instance)) {\n await this.#refreshAccessToken();\n }\n\n const service = getAuthInstanceService(this.#instance.name);\n const token = await this.#secretStore.get(service, 'accessToken');\n if (!token) {\n throw new Error(\n 'No access token found. Run \"auth login\" to authenticate.',\n );\n }\n return token;\n }\n\n /**\n * Reads a per-instance metadata value previously stored by the\n * auth module (e.g. `pluginSources`).\n */\n async getMetadata(key: string): Promise<unknown> {\n return getInstanceMetadata(this.#instance.name, key);\n }\n\n /**\n * Writes a per-instance metadata value to the on-disk instance store.\n */\n async setMetadata(key: string, value: unknown): Promise<void> {\n return updateInstanceMetadata(this.#instance.name, key, value);\n }\n\n async #refreshAccessToken(): Promise<void> {\n const service = getAuthInstanceService(this.#instance.name);\n const refreshToken =\n (await this.#secretStore.get(service, 'refreshToken')) ?? '';\n if (!refreshToken) {\n throw new Error(\n 'Access token is expired and no refresh token is available',\n );\n }\n\n const response = await httpJson<unknown>(\n `${this.#instance.baseUrl}/api/auth/v1/token`,\n {\n method: 'POST',\n body: {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n },\n signal: AbortSignal.timeout(30_000),\n },\n );\n\n const parsed = TokenResponseSchema.safeParse(response);\n if (!parsed.success) {\n throw new Error(`Invalid token response: ${parsed.error.message}`);\n }\n const token = parsed.data;\n\n await this.#secretStore.set(service, 'accessToken', token.access_token);\n if (token.refresh_token) {\n await this.#secretStore.set(service, 'refreshToken', token.refresh_token);\n }\n const issuedAt = Date.now();\n const accessTokenExpiresAt = Date.now() + token.expires_in * 1000;\n this.#instance = { ...this.#instance, issuedAt, accessTokenExpiresAt };\n await updateInstance(this.#instance.name, {\n issuedAt,\n accessTokenExpiresAt,\n });\n }\n}\n"],"names":["z","getSelectedInstance","secretStore","getSecretStore","accessTokenNeedsRefresh","getAuthInstanceService","getInstanceMetadata","updateInstanceMetadata","httpJson","updateInstance"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CliAuth.cjs.js","sources":["../../src/auth/CliAuth.ts"],"sourcesContent":["/*\n * Copyright 2025 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 type StoredInstance,\n getSelectedInstance,\n getInstanceMetadata,\n updateInstanceMetadata,\n updateInstance,\n accessTokenNeedsRefresh,\n} from './storage';\nimport { getSecretStore, type SecretStore } from './secretStore';\nimport { getAuthInstanceService } from './authIdentifiers';\nimport { httpJson } from './httpJson';\nimport { z } from 'zod/v3';\n\nconst TokenResponseSchema = z.object({\n access_token: z.string().min(1),\n token_type: z.string().min(1),\n expires_in: z.number().positive().finite(),\n refresh_token: z.string().min(1).optional(),\n});\n\n/**\n * Options for creating a {@link CliAuth} instance.\n *\n * @public\n */\nexport interface CliAuthCreateOptions {\n /**\n * An explicit instance name to resolve. When omitted the currently\n * selected instance is used.\n */\n instanceName?: string;\n}\n\n/**\n * Manages authentication state for Backstage CLI commands.\n *\n * Reads the currently selected (or explicitly named) auth instance from\n * the on-disk instance store, transparently refreshes expired access\n * tokens, and exposes helpers that other CLI modules need to talk to a\n * Backstage backend.\n *\n * @public\n */\nexport class CliAuth {\n readonly #secretStore: SecretStore;\n #instance: StoredInstance;\n\n /**\n * Resolve the current auth instance and return a ready-to-use\n * {@link CliAuth} object. Throws when no instance can be found.\n */\n static async create(options?: CliAuthCreateOptions): Promise<CliAuth> {\n const instance = await getSelectedInstance(options?.instanceName);\n const secretStore = await getSecretStore();\n return new CliAuth(instance, secretStore);\n }\n\n private constructor(instance: StoredInstance, secretStore: SecretStore) {\n this.#instance = instance;\n this.#secretStore = secretStore;\n }\n\n /** Returns the name of the resolved auth instance. */\n getInstanceName(): string {\n return this.#instance.name;\n }\n\n /** Returns the base URL of the resolved auth instance. */\n getBaseUrl(): string {\n return this.#instance.baseUrl;\n }\n\n /**\n * Returns a valid access token, refreshing it first if the current\n * token is expired or about to expire.\n */\n async getAccessToken(): Promise<string> {\n if (accessTokenNeedsRefresh(this.#instance)) {\n await this.#refreshAccessToken();\n }\n\n const service = getAuthInstanceService(this.#instance.name);\n const token = await this.#secretStore.get(service, 'accessToken');\n if (!token) {\n throw new Error(\n 'No access token found. Run \"auth login\" to authenticate.',\n );\n }\n return token;\n }\n\n /**\n * Reads a per-instance metadata value previously stored by the\n * auth module (e.g. `pluginSources`).\n */\n async getMetadata(key: string): Promise<unknown> {\n return getInstanceMetadata(this.#instance.name, key);\n }\n\n /**\n * Writes a per-instance metadata value to the on-disk instance store.\n */\n async setMetadata(key: string, value: unknown): Promise<void> {\n return updateInstanceMetadata(this.#instance.name, key, value);\n }\n\n async #refreshAccessToken(): Promise<void> {\n const service = getAuthInstanceService(this.#instance.name);\n const refreshToken =\n (await this.#secretStore.get(service, 'refreshToken')) ?? '';\n if (!refreshToken) {\n throw new Error(\n 'Access token is expired and no refresh token is available',\n );\n }\n\n const response = await httpJson<unknown>(\n `${this.#instance.baseUrl}/api/auth/v1/token`,\n {\n method: 'POST',\n body: {\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n },\n signal: AbortSignal.timeout(30_000),\n },\n );\n\n const parsed = TokenResponseSchema.safeParse(response);\n if (!parsed.success) {\n throw new Error(`Invalid token response: ${parsed.error.message}`);\n }\n const token = parsed.data;\n\n await this.#secretStore.set(service, 'accessToken', token.access_token);\n if (token.refresh_token) {\n await this.#secretStore.set(service, 'refreshToken', token.refresh_token);\n }\n const issuedAt = Date.now();\n const accessTokenExpiresAt = Date.now() + token.expires_in * 1000;\n this.#instance = { ...this.#instance, issuedAt, accessTokenExpiresAt };\n await updateInstance(this.#instance.name, {\n issuedAt,\n accessTokenExpiresAt,\n });\n }\n}\n"],"names":["z","getSelectedInstance","secretStore","getSecretStore","accessTokenNeedsRefresh","getAuthInstanceService","getInstanceMetadata","updateInstanceMetadata","httpJson","updateInstance"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authIdentifiers.cjs.js","sources":["../../src/auth/authIdentifiers.ts"],"sourcesContent":["/*\n * Copyright 2025 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\n/** @internal */\nexport function getAuthInstanceService(instanceName: string): string {\n return `backstage-cli:auth-instance:${instanceName}`;\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,+BAA+B,YAAY,CAAA,CAAA;AACpD
|
|
1
|
+
{"version":3,"file":"authIdentifiers.cjs.js","sources":["../../src/auth/authIdentifiers.ts"],"sourcesContent":["/*\n * Copyright 2025 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\n/** @internal */\nexport function getAuthInstanceService(instanceName: string): string {\n return `backstage-cli:auth-instance:${instanceName}`;\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,uBAAuB,YAAA,EAA8B;AACnE,EAAA,OAAO,+BAA+B,YAAY,CAAA,CAAA;AACpD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpJson.cjs.js","sources":["../../src/auth/httpJson.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { ResponseError } from '@backstage/errors';\n\n/** @internal */\nexport type HttpInit = {\n headers?: Record<string, string>;\n method?: string;\n body?: any;\n signal?: AbortSignal;\n};\n\n/** @internal */\nexport async function httpJson<T>(url: string, init?: HttpInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n body: init?.body ? JSON.stringify(init.body) : undefined,\n headers: {\n ...(init?.body ? { 'Content-Type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n if (!res.ok) {\n throw await ResponseError.fromResponse(res);\n }\n return (await res.json()) as T;\n}\n"],"names":["ResponseError"],"mappings":";;;;AA2BA,eAAsB,QAAA,CAAY,KAAa,IAAA,EAA6B;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC3B,GAAG,IAAA;AAAA,IACH,MAAM,IAAA,EAAM,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,IAC/C,OAAA,EAAS;AAAA,MACP,GAAI,IAAA,EAAM,IAAA,GAAO,EAAE,cAAA,EAAgB,kBAAA,KAAuB,EAAC;AAAA,MAC3D,GAAG,IAAA,EAAM;AAAA;AACX,GACD,CAAA;AACD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,MAAMA,oBAAA,CAAc,YAAA,CAAa,GAAG,CAAA;AAAA,EAC5C;AACA,EAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AACzB
|
|
1
|
+
{"version":3,"file":"httpJson.cjs.js","sources":["../../src/auth/httpJson.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { ResponseError } from '@backstage/errors';\n\n/** @internal */\nexport type HttpInit = {\n headers?: Record<string, string>;\n method?: string;\n body?: any;\n signal?: AbortSignal;\n};\n\n/** @internal */\nexport async function httpJson<T>(url: string, init?: HttpInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n body: init?.body ? JSON.stringify(init.body) : undefined,\n headers: {\n ...(init?.body ? { 'Content-Type': 'application/json' } : {}),\n ...init?.headers,\n },\n });\n if (!res.ok) {\n throw await ResponseError.fromResponse(res);\n }\n return (await res.json()) as T;\n}\n"],"names":["ResponseError"],"mappings":";;;;AA2BA,eAAsB,QAAA,CAAY,KAAa,IAAA,EAA6B;AAC1E,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC3B,GAAG,IAAA;AAAA,IACH,MAAM,IAAA,EAAM,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAAA,IAC/C,OAAA,EAAS;AAAA,MACP,GAAI,IAAA,EAAM,IAAA,GAAO,EAAE,cAAA,EAAgB,kBAAA,KAAuB,EAAC;AAAA,MAC3D,GAAG,IAAA,EAAM;AAAA;AACX,GACD,CAAA;AACD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,MAAMA,oBAAA,CAAc,YAAA,CAAa,GAAG,CAAA;AAAA,EAC5C;AACA,EAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AACzB;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secretStore.cjs.js","sources":["../../src/auth/secretStore.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\n/** @internal */\nexport type SecretStore = {\n get(service: string, account: string): Promise<string | undefined>;\n set(service: string, account: string, secret: string): Promise<void>;\n delete(service: string, account: string): Promise<void>;\n};\n\nasync function loadKeytar(): Promise<typeof import('keytar') | undefined> {\n try {\n // eslint-disable-next-line import/no-extraneous-dependencies, @backstage/no-undeclared-imports\n const keytar = require('keytar') as typeof import('keytar');\n if (keytar && typeof keytar.getPassword === 'function') {\n return keytar;\n }\n } catch {\n // keytar not available\n }\n return undefined;\n}\n\nclass KeytarSecretStore implements SecretStore {\n private readonly keytar: typeof import('keytar');\n constructor(keytar: typeof import('keytar')) {\n this.keytar = keytar;\n }\n async get(service: string, account: string): Promise<string | undefined> {\n const result = await this.keytar.getPassword(service, account);\n return result ?? undefined;\n }\n async set(service: string, account: string, secret: string): Promise<void> {\n await this.keytar.setPassword(service, account, secret);\n }\n async delete(service: string, account: string): Promise<void> {\n await this.keytar.deletePassword(service, account);\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nclass FileSecretStore implements SecretStore {\n private readonly baseDir: string;\n constructor() {\n const root =\n process.env.XDG_DATA_HOME ||\n (process.platform === 'win32'\n ? process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n : path.join(os.homedir(), '.local', 'share'));\n this.baseDir = path.join(root, 'backstage-cli', 'auth-secrets');\n }\n private filePath(service: string, account: string): string {\n return path.join(\n this.baseDir,\n encodeURIComponent(service),\n `${encodeURIComponent(account)}.secret`,\n );\n }\n async get(service: string, account: string): Promise<string | undefined> {\n const file = this.filePath(service, account);\n if (!(await pathExists(file))) {\n return undefined;\n }\n return await fs.readFile(file, 'utf8');\n }\n async set(service: string, account: string, secret: string): Promise<void> {\n const file = this.filePath(service, account);\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, secret, { encoding: 'utf8', mode: 0o600 });\n }\n async delete(service: string, account: string): Promise<void> {\n const file = this.filePath(service, account);\n try {\n await fs.unlink(file);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n }\n }\n}\n\nlet singleton: SecretStore | undefined;\n\n/** @internal */\nexport async function getSecretStore(): Promise<SecretStore> {\n if (!singleton) {\n const keytar = await loadKeytar();\n if (keytar) {\n singleton = new KeytarSecretStore(keytar);\n } else {\n singleton = new FileSecretStore();\n }\n }\n return singleton;\n}\n\n/**\n * Reset the singleton instance (for testing purposes only)\n * @internal\n */\nexport function resetSecretStore(): void {\n singleton = undefined;\n}\n"],"names":["fs","path","os"],"mappings":";;;;;;;;;;;AA2BA,eAAe,UAAA,GAA2D;AACxE,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,QAAQ,QAAQ,CAAA;AAC/B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,WAAA,KAAgB,UAAA,EAAY;AACtD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,iBAAA,CAAyC;AAAA,EAC5B,MAAA;AAAA,EACjB,YAAY,MAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EACA,MAAM,GAAA,CAAI,OAAA,EAAiB,OAAA,EAA8C;AACvE,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,SAAS,OAAO,CAAA;AAC7D,IAAA,OAAO,MAAA,IAAU,MAAA;AAAA,EACnB;AAAA,EACA,MAAM,GAAA,CAAI,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAA+B;AACzE,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACxD;AAAA,EACA,MAAM,MAAA,CAAO,OAAA,EAAiB,OAAA,EAAgC;AAC5D,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAAA,EACnD;AACF;AAEA,eAAe,WAAW,CAAA,EAA6B;AACrD,EAAA,IAAI;AACF,IAAA,MAAMA,gBAAA,CAAG,KAAK,CAAC,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,MAAM,eAAA,CAAuC;AAAA,EAC1B,OAAA;AAAA,EACjB,WAAA,GAAc;AACZ,IAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,GAAA,CAAI,aAAA,KACX,OAAA,CAAQ,aAAa,OAAA,GAClB,OAAA,CAAQ,GAAA,CAAI,OAAA,IAAWC,qBAAA,CAAK,IAAA,CAAKC,oBAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,SAAS,CAAA,GACnED,qBAAA,CAAK,KAAKC,mBAAA,CAAG,OAAA,EAAQ,EAAG,QAAA,EAAU,OAAO,CAAA,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAUD,qBAAA,CAAK,IAAA,CAAK,IAAA,EAAM,iBAAiB,cAAc,CAAA;AAAA,EAChE;AAAA,EACQ,QAAA,CAAS,SAAiB,OAAA,EAAyB;AACzD,IAAA,OAAOA,qBAAA,CAAK,IAAA;AAAA,MACV,IAAA,CAAK,OAAA;AAAA,MACL,mBAAmB,OAAO,CAAA;AAAA,MAC1B,CAAA,EAAG,kBAAA,CAAmB,OAAO,CAAC,CAAA,OAAA;AAAA,KAChC;AAAA,EACF;AAAA,EACA,MAAM,GAAA,CAAI,OAAA,EAAiB,OAAA,EAA8C;AACvE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,IAAI,CAAE,MAAM,UAAA,CAAW,IAAI,CAAA,EAAI;AAC7B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAMD,gBAAA,CAAG,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EACvC;AAAA,EACA,MAAM,GAAA,CAAI,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAA+B;AACzE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,MAAMA,gBAAA,CAAG,MAAMC,qBAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACtD,IAAA,MAAMD,gBAAA,CAAG,UAAU,IAAA,EAAM,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EACpE;AAAA,EACA,MAAM,MAAA,CAAO,OAAA,EAAiB,OAAA,EAAgC;AAC5D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,IAAI;AACF,MAAA,MAAMA,gBAAA,CAAG,OAAO,IAAI,CAAA;AAAA,IACtB,SAAS,GAAA,EAAK;AACZ,MAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,SAAA;AAGJ,eAAsB,cAAA,GAAuC;AAC3D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,SAAA,GAAY,IAAI,kBAAkB,MAAM,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,IAAI,eAAA,EAAgB;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT
|
|
1
|
+
{"version":3,"file":"secretStore.cjs.js","sources":["../../src/auth/secretStore.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\n/** @internal */\nexport type SecretStore = {\n get(service: string, account: string): Promise<string | undefined>;\n set(service: string, account: string, secret: string): Promise<void>;\n delete(service: string, account: string): Promise<void>;\n};\n\nasync function loadKeytar(): Promise<typeof import('keytar') | undefined> {\n try {\n // eslint-disable-next-line import/no-extraneous-dependencies, @backstage/no-undeclared-imports\n const keytar = require('keytar') as typeof import('keytar');\n if (keytar && typeof keytar.getPassword === 'function') {\n return keytar;\n }\n } catch {\n // keytar not available\n }\n return undefined;\n}\n\nclass KeytarSecretStore implements SecretStore {\n private readonly keytar: typeof import('keytar');\n constructor(keytar: typeof import('keytar')) {\n this.keytar = keytar;\n }\n async get(service: string, account: string): Promise<string | undefined> {\n const result = await this.keytar.getPassword(service, account);\n return result ?? undefined;\n }\n async set(service: string, account: string, secret: string): Promise<void> {\n await this.keytar.setPassword(service, account, secret);\n }\n async delete(service: string, account: string): Promise<void> {\n await this.keytar.deletePassword(service, account);\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nclass FileSecretStore implements SecretStore {\n private readonly baseDir: string;\n constructor() {\n const root =\n process.env.XDG_DATA_HOME ||\n (process.platform === 'win32'\n ? process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n : path.join(os.homedir(), '.local', 'share'));\n this.baseDir = path.join(root, 'backstage-cli', 'auth-secrets');\n }\n private filePath(service: string, account: string): string {\n return path.join(\n this.baseDir,\n encodeURIComponent(service),\n `${encodeURIComponent(account)}.secret`,\n );\n }\n async get(service: string, account: string): Promise<string | undefined> {\n const file = this.filePath(service, account);\n if (!(await pathExists(file))) {\n return undefined;\n }\n return await fs.readFile(file, 'utf8');\n }\n async set(service: string, account: string, secret: string): Promise<void> {\n const file = this.filePath(service, account);\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.writeFile(file, secret, { encoding: 'utf8', mode: 0o600 });\n }\n async delete(service: string, account: string): Promise<void> {\n const file = this.filePath(service, account);\n try {\n await fs.unlink(file);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw err;\n }\n }\n }\n}\n\nlet singleton: SecretStore | undefined;\n\n/** @internal */\nexport async function getSecretStore(): Promise<SecretStore> {\n if (!singleton) {\n const keytar = await loadKeytar();\n if (keytar) {\n singleton = new KeytarSecretStore(keytar);\n } else {\n singleton = new FileSecretStore();\n }\n }\n return singleton;\n}\n\n/**\n * Reset the singleton instance (for testing purposes only)\n * @internal\n */\nexport function resetSecretStore(): void {\n singleton = undefined;\n}\n"],"names":["fs","path","os"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.cjs.js","sources":["../../src/auth/storage.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { NotFoundError } from '@backstage/errors';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport lockfile from 'proper-lockfile';\nimport YAML from 'yaml';\nimport { z } from 'zod/v3';\n\nconst METADATA_FILE = 'auth-instances.yaml';\n\nconst INSTANCE_NAME_PATTERN = /^[a-zA-Z0-9._:@-]+$/;\n\nconst storedInstanceSchema = z.object({\n name: z\n .string()\n .min(1)\n .regex(INSTANCE_NAME_PATTERN, 'Instance name contains invalid characters'),\n baseUrl: z.string().url(),\n clientId: z.string().min(1),\n issuedAt: z.number().int().nonnegative(),\n accessTokenExpiresAt: z.number().int().nonnegative(),\n selected: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst authYamlSchema = z.object({\n instances: z.array(storedInstanceSchema).default([]),\n});\n\nexport type StoredInstance = {\n name: string;\n baseUrl: string;\n clientId: string;\n issuedAt: number;\n accessTokenExpiresAt: number;\n selected?: boolean;\n metadata?: Record<string, unknown>;\n};\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/** @internal */\nexport function getMetadataFilePath(): string {\n const root =\n process.env.XDG_CONFIG_HOME ||\n (process.platform === 'win32'\n ? process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n : path.join(os.homedir(), '.config'));\n\n return path.join(root, 'backstage-cli', METADATA_FILE);\n}\n\n/** @internal */\nexport async function readAll(): Promise<{ instances: StoredInstance[] }> {\n const file = getMetadataFilePath();\n if (!(await pathExists(file))) {\n return { instances: [] };\n }\n const text = await fs.readFile(file, 'utf8');\n if (!text.trim()) {\n return { instances: [] };\n }\n try {\n const doc = YAML.parse(text);\n const parsed = authYamlSchema.safeParse(doc);\n if (parsed.success) {\n return parsed.data;\n }\n return { instances: [] };\n } catch {\n return { instances: [] };\n }\n}\n\nasync function writeAll(data: { instances: StoredInstance[] }): Promise<void> {\n const file = getMetadataFilePath();\n await fs.mkdir(path.dirname(file), { recursive: true });\n const yaml = YAML.stringify(authYamlSchema.parse(data), { indentSeq: false });\n await fs.writeFile(file, yaml, { encoding: 'utf8', mode: 0o600 });\n}\n\nasync function withMetadataLock<T>(fn: () => Promise<T>): Promise<T> {\n const file = getMetadataFilePath();\n await fs.mkdir(path.dirname(file), { recursive: true });\n if (!(await pathExists(file))) {\n await fs.writeFile(file, '', { encoding: 'utf8', mode: 0o600 });\n }\n const release = await lockfile.lock(file, {\n retries: { retries: 5, factor: 1.5, minTimeout: 100, maxTimeout: 1000 },\n });\n try {\n return await fn();\n } finally {\n await release();\n }\n}\n\n/** @internal */\nexport async function getAllInstances(): Promise<{\n instances: StoredInstance[];\n selected: StoredInstance | undefined;\n}> {\n const { instances } = await readAll();\n if (instances.length === 0) {\n return { instances: [], selected: undefined };\n }\n const selected = instances.find(i => i.selected) ?? instances[0];\n return {\n instances: instances.map(i => ({\n ...i,\n selected: i.name === selected.name,\n })),\n selected,\n };\n}\n\n/** @internal */\nexport async function getSelectedInstance(\n instanceName?: string,\n): Promise<StoredInstance> {\n if (instanceName) {\n return await getInstanceByName(instanceName);\n }\n const { selected } = await getAllInstances();\n if (!selected) {\n throw new Error(\n 'No instances found. Run \"auth login\" to authenticate first.',\n );\n }\n return selected;\n}\n\n/** @internal */\nexport async function getInstanceByName(name: string): Promise<StoredInstance> {\n const { instances } = await readAll();\n const instance = instances.find(i => i.name === name);\n if (!instance) {\n throw new NotFoundError(`Instance '${name}' not found`);\n }\n return instance;\n}\n\n/** @internal */\nexport async function getInstanceMetadata(\n instanceName: string,\n key: string,\n): Promise<unknown> {\n const instance = await getInstanceByName(instanceName);\n return instance.metadata?.[key];\n}\n\n/** @internal */\nexport async function updateInstanceMetadata(\n instanceName: string,\n key: string,\n value: unknown,\n): Promise<void> {\n return withMetadataLock(async () => {\n const data = await readAll();\n const idx = data.instances.findIndex(i => i.name === instanceName);\n if (idx === -1) {\n throw new NotFoundError(`Instance '${instanceName}' not found`);\n }\n data.instances[idx] = {\n ...data.instances[idx],\n metadata: { ...data.instances[idx].metadata, [key]: value },\n };\n await writeAll(data);\n });\n}\n\n/** @internal */\nexport async function updateInstance(\n instanceName: string,\n updates: Partial<Pick<StoredInstance, 'issuedAt' | 'accessTokenExpiresAt'>>,\n): Promise<void> {\n return withMetadataLock(async () => {\n const data = await readAll();\n const idx = data.instances.findIndex(i => i.name === instanceName);\n if (idx === -1) {\n throw new NotFoundError(`Instance '${instanceName}' not found`);\n }\n data.instances[idx] = { ...data.instances[idx], ...updates };\n await writeAll(data);\n });\n}\n\n/** @internal */\nexport function accessTokenNeedsRefresh(instance: StoredInstance): boolean {\n // 2 minutes before expiration\n return instance.accessTokenExpiresAt <= Date.now() + 2 * 60_000;\n}\n"],"names":["z","fs","path","os","YAML","lockfile","NotFoundError"],"mappings":";;;;;;;;;;;;;;;;;AAwBA,MAAM,aAAA,GAAgB,qBAAA;AAEtB,MAAM,qBAAA,GAAwB,qBAAA;AAE9B,MAAM,oBAAA,GAAuBA,KAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAMA,KACH,MAAA,EAAO,CACP,IAAI,CAAC,CAAA,CACL,KAAA,CAAM,qBAAA,EAAuB,2CAA2C,CAAA;AAAA,EAC3E,OAAA,EAASA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EACxB,QAAA,EAAUA,IAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1B,UAAUA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,WAAA,EAAY;AAAA,EACvC,sBAAsBA,IAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,WAAA,EAAY;AAAA,EACnD,QAAA,EAAUA,IAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAUA,IAAA,CAAE,MAAA,CAAOA,IAAA,CAAE,MAAA,IAAUA,IAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA;AAC9C,CAAC,CAAA;AAED,MAAM,cAAA,GAAiBA,KAAE,MAAA,CAAO;AAAA,EAC9B,WAAWA,IAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA,CAAE,OAAA,CAAQ,EAAE;AACrD,CAAC,CAAA;AAYD,eAAe,WAAW,CAAA,EAA6B;AACrD,EAAA,IAAI;AACF,IAAA,MAAMC,gBAAA,CAAG,KAAK,CAAC,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,MAAM,IAAA,GACJ,QAAQ,GAAA,CAAI,eAAA,KACX,QAAQ,QAAA,KAAa,OAAA,GAClB,OAAA,CAAQ,GAAA,CAAI,OAAA,IAAWC,qBAAA,CAAK,KAAKC,mBAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,SAAS,CAAA,GACnED,sBAAK,IAAA,CAAKC,mBAAA,CAAG,OAAA,EAAQ,EAAG,SAAS,CAAA,CAAA;AAEvC,EAAA,OAAOD,qBAAA,CAAK,IAAA,CAAK,IAAA,EAAM,eAAA,EAAiB,aAAa,CAAA;AACvD;AAGA,eAAsB,OAAA,GAAoD;AACxE,EAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,IAAI,CAAA,EAAI;AAC7B,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AACA,EAAA,MAAM,IAAA,GAAO,MAAMD,gBAAA,CAAG,QAAA,CAAS,MAAM,MAAM,CAAA;AAC3C,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMG,qBAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,CAAU,GAAG,CAAA;AAC3C,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB;AACA,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAE;AAAA,EACzB;AACF;AAEA,eAAe,SAAS,IAAA,EAAsD;AAC5E,EAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,EAAA,MAAMH,gBAAA,CAAG,MAAMC,qBAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACtD,EAAA,MAAM,IAAA,GAAOE,qBAAA,CAAK,SAAA,CAAU,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAC5E,EAAA,MAAMH,gBAAA,CAAG,UAAU,IAAA,EAAM,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAO,CAAA;AAClE;AAEA,eAAe,iBAAoB,EAAA,EAAkC;AACnE,EAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,EAAA,MAAMA,gBAAA,CAAG,MAAMC,qBAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACtD,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,IAAI,CAAA,EAAI;AAC7B,IAAA,MAAMD,gBAAA,CAAG,UAAU,IAAA,EAAM,EAAA,EAAI,EAAE,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAO,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,OAAA,GAAU,MAAMI,yBAAA,CAAS,IAAA,CAAK,IAAA,EAAM;AAAA,IACxC,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,GAAA,EAAK,UAAA,EAAY,GAAA,EAAK,UAAA,EAAY,GAAA;AAAK,GACvE,CAAA;AACD,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,EAAG;AAAA,EAClB,CAAA,SAAE;AACA,IAAA,MAAM,OAAA,EAAQ;AAAA,EAChB;AACF;AAGA,eAAsB,eAAA,GAGnB;AACD,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAA,EAAQ;AACpC,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,SAAA,EAAW,EAAC,EAAG,UAAU,MAAA,EAAU;AAAA,EAC9C;AACA,EAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA,IAAK,UAAU,CAAC,CAAA;AAC/D,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC7B,GAAG,CAAA;AAAA,MACH,QAAA,EAAU,CAAA,CAAE,IAAA,KAAS,QAAA,CAAS;AAAA,KAChC,CAAE,CAAA;AAAA,IACF;AAAA,GACF;AACF;AAGA,eAAsB,oBACpB,YAAA,EACyB;AACzB,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,MAAM,kBAAkB,YAAY,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,eAAA,EAAgB;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAGA,eAAsB,kBAAkB,IAAA,EAAuC;AAC7E,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAA,EAAQ;AACpC,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AACpD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAIC,oBAAA,CAAc,CAAA,UAAA,EAAa,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,QAAA;AACT;AAGA,eAAsB,mBAAA,CACpB,cACA,GAAA,EACkB;AAClB,EAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,YAAY,CAAA;AACrD,EAAA,OAAO,QAAA,CAAS,WAAW,GAAG,CAAA;AAChC;AAGA,eAAsB,sBAAA,CACpB,YAAA,EACA,GAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO,iBAAiB,YAAY;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AACjE,IAAA,IAAI,QAAQ,CAAA,CAAA,EAAI;AACd,MAAA,MAAM,IAAIA,oBAAA,CAAc,CAAA,UAAA,EAAa,YAAY,CAAA,WAAA,CAAa,CAAA;AAAA,IAChE;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI;AAAA,MACpB,GAAG,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAAA,MACrB,QAAA,EAAU,EAAE,GAAG,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,CAAE,QAAA,EAAU,CAAC,GAAG,GAAG,KAAA;AAAM,KAC5D;AACA,IAAA,MAAM,SAAS,IAAI,CAAA;AAAA,EACrB,CAAC,CAAA;AACH;AAGA,eAAsB,cAAA,CACpB,cACA,OAAA,EACe;AACf,EAAA,OAAO,iBAAiB,YAAY;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AACjE,IAAA,IAAI,QAAQ,CAAA,CAAA,EAAI;AACd,MAAA,MAAM,IAAIA,oBAAA,CAAc,CAAA,UAAA,EAAa,YAAY,CAAA,WAAA,CAAa,CAAA;AAAA,IAChE;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,GAAI,EAAE,GAAG,KAAK,SAAA,CAAU,GAAG,CAAA,EAAG,GAAG,OAAA,EAAQ;AAC3D,IAAA,MAAM,SAAS,IAAI,CAAA;AAAA,EACrB,CAAC,CAAA;AACH;AAGO,SAAS,wBAAwB,QAAA,EAAmC;AAEzE,EAAA,OAAO,QAAA,CAAS,oBAAA,IAAwB,IAAA,CAAK,GAAA,KAAQ,CAAA,GAAI,GAAA;AAC3D;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"storage.cjs.js","sources":["../../src/auth/storage.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { NotFoundError } from '@backstage/errors';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport lockfile from 'proper-lockfile';\nimport YAML from 'yaml';\nimport { z } from 'zod/v3';\n\nconst METADATA_FILE = 'auth-instances.yaml';\n\nconst INSTANCE_NAME_PATTERN = /^[a-zA-Z0-9._:@-]+$/;\n\nconst storedInstanceSchema = z.object({\n name: z\n .string()\n .min(1)\n .regex(INSTANCE_NAME_PATTERN, 'Instance name contains invalid characters'),\n baseUrl: z.string().url(),\n clientId: z.string().min(1),\n issuedAt: z.number().int().nonnegative(),\n accessTokenExpiresAt: z.number().int().nonnegative(),\n selected: z.boolean().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst authYamlSchema = z.object({\n instances: z.array(storedInstanceSchema).default([]),\n});\n\nexport type StoredInstance = {\n name: string;\n baseUrl: string;\n clientId: string;\n issuedAt: number;\n accessTokenExpiresAt: number;\n selected?: boolean;\n metadata?: Record<string, unknown>;\n};\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/** @internal */\nexport function getMetadataFilePath(): string {\n const root =\n process.env.XDG_CONFIG_HOME ||\n (process.platform === 'win32'\n ? process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')\n : path.join(os.homedir(), '.config'));\n\n return path.join(root, 'backstage-cli', METADATA_FILE);\n}\n\n/** @internal */\nexport async function readAll(): Promise<{ instances: StoredInstance[] }> {\n const file = getMetadataFilePath();\n if (!(await pathExists(file))) {\n return { instances: [] };\n }\n const text = await fs.readFile(file, 'utf8');\n if (!text.trim()) {\n return { instances: [] };\n }\n try {\n const doc = YAML.parse(text);\n const parsed = authYamlSchema.safeParse(doc);\n if (parsed.success) {\n return parsed.data;\n }\n return { instances: [] };\n } catch {\n return { instances: [] };\n }\n}\n\nasync function writeAll(data: { instances: StoredInstance[] }): Promise<void> {\n const file = getMetadataFilePath();\n await fs.mkdir(path.dirname(file), { recursive: true });\n const yaml = YAML.stringify(authYamlSchema.parse(data), { indentSeq: false });\n await fs.writeFile(file, yaml, { encoding: 'utf8', mode: 0o600 });\n}\n\nasync function withMetadataLock<T>(fn: () => Promise<T>): Promise<T> {\n const file = getMetadataFilePath();\n await fs.mkdir(path.dirname(file), { recursive: true });\n if (!(await pathExists(file))) {\n await fs.writeFile(file, '', { encoding: 'utf8', mode: 0o600 });\n }\n const release = await lockfile.lock(file, {\n retries: { retries: 5, factor: 1.5, minTimeout: 100, maxTimeout: 1000 },\n });\n try {\n return await fn();\n } finally {\n await release();\n }\n}\n\n/** @internal */\nexport async function getAllInstances(): Promise<{\n instances: StoredInstance[];\n selected: StoredInstance | undefined;\n}> {\n const { instances } = await readAll();\n if (instances.length === 0) {\n return { instances: [], selected: undefined };\n }\n const selected = instances.find(i => i.selected) ?? instances[0];\n return {\n instances: instances.map(i => ({\n ...i,\n selected: i.name === selected.name,\n })),\n selected,\n };\n}\n\n/** @internal */\nexport async function getSelectedInstance(\n instanceName?: string,\n): Promise<StoredInstance> {\n if (instanceName) {\n return await getInstanceByName(instanceName);\n }\n const { selected } = await getAllInstances();\n if (!selected) {\n throw new Error(\n 'No instances found. Run \"auth login\" to authenticate first.',\n );\n }\n return selected;\n}\n\n/** @internal */\nexport async function getInstanceByName(name: string): Promise<StoredInstance> {\n const { instances } = await readAll();\n const instance = instances.find(i => i.name === name);\n if (!instance) {\n throw new NotFoundError(`Instance '${name}' not found`);\n }\n return instance;\n}\n\n/** @internal */\nexport async function getInstanceMetadata(\n instanceName: string,\n key: string,\n): Promise<unknown> {\n const instance = await getInstanceByName(instanceName);\n return instance.metadata?.[key];\n}\n\n/** @internal */\nexport async function updateInstanceMetadata(\n instanceName: string,\n key: string,\n value: unknown,\n): Promise<void> {\n return withMetadataLock(async () => {\n const data = await readAll();\n const idx = data.instances.findIndex(i => i.name === instanceName);\n if (idx === -1) {\n throw new NotFoundError(`Instance '${instanceName}' not found`);\n }\n data.instances[idx] = {\n ...data.instances[idx],\n metadata: { ...data.instances[idx].metadata, [key]: value },\n };\n await writeAll(data);\n });\n}\n\n/** @internal */\nexport async function updateInstance(\n instanceName: string,\n updates: Partial<Pick<StoredInstance, 'issuedAt' | 'accessTokenExpiresAt'>>,\n): Promise<void> {\n return withMetadataLock(async () => {\n const data = await readAll();\n const idx = data.instances.findIndex(i => i.name === instanceName);\n if (idx === -1) {\n throw new NotFoundError(`Instance '${instanceName}' not found`);\n }\n data.instances[idx] = { ...data.instances[idx], ...updates };\n await writeAll(data);\n });\n}\n\n/** @internal */\nexport function accessTokenNeedsRefresh(instance: StoredInstance): boolean {\n // 2 minutes before expiration\n return instance.accessTokenExpiresAt <= Date.now() + 2 * 60_000;\n}\n"],"names":["z","fs","path","os","YAML","lockfile","NotFoundError"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuccessCache.cjs.js","sources":["../../src/cache/SuccessCache.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 fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst DEFAULT_CACHE_BASE_PATH = 'node_modules/.cache/backstage-cli';\n\nconst CACHE_MAX_AGE_MS = 7 * 24 * 3600_000;\n\n/**\n * A file-system-based cache that tracks successful operations by storing\n * timestamped marker files.\n *\n * @public\n */\nexport class SuccessCache {\n readonly #path: string;\n\n /**\n * Trim any occurrences of the workspace root path from the input string. This\n * is useful to ensure stable hashes that don't vary based on the workspace\n * location.\n */\n static trimPaths(input: string) {\n return input.replaceAll(targetPaths.rootDir, '');\n }\n\n static create(options: { name: string; basePath?: string }): SuccessCache {\n return new SuccessCache(options);\n }\n\n private constructor(options: { name: string; basePath?: string }) {\n this.#path = resolvePath(\n options.basePath ?? DEFAULT_CACHE_BASE_PATH,\n options.name,\n );\n }\n\n async read(): Promise<Set<string>> {\n try {\n const stat = await fs.stat(this.#path);\n if (!stat.isDirectory()) {\n await fs.rm(this.#path);\n return new Set();\n }\n } catch (error) {\n if (error.code === 'ENOENT') {\n return new Set();\n }\n throw error;\n }\n\n const items = await fs.readdir(this.#path);\n\n const returned = new Set<string>();\n const removed = new Set<string>();\n\n const now = Date.now();\n\n for (const item of items) {\n const split = item.split('_');\n if (split.length !== 2) {\n removed.add(item);\n continue;\n }\n const createdAt = parseInt(split[0], 10);\n if (Number.isNaN(createdAt) || now - createdAt > CACHE_MAX_AGE_MS) {\n removed.add(item);\n } else {\n returned.add(split[1]);\n }\n }\n\n for (const item of removed) {\n await fs.unlink(resolvePath(this.#path, item));\n }\n\n return returned;\n }\n\n async write(newEntries: Iterable<string>): Promise<void> {\n const now = Date.now();\n\n await fs.ensureDir(this.#path);\n\n const existingItems = await fs.readdir(this.#path);\n\n const empty = Buffer.alloc(0);\n for (const key of newEntries) {\n const trimmedItems = existingItems.filter(item =>\n item.endsWith(`_${key}`),\n );\n for (const trimmedItem of trimmedItems) {\n await fs.unlink(resolvePath(this.#path, trimmedItem));\n }\n\n await fs.writeFile(resolvePath(this.#path, `${now}_${key}`), empty);\n }\n }\n}\n"],"names":["targetPaths","resolvePath","fs"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SuccessCache.cjs.js","sources":["../../src/cache/SuccessCache.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 fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst DEFAULT_CACHE_BASE_PATH = 'node_modules/.cache/backstage-cli';\n\nconst CACHE_MAX_AGE_MS = 7 * 24 * 3600_000;\n\n/**\n * A file-system-based cache that tracks successful operations by storing\n * timestamped marker files.\n *\n * @public\n */\nexport class SuccessCache {\n readonly #path: string;\n\n /**\n * Trim any occurrences of the workspace root path from the input string. This\n * is useful to ensure stable hashes that don't vary based on the workspace\n * location.\n */\n static trimPaths(input: string) {\n return input.replaceAll(targetPaths.rootDir, '');\n }\n\n static create(options: { name: string; basePath?: string }): SuccessCache {\n return new SuccessCache(options);\n }\n\n private constructor(options: { name: string; basePath?: string }) {\n this.#path = resolvePath(\n options.basePath ?? DEFAULT_CACHE_BASE_PATH,\n options.name,\n );\n }\n\n async read(): Promise<Set<string>> {\n try {\n const stat = await fs.stat(this.#path);\n if (!stat.isDirectory()) {\n await fs.rm(this.#path);\n return new Set();\n }\n } catch (error) {\n if (error.code === 'ENOENT') {\n return new Set();\n }\n throw error;\n }\n\n const items = await fs.readdir(this.#path);\n\n const returned = new Set<string>();\n const removed = new Set<string>();\n\n const now = Date.now();\n\n for (const item of items) {\n const split = item.split('_');\n if (split.length !== 2) {\n removed.add(item);\n continue;\n }\n const createdAt = parseInt(split[0], 10);\n if (Number.isNaN(createdAt) || now - createdAt > CACHE_MAX_AGE_MS) {\n removed.add(item);\n } else {\n returned.add(split[1]);\n }\n }\n\n for (const item of removed) {\n await fs.unlink(resolvePath(this.#path, item));\n }\n\n return returned;\n }\n\n async write(newEntries: Iterable<string>): Promise<void> {\n const now = Date.now();\n\n await fs.ensureDir(this.#path);\n\n const existingItems = await fs.readdir(this.#path);\n\n const empty = Buffer.alloc(0);\n for (const key of newEntries) {\n const trimmedItems = existingItems.filter(item =>\n item.endsWith(`_${key}`),\n );\n for (const trimmedItem of trimmedItems) {\n await fs.unlink(resolvePath(this.#path, trimmedItem));\n }\n\n await fs.writeFile(resolvePath(this.#path, `${now}_${key}`), empty);\n }\n }\n}\n"],"names":["targetPaths","resolvePath","fs"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InternalCliModule.cjs.js","sources":["../../../../cli-internal/src/InternalCliModule.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 { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\nexport const OpaqueCliModule = OpaqueType.create<{\n public: CliModule;\n versions: {\n readonly version: 'v1';\n readonly packageName: string;\n readonly commands: Promise<ReadonlyArray<CliCommand>>;\n };\n}>({\n type: '@backstage/CliModule',\n versions: ['v1'],\n});\n"],"names":["OpaqueType"],"mappings":";;;;AAmBO,MAAM,eAAA,GAAkBA,sBAAW,MAAA,CAOvC;AAAA,EACD,IAAA,EAAM,sBAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC
|
|
1
|
+
{"version":3,"file":"InternalCliModule.cjs.js","sources":["../../../../cli-internal/src/InternalCliModule.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 { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\nexport const OpaqueCliModule = OpaqueType.create<{\n public: CliModule;\n versions: {\n readonly version: 'v1';\n readonly packageName: string;\n readonly commands: Promise<ReadonlyArray<CliCommand>>;\n };\n}>({\n type: '@backstage/CliModule',\n versions: ['v1'],\n});\n"],"names":["OpaqueType"],"mappings":";;;;AAmBO,MAAM,eAAA,GAAkBA,sBAAW,MAAA,CAOvC;AAAA,EACD,IAAA,EAAM,sBAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InternalCommandNode.cjs.js","sources":["../../../../cli-internal/src/InternalCommandNode.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 { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\n/** @internal */\nexport interface CommandTreeNode {\n readonly $$type: '@backstage/CommandTreeNode';\n}\n\n/** @internal */\nexport interface CommandLeafNode {\n readonly $$type: '@backstage/CommandLeafNode';\n}\n\nexport type CommandNode = CommandTreeNode | CommandLeafNode;\n\nexport const OpaqueCommandTreeNode = OpaqueType.create<{\n public: CommandTreeNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly children: CommandNode[];\n };\n}>({\n type: '@backstage/CommandTreeNode',\n versions: ['v1'],\n});\n\nexport const OpaqueCommandLeafNode = OpaqueType.create<{\n public: CommandLeafNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly command: CliCommand;\n readonly module?: CliModule;\n };\n}>({\n type: '@backstage/CommandLeafNode',\n versions: ['v1'],\n});\n\n/**\n * Checks whether a command node should be hidden from help output.\n * Leaf nodes are hidden if they are deprecated or experimental.\n * Tree nodes are hidden if all of their children are hidden.\n */\nexport function isCommandNodeHidden(node: CommandNode): boolean {\n if (OpaqueCommandLeafNode.isType(node)) {\n const { command } = OpaqueCommandLeafNode.toInternal(node);\n return !!command.deprecated || !!command.experimental;\n }\n const { children } = OpaqueCommandTreeNode.toInternal(node);\n return children.every(child => isCommandNodeHidden(child));\n}\n"],"names":["OpaqueType"],"mappings":";;;;AA+BO,MAAM,qBAAA,GAAwBA,sBAAW,MAAA,CAO7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;AAEM,MAAM,qBAAA,GAAwBA,sBAAW,MAAA,CAQ7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAA4B;AAC9D,EAAA,IAAI,qBAAA,CAAsB,MAAA,CAAO,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,qBAAA,CAAsB,WAAW,IAAI,CAAA;AACzD,IAAA,OAAO,CAAC,CAAC,OAAA,CAAQ,UAAA,IAAc,CAAC,CAAC,OAAA,CAAQ,YAAA;AAAA,EAC3C;AACA,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,CAAsB,WAAW,IAAI,CAAA;AAC1D,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,KAAA,KAAS,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAC3D
|
|
1
|
+
{"version":3,"file":"InternalCommandNode.cjs.js","sources":["../../../../cli-internal/src/InternalCommandNode.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 { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\n/** @internal */\nexport interface CommandTreeNode {\n readonly $$type: '@backstage/CommandTreeNode';\n}\n\n/** @internal */\nexport interface CommandLeafNode {\n readonly $$type: '@backstage/CommandLeafNode';\n}\n\nexport type CommandNode = CommandTreeNode | CommandLeafNode;\n\nexport const OpaqueCommandTreeNode = OpaqueType.create<{\n public: CommandTreeNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly children: CommandNode[];\n };\n}>({\n type: '@backstage/CommandTreeNode',\n versions: ['v1'],\n});\n\nexport const OpaqueCommandLeafNode = OpaqueType.create<{\n public: CommandLeafNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly command: CliCommand;\n readonly module?: CliModule;\n };\n}>({\n type: '@backstage/CommandLeafNode',\n versions: ['v1'],\n});\n\n/**\n * Checks whether a command node should be hidden from help output.\n * Leaf nodes are hidden if they are deprecated or experimental.\n * Tree nodes are hidden if all of their children are hidden.\n */\nexport function isCommandNodeHidden(node: CommandNode): boolean {\n if (OpaqueCommandLeafNode.isType(node)) {\n const { command } = OpaqueCommandLeafNode.toInternal(node);\n return !!command.deprecated || !!command.experimental;\n }\n const { children } = OpaqueCommandTreeNode.toInternal(node);\n return children.every(child => isCommandNodeHidden(child));\n}\n"],"names":["OpaqueType"],"mappings":";;;;AA+BO,MAAM,qBAAA,GAAwBA,sBAAW,MAAA,CAO7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;AAEM,MAAM,qBAAA,GAAwBA,sBAAW,MAAA,CAQ7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;AAOM,SAAS,oBAAoB,IAAA,EAA4B;AAC9D,EAAA,IAAI,qBAAA,CAAsB,MAAA,CAAO,IAAI,CAAA,EAAG;AACtC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,qBAAA,CAAsB,WAAW,IAAI,CAAA;AACzD,IAAA,OAAO,CAAC,CAAC,OAAA,CAAQ,UAAA,IAAc,CAAC,CAAC,OAAA,CAAQ,YAAA;AAAA,EAC3C;AACA,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,CAAsB,WAAW,IAAI,CAAA;AAC1D,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,KAAA,KAAS,mBAAA,CAAoB,KAAK,CAAC,CAAA;AAC3D;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knownPluginPackages.cjs.js","sources":["../../../../cli-internal/src/knownPluginPackages.ts"],"sourcesContent":["/*\n * Copyright 2025 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\nconst knownBackendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'events',\n 'kubernetes',\n 'notifications',\n 'permission',\n 'proxy',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n// Only includes plugin IDs that have a corresponding frontend package; some plugins are backend-only and not listed here.\nconst knownFrontendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'kubernetes',\n 'notifications',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n/**\n * Maps known plugin IDs to their corresponding backend package names.\n */\nexport const knownBackendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownBackendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}-backend`,\n ]),\n );\n\n/**\n * Maps known plugin IDs to their corresponding frontend package names.\n */\nexport const knownFrontendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownFrontendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}`,\n ]),\n );\n"],"names":[],"mappings":";;AAgBA,MAAM,qBAAA,GAAwB;AAAA,EAC5B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAGA,MAAM,sBAAA,GAAyB;AAAA,EAC7B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAME,MAAA,CAAO,WAAA;AAAA,EACL,qBAAA,CAAsB,IAAI,CAAA,QAAA,KAAY;AAAA,IACpC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA,QAAA;AAAA,GAC9B;AACH;AAMA,MAAA,CAAO,WAAA;AAAA,EACL,sBAAA,CAAuB,IAAI,CAAA,QAAA,KAAY;AAAA,IACrC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA;AAAA,GAC9B;AACH
|
|
1
|
+
{"version":3,"file":"knownPluginPackages.cjs.js","sources":["../../../../cli-internal/src/knownPluginPackages.ts"],"sourcesContent":["/*\n * Copyright 2025 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\nconst knownBackendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'events',\n 'kubernetes',\n 'notifications',\n 'permission',\n 'proxy',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n// Only includes plugin IDs that have a corresponding frontend package; some plugins are backend-only and not listed here.\nconst knownFrontendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'kubernetes',\n 'notifications',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n/**\n * Maps known plugin IDs to their corresponding backend package names.\n */\nexport const knownBackendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownBackendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}-backend`,\n ]),\n );\n\n/**\n * Maps known plugin IDs to their corresponding frontend package names.\n */\nexport const knownFrontendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownFrontendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}`,\n ]),\n );\n"],"names":[],"mappings":";;AAgBA,MAAM,qBAAA,GAAwB;AAAA,EAC5B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAGA,MAAM,sBAAA,GAAyB;AAAA,EAC7B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAME,MAAA,CAAO,WAAA;AAAA,EACL,qBAAA,CAAsB,IAAI,CAAA,QAAA,KAAY;AAAA,IACpC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA,QAAA;AAAA,GAC9B;AACH;AAMA,MAAA,CAAO,WAAA;AAAA,EACL,sBAAA,CAAuB,IAAI,CAAA,QAAA,KAAY;AAAA,IACrC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA;AAAA,GAC9B;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandGraph.cjs.js","sources":["../../src/cli-module/CommandGraph.ts"],"sourcesContent":["/*\n * Copyright 2026 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 OpaqueCliModule,\n OpaqueCommandLeafNode,\n OpaqueCommandTreeNode,\n} from '@internal/cli';\nimport type { CommandNode } from '@internal/cli';\nimport type { CliCommand, CliModule } from './types';\n\nexport class CommandGraph {\n readonly #roots: CommandNode[] = [];\n\n get roots(): ReadonlyArray<CommandNode> {\n return this.#roots;\n }\n\n add(command: CliCommand, module: CliModule): void {\n const { path } = command;\n let current = this.#roots;\n\n for (let i = 0; i < path.length - 1; i++) {\n const name = path[i];\n let next = current.find(node => getNodeName(node) === name);\n\n if (!next) {\n next = OpaqueCommandTreeNode.createInstance('v1', {\n name,\n children: [],\n });\n current.push(next);\n } else if (OpaqueCommandLeafNode.isType(next)) {\n throw new Error(\n formatConflictError(\n path,\n module,\n OpaqueCommandLeafNode.toInternal(next).module,\n ),\n );\n }\n\n current = OpaqueCommandTreeNode.toInternal(next).children;\n }\n\n const name = path[path.length - 1];\n const existing = current.find(node => getNodeName(node) === name);\n if (existing) {\n throw new Error(\n formatConflictError(path, module, findNodeModule(existing)),\n );\n }\n\n current.push(\n OpaqueCommandLeafNode.createInstance('v1', {\n name,\n command,\n module,\n }),\n );\n }\n}\n\nfunction getNodeName(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).name;\n}\n\nfunction findNodeModule(node: CommandNode): CliModule | undefined {\n if (OpaqueCommandLeafNode.isType(node)) {\n return OpaqueCommandLeafNode.toInternal(node).module;\n }\n\n for (const child of OpaqueCommandTreeNode.toInternal(node).children) {\n const module = findNodeModule(child);\n if (module) {\n return module;\n }\n }\n\n return undefined;\n}\n\nfunction getModuleName(module?: CliModule): string | undefined {\n if (module && OpaqueCliModule.isType(module)) {\n return OpaqueCliModule.toInternal(module).packageName;\n }\n return undefined;\n}\n\nfunction formatConflictError(\n path: string[],\n newModule: CliModule,\n existingModule?: CliModule,\n): string {\n const command = path.join(' ');\n const newPackage = getModuleName(newModule);\n const existingPackage = getModuleName(existingModule);\n\n if (newPackage && existingPackage) {\n return `Command \"${command}\" from \"${newPackage}\" conflicts with an existing command from \"${existingPackage}\"`;\n }\n if (newPackage) {\n return `Command \"${command}\" from \"${newPackage}\" conflicts with an existing command`;\n }\n if (existingPackage) {\n return `Command \"${command}\" conflicts with an existing command from \"${existingPackage}\"`;\n }\n return `Command \"${command}\" conflicts with an existing command`;\n}\n"],"names":["name","OpaqueCommandTreeNode","OpaqueCommandLeafNode","OpaqueCliModule"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CommandGraph.cjs.js","sources":["../../src/cli-module/CommandGraph.ts"],"sourcesContent":["/*\n * Copyright 2026 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 OpaqueCliModule,\n OpaqueCommandLeafNode,\n OpaqueCommandTreeNode,\n} from '@internal/cli';\nimport type { CommandNode } from '@internal/cli';\nimport type { CliCommand, CliModule } from './types';\n\nexport class CommandGraph {\n readonly #roots: CommandNode[] = [];\n\n get roots(): ReadonlyArray<CommandNode> {\n return this.#roots;\n }\n\n add(command: CliCommand, module: CliModule): void {\n const { path } = command;\n let current = this.#roots;\n\n for (let i = 0; i < path.length - 1; i++) {\n const name = path[i];\n let next = current.find(node => getNodeName(node) === name);\n\n if (!next) {\n next = OpaqueCommandTreeNode.createInstance('v1', {\n name,\n children: [],\n });\n current.push(next);\n } else if (OpaqueCommandLeafNode.isType(next)) {\n throw new Error(\n formatConflictError(\n path,\n module,\n OpaqueCommandLeafNode.toInternal(next).module,\n ),\n );\n }\n\n current = OpaqueCommandTreeNode.toInternal(next).children;\n }\n\n const name = path[path.length - 1];\n const existing = current.find(node => getNodeName(node) === name);\n if (existing) {\n throw new Error(\n formatConflictError(path, module, findNodeModule(existing)),\n );\n }\n\n current.push(\n OpaqueCommandLeafNode.createInstance('v1', {\n name,\n command,\n module,\n }),\n );\n }\n}\n\nfunction getNodeName(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).name;\n}\n\nfunction findNodeModule(node: CommandNode): CliModule | undefined {\n if (OpaqueCommandLeafNode.isType(node)) {\n return OpaqueCommandLeafNode.toInternal(node).module;\n }\n\n for (const child of OpaqueCommandTreeNode.toInternal(node).children) {\n const module = findNodeModule(child);\n if (module) {\n return module;\n }\n }\n\n return undefined;\n}\n\nfunction getModuleName(module?: CliModule): string | undefined {\n if (module && OpaqueCliModule.isType(module)) {\n return OpaqueCliModule.toInternal(module).packageName;\n }\n return undefined;\n}\n\nfunction formatConflictError(\n path: string[],\n newModule: CliModule,\n existingModule?: CliModule,\n): string {\n const command = path.join(' ');\n const newPackage = getModuleName(newModule);\n const existingPackage = getModuleName(existingModule);\n\n if (newPackage && existingPackage) {\n return `Command \"${command}\" from \"${newPackage}\" conflicts with an existing command from \"${existingPackage}\"`;\n }\n if (newPackage) {\n return `Command \"${command}\" from \"${newPackage}\" conflicts with an existing command`;\n }\n if (existingPackage) {\n return `Command \"${command}\" conflicts with an existing command from \"${existingPackage}\"`;\n }\n return `Command \"${command}\" conflicts with an existing command`;\n}\n"],"names":["name","OpaqueCommandTreeNode","OpaqueCommandLeafNode","OpaqueCliModule"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createCliModule.cjs.js","sources":["../../src/cli-module/createCliModule.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 { OpaqueCliModule } from '@internal/cli';\nimport { CliCommand, CliModule } from './types';\n\n/**\n * Creates a new CLI plugin that provides commands to the Backstage CLI.\n *\n * The `init` callback is invoked immediately at creation time and is used\n * to register commands via the provided registry. The commands are then\n * made available to the CLI host once the returned promise resolves.\n *\n * @example\n * ```\n * import { createCliModule } from '@backstage/cli-node';\n * import packageJson from '../package.json';\n *\n * export default createCliModule({\n * packageJson,\n * init: async reg => {\n * reg.addCommand({\n * path: ['repo', 'test'],\n * description: 'Run tests across the repository',\n * execute: { loader: () => import('./commands/test') },\n * });\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createCliModule(options: {\n /** The `package.json` contents of the plugin package, used to identify the plugin. */\n packageJson: { name: string };\n /**\n * An initialization callback that registers commands with the CLI.\n * Called immediately when the plugin is created.\n */\n init: (registry: {\n /** Registers a new command with the CLI. */\n addCommand: (command: CliCommand) => void;\n }) => Promise<void>;\n}): CliModule {\n if (!options.packageJson.name) {\n throw new Error(\n 'The packageJson provided to createCliModule must have a name',\n );\n }\n\n const commands: CliCommand[] = [];\n const commandsPromise = Promise.resolve()\n .then(() => options.init({ addCommand: command => commands.push(command) }))\n .then(() => commands);\n\n return OpaqueCliModule.createInstance('v1', {\n packageName: options.packageJson.name,\n commands: commandsPromise,\n });\n}\n"],"names":["OpaqueCliModule"],"mappings":";;;;;;;;;AA6CO,SAAS,gBAAgB,OAAA,EAWlB;AACZ,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,eAAA,GAAkB,QAAQ,OAAA,EAAQ,CACrC,KAAK,MAAM,OAAA,CAAQ,KAAK,EAAE,UAAA,EAAY,aAAW,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,EAAG,CAAC,CAAA,CAC1E,IAAA,CAAK,MAAM,QAAQ,CAAA;AAEtB,EAAA,OAAOA,iCAAA,CAAgB,eAAe,IAAA,EAAM;AAAA,IAC1C,WAAA,EAAa,QAAQ,WAAA,CAAY,IAAA;AAAA,IACjC,QAAA,EAAU;AAAA,GACX,CAAA;AACH
|
|
1
|
+
{"version":3,"file":"createCliModule.cjs.js","sources":["../../src/cli-module/createCliModule.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 { OpaqueCliModule } from '@internal/cli';\nimport { CliCommand, CliModule } from './types';\n\n/**\n * Creates a new CLI plugin that provides commands to the Backstage CLI.\n *\n * The `init` callback is invoked immediately at creation time and is used\n * to register commands via the provided registry. The commands are then\n * made available to the CLI host once the returned promise resolves.\n *\n * @example\n * ```\n * import { createCliModule } from '@backstage/cli-node';\n * import packageJson from '../package.json';\n *\n * export default createCliModule({\n * packageJson,\n * init: async reg => {\n * reg.addCommand({\n * path: ['repo', 'test'],\n * description: 'Run tests across the repository',\n * execute: { loader: () => import('./commands/test') },\n * });\n * },\n * });\n * ```\n *\n * @public\n */\nexport function createCliModule(options: {\n /** The `package.json` contents of the plugin package, used to identify the plugin. */\n packageJson: { name: string };\n /**\n * An initialization callback that registers commands with the CLI.\n * Called immediately when the plugin is created.\n */\n init: (registry: {\n /** Registers a new command with the CLI. */\n addCommand: (command: CliCommand) => void;\n }) => Promise<void>;\n}): CliModule {\n if (!options.packageJson.name) {\n throw new Error(\n 'The packageJson provided to createCliModule must have a name',\n );\n }\n\n const commands: CliCommand[] = [];\n const commandsPromise = Promise.resolve()\n .then(() => options.init({ addCommand: command => commands.push(command) }))\n .then(() => commands);\n\n return OpaqueCliModule.createInstance('v1', {\n packageName: options.packageJson.name,\n commands: commandsPromise,\n });\n}\n"],"names":["OpaqueCliModule"],"mappings":";;;;;;;;;AA6CO,SAAS,gBAAgB,OAAA,EAWlB;AACZ,EAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,eAAA,GAAkB,QAAQ,OAAA,EAAQ,CACrC,KAAK,MAAM,OAAA,CAAQ,KAAK,EAAE,UAAA,EAAY,aAAW,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,EAAG,CAAC,CAAA,CAC1E,IAAA,CAAK,MAAM,QAAQ,CAAA;AAEtB,EAAA,OAAOA,iCAAA,CAAgB,eAAe,IAAA,EAAM;AAAA,IAC1C,WAAA,EAAa,QAAQ,WAAA,CAAY,IAAA;AAAA,IACjC,QAAA,EAAU;AAAA,GACX,CAAA;AACH;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runCli.cjs.js","sources":["../../src/cli-module/runCli.ts"],"sourcesContent":["/*\n * Copyright 2026 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 OpaqueCliModule,\n OpaqueCommandLeafNode,\n OpaqueCommandTreeNode,\n isCommandNodeHidden,\n} from '@internal/cli';\nimport type { CommandNode } from '@internal/cli';\nimport { ForwardedError, isError, stringifyError } from '@backstage/errors';\nimport chalk from 'chalk';\nimport { cli, command } from 'cleye';\nimport type { Renderers } from 'cleye';\nimport { CommandGraph } from './CommandGraph';\nimport type { CliCommand, CliModule } from './types';\n\ninterface HelpNode {\n id?: string;\n type: keyof Renderers;\n data: unknown;\n}\n\ninterface CommandsHelpData {\n body: {\n data: {\n tableData: string[][];\n };\n };\n}\n\nfunction exit(message: string, code: number = 1): never {\n process.stderr.write(`\\n${chalk.red(message)}\\n\\n`);\n process.exit(code);\n}\n\nfunction exitWithError(error: unknown): never {\n if (!isError(error)) {\n return exit(stringifyError(error));\n }\n\n switch (error.name) {\n case 'InputError':\n return exit(error.message, 74 /* input/output error */);\n case 'NotFoundError':\n return exit(error.message, 127 /* command not found */);\n case 'NotImplementedError':\n return exit(error.message, 64 /* command line usage error */);\n case 'AuthenticationError':\n case 'NotAllowedError':\n return exit(error.message, 77 /* permission denied */);\n case 'ExitCodeError':\n return exit(\n error.message,\n 'code' in error && typeof error.code === 'number' ? error.code : 1,\n );\n default:\n return exit(\n stringifyError(error),\n 'code' in error && typeof error.code === 'number' ? error.code : 1,\n );\n }\n}\n\nfunction getNodeName(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).name;\n}\n\nfunction getNodeDescription(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).command.description;\n}\n\nfunction createHelpOptions(options: {\n nodes: ReadonlyArray<CommandNode>;\n includeHelpCommand: boolean;\n version?: string;\n}) {\n const { nodes, includeHelpCommand, version } = options;\n const visibleNodes = nodes.filter(node => !isCommandNodeHidden(node));\n\n return {\n version,\n render(nodesToRender: HelpNode[], renderers: Renderers) {\n const commandsNode = nodesToRender.find(node => node.id === 'commands');\n if (commandsNode) {\n const commandRows = visibleNodes.map(node => [\n getNodeName(node),\n getNodeDescription(node),\n ]);\n if (includeHelpCommand) {\n commandRows.push(['help', 'Display help for command']);\n }\n (commandsNode.data as CommandsHelpData).body.data.tableData =\n commandRows;\n }\n return renderers.render(nodesToRender);\n },\n };\n}\n\nasync function executeCommand(\n commandToExecute: CliCommand,\n args: string[],\n programName: string,\n): Promise<void> {\n const context = {\n args,\n info: {\n usage: [programName, ...commandToExecute.path].join(' '),\n name: commandToExecute.path.join(' '),\n },\n };\n\n if (typeof commandToExecute.execute === 'function') {\n await commandToExecute.execute(context);\n } else {\n const mod = await commandToExecute.execute.loader();\n const fn =\n typeof mod.default === 'function'\n ? mod.default\n : (mod.default as any).default;\n await fn(context);\n }\n}\n\nasync function runCommandLevel(options: {\n nodes: ReadonlyArray<CommandNode>;\n argv: string[];\n programName: string;\n commandPath?: string[];\n version?: string;\n}): Promise<void> {\n const { nodes, argv, programName, commandPath = [], version } = options;\n const name = [programName, ...commandPath].join(' ');\n const commandArgs = argv.slice(1);\n const commands = nodes.map(node =>\n command(\n {\n name: getNodeName(node),\n help: false,\n },\n async () => {\n try {\n if (OpaqueCommandTreeNode.isType(node)) {\n await runCommandLevel({\n nodes: OpaqueCommandTreeNode.toInternal(node).children,\n argv: commandArgs,\n programName,\n commandPath: [...commandPath, getNodeName(node)],\n version,\n });\n } else {\n await executeCommand(\n OpaqueCommandLeafNode.toInternal(node).command,\n commandArgs,\n programName,\n );\n process.exit(0);\n }\n } catch (error: unknown) {\n exitWithError(error);\n }\n },\n ),\n );\n const includeHelpCommand = !nodes.some(node => getNodeName(node) === 'help');\n if (includeHelpCommand && nodes.length > 0) {\n commands.push(\n command(\n {\n name: 'help',\n parameters: ['[command...]'],\n help: false,\n },\n async () => {\n await runCommandLevel({\n nodes,\n argv: [...commandArgs, '--help'],\n programName,\n commandPath,\n version,\n });\n },\n ),\n );\n }\n\n await cli(\n {\n name,\n flags: version\n ? {\n version: {\n type: Boolean,\n alias: 'V',\n description: 'Show version',\n },\n }\n : undefined,\n commands,\n help: createHelpOptions({\n nodes,\n includeHelpCommand: includeHelpCommand && nodes.length > 0,\n version,\n }),\n },\n parsed => {\n if (version && parsed.flags.version) {\n console.log(version);\n process.exit(0);\n return;\n }\n\n if (argv.length === 0) {\n return;\n }\n\n console.log();\n console.log(\n chalk.red(`Invalid command: ${[...commandPath, ...argv].join(' ')}`),\n );\n console.log();\n parsed.showHelp();\n process.exit(1);\n },\n [...argv],\n );\n}\n\nfunction handleUnhandledRejection(rejection: unknown): void {\n exitWithError(new ForwardedError('Unhandled rejection', rejection));\n}\n\nfunction hasVersionFlag(args: string[]): boolean {\n const separatorIndex = args.indexOf('--');\n const options = separatorIndex === -1 ? args : args.slice(0, separatorIndex);\n return options.includes('-V') || options.includes('--version');\n}\n\n/**\n * Runs a collection of CLI modules as an executable program.\n *\n * This is intended for creating custom CLI packages from a fixed set of\n * directly imported modules. Module discovery and override behavior are left\n * to the caller.\n *\n * @example\n * ```ts\n * import { runCli } from '@backstage/cli-node';\n * import buildModule from '@backstage/cli-module-build';\n * import testModule from '@backstage/cli-module-test-jest';\n * import packageJson from '../package.json';\n *\n * runCli({\n * modules: [buildModule, testModule],\n * name: packageJson.name,\n * version: packageJson.version,\n * });\n * ```\n *\n * @public\n */\nexport async function runCli(options: {\n /** The CLI modules whose commands are included in the program. */\n modules: ReadonlyArray<CliModule>;\n /** The program name shown in help output and usage strings. */\n name: string;\n /** The version string shown when `--version` is passed. */\n version?: string;\n}): Promise<void> {\n const { modules, name, version } = options;\n const graph = new CommandGraph();\n\n for (const module of modules) {\n if (!OpaqueCliModule.isType(module)) {\n throw new Error(\n `Invalid CLI module: expected a module created with createCliModule`,\n );\n }\n\n for (const commandToAdd of await OpaqueCliModule.toInternal(module)\n .commands) {\n graph.add(commandToAdd, module);\n }\n }\n\n if (\n !process.listeners('unhandledRejection').includes(handleUnhandledRejection)\n ) {\n process.on('unhandledRejection', handleUnhandledRejection);\n }\n\n const args = process.argv.slice(2);\n if (version && hasVersionFlag(args)) {\n console.log(version);\n process.exit(0);\n return;\n }\n\n await runCommandLevel({\n nodes: graph.roots,\n argv: args,\n programName: name,\n version,\n });\n}\n"],"names":["chalk","isError","stringifyError","OpaqueCommandTreeNode","OpaqueCommandLeafNode","isCommandNodeHidden","command","cli","ForwardedError","CommandGraph","OpaqueCliModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runCli.cjs.js","sources":["../../src/cli-module/runCli.ts"],"sourcesContent":["/*\n * Copyright 2026 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 OpaqueCliModule,\n OpaqueCommandLeafNode,\n OpaqueCommandTreeNode,\n isCommandNodeHidden,\n} from '@internal/cli';\nimport type { CommandNode } from '@internal/cli';\nimport { ForwardedError, isError, stringifyError } from '@backstage/errors';\nimport chalk from 'chalk';\nimport { cli, command } from 'cleye';\nimport type { Renderers } from 'cleye';\nimport { CommandGraph } from './CommandGraph';\nimport type { CliCommand, CliModule } from './types';\n\ninterface HelpNode {\n id?: string;\n type: keyof Renderers;\n data: unknown;\n}\n\ninterface CommandsHelpData {\n body: {\n data: {\n tableData: string[][];\n };\n };\n}\n\nfunction exit(message: string, code: number = 1): never {\n process.stderr.write(`\\n${chalk.red(message)}\\n\\n`);\n process.exit(code);\n}\n\nfunction exitWithError(error: unknown): never {\n if (!isError(error)) {\n return exit(stringifyError(error));\n }\n\n switch (error.name) {\n case 'InputError':\n return exit(error.message, 74 /* input/output error */);\n case 'NotFoundError':\n return exit(error.message, 127 /* command not found */);\n case 'NotImplementedError':\n return exit(error.message, 64 /* command line usage error */);\n case 'AuthenticationError':\n case 'NotAllowedError':\n return exit(error.message, 77 /* permission denied */);\n case 'ExitCodeError':\n return exit(\n error.message,\n 'code' in error && typeof error.code === 'number' ? error.code : 1,\n );\n default:\n return exit(\n stringifyError(error),\n 'code' in error && typeof error.code === 'number' ? error.code : 1,\n );\n }\n}\n\nfunction getNodeName(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).name;\n}\n\nfunction getNodeDescription(node: CommandNode): string {\n if (OpaqueCommandTreeNode.isType(node)) {\n return OpaqueCommandTreeNode.toInternal(node).name;\n }\n return OpaqueCommandLeafNode.toInternal(node).command.description;\n}\n\nfunction createHelpOptions(options: {\n nodes: ReadonlyArray<CommandNode>;\n includeHelpCommand: boolean;\n version?: string;\n}) {\n const { nodes, includeHelpCommand, version } = options;\n const visibleNodes = nodes.filter(node => !isCommandNodeHidden(node));\n\n return {\n version,\n render(nodesToRender: HelpNode[], renderers: Renderers) {\n const commandsNode = nodesToRender.find(node => node.id === 'commands');\n if (commandsNode) {\n const commandRows = visibleNodes.map(node => [\n getNodeName(node),\n getNodeDescription(node),\n ]);\n if (includeHelpCommand) {\n commandRows.push(['help', 'Display help for command']);\n }\n (commandsNode.data as CommandsHelpData).body.data.tableData =\n commandRows;\n }\n return renderers.render(nodesToRender);\n },\n };\n}\n\nasync function executeCommand(\n commandToExecute: CliCommand,\n args: string[],\n programName: string,\n): Promise<void> {\n const context = {\n args,\n info: {\n usage: [programName, ...commandToExecute.path].join(' '),\n name: commandToExecute.path.join(' '),\n },\n };\n\n if (typeof commandToExecute.execute === 'function') {\n await commandToExecute.execute(context);\n } else {\n const mod = await commandToExecute.execute.loader();\n const fn =\n typeof mod.default === 'function'\n ? mod.default\n : (mod.default as any).default;\n await fn(context);\n }\n}\n\nasync function runCommandLevel(options: {\n nodes: ReadonlyArray<CommandNode>;\n argv: string[];\n programName: string;\n commandPath?: string[];\n version?: string;\n}): Promise<void> {\n const { nodes, argv, programName, commandPath = [], version } = options;\n const name = [programName, ...commandPath].join(' ');\n const commandArgs = argv.slice(1);\n const commands = nodes.map(node =>\n command(\n {\n name: getNodeName(node),\n help: false,\n },\n async () => {\n try {\n if (OpaqueCommandTreeNode.isType(node)) {\n await runCommandLevel({\n nodes: OpaqueCommandTreeNode.toInternal(node).children,\n argv: commandArgs,\n programName,\n commandPath: [...commandPath, getNodeName(node)],\n version,\n });\n } else {\n await executeCommand(\n OpaqueCommandLeafNode.toInternal(node).command,\n commandArgs,\n programName,\n );\n process.exit(0);\n }\n } catch (error: unknown) {\n exitWithError(error);\n }\n },\n ),\n );\n const includeHelpCommand = !nodes.some(node => getNodeName(node) === 'help');\n if (includeHelpCommand && nodes.length > 0) {\n commands.push(\n command(\n {\n name: 'help',\n parameters: ['[command...]'],\n help: false,\n },\n async () => {\n await runCommandLevel({\n nodes,\n argv: [...commandArgs, '--help'],\n programName,\n commandPath,\n version,\n });\n },\n ),\n );\n }\n\n await cli(\n {\n name,\n flags: version\n ? {\n version: {\n type: Boolean,\n alias: 'V',\n description: 'Show version',\n },\n }\n : undefined,\n commands,\n help: createHelpOptions({\n nodes,\n includeHelpCommand: includeHelpCommand && nodes.length > 0,\n version,\n }),\n },\n parsed => {\n if (version && parsed.flags.version) {\n console.log(version);\n process.exit(0);\n return;\n }\n\n if (argv.length === 0) {\n return;\n }\n\n console.log();\n console.log(\n chalk.red(`Invalid command: ${[...commandPath, ...argv].join(' ')}`),\n );\n console.log();\n parsed.showHelp();\n process.exit(1);\n },\n [...argv],\n );\n}\n\nfunction handleUnhandledRejection(rejection: unknown): void {\n exitWithError(new ForwardedError('Unhandled rejection', rejection));\n}\n\nfunction hasVersionFlag(args: string[]): boolean {\n const separatorIndex = args.indexOf('--');\n const options = separatorIndex === -1 ? args : args.slice(0, separatorIndex);\n return options.includes('-V') || options.includes('--version');\n}\n\n/**\n * Runs a collection of CLI modules as an executable program.\n *\n * This is intended for creating custom CLI packages from a fixed set of\n * directly imported modules. Module discovery and override behavior are left\n * to the caller.\n *\n * @example\n * ```ts\n * import { runCli } from '@backstage/cli-node';\n * import buildModule from '@backstage/cli-module-build';\n * import testModule from '@backstage/cli-module-test-jest';\n * import packageJson from '../package.json';\n *\n * runCli({\n * modules: [buildModule, testModule],\n * name: packageJson.name,\n * version: packageJson.version,\n * });\n * ```\n *\n * @public\n */\nexport async function runCli(options: {\n /** The CLI modules whose commands are included in the program. */\n modules: ReadonlyArray<CliModule>;\n /** The program name shown in help output and usage strings. */\n name: string;\n /** The version string shown when `--version` is passed. */\n version?: string;\n}): Promise<void> {\n const { modules, name, version } = options;\n const graph = new CommandGraph();\n\n for (const module of modules) {\n if (!OpaqueCliModule.isType(module)) {\n throw new Error(\n `Invalid CLI module: expected a module created with createCliModule`,\n );\n }\n\n for (const commandToAdd of await OpaqueCliModule.toInternal(module)\n .commands) {\n graph.add(commandToAdd, module);\n }\n }\n\n if (\n !process.listeners('unhandledRejection').includes(handleUnhandledRejection)\n ) {\n process.on('unhandledRejection', handleUnhandledRejection);\n }\n\n const args = process.argv.slice(2);\n if (version && hasVersionFlag(args)) {\n console.log(version);\n process.exit(0);\n return;\n }\n\n await runCommandLevel({\n nodes: graph.roots,\n argv: args,\n programName: name,\n version,\n });\n}\n"],"names":["chalk","isError","stringifyError","OpaqueCommandTreeNode","OpaqueCommandLeafNode","isCommandNodeHidden","command","cli","ForwardedError","CommandGraph","OpaqueCliModule"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runCliModule.cjs.js","sources":["../../src/cli-module/runCliModule.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 type { CliModule } from './types';\nimport { runCli } from './runCli';\n\n/**\n * Runs a CLI module as a standalone program.\n *\n * @deprecated Use {@link runCli} with a single entry in the `modules` array instead.\n * @public\n */\nexport async function runCliModule(options: {\n /** The CLI module to run. */\n module: CliModule;\n /** The program name shown in help output and usage strings. */\n name: string;\n /** The version string shown when `--version` is passed. */\n version?: string;\n}): Promise<void> {\n const { module: cliModule, name, version } = options;\n\n return runCli({\n modules: [cliModule],\n name,\n version,\n });\n}\n"],"names":["runCli"],"mappings":";;;;AAyBA,eAAsB,aAAa,OAAA,EAOjB;AAChB,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,SAAQ,GAAI,OAAA;AAE7C,EAAA,OAAOA,aAAA,CAAO;AAAA,IACZ,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,IACnB,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH
|
|
1
|
+
{"version":3,"file":"runCliModule.cjs.js","sources":["../../src/cli-module/runCliModule.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 type { CliModule } from './types';\nimport { runCli } from './runCli';\n\n/**\n * Runs a CLI module as a standalone program.\n *\n * @deprecated Use {@link runCli} with a single entry in the `modules` array instead.\n * @public\n */\nexport async function runCliModule(options: {\n /** The CLI module to run. */\n module: CliModule;\n /** The program name shown in help output and usage strings. */\n name: string;\n /** The version string shown when `--version` is passed. */\n version?: string;\n}): Promise<void> {\n const { module: cliModule, name, version } = options;\n\n return runCli({\n modules: [cliModule],\n name,\n version,\n });\n}\n"],"names":["runCli"],"mappings":";;;;AAyBA,eAAsB,aAAa,OAAA,EAOjB;AAChB,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,SAAQ,GAAI,OAAA;AAE7C,EAAA,OAAOA,aAAA,CAAO;AAAA,IACZ,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,IACnB,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concurrency.cjs.js","sources":["../../src/concurrency/concurrency.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 os from 'node:os';\n\nconst defaultConcurrency = Math.max(Math.ceil(os.cpus().length / 2), 1);\n\nconst CONCURRENCY_ENV_VAR = 'BACKSTAGE_CLI_CONCURRENCY';\nconst DEPRECATED_CONCURRENCY_ENV_VAR = 'BACKSTAGE_CLI_BUILD_PARALLEL';\n\ntype ConcurrencyOption = boolean | string | number | null | undefined;\n\nfunction parseConcurrencyOption(value: ConcurrencyOption): number {\n if (value === undefined || value === null) {\n return defaultConcurrency;\n } else if (typeof value === 'boolean') {\n return value ? defaultConcurrency : 1;\n } else if (typeof value === 'number' && Number.isInteger(value)) {\n if (value < 1) {\n return 1;\n }\n return value;\n } else if (typeof value === 'string') {\n if (value === 'true') {\n return parseConcurrencyOption(true);\n } else if (value === 'false') {\n return parseConcurrencyOption(false);\n }\n const parsed = Number(value);\n if (Number.isInteger(parsed)) {\n return parseConcurrencyOption(parsed);\n }\n }\n\n throw Error(\n `Concurrency option value '${value}' is not a boolean or integer`,\n );\n}\n\nlet hasWarnedDeprecation = false;\n\n/** @internal */\nexport function getEnvironmentConcurrency() {\n if (process.env[CONCURRENCY_ENV_VAR] !== undefined) {\n return parseConcurrencyOption(process.env[CONCURRENCY_ENV_VAR]);\n }\n if (process.env[DEPRECATED_CONCURRENCY_ENV_VAR] !== undefined) {\n if (!hasWarnedDeprecation) {\n hasWarnedDeprecation = true;\n console.warn(\n `The ${DEPRECATED_CONCURRENCY_ENV_VAR} environment variable is deprecated, use ${CONCURRENCY_ENV_VAR} instead`,\n );\n }\n return parseConcurrencyOption(process.env[DEPRECATED_CONCURRENCY_ENV_VAR]);\n }\n return defaultConcurrency;\n}\n"],"names":["os"],"mappings":";;;;;;;;AAkBA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAKA,mBAAA,CAAG,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,EAAG,CAAC,CAAA;AAEtE,MAAM,mBAAA,GAAsB,2BAAA;AAC5B,MAAM,8BAAA,GAAiC,8BAAA;AAIvC,SAAS,uBAAuB,KAAA,EAAkC;AAChE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,SAAA,EAAW;AACrC,IAAA,OAAO,QAAQ,kBAAA,GAAqB,CAAA;AAAA,EACtC,WAAW,OAAO,KAAA,KAAU,YAAY,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC/D,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,uBAAuB,IAAI,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,OAAO,uBAAuB,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC5B,MAAA,OAAO,uBAAuB,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,MAAM,KAAA;AAAA,IACJ,6BAA6B,KAAK,CAAA,6BAAA;AAAA,GACpC;AACF;AAEA,IAAI,oBAAA,GAAuB,KAAA;AAGpB,SAAS,yBAAA,GAA4B;AAC1C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,KAAM,MAAA,EAAW;AAClD,IAAA,OAAO,sBAAA,CAAuB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,8BAA8B,CAAA,KAAM,MAAA,EAAW;AAC7D,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,oBAAA,GAAuB,IAAA;AACvB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,IAAA,EAAO,8BAA8B,CAAA,yCAAA,EAA4C,mBAAmB,CAAA,QAAA;AAAA,OACtG;AAAA,IACF;AACA,IAAA,OAAO,sBAAA,CAAuB,OAAA,CAAQ,GAAA,CAAI,8BAA8B,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,kBAAA;AACT
|
|
1
|
+
{"version":3,"file":"concurrency.cjs.js","sources":["../../src/concurrency/concurrency.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 os from 'node:os';\n\nconst defaultConcurrency = Math.max(Math.ceil(os.cpus().length / 2), 1);\n\nconst CONCURRENCY_ENV_VAR = 'BACKSTAGE_CLI_CONCURRENCY';\nconst DEPRECATED_CONCURRENCY_ENV_VAR = 'BACKSTAGE_CLI_BUILD_PARALLEL';\n\ntype ConcurrencyOption = boolean | string | number | null | undefined;\n\nfunction parseConcurrencyOption(value: ConcurrencyOption): number {\n if (value === undefined || value === null) {\n return defaultConcurrency;\n } else if (typeof value === 'boolean') {\n return value ? defaultConcurrency : 1;\n } else if (typeof value === 'number' && Number.isInteger(value)) {\n if (value < 1) {\n return 1;\n }\n return value;\n } else if (typeof value === 'string') {\n if (value === 'true') {\n return parseConcurrencyOption(true);\n } else if (value === 'false') {\n return parseConcurrencyOption(false);\n }\n const parsed = Number(value);\n if (Number.isInteger(parsed)) {\n return parseConcurrencyOption(parsed);\n }\n }\n\n throw Error(\n `Concurrency option value '${value}' is not a boolean or integer`,\n );\n}\n\nlet hasWarnedDeprecation = false;\n\n/** @internal */\nexport function getEnvironmentConcurrency() {\n if (process.env[CONCURRENCY_ENV_VAR] !== undefined) {\n return parseConcurrencyOption(process.env[CONCURRENCY_ENV_VAR]);\n }\n if (process.env[DEPRECATED_CONCURRENCY_ENV_VAR] !== undefined) {\n if (!hasWarnedDeprecation) {\n hasWarnedDeprecation = true;\n console.warn(\n `The ${DEPRECATED_CONCURRENCY_ENV_VAR} environment variable is deprecated, use ${CONCURRENCY_ENV_VAR} instead`,\n );\n }\n return parseConcurrencyOption(process.env[DEPRECATED_CONCURRENCY_ENV_VAR]);\n }\n return defaultConcurrency;\n}\n"],"names":["os"],"mappings":";;;;;;;;AAkBA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAKA,mBAAA,CAAG,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,EAAG,CAAC,CAAA;AAEtE,MAAM,mBAAA,GAAsB,2BAAA;AAC5B,MAAM,8BAAA,GAAiC,8BAAA;AAIvC,SAAS,uBAAuB,KAAA,EAAkC;AAChE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,SAAA,EAAW;AACrC,IAAA,OAAO,QAAQ,kBAAA,GAAqB,CAAA;AAAA,EACtC,WAAW,OAAO,KAAA,KAAU,YAAY,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC/D,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,uBAAuB,IAAI,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,OAAO,uBAAuB,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,IAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC5B,MAAA,OAAO,uBAAuB,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,MAAM,KAAA;AAAA,IACJ,6BAA6B,KAAK,CAAA,6BAAA;AAAA,GACpC;AACF;AAEA,IAAI,oBAAA,GAAuB,KAAA;AAGpB,SAAS,yBAAA,GAA4B;AAC1C,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,KAAM,MAAA,EAAW;AAClD,IAAA,OAAO,sBAAA,CAAuB,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,8BAA8B,CAAA,KAAM,MAAA,EAAW;AAC7D,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,oBAAA,GAAuB,IAAA;AACvB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,IAAA,EAAO,8BAA8B,CAAA,yCAAA,EAA4C,mBAAmB,CAAA,QAAA;AAAA,OACtG;AAAA,IACF;AACA,IAAA,OAAO,sBAAA,CAAuB,OAAA,CAAQ,GAAA,CAAI,8BAA8B,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,kBAAA;AACT;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runConcurrentTasks.cjs.js","sources":["../../src/concurrency/runConcurrentTasks.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 { getEnvironmentConcurrency } from './concurrency';\n\n/**\n * Options for {@link runConcurrentTasks}.\n *\n * @public\n */\nexport type ConcurrentTasksOptions<TItem> = {\n /**\n * Decides the number of concurrent workers by multiplying\n * this with the configured concurrency.\n *\n * Defaults to 1.\n */\n concurrencyFactor?: number;\n items: Iterable<TItem>;\n worker: (item: TItem) => Promise<void>;\n};\n\n/**\n * Runs items through a worker function concurrently across multiple async workers.\n *\n * @public\n */\nexport async function runConcurrentTasks<TItem>(\n options: ConcurrentTasksOptions<TItem>,\n): Promise<void> {\n const { concurrencyFactor = 1, items, worker } = options;\n const concurrency = getEnvironmentConcurrency();\n\n const sharedIterator = items[Symbol.iterator]();\n const sharedIterable = {\n [Symbol.iterator]: () => sharedIterator,\n };\n\n const workerCount = Math.max(Math.floor(concurrencyFactor * concurrency), 1);\n await Promise.all(\n Array(workerCount)\n .fill(0)\n .map(async () => {\n for (const value of sharedIterable) {\n await worker(value);\n }\n }),\n );\n}\n"],"names":["concurrency","getEnvironmentConcurrency"],"mappings":";;;;AAwCA,eAAsB,mBACpB,OAAA,EACe;AACf,EAAA,MAAM,EAAE,iBAAA,GAAoB,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,OAAA;AACjD,EAAA,MAAMA,gBAAcC,qCAAA,EAA0B;AAE9C,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAC9C,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,CAAC,MAAA,CAAO,QAAQ,GAAG,MAAM;AAAA,GAC3B;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,iBAAA,GAAoBD,aAAW,GAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,MAAM,WAAW,CAAA,CACd,KAAK,CAAC,CAAA,CACN,IAAI,YAAY;AACf,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,OAAO,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,GACL;AACF
|
|
1
|
+
{"version":3,"file":"runConcurrentTasks.cjs.js","sources":["../../src/concurrency/runConcurrentTasks.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 { getEnvironmentConcurrency } from './concurrency';\n\n/**\n * Options for {@link runConcurrentTasks}.\n *\n * @public\n */\nexport type ConcurrentTasksOptions<TItem> = {\n /**\n * Decides the number of concurrent workers by multiplying\n * this with the configured concurrency.\n *\n * Defaults to 1.\n */\n concurrencyFactor?: number;\n items: Iterable<TItem>;\n worker: (item: TItem) => Promise<void>;\n};\n\n/**\n * Runs items through a worker function concurrently across multiple async workers.\n *\n * @public\n */\nexport async function runConcurrentTasks<TItem>(\n options: ConcurrentTasksOptions<TItem>,\n): Promise<void> {\n const { concurrencyFactor = 1, items, worker } = options;\n const concurrency = getEnvironmentConcurrency();\n\n const sharedIterator = items[Symbol.iterator]();\n const sharedIterable = {\n [Symbol.iterator]: () => sharedIterator,\n };\n\n const workerCount = Math.max(Math.floor(concurrencyFactor * concurrency), 1);\n await Promise.all(\n Array(workerCount)\n .fill(0)\n .map(async () => {\n for (const value of sharedIterable) {\n await worker(value);\n }\n }),\n );\n}\n"],"names":["concurrency","getEnvironmentConcurrency"],"mappings":";;;;AAwCA,eAAsB,mBACpB,OAAA,EACe;AACf,EAAA,MAAM,EAAE,iBAAA,GAAoB,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,OAAA;AACjD,EAAA,MAAMA,gBAAcC,qCAAA,EAA0B;AAE9C,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAC9C,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,CAAC,MAAA,CAAO,QAAQ,GAAG,MAAM;AAAA,GAC3B;AAEA,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,iBAAA,GAAoBD,aAAW,GAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,MAAM,WAAW,CAAA,CACd,KAAK,CAAC,CAAA,CACN,IAAI,YAAY;AACf,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,OAAO,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,GACL;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runWorkerQueueThreads.cjs.js","sources":["../../src/concurrency/runWorkerQueueThreads.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 { ErrorLike } from '@backstage/errors';\nimport { Worker } from 'node:worker_threads';\nimport { getEnvironmentConcurrency } from './concurrency';\n\ntype WorkerThreadMessage =\n | {\n type: 'done';\n }\n | {\n type: 'item';\n index: number;\n item: unknown;\n }\n | {\n type: 'start';\n }\n | {\n type: 'result';\n index: number;\n result: unknown;\n }\n | {\n type: 'error';\n error: ErrorLike;\n };\n\n/**\n * Options for {@link runWorkerQueueThreads}.\n *\n * @public\n */\nexport type WorkerQueueThreadsOptions<TItem, TResult, TContext> = {\n /** The items to process */\n items: Iterable<TItem>;\n /**\n * A function that will be called within each worker thread at startup,\n * which should return the worker function that will be called for each item.\n *\n * This function must be defined as an arrow function or using the\n * function keyword, and must be entirely self contained, not referencing\n * any variables outside of its scope. This is because the function source\n * is stringified and evaluated in the worker thread.\n *\n * To pass data to the worker, use the `context` option and `items`, but\n * note that they are both copied by value into the worker thread, except for\n * types that are explicitly shareable across threads, such as `SharedArrayBuffer`.\n */\n workerFactory: (\n context: TContext,\n ) =>\n | ((item: TItem) => Promise<TResult>)\n | Promise<(item: TItem) => Promise<TResult>>;\n /** Context data supplied to each worker factory */\n context?: TContext;\n};\n\n/**\n * Spawns one or more worker threads using the `worker_threads` module.\n * Each thread processes one item at a time from the provided `options.items`.\n *\n * @public\n */\nexport async function runWorkerQueueThreads<TItem, TResult, TContext>(\n options: WorkerQueueThreadsOptions<TItem, TResult, TContext>,\n): Promise<{ results: TResult[] }> {\n const items = Array.from(options.items);\n const workerFactory = options.workerFactory;\n const workerData = options.context;\n const threadCount = Math.min(getEnvironmentConcurrency(), items.length);\n\n const iterator = items[Symbol.iterator]();\n const results = new Array<TResult>();\n let itemIndex = 0;\n\n await Promise.all(\n Array(threadCount)\n .fill(0)\n .map(async () => {\n const thread = new Worker(`(${workerQueueThread})(${workerFactory})`, {\n eval: true,\n workerData,\n });\n\n return new Promise<void>((resolve, reject) => {\n thread.on('message', (message: WorkerThreadMessage) => {\n if (message.type === 'start' || message.type === 'result') {\n if (message.type === 'result') {\n results[message.index] = message.result as TResult;\n }\n const { value, done } = iterator.next();\n if (done) {\n thread.postMessage({ type: 'done' });\n } else {\n thread.postMessage({\n type: 'item',\n index: itemIndex,\n item: value,\n });\n itemIndex += 1;\n }\n } else if (message.type === 'error') {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n error.stack = message.error.stack;\n reject(error);\n }\n });\n\n thread.on('error', reject);\n thread.on('exit', (code: number) => {\n if (code !== 0) {\n reject(new Error(`Worker thread exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n }),\n );\n\n return { results };\n}\n\n/* istanbul ignore next */\nfunction workerQueueThread(\n workerFuncFactory: (\n data: unknown,\n ) => Promise<(item: unknown) => Promise<unknown>>,\n) {\n const { parentPort, workerData } = require('node:worker_threads');\n\n Promise.resolve()\n .then(() => workerFuncFactory(workerData))\n .then(\n workerFunc => {\n parentPort.on('message', async (message: WorkerThreadMessage) => {\n if (message.type === 'done') {\n parentPort.close();\n return;\n }\n if (message.type === 'item') {\n try {\n const result = await workerFunc(message.item);\n parentPort.postMessage({\n type: 'result',\n index: message.index,\n result,\n });\n } catch (error) {\n parentPort.postMessage({ type: 'error', error });\n }\n }\n });\n\n parentPort.postMessage({ type: 'start' });\n },\n error => parentPort.postMessage({ type: 'error', error }),\n );\n}\n"],"names":["getEnvironmentConcurrency","Worker"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"runWorkerQueueThreads.cjs.js","sources":["../../src/concurrency/runWorkerQueueThreads.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 { ErrorLike } from '@backstage/errors';\nimport { Worker } from 'node:worker_threads';\nimport { getEnvironmentConcurrency } from './concurrency';\n\ntype WorkerThreadMessage =\n | {\n type: 'done';\n }\n | {\n type: 'item';\n index: number;\n item: unknown;\n }\n | {\n type: 'start';\n }\n | {\n type: 'result';\n index: number;\n result: unknown;\n }\n | {\n type: 'error';\n error: ErrorLike;\n };\n\n/**\n * Options for {@link runWorkerQueueThreads}.\n *\n * @public\n */\nexport type WorkerQueueThreadsOptions<TItem, TResult, TContext> = {\n /** The items to process */\n items: Iterable<TItem>;\n /**\n * A function that will be called within each worker thread at startup,\n * which should return the worker function that will be called for each item.\n *\n * This function must be defined as an arrow function or using the\n * function keyword, and must be entirely self contained, not referencing\n * any variables outside of its scope. This is because the function source\n * is stringified and evaluated in the worker thread.\n *\n * To pass data to the worker, use the `context` option and `items`, but\n * note that they are both copied by value into the worker thread, except for\n * types that are explicitly shareable across threads, such as `SharedArrayBuffer`.\n */\n workerFactory: (\n context: TContext,\n ) =>\n | ((item: TItem) => Promise<TResult>)\n | Promise<(item: TItem) => Promise<TResult>>;\n /** Context data supplied to each worker factory */\n context?: TContext;\n};\n\n/**\n * Spawns one or more worker threads using the `worker_threads` module.\n * Each thread processes one item at a time from the provided `options.items`.\n *\n * @public\n */\nexport async function runWorkerQueueThreads<TItem, TResult, TContext>(\n options: WorkerQueueThreadsOptions<TItem, TResult, TContext>,\n): Promise<{ results: TResult[] }> {\n const items = Array.from(options.items);\n const workerFactory = options.workerFactory;\n const workerData = options.context;\n const threadCount = Math.min(getEnvironmentConcurrency(), items.length);\n\n const iterator = items[Symbol.iterator]();\n const results = new Array<TResult>();\n let itemIndex = 0;\n\n await Promise.all(\n Array(threadCount)\n .fill(0)\n .map(async () => {\n const thread = new Worker(`(${workerQueueThread})(${workerFactory})`, {\n eval: true,\n workerData,\n });\n\n return new Promise<void>((resolve, reject) => {\n thread.on('message', (message: WorkerThreadMessage) => {\n if (message.type === 'start' || message.type === 'result') {\n if (message.type === 'result') {\n results[message.index] = message.result as TResult;\n }\n const { value, done } = iterator.next();\n if (done) {\n thread.postMessage({ type: 'done' });\n } else {\n thread.postMessage({\n type: 'item',\n index: itemIndex,\n item: value,\n });\n itemIndex += 1;\n }\n } else if (message.type === 'error') {\n const error = new Error(message.error.message);\n error.name = message.error.name;\n error.stack = message.error.stack;\n reject(error);\n }\n });\n\n thread.on('error', reject);\n thread.on('exit', (code: number) => {\n if (code !== 0) {\n reject(new Error(`Worker thread exited with code ${code}`));\n } else {\n resolve();\n }\n });\n });\n }),\n );\n\n return { results };\n}\n\n/* istanbul ignore next */\nfunction workerQueueThread(\n workerFuncFactory: (\n data: unknown,\n ) => Promise<(item: unknown) => Promise<unknown>>,\n) {\n const { parentPort, workerData } = require('node:worker_threads');\n\n Promise.resolve()\n .then(() => workerFuncFactory(workerData))\n .then(\n workerFunc => {\n parentPort.on('message', async (message: WorkerThreadMessage) => {\n if (message.type === 'done') {\n parentPort.close();\n return;\n }\n if (message.type === 'item') {\n try {\n const result = await workerFunc(message.item);\n parentPort.postMessage({\n type: 'result',\n index: message.index,\n result,\n });\n } catch (error) {\n parentPort.postMessage({ type: 'error', error });\n }\n }\n });\n\n parentPort.postMessage({ type: 'start' });\n },\n error => parentPort.postMessage({ type: 'error', error }),\n );\n}\n"],"names":["getEnvironmentConcurrency","Worker"],"mappings":";;;;;AA8EA,eAAsB,sBACpB,OAAA,EACiC;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AACtC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,aAAa,OAAA,CAAQ,OAAA;AAC3B,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAIA,qCAAA,EAA0B,EAAG,MAAM,MAAM,CAAA;AAEtE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AACxC,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,EAAe;AACnC,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,MAAM,WAAW,CAAA,CACd,KAAK,CAAC,CAAA,CACN,IAAI,YAAY;AACf,MAAA,MAAM,SAAS,IAAIC,0BAAA,CAAO,IAAI,iBAAiB,CAAA,EAAA,EAAK,aAAa,CAAA,CAAA,CAAA,EAAK;AAAA,QACpE,IAAA,EAAM,IAAA;AAAA,QACN;AAAA,OACD,CAAA;AAED,MAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,QAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAC,OAAA,KAAiC;AACrD,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,OAAA,CAAQ,SAAS,QAAA,EAAU;AACzD,YAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,cAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA;AAAA,YACnC;AACA,YAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,SAAS,IAAA,EAAK;AACtC,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,MAAA,CAAO,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,YACrC,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,WAAA,CAAY;AAAA,gBACjB,IAAA,EAAM,MAAA;AAAA,gBACN,KAAA,EAAO,SAAA;AAAA,gBACP,IAAA,EAAM;AAAA,eACP,CAAA;AACD,cAAA,SAAA,IAAa,CAAA;AAAA,YACf;AAAA,UACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,OAAA,EAAS;AACnC,YAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC7C,YAAA,KAAA,CAAM,IAAA,GAAO,QAAQ,KAAA,CAAM,IAAA;AAC3B,YAAA,KAAA,CAAM,KAAA,GAAQ,QAAQ,KAAA,CAAM,KAAA;AAC5B,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UACd;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AACzB,QAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AAClC,UAAA,IAAI,SAAS,CAAA,EAAG;AACd,YAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,EAAE,CAAC,CAAA;AAAA,UAC5D,CAAA,MAAO;AACL,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAC;AAAA,GACL;AAEA,EAAA,OAAO,EAAE,OAAA,EAAQ;AACnB;AAGA,SAAS,kBACP,iBAAA,EAGA;AACA,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAW,GAAI,QAAQ,qBAAqB,CAAA;AAEhE,EAAA,OAAA,CAAQ,SAAQ,CACb,IAAA,CAAK,MAAM,iBAAA,CAAkB,UAAU,CAAC,CAAA,CACxC,IAAA;AAAA,IACC,CAAA,UAAA,KAAc;AACZ,MAAA,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,OAAO,OAAA,KAAiC;AAC/D,QAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,UAAA,UAAA,CAAW,KAAA,EAAM;AACjB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AAC5C,YAAA,UAAA,CAAW,WAAA,CAAY;AAAA,cACrB,IAAA,EAAM,QAAA;AAAA,cACN,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf;AAAA,aACD,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,UAAA,CAAW,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,UACjD;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,WAAS,UAAA,CAAW,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO;AAAA,GAC1D;AACJ;;"}
|
|
@@ -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 { ForwardedError, toError } from '@backstage/errors';\nimport { targetPaths } from '@backstage/cli-common';\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: targetPaths.rootDir,\n });\n return stdout.trim().split(/\\r\\n|\\r|\\n/);\n } catch (error) {\n const err = toError(error);\n if ('code' in err && typeof (err as { code?: number }).code === 'number') {\n const code = (err as { code?: number }).code;\n const stderr = (err 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: targetPaths.rootDir,\n });\n return stdout;\n }\n}\n"],"names":["runOutput","targetPaths","toError","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,qBAAA,CAAY;AAAA,KAClB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,YAAY,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAMC,eAAQ,KAAK,CAAA;AACzB,IAAA,IAAI,MAAA,IAAU,GAAA,IAAO,OAAQ,GAAA,CAA0B,SAAS,QAAA,EAAU;AACxE,MAAA,MAAM,OAAQ,GAAA,CAA0B,IAAA;AACxC,MAAA,MAAM,SAAU,GAAA,CAA4B,MAAA;AAC5C,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,qBAAA,CAAY;AAAA,KAClB,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 { ForwardedError, toError } from '@backstage/errors';\nimport { targetPaths } from '@backstage/cli-common';\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: targetPaths.rootDir,\n });\n return stdout.trim().split(/\\r\\n|\\r|\\n/);\n } catch (error) {\n const err = toError(error);\n if ('code' in err && typeof (err as { code?: number }).code === 'number') {\n const code = (err as { code?: number }).code;\n const stderr = (err 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: targetPaths.rootDir,\n });\n return stdout;\n }\n}\n"],"names":["runOutput","targetPaths","toError","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,qBAAA,CAAY;AAAA,KAClB,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM,YAAY,CAAA;AAAA,EACzC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,GAAA,GAAMC,eAAQ,KAAK,CAAA;AACzB,IAAA,IAAI,MAAA,IAAU,GAAA,IAAO,OAAQ,GAAA,CAA0B,SAAS,QAAA,EAAU;AACxE,MAAA,MAAM,OAAQ,GAAA,CAA0B,IAAA;AACxC,MAAA,MAAM,SAAU,GAAA,CAA4B,MAAA;AAC5C,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,qBAAA,CAAY;AAAA,KAClB,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -8,6 +8,7 @@ var runCliModule = require('./cli-module/runCliModule.cjs.js');
|
|
|
8
8
|
var runConcurrentTasks = require('./concurrency/runConcurrentTasks.cjs.js');
|
|
9
9
|
var runWorkerQueueThreads = require('./concurrency/runWorkerQueueThreads.cjs.js');
|
|
10
10
|
var GitUtils = require('./git/GitUtils.cjs.js');
|
|
11
|
+
var parseInput = require('./input/parseInput.cjs.js');
|
|
11
12
|
var isMonoRepo = require('./monorepo/isMonoRepo.cjs.js');
|
|
12
13
|
var PackageGraph = require('./monorepo/PackageGraph.cjs.js');
|
|
13
14
|
var Lockfile = require('./monorepo/Lockfile.cjs.js');
|
|
@@ -24,6 +25,8 @@ exports.runCliModule = runCliModule.runCliModule;
|
|
|
24
25
|
exports.runConcurrentTasks = runConcurrentTasks.runConcurrentTasks;
|
|
25
26
|
exports.runWorkerQueueThreads = runWorkerQueueThreads.runWorkerQueueThreads;
|
|
26
27
|
exports.GitUtils = GitUtils.GitUtils;
|
|
28
|
+
exports.parseCommaSeparatedList = parseInput.parseCommaSeparatedList;
|
|
29
|
+
exports.parseKeyValuePairs = parseInput.parseKeyValuePairs;
|
|
27
30
|
exports.isMonoRepo = isMonoRepo.isMonoRepo;
|
|
28
31
|
exports.PackageGraph = PackageGraph.PackageGraph;
|
|
29
32
|
exports.packageFeatureType = PackageGraph.packageFeatureType;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -336,6 +336,19 @@ declare class GitUtils {
|
|
|
336
336
|
static readFileAtRef(path: string, ref: string): Promise<string>;
|
|
337
337
|
}
|
|
338
338
|
|
|
339
|
+
/**
|
|
340
|
+
* Parses repeatable `key=value` CLI inputs into an object.
|
|
341
|
+
*
|
|
342
|
+
* @public
|
|
343
|
+
*/
|
|
344
|
+
declare function parseKeyValuePairs(pairs: string[] | undefined): Record<string, unknown> | undefined;
|
|
345
|
+
/**
|
|
346
|
+
* Parses a comma-separated CLI input into a list of non-empty strings.
|
|
347
|
+
*
|
|
348
|
+
* @public
|
|
349
|
+
*/
|
|
350
|
+
declare function parseCommaSeparatedList(value: string | undefined): string[] | undefined;
|
|
351
|
+
|
|
339
352
|
/**
|
|
340
353
|
* Returns true if the current project is a monorepo.
|
|
341
354
|
*
|
|
@@ -643,5 +656,5 @@ declare class Lockfile {
|
|
|
643
656
|
*/
|
|
644
657
|
declare function hasBackstageYarnPlugin(workspaceDir?: string): Promise<boolean>;
|
|
645
658
|
|
|
646
|
-
export { CliAuth, GitUtils, Lockfile, PackageGraph, PackageRoles, SuccessCache, createCliModule, hasBackstageYarnPlugin, isMonoRepo, packageFeatureType, runCli, runCliModule, runConcurrentTasks, runWorkerQueueThreads };
|
|
659
|
+
export { CliAuth, GitUtils, Lockfile, PackageGraph, PackageRoles, SuccessCache, createCliModule, hasBackstageYarnPlugin, isMonoRepo, packageFeatureType, parseCommaSeparatedList, parseKeyValuePairs, runCli, runCliModule, runConcurrentTasks, runWorkerQueueThreads };
|
|
647
660
|
export type { BackstagePackage, BackstagePackageFeatureType, BackstagePackageJson, CliAuthCreateOptions, CliCommand, CliCommandContext, CliModule, ConcurrentTasksOptions, LockfileDiff, LockfileDiffEntry, LockfileQueryEntry, PackageGraphNode, PackageOutputType, PackagePlatform, PackageRole, PackageRoleInfo, WorkerQueueThreadsOptions };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function coerceValue(value) {
|
|
4
|
+
if (value === "true") return true;
|
|
5
|
+
if (value === "false") return false;
|
|
6
|
+
if (value.trim() !== "" && !Number.isNaN(Number(value))) {
|
|
7
|
+
return Number(value);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function parseKeyValuePairs(pairs) {
|
|
12
|
+
if (!pairs || pairs.length === 0) return void 0;
|
|
13
|
+
const result = {};
|
|
14
|
+
for (const pair of pairs) {
|
|
15
|
+
if (pair.trimStart().startsWith("{")) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
"JSON object input is not supported; use repeatable key=value flags"
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
const separator = pair.indexOf("=");
|
|
21
|
+
if (separator <= 0) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
`Invalid "key=value" pair: "${pair}" (expected format: key=value)`
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
result[pair.slice(0, separator)] = coerceValue(pair.slice(separator + 1));
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
function parseCommaSeparatedList(value) {
|
|
31
|
+
if (!value) return void 0;
|
|
32
|
+
if (value.trimStart().startsWith("[")) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
"JSON list input is not supported; use comma-separated values"
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
const items = value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
38
|
+
return items.length > 0 ? items : void 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
exports.parseCommaSeparatedList = parseCommaSeparatedList;
|
|
42
|
+
exports.parseKeyValuePairs = parseKeyValuePairs;
|
|
43
|
+
//# sourceMappingURL=parseInput.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseInput.cjs.js","sources":["../../src/input/parseInput.ts"],"sourcesContent":["/*\n * Copyright 2026 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\nfunction coerceValue(value: string): unknown {\n if (value === 'true') return true;\n if (value === 'false') return false;\n if (value.trim() !== '' && !Number.isNaN(Number(value))) {\n return Number(value);\n }\n return value;\n}\n\n/**\n * Parses repeatable `key=value` CLI inputs into an object.\n *\n * @public\n */\nexport function parseKeyValuePairs(\n pairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n if (!pairs || pairs.length === 0) return undefined;\n\n const result: Record<string, unknown> = {};\n for (const pair of pairs) {\n if (pair.trimStart().startsWith('{')) {\n throw new Error(\n 'JSON object input is not supported; use repeatable key=value flags',\n );\n }\n const separator = pair.indexOf('=');\n if (separator <= 0) {\n throw new Error(\n `Invalid \"key=value\" pair: \"${pair}\" (expected format: key=value)`,\n );\n }\n result[pair.slice(0, separator)] = coerceValue(pair.slice(separator + 1));\n }\n\n return result;\n}\n\n/**\n * Parses a comma-separated CLI input into a list of non-empty strings.\n *\n * @public\n */\nexport function parseCommaSeparatedList(\n value: string | undefined,\n): string[] | undefined {\n if (!value) return undefined;\n if (value.trimStart().startsWith('[')) {\n throw new Error(\n 'JSON list input is not supported; use comma-separated values',\n );\n }\n\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n"],"names":[],"mappings":";;AAgBA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,IAAM,CAAC,OAAO,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG;AACvD,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,mBACd,KAAA,EACqC;AACrC,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,MAAA;AAEzC,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAA,EAAU,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,8BAA8B,IAAI,CAAA,8BAAA;AAAA,OACpC;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,wBACd,KAAA,EACsB;AACtB,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,IAAI,KAAA,CAAM,SAAA,EAAU,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CACvB,MAAA,CAAO,OAAO,CAAA;AACjB,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AACpC;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lockfile.cjs.js","sources":["../../src/monorepo/Lockfile.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 { parseSyml, stringifySyml } from '@yarnpkg/parsers';\nimport { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile';\nimport crypto from 'node:crypto';\nimport fs from 'fs-extra';\n\nconst ENTRY_PATTERN = /^((?:@[^/]+\\/)?[^@/]+)@(.+)$/;\n\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746\nconst NEW_HEADER = `${[\n `# This file is generated by running \"yarn install\" inside your project.\\n`,\n `# Manual changes might be lost - proceed with caution!\\n`,\n].join(``)}\\n`;\n\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136\nconst LEGACY_REGEX = /^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;\n\n/** @internal */\ntype LockfileData = {\n [entry: string]: {\n version: string;\n resolved?: string;\n integrity?: string /* old */;\n checksum?: string /* new */;\n dependencies?: { [name: string]: string };\n peerDependencies?: { [name: string]: string };\n };\n};\n\n/**\n * A single entry in a {@link Lockfile}.\n *\n * @public\n */\nexport type LockfileQueryEntry = {\n range: string;\n version: string;\n dataKey: string;\n};\n\n/**\n * An entry for a single difference between two {@link Lockfile}s.\n *\n * @public\n */\nexport type LockfileDiffEntry = {\n name: string;\n range: string;\n};\n\n/**\n * Represents the difference between two {@link Lockfile}s.\n *\n * @public\n */\nexport type LockfileDiff = {\n added: LockfileDiffEntry[];\n changed: LockfileDiffEntry[];\n removed: LockfileDiffEntry[];\n};\n\n// these are special top level yarn keys.\n// https://github.com/yarnpkg/berry/blob/9bd61fbffb83d0b8166a9cc26bec3a58743aa453/packages/yarnpkg-parsers/sources/syml.ts#L9\nconst SPECIAL_OBJECT_KEYS = [\n `__metadata`,\n `version`,\n `resolution`,\n `dependencies`,\n `peerDependencies`,\n `dependenciesMeta`,\n `peerDependenciesMeta`,\n `binaries`,\n];\n\n/**\n * Represents a package manager lockfile.\n *\n * @public\n */\nexport class Lockfile {\n /**\n * Load a {@link Lockfile} from a file path.\n */\n static async load(path: string): Promise<Lockfile> {\n const lockfileContents = await fs.readFile(path, 'utf8');\n return Lockfile.parse(lockfileContents);\n }\n\n /**\n * Parse lockfile contents into a {@link Lockfile}.\n *\n * @public\n */\n static parse(content: string): Lockfile {\n const legacy = LEGACY_REGEX.test(content);\n\n let data: LockfileData;\n try {\n data = parseSyml(content);\n } catch (err) {\n throw new Error(`Failed yarn.lock parse, ${err}`);\n }\n\n const packages = new Map<string, LockfileQueryEntry[]>();\n\n for (const [key, value] of Object.entries(data)) {\n if (SPECIAL_OBJECT_KEYS.includes(key)) continue;\n\n const [, name, ranges] = ENTRY_PATTERN.exec(key) ?? [];\n if (!name) {\n throw new Error(`Failed to parse yarn.lock entry '${key}'`);\n }\n\n let queries = packages.get(name);\n if (!queries) {\n queries = [];\n packages.set(name, queries);\n }\n for (let range of ranges.split(/\\s*,\\s*/)) {\n if (range.startsWith(`${name}@`)) {\n range = range.slice(`${name}@`.length);\n }\n if (range.startsWith('npm:')) {\n range = range.slice('npm:'.length);\n }\n queries.push({ range, version: value.version, dataKey: key });\n }\n }\n\n return new Lockfile(packages, data, legacy);\n }\n\n private readonly packages: Map<string, LockfileQueryEntry[]>;\n private readonly data: LockfileData;\n private readonly legacy: boolean;\n\n private constructor(\n packages: Map<string, LockfileQueryEntry[]>,\n data: LockfileData,\n legacy: boolean = false,\n ) {\n this.packages = packages;\n this.data = data;\n this.legacy = legacy;\n }\n\n /** Returns the name of all packages available in the lockfile */\n get(name: string): LockfileQueryEntry[] | undefined {\n return this.packages.get(name);\n }\n\n /** Get the entries for a single package in the lockfile */\n keys(): IterableIterator<string> {\n return this.packages.keys();\n }\n\n /**\n * Serialize the lockfile back to a string.\n */\n toString(): string {\n return this.legacy\n ? legacyStringifyLockfile(this.data)\n : NEW_HEADER + stringifySyml(this.data);\n }\n\n /**\n * Creates a simplified dependency graph from the lockfile data, where each\n * key is a package, and the value is a set of all packages that it depends on\n * across all versions.\n */\n createSimplifiedDependencyGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n\n for (const [name, entries] of this.packages) {\n const dependencies = new Set(\n entries.flatMap(e => {\n const data = this.data[e.dataKey];\n return [\n ...Object.keys(data?.dependencies ?? {}),\n ...Object.keys(data?.peerDependencies ?? {}),\n ];\n }),\n );\n graph.set(name, dependencies);\n }\n\n return graph;\n }\n\n /**\n * Diff with another lockfile, returning entries that have been\n * added, changed, and removed compared to the other lockfile.\n */\n diff(otherLockfile: Lockfile): LockfileDiff {\n const diff = {\n added: new Array<{ name: string; range: string }>(),\n changed: new Array<{ name: string; range: string }>(),\n removed: new Array<{ name: string; range: string }>(),\n };\n\n // Keeps track of packages that only exist in this lockfile\n const remainingOldNames = new Set(this.packages.keys());\n\n for (const [name, otherQueries] of otherLockfile.packages) {\n remainingOldNames.delete(name);\n\n const thisQueries = this.packages.get(name);\n // If the packages doesn't exist in this lockfile, add all entries\n if (!thisQueries) {\n diff.removed.push(...otherQueries.map(q => ({ name, range: q.range })));\n continue;\n }\n\n const remainingOldRanges = new Set(thisQueries.map(q => q.range));\n\n for (const otherQuery of otherQueries) {\n remainingOldRanges.delete(otherQuery.range);\n\n const thisQuery = thisQueries.find(q => q.range === otherQuery.range);\n if (!thisQuery) {\n diff.removed.push({ name, range: otherQuery.range });\n continue;\n }\n\n const otherPkg = otherLockfile.data[otherQuery.dataKey];\n const thisPkg = this.data[thisQuery.dataKey];\n if (otherPkg && thisPkg) {\n const thisCheck = thisPkg.integrity || thisPkg.checksum;\n const otherCheck = otherPkg.integrity || otherPkg.checksum;\n if (thisCheck !== otherCheck) {\n diff.changed.push({ name, range: otherQuery.range });\n }\n }\n }\n\n for (const thisRange of remainingOldRanges) {\n diff.added.push({ name, range: thisRange });\n }\n }\n\n for (const name of remainingOldNames) {\n const queries = this.packages.get(name) ?? [];\n diff.added.push(...queries.map(q => ({ name, range: q.range })));\n }\n\n return diff;\n }\n\n /**\n * Generates a sha1 hex hash of the dependency graph for a package.\n */\n getDependencyTreeHash(startName: string): string {\n if (!this.packages.has(startName)) {\n throw new Error(`Package '${startName}' not found in lockfile`);\n }\n\n const hash = crypto.createHash('sha1');\n\n const queue = [startName];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const name = queue.pop()!;\n\n if (seen.has(name)) {\n continue;\n }\n seen.add(name);\n\n const entries = this.packages.get(name);\n if (!entries) {\n continue; // In case of missing optional peer dependencies\n }\n\n hash.update(`pkg:${name}`);\n hash.update('\\0');\n\n // TODO(Rugvip): This uses the same simplified lookup as createSimplifiedDependencyGraph()\n // we could match version queries to make the resulting tree a bit smaller.\n const deps = new Array<string>();\n for (const entry of entries) {\n // We're not being particular about stable ordering here. If the lockfile ordering changes, so will likely hash.\n hash.update(entry.version);\n\n const data = this.data[entry.dataKey];\n if (!data) {\n continue;\n }\n\n const checksum = data.checksum || data.integrity;\n if (checksum) {\n hash.update('#');\n hash.update(checksum);\n }\n\n hash.update(' ');\n\n deps.push(...Object.keys(data.dependencies ?? {}));\n deps.push(...Object.keys(data.peerDependencies ?? {}));\n }\n\n queue.push(...new Set(deps));\n }\n\n return hash.digest('hex');\n }\n}\n"],"names":["fs","parseSyml","legacyStringifyLockfile","stringifySyml","crypto"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Lockfile.cjs.js","sources":["../../src/monorepo/Lockfile.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 { parseSyml, stringifySyml } from '@yarnpkg/parsers';\nimport { stringify as legacyStringifyLockfile } from '@yarnpkg/lockfile';\nimport crypto from 'node:crypto';\nimport fs from 'fs-extra';\n\nconst ENTRY_PATTERN = /^((?:@[^/]+\\/)?[^@/]+)@(.+)$/;\n\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-core/sources/Project.ts#L1741-L1746\nconst NEW_HEADER = `${[\n `# This file is generated by running \"yarn install\" inside your project.\\n`,\n `# Manual changes might be lost - proceed with caution!\\n`,\n].join(``)}\\n`;\n\n// https://github.com/yarnpkg/berry/blob/0c5974f193a9397630e9aee2b3876cca62611149/packages/yarnpkg-parsers/sources/syml.ts#L136\nconst LEGACY_REGEX = /^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;\n\n/** @internal */\ntype LockfileData = {\n [entry: string]: {\n version: string;\n resolved?: string;\n integrity?: string /* old */;\n checksum?: string /* new */;\n dependencies?: { [name: string]: string };\n peerDependencies?: { [name: string]: string };\n };\n};\n\n/**\n * A single entry in a {@link Lockfile}.\n *\n * @public\n */\nexport type LockfileQueryEntry = {\n range: string;\n version: string;\n dataKey: string;\n};\n\n/**\n * An entry for a single difference between two {@link Lockfile}s.\n *\n * @public\n */\nexport type LockfileDiffEntry = {\n name: string;\n range: string;\n};\n\n/**\n * Represents the difference between two {@link Lockfile}s.\n *\n * @public\n */\nexport type LockfileDiff = {\n added: LockfileDiffEntry[];\n changed: LockfileDiffEntry[];\n removed: LockfileDiffEntry[];\n};\n\n// these are special top level yarn keys.\n// https://github.com/yarnpkg/berry/blob/9bd61fbffb83d0b8166a9cc26bec3a58743aa453/packages/yarnpkg-parsers/sources/syml.ts#L9\nconst SPECIAL_OBJECT_KEYS = [\n `__metadata`,\n `version`,\n `resolution`,\n `dependencies`,\n `peerDependencies`,\n `dependenciesMeta`,\n `peerDependenciesMeta`,\n `binaries`,\n];\n\n/**\n * Represents a package manager lockfile.\n *\n * @public\n */\nexport class Lockfile {\n /**\n * Load a {@link Lockfile} from a file path.\n */\n static async load(path: string): Promise<Lockfile> {\n const lockfileContents = await fs.readFile(path, 'utf8');\n return Lockfile.parse(lockfileContents);\n }\n\n /**\n * Parse lockfile contents into a {@link Lockfile}.\n *\n * @public\n */\n static parse(content: string): Lockfile {\n const legacy = LEGACY_REGEX.test(content);\n\n let data: LockfileData;\n try {\n data = parseSyml(content);\n } catch (err) {\n throw new Error(`Failed yarn.lock parse, ${err}`);\n }\n\n const packages = new Map<string, LockfileQueryEntry[]>();\n\n for (const [key, value] of Object.entries(data)) {\n if (SPECIAL_OBJECT_KEYS.includes(key)) continue;\n\n const [, name, ranges] = ENTRY_PATTERN.exec(key) ?? [];\n if (!name) {\n throw new Error(`Failed to parse yarn.lock entry '${key}'`);\n }\n\n let queries = packages.get(name);\n if (!queries) {\n queries = [];\n packages.set(name, queries);\n }\n for (let range of ranges.split(/\\s*,\\s*/)) {\n if (range.startsWith(`${name}@`)) {\n range = range.slice(`${name}@`.length);\n }\n if (range.startsWith('npm:')) {\n range = range.slice('npm:'.length);\n }\n queries.push({ range, version: value.version, dataKey: key });\n }\n }\n\n return new Lockfile(packages, data, legacy);\n }\n\n private readonly packages: Map<string, LockfileQueryEntry[]>;\n private readonly data: LockfileData;\n private readonly legacy: boolean;\n\n private constructor(\n packages: Map<string, LockfileQueryEntry[]>,\n data: LockfileData,\n legacy: boolean = false,\n ) {\n this.packages = packages;\n this.data = data;\n this.legacy = legacy;\n }\n\n /** Returns the name of all packages available in the lockfile */\n get(name: string): LockfileQueryEntry[] | undefined {\n return this.packages.get(name);\n }\n\n /** Get the entries for a single package in the lockfile */\n keys(): IterableIterator<string> {\n return this.packages.keys();\n }\n\n /**\n * Serialize the lockfile back to a string.\n */\n toString(): string {\n return this.legacy\n ? legacyStringifyLockfile(this.data)\n : NEW_HEADER + stringifySyml(this.data);\n }\n\n /**\n * Creates a simplified dependency graph from the lockfile data, where each\n * key is a package, and the value is a set of all packages that it depends on\n * across all versions.\n */\n createSimplifiedDependencyGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n\n for (const [name, entries] of this.packages) {\n const dependencies = new Set(\n entries.flatMap(e => {\n const data = this.data[e.dataKey];\n return [\n ...Object.keys(data?.dependencies ?? {}),\n ...Object.keys(data?.peerDependencies ?? {}),\n ];\n }),\n );\n graph.set(name, dependencies);\n }\n\n return graph;\n }\n\n /**\n * Diff with another lockfile, returning entries that have been\n * added, changed, and removed compared to the other lockfile.\n */\n diff(otherLockfile: Lockfile): LockfileDiff {\n const diff = {\n added: new Array<{ name: string; range: string }>(),\n changed: new Array<{ name: string; range: string }>(),\n removed: new Array<{ name: string; range: string }>(),\n };\n\n // Keeps track of packages that only exist in this lockfile\n const remainingOldNames = new Set(this.packages.keys());\n\n for (const [name, otherQueries] of otherLockfile.packages) {\n remainingOldNames.delete(name);\n\n const thisQueries = this.packages.get(name);\n // If the packages doesn't exist in this lockfile, add all entries\n if (!thisQueries) {\n diff.removed.push(...otherQueries.map(q => ({ name, range: q.range })));\n continue;\n }\n\n const remainingOldRanges = new Set(thisQueries.map(q => q.range));\n\n for (const otherQuery of otherQueries) {\n remainingOldRanges.delete(otherQuery.range);\n\n const thisQuery = thisQueries.find(q => q.range === otherQuery.range);\n if (!thisQuery) {\n diff.removed.push({ name, range: otherQuery.range });\n continue;\n }\n\n const otherPkg = otherLockfile.data[otherQuery.dataKey];\n const thisPkg = this.data[thisQuery.dataKey];\n if (otherPkg && thisPkg) {\n const thisCheck = thisPkg.integrity || thisPkg.checksum;\n const otherCheck = otherPkg.integrity || otherPkg.checksum;\n if (thisCheck !== otherCheck) {\n diff.changed.push({ name, range: otherQuery.range });\n }\n }\n }\n\n for (const thisRange of remainingOldRanges) {\n diff.added.push({ name, range: thisRange });\n }\n }\n\n for (const name of remainingOldNames) {\n const queries = this.packages.get(name) ?? [];\n diff.added.push(...queries.map(q => ({ name, range: q.range })));\n }\n\n return diff;\n }\n\n /**\n * Generates a sha1 hex hash of the dependency graph for a package.\n */\n getDependencyTreeHash(startName: string): string {\n if (!this.packages.has(startName)) {\n throw new Error(`Package '${startName}' not found in lockfile`);\n }\n\n const hash = crypto.createHash('sha1');\n\n const queue = [startName];\n const seen = new Set<string>();\n\n while (queue.length > 0) {\n const name = queue.pop()!;\n\n if (seen.has(name)) {\n continue;\n }\n seen.add(name);\n\n const entries = this.packages.get(name);\n if (!entries) {\n continue; // In case of missing optional peer dependencies\n }\n\n hash.update(`pkg:${name}`);\n hash.update('\\0');\n\n // TODO(Rugvip): This uses the same simplified lookup as createSimplifiedDependencyGraph()\n // we could match version queries to make the resulting tree a bit smaller.\n const deps = new Array<string>();\n for (const entry of entries) {\n // We're not being particular about stable ordering here. If the lockfile ordering changes, so will likely hash.\n hash.update(entry.version);\n\n const data = this.data[entry.dataKey];\n if (!data) {\n continue;\n }\n\n const checksum = data.checksum || data.integrity;\n if (checksum) {\n hash.update('#');\n hash.update(checksum);\n }\n\n hash.update(' ');\n\n deps.push(...Object.keys(data.dependencies ?? {}));\n deps.push(...Object.keys(data.peerDependencies ?? {}));\n }\n\n queue.push(...new Set(deps));\n }\n\n return hash.digest('hex');\n }\n}\n"],"names":["fs","parseSyml","legacyStringifyLockfile","stringifySyml","crypto"],"mappings":"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"}
|
|
@@ -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 'node:path';\nimport { getPackages, Package } from '@manypkg/get-packages';\nimport { targetPaths } from '@backstage/cli-common';\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 * Module packages that should be installed alongside this plugin for cross-plugin integrations.\n * If the peer module's target plugin is present, you should have the peer module installed.\n */\n peerModules?: 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(targetPaths.dir);\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(targetPaths.rootDir, 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 targetPaths.resolveRoot('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 = otherLockfile.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","targetPaths","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 'node:path';\nimport { getPackages, Package } from '@manypkg/get-packages';\nimport { targetPaths } from '@backstage/cli-common';\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 * Module packages that should be installed alongside this plugin for cross-plugin integrations.\n * If the peer module's target plugin is present, you should have the peer module installed.\n */\n peerModules?: 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(targetPaths.dir);\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(targetPaths.rootDir, 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 targetPaths.resolveRoot('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 = otherLockfile.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","targetPaths","GitUtils","path","Lockfile"],"mappings":"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"}
|
|
@@ -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 { targetPaths } from '@backstage/cli-common';\nimport fs from 'fs-extra';\n\n/**\n * Returns true if the current project is a monorepo.\n *\n * Uses a simple presence check on the `workspaces` field. Empty or invalid\n * workspace config is treated as a monorepo; we do not validate patterns.\n *\n * @public\n */\nexport async function isMonoRepo(): Promise<boolean> {\n const rootPackageJsonPath = targetPaths.resolveRoot('package.json');\n try {\n const pkg = await fs.readJson(rootPackageJsonPath);\n return Boolean(pkg?.workspaces);\n } catch (error) {\n return false;\n }\n}\n"],"names":["targetPaths","fs"],"mappings":";;;;;;;;;AA2BA,eAAsB,UAAA,GAA+B;AACnD,EAAA,MAAM,mBAAA,GAAsBA,qBAAA,CAAY,WAAA,CAAY,cAAc,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,mBAAA,CAAG,QAAA,CAAS,mBAAmB,CAAA;AACjD,IAAA,OAAO,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,EAChC,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 { targetPaths } from '@backstage/cli-common';\nimport fs from 'fs-extra';\n\n/**\n * Returns true if the current project is a monorepo.\n *\n * Uses a simple presence check on the `workspaces` field. Empty or invalid\n * workspace config is treated as a monorepo; we do not validate patterns.\n *\n * @public\n */\nexport async function isMonoRepo(): Promise<boolean> {\n const rootPackageJsonPath = targetPaths.resolveRoot('package.json');\n try {\n const pkg = await fs.readJson(rootPackageJsonPath);\n return Boolean(pkg?.workspaces);\n } catch (error) {\n return false;\n }\n}\n"],"names":["targetPaths","fs"],"mappings":";;;;;;;;;AA2BA,eAAsB,UAAA,GAA+B;AACnD,EAAA,MAAM,mBAAA,GAAsBA,qBAAA,CAAY,WAAA,CAAY,cAAc,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMC,mBAAA,CAAG,QAAA,CAAS,mBAAmB,CAAA;AACjD,IAAA,OAAO,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpaqueType.cjs.js","sources":["../../../../opaque-internal/src/OpaqueType.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\n// TODO(Rugvip): This lives here temporarily, but should be moved to a more\n// central location. It's useful for backend packages too so we'll need to have\n// it in a common package, but it might also be that we want to make it\n// available publicly too in which case it would make sense to have this be part\n// of @backstage/version-bridge. The problem with exporting it from there is\n// that it would need to be very stable at that point, so it might be a bit\n// early to put it there already.\n\n/**\n * A helper for working with opaque types.\n */\nexport class OpaqueType<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n> {\n /**\n * Creates a new opaque type.\n *\n * @param options.type The type identifier of the opaque type\n * @param options.versions The available versions of the opaque type\n * @returns A new opaque type helper\n */\n static create<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n >(options: {\n type: T['public']['$$type'];\n versions: Array<T['versions']['version']>;\n }) {\n return new OpaqueType<T>(options.type, new Set(options.versions));\n }\n\n #type: string;\n #versions: Set<string | undefined>;\n\n private constructor(type: string, versions: Set<string | undefined>) {\n this.#type = type;\n this.#versions = versions;\n }\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TPublic`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TPublic: T['public'] = undefined as any;\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TInternal`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TInternal: T['public'] & T['versions'] = undefined as any;\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @returns True if the value matches this opaque type\n */\n isType = (value: unknown): value is T['public'] => {\n return this.#isThisInternalType(value);\n };\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @throws If the value is not an instance of this opaque type or is of an unsupported version\n * @returns The internal version of the opaque type\n */\n toInternal = (value: unknown): T['public'] & T['versions'] => {\n if (!this.#isThisInternalType(value)) {\n throw new TypeError(\n `Invalid opaque type, expected '${\n this.#type\n }', but got '${this.#stringifyUnknown(value)}'`,\n );\n }\n\n if (!this.#versions.has(value.version)) {\n const versions = Array.from(this.#versions).map(this.#stringifyVersion);\n if (versions.length > 1) {\n versions[versions.length - 1] = `or ${versions[versions.length - 1]}`;\n }\n const expected =\n versions.length > 2 ? versions.join(', ') : versions.join(' ');\n throw new TypeError(\n `Invalid opaque type instance, got version ${this.#stringifyVersion(\n value.version,\n )}, expected ${expected}`,\n );\n }\n\n return value;\n };\n\n /**\n * Creates an instance of the opaque type, returning the public type.\n *\n * @param version The version of the instance to create\n * @param value The remaining public and internal properties of the instance\n * @returns An instance of the opaque type\n */\n createInstance<\n TVersion extends T['versions']['version'],\n TPublic extends T['public'],\n >(\n version: TVersion,\n props: Omit<T['public'], '$$type'> &\n (T['versions'] extends infer UVersion\n ? UVersion extends { version: TVersion }\n ? Omit<UVersion, 'version'>\n : never\n : never) &\n Object, // & Object to allow for object properties too, e.g. toString()\n ): TPublic {\n return Object.assign(props as object, {\n $$type: this.#type,\n ...(version && { version }),\n }) as unknown as TPublic;\n }\n\n #isThisInternalType(value: unknown): value is T['public'] & T['versions'] {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as T['public']).$$type === this.#type;\n }\n\n #stringifyUnknown(value: unknown) {\n if (typeof value !== 'object') {\n return `<${typeof value}>`;\n }\n if (value === null) {\n return '<null>';\n }\n if ('$$type' in value) {\n return String(value.$$type);\n }\n return String(value);\n }\n\n #stringifyVersion = (version: string | undefined) => {\n return version ? `'${version}'` : 'undefined';\n };\n}\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"OpaqueType.cjs.js","sources":["../../../../opaque-internal/src/OpaqueType.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\n// TODO(Rugvip): This lives here temporarily, but should be moved to a more\n// central location. It's useful for backend packages too so we'll need to have\n// it in a common package, but it might also be that we want to make it\n// available publicly too in which case it would make sense to have this be part\n// of @backstage/version-bridge. The problem with exporting it from there is\n// that it would need to be very stable at that point, so it might be a bit\n// early to put it there already.\n\n/**\n * A helper for working with opaque types.\n */\nexport class OpaqueType<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n> {\n /**\n * Creates a new opaque type.\n *\n * @param options.type The type identifier of the opaque type\n * @param options.versions The available versions of the opaque type\n * @returns A new opaque type helper\n */\n static create<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n >(options: {\n type: T['public']['$$type'];\n versions: Array<T['versions']['version']>;\n }) {\n return new OpaqueType<T>(options.type, new Set(options.versions));\n }\n\n #type: string;\n #versions: Set<string | undefined>;\n\n private constructor(type: string, versions: Set<string | undefined>) {\n this.#type = type;\n this.#versions = versions;\n }\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TPublic`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TPublic: T['public'] = undefined as any;\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TInternal`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TInternal: T['public'] & T['versions'] = undefined as any;\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @returns True if the value matches this opaque type\n */\n isType = (value: unknown): value is T['public'] => {\n return this.#isThisInternalType(value);\n };\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @throws If the value is not an instance of this opaque type or is of an unsupported version\n * @returns The internal version of the opaque type\n */\n toInternal = (value: unknown): T['public'] & T['versions'] => {\n if (!this.#isThisInternalType(value)) {\n throw new TypeError(\n `Invalid opaque type, expected '${\n this.#type\n }', but got '${this.#stringifyUnknown(value)}'`,\n );\n }\n\n if (!this.#versions.has(value.version)) {\n const versions = Array.from(this.#versions).map(this.#stringifyVersion);\n if (versions.length > 1) {\n versions[versions.length - 1] = `or ${versions[versions.length - 1]}`;\n }\n const expected =\n versions.length > 2 ? versions.join(', ') : versions.join(' ');\n throw new TypeError(\n `Invalid opaque type instance, got version ${this.#stringifyVersion(\n value.version,\n )}, expected ${expected}`,\n );\n }\n\n return value;\n };\n\n /**\n * Creates an instance of the opaque type, returning the public type.\n *\n * @param version The version of the instance to create\n * @param value The remaining public and internal properties of the instance\n * @returns An instance of the opaque type\n */\n createInstance<\n TVersion extends T['versions']['version'],\n TPublic extends T['public'],\n >(\n version: TVersion,\n props: Omit<T['public'], '$$type'> &\n (T['versions'] extends infer UVersion\n ? UVersion extends { version: TVersion }\n ? Omit<UVersion, 'version'>\n : never\n : never) &\n Object, // & Object to allow for object properties too, e.g. toString()\n ): TPublic {\n return Object.assign(props as object, {\n $$type: this.#type,\n ...(version && { version }),\n }) as unknown as TPublic;\n }\n\n #isThisInternalType(value: unknown): value is T['public'] & T['versions'] {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as T['public']).$$type === this.#type;\n }\n\n #stringifyUnknown(value: unknown) {\n if (typeof value !== 'object') {\n return `<${typeof value}>`;\n }\n if (value === null) {\n return '<null>';\n }\n if ('$$type' in value) {\n return String(value.$$type);\n }\n return String(value);\n }\n\n #stringifyVersion = (version: string | undefined) => {\n return version ? `'${version}'` : 'undefined';\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PackageRoles.cjs.js","sources":["../../src/roles/PackageRoles.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 { z } from 'zod/v3';\nimport { PackageRole, PackageRoleInfo } from './types';\n\nconst packageRoleInfos: PackageRoleInfo[] = [\n {\n role: 'frontend',\n platform: 'web',\n output: ['bundle'],\n },\n {\n role: 'backend',\n platform: 'node',\n output: ['bundle'],\n },\n {\n role: 'cli',\n platform: 'node',\n output: ['cjs'],\n },\n {\n role: 'cli-module',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'web-library',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'node-library',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'common-library',\n platform: 'common',\n output: ['types', 'esm', 'cjs'],\n },\n {\n role: 'frontend-plugin',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'frontend-plugin-module',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'frontend-dynamic-container' as PackageRole, // experimental\n platform: 'web',\n output: ['bundle'],\n },\n {\n role: 'backend-plugin',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'backend-plugin-module',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n];\n\nconst readSchema = z.object({\n name: z.string().optional(),\n backstage: z\n .object({\n role: z.string().optional(),\n })\n .optional(),\n});\n\nconst detectionSchema = z.object({\n name: z.string().optional(),\n scripts: z\n .object({\n start: z.string().optional(),\n build: z.string().optional(),\n })\n .optional(),\n publishConfig: z\n .object({\n main: z.string().optional(),\n types: z.string().optional(),\n module: z.string().optional(),\n })\n .optional(),\n main: z.string().optional(),\n types: z.string().optional(),\n module: z.string().optional(),\n});\n\n/**\n * Utilities for working with Backstage package roles.\n *\n * @public\n */\nexport class PackageRoles {\n /**\n * Get the associated info for a package role.\n */\n static getRoleInfo(role: string): PackageRoleInfo {\n const roleInfo = packageRoleInfos.find(r => r.role === role);\n if (!roleInfo) {\n throw new Error(`Unknown package role '${role}'`);\n }\n return roleInfo;\n }\n\n /**\n * Given package JSON data, get the package role.\n */\n static getRoleFromPackage(pkgJson: unknown): PackageRole | undefined {\n const pkg = readSchema.parse(pkgJson);\n\n if (pkg.backstage) {\n const { role } = pkg.backstage;\n if (!role) {\n throw new Error(\n `Package ${pkg.name} must specify a role in the \"backstage\" field`,\n );\n }\n\n return this.getRoleInfo(role).role;\n }\n\n return undefined;\n }\n\n /**\n * Attempt to detect the role of a package from its package.json.\n */\n static detectRoleFromPackage(pkgJson: unknown): PackageRole | undefined {\n const pkg = detectionSchema.parse(pkgJson);\n\n if (pkg.scripts?.start?.includes('app:serve')) {\n return 'frontend';\n }\n if (pkg.scripts?.build?.includes('backend:bundle')) {\n return 'backend';\n }\n if (\n pkg.name?.includes('plugin-') &&\n pkg.name?.includes('-backend-module-')\n ) {\n return 'backend-plugin-module';\n }\n if (pkg.name?.includes('plugin-') && pkg.name?.includes('-module-')) {\n return 'frontend-plugin-module';\n }\n if (pkg.scripts?.start?.includes('plugin:serve')) {\n return 'frontend-plugin';\n }\n if (pkg.scripts?.start?.includes('backend:dev')) {\n return 'backend-plugin';\n }\n\n const mainEntry = pkg.publishConfig?.main || pkg.main;\n const moduleEntry = pkg.publishConfig?.module || pkg.module;\n const typesEntry = pkg.publishConfig?.types || pkg.types;\n if (typesEntry) {\n if (mainEntry && moduleEntry) {\n return 'common-library';\n }\n if (moduleEntry || mainEntry?.endsWith('.esm.js')) {\n return 'web-library';\n }\n if (mainEntry) {\n return 'node-library';\n }\n } else if (mainEntry) {\n return 'cli';\n }\n\n return undefined;\n }\n}\n"],"names":["z"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PackageRoles.cjs.js","sources":["../../src/roles/PackageRoles.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 { z } from 'zod/v3';\nimport { PackageRole, PackageRoleInfo } from './types';\n\nconst packageRoleInfos: PackageRoleInfo[] = [\n {\n role: 'frontend',\n platform: 'web',\n output: ['bundle'],\n },\n {\n role: 'backend',\n platform: 'node',\n output: ['bundle'],\n },\n {\n role: 'cli',\n platform: 'node',\n output: ['cjs'],\n },\n {\n role: 'cli-module',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'web-library',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'node-library',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'common-library',\n platform: 'common',\n output: ['types', 'esm', 'cjs'],\n },\n {\n role: 'frontend-plugin',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'frontend-plugin-module',\n platform: 'web',\n output: ['types', 'esm'],\n },\n {\n role: 'frontend-dynamic-container' as PackageRole, // experimental\n platform: 'web',\n output: ['bundle'],\n },\n {\n role: 'backend-plugin',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n {\n role: 'backend-plugin-module',\n platform: 'node',\n output: ['types', 'cjs'],\n },\n];\n\nconst readSchema = z.object({\n name: z.string().optional(),\n backstage: z\n .object({\n role: z.string().optional(),\n })\n .optional(),\n});\n\nconst detectionSchema = z.object({\n name: z.string().optional(),\n scripts: z\n .object({\n start: z.string().optional(),\n build: z.string().optional(),\n })\n .optional(),\n publishConfig: z\n .object({\n main: z.string().optional(),\n types: z.string().optional(),\n module: z.string().optional(),\n })\n .optional(),\n main: z.string().optional(),\n types: z.string().optional(),\n module: z.string().optional(),\n});\n\n/**\n * Utilities for working with Backstage package roles.\n *\n * @public\n */\nexport class PackageRoles {\n /**\n * Get the associated info for a package role.\n */\n static getRoleInfo(role: string): PackageRoleInfo {\n const roleInfo = packageRoleInfos.find(r => r.role === role);\n if (!roleInfo) {\n throw new Error(`Unknown package role '${role}'`);\n }\n return roleInfo;\n }\n\n /**\n * Given package JSON data, get the package role.\n */\n static getRoleFromPackage(pkgJson: unknown): PackageRole | undefined {\n const pkg = readSchema.parse(pkgJson);\n\n if (pkg.backstage) {\n const { role } = pkg.backstage;\n if (!role) {\n throw new Error(\n `Package ${pkg.name} must specify a role in the \"backstage\" field`,\n );\n }\n\n return this.getRoleInfo(role).role;\n }\n\n return undefined;\n }\n\n /**\n * Attempt to detect the role of a package from its package.json.\n */\n static detectRoleFromPackage(pkgJson: unknown): PackageRole | undefined {\n const pkg = detectionSchema.parse(pkgJson);\n\n if (pkg.scripts?.start?.includes('app:serve')) {\n return 'frontend';\n }\n if (pkg.scripts?.build?.includes('backend:bundle')) {\n return 'backend';\n }\n if (\n pkg.name?.includes('plugin-') &&\n pkg.name?.includes('-backend-module-')\n ) {\n return 'backend-plugin-module';\n }\n if (pkg.name?.includes('plugin-') && pkg.name?.includes('-module-')) {\n return 'frontend-plugin-module';\n }\n if (pkg.scripts?.start?.includes('plugin:serve')) {\n return 'frontend-plugin';\n }\n if (pkg.scripts?.start?.includes('backend:dev')) {\n return 'backend-plugin';\n }\n\n const mainEntry = pkg.publishConfig?.main || pkg.main;\n const moduleEntry = pkg.publishConfig?.module || pkg.module;\n const typesEntry = pkg.publishConfig?.types || pkg.types;\n if (typesEntry) {\n if (mainEntry && moduleEntry) {\n return 'common-library';\n }\n if (moduleEntry || mainEntry?.endsWith('.esm.js')) {\n return 'web-library';\n }\n if (mainEntry) {\n return 'node-library';\n }\n } else if (mainEntry) {\n return 'cli';\n }\n\n return undefined;\n }\n}\n"],"names":["z"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yarnPlugin.cjs.js","sources":["../../src/yarn/yarnPlugin.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 fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport yaml from 'yaml';\nimport { z } from 'zod/v3';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst yarnRcSchema = z.object({\n plugins: z\n .array(\n z.object({\n path: z.string(),\n }),\n )\n .optional(),\n});\n\n/**\n * Detects whether the Backstage Yarn plugin is installed in the given workspace directory.\n *\n * @param workspaceDir - The workspace root directory to check. Defaults to the target root.\n * @returns Promise resolving to true if the plugin is installed, false otherwise\n * @public\n */\nexport async function hasBackstageYarnPlugin(\n workspaceDir?: string,\n): Promise<boolean> {\n const yarnRcPath = resolvePath(\n workspaceDir ?? targetPaths.rootDir,\n '.yarnrc.yml',\n );\n const yarnRcContent = await fs.readFile(yarnRcPath, 'utf-8').catch(e => {\n if (e.code === 'ENOENT') {\n return '';\n }\n throw e;\n });\n\n if (!yarnRcContent) {\n return false;\n }\n\n const parseResult = yarnRcSchema.safeParse(yaml.parse(yarnRcContent));\n\n if (!parseResult.success) {\n throw new Error(\n `Unexpected content in .yarnrc.yml: ${parseResult.error.toString()}`,\n );\n }\n\n const yarnRc = parseResult.data;\n\n const backstagePlugin = yarnRc.plugins?.some(\n plugin => plugin.path === '.yarn/plugins/@yarnpkg/plugin-backstage.cjs',\n );\n\n return Boolean(backstagePlugin);\n}\n"],"names":["z","resolvePath","targetPaths","fs","yaml"],"mappings":";;;;;;;;;;;;;AAsBA,MAAM,YAAA,GAAeA,KAAE,MAAA,CAAO;AAAA,EAC5B,SAASA,IAAA,CACN,KAAA;AAAA,IACCA,KAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAMA,KAAE,MAAA;AAAO,KAChB;AAAA,IAEF,QAAA;AACL,CAAC,CAAA;AASD,eAAsB,uBACpB,YAAA,EACkB;AAClB,EAAA,MAAM,UAAA,GAAaC,YAAA;AAAA,IACjB,gBAAgBC,qBAAA,CAAY,OAAA;AAAA,IAC5B;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgB,MAAMC,mBAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,KAAK;AACtE,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,CAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAc,YAAA,CAAa,SAAA,CAAUC,qBAAA,CAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AAEpE,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EAAsC,WAAA,CAAY,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,KACpE;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAE3B,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,EAAS,IAAA;AAAA,IACtC,CAAA,MAAA,KAAU,OAAO,IAAA,KAAS;AAAA,GAC5B;AAEA,EAAA,OAAO,QAAQ,eAAe,CAAA;AAChC
|
|
1
|
+
{"version":3,"file":"yarnPlugin.cjs.js","sources":["../../src/yarn/yarnPlugin.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 fs from 'fs-extra';\nimport { resolve as resolvePath } from 'node:path';\nimport yaml from 'yaml';\nimport { z } from 'zod/v3';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst yarnRcSchema = z.object({\n plugins: z\n .array(\n z.object({\n path: z.string(),\n }),\n )\n .optional(),\n});\n\n/**\n * Detects whether the Backstage Yarn plugin is installed in the given workspace directory.\n *\n * @param workspaceDir - The workspace root directory to check. Defaults to the target root.\n * @returns Promise resolving to true if the plugin is installed, false otherwise\n * @public\n */\nexport async function hasBackstageYarnPlugin(\n workspaceDir?: string,\n): Promise<boolean> {\n const yarnRcPath = resolvePath(\n workspaceDir ?? targetPaths.rootDir,\n '.yarnrc.yml',\n );\n const yarnRcContent = await fs.readFile(yarnRcPath, 'utf-8').catch(e => {\n if (e.code === 'ENOENT') {\n return '';\n }\n throw e;\n });\n\n if (!yarnRcContent) {\n return false;\n }\n\n const parseResult = yarnRcSchema.safeParse(yaml.parse(yarnRcContent));\n\n if (!parseResult.success) {\n throw new Error(\n `Unexpected content in .yarnrc.yml: ${parseResult.error.toString()}`,\n );\n }\n\n const yarnRc = parseResult.data;\n\n const backstagePlugin = yarnRc.plugins?.some(\n plugin => plugin.path === '.yarn/plugins/@yarnpkg/plugin-backstage.cjs',\n );\n\n return Boolean(backstagePlugin);\n}\n"],"names":["z","resolvePath","targetPaths","fs","yaml"],"mappings":";;;;;;;;;;;;;AAsBA,MAAM,YAAA,GAAeA,KAAE,MAAA,CAAO;AAAA,EAC5B,SAASA,IAAA,CACN,KAAA;AAAA,IACCA,KAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAMA,KAAE,MAAA;AAAO,KAChB;AAAA,IAEF,QAAA;AACL,CAAC,CAAA;AASD,eAAsB,uBACpB,YAAA,EACkB;AAClB,EAAA,MAAM,UAAA,GAAaC,YAAA;AAAA,IACjB,gBAAgBC,qBAAA,CAAY,OAAA;AAAA,IAC5B;AAAA,GACF;AACA,EAAA,MAAM,aAAA,GAAgB,MAAMC,mBAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,KAAK;AACtE,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,MAAM,CAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAc,YAAA,CAAa,SAAA,CAAUC,qBAAA,CAAK,KAAA,CAAM,aAAa,CAAC,CAAA;AAEpE,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EAAsC,WAAA,CAAY,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,KACpE;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAE3B,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,EAAS,IAAA;AAAA,IACtC,CAAA,MAAA,KAAU,OAAO,IAAA,KAAS;AAAA,GAC5B;AAEA,EAAA,OAAO,QAAQ,eAAe,CAAA;AAChC;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/cli-node",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5-next.0",
|
|
4
4
|
"description": "Node.js library for Backstage CLIs",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "node-library"
|
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
"test": "backstage-cli package test"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@backstage/cli-common": "
|
|
36
|
-
"@backstage/errors": "
|
|
37
|
-
"@backstage/types": "
|
|
35
|
+
"@backstage/cli-common": "0.3.2-next.0",
|
|
36
|
+
"@backstage/errors": "1.3.2-next.0",
|
|
37
|
+
"@backstage/types": "1.2.2",
|
|
38
38
|
"@manypkg/get-packages": "^1.1.3",
|
|
39
39
|
"@yarnpkg/lockfile": "^1.1.0",
|
|
40
40
|
"@yarnpkg/parsers": "^3.0.0",
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"zod": "^3.25.76 || ^4.0.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@backstage/backend-test-utils": "
|
|
52
|
-
"@backstage/cli": "
|
|
53
|
-
"@backstage/test-utils": "
|
|
51
|
+
"@backstage/backend-test-utils": "1.11.8-next.0",
|
|
52
|
+
"@backstage/cli": "0.36.7-next.0",
|
|
53
|
+
"@backstage/test-utils": "1.7.23-next.0",
|
|
54
54
|
"@types/proper-lockfile": "^4",
|
|
55
55
|
"@types/yarnpkg__lockfile": "^1.1.4"
|
|
56
56
|
},
|