Skip to content

Commit 3904aab

Browse files
committed
add resolutions, change yarn-cling, and auto-generate files
fix build error about strip-ansi comment fix error by string-width resolution for wrap-ansi add new modules to resolutions regenerate yarn.lock instead of resolutions chore: trigger CI rebuild resolutions avoid to regenerate yarn.lock but re-resolutions modify yarn-cling build and auto-generate files add tests for resolutions
1 parent 77912fe commit 3904aab

File tree

11 files changed

+410
-81
lines changed

11 files changed

+410
-81
lines changed

.projen/deps.json

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.projenrc.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,13 @@ new AdcPublishing(repoProject);
322322

323323
const repo = configureProject(repoProject);
324324

325+
// Force CommonJS versions to prevent Yarn from hoisting ESM-only versions, which break the build
326+
repo.package.addPackageResolutions(
327+
'strip-ansi@^6.0.1',
328+
'string-width@^4.2.3',
329+
'wrap-ansi@^7.0.0',
330+
);
331+
325332
interface GenericProps {
326333
private?: boolean;
327334
}

package.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@aws-cdk/integ-runner/THIRD_PARTY_LICENSES

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,212 @@ The @aws-cdk/integ-runner package includes the following third-party software/li
822822
limitations under the License.
823823

824824

