Skip to content

Commit 1a70395

Browse files
authored
[Build] Preserve optionalDependencies in built package.json (#2410)
## Motivation for the change, related issues The `fs-ext` package is listed under `"optionalDependencies"` in the top-level package.json. However, in the built packages, it becomes a regular `dependency`. This PR makes sure that all the `optionalDependencies` remain `optionalDependencies` in the final built package. ## Testing Instructions (or ideally a Blueprint) Run `npm run build` and confirm that the built `@wp-playground/cli` and `@php-wasm/node` list `fs-ext` under `optionalDependencies` and not under `dependencies`.
1 parent 083a1e2 commit 1a70395

File tree

1 file changed

+30
-2
lines changed
  • packages/nx-extensions/src/executors/package-json

1 file changed

+30
-2
lines changed

packages/nx-extensions/src/executors/package-json/executor.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ export default async function* packageJsonExecutor(
4444
}
4545

4646
const monorepoDependencies = getMonorepoDependencies(context);
47+
48+
// Read optional dependencies from the original package.json
49+
let originalOptionalDependencies: Record<string, string> | undefined;
50+
const originalPackageJsonPath = `${context.root}/package.json`;
51+
if (fs.existsSync(originalPackageJsonPath)) {
52+
const originalPackageJson = JSON.parse(
53+
fs.readFileSync(originalPackageJsonPath).toString()
54+
);
55+
originalOptionalDependencies = originalPackageJson.optionalDependencies;
56+
}
57+
4758
for await (const event of startBuild(options, context)) {
4859
if (!event.success) {
4960
throw 'There was an error with the build. See above.';
@@ -54,7 +65,8 @@ export default async function* packageJsonExecutor(
5465
options,
5566
context,
5667
helperDependencies,
57-
monorepoDependencies
68+
monorepoDependencies,
69+
originalOptionalDependencies
5870
);
5971
if (built === false) {
6072
return {
@@ -87,7 +99,8 @@ async function buildPackageJson(
8799
options: PackageJsonExecutorSchema,
88100
context: ExecutorContext,
89101
helperDependencies: ProjectGraphDependency[],
90-
monorepoDependencies: MonorepoDependency[]
102+
monorepoDependencies: MonorepoDependency[],
103+
originalOptionalDependencies?: Record<string, string>
91104
) {
92105
const packageJson = createPackageJson(
93106
context.projectName,
@@ -118,6 +131,21 @@ async function buildPackageJson(
118131
packageJson.dependencies[dep.name] = dep.version;
119132
}
120133

134+
// Preserve optionalDependencies from the original package.json
135+
if (originalOptionalDependencies) {
136+
packageJson.optionalDependencies = originalOptionalDependencies;
137+
138+
// Remove optional dependencies from regular dependencies to avoid duplication
139+
for (const optionalDep of Object.keys(originalOptionalDependencies)) {
140+
if (
141+
packageJson.dependencies &&
142+
packageJson.dependencies[optionalDep]
143+
) {
144+
delete packageJson.dependencies[optionalDep];
145+
}
146+
}
147+
}
148+
121149
// make main relative to context root
122150
if (main.startsWith(context.root)) {
123151
main = main.substring(context.root.length).replace(/^\//, '');

0 commit comments

Comments
 (0)