@backstage/cli-module-package-manager-yarn 0.1.1-next.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @backstage/cli-module-package-manager-yarn
2
2
 
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - de957f6: Added `@backstage/cli-module-package-manager-yarn` with `backstage-cli pm
8
+ verify-patches` to validate Yarn patch references, local patch files,
9
+ lockfile consistency, and patched Backstage package versions against the
10
+ selected Backstage release. The command is included in
11
+ `@backstage/cli-defaults`.
12
+ - ce2a9c2: The `pm verify-patches` command now reports root-level Yarn resolutions that no longer match any dependency request in the lockfile.
13
+ - 064c2de: Updated the Yarn tooling dependencies to versions that avoid known security vulnerabilities.
14
+ - Updated dependencies
15
+ - @backstage/cli-common@0.3.1
16
+
17
+ ## 0.1.1-next.1
18
+
19
+ ### Patch Changes
20
+
21
+ - 064c2de: Updated the Yarn tooling dependencies to versions that avoid known security vulnerabilities.
22
+
3
23
  ## 0.1.1-next.0
4
24
 
5
25
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # @backstage/cli-module-package-manager-yarn
2
2
 
3
3
  Adds `backstage-cli pm verify-patches`, a read-only check for Yarn patch
4
- references and patched Backstage package versions.
4
+ references, root resolutions, and patched Backstage package versions.
5
5
 
6
6
  The command verifies Yarn's native `patch:` protocol, available in Yarn 2 and
7
7
  later. It does not inspect patches managed by tools such as `patch-package` in
@@ -19,7 +19,9 @@ The command scans the root `package.json` and every workspace manifest for
19
19
  `patch:` references in `resolutions`, `dependencies`, `devDependencies`,
20
20
  `optionalDependencies`, and `peerDependencies`. It verifies that referenced
21
21
  local patch files exist, files in Yarn's configured `patchFolder` are
22
- referenced, and manifest declarations agree with `yarn.lock`.
22
+ referenced, and manifest declarations agree with `yarn.lock`. It also reports
23
+ root `resolutions` entries whose selectors no longer match any dependency
24
+ request in the lockfile.
23
25
 
24
26
  When a repository both patches an `@backstage/*` package and declares a
25
27
  Backstage release in `backstage.json`, the command also verifies that the
@@ -31,7 +33,8 @@ the Backstage release check is reported as skipped.
31
33
  The command does not run Yarn, install dependencies, or write project files.
32
34
  Use it alongside `yarn install --immutable`: immutable installs protect the
33
35
  resolved dependency state, while this command verifies that patch declarations,
34
- patch files, the lockfile, and the selected Backstage release remain aligned.
36
+ patch files, resolutions, the lockfile, and the selected Backstage release
37
+ remain aligned.
35
38
 
36
39
  ## Release manifest environment
37
40
 