825+
----------------
826+
827+
** @aws-sdk/[email protected] - https://www.npmjs.com/package/@aws-sdk/client-bedrock-agentcore-control/v/3.948.0 | Apache-2.0
828+
Apache License
829+
Version 2.0, January 2004
830+
http://www.apache.org/licenses/
831+
832+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
833+
834+
1. Definitions.
835+
836+
"License" shall mean the terms and conditions for use, reproduction,
837+
and distribution as defined by Sections 1 through 9 of this document.
838+
839+
"Licensor" shall mean the copyright owner or entity authorized by
840+
the copyright owner that is granting the License.
841+
842+
"Legal Entity" shall mean the union of the acting entity and all
843+
other entities that control, are controlled by, or are under common
844+
control with that entity. For the purposes of this definition,
845+
"control" means (i) the power, direct or indirect, to cause the
846+
direction or management of such entity, whether by contract or
847+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
848+
outstanding shares, or (iii) beneficial ownership of such entity.
849+
850+
"You" (or "Your") shall mean an individual or Legal Entity
851+
exercising permissions granted by this License.
852+
853+
"Source" form shall mean the preferred form for making modifications,
854+
including but not limited to software source code, documentation
855+
source, and configuration files.
856+
857+
"Object" form shall mean any form resulting from mechanical
858+
transformation or translation of a Source form, including but
859+
not limited to compiled object code, generated documentation,
860+
and conversions to other media types.
861+
862+
"Work" shall mean the work of authorship, whether in Source or
863+
Object form, made available under the License, as indicated by a
864+
copyright notice that is included in or attached to the work
865+
(an example is provided in the Appendix below).
866+
867+
"Derivative Works" shall mean any work, whether in Source or Object
868+
form, that is based on (or derived from) the Work and for which the
869+
editorial revisions, annotations, elaborations, or other modifications
870+
represent, as a whole, an original work of authorship. For the purposes
871+
of this License, Derivative Works shall not include works that remain
872+
separable from, or merely link (or bind by name) to the interfaces of,
873+
the Work and Derivative Works thereof.
874+
875+
"Contribution" shall mean any work of authorship, including
876+
the original version of the Work and any modifications or additions
877+
to that Work or Derivative Works thereof, that is intentionally
878+
submitted to Licensor for inclusion in the Work by the copyright owner
879+
or by an individual or Legal Entity authorized to submit on behalf of
880+
the copyright owner. For the purposes of this definition, "submitted"
881+
means any form of electronic, verbal, or written communication sent
882+
to the Licensor or its representatives, including but not limited to
883+
communication on electronic mailing lists, source code control systems,
884+
and issue tracking systems that are managed by, or on behalf of, the
885+
Licensor for the purpose of discussing and improving the Work, but
886+
excluding communication that is conspicuously marked or otherwise
887+
designated in writing by the copyright owner as "Not a Contribution."
888+
889+
"Contributor" shall mean Licensor and any individual or Legal Entity
890+
on behalf of whom a Contribution has been received by Licensor and
891+
subsequently incorporated within the Work.
892+
893+
2. Grant of Copyright License. Subject to the terms and conditions of
894+
this License, each Contributor hereby grants to You a perpetual,
895+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
896+
copyright license to reproduce, prepare Derivative Works of,
897+
publicly display, publicly perform, sublicense, and distribute the
898+
Work and such Derivative Works in Source or Object form.
899+
900+
3. Grant of Patent License. Subject to the terms and conditions of
901+
this License, each Contributor hereby grants to You a perpetual,
902+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
903+
(except as stated in this section) patent license to make, have made,
904+
use, offer to sell, sell, import, and otherwise transfer the Work,
905+
where such license applies only to those patent claims licensable
906+
by such Contributor that are necessarily infringed by their
907+
Contribution(s) alone or by combination of their Contribution(s)
908+
with the Work to which such Contribution(s) was submitted. If You
909+
institute patent litigation against any entity (including a
910+
cross-claim or counterclaim in a lawsuit) alleging that the Work
911+
or a Contribution incorporated within the Work constitutes direct
912+
or contributory patent infringement, then any patent licenses
913+
granted to You under this License for that Work shall terminate
914+
as of the date such litigation is filed.
915+
916+
4. Redistribution. You may reproduce and distribute copies of the
917+
Work or Derivative Works thereof in any medium, with or without
918+
modifications, and in Source or Object form, provided that You
919+
meet the following conditions:
920+
921+
(a) You must give any other recipients of the Work or
922+
Derivative Works a copy of this License; and
923+
924+
(b) You must cause any modified files to carry prominent notices
925+
stating that You changed the files; and
926+
927+
(c) You must retain, in the Source form of any Derivative Works
928+
that You distribute, all copyright, patent, trademark, and
929+
attribution notices from the Source form of the Work,
930+
excluding those notices that do not pertain to any part of
931+
the Derivative Works; and
932+
933+
(d) If the Work includes a "NOTICE" text file as part of its
934+
distribution, then any Derivative Works that You distribute must
935+
include a readable copy of the attribution notices contained
936+
within such NOTICE file, excluding those notices that do not
937+
pertain to any part of the Derivative Works, in at least one
938+
of the following places: within a NOTICE text file distributed
939+
as part of the Derivative Works; within the Source form or
940+
documentation, if provided along with the Derivative Works; or,
941+
within a display generated by the Derivative Works, if and
942+
wherever such third-party notices normally appear. The contents
943+
of the NOTICE file are for informational purposes only and
944+
do not modify the License. You may add Your own attribution
945+
notices within Derivative Works that You distribute, alongside
946+
or as an addendum to the NOTICE text from the Work, provided
947+
that such additional attribution notices cannot be construed
948+
as modifying the License.
949+
950+
You may add Your own copyright statement to Your modifications and
951+
may provide additional or different license terms and conditions
952+
for use, reproduction, or distribution of Your modifications, or
953+
for any such Derivative Works as a whole, provided Your use,
954+
reproduction, and distribution of the Work otherwise complies with
955+
the conditions stated in this License.
956+
957+
5. Submission of Contributions. Unless You explicitly state otherwise,
958+
any Contribution intentionally submitted for inclusion in the Work
959+
by You to the Licensor shall be under the terms and conditions of
960+
this License, without any additional terms or conditions.
961+
Notwithstanding the above, nothing herein shall supersede or modify
962+
the terms of any separate license agreement you may have executed
963+
with Licensor regarding such Contributions.
964+
965+
6. Trademarks. This License does not grant permission to use the trade
966+
names, trademarks, service marks, or product names of the Licensor,
967+
except as required for reasonable and customary use in describing the
968+
origin of the Work and reproducing the content of the NOTICE file.
969+
970+
7. Disclaimer of Warranty. Unless required by applicable law or
971+
agreed to in writing, Licensor provides the Work (and each
972+
Contributor provides its Contributions) on an "AS IS" BASIS,
973+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
974+
implied, including, without limitation, any warranties or conditions
975+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
976+
PARTICULAR PURPOSE. You are solely responsible for determining the
977+
appropriateness of using or redistributing the Work and assume any
978+
risks associated with Your exercise of permissions under this License.
979+
980+
8. Limitation of Liability. In no event and under no legal theory,
981+
whether in tort (including negligence), contract, or otherwise,
982+
unless required by applicable law (such as deliberate and grossly
983+
negligent acts) or agreed to in writing, shall any Contributor be
984+
liable to You for damages, including any direct, indirect, special,
985+
incidental, or consequential damages of any character arising as a
986+
result of this License or out of the use or inability to use the
987+
Work (including but not limited to damages for loss of goodwill,
988+
work stoppage, computer failure or malfunction, or any and all
989+
other commercial damages or losses), even if such Contributor
990+
has been advised of the possibility of such damages.
991+
992+
9. Accepting Warranty or Additional Liability. While redistributing
993+
the Work or Derivative Works thereof, You may choose to offer,
994+
and charge a fee for, acceptance of support, warranty, indemnity,
995+
or other liability obligations and/or rights consistent with this
996+
License. However, in accepting such obligations, You may act only
997+
on Your own behalf and on Your sole responsibility, not on behalf
998+
of any other Contributor, and only if You agree to indemnify,
999+
defend, and hold each Contributor harmless for any liability
1000+
incurred by, or claims asserted against, such Contributor by reason
1001+
of your accepting any such warranty or additional liability.
1002+
1003+
END OF TERMS AND CONDITIONS
1004+
1005+
APPENDIX: How to apply the Apache License to your work.
1006+
1007+
To apply the Apache License to your work, attach the following
1008+
boilerplate notice, with the fields enclosed by brackets "{}"
1009+
replaced with your own identifying information. (Don't include
1010+
the brackets!) The text should be enclosed in the appropriate
1011+
comment syntax for the file format. We also recommend that a
1012+
file or class name and description of purpose be included on the
1013+
same "printed page" as the copyright notice for easier
1014+
identification within third-party archives.
1015+
1016+
Copyright 2018-2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
1017+
1018+
Licensed under the Apache License, Version 2.0 (the "License");
1019+
you may not use this file except in compliance with the License.
1020+
You may obtain a copy of the License at
1021+
1022+
http://www.apache.org/licenses/LICENSE-2.0
1023+
1024+
Unless required by applicable law or agreed to in writing, software
1025+
distributed under the License is distributed on an "AS IS" BASIS,
1026+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1027+
See the License for the specific language governing permissions and
1028+
limitations under the License.
1029+
1030+
8251031
----------------
8261032

