From b8fddd6784978a4b872987fadcee6b788c9c62da Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Fri, 7 May 2021 17:05:46 +0200 Subject: [PATCH 1/6] feat: allow to ignore native dependencies Along with that we simply need to have a cli parameter and an option in nativescript.config --- lib/controllers/prepare-controller.ts | 2 +- lib/definitions/platform.d.ts | 2 +- lib/definitions/project.d.ts | 1 + lib/services/plugins-service.ts | 2 +- lib/services/project-changes-service.ts | 2 +- .../node-modules/node-modules-builder.ts | 2 +- .../node-modules-dependencies-builder.ts | 6 ++- .../node-modules-dependencies-builder.ts | 40 +++++++++++++++++++ 8 files changed, 50 insertions(+), 7 deletions(-) diff --git a/lib/controllers/prepare-controller.ts b/lib/controllers/prepare-controller.ts index 258bb9c0bb..88a6c31773 100644 --- a/lib/controllers/prepare-controller.ts +++ b/lib/controllers/prepare-controller.ts @@ -375,7 +375,7 @@ export class PrepareController extends EventEmitter { projectData: IProjectData ): Promise { const dependencies = this.$nodeModulesDependenciesBuilder - .getProductionDependencies(projectData.projectDir) + .getProductionDependencies(projectData.projectDir, projectData.dependenciesToIgnore) .filter((dep) => dep.nativescript); const pluginsNativeDirectories = dependencies.map((dep) => path.join( diff --git a/lib/definitions/platform.d.ts b/lib/definitions/platform.d.ts index f8a3800fe3..3940f99b74 100644 --- a/lib/definitions/platform.d.ts +++ b/lib/definitions/platform.d.ts @@ -78,7 +78,7 @@ interface IPrepareNodeModulesData { } interface INodeModulesDependenciesBuilder { - getProductionDependencies(projectPath: string): IDependencyData[]; + getProductionDependencies(projectPath: string, ignore?: string[]): IDependencyData[]; } interface IBuildInfo { diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index 4820ea7d0b..d56cc02eb8 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -153,6 +153,7 @@ interface IProjectData extends ICreateProjectData { projectId: string; projectIdentifiers?: Mobile.IProjectIdentifier; dependencies: any; + dependenciesToIgnore?: string[]; devDependencies: IStringDictionary; appDirectoryPath: string; appResourcesDirectoryPath: string; diff --git a/lib/services/plugins-service.ts b/lib/services/plugins-service.ts index 8003aba5d1..ecdc263050 100644 --- a/lib/services/plugins-service.ts +++ b/lib/services/plugins-service.ts @@ -352,7 +352,7 @@ export class PluginsService implements IPluginsService { dependencies = dependencies || this.$nodeModulesDependenciesBuilder.getProductionDependencies( - projectData.projectDir + projectData.projectDir, projectData.dependenciesToIgnore ); if (_.isEmpty(dependencies)) { diff --git a/lib/services/project-changes-service.ts b/lib/services/project-changes-service.ts index ccdf97c9c7..cdc1d323f9 100644 --- a/lib/services/project-changes-service.ts +++ b/lib/services/project-changes-service.ts @@ -93,7 +93,7 @@ export class ProjectChangesService implements IProjectChangesService { ); this.$nodeModulesDependenciesBuilder - .getProductionDependencies(projectData.projectDir) + .getProductionDependencies(projectData.projectDir, projectData.dependenciesToIgnore) .filter( (dep) => dep.nativescript && diff --git a/lib/tools/node-modules/node-modules-builder.ts b/lib/tools/node-modules/node-modules-builder.ts index a7be237636..aa7b754d26 100644 --- a/lib/tools/node-modules/node-modules-builder.ts +++ b/lib/tools/node-modules/node-modules-builder.ts @@ -19,7 +19,7 @@ export class NodeModulesBuilder implements INodeModulesBuilder { projectData, }: IPrepareNodeModulesData): Promise { const dependencies = this.$nodeModulesDependenciesBuilder.getProductionDependencies( - projectData.projectDir + projectData.projectDir, projectData.dependenciesToIgnore ); await platformData.platformProjectService.beforePrepareAllPlugins( projectData, diff --git a/lib/tools/node-modules/node-modules-dependencies-builder.ts b/lib/tools/node-modules/node-modules-dependencies-builder.ts index eef6818aaf..deeec46e31 100644 --- a/lib/tools/node-modules/node-modules-dependencies-builder.ts +++ b/lib/tools/node-modules/node-modules-dependencies-builder.ts @@ -20,7 +20,7 @@ export class NodeModulesDependenciesBuilder implements INodeModulesDependenciesBuilder { public constructor(private $fs: IFileSystem) {} - public getProductionDependencies(projectPath: string): IDependencyData[] { + public getProductionDependencies(projectPath: string, ignore?:string[]): IDependencyData[] { const rootNodeModulesPath = path.join( projectPath, NODE_MODULES_FOLDER_NAME @@ -83,7 +83,9 @@ export class NodeModulesDependenciesBuilder resolvedDependencies.push(resolvedDependency); } } - + if (ignore && ignore.length > 0) { + return resolvedDependencies.filter(d => ignore.indexOf(d.name) === -1); + } return resolvedDependencies; } diff --git a/test/tools/node-modules/node-modules-dependencies-builder.ts b/test/tools/node-modules/node-modules-dependencies-builder.ts index 1d0e69ed1c..596e052d88 100644 --- a/test/tools/node-modules/node-modules-dependencies-builder.ts +++ b/test/tools/node-modules/node-modules-dependencies-builder.ts @@ -790,6 +790,46 @@ describe("nodeModulesDependenciesBuilder", () => { assert.deepStrictEqual(actualResult, expectedResult); }); + + it("ignoring dependencies", async () => { + // The test validates the following dependency tree, when npm 3+ is used. + // + // ├── firstPackage@1.0.0 + // ├── secondPackage@1.1.0 + // └── thirdPackage@1.2.0 + + const rootDeps: IDependencyInfo[] = [ + generateDependency(firstPackage, "1.0.0", 0, null), + generateDependency(secondPackage, "1.1.0", 0, null), + generateDependency(thirdPackage, "1.2.0", 0, null), + ]; + + const nodeModulesDependenciesBuilder = generateTest(rootDeps); + const actualResult = await nodeModulesDependenciesBuilder.getProductionDependencies( + pathToProject, [firstPackage] + ); + + const expectedResult: IDependencyData[] = [ + getNodeModuleInfoForExpecteDependency( + secondPackage, + 0, + null, + null, + null, + "1.1.0" + ), + getNodeModuleInfoForExpecteDependency( + thirdPackage, + 0, + null, + null, + null, + "1.2.0" + ), + ]; + + assert.deepStrictEqual(actualResult, expectedResult); + }); }); }); }); From 4448252b2938ab6e9439b4d436e19c25d473d7ec Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 1 Jun 2021 10:10:24 +0200 Subject: [PATCH 2/6] Update lib/definitions/project.d.ts Co-authored-by: Igor Randjelovic --- lib/definitions/project.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/definitions/project.d.ts b/lib/definitions/project.d.ts index d56cc02eb8..186d77734b 100644 --- a/lib/definitions/project.d.ts +++ b/lib/definitions/project.d.ts @@ -153,7 +153,7 @@ interface IProjectData extends ICreateProjectData { projectId: string; projectIdentifiers?: Mobile.IProjectIdentifier; dependencies: any; - dependenciesToIgnore?: string[]; + ignoredDependencies?: string[]; devDependencies: IStringDictionary; appDirectoryPath: string; appResourcesDirectoryPath: string; From 440f41331110b6bfecc194092ab3821ad02007c7 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 1 Jun 2021 10:10:28 +0200 Subject: [PATCH 3/6] Update lib/controllers/prepare-controller.ts Co-authored-by: Igor Randjelovic --- lib/controllers/prepare-controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/prepare-controller.ts b/lib/controllers/prepare-controller.ts index 88a6c31773..df3272136c 100644 --- a/lib/controllers/prepare-controller.ts +++ b/lib/controllers/prepare-controller.ts @@ -375,7 +375,7 @@ export class PrepareController extends EventEmitter { projectData: IProjectData ): Promise { const dependencies = this.$nodeModulesDependenciesBuilder - .getProductionDependencies(projectData.projectDir, projectData.dependenciesToIgnore) + .getProductionDependencies(projectData.projectDir, projectData.ignoredDependencies) .filter((dep) => dep.nativescript); const pluginsNativeDirectories = dependencies.map((dep) => path.join( From b07192a884a10c1bf8408c8468129c40e32dfa3d Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 1 Jun 2021 10:10:34 +0200 Subject: [PATCH 4/6] Update lib/services/project-changes-service.ts Co-authored-by: Igor Randjelovic --- lib/services/project-changes-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/project-changes-service.ts b/lib/services/project-changes-service.ts index cdc1d323f9..91fcf3a054 100644 --- a/lib/services/project-changes-service.ts +++ b/lib/services/project-changes-service.ts @@ -93,7 +93,7 @@ export class ProjectChangesService implements IProjectChangesService { ); this.$nodeModulesDependenciesBuilder - .getProductionDependencies(projectData.projectDir, projectData.dependenciesToIgnore) + .getProductionDependencies(projectData.projectDir, projectData.ignoredDependencies) .filter( (dep) => dep.nativescript && From 40efc6404a69a80562665fc50430f6d43ce30fe9 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 1 Jun 2021 10:10:42 +0200 Subject: [PATCH 5/6] Update lib/services/plugins-service.ts Co-authored-by: Igor Randjelovic --- lib/services/plugins-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/plugins-service.ts b/lib/services/plugins-service.ts index ecdc263050..6574adcda9 100644 --- a/lib/services/plugins-service.ts +++ b/lib/services/plugins-service.ts @@ -352,7 +352,7 @@ export class PluginsService implements IPluginsService { dependencies = dependencies || this.$nodeModulesDependenciesBuilder.getProductionDependencies( - projectData.projectDir, projectData.dependenciesToIgnore + projectData.projectDir, projectData.ignoredDependencies ); if (_.isEmpty(dependencies)) { From 931ac190872c152cebf471406434dbd97dd02647 Mon Sep 17 00:00:00 2001 From: Martin Guillon Date: Tue, 1 Jun 2021 10:10:47 +0200 Subject: [PATCH 6/6] Update lib/tools/node-modules/node-modules-builder.ts Co-authored-by: Igor Randjelovic --- lib/tools/node-modules/node-modules-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tools/node-modules/node-modules-builder.ts b/lib/tools/node-modules/node-modules-builder.ts index aa7b754d26..6be5874213 100644 --- a/lib/tools/node-modules/node-modules-builder.ts +++ b/lib/tools/node-modules/node-modules-builder.ts @@ -19,7 +19,7 @@ export class NodeModulesBuilder implements INodeModulesBuilder { projectData, }: IPrepareNodeModulesData): Promise { const dependencies = this.$nodeModulesDependenciesBuilder.getProductionDependencies( - projectData.projectDir, projectData.dependenciesToIgnore + projectData.projectDir, projectData.ignoredDependencies ); await platformData.platformProjectService.beforePrepareAllPlugins( projectData,