package/dist/index.cjs.js CHANGED
@@ -10,7 +10,7 @@ var index = cliNode.createCliModule({
10
10
  init: async (reg) => {
11
11
  reg.addCommand({
12
12
  path: ["pm", "verify-patches"],
13
- description: "Verify Yarn patch references and Backstage package versions",
13
+ description: "Verify Yarn patches, resolutions, and Backstage package versions",
14
14
  execute: {
15
15
  loader: () => import('./commands/pm/verifyPatches.cjs.js')
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/index.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/**\n * CLI module for Yarn package manager commands in the Backstage CLI.\n *\n * @packageDocumentation\n */\n\nimport { createCliModule } from '@backstage/cli-node';\nimport packageJson from '../package.json';\n\nexport default createCliModule({\n packageJson,\n init: async reg => {\n reg.addCommand({\n path: ['pm', 'verify-patches'],\n description:\n 'Verify Yarn patch references and Backstage package versions',\n execute: {\n loader: () => import('./commands/pm/verifyPatches'),\n },\n });\n },\n});\n"],"names":["createCliModule","packageJson"],"mappings":";;;;;;;AAwBA,YAAeA,uBAAA,CAAgB;AAAA,eAC7BC,gBAAA;AAAA,EACA,IAAA,EAAM,OAAM,GAAA,KAAO;AACjB,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,IAAA,EAAM,gBAAgB,CAAA;AAAA,MAC7B,WAAA,EACE,6DAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,oCAA6B;AAAA;AACpD,KACD,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/index.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/**\n * CLI module for Yarn package manager commands in the Backstage CLI.\n *\n * @packageDocumentation\n */\n\nimport { createCliModule } from '@backstage/cli-node';\nimport packageJson from '../package.json';\n\nexport default createCliModule({\n packageJson,\n init: async reg => {\n reg.addCommand({\n path: ['pm', 'verify-patches'],\n description:\n 'Verify Yarn patches, resolutions, and Backstage package versions',\n execute: {\n loader: () => import('./commands/pm/verifyPatches'),\n },\n });\n },\n});\n"],"names":["createCliModule","packageJson"],"mappings":";;;;;;;AAwBA,YAAeA,uBAAA,CAAgB;AAAA,eAC7BC,gBAAA;AAAA,EACA,IAAA,EAAM,OAAM,GAAA,KAAO;AACjB,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,IAAA,EAAM,gBAAgB,CAAA;AAAA,MAC7B,WAAA,EACE,kEAAA;AAAA,MACF,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,MAAM,OAAO,oCAA6B;AAAA;AACpD,KACD,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -311,7 +311,8 @@ async function discoverManifestDeclarations(rootDir, configuration, errors) {
311
311
  const project = new core.Project(fslib.npath.toPortablePath(rootDir), { configuration });
312
312
  const pendingWorkspaces = [fslib.npath.toPortablePath(rootDir)];
313
313
  const visitedWorkspaces = /* @__PURE__ */ new Set();
314
- const declarations = [];
314
+ const patchDeclarations = [];
315
+ const resolutionDeclarations = [];
315
316
  while (pendingWorkspaces.length > 0) {
316
317
  const workspaceCwd = pendingWorkspaces.shift();
317
318
  if (workspaceCwd === void 0 || visitedWorkspaces.has(workspaceCwd)) {
@@ -336,6 +337,12 @@ async function discoverManifestDeclarations(rootDir, configuration, errors) {
336
337
  continue;
337
338
  }
338
339
  for (const [name, range] of Object.entries(entries)) {
340
+ if (field === "resolutions" && workspace.cwd === project.cwd && typeof range === "string") {
341
+ resolutionDeclarations.push({
342
+ pattern: name,
343
+ location: `${manifestPath}#${field}.${name}`
344
+ });
345
+ }
339
346
  if (typeof range !== "string" || !range.startsWith("patch:")) {
340
347
  continue;
341
348
  }
@@ -351,7 +358,7 @@ async function discoverManifestDeclarations(rootDir, configuration, errors) {
351
358
  origin: "manifest"
352
359
  });
353
360
  if (declaration) {
354
- declarations.push(declaration);
361
+ patchDeclarations.push(declaration);
355
362
  }
356
363
  } catch (error) {
357
364
  errors.push({
@@ -365,20 +372,21 @@ async function discoverManifestDeclarations(rootDir, configuration, errors) {
365
372
  }
366
373
  }
367
374
  }
368
- return declarations;
375
+ return { patchDeclarations, resolutionDeclarations };
369
376
  }
370
- function discoverLockfileDeclarations(rootDir, configuration, lockfileContent, errors) {
371
- let lockfileData;
377
+ function parseLockfile(lockfileContent, errors) {
372
378
  try {
373
- lockfileData = parsers.parseSyml(lockfileContent);
379
+ return parsers.parseSyml(lockfileContent);
374
380
  } catch (error) {
375
381
  errors.push({
376
382
  kind: "malformed-lockfile",
377
383
  message: `Failed to parse yarn.lock: ${String(error)}`,
378
384
  location: "yarn.lock"
379
385
  });
380
- return [];
386
+ return void 0;
381
387
  }
388
+ }
389
+ function discoverLockfileDeclarations(rootDir, configuration, lockfileData, errors) {
382
390
  const declarations = [];
383
391
  for (const [key, lockfileEntry] of Object.entries(lockfileData)) {
384
392
  if (key === "__metadata") {
@@ -482,6 +490,111 @@ function discoverLockfileDeclarations(rootDir, configuration, lockfileContent, e
482
490
  }
483
491
  return declarations;
484
492
  }
493
+ function getLockfileLocator(lockfileEntry, configuration) {
494
+ if (typeof lockfileEntry.resolution !== "string") {
495
+ return void 0;
496
+ }
497
+ try {
498
+ return configuration.normalizeLocator(
499
+ core.structUtils.parseLocator(lockfileEntry.resolution, true)
500
+ );
501
+ } catch {
502
+ return void 0;
503
+ }
504
+ }
505
+ function resolutionMatchesDependency(options) {
506
+ const { resolution, configuration, parentLocator } = options;
507
+ if (resolution.from) {
508
+ if (parentLocator === void 0 || resolution.from.fullName !== core.structUtils.stringifyIdent(parentLocator)) {
509
+ return false;
510
+ }
511
+ const normalizedFrom = configuration.normalizeLocator(
512
+ core.structUtils.makeLocator(
513
+ core.structUtils.parseIdent(resolution.from.fullName),
514
+ resolution.from.description ?? parentLocator.reference
515
+ )
516
+ );
517
+ if (normalizedFrom.locatorHash !== parentLocator.locatorHash) {
518
+ return false;
519
+ }
520
+ }
521
+ const dependency = configuration.normalizeDependency(
522
+ core.structUtils.makeDescriptor(
523
+ core.structUtils.parseIdent(options.dependencyName),
524
+ options.dependencyRange
525
+ )
526
+ );
527
+ if (resolution.descriptor.fullName !== core.structUtils.stringifyIdent(dependency)) {
528
+ return false;
529
+ }
530
+ const normalizedDescriptor = configuration.normalizeDependency(
531
+ core.structUtils.makeDescriptor(
532
+ core.structUtils.parseIdent(resolution.descriptor.fullName),
533
+ resolution.descriptor.description ?? dependency.range
534
+ )
535
+ );
536
+ return normalizedDescriptor.descriptorHash === dependency.descriptorHash;
537
+ }
538
+ function validateResolutions(options) {
539
+ const lockfileEntries = Object.entries(options.lockfileData).filter(([key, value]) => key !== "__metadata" && isRecord(value)).map(([, value]) => ({
540
+ entry: value,
541
+ parentLocator: getLockfileLocator(
542
+ value,
543
+ options.configuration
544
+ )
545
+ }));
546
+ const hasRootWorkspace = lockfileEntries.some(
547
+ ({ parentLocator }) => parentLocator?.reference === "workspace:."
548
+ );
549
+ if (!hasRootWorkspace) {
550
+ return { errors: [], unusedLocations: /* @__PURE__ */ new Set() };
551
+ }
552
+ const errors = [];
553
+ const unusedLocations = /* @__PURE__ */ new Set();
554
+ for (const declaration of options.declarations) {
555
+ let resolution;
556
+ try {
557
+ resolution = parsers.parseResolution(declaration.pattern);
558
+ } catch {
559
+ continue;
560
+ }
561
+ const matches = lockfileEntries.some(({ entry, parentLocator }) => {
562
+ return ["dependencies", "optionalDependencies"].some((field) => {
563
+ const dependencies = entry[field];
564
+ if (!isRecord(dependencies)) {
565
+ return false;
566
+ }
567
+ return Object.entries(dependencies).some(
568
+ ([dependencyName, dependencyRange]) => {
569
+ if (typeof dependencyRange !== "string") {
570
+ return false;
571
+ }
572
+ try {
573
+ return resolutionMatchesDependency({
574
+ resolution,
575
+ dependencyName,
576
+ dependencyRange,
577
+ parentLocator,
578
+ configuration: options.configuration
579
+ });
580
+ } catch {
581
+ return false;
582
+ }
583
+ }
584
+ );
585
+ });
586
+ });
587
+ if (!matches) {
588
+ unusedLocations.add(declaration.location);
589
+ errors.push({
590
+ kind: "unused-resolution",
591
+ message: `Resolution '${declaration.pattern}' does not match any dependency request in yarn.lock`,
592
+ location: declaration.location
593
+ });
594
+ }
595
+ }
596
+ return { errors, unusedLocations };
597
+ }
485
598
  async function readYarnConfiguration(rootDir, env) {
486
599
  return withConfigurationEnvironment(env, async () => {
487
600
  return core.Configuration.find(
@@ -701,12 +814,44 @@ async function verifyYarnPatches(options) {
701
814
  const rootDir = path__default.default.resolve(options.rootDir);
702
815
  const errors = [];
703
816
  const configuration = await readYarnConfiguration(rootDir, options.env);
704
- const manifestDeclarations = await discoverManifestDeclarations(
705
- rootDir,
706
- configuration,
707
- errors
817
+ const { patchDeclarations, resolutionDeclarations } = await discoverManifestDeclarations(rootDir, configuration, errors);
818
+ let lockfileData;
819
+ try {
820
+ const lockfileContent = await fs__default.default.readFile(
821
+ path__default.default.join(rootDir, "yarn.lock"),
822
+ "utf8"
823
+ );
824
+ lockfileData = parseLockfile(lockfileContent, errors);
825
+ } catch (error) {
826
+ if (!isErrorWithCode(error, "ENOENT")) {
827
+ throw error;
828
+ }
829
+ errors.push({
830
+ kind: "missing-lockfile",
831
+ message: "No yarn.lock found",
832
+ location: "yarn.lock"
833
+ });
834
+ }
835
+ let unusedResolutionLocations = /* @__PURE__ */ new Set();
836
+ if (lockfileData !== void 0) {
837
+ const resolutionValidation = validateResolutions({
838
+ declarations: resolutionDeclarations,
839
+ lockfileData,
840
+ configuration
841
+ });
842
+ errors.push(...resolutionValidation.errors);
843
+ unusedResolutionLocations = resolutionValidation.unusedLocations;
844
+ }
845
+ const manifestDeclaredPatchFiles = new Set(
846
+ patchDeclarations.flatMap(
847
+ (declaration) => declaration.paths.map((patchPath) => patchPath.absolute)
848
+ )
849
+ );
850
+ const uniqueManifestDeclarations = uniqueDeclarations(
851
+ patchDeclarations.filter(
852
+ (declaration) => !unusedResolutionLocations.has(declaration.location)
853
+ )
708
854
  );
709
- const uniqueManifestDeclarations = uniqueDeclarations(manifestDeclarations);
710
855
  const referencedPatchFiles = /* @__PURE__ */ new Map();
711
856
  for (const declaration of uniqueManifestDeclarations.values()) {
712
857
  for (const patchPath of declaration.paths) {
@@ -737,7 +882,7 @@ async function verifyYarnPatches(options) {
737
882
  const patchFolder = fslib.npath.fromPortablePath(configuration.get("patchFolder"));
738
883
  const patchFiles = await findPatchFiles(patchFolder);
739
884
  for (const patchFile of patchFiles) {
740
- if (!referencedPatchFiles.has(patchFile)) {
885
+ if (!manifestDeclaredPatchFiles.has(patchFile)) {
741
886
  const relative = relativePath(rootDir, patchFile);
742
887
  errors.push({
743
888
  kind: "orphaned-patch-file",
@@ -746,28 +891,12 @@ async function verifyYarnPatches(options) {
746
891
  });
747
892
  }
748
893
  }
749
- let lockfileContent;
750
- try {
751
- lockfileContent = await fs__default.default.readFile(
752
- path__default.default.join(rootDir, "yarn.lock"),
753
- "utf8"
754
- );
755
- } catch (error) {
756
- if (!isErrorWithCode(error, "ENOENT")) {
757
- throw error;
758
- }
759
- errors.push({
760
- kind: "missing-lockfile",
761
- message: "No yarn.lock found",
762
- location: "yarn.lock"
763
- });
764
- }
765
- if (lockfileContent !== void 0) {
894
+ if (lockfileData !== void 0) {
766
895
  const lockfileDeclarations = uniqueDeclarations(
767
896
  discoverLockfileDeclarations(
768
897
  rootDir,
769
898
  configuration,
770
- lockfileContent,
899
+ lockfileData,
771
900
  errors
772
901
  )
773
902
  );
@@ -1 +1 @@
1
- {"version":3,"file":"verifyYarnPatches.cjs.js","sources":["../../src/lib/verifyYarnPatches.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 getManifestByVersion,\n type ReleaseManifest,\n} from '@backstage/release-manifests';\nimport {\n Configuration,\n httpUtils,\n semverUtils,\n structUtils,\n} from '@yarnpkg/core';\nimport { Project, TAG_REGEXP, Workspace } from '@yarnpkg/core';\nimport type { Descriptor, PluginConfiguration } from '@yarnpkg/core';\nimport { npath, ppath } from '@yarnpkg/fslib';\nimport { parseResolution, parseSyml } from '@yarnpkg/parsers';\nimport patchPlugin from '@yarnpkg/plugin-patch';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport type PatchVerificationErrorKind =\n | 'backstage-manifest-load-failure'\n | 'backstage-package-missing'\n | 'backstage-patch-holdback'\n | 'incompatible-patch-declarations'\n | 'lockfile-mismatch'\n | 'malformed-lockfile'\n | 'malformed-patch-reference'\n | 'missing-lockfile'\n | 'missing-patch-file'\n | 'orphaned-patch-file';\n\nexport type PatchVerificationError = {\n kind: PatchVerificationErrorKind;\n message: string;\n location?: string;\n};\n\nexport type VerifyYarnPatchesOptions = {\n rootDir: string;\n env?: NodeJS.ProcessEnv;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type VerifyYarnPatchesResult = {\n patchCount: number;\n backstageCheck: 'verified' | 'skipped';\n errors: PatchVerificationError[];\n};\n\ntype PatchDeclaration = {\n patchedIdent: string;\n source: string;\n resolvedSource?: string;\n components: string[];\n parentLocator?: string;\n canMatchManifest: boolean;\n projectOwned: boolean;\n paths: LocalPatchPath[];\n location: string;\n};\n\ntype LocalPatchPath = {\n absolute: string;\n relative: string;\n};\n\ntype PatchedBackstagePackage = {\n name: string;\n version: string;\n location: string;\n};\n\nconst MANIFEST_FIELDS = [\n 'resolutions',\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n] as const;\n\nconst PATCH_PLUGIN_CONFIGURATION: PluginConfiguration = {\n modules: new Map([['@yarnpkg/plugin-patch', patchPlugin]]),\n plugins: new Set(['@yarnpkg/plugin-patch']),\n};\n\n// Yarn Configuration.find has no environment parameter and reads process.env.\n// Serialize the narrow overlay so concurrent verifications cannot interleave.\nlet configurationEnvironmentQueue = Promise.resolve();\n\nfunction relativePath(rootDir: string, targetPath: string): string {\n return path.relative(rootDir, targetPath).split(path.sep).join('/');\n}\n\nfunction compareStrings(left: string, right: string): number {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction sortErrors(\n errors: PatchVerificationError[],\n): PatchVerificationError[] {\n return errors.sort((left, right) => {\n return (\n compareStrings(left.location ?? '', right.location ?? '') ||\n compareStrings(left.kind, right.kind) ||\n compareStrings(left.message, right.message)\n );\n });\n}\n\nfunction isErrorWithCode(error: unknown, code: string): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === code\n );\n}\n\nfunction getPatchPathWithoutFlags(patchPath: string): string {\n if (patchPath.startsWith('~builtin<')) {\n return patchPath.slice(1);\n }\n const flagIndex = patchPath.lastIndexOf('!');\n return flagIndex === -1 ? patchPath : patchPath.slice(flagIndex + 1);\n}\n\nfunction isBuiltinPatchPath(patchPath: string): boolean {\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n return (\n pathWithoutFlags.startsWith('builtin<') && pathWithoutFlags.endsWith('>')\n );\n}\n\ntype PatchParent = {\n directory?: string;\n locator?: string;\n};\n\nfunction getPatchParent(\n rootDir: string,\n fallbackDir: string,\n locatorValue: unknown,\n): PatchParent {\n if (typeof locatorValue !== 'string') {\n return { directory: fallbackDir };\n }\n\n const parentLocator = structUtils.parseLocator(locatorValue, true);\n const locator = structUtils.stringifyLocator(parentLocator);\n const parentRange = structUtils.parseRange(parentLocator.reference);\n if (parentRange.protocol !== 'workspace:') {\n return { locator };\n }\n\n return {\n directory: path.resolve(rootDir, parentRange.selector),\n locator,\n };\n}\n\nfunction resolvePatchPath(\n rootDir: string,\n parentDir: string | undefined,\n patchPath: string,\n): LocalPatchPath | undefined {\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n if (isBuiltinPatchPath(pathWithoutFlags)) {\n return undefined;\n }\n\n const portablePatchPath = npath.toPortablePath(pathWithoutFlags);\n let absolute: string | undefined;\n if (pathWithoutFlags.startsWith('~/')) {\n absolute = path.resolve(rootDir, pathWithoutFlags.slice(2));\n } else if (ppath.isAbsolute(portablePatchPath)) {\n absolute = npath.fromPortablePath(portablePatchPath);\n } else if (parentDir !== undefined) {\n absolute = path.resolve(parentDir, pathWithoutFlags);\n }\n if (absolute === undefined) {\n return undefined;\n }\n return {\n absolute,\n relative: relativePath(rootDir, absolute),\n };\n}\n\nfunction parsePatchDeclaration(options: {\n rootDir: string;\n parentDir: string;\n parentLocator?: string;\n patchedIdent: string;\n range: string;\n location: string;\n origin: 'manifest' | 'lockfile';\n}): PatchDeclaration | undefined {\n const parsedRange = structUtils.parseRange(options.range, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const sourceDescriptor = structUtils.parseDescriptor(\n parsedRange.source,\n true,\n );\n const source = structUtils.stringifyDescriptor(sourceDescriptor);\n const parent = getPatchParent(\n options.rootDir,\n options.parentDir,\n parsedRange.params?.locator,\n );\n const paths: LocalPatchPath[] = [];\n let hasDependencyOwnedPath = false;\n let hasProjectRelativePath = false;\n const patchPaths =\n parsedRange.selector === '' ? [] : parsedRange.selector.split('&');\n const components = patchPaths.map(patchPath => {\n const flagIndex = patchPath.lastIndexOf('!');\n const flags = flagIndex === -1 ? '' : patchPath.slice(0, flagIndex + 1);\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n if (isBuiltinPatchPath(patchPath)) {\n return patchPath;\n }\n\n const localPath = resolvePatchPath(\n options.rootDir,\n parent.directory,\n patchPath,\n );\n if (localPath) {\n paths.push(localPath);\n if (\n !pathWithoutFlags.startsWith('~/') &&\n !ppath.isAbsolute(npath.toPortablePath(pathWithoutFlags))\n ) {\n hasProjectRelativePath = true;\n }\n return `${flags}local<${localPath.absolute}>`;\n }\n hasDependencyOwnedPath = true;\n return `${flags}relative<${pathWithoutFlags}>`;\n });\n\n if (components.length === 0) {\n return undefined;\n }\n\n return {\n patchedIdent: options.patchedIdent,\n source,\n components,\n parentLocator:\n parent.locator ??\n (hasProjectRelativePath ? options.parentLocator : undefined),\n canMatchManifest: !hasDependencyOwnedPath,\n projectOwned:\n paths.length > 0 ||\n (options.origin === 'manifest' && !hasDependencyOwnedPath),\n paths,\n location: options.location,\n };\n}\n\nfunction declarationKey(declaration: PatchDeclaration): string {\n return `${declaration.parentLocator ?? ''}\\0${declaration.patchedIdent}\\0${\n declaration.source\n }\\0${declaration.components.join('\\0')}`;\n}\n\nfunction declarationDescription(declaration: PatchDeclaration): string {\n return declaration.paths.map(patchPath => patchPath.relative).join(', ');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isYarnPluginsKey(key: string): boolean {\n return key.toLowerCase() === 'yarn_plugins';\n}\n\nfunction setEnvironmentValue(key: string, value: string | undefined): void {\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n}\n\nasync function withConfigurationEnvironment<T>(\n env: NodeJS.ProcessEnv | undefined,\n action: () => Promise<T>,\n): Promise<T> {\n const waitForTurn = configurationEnvironmentQueue;\n let releaseTurn = () => {};\n const turnComplete = new Promise<void>(resolve => {\n releaseTurn = resolve;\n });\n configurationEnvironmentQueue = waitForTurn.then(() => turnComplete);\n await waitForTurn;\n\n const environmentState = new Map<\n string,\n { previous: string | undefined; applied: string | undefined }\n >();\n\n try {\n const targetEnvironment = env ? { ...env } : undefined;\n if (targetEnvironment) {\n for (const key of Object.keys(targetEnvironment)) {\n if (isYarnPluginsKey(key)) {\n delete targetEnvironment[key];\n }\n }\n }\n\n const keysToScope = new Set(\n targetEnvironment\n ? [...Object.keys(process.env), ...Object.keys(env ?? {})]\n : Object.keys(process.env).filter(isYarnPluginsKey),\n );\n for (const key of keysToScope) {\n const previous = process.env[key];\n const applied = isYarnPluginsKey(key)\n ? undefined\n : targetEnvironment?.[key];\n environmentState.set(key, { previous, applied });\n setEnvironmentValue(key, applied);\n }\n\n return await action();\n } finally {\n for (const [key, { previous, applied }] of environmentState) {\n // Keep values changed by unrelated async work while Yarn was loading.\n if (process.env[key] === applied) {\n setEnvironmentValue(key, previous);\n }\n }\n releaseTurn();\n }\n}\n\nfunction arraysEqual(left: string[], right: string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction getNpmResolutionRange(\n range: ReturnType<typeof structUtils.parseRange>,\n): string | undefined {\n if (\n range.protocol === 'npm:' &&\n semverUtils.validRange(range.selector) !== null\n ) {\n return range.selector;\n }\n\n const npmVersion = range.params?.npm;\n if (\n range.protocol === 'backstage:' &&\n range.selector === '^' &&\n typeof npmVersion === 'string' &&\n semverUtils.clean(npmVersion) !== null\n ) {\n return `^${npmVersion}`;\n }\n\n return undefined;\n}\n\nfunction normalizeNpmAliasSource(descriptor: Descriptor): Descriptor {\n const range = structUtils.parseRange(descriptor.range);\n if (range.protocol !== 'npm:') {\n return descriptor;\n }\n\n const aliasTarget = structUtils.tryParseDescriptor(range.selector, true);\n if (!aliasTarget) {\n return descriptor;\n }\n\n const aliasTargetRange = structUtils.parseRange(aliasTarget.range);\n return aliasTargetRange.protocol === null\n ? structUtils.makeDescriptor(aliasTarget, `npm:${aliasTarget.range}`)\n : aliasTarget;\n}\n\nfunction npmSourceAgrees(\n descriptorRange: ReturnType<typeof structUtils.parseRange>,\n locatorRange: ReturnType<typeof structUtils.parseRange>,\n): boolean | undefined {\n if (locatorRange.protocol !== 'npm:') {\n return undefined;\n }\n\n const resolvedVersion = semverUtils.clean(locatorRange.selector);\n if (resolvedVersion === null) {\n return false;\n }\n\n const resolutionRange = getNpmResolutionRange(descriptorRange);\n if (resolutionRange !== undefined) {\n return semverUtils.satisfiesWithPrereleases(\n resolvedVersion,\n resolutionRange,\n );\n }\n\n return descriptorRange.protocol === 'npm:'\n ? TAG_REGEXP.test(descriptorRange.selector)\n : undefined;\n}\n\nfunction nonNpmSourceAgrees(\n descriptorRange: ReturnType<typeof structUtils.parseRange>,\n locatorRange: ReturnType<typeof structUtils.parseRange>,\n): boolean {\n if (descriptorRange.protocol !== locatorRange.protocol) {\n return false;\n }\n\n if (descriptorRange.protocol === 'workspace:') {\n const selector = descriptorRange.selector;\n if (\n selector === '*' ||\n selector === '^' ||\n selector === '~' ||\n semverUtils.validRange(selector) !== null\n ) {\n return true;\n }\n }\n\n const descriptorIdentity = descriptorRange.source ?? descriptorRange.selector;\n const locatorIdentity = locatorRange.source ?? locatorRange.selector;\n if (descriptorIdentity !== locatorIdentity) {\n return false;\n }\n\n const descriptorParent = descriptorRange.params?.locator;\n if (\n typeof descriptorParent === 'string' &&\n descriptorParent !== locatorRange.params?.locator\n ) {\n return false;\n }\n\n if (\n descriptorRange.source !== null &&\n descriptorRange.selector.startsWith('commit=')\n ) {\n return descriptorRange.selector === locatorRange.selector;\n }\n\n return true;\n}\n\nfunction patchDescriptorAgreesWithLocator(options: {\n configuration: Configuration;\n descriptor: ReturnType<typeof structUtils.parseDescriptor>;\n descriptorDeclaration: PatchDeclaration | undefined;\n locator: ReturnType<typeof structUtils.parseLocator>;\n locatorDeclaration: PatchDeclaration | undefined;\n}): boolean {\n if (!structUtils.areIdentsEqual(options.descriptor, options.locator)) {\n return false;\n }\n\n const descriptorRange = structUtils.parseRange(options.descriptor.range, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const locatorRange = structUtils.parseRange(options.locator.reference, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const sourceDescriptor = normalizeNpmAliasSource(\n options.configuration.normalizeDependency(\n structUtils.parseDescriptor(descriptorRange.source, true),\n ),\n );\n const sourceLocator = structUtils.parseLocator(locatorRange.source, true);\n if (!structUtils.areIdentsEqual(sourceDescriptor, sourceLocator)) {\n return false;\n }\n\n const descriptorSourceRange = structUtils.parseRange(sourceDescriptor.range);\n const locatorSourceRange = structUtils.parseRange(sourceLocator.reference);\n const npmAgreement = npmSourceAgrees(\n descriptorSourceRange,\n locatorSourceRange,\n );\n if (\n npmAgreement === false ||\n (npmAgreement === undefined &&\n !nonNpmSourceAgrees(descriptorSourceRange, locatorSourceRange))\n ) {\n return false;\n }\n\n return (\n options.descriptorDeclaration?.parentLocator ===\n options.locatorDeclaration?.parentLocator &&\n arraysEqual(\n options.descriptorDeclaration?.components ?? [],\n options.locatorDeclaration?.components ?? [],\n )\n );\n}\n\nasync function discoverManifestDeclarations(\n rootDir: string,\n configuration: Configuration,\n errors: PatchVerificationError[],\n): Promise<PatchDeclaration[]> {\n const project = new Project(npath.toPortablePath(rootDir), { configuration });\n const pendingWorkspaces = [npath.toPortablePath(rootDir)];\n const visitedWorkspaces = new Set<string>();\n const declarations: PatchDeclaration[] = [];\n\n while (pendingWorkspaces.length > 0) {\n const workspaceCwd = pendingWorkspaces.shift();\n if (workspaceCwd === undefined || visitedWorkspaces.has(workspaceCwd)) {\n continue;\n }\n visitedWorkspaces.add(workspaceCwd);\n\n const workspace = new Workspace(workspaceCwd, { project });\n await workspace.setup();\n pendingWorkspaces.push(...workspace.workspacesCwds);\n\n const manifestDir = npath.fromPortablePath(workspace.cwd);\n const manifestPath = relativePath(\n rootDir,\n path.join(manifestDir, 'package.json'),\n );\n const manifestJson: Record<string, unknown> = workspace.manifest.raw;\n const parentLocator = structUtils.stringifyLocator(\n workspace.anchoredLocator,\n );\n\n for (const field of MANIFEST_FIELDS) {\n const entries = manifestJson[field];\n if (typeof entries !== 'object' || entries === null) {\n continue;\n }\n\n for (const [name, range] of Object.entries(entries)) {\n if (typeof range !== 'string' || !range.startsWith('patch:')) {\n continue;\n }\n\n const location = `${manifestPath}#${field}.${name}`;\n try {\n const declaration = parsePatchDeclaration({\n rootDir,\n parentDir: manifestDir,\n parentLocator,\n patchedIdent:\n field === 'resolutions'\n ? parseResolution(name).descriptor.fullName\n : structUtils.stringifyIdent(structUtils.parseIdent(name)),\n range,\n location,\n origin: 'manifest',\n });\n if (declaration) {\n declarations.push(declaration);\n }\n } catch (error) {\n errors.push({\n kind: 'malformed-patch-reference',\n message: `Invalid patch reference for '${name}' in ${field}: ${String(\n error,\n )}`,\n location,\n });\n }\n }\n }\n }\n\n return declarations;\n}\n\nfunction discoverLockfileDeclarations(\n rootDir: string,\n configuration: Configuration,\n lockfileContent: string,\n errors: PatchVerificationError[],\n): PatchDeclaration[] {\n let lockfileData: Record<string, unknown>;\n try {\n lockfileData = parseSyml(lockfileContent);\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Failed to parse yarn.lock: ${String(error)}`,\n location: 'yarn.lock',\n });\n return [];\n }\n\n const declarations: PatchDeclaration[] = [];\n for (const [key, lockfileEntry] of Object.entries(lockfileData)) {\n if (key === '__metadata') {\n continue;\n }\n\n const patchDescriptors: Array<{\n descriptor: ReturnType<typeof structUtils.parseDescriptor>;\n declaration: PatchDeclaration | undefined;\n }> = [];\n for (const entry of key.split(', ')) {\n try {\n const descriptor = structUtils.parseDescriptor(entry, true);\n if (!descriptor.range.startsWith('patch:')) {\n continue;\n }\n const declaration = parsePatchDeclaration({\n rootDir,\n parentDir: rootDir,\n patchedIdent: structUtils.stringifyIdent(descriptor),\n range: descriptor.range,\n location: 'yarn.lock',\n origin: 'lockfile',\n });\n if (declaration?.canMatchManifest) {\n declarations.push(declaration);\n }\n patchDescriptors.push({ descriptor, declaration });\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Invalid patch entry '${entry}' in yarn.lock: ${String(\n error,\n )}`,\n location: 'yarn.lock',\n });\n }\n }\n\n if (patchDescriptors.length === 0) {\n continue;\n }\n\n const resolution = isRecord(lockfileEntry)\n ? lockfileEntry.resolution\n : undefined;\n if (typeof resolution !== 'string') {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Patch entry '${key}' is missing its resolution locator`,\n location: 'yarn.lock',\n });\n continue;\n }\n\n try {\n const locator = structUtils.parseLocator(resolution, true);\n if (!locator.reference.startsWith('patch:')) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch entry '${key}' disagrees with its resolution locator '${resolution}'`,\n location: 'yarn.lock',\n });\n continue;\n }\n const locatorDeclaration = parsePatchDeclaration({\n rootDir,\n parentDir: rootDir,\n patchedIdent: structUtils.stringifyIdent(locator),\n range: locator.reference,\n location: 'yarn.lock',\n origin: 'lockfile',\n });\n const locatorRange = structUtils.parseRange(locator.reference, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const resolvedSource = structUtils.stringifyLocator(\n structUtils.parseLocator(locatorRange.source, true),\n );\n for (const { declaration } of patchDescriptors) {\n if (declaration) {\n declaration.resolvedSource = resolvedSource;\n }\n }\n if (\n patchDescriptors.some(\n ({ descriptor, declaration }) =>\n !patchDescriptorAgreesWithLocator({\n configuration,\n descriptor,\n descriptorDeclaration: declaration,\n locator,\n locatorDeclaration,\n }),\n )\n ) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch entry '${key}' disagrees with its resolution locator '${resolution}'`,\n location: 'yarn.lock',\n });\n }\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Patch entry '${key}' has an invalid resolution locator '${resolution}': ${String(\n error,\n )}`,\n location: 'yarn.lock',\n });\n }\n }\n\n return declarations;\n}\n\nasync function readYarnConfiguration(\n rootDir: string,\n env: NodeJS.ProcessEnv | undefined,\n): Promise<Configuration> {\n return withConfigurationEnvironment(env, async () => {\n // Yarn still applies inherited rc files when useRc is false; this only\n // prevents project rc files from loading arbitrary third-party plugins.\n return Configuration.find(\n npath.toPortablePath(rootDir),\n PATCH_PLUGIN_CONFIGURATION,\n {\n strict: false,\n useRc: false,\n },\n );\n });\n}\n\nasync function findPatchFiles(\n directory: string,\n realpathAncestry: ReadonlySet<string> = new Set(),\n): Promise<string[]> {\n let realDirectory;\n try {\n realDirectory = await fs.realpath(directory);\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return [];\n }\n throw error;\n }\n if (realpathAncestry.has(realDirectory)) {\n return [];\n }\n const nextAncestry = new Set(realpathAncestry).add(realDirectory);\n\n let entries;\n try {\n entries = await fs.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return [];\n }\n throw error;\n }\n\n const files = await Promise.all(\n entries.map(async entry => {\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return findPatchFiles(entryPath, nextAncestry);\n }\n if (entry.isSymbolicLink()) {\n try {\n const targetStats = await fs.stat(entryPath);\n if (targetStats.isDirectory()) {\n return findPatchFiles(entryPath, nextAncestry);\n }\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n }\n return [entryPath];\n }\n return entry.isFile() ? [entryPath] : [];\n }),\n );\n return files.flat().sort();\n}\n\nfunction uniqueDeclarations(\n declarations: PatchDeclaration[],\n): Map<string, PatchDeclaration> {\n const unique = new Map<string, PatchDeclaration>();\n for (const declaration of declarations) {\n const key = declarationKey(declaration);\n if (!unique.has(key)) {\n unique.set(key, declaration);\n }\n }\n return unique;\n}\n\nfunction getPatchedBackstagePackages(\n declarations: Iterable<PatchDeclaration>,\n): PatchedBackstagePackage[] {\n const packages: PatchedBackstagePackage[] = [];\n for (const declaration of declarations) {\n const declaredSource = normalizeNpmAliasSource(\n structUtils.parseDescriptor(declaration.source, true),\n );\n const resolvedSource = declaration.resolvedSource;\n const source = resolvedSource\n ? structUtils.parseLocator(resolvedSource, true)\n : declaredSource;\n if (source.scope !== 'backstage') {\n continue;\n }\n const range = structUtils.parseRange(\n 'reference' in source ? source.reference : source.range,\n );\n if (\n range.protocol !== 'npm:' ||\n semverUtils.clean(range.selector) === null\n ) {\n continue;\n }\n packages.push({\n name: structUtils.stringifyIdent(source),\n version: range.selector,\n location: declaration.location,\n });\n }\n return packages;\n}\n\nfunction isReleaseManifest(value: unknown): value is ReleaseManifest {\n return (\n isRecord(value) &&\n typeof value.releaseVersion === 'string' &&\n Array.isArray(value.packages) &&\n value.packages.every(\n packageEntry =>\n isRecord(packageEntry) &&\n typeof packageEntry.name === 'string' &&\n typeof packageEntry.version === 'string',\n )\n );\n}\n\nasync function readBackstageVersion(\n rootDir: string,\n): Promise<string | undefined> {\n try {\n const backstageJson: unknown = JSON.parse(\n await fs.readFile(path.join(rootDir, 'backstage.json'), 'utf8'),\n );\n if (!isRecord(backstageJson) || typeof backstageJson.version !== 'string') {\n throw new Error(\n \"backstage.json must contain a string 'version' property\",\n );\n }\n return backstageJson.version;\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function loadReleaseManifest(options: {\n backstageVersion: string;\n configuration: Configuration;\n env: NodeJS.ProcessEnv | undefined;\n fetch: typeof globalThis.fetch | undefined;\n}): Promise<ReleaseManifest> {\n const manifestFile = options.env?.BACKSTAGE_MANIFEST_FILE;\n const fetch =\n options.fetch ??\n (async (url: string) => {\n const manifest = await httpUtils.get(url, {\n configuration: options.configuration,\n jsonResponse: true,\n });\n return {\n status: 200,\n url,\n json: async () => manifest,\n };\n });\n const manifest: unknown = manifestFile\n ? JSON.parse(await fs.readFile(manifestFile, 'utf8'))\n : await getManifestByVersion({\n version: options.backstageVersion,\n versionsBaseUrl: options.env?.BACKSTAGE_VERSIONS_BASE_URL,\n fetch,\n });\n if (!isReleaseManifest(manifest)) {\n throw new Error('Backstage release manifest has an invalid format');\n }\n if (manifest.releaseVersion !== options.backstageVersion) {\n throw new Error(\n `Backstage release manifest version '${manifest.releaseVersion}' does not match selected version '${options.backstageVersion}'`,\n );\n }\n return manifest;\n}\n\nasync function validateBackstagePatches(options: {\n rootDir: string;\n declarations: Iterable<PatchDeclaration>;\n configuration: Configuration;\n env: NodeJS.ProcessEnv | undefined;\n fetch: typeof globalThis.fetch | undefined;\n}): Promise<{\n backstageCheck: VerifyYarnPatchesResult['backstageCheck'];\n errors: PatchVerificationError[];\n}> {\n const patchedPackages = getPatchedBackstagePackages(options.declarations);\n if (patchedPackages.length === 0) {\n return { backstageCheck: 'skipped', errors: [] };\n }\n\n let backstageVersion: string | undefined;\n try {\n backstageVersion = await readBackstageVersion(options.rootDir);\n } catch (error) {\n return {\n backstageCheck: 'verified',\n errors: [\n {\n kind: 'backstage-manifest-load-failure',\n message: `Failed to read Backstage release version: ${String(error)}`,\n location: 'backstage.json',\n },\n ],\n };\n }\n if (backstageVersion === undefined) {\n return { backstageCheck: 'skipped', errors: [] };\n }\n\n let releaseManifest: ReleaseManifest;\n try {\n releaseManifest = await loadReleaseManifest({\n backstageVersion,\n configuration: options.configuration,\n env: options.env,\n fetch: options.fetch,\n });\n } catch (error) {\n return {\n backstageCheck: 'verified',\n errors: [\n {\n kind: 'backstage-manifest-load-failure',\n message: `Failed to load Backstage release manifest for '${backstageVersion}': ${String(\n error,\n )}`,\n location: 'backstage.json',\n },\n ],\n };\n }\n\n const packageVersions = new Map(\n releaseManifest.packages.map(packageEntry => [\n packageEntry.name,\n packageEntry.version,\n ]),\n );\n const errors: PatchVerificationError[] = [];\n for (const patchedPackage of patchedPackages) {\n const releaseVersion = packageVersions.get(patchedPackage.name);\n if (releaseVersion === undefined) {\n errors.push({\n kind: 'backstage-package-missing',\n message: `Patched package '${patchedPackage.name}' is absent from Backstage release '${backstageVersion}'`,\n location: patchedPackage.location,\n });\n } else if (releaseVersion !== patchedPackage.version) {\n errors.push({\n kind: 'backstage-patch-holdback',\n message: `Patched package '${patchedPackage.name}' is at version '${patchedPackage.version}', but Backstage release '${backstageVersion}' requires version '${releaseVersion}'`,\n location: patchedPackage.location,\n });\n }\n }\n\n return { backstageCheck: 'verified', errors };\n}\n\nexport async function verifyYarnPatches(\n options: VerifyYarnPatchesOptions,\n): Promise<VerifyYarnPatchesResult> {\n const rootDir = path.resolve(options.rootDir);\n const errors: PatchVerificationError[] = [];\n const configuration = await readYarnConfiguration(rootDir, options.env);\n const manifestDeclarations = await discoverManifestDeclarations(\n rootDir,\n configuration,\n errors,\n );\n const uniqueManifestDeclarations = uniqueDeclarations(manifestDeclarations);\n const referencedPatchFiles = new Map<string, LocalPatchPath>();\n\n for (const declaration of uniqueManifestDeclarations.values()) {\n for (const patchPath of declaration.paths) {\n referencedPatchFiles.set(patchPath.absolute, patchPath);\n }\n }\n\n for (const [absolute, patchPath] of referencedPatchFiles) {\n try {\n const stats = await fs.stat(absolute);\n if (!stats.isFile()) {\n errors.push({\n kind: 'missing-patch-file',\n message: `Patch path '${patchPath.relative}' is not a regular file`,\n location: patchPath.relative,\n });\n }\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n errors.push({\n kind: 'missing-patch-file',\n message: `Patch file '${patchPath.relative}' does not exist`,\n location: patchPath.relative,\n });\n }\n }\n\n const patchFolder = npath.fromPortablePath(configuration.get('patchFolder'));\n const patchFiles = await findPatchFiles(patchFolder);\n for (const patchFile of patchFiles) {\n if (!referencedPatchFiles.has(patchFile)) {\n const relative = relativePath(rootDir, patchFile);\n errors.push({\n kind: 'orphaned-patch-file',\n message: `Patch file '${relative}' is not referenced by any manifest`,\n location: relative,\n });\n }\n }\n\n let lockfileContent: string | undefined;\n try {\n lockfileContent = await fs.readFile(\n path.join(rootDir, 'yarn.lock'),\n 'utf8',\n );\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n errors.push({\n kind: 'missing-lockfile',\n message: 'No yarn.lock found',\n location: 'yarn.lock',\n });\n }\n\n if (lockfileContent !== undefined) {\n const lockfileDeclarations = uniqueDeclarations(\n discoverLockfileDeclarations(\n rootDir,\n configuration,\n lockfileContent,\n errors,\n ),\n );\n\n for (const [key, declaration] of uniqueManifestDeclarations) {\n const lockfileDeclaration = lockfileDeclarations.get(key);\n if (!lockfileDeclaration) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch declaration for '${\n declaration.source\n }' using '${declarationDescription(\n declaration,\n )}' is missing from yarn.lock`,\n location: declaration.location,\n });\n } else {\n declaration.resolvedSource = lockfileDeclaration.resolvedSource;\n }\n }\n\n for (const [key, declaration] of lockfileDeclarations) {\n if (declaration.projectOwned && !uniqueManifestDeclarations.has(key)) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `yarn.lock contains patch declaration for '${\n declaration.source\n }' using '${declarationDescription(\n declaration,\n )}' that is absent from manifests`,\n location: 'yarn.lock',\n });\n }\n }\n }\n\n const sourcesByPatchFile = new Map<string, Set<string>>();\n for (const declaration of uniqueManifestDeclarations.values()) {\n for (const patchPath of declaration.paths) {\n let sources = sourcesByPatchFile.get(patchPath.absolute);\n if (!sources) {\n sources = new Set();\n sourcesByPatchFile.set(patchPath.absolute, sources);\n }\n sources.add(declaration.resolvedSource ?? declaration.source);\n }\n }\n\n for (const [absolute, sources] of sourcesByPatchFile) {\n if (sources.size <= 1) {\n continue;\n }\n const patchPath = referencedPatchFiles.get(absolute);\n if (!patchPath) {\n continue;\n }\n const sortedSources = [...sources].sort();\n errors.push({\n kind: 'incompatible-patch-declarations',\n message: `Patch file '${\n patchPath.relative\n }' is used for incompatible sources: ${sortedSources\n .map(source => `'${source}'`)\n .join(', ')}`,\n location: patchPath.relative,\n });\n }\n\n const backstageValidation = await validateBackstagePatches({\n rootDir,\n declarations: uniqueManifestDeclarations.values(),\n configuration,\n env: options.env,\n fetch: options.fetch,\n });\n errors.push(...backstageValidation.errors);\n\n return {\n patchCount: referencedPatchFiles.size,\n backstageCheck: backstageValidation.backstageCheck,\n errors: sortErrors(errors),\n };\n}\n"],"names":["patchPlugin","path","structUtils","npath","ppath","semverUtils","TAG_REGEXP","Project","Workspace","parseResolution","parseSyml","Configuration","fs","manifest","httpUtils","getManifestByVersion"],"mappings":";;;;;;;;;;;;;;;;AAuFA,MAAM,eAAA,GAAkB;AAAA,EACtB,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,0BAAA,GAAkD;AAAA,EACtD,OAAA,sBAAa,GAAA,CAAI,CAAC,CAAC,uBAAA,EAAyBA,4BAAW,CAAC,CAAC,CAAA;AAAA,EACzD,OAAA,kBAAS,IAAI,GAAA,CAAI,CAAC,uBAAuB,CAAC;AAC5C,CAAA;AAIA,IAAI,6BAAA,GAAgC,QAAQ,OAAA,EAAQ;AAEpD,SAAS,YAAA,CAAa,SAAiB,UAAA,EAA4B;AACjE,EAAA,OAAOC,qBAAA,CAAK,QAAA,CAAS,OAAA,EAAS,UAAU,CAAA,CAAE,MAAMA,qBAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpE;AAEA,SAAS,cAAA,CAAe,MAAc,KAAA,EAAuB;AAC3D,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WACP,MAAA,EAC0B;AAC1B,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU;AAClC,IAAA,OACE,eAAe,IAAA,CAAK,QAAA,IAAY,IAAI,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA,IACxD,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,CAAA,IACpC,eAAe,IAAA,CAAK,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,EAE9C,CAAC,CAAA;AACH;AAEA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAAuB;AAC9D,EAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,MAAA,IAAU,KAAA,IACV,MAAM,IAAA,KAAS,IAAA;AAEnB;AAEA,SAAS,yBAAyB,SAAA,EAA2B;AAC3D,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA,EAAG;AACrC,IAAA,OAAO,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC3C,EAAA,OAAO,cAAc,EAAA,GAAK,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,YAAY,CAAC,CAAA;AACrE;AAEA,SAAS,mBAAmB,SAAA,EAA4B;AACtD,EAAA,MAAM,gBAAA,GAAmB,yBAAyB,SAAS,CAAA;AAC3D,EAAA,OACE,iBAAiB,UAAA,CAAW,UAAU,CAAA,IAAK,gBAAA,CAAiB,SAAS,GAAG,CAAA;AAE5E;AAOA,SAAS,cAAA,CACP,OAAA,EACA,WAAA,EACA,YAAA,EACa;AACb,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,OAAO,EAAE,WAAW,WAAA,EAAY;AAAA,EAClC;AAEA,EAAA,MAAM,aAAA,GAAgBC,gBAAA,CAAY,YAAA,CAAa,YAAA,EAAc,IAAI,CAAA;AACjE,EAAA,MAAM,OAAA,GAAUA,gBAAA,CAAY,gBAAA,CAAiB,aAAa,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAcA,gBAAA,CAAY,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA;AAClE,EAAA,IAAI,WAAA,CAAY,aAAa,YAAA,EAAc;AACzC,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAWD,qBAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,IACrD;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CACP,OAAA,EACA,SAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,MAAM,gBAAA,GAAmB,yBAAyB,SAAS,CAAA;AAC3D,EAAA,IAAI,kBAAA,CAAmB,gBAAgB,CAAA,EAAG;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAA,GAAoBE,WAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AAC/D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,gBAAA,CAAiB,UAAA,CAAW,IAAI,CAAA,EAAG;AACrC,IAAA,QAAA,GAAWF,sBAAK,OAAA,CAAQ,OAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC5D,CAAA,MAAA,IAAWG,WAAA,CAAM,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC9C,IAAA,QAAA,GAAWD,WAAA,CAAM,iBAAiB,iBAAiB,CAAA;AAAA,EACrD,CAAA,MAAA,IAAW,cAAc,MAAA,EAAW;AAClC,IAAA,QAAA,GAAWF,qBAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,gBAAgB,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAA,EAAU,YAAA,CAAa,OAAA,EAAS,QAAQ;AAAA,GAC1C;AACF;AAEA,SAAS,sBAAsB,OAAA,EAQE;AAC/B,EAAA,MAAM,WAAA,GAAcC,gBAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO;AAAA,IACxD,eAAA,EAAiB,QAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,mBAAmBA,gBAAA,CAAY,eAAA;AAAA,IACnC,WAAA,CAAY,MAAA;AAAA,IACZ;AAAA,GACF;AACA,EAAA,MAAM,MAAA,GAASA,gBAAA,CAAY,mBAAA,CAAoB,gBAAgB,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,cAAA;AAAA,IACb,OAAA,CAAQ,OAAA;AAAA,IACR,OAAA,CAAQ,SAAA;AAAA,IACR,YAAY,MAAA,EAAQ;AAAA,GACtB;AACA,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,IAAI,sBAAA,GAAyB,KAAA;AAC7B,EAAA,IAAI,sBAAA,GAAyB,KAAA;AAC7B,EAAA,MAAM,UAAA,GACJ,YAAY,QAAA,KAAa,EAAA,GAAK,EAAC,GAAI,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACnE,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,KAAa;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,cAAc,EAAA,GAAK,EAAA,GAAK,UAAU,KAAA,CAAM,CAAA,EAAG,YAAY,CAAC,CAAA;AACtE,IAAA,MAAM,gBAAA,GAAmB,yBAAyB,SAAS,CAAA;AAC3D,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,gBAAA;AAAA,MAChB,OAAA,CAAQ,OAAA;AAAA,MACR,MAAA,CAAO,SAAA;AAAA,MACP;AAAA,KACF;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,MAAA,IACE,CAAC,gBAAA,CAAiB,UAAA,CAAW,IAAI,CAAA,IACjC,CAACE,WAAA,CAAM,UAAA,CAAWD,WAAA,CAAM,cAAA,CAAe,gBAAgB,CAAC,CAAA,EACxD;AACA,QAAA,sBAAA,GAAyB,IAAA;AAAA,MAC3B;AACA,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,MAAA,EAAS,SAAA,CAAU,QAAQ,CAAA,CAAA,CAAA;AAAA,IAC5C;AACA,IAAA,sBAAA,GAAyB,IAAA;AACzB,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,SAAA,EAAY,gBAAgB,CAAA,CAAA,CAAA;AAAA,EAC7C,CAAC,CAAA;AAED,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,MAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA,EACE,MAAA,CAAO,OAAA,KACN,sBAAA,GAAyB,QAAQ,aAAA,GAAgB,MAAA,CAAA;AAAA,IACpD,kBAAkB,CAAC,sBAAA;AAAA,IACnB,cACE,KAAA,CAAM,MAAA,GAAS,KACd,OAAA,CAAQ,MAAA,KAAW,cAAc,CAAC,sBAAA;AAAA,IACrC,KAAA;AAAA,IACA,UAAU,OAAA,CAAQ;AAAA,GACpB;AACF;AAEA,SAAS,eAAe,WAAA,EAAuC;AAC7D,EAAA,OAAO,CAAA,EAAG,WAAA,CAAY,aAAA,IAAiB,EAAE,KAAK,WAAA,CAAY,YAAY,CAAA,EAAA,EACpE,WAAA,CAAY,MACd,CAAA,EAAA,EAAK,WAAA,CAAY,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACxC;AAEA,SAAS,uBAAuB,WAAA,EAAuC;AACrE,EAAA,OAAO,WAAA,CAAY,MAAM,GAAA,CAAI,CAAA,SAAA,KAAa,UAAU,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AACzE;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,OAAO,GAAA,CAAI,aAAY,KAAM,cAAA;AAC/B;AAEA,SAAS,mBAAA,CAAoB,KAAa,KAAA,EAAiC;AACzE,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,EACxB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACrB;AACF;AAEA,eAAe,4BAAA,CACb,KACA,MAAA,EACY;AACZ,EAAA,MAAM,WAAA,GAAc,6BAAA;AACpB,EAAA,IAAI,cAAc,MAAM;AAAA,EAAC,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAI,OAAA,CAAc,CAAA,OAAA,KAAW;AAChD,IAAA,WAAA,GAAc,OAAA;AAAA,EAChB,CAAC,CAAA;AACD,EAAA,6BAAA,GAAgC,WAAA,CAAY,IAAA,CAAK,MAAM,YAAY,CAAA;AACnE,EAAA,MAAM,WAAA;AAEN,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAG3B;AAEF,EAAA,IAAI;AACF,IAAA,MAAM,iBAAA,GAAoB,GAAA,GAAM,EAAE,GAAG,KAAI,GAAI,KAAA,CAAA;AAC7C,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,EAAG;AAChD,QAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,UAAA,OAAO,kBAAkB,GAAG,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,IAAI,GAAA;AAAA,MACtB,iBAAA,GACI,CAAC,GAAG,MAAA,CAAO,KAAK,OAAA,CAAQ,GAAG,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,OAAO,EAAE,CAAC,CAAA,GACvD,MAAA,CAAO,KAAK,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,gBAAgB;AAAA,KACtD;AACA,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,MAAA,MAAM,UAAU,gBAAA,CAAiB,GAAG,CAAA,GAChC,KAAA,CAAA,GACA,oBAAoB,GAAG,CAAA;AAC3B,MAAA,gBAAA,CAAiB,GAAA,CAAI,GAAA,EAAK,EAAE,QAAA,EAAU,SAAS,CAAA;AAC/C,MAAA,mBAAA,CAAoB,KAAK,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB,CAAA,SAAE;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,UAAU,OAAA,EAAS,KAAK,gBAAA,EAAkB;AAE3D,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,KAAM,OAAA,EAAS;AAChC,QAAA,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,WAAA,EAAY;AAAA,EACd;AACF;AAEA,SAAS,WAAA,CAAY,MAAgB,KAAA,EAA0B;AAC7D,EAAA,OACE,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,MAAA,IACtB,IAAA,CAAK,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,KAAU,KAAA,KAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAEvD;AAEA,SAAS,sBACP,KAAA,EACoB;AACpB,EAAA,IACE,KAAA,CAAM,aAAa,MAAA,IACnBE,gBAAA,CAAY,WAAW,KAAA,CAAM,QAAQ,MAAM,IAAA,EAC3C;AACA,IAAA,OAAO,KAAA,CAAM,QAAA;AAAA,EACf;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAQ,GAAA;AACjC,EAAA,IACE,KAAA,CAAM,QAAA,KAAa,YAAA,IACnB,KAAA,CAAM,QAAA,KAAa,GAAA,IACnB,OAAO,UAAA,KAAe,QAAA,IACtBA,gBAAA,CAAY,KAAA,CAAM,UAAU,MAAM,IAAA,EAClC;AACA,IAAA,OAAO,IAAI,UAAU,CAAA,CAAA;AAAA,EACvB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,wBAAwB,UAAA,EAAoC;AACnE,EAAA,MAAM,KAAA,GAAQH,gBAAA,CAAY,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AACrD,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAcA,gBAAA,CAAY,kBAAA,CAAmB,KAAA,CAAM,UAAU,IAAI,CAAA;AACvE,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmBA,gBAAA,CAAY,UAAA,CAAW,WAAA,CAAY,KAAK,CAAA;AACjE,EAAA,OAAO,gBAAA,CAAiB,QAAA,KAAa,IAAA,GACjCA,gBAAA,CAAY,cAAA,CAAe,aAAa,CAAA,IAAA,EAAO,WAAA,CAAY,KAAK,CAAA,CAAE,CAAA,GAClE,WAAA;AACN;AAEA,SAAS,eAAA,CACP,iBACA,YAAA,EACqB;AACrB,EAAA,IAAI,YAAA,CAAa,aAAa,MAAA,EAAQ;AACpC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkBG,gBAAA,CAAY,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA;AAC/D,EAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,sBAAsB,eAAe,CAAA;AAC7D,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,OAAOA,gBAAA,CAAY,wBAAA;AAAA,MACjB,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,gBAAgB,QAAA,KAAa,MAAA,GAChCC,gBAAW,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,GACxC,MAAA;AACN;AAEA,SAAS,kBAAA,CACP,iBACA,YAAA,EACS;AACT,EAAA,IAAI,eAAA,CAAgB,QAAA,KAAa,YAAA,CAAa,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,eAAA,CAAgB,aAAa,YAAA,EAAc;AAC7C,IAAA,MAAM,WAAW,eAAA,CAAgB,QAAA;AACjC,IAAA,IACE,QAAA,KAAa,GAAA,IACb,QAAA,KAAa,GAAA,IACb,QAAA,KAAa,OACbD,gBAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,KAAM,IAAA,EACrC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,eAAA,CAAgB,MAAA,IAAU,eAAA,CAAgB,QAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,QAAA;AAC5D,EAAA,IAAI,uBAAuB,eAAA,EAAiB;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmB,gBAAgB,MAAA,EAAQ,OAAA;AACjD,EAAA,IACE,OAAO,gBAAA,KAAqB,QAAA,IAC5B,gBAAA,KAAqB,YAAA,CAAa,QAAQ,OAAA,EAC1C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,gBAAgB,MAAA,KAAW,IAAA,IAC3B,gBAAgB,QAAA,CAAS,UAAA,CAAW,SAAS,CAAA,EAC7C;AACA,IAAA,OAAO,eAAA,CAAgB,aAAa,YAAA,CAAa,QAAA;AAAA,EACnD;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iCAAiC,OAAA,EAM9B;AACV,EAAA,IAAI,CAACH,gBAAA,CAAY,cAAA,CAAe,QAAQ,UAAA,EAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkBA,gBAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,WAAW,KAAA,EAAO;AAAA,IACvE,eAAA,EAAiB,QAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,YAAA,GAAeA,gBAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,QAAQ,SAAA,EAAW;AAAA,IACrE,eAAA,EAAiB,QAAA;AAAA,IACjB,aAAA,EAAe;AAAA,GAChB,CAAA;AACD,EAAA,MAAM,gBAAA,GAAmB,uBAAA;AAAA,IACvB,QAAQ,aAAA,CAAc,mBAAA;AAAA,MACpBA,gBAAA,CAAY,eAAA,CAAgB,eAAA,CAAgB,MAAA,EAAQ,IAAI;AAAA;AAC1D,GACF;AACA,EAAA,MAAM,aAAA,GAAgBA,gBAAA,CAAY,YAAA,CAAa,YAAA,CAAa,QAAQ,IAAI,CAAA;AACxE,EAAA,IAAI,CAACA,gBAAA,CAAY,cAAA,CAAe,gBAAA,EAAkB,aAAa,CAAA,EAAG;AAChE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,qBAAA,GAAwBA,gBAAA,CAAY,UAAA,CAAW,gBAAA,CAAiB,KAAK,CAAA;AAC3E,EAAA,MAAM,kBAAA,GAAqBA,gBAAA,CAAY,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA;AACzE,EAAA,MAAM,YAAA,GAAe,eAAA;AAAA,IACnB,qBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IACE,YAAA,KAAiB,SAChB,YAAA,KAAiB,MAAA,IAChB,CAAC,kBAAA,CAAmB,qBAAA,EAAuB,kBAAkB,CAAA,EAC/D;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OACE,OAAA,CAAQ,qBAAA,EAAuB,aAAA,KAC7B,OAAA,CAAQ,oBAAoB,aAAA,IAC9B,WAAA;AAAA,IACE,OAAA,CAAQ,qBAAA,EAAuB,UAAA,IAAc,EAAC;AAAA,IAC9C,OAAA,CAAQ,kBAAA,EAAoB,UAAA,IAAc;AAAC,GAC7C;AAEJ;AAEA,eAAe,4BAAA,CACb,OAAA,EACA,aAAA,EACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAIK,YAAA,CAAQJ,WAAA,CAAM,eAAe,OAAO,CAAA,EAAG,EAAE,aAAA,EAAe,CAAA;AAC5E,EAAA,MAAM,iBAAA,GAAoB,CAACA,WAAA,CAAM,cAAA,CAAe,OAAO,CAAC,CAAA;AACxD,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,EAAA,MAAM,eAAmC,EAAC;AAE1C,EAAA,OAAO,iBAAA,CAAkB,SAAS,CAAA,EAAG;AACnC,IAAA,MAAM,YAAA,GAAe,kBAAkB,KAAA,EAAM;AAC7C,IAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,iBAAA,CAAkB,GAAA,CAAI,YAAY,CAAA,EAAG;AACrE,MAAA;AAAA,IACF;AACA,IAAA,iBAAA,CAAkB,IAAI,YAAY,CAAA;AAElC,IAAA,MAAM,YAAY,IAAIK,cAAA,CAAU,YAAA,EAAc,EAAE,SAAS,CAAA;AACzD,IAAA,MAAM,UAAU,KAAA,EAAM;AACtB,IAAA,iBAAA,CAAkB,IAAA,CAAK,GAAG,SAAA,CAAU,cAAc,CAAA;AAElD,IAAA,MAAM,WAAA,GAAcL,WAAA,CAAM,gBAAA,CAAiB,SAAA,CAAU,GAAG,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,YAAA;AAAA,MACnB,OAAA;AAAA,MACAF,qBAAA,CAAK,IAAA,CAAK,WAAA,EAAa,cAAc;AAAA,KACvC;AACA,IAAA,MAAM,YAAA,GAAwC,UAAU,QAAA,CAAS,GAAA;AACjE,IAAA,MAAM,gBAAgBC,gBAAA,CAAY,gBAAA;AAAA,MAChC,SAAA,CAAU;AAAA,KACZ;AAEA,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,MAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,EAAM;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5D,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,KAAK,IAAI,IAAI,CAAA,CAAA;AACjD,QAAA,IAAI;AACF,UAAA,MAAM,cAAc,qBAAA,CAAsB;AAAA,YACxC,OAAA;AAAA,YACA,SAAA,EAAW,WAAA;AAAA,YACX,aAAA;AAAA,YACA,YAAA,EACE,KAAA,KAAU,aAAA,GACNO,uBAAA,CAAgB,IAAI,CAAA,CAAE,UAAA,CAAW,QAAA,GACjCP,gBAAA,CAAY,cAAA,CAAeA,gBAAA,CAAY,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,YAC7D,KAAA;AAAA,YACA,QAAA;AAAA,YACA,MAAA,EAAQ;AAAA,WACT,CAAA;AACD,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,UAC/B;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,2BAAA;AAAA,YACN,OAAA,EAAS,CAAA,6BAAA,EAAgC,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,EAAA,EAAK,MAAA;AAAA,cAC7D;AAAA,aACD,CAAA,CAAA;AAAA,YACD;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,4BAAA,CACP,OAAA,EACA,aAAA,EACA,eAAA,EACA,MAAA,EACoB;AACpB,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI;AACF,IAAA,YAAA,GAAeQ,kBAAU,eAAe,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,oBAAA;AAAA,MACN,OAAA,EAAS,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACpD,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,eAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,aAAa,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/D,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,mBAGD,EAAC;AACN,IAAA,KAAA,MAAW,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAaR,gBAAA,CAAY,eAAA,CAAgB,KAAA,EAAO,IAAI,CAAA;AAC1D,QAAA,IAAI,CAAC,UAAA,CAAW,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC1C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,cAAc,qBAAA,CAAsB;AAAA,UACxC,OAAA;AAAA,UACA,SAAA,EAAW,OAAA;AAAA,UACX,YAAA,EAAcA,gBAAA,CAAY,cAAA,CAAe,UAAU,CAAA;AAAA,UACnD,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,QAAA,EAAU,WAAA;AAAA,UACV,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,UAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,QAC/B;AACA,QAAA,gBAAA,CAAiB,IAAA,CAAK,EAAE,UAAA,EAAY,WAAA,EAAa,CAAA;AAAA,MACnD,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,oBAAA;AAAA,UACN,OAAA,EAAS,CAAA,qBAAA,EAAwB,KAAK,CAAA,gBAAA,EAAmB,MAAA;AAAA,YACvD;AAAA,WACD,CAAA,CAAA;AAAA,UACD,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAa,CAAA,GACrC,cAAc,UAAA,GACd,MAAA;AACJ,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,gBAAgB,GAAG,CAAA,mCAAA,CAAA;AAAA,QAC5B,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUA,gBAAA,CAAY,YAAA,CAAa,UAAA,EAAY,IAAI,CAAA;AACzD,MAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3C,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,CAAA,aAAA,EAAgB,GAAG,CAAA,yCAAA,EAA4C,UAAU,CAAA,CAAA,CAAA;AAAA,UAClF,QAAA,EAAU;AAAA,SACX,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,qBAAqB,qBAAA,CAAsB;AAAA,QAC/C,OAAA;AAAA,QACA,SAAA,EAAW,OAAA;AAAA,QACX,YAAA,EAAcA,gBAAA,CAAY,cAAA,CAAe,OAAO,CAAA;AAAA,QAChD,OAAO,OAAA,CAAQ,SAAA;AAAA,QACf,QAAA,EAAU,WAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,YAAA,GAAeA,gBAAA,CAAY,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW;AAAA,QAC7D,eAAA,EAAiB,QAAA;AAAA,QACjB,aAAA,EAAe;AAAA,OAChB,CAAA;AACD,MAAA,MAAM,iBAAiBA,gBAAA,CAAY,gBAAA;AAAA,QACjCA,gBAAA,CAAY,YAAA,CAAa,YAAA,CAAa,MAAA,EAAQ,IAAI;AAAA,OACpD;AACA,MAAA,KAAA,MAAW,EAAE,WAAA,EAAY,IAAK,gBAAA,EAAkB;AAC9C,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,cAAA,GAAiB,cAAA;AAAA,QAC/B;AAAA,MACF;AACA,MAAA,IACE,gBAAA,CAAiB,IAAA;AAAA,QACf,CAAC,EAAE,UAAA,EAAY,WAAA,EAAY,KACzB,CAAC,gCAAA,CAAiC;AAAA,UAChC,aAAA;AAAA,UACA,UAAA;AAAA,UACA,qBAAA,EAAuB,WAAA;AAAA,UACvB,OAAA;AAAA,UACA;AAAA,SACD;AAAA,OACL,EACA;AACA,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,CAAA,aAAA,EAAgB,GAAG,CAAA,yCAAA,EAA4C,UAAU,CAAA,CAAA,CAAA;AAAA,UAClF,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,CAAA,aAAA,EAAgB,GAAG,CAAA,qCAAA,EAAwC,UAAU,CAAA,GAAA,EAAM,MAAA;AAAA,UAClF;AAAA,SACD,CAAA,CAAA;AAAA,QACD,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAEA,eAAe,qBAAA,CACb,SACA,GAAA,EACwB;AACxB,EAAA,OAAO,4BAAA,CAA6B,KAAK,YAAY;AAGnD,IAAA,OAAOS,kBAAA,CAAc,IAAA;AAAA,MACnBR,WAAA,CAAM,eAAe,OAAO,CAAA;AAAA,MAC5B,0BAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,KAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,eAAe,cAAA,CACb,SAAA,EACA,gBAAA,mBAAwC,IAAI,KAAI,EAC7B;AACnB,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgB,MAAMS,mBAAA,CAAG,QAAA,CAAS,SAAS,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,aAAa,CAAA,EAAG;AACvC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAI,aAAa,CAAA;AAEhE,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMA,mBAAA,CAAG,OAAA,CAAQ,WAAW,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC1B,OAAA,CAAQ,GAAA,CAAI,OAAM,KAAA,KAAS;AACzB,MAAA,MAAM,SAAA,GAAYX,qBAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,CAAA;AACjD,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,OAAO,cAAA,CAAe,WAAW,YAAY,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,KAAA,CAAM,gBAAe,EAAG;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,WAAA,GAAc,MAAMW,mBAAA,CAAG,IAAA,CAAK,SAAS,CAAA;AAC3C,UAAA,IAAI,WAAA,CAAY,aAAY,EAAG;AAC7B,YAAA,OAAO,cAAA,CAAe,WAAW,YAAY,CAAA;AAAA,UAC/C;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACrC,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AACA,QAAA,OAAO,CAAC,SAAS,CAAA;AAAA,MACnB;AACA,MAAA,OAAO,MAAM,MAAA,EAAO,GAAI,CAAC,SAAS,IAAI,EAAC;AAAA,IACzC,CAAC;AAAA,GACH;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,IAAA,EAAK;AAC3B;AAEA,SAAS,mBACP,YAAA,EAC+B;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA8B;AACjD,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,GAAA,GAAM,eAAe,WAAW,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,WAAW,CAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,4BACP,YAAA,EAC2B;AAC3B,EAAA,MAAM,WAAsC,EAAC;AAC7C,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,cAAA,GAAiB,uBAAA;AAAA,MACrBV,gBAAA,CAAY,eAAA,CAAgB,WAAA,CAAY,MAAA,EAAQ,IAAI;AAAA,KACtD;AACA,IAAA,MAAM,iBAAiB,WAAA,CAAY,cAAA;AACnC,IAAA,MAAM,SAAS,cAAA,GACXA,gBAAA,CAAY,YAAA,CAAa,cAAA,EAAgB,IAAI,CAAA,GAC7C,cAAA;AACJ,IAAA,IAAI,MAAA,CAAO,UAAU,WAAA,EAAa;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQA,gBAAA,CAAY,UAAA;AAAA,MACxB,WAAA,IAAe,MAAA,GAAS,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO;AAAA,KACpD;AACA,IAAA,IACE,KAAA,CAAM,aAAa,MAAA,IACnBG,gBAAA,CAAY,MAAM,KAAA,CAAM,QAAQ,MAAM,IAAA,EACtC;AACA,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAMH,gBAAA,CAAY,cAAA,CAAe,MAAM,CAAA;AAAA,MACvC,SAAS,KAAA,CAAM,QAAA;AAAA,MACf,UAAU,WAAA,CAAY;AAAA,KACvB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,kBAAkB,KAAA,EAA0C;AACnE,EAAA,OACE,QAAA,CAAS,KAAK,CAAA,IACd,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,IAChC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,IAC5B,MAAM,QAAA,CAAS,KAAA;AAAA,IACb,CAAA,YAAA,KACE,QAAA,CAAS,YAAY,CAAA,IACrB,OAAO,aAAa,IAAA,KAAS,QAAA,IAC7B,OAAO,YAAA,CAAa,OAAA,KAAY;AAAA,GACpC;AAEJ;AAEA,eAAe,qBACb,OAAA,EAC6B;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,gBAAyB,IAAA,CAAK,KAAA;AAAA,MAClC,MAAMU,oBAAG,QAAA,CAASX,qBAAA,CAAK,KAAK,OAAA,EAAS,gBAAgB,GAAG,MAAM;AAAA,KAChE;AACA,IAAA,IAAI,CAAC,QAAA,CAAS,aAAa,KAAK,OAAO,aAAA,CAAc,YAAY,QAAA,EAAU;AACzE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,aAAA,CAAc,OAAA;AAAA,EACvB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACpC,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAe,oBAAoB,OAAA,EAKN;AAC3B,EAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,EAAK,uBAAA;AAClC,EAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,KAAA,KACP,OAAO,GAAA,KAAgB;AACtB,IAAA,MAAMY,SAAAA,GAAW,MAAMC,cAAA,CAAU,GAAA,CAAI,GAAA,EAAK;AAAA,MACxC,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,GAAA;AAAA,MACR,GAAA;AAAA,MACA,MAAM,YAAYD;AAAA,KACpB;AAAA,EACF,CAAA,CAAA;AACF,EAAA,MAAM,QAAA,GAAoB,YAAA,GACtB,IAAA,CAAK,KAAA,CAAM,MAAMD,mBAAA,CAAG,QAAA,CAAS,YAAA,EAAc,MAAM,CAAC,CAAA,GAClD,MAAMG,qCAAA,CAAqB;AAAA,IACzB,SAAS,OAAA,CAAQ,gBAAA;AAAA,IACjB,eAAA,EAAiB,QAAQ,GAAA,EAAK,2BAAA;AAAA,IAC9B;AAAA,GACD,CAAA;AACL,EAAA,IAAI,CAAC,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,QAAA,CAAS,cAAA,KAAmB,OAAA,CAAQ,gBAAA,EAAkB;AACxD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oCAAA,EAAuC,QAAA,CAAS,cAAc,CAAA,mCAAA,EAAsC,QAAQ,gBAAgB,CAAA,CAAA;AAAA,KAC9H;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEA,eAAe,yBAAyB,OAAA,EASrC;AACD,EAAA,MAAM,eAAA,GAAkB,2BAAA,CAA4B,OAAA,CAAQ,YAAY,CAAA;AACxE,EAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,cAAA,EAAgB,SAAA,EAAW,MAAA,EAAQ,EAAC,EAAE;AAAA,EACjD;AAEA,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI;AACF,IAAA,gBAAA,GAAmB,MAAM,oBAAA,CAAqB,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,UAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,iCAAA;AAAA,UACN,OAAA,EAAS,CAAA,0CAAA,EAA6C,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,UACnE,QAAA,EAAU;AAAA;AACZ;AACF,KACF;AAAA,EACF;AACA,EAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,IAAA,OAAO,EAAE,cAAA,EAAgB,SAAA,EAAW,MAAA,EAAQ,EAAC,EAAE;AAAA,EACjD;AAEA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAM,mBAAA,CAAoB;AAAA,MAC1C,gBAAA;AAAA,MACA,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,UAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,iCAAA;AAAA,UACN,OAAA,EAAS,CAAA,+CAAA,EAAkD,gBAAgB,CAAA,GAAA,EAAM,MAAA;AAAA,YAC/E;AAAA,WACD,CAAA,CAAA;AAAA,UACD,QAAA,EAAU;AAAA;AACZ;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,IAC1B,eAAA,CAAgB,QAAA,CAAS,GAAA,CAAI,CAAA,YAAA,KAAgB;AAAA,MAC3C,YAAA,CAAa,IAAA;AAAA,MACb,YAAA,CAAa;AAAA,KACd;AAAA,GACH;AACA,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,IAAA,MAAM,cAAA,GAAiB,eAAA,CAAgB,GAAA,CAAI,cAAA,CAAe,IAAI,CAAA;AAC9D,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,2BAAA;AAAA,QACN,OAAA,EAAS,CAAA,iBAAA,EAAoB,cAAA,CAAe,IAAI,uCAAuC,gBAAgB,CAAA,CAAA,CAAA;AAAA,QACvG,UAAU,cAAA,CAAe;AAAA,OAC1B,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,cAAA,KAAmB,cAAA,CAAe,OAAA,EAAS;AACpD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,0BAAA;AAAA,QACN,OAAA,EAAS,CAAA,iBAAA,EAAoB,cAAA,CAAe,IAAI,CAAA,iBAAA,EAAoB,eAAe,OAAO,CAAA,0BAAA,EAA6B,gBAAgB,CAAA,oBAAA,EAAuB,cAAc,CAAA,CAAA,CAAA;AAAA,QAC5K,UAAU,cAAA,CAAe;AAAA,OAC1B,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,cAAA,EAAgB,UAAA,EAAY,MAAA,EAAO;AAC9C;AAEA,eAAsB,kBACpB,OAAA,EACkC;AAClC,EAAA,MAAM,OAAA,GAAUd,qBAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAC5C,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAM,qBAAA,CAAsB,OAAA,EAAS,QAAQ,GAAG,CAAA;AACtE,EAAA,MAAM,uBAAuB,MAAM,4BAAA;AAAA,IACjC,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,0BAAA,GAA6B,mBAAmB,oBAAoB,CAAA;AAC1E,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAA4B;AAE7D,EAAA,KAAA,MAAW,WAAA,IAAe,0BAAA,CAA2B,MAAA,EAAO,EAAG;AAC7D,IAAA,KAAA,MAAW,SAAA,IAAa,YAAY,KAAA,EAAO;AACzC,MAAA,oBAAA,CAAqB,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,SAAS,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,CAAA,IAAK,oBAAA,EAAsB;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAMW,mBAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACpC,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAO,EAAG;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,oBAAA;AAAA,UACN,OAAA,EAAS,CAAA,YAAA,EAAe,SAAA,CAAU,QAAQ,CAAA,uBAAA,CAAA;AAAA,UAC1C,UAAU,SAAA,CAAU;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACrC,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,CAAA,YAAA,EAAe,SAAA,CAAU,QAAQ,CAAA,gBAAA,CAAA;AAAA,QAC1C,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,cAAcT,WAAA,CAAM,gBAAA,CAAiB,aAAA,CAAc,GAAA,CAAI,aAAa,CAAC,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,WAAW,CAAA;AACnD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,CAAC,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA,EAAG;AACxC,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAS,SAAS,CAAA;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,eAAe,QAAQ,CAAA,mCAAA,CAAA;AAAA,QAChC,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAMS,mBAAA,CAAG,QAAA;AAAA,MACzBX,qBAAA,CAAK,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAAA,MAC9B;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,EAAO,QAAQ,CAAA,EAAG;AACrC,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,oBAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,IAAA,MAAM,oBAAA,GAAuB,kBAAA;AAAA,MAC3B,4BAAA;AAAA,QACE,OAAA;AAAA,QACA,aAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,CAAA,IAAK,0BAAA,EAA4B;AAC3D,MAAA,MAAM,mBAAA,GAAsB,oBAAA,CAAqB,GAAA,CAAI,GAAG,CAAA;AACxD,MAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,CAAA,uBAAA,EACP,WAAA,CAAY,MACd,CAAA,SAAA,EAAY,sBAAA;AAAA,YACV;AAAA,WACD,CAAA,2BAAA,CAAA;AAAA,UACD,UAAU,WAAA,CAAY;AAAA,SACvB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,iBAAiB,mBAAA,CAAoB,cAAA;AAAA,MACnD;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,CAAA,IAAK,oBAAA,EAAsB;AACrD,MAAA,IAAI,YAAY,YAAA,IAAgB,CAAC,0BAAA,CAA2B,GAAA,CAAI,GAAG,CAAA,EAAG;AACpE,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,CAAA,0CAAA,EACP,WAAA,CAAY,MACd,CAAA,SAAA,EAAY,sBAAA;AAAA,YACV;AAAA,WACD,CAAA,+BAAA,CAAA;AAAA,UACD,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAyB;AACxD,EAAA,KAAA,MAAW,WAAA,IAAe,0BAAA,CAA2B,MAAA,EAAO,EAAG;AAC7D,IAAA,KAAA,MAAW,SAAA,IAAa,YAAY,KAAA,EAAO;AACzC,MAAA,IAAI,OAAA,GAAU,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACvD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAAI;AAClB,QAAA,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,QAAA,EAAU,OAAO,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,cAAA,IAAkB,WAAA,CAAY,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,kBAAA,EAAoB;AACpD,IAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,GAAA,CAAI,QAAQ,CAAA;AACnD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,OAAO,EAAE,IAAA,EAAK;AACxC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,iCAAA;AAAA,MACN,OAAA,EAAS,CAAA,YAAA,EACP,SAAA,CAAU,QACZ,uCAAuC,aAAA,CACpC,GAAA,CAAI,CAAA,MAAA,KAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA,CAC3B,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MACb,UAAU,SAAA,CAAU;AAAA,KACrB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,mBAAA,GAAsB,MAAM,wBAAA,CAAyB;AAAA,IACzD,OAAA;AAAA,IACA,YAAA,EAAc,2BAA2B,MAAA,EAAO;AAAA,IAChD,aAAA;AAAA,IACA,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,OAAO,OAAA,CAAQ;AAAA,GAChB,CAAA;AACD,EAAA,MAAA,CAAO,IAAA,CAAK,GAAG,mBAAA,CAAoB,MAAM,CAAA;AAEzC,EAAA,OAAO;AAAA,IACL,YAAY,oBAAA,CAAqB,IAAA;AAAA,IACjC,gBAAgB,mBAAA,CAAoB,cAAA;AAAA,IACpC,MAAA,EAAQ,WAAW,MAAM;AAAA,GAC3B;AACF;;;;"}
1
+ {"version":3,"file":"verifyYarnPatches.cjs.js","sources":["../../src/lib/verifyYarnPatches.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 getManifestByVersion,\n type ReleaseManifest,\n} from '@backstage/release-manifests';\nimport {\n Configuration,\n httpUtils,\n semverUtils,\n structUtils,\n} from '@yarnpkg/core';\nimport { Project, TAG_REGEXP, Workspace } from '@yarnpkg/core';\nimport type { Descriptor, PluginConfiguration } from '@yarnpkg/core';\nimport { npath, ppath } from '@yarnpkg/fslib';\nimport { parseResolution, parseSyml } from '@yarnpkg/parsers';\nimport patchPlugin from '@yarnpkg/plugin-patch';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport type PatchVerificationErrorKind =\n | 'backstage-manifest-load-failure'\n | 'backstage-package-missing'\n | 'backstage-patch-holdback'\n | 'incompatible-patch-declarations'\n | 'lockfile-mismatch'\n | 'malformed-lockfile'\n | 'malformed-patch-reference'\n | 'missing-lockfile'\n | 'missing-patch-file'\n | 'orphaned-patch-file'\n | 'unused-resolution';\n\nexport type PatchVerificationError = {\n kind: PatchVerificationErrorKind;\n message: string;\n location?: string;\n};\n\nexport type VerifyYarnPatchesOptions = {\n rootDir: string;\n env?: NodeJS.ProcessEnv;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type VerifyYarnPatchesResult = {\n patchCount: number;\n backstageCheck: 'verified' | 'skipped';\n errors: PatchVerificationError[];\n};\n\ntype PatchDeclaration = {\n patchedIdent: string;\n source: string;\n resolvedSource?: string;\n components: string[];\n parentLocator?: string;\n canMatchManifest: boolean;\n projectOwned: boolean;\n paths: LocalPatchPath[];\n location: string;\n};\n\ntype LocalPatchPath = {\n absolute: string;\n relative: string;\n};\n\ntype PatchedBackstagePackage = {\n name: string;\n version: string;\n location: string;\n};\n\ntype ResolutionDeclaration = {\n pattern: string;\n location: string;\n};\n\nconst MANIFEST_FIELDS = [\n 'resolutions',\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n] as const;\n\nconst PATCH_PLUGIN_CONFIGURATION: PluginConfiguration = {\n modules: new Map([['@yarnpkg/plugin-patch', patchPlugin]]),\n plugins: new Set(['@yarnpkg/plugin-patch']),\n};\n\n// Yarn Configuration.find has no environment parameter and reads process.env.\n// Serialize the narrow overlay so concurrent verifications cannot interleave.\nlet configurationEnvironmentQueue = Promise.resolve();\n\nfunction relativePath(rootDir: string, targetPath: string): string {\n return path.relative(rootDir, targetPath).split(path.sep).join('/');\n}\n\nfunction compareStrings(left: string, right: string): number {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nfunction sortErrors(\n errors: PatchVerificationError[],\n): PatchVerificationError[] {\n return errors.sort((left, right) => {\n return (\n compareStrings(left.location ?? '', right.location ?? '') ||\n compareStrings(left.kind, right.kind) ||\n compareStrings(left.message, right.message)\n );\n });\n}\n\nfunction isErrorWithCode(error: unknown, code: string): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === code\n );\n}\n\nfunction getPatchPathWithoutFlags(patchPath: string): string {\n if (patchPath.startsWith('~builtin<')) {\n return patchPath.slice(1);\n }\n const flagIndex = patchPath.lastIndexOf('!');\n return flagIndex === -1 ? patchPath : patchPath.slice(flagIndex + 1);\n}\n\nfunction isBuiltinPatchPath(patchPath: string): boolean {\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n return (\n pathWithoutFlags.startsWith('builtin<') && pathWithoutFlags.endsWith('>')\n );\n}\n\ntype PatchParent = {\n directory?: string;\n locator?: string;\n};\n\nfunction getPatchParent(\n rootDir: string,\n fallbackDir: string,\n locatorValue: unknown,\n): PatchParent {\n if (typeof locatorValue !== 'string') {\n return { directory: fallbackDir };\n }\n\n const parentLocator = structUtils.parseLocator(locatorValue, true);\n const locator = structUtils.stringifyLocator(parentLocator);\n const parentRange = structUtils.parseRange(parentLocator.reference);\n if (parentRange.protocol !== 'workspace:') {\n return { locator };\n }\n\n return {\n directory: path.resolve(rootDir, parentRange.selector),\n locator,\n };\n}\n\nfunction resolvePatchPath(\n rootDir: string,\n parentDir: string | undefined,\n patchPath: string,\n): LocalPatchPath | undefined {\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n if (isBuiltinPatchPath(pathWithoutFlags)) {\n return undefined;\n }\n\n const portablePatchPath = npath.toPortablePath(pathWithoutFlags);\n let absolute: string | undefined;\n if (pathWithoutFlags.startsWith('~/')) {\n absolute = path.resolve(rootDir, pathWithoutFlags.slice(2));\n } else if (ppath.isAbsolute(portablePatchPath)) {\n absolute = npath.fromPortablePath(portablePatchPath);\n } else if (parentDir !== undefined) {\n absolute = path.resolve(parentDir, pathWithoutFlags);\n }\n if (absolute === undefined) {\n return undefined;\n }\n return {\n absolute,\n relative: relativePath(rootDir, absolute),\n };\n}\n\nfunction parsePatchDeclaration(options: {\n rootDir: string;\n parentDir: string;\n parentLocator?: string;\n patchedIdent: string;\n range: string;\n location: string;\n origin: 'manifest' | 'lockfile';\n}): PatchDeclaration | undefined {\n const parsedRange = structUtils.parseRange(options.range, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const sourceDescriptor = structUtils.parseDescriptor(\n parsedRange.source,\n true,\n );\n const source = structUtils.stringifyDescriptor(sourceDescriptor);\n const parent = getPatchParent(\n options.rootDir,\n options.parentDir,\n parsedRange.params?.locator,\n );\n const paths: LocalPatchPath[] = [];\n let hasDependencyOwnedPath = false;\n let hasProjectRelativePath = false;\n const patchPaths =\n parsedRange.selector === '' ? [] : parsedRange.selector.split('&');\n const components = patchPaths.map(patchPath => {\n const flagIndex = patchPath.lastIndexOf('!');\n const flags = flagIndex === -1 ? '' : patchPath.slice(0, flagIndex + 1);\n const pathWithoutFlags = getPatchPathWithoutFlags(patchPath);\n if (isBuiltinPatchPath(patchPath)) {\n return patchPath;\n }\n\n const localPath = resolvePatchPath(\n options.rootDir,\n parent.directory,\n patchPath,\n );\n if (localPath) {\n paths.push(localPath);\n if (\n !pathWithoutFlags.startsWith('~/') &&\n !ppath.isAbsolute(npath.toPortablePath(pathWithoutFlags))\n ) {\n hasProjectRelativePath = true;\n }\n return `${flags}local<${localPath.absolute}>`;\n }\n hasDependencyOwnedPath = true;\n return `${flags}relative<${pathWithoutFlags}>`;\n });\n\n if (components.length === 0) {\n return undefined;\n }\n\n return {\n patchedIdent: options.patchedIdent,\n source,\n components,\n parentLocator:\n parent.locator ??\n (hasProjectRelativePath ? options.parentLocator : undefined),\n canMatchManifest: !hasDependencyOwnedPath,\n projectOwned:\n paths.length > 0 ||\n (options.origin === 'manifest' && !hasDependencyOwnedPath),\n paths,\n location: options.location,\n };\n}\n\nfunction declarationKey(declaration: PatchDeclaration): string {\n return `${declaration.parentLocator ?? ''}\\0${declaration.patchedIdent}\\0${\n declaration.source\n }\\0${declaration.components.join('\\0')}`;\n}\n\nfunction declarationDescription(declaration: PatchDeclaration): string {\n return declaration.paths.map(patchPath => patchPath.relative).join(', ');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isYarnPluginsKey(key: string): boolean {\n return key.toLowerCase() === 'yarn_plugins';\n}\n\nfunction setEnvironmentValue(key: string, value: string | undefined): void {\n if (value === undefined) {\n delete process.env[key];\n } else {\n process.env[key] = value;\n }\n}\n\nasync function withConfigurationEnvironment<T>(\n env: NodeJS.ProcessEnv | undefined,\n action: () => Promise<T>,\n): Promise<T> {\n const waitForTurn = configurationEnvironmentQueue;\n let releaseTurn = () => {};\n const turnComplete = new Promise<void>(resolve => {\n releaseTurn = resolve;\n });\n configurationEnvironmentQueue = waitForTurn.then(() => turnComplete);\n await waitForTurn;\n\n const environmentState = new Map<\n string,\n { previous: string | undefined; applied: string | undefined }\n >();\n\n try {\n const targetEnvironment = env ? { ...env } : undefined;\n if (targetEnvironment) {\n for (const key of Object.keys(targetEnvironment)) {\n if (isYarnPluginsKey(key)) {\n delete targetEnvironment[key];\n }\n }\n }\n\n const keysToScope = new Set(\n targetEnvironment\n ? [...Object.keys(process.env), ...Object.keys(env ?? {})]\n : Object.keys(process.env).filter(isYarnPluginsKey),\n );\n for (const key of keysToScope) {\n const previous = process.env[key];\n const applied = isYarnPluginsKey(key)\n ? undefined\n : targetEnvironment?.[key];\n environmentState.set(key, { previous, applied });\n setEnvironmentValue(key, applied);\n }\n\n return await action();\n } finally {\n for (const [key, { previous, applied }] of environmentState) {\n // Keep values changed by unrelated async work while Yarn was loading.\n if (process.env[key] === applied) {\n setEnvironmentValue(key, previous);\n }\n }\n releaseTurn();\n }\n}\n\nfunction arraysEqual(left: string[], right: string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => value === right[index])\n );\n}\n\nfunction getNpmResolutionRange(\n range: ReturnType<typeof structUtils.parseRange>,\n): string | undefined {\n if (\n range.protocol === 'npm:' &&\n semverUtils.validRange(range.selector) !== null\n ) {\n return range.selector;\n }\n\n const npmVersion = range.params?.npm;\n if (\n range.protocol === 'backstage:' &&\n range.selector === '^' &&\n typeof npmVersion === 'string' &&\n semverUtils.clean(npmVersion) !== null\n ) {\n return `^${npmVersion}`;\n }\n\n return undefined;\n}\n\nfunction normalizeNpmAliasSource(descriptor: Descriptor): Descriptor {\n const range = structUtils.parseRange(descriptor.range);\n if (range.protocol !== 'npm:') {\n return descriptor;\n }\n\n const aliasTarget = structUtils.tryParseDescriptor(range.selector, true);\n if (!aliasTarget) {\n return descriptor;\n }\n\n const aliasTargetRange = structUtils.parseRange(aliasTarget.range);\n return aliasTargetRange.protocol === null\n ? structUtils.makeDescriptor(aliasTarget, `npm:${aliasTarget.range}`)\n : aliasTarget;\n}\n\nfunction npmSourceAgrees(\n descriptorRange: ReturnType<typeof structUtils.parseRange>,\n locatorRange: ReturnType<typeof structUtils.parseRange>,\n): boolean | undefined {\n if (locatorRange.protocol !== 'npm:') {\n return undefined;\n }\n\n const resolvedVersion = semverUtils.clean(locatorRange.selector);\n if (resolvedVersion === null) {\n return false;\n }\n\n const resolutionRange = getNpmResolutionRange(descriptorRange);\n if (resolutionRange !== undefined) {\n return semverUtils.satisfiesWithPrereleases(\n resolvedVersion,\n resolutionRange,\n );\n }\n\n return descriptorRange.protocol === 'npm:'\n ? TAG_REGEXP.test(descriptorRange.selector)\n : undefined;\n}\n\nfunction nonNpmSourceAgrees(\n descriptorRange: ReturnType<typeof structUtils.parseRange>,\n locatorRange: ReturnType<typeof structUtils.parseRange>,\n): boolean {\n if (descriptorRange.protocol !== locatorRange.protocol) {\n return false;\n }\n\n if (descriptorRange.protocol === 'workspace:') {\n const selector = descriptorRange.selector;\n if (\n selector === '*' ||\n selector === '^' ||\n selector === '~' ||\n semverUtils.validRange(selector) !== null\n ) {\n return true;\n }\n }\n\n const descriptorIdentity = descriptorRange.source ?? descriptorRange.selector;\n const locatorIdentity = locatorRange.source ?? locatorRange.selector;\n if (descriptorIdentity !== locatorIdentity) {\n return false;\n }\n\n const descriptorParent = descriptorRange.params?.locator;\n if (\n typeof descriptorParent === 'string' &&\n descriptorParent !== locatorRange.params?.locator\n ) {\n return false;\n }\n\n if (\n descriptorRange.source !== null &&\n descriptorRange.selector.startsWith('commit=')\n ) {\n return descriptorRange.selector === locatorRange.selector;\n }\n\n return true;\n}\n\nfunction patchDescriptorAgreesWithLocator(options: {\n configuration: Configuration;\n descriptor: ReturnType<typeof structUtils.parseDescriptor>;\n descriptorDeclaration: PatchDeclaration | undefined;\n locator: ReturnType<typeof structUtils.parseLocator>;\n locatorDeclaration: PatchDeclaration | undefined;\n}): boolean {\n if (!structUtils.areIdentsEqual(options.descriptor, options.locator)) {\n return false;\n }\n\n const descriptorRange = structUtils.parseRange(options.descriptor.range, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const locatorRange = structUtils.parseRange(options.locator.reference, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const sourceDescriptor = normalizeNpmAliasSource(\n options.configuration.normalizeDependency(\n structUtils.parseDescriptor(descriptorRange.source, true),\n ),\n );\n const sourceLocator = structUtils.parseLocator(locatorRange.source, true);\n if (!structUtils.areIdentsEqual(sourceDescriptor, sourceLocator)) {\n return false;\n }\n\n const descriptorSourceRange = structUtils.parseRange(sourceDescriptor.range);\n const locatorSourceRange = structUtils.parseRange(sourceLocator.reference);\n const npmAgreement = npmSourceAgrees(\n descriptorSourceRange,\n locatorSourceRange,\n );\n if (\n npmAgreement === false ||\n (npmAgreement === undefined &&\n !nonNpmSourceAgrees(descriptorSourceRange, locatorSourceRange))\n ) {\n return false;\n }\n\n return (\n options.descriptorDeclaration?.parentLocator ===\n options.locatorDeclaration?.parentLocator &&\n arraysEqual(\n options.descriptorDeclaration?.components ?? [],\n options.locatorDeclaration?.components ?? [],\n )\n );\n}\n\nasync function discoverManifestDeclarations(\n rootDir: string,\n configuration: Configuration,\n errors: PatchVerificationError[],\n): Promise<{\n patchDeclarations: PatchDeclaration[];\n resolutionDeclarations: ResolutionDeclaration[];\n}> {\n const project = new Project(npath.toPortablePath(rootDir), { configuration });\n const pendingWorkspaces = [npath.toPortablePath(rootDir)];\n const visitedWorkspaces = new Set<string>();\n const patchDeclarations: PatchDeclaration[] = [];\n const resolutionDeclarations: ResolutionDeclaration[] = [];\n\n while (pendingWorkspaces.length > 0) {\n const workspaceCwd = pendingWorkspaces.shift();\n if (workspaceCwd === undefined || visitedWorkspaces.has(workspaceCwd)) {\n continue;\n }\n visitedWorkspaces.add(workspaceCwd);\n\n const workspace = new Workspace(workspaceCwd, { project });\n await workspace.setup();\n pendingWorkspaces.push(...workspace.workspacesCwds);\n\n const manifestDir = npath.fromPortablePath(workspace.cwd);\n const manifestPath = relativePath(\n rootDir,\n path.join(manifestDir, 'package.json'),\n );\n const manifestJson: Record<string, unknown> = workspace.manifest.raw;\n const parentLocator = structUtils.stringifyLocator(\n workspace.anchoredLocator,\n );\n\n for (const field of MANIFEST_FIELDS) {\n const entries = manifestJson[field];\n if (typeof entries !== 'object' || entries === null) {\n continue;\n }\n\n for (const [name, range] of Object.entries(entries)) {\n if (\n field === 'resolutions' &&\n workspace.cwd === project.cwd &&\n typeof range === 'string'\n ) {\n resolutionDeclarations.push({\n pattern: name,\n location: `${manifestPath}#${field}.${name}`,\n });\n }\n if (typeof range !== 'string' || !range.startsWith('patch:')) {\n continue;\n }\n\n const location = `${manifestPath}#${field}.${name}`;\n try {\n const declaration = parsePatchDeclaration({\n rootDir,\n parentDir: manifestDir,\n parentLocator,\n patchedIdent:\n field === 'resolutions'\n ? parseResolution(name).descriptor.fullName\n : structUtils.stringifyIdent(structUtils.parseIdent(name)),\n range,\n location,\n origin: 'manifest',\n });\n if (declaration) {\n patchDeclarations.push(declaration);\n }\n } catch (error) {\n errors.push({\n kind: 'malformed-patch-reference',\n message: `Invalid patch reference for '${name}' in ${field}: ${String(\n error,\n )}`,\n location,\n });\n }\n }\n }\n }\n\n return { patchDeclarations, resolutionDeclarations };\n}\n\nfunction parseLockfile(\n lockfileContent: string,\n errors: PatchVerificationError[],\n): Record<string, unknown> | undefined {\n try {\n return parseSyml(lockfileContent);\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Failed to parse yarn.lock: ${String(error)}`,\n location: 'yarn.lock',\n });\n return undefined;\n }\n}\n\nfunction discoverLockfileDeclarations(\n rootDir: string,\n configuration: Configuration,\n lockfileData: Record<string, unknown>,\n errors: PatchVerificationError[],\n): PatchDeclaration[] {\n const declarations: PatchDeclaration[] = [];\n for (const [key, lockfileEntry] of Object.entries(lockfileData)) {\n if (key === '__metadata') {\n continue;\n }\n\n const patchDescriptors: Array<{\n descriptor: ReturnType<typeof structUtils.parseDescriptor>;\n declaration: PatchDeclaration | undefined;\n }> = [];\n for (const entry of key.split(', ')) {\n try {\n const descriptor = structUtils.parseDescriptor(entry, true);\n if (!descriptor.range.startsWith('patch:')) {\n continue;\n }\n const declaration = parsePatchDeclaration({\n rootDir,\n parentDir: rootDir,\n patchedIdent: structUtils.stringifyIdent(descriptor),\n range: descriptor.range,\n location: 'yarn.lock',\n origin: 'lockfile',\n });\n if (declaration?.canMatchManifest) {\n declarations.push(declaration);\n }\n patchDescriptors.push({ descriptor, declaration });\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Invalid patch entry '${entry}' in yarn.lock: ${String(\n error,\n )}`,\n location: 'yarn.lock',\n });\n }\n }\n\n if (patchDescriptors.length === 0) {\n continue;\n }\n\n const resolution = isRecord(lockfileEntry)\n ? lockfileEntry.resolution\n : undefined;\n if (typeof resolution !== 'string') {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Patch entry '${key}' is missing its resolution locator`,\n location: 'yarn.lock',\n });\n continue;\n }\n\n try {\n const locator = structUtils.parseLocator(resolution, true);\n if (!locator.reference.startsWith('patch:')) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch entry '${key}' disagrees with its resolution locator '${resolution}'`,\n location: 'yarn.lock',\n });\n continue;\n }\n const locatorDeclaration = parsePatchDeclaration({\n rootDir,\n parentDir: rootDir,\n patchedIdent: structUtils.stringifyIdent(locator),\n range: locator.reference,\n location: 'yarn.lock',\n origin: 'lockfile',\n });\n const locatorRange = structUtils.parseRange(locator.reference, {\n requireProtocol: 'patch:',\n requireSource: true,\n });\n const resolvedSource = structUtils.stringifyLocator(\n structUtils.parseLocator(locatorRange.source, true),\n );\n for (const { declaration } of patchDescriptors) {\n if (declaration) {\n declaration.resolvedSource = resolvedSource;\n }\n }\n if (\n patchDescriptors.some(\n ({ descriptor, declaration }) =>\n !patchDescriptorAgreesWithLocator({\n configuration,\n descriptor,\n descriptorDeclaration: declaration,\n locator,\n locatorDeclaration,\n }),\n )\n ) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch entry '${key}' disagrees with its resolution locator '${resolution}'`,\n location: 'yarn.lock',\n });\n }\n } catch (error) {\n errors.push({\n kind: 'malformed-lockfile',\n message: `Patch entry '${key}' has an invalid resolution locator '${resolution}': ${String(\n error,\n )}`,\n location: 'yarn.lock',\n });\n }\n }\n\n return declarations;\n}\n\nfunction getLockfileLocator(\n lockfileEntry: Record<string, unknown>,\n configuration: Configuration,\n): ReturnType<typeof structUtils.parseLocator> | undefined {\n if (typeof lockfileEntry.resolution !== 'string') {\n return undefined;\n }\n try {\n return configuration.normalizeLocator(\n structUtils.parseLocator(lockfileEntry.resolution, true),\n );\n } catch {\n return undefined;\n }\n}\n\nfunction resolutionMatchesDependency(options: {\n resolution: ReturnType<typeof parseResolution>;\n dependencyName: string;\n dependencyRange: string;\n parentLocator: ReturnType<typeof structUtils.parseLocator> | undefined;\n configuration: Configuration;\n}): boolean {\n const { resolution, configuration, parentLocator } = options;\n if (resolution.from) {\n if (\n parentLocator === undefined ||\n resolution.from.fullName !== structUtils.stringifyIdent(parentLocator)\n ) {\n return false;\n }\n const normalizedFrom = configuration.normalizeLocator(\n structUtils.makeLocator(\n structUtils.parseIdent(resolution.from.fullName),\n resolution.from.description ?? parentLocator.reference,\n ),\n );\n if (normalizedFrom.locatorHash !== parentLocator.locatorHash) {\n return false;\n }\n }\n\n const dependency = configuration.normalizeDependency(\n structUtils.makeDescriptor(\n structUtils.parseIdent(options.dependencyName),\n options.dependencyRange,\n ),\n );\n if (\n resolution.descriptor.fullName !== structUtils.stringifyIdent(dependency)\n ) {\n return false;\n }\n const normalizedDescriptor = configuration.normalizeDependency(\n structUtils.makeDescriptor(\n structUtils.parseIdent(resolution.descriptor.fullName),\n resolution.descriptor.description ?? dependency.range,\n ),\n );\n return normalizedDescriptor.descriptorHash === dependency.descriptorHash;\n}\n\nfunction validateResolutions(options: {\n declarations: ResolutionDeclaration[];\n lockfileData: Record<string, unknown>;\n configuration: Configuration;\n}): {\n errors: PatchVerificationError[];\n unusedLocations: Set<string>;\n} {\n const lockfileEntries = Object.entries(options.lockfileData)\n .filter(([key, value]) => key !== '__metadata' && isRecord(value))\n .map(([, value]) => ({\n entry: value as Record<string, unknown>,\n parentLocator: getLockfileLocator(\n value as Record<string, unknown>,\n options.configuration,\n ),\n }));\n const hasRootWorkspace = lockfileEntries.some(\n ({ parentLocator }) => parentLocator?.reference === 'workspace:.',\n );\n // Without the root workspace entry, the lockfile does not contain the\n // complete project dependency graph, so absence cannot prove that a\n // resolution is unused.\n if (!hasRootWorkspace) {\n return { errors: [], unusedLocations: new Set() };\n }\n\n const errors: PatchVerificationError[] = [];\n const unusedLocations = new Set<string>();\n for (const declaration of options.declarations) {\n let resolution;\n try {\n resolution = parseResolution(declaration.pattern);\n } catch {\n continue;\n }\n\n const matches = lockfileEntries.some(({ entry, parentLocator }) => {\n return ['dependencies', 'optionalDependencies'].some(field => {\n const dependencies = entry[field];\n if (!isRecord(dependencies)) {\n return false;\n }\n return Object.entries(dependencies).some(\n ([dependencyName, dependencyRange]) => {\n if (typeof dependencyRange !== 'string') {\n return false;\n }\n try {\n return resolutionMatchesDependency({\n resolution,\n dependencyName,\n dependencyRange,\n parentLocator,\n configuration: options.configuration,\n });\n } catch {\n return false;\n }\n },\n );\n });\n });\n if (!matches) {\n unusedLocations.add(declaration.location);\n errors.push({\n kind: 'unused-resolution',\n message: `Resolution '${declaration.pattern}' does not match any dependency request in yarn.lock`,\n location: declaration.location,\n });\n }\n }\n return { errors, unusedLocations };\n}\n\nasync function readYarnConfiguration(\n rootDir: string,\n env: NodeJS.ProcessEnv | undefined,\n): Promise<Configuration> {\n return withConfigurationEnvironment(env, async () => {\n // Yarn still applies inherited rc files when useRc is false; this only\n // prevents project rc files from loading arbitrary third-party plugins.\n return Configuration.find(\n npath.toPortablePath(rootDir),\n PATCH_PLUGIN_CONFIGURATION,\n {\n strict: false,\n useRc: false,\n },\n );\n });\n}\n\nasync function findPatchFiles(\n directory: string,\n realpathAncestry: ReadonlySet<string> = new Set(),\n): Promise<string[]> {\n let realDirectory;\n try {\n realDirectory = await fs.realpath(directory);\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return [];\n }\n throw error;\n }\n if (realpathAncestry.has(realDirectory)) {\n return [];\n }\n const nextAncestry = new Set(realpathAncestry).add(realDirectory);\n\n let entries;\n try {\n entries = await fs.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return [];\n }\n throw error;\n }\n\n const files = await Promise.all(\n entries.map(async entry => {\n const entryPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return findPatchFiles(entryPath, nextAncestry);\n }\n if (entry.isSymbolicLink()) {\n try {\n const targetStats = await fs.stat(entryPath);\n if (targetStats.isDirectory()) {\n return findPatchFiles(entryPath, nextAncestry);\n }\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n }\n return [entryPath];\n }\n return entry.isFile() ? [entryPath] : [];\n }),\n );\n return files.flat().sort();\n}\n\nfunction uniqueDeclarations(\n declarations: PatchDeclaration[],\n): Map<string, PatchDeclaration> {\n const unique = new Map<string, PatchDeclaration>();\n for (const declaration of declarations) {\n const key = declarationKey(declaration);\n if (!unique.has(key)) {\n unique.set(key, declaration);\n }\n }\n return unique;\n}\n\nfunction getPatchedBackstagePackages(\n declarations: Iterable<PatchDeclaration>,\n): PatchedBackstagePackage[] {\n const packages: PatchedBackstagePackage[] = [];\n for (const declaration of declarations) {\n const declaredSource = normalizeNpmAliasSource(\n structUtils.parseDescriptor(declaration.source, true),\n );\n const resolvedSource = declaration.resolvedSource;\n const source = resolvedSource\n ? structUtils.parseLocator(resolvedSource, true)\n : declaredSource;\n if (source.scope !== 'backstage') {\n continue;\n }\n const range = structUtils.parseRange(\n 'reference' in source ? source.reference : source.range,\n );\n if (\n range.protocol !== 'npm:' ||\n semverUtils.clean(range.selector) === null\n ) {\n continue;\n }\n packages.push({\n name: structUtils.stringifyIdent(source),\n version: range.selector,\n location: declaration.location,\n });\n }\n return packages;\n}\n\nfunction isReleaseManifest(value: unknown): value is ReleaseManifest {\n return (\n isRecord(value) &&\n typeof value.releaseVersion === 'string' &&\n Array.isArray(value.packages) &&\n value.packages.every(\n packageEntry =>\n isRecord(packageEntry) &&\n typeof packageEntry.name === 'string' &&\n typeof packageEntry.version === 'string',\n )\n );\n}\n\nasync function readBackstageVersion(\n rootDir: string,\n): Promise<string | undefined> {\n try {\n const backstageJson: unknown = JSON.parse(\n await fs.readFile(path.join(rootDir, 'backstage.json'), 'utf8'),\n );\n if (!isRecord(backstageJson) || typeof backstageJson.version !== 'string') {\n throw new Error(\n \"backstage.json must contain a string 'version' property\",\n );\n }\n return backstageJson.version;\n } catch (error) {\n if (isErrorWithCode(error, 'ENOENT')) {\n return undefined;\n }\n throw error;\n }\n}\n\nasync function loadReleaseManifest(options: {\n backstageVersion: string;\n configuration: Configuration;\n env: NodeJS.ProcessEnv | undefined;\n fetch: typeof globalThis.fetch | undefined;\n}): Promise<ReleaseManifest> {\n const manifestFile = options.env?.BACKSTAGE_MANIFEST_FILE;\n const fetch =\n options.fetch ??\n (async (url: string) => {\n const manifest = await httpUtils.get(url, {\n configuration: options.configuration,\n jsonResponse: true,\n });\n return {\n status: 200,\n url,\n json: async () => manifest,\n };\n });\n const manifest: unknown = manifestFile\n ? JSON.parse(await fs.readFile(manifestFile, 'utf8'))\n : await getManifestByVersion({\n version: options.backstageVersion,\n versionsBaseUrl: options.env?.BACKSTAGE_VERSIONS_BASE_URL,\n fetch,\n });\n if (!isReleaseManifest(manifest)) {\n throw new Error('Backstage release manifest has an invalid format');\n }\n if (manifest.releaseVersion !== options.backstageVersion) {\n throw new Error(\n `Backstage release manifest version '${manifest.releaseVersion}' does not match selected version '${options.backstageVersion}'`,\n );\n }\n return manifest;\n}\n\nasync function validateBackstagePatches(options: {\n rootDir: string;\n declarations: Iterable<PatchDeclaration>;\n configuration: Configuration;\n env: NodeJS.ProcessEnv | undefined;\n fetch: typeof globalThis.fetch | undefined;\n}): Promise<{\n backstageCheck: VerifyYarnPatchesResult['backstageCheck'];\n errors: PatchVerificationError[];\n}> {\n const patchedPackages = getPatchedBackstagePackages(options.declarations);\n if (patchedPackages.length === 0) {\n return { backstageCheck: 'skipped', errors: [] };\n }\n\n let backstageVersion: string | undefined;\n try {\n backstageVersion = await readBackstageVersion(options.rootDir);\n } catch (error) {\n return {\n backstageCheck: 'verified',\n errors: [\n {\n kind: 'backstage-manifest-load-failure',\n message: `Failed to read Backstage release version: ${String(error)}`,\n location: 'backstage.json',\n },\n ],\n };\n }\n if (backstageVersion === undefined) {\n return { backstageCheck: 'skipped', errors: [] };\n }\n\n let releaseManifest: ReleaseManifest;\n try {\n releaseManifest = await loadReleaseManifest({\n backstageVersion,\n configuration: options.configuration,\n env: options.env,\n fetch: options.fetch,\n });\n } catch (error) {\n return {\n backstageCheck: 'verified',\n errors: [\n {\n kind: 'backstage-manifest-load-failure',\n message: `Failed to load Backstage release manifest for '${backstageVersion}': ${String(\n error,\n )}`,\n location: 'backstage.json',\n },\n ],\n };\n }\n\n const packageVersions = new Map(\n releaseManifest.packages.map(packageEntry => [\n packageEntry.name,\n packageEntry.version,\n ]),\n );\n const errors: PatchVerificationError[] = [];\n for (const patchedPackage of patchedPackages) {\n const releaseVersion = packageVersions.get(patchedPackage.name);\n if (releaseVersion === undefined) {\n errors.push({\n kind: 'backstage-package-missing',\n message: `Patched package '${patchedPackage.name}' is absent from Backstage release '${backstageVersion}'`,\n location: patchedPackage.location,\n });\n } else if (releaseVersion !== patchedPackage.version) {\n errors.push({\n kind: 'backstage-patch-holdback',\n message: `Patched package '${patchedPackage.name}' is at version '${patchedPackage.version}', but Backstage release '${backstageVersion}' requires version '${releaseVersion}'`,\n location: patchedPackage.location,\n });\n }\n }\n\n return { backstageCheck: 'verified', errors };\n}\n\nexport async function verifyYarnPatches(\n options: VerifyYarnPatchesOptions,\n): Promise<VerifyYarnPatchesResult> {\n const rootDir = path.resolve(options.rootDir);\n const errors: PatchVerificationError[] = [];\n const configuration = await readYarnConfiguration(rootDir, options.env);\n const { patchDeclarations, resolutionDeclarations } =\n await discoverManifestDeclarations(rootDir, configuration, errors);\n\n let lockfileData: Record<string, unknown> | undefined;\n try {\n const lockfileContent = await fs.readFile(\n path.join(rootDir, 'yarn.lock'),\n 'utf8',\n );\n lockfileData = parseLockfile(lockfileContent, errors);\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n errors.push({\n kind: 'missing-lockfile',\n message: 'No yarn.lock found',\n location: 'yarn.lock',\n });\n }\n\n let unusedResolutionLocations = new Set<string>();\n if (lockfileData !== undefined) {\n const resolutionValidation = validateResolutions({\n declarations: resolutionDeclarations,\n lockfileData,\n configuration,\n });\n errors.push(...resolutionValidation.errors);\n unusedResolutionLocations = resolutionValidation.unusedLocations;\n }\n\n const manifestDeclaredPatchFiles = new Set(\n patchDeclarations.flatMap(declaration =>\n declaration.paths.map(patchPath => patchPath.absolute),\n ),\n );\n const uniqueManifestDeclarations = uniqueDeclarations(\n patchDeclarations.filter(\n declaration => !unusedResolutionLocations.has(declaration.location),\n ),\n );\n const referencedPatchFiles = new Map<string, LocalPatchPath>();\n\n for (const declaration of uniqueManifestDeclarations.values()) {\n for (const patchPath of declaration.paths) {\n referencedPatchFiles.set(patchPath.absolute, patchPath);\n }\n }\n\n for (const [absolute, patchPath] of referencedPatchFiles) {\n try {\n const stats = await fs.stat(absolute);\n if (!stats.isFile()) {\n errors.push({\n kind: 'missing-patch-file',\n message: `Patch path '${patchPath.relative}' is not a regular file`,\n location: patchPath.relative,\n });\n }\n } catch (error) {\n if (!isErrorWithCode(error, 'ENOENT')) {\n throw error;\n }\n errors.push({\n kind: 'missing-patch-file',\n message: `Patch file '${patchPath.relative}' does not exist`,\n location: patchPath.relative,\n });\n }\n }\n\n const patchFolder = npath.fromPortablePath(configuration.get('patchFolder'));\n const patchFiles = await findPatchFiles(patchFolder);\n for (const patchFile of patchFiles) {\n if (!manifestDeclaredPatchFiles.has(patchFile)) {\n const relative = relativePath(rootDir, patchFile);\n errors.push({\n kind: 'orphaned-patch-file',\n message: `Patch file '${relative}' is not referenced by any manifest`,\n location: relative,\n });\n }\n }\n\n if (lockfileData !== undefined) {\n const lockfileDeclarations = uniqueDeclarations(\n discoverLockfileDeclarations(\n rootDir,\n configuration,\n lockfileData,\n errors,\n ),\n );\n\n for (const [key, declaration] of uniqueManifestDeclarations) {\n const lockfileDeclaration = lockfileDeclarations.get(key);\n if (!lockfileDeclaration) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `Patch declaration for '${\n declaration.source\n }' using '${declarationDescription(\n declaration,\n )}' is missing from yarn.lock`,\n location: declaration.location,\n });\n } else {\n declaration.resolvedSource = lockfileDeclaration.resolvedSource;\n }\n }\n\n for (const [key, declaration] of lockfileDeclarations) {\n if (declaration.projectOwned && !uniqueManifestDeclarations.has(key)) {\n errors.push({\n kind: 'lockfile-mismatch',\n message: `yarn.lock contains patch declaration for '${\n declaration.source\n }' using '${declarationDescription(\n declaration,\n )}' that is absent from manifests`,\n location: 'yarn.lock',\n });\n }\n }\n }\n\n const sourcesByPatchFile = new Map<string, Set<string>>();\n for (const declaration of uniqueManifestDeclarations.values()) {\n for (const patchPath of declaration.paths) {\n let sources = sourcesByPatchFile.get(patchPath.absolute);\n if (!sources) {\n sources = new Set();\n sourcesByPatchFile.set(patchPath.absolute, sources);\n }\n sources.add(declaration.resolvedSource ?? declaration.source);\n }\n }\n\n for (const [absolute, sources] of sourcesByPatchFile) {\n if (sources.size <= 1) {\n continue;\n }\n const patchPath = referencedPatchFiles.get(absolute);\n if (!patchPath) {\n continue;\n }\n const sortedSources = [...sources].sort();\n errors.push({\n kind: 'incompatible-patch-declarations',\n message: `Patch file '${\n patchPath.relative\n }' is used for incompatible sources: ${sortedSources\n .map(source => `'${source}'`)\n .join(', ')}`,\n location: patchPath.relative,\n });\n }\n\n const backstageValidation = await validateBackstagePatches({\n rootDir,\n declarations: uniqueManifestDeclarations.values(),\n configuration,\n env: options.env,\n fetch: options.fetch,\n });\n errors.push(...backstageValidation.errors);\n\n return {\n patchCount: referencedPatchFiles.size,\n backstageCheck: backstageValidation.backstageCheck,\n errors: sortErrors(errors),\n };\n}\n"],"names":["patchPlugin","path","structUtils","npath","ppath","semverUtils","TAG_REGEXP","Project","Workspace","parseResolution","parseSyml","Configuration","fs","manifest","httpUtils","getManifestByVersion"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@backstage/cli-module-package-manager-yarn";
6
- var version = "0.1.1-next.0";
6
+ var version = "0.1.1";
7
7
  var description = "CLI module for Yarn package manager commands";
8
8
  var backstage = {
9
9
  role: "cli-module"
@@ -39,7 +39,7 @@ var dependencies = {
39
39
  "@backstage/cli-common": "workspace:^",
40
40
  "@backstage/cli-node": "workspace:^",
41
41
  "@backstage/release-manifests": "workspace:^",
42
- "@yarnpkg/core": "^4.4.1",
42
+ "@yarnpkg/core": "^4.9.1",
43
43
  "@yarnpkg/fslib": "^3.1.2",
44
44
  "@yarnpkg/parsers": "^3.0.0",
45
45
  "@yarnpkg/plugin-patch": "^4.0.2",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/cli-module-package-manager-yarn",
3
- "version": "0.1.1-next.0",
3
+ "version": "0.1.1",
4
4
  "description": "CLI module for Yarn package manager commands",
5
5
  "backstage": {
6
6
  "role": "cli-module"
@@ -33,18 +33,18 @@
33
33
  "test": "backstage-cli package test"
34
34
  },
35
35
  "dependencies": {
36
- "@backstage/cli-common": "0.3.0",
37
- "@backstage/cli-node": "0.3.4",
38
- "@backstage/release-manifests": "0.0.14",
39
- "@yarnpkg/core": "^4.4.1",
36
+ "@backstage/cli-common": "^0.3.1",
37
+ "@backstage/cli-node": "^0.3.4",
38
+ "@backstage/release-manifests": "^0.0.14",
39
+ "@yarnpkg/core": "^4.9.1",
40
40
  "@yarnpkg/fslib": "^3.1.2",
41
41
  "@yarnpkg/parsers": "^3.0.0",
42
42
  "@yarnpkg/plugin-patch": "^4.0.2",
43
43
  "cleye": "^2.6.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@backstage/backend-test-utils": "1.11.7-next.0",
47
- "@backstage/cli": "0.36.6-next.0"
46
+ "@backstage/backend-test-utils": "^1.11.7",
47
+ "@backstage/cli": "^0.36.6"
48
48
  },
49
49
  "typesVersions": {
50
50
  "*": {