8271033
** @aws-sdk/[email protected] - https://www.npmjs.com/package/@aws-sdk/client-cloudcontrol/v/3.948.0 | Apache-2.0

packages/@aws-cdk/yarn-cling/lib/index.ts

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,21 @@ export async function generateShrinkwrap(options: ShrinkwrapOptions): Promise<Pa
3636
const yarnLock: YarnLock = lockfile.parse(await fs.readFile(yarnLockLoc, { encoding: 'utf8' }));
3737
const pkgJson = await loadPackageJson(packageJsonFile);
3838

39-
let lock = await generateLockFile(pkgJson, yarnLock, packageJsonDir);
39+
// Load resolutions from root package.json (for monorepo support)
40+
const rootPkgJsonPath = path.join(path.dirname(yarnLockLoc), 'package.json');
41+
let resolutions: Record<string, string> = {};
42+
if (await fileExists(rootPkgJsonPath)) {
43+
const rootPkgJson = await loadPackageJson(rootPkgJsonPath);
44+
resolutions = rootPkgJson.resolutions || {};
45+
}
46+
47+
let lock = await generateLockFile(pkgJson, yarnLock, packageJsonDir, resolutions);
4048

4149
if (options.hoist ?? true) {
4250
lock = hoistDependencies(lock);
4351
}
4452

45-
_validateTree(lock);
53+
_validateTree(lock, resolutions);
4654

4755
if (options.outputFile) {
4856
// Write the shrinkwrap file
@@ -52,7 +60,12 @@ export async function generateShrinkwrap(options: ShrinkwrapOptions): Promise<Pa
5260
return lock;
5361
}
5462

55-
async function generateLockFile(pkgJson: PackageJson, yarnLock: YarnLock, rootDir: string): Promise<PackageLockFile> {
63+
async function generateLockFile(
64+
pkgJson: PackageJson,
65+
yarnLock: YarnLock,
66+
rootDir: string,
67+
resolutions: Record<string, string> = {},
68+
): Promise<PackageLockFile> {
5669
const builder = new PackageGraphBuilder(yarnLock);
5770
const rootKeys = await builder.buildGraph(pkgJson.dependencies || {}, rootDir);
5871

@@ -65,7 +78,7 @@ async function generateLockFile(pkgJson: PackageJson, yarnLock: YarnLock, rootDi
6578
};
6679

6780
try {
68-
checkRequiredVersions(lockFile);
81+
checkRequiredVersions(lockFile, resolutions);
6982
} catch (e: any) {
7083
const tempFile = path.join(os.tmpdir(), 'npm-shrinkwrap.json');
7184
await fs.writeFile(tempFile, JSON.stringify(lockFile, undefined, 2), 'utf-8');
@@ -366,7 +379,7 @@ async function findPackageDir(depName: string, rootDir: string) {
366379
* tell our future selves that is cannot and will not work, and we should find another
367380
* solution.
368381
*/
369-
export function checkRequiredVersions(root: PackageLockFile) {
382+
export function checkRequiredVersions(root: PackageLockFile, resolutions: Record<string, string> = {}) {
370383
recurse(root, [[root.name, root]]);
371384

372385
// rootPath does include 'entry'
@@ -386,8 +399,11 @@ export function checkRequiredVersions(root: PackageLockFile) {
386399
range = range.split('@')[1];
387400
}
388401

402+
// If there's a resolution for this package, use that instead of the required range
403+
const effectiveRange = resolutions[name] || range;
404+
389405
const depPath = [name, ...rootPath.map(x => x[0])];
390-
if (!semver.satisfies(resolvedPackage.version, range)) {
406+
if (!semver.satisfies(resolvedPackage.version, effectiveRange)) {
391407
// Ruh-roh.
392408
throw new Error(`Looks like we're trying to force '${renderRootPath(depPath)}' to version '${resolvedPackage.version}' (found at ${resolvedPath} => ${name}), but `
393409
+ `${depPath[depPath.length - 1]} specifies the dependency as '${range}'. NPM will not respect this shrinkwrap file. Try vendoring a patched `
@@ -421,7 +437,7 @@ export function checkRequiredVersions(root: PackageLockFile) {
421437
* We have manipulated the tree a bunch. Do a sanity check to ensure that all declared
422438
* dependencies are satisfied.
423439
*/
424-
export function _validateTree(lock: PackageLockTree) {
440+
export function _validateTree(lock: PackageLockTree, resolutions: Record<string, string> = {}) {
425441
const errors = new Array<string>();
426442
recurse(lock, [['root', lock]], {});
427443
if (errors.length > 0) {
@@ -452,13 +468,16 @@ export function _validateTree(lock: PackageLockTree) {
452468
declaredRange = declaredRange.split('@')[1];
453469
}
454470

471+
// If there's a resolution for this package, use that instead of the declared range
472+
const effectiveRange = resolutions[name] || declaredRange;
473+
455474
const foundVersion = depsVersions[name];
456475
const newRootPath = [name, ...rootPath.map(x => x[0])];
457476
if (!foundVersion) {
458477
errors.push(`Dependency on ${renderRootPath(newRootPath)} not satisfied: not found`);
459-
} else if (!semver.satisfies(foundVersion, declaredRange)) {
478+
} else if (!semver.satisfies(foundVersion, effectiveRange)) {
460479
// eslint-disable-next-line no-console
461-
errors.push(`Dependency on ${renderRootPath(newRootPath)} not satisfied: declared range '${declaredRange}', found '${foundVersion}'`);
480+
errors.push(`Dependency on ${renderRootPath(newRootPath)} not satisfied: declared range '${effectiveRange}', found '${foundVersion}'`);
462481
}
463482
}
464483
}

packages/@aws-cdk/yarn-cling/lib/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ export interface PackageJson {
66
* Dependency name to version range
77
*/
88
dependencies?: Record<string, string>;
9+
10+
/**
11+
* Yarn resolutions to force specific package versions
12+
*/
13+
resolutions?: Record<string, string>;
914
}
1015

1116
export interface YarnLock {

0 commit comments

Comments
 (0)