Skip to content

Commit 5954ef6

Browse files
committed
feat: yarn2+ support
1 parent 7574be2 commit 5954ef6

12 files changed

+168
-0
lines changed

lib/bootstrap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ injector.requireCommand("setup|*", "./commands/setup");
218218
injector.requirePublic("packageManager", "./package-manager");
219219
injector.requirePublic("npm", "./node-package-manager");
220220
injector.requirePublic("yarn", "./yarn-package-manager");
221+
injector.requirePublic("yarn2", "./yarn2-package-manager");
221222
injector.requirePublic("pnpm", "./pnpm-package-manager");
222223
injector.requireCommand(
223224
"package-manager|*get",

lib/commands/preview.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export class PreviewCommand implements ICommand {
5151
installCommand = "npm install --save-dev @nativescript/preview-cli";
5252
break;
5353
case PackageManagers.yarn:
54+
case PackageManagers.yarn2:
5455
installCommand = "yarn add -D @nativescript/preview-cli";
5556
break;
5657
case PackageManagers.pnpm:

lib/common/dispatchers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ export class CommandDispatcher implements ICommandDispatcher {
124124
updateCommand = "npm i -g nativescript";
125125
break;
126126
case PackageManagers.yarn:
127+
case PackageManagers.yarn2:
127128
updateCommand = "yarn global add nativescript";
128129
break;
129130
case PackageManagers.pnpm:

lib/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,4 +492,5 @@ export enum PackageManagers {
492492
npm = "npm",
493493
pnpm = "pnpm",
494494
yarn = "yarn",
495+
yarn2 = "yarn2",
495496
}

lib/declarations.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,7 @@ interface IOptions
663663
frameworkName: string;
664664
frameworkVersion: string;
665665
yarn: string;
666+
yarn2: string;
666667
pnpm: string;
667668
ipa: string;
668669
tsc: boolean;

lib/options.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export class Options {
136136
ts: { type: OptionType.Boolean, hasSensitiveValue: false },
137137
typescript: { type: OptionType.Boolean, hasSensitiveValue: false },
138138
yarn: { type: OptionType.Boolean, hasSensitiveValue: false },
139+
yarn2: { type: OptionType.Boolean, hasSensitiveValue: false },
139140
pnpm: { type: OptionType.Boolean, hasSensitiveValue: false },
140141
androidTypings: { type: OptionType.Boolean, hasSensitiveValue: false },
141142
bundle: { type: OptionType.String, hasSensitiveValue: false },

lib/package-manager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class PackageManager implements IPackageManager {
2626
private $npm: INodePackageManager,
2727
private $options: IOptions,
2828
private $yarn: INodePackageManager,
29+
private $yarn2: INodePackageManager,
2930
private $pnpm: INodePackageManager,
3031
private $logger: ILogger,
3132
private $userSettingsService: IUserSettingsService,
@@ -164,6 +165,9 @@ export class PackageManager implements IPackageManager {
164165
if (pm === PackageManagers.yarn || this.$options.yarn) {
165166
this._packageManagerName = PackageManagers.yarn;
166167
return this.$yarn;
168+
} if (pm === PackageManagers.yarn2 || this.$options.yarn2) {
169+
this._packageManagerName = PackageManagers.yarn2;
170+
return this.$yarn2;
167171
} else if (pm === PackageManagers.pnpm || this.$options.pnpm) {
168172
this._packageManagerName = PackageManagers.pnpm;
169173
return this.$pnpm;

lib/yarn2-package-manager.ts

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import * as path from "path";
2+
import * as _ from "lodash";
3+
import { BasePackageManager } from "./base-package-manager";
4+
import { exported } from "./common/decorators";
5+
import {
6+
INodePackageManagerInstallOptions,
7+
INpmInstallResultInfo,
8+
INpmsResult,
9+
} from "./declarations";
10+
import {
11+
IChildProcess,
12+
IErrors,
13+
IFileSystem,
14+
IHostInfo,
15+
Server,
16+
IDictionary,
17+
} from "./common/declarations";
18+
import { injector } from "./common/yok";
19+
20+
export class Yarn2PackageManager extends BasePackageManager {
21+
constructor(
22+
$childProcess: IChildProcess,
23+
private $errors: IErrors,
24+
$fs: IFileSystem,
25+
$hostInfo: IHostInfo,
26+
private $httpClient: Server.IHttpClient,
27+
private $logger: ILogger,
28+
$pacoteService: IPacoteService
29+
) {
30+
super($childProcess, $fs, $hostInfo, $pacoteService, "yarn2");
31+
}
32+
33+
@exported("yarn2")
34+
public async install(
35+
packageName: string,
36+
pathToSave: string,
37+
config: INodePackageManagerInstallOptions
38+
): Promise<INpmInstallResultInfo> {
39+
if (config.disableNpmInstall) {
40+
return;
41+
}
42+
if (config.ignoreScripts) {
43+
config["ignore-scripts"] = true;
44+
}
45+
46+
const packageJsonPath = path.join(pathToSave, "package.json");
47+
const jsonContentBefore = this.$fs.readJson(packageJsonPath);
48+
49+
const flags = this.getFlagsString(config, true);
50+
let params = [];
51+
const isInstallingAllDependencies = packageName === pathToSave;
52+
if (!isInstallingAllDependencies) {
53+
params.push("add", packageName);
54+
}
55+
56+
params = params.concat(flags);
57+
const cwd = pathToSave;
58+
59+
try {
60+
const result = await this.processPackageManagerInstall(
61+
packageName,
62+
params,
63+
{ cwd, isInstallingAllDependencies }
64+
);
65+
return result;
66+
} catch (e) {
67+
this.$fs.writeJson(packageJsonPath, jsonContentBefore);
68+
throw e;
69+
}
70+
}
71+
72+
@exported("yarn2")
73+
public uninstall(
74+
packageName: string,
75+
config?: IDictionary<string | boolean>,
76+
cwd?: string
77+
): Promise<string> {
78+
const flags = this.getFlagsString(config, false);
79+
return this.$childProcess.exec(`yarn remove ${packageName} ${flags}`, {
80+
cwd,
81+
});
82+
}
83+
84+
@exported("yarn2")
85+
public async view(packageName: string, config: Object): Promise<any> {
86+
const wrappedConfig = _.extend({}, config, { json: true });
87+
88+
const flags = this.getFlagsString(wrappedConfig, false);
89+
let viewResult: any;
90+
try {
91+
viewResult = await this.$childProcess.exec(
92+
`yarn info ${packageName} ${flags}`
93+
);
94+
} catch (e) {
95+
this.$errors.fail(e.message);
96+
}
97+
98+
try {
99+
const result = JSON.parse(viewResult);
100+
return result.data;
101+
} catch (err) {
102+
return null;
103+
}
104+
}
105+
106+
@exported("yarn2")
107+
public search(
108+
filter: string[],
109+
config: IDictionary<string | boolean>
110+
): Promise<string> {
111+
this.$errors.fail(
112+
"Method not implemented. Yarn does not support searching for packages in the registry."
113+
);
114+
return null;
115+
}
116+
117+
public async searchNpms(keyword: string): Promise<INpmsResult> {
118+
const httpRequestResult = await this.$httpClient.httpRequest(
119+
`https://api.npms.io/v2/search?q=keywords:${keyword}`
120+
);
121+
const result: INpmsResult = JSON.parse(httpRequestResult.body);
122+
return result;
123+
}
124+
125+
@exported("yarn2")
126+
public async getRegistryPackageData(packageName: string): Promise<any> {
127+
const registry = await this.$childProcess.exec(`yarn config get npmRegistryServer`);
128+
const url = `${registry.trim()}/${packageName}`;
129+
this.$logger.trace(
130+
`Trying to get data from yarn registry for package ${packageName}, url is: ${url}`
131+
);
132+
const responseData = (await this.$httpClient.httpRequest(url)).body;
133+
this.$logger.trace(
134+
`Successfully received data from yarn registry for package ${packageName}. Response data is: ${responseData}`
135+
);
136+
const jsonData = JSON.parse(responseData);
137+
this.$logger.trace(
138+
`Successfully parsed data from yarn registry for package ${packageName}.`
139+
);
140+
return jsonData;
141+
}
142+
143+
@exported("yarn2")
144+
public async getCachePath(): Promise<string> {
145+
const result = await this.$childProcess.exec(`yarn config get cacheFolder`);
146+
return result.toString().trim();
147+
}
148+
}
149+
150+
injector.register("yarn2", Yarn2PackageManager);

test/controllers/add-platform-controller.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { AddPlaformErrors } from "../../lib/constants";
88
import { PackageManager } from "../../lib/package-manager";
99
import { NodePackageManager } from "../../lib/node-package-manager";
1010
import { YarnPackageManager } from "../../lib/yarn-package-manager";
11+
import { Yarn2PackageManager } from "../../lib/yarn2-package-manager";
1112
import { PnpmPackageManager } from "../../lib/pnpm-package-manager";
1213
import { MobileHelper } from "../../lib/common/mobile/mobile-helper";
1314

@@ -29,6 +30,7 @@ function createInjector(data?: { latestFrameworkVersion: string }) {
2930
injector.register("packageManager", PackageManager);
3031
injector.register("npm", NodePackageManager);
3132
injector.register("yarn", YarnPackageManager);
33+
injector.register("yarn2", Yarn2PackageManager);
3234
injector.register("pnpm", PnpmPackageManager);
3335
injector.register("userSettingsService", {
3436
getSettingValue: async (settingName: string): Promise<void> => undefined,

test/package-installation-manager.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as HostInfoLib from "../lib/common/host-info";
66
import * as LoggerLib from "../lib/common/logger/logger";
77
import * as NpmLib from "../lib/node-package-manager";
88
import * as YarnLib from "../lib/yarn-package-manager";
9+
import * as Yarn2Lib from "../lib/yarn2-package-manager";
910
import * as PnpmLib from "../lib/pnpm-package-manager";
1011
import * as PackageManagerLib from "../lib/package-manager";
1112
import * as PackageInstallationManagerLib from "../lib/package-installation-manager";
@@ -46,6 +47,7 @@ function createTestInjector(): IInjector {
4647
});
4748
testInjector.register("npm", NpmLib.NodePackageManager);
4849
testInjector.register("yarn", YarnLib.YarnPackageManager);
50+
testInjector.register("yarn2", Yarn2Lib.Yarn2PackageManager);
4951
testInjector.register("pnpm", PnpmLib.PnpmPackageManager);
5052
testInjector.register("packageManager", PackageManagerLib.PackageManager);
5153
testInjector.register("projectConfigService", ProjectConfigServiceStub);

test/plugins-service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { PackageManager } from "../lib/package-manager";
44
import { PackageInstallationManager } from "../lib/package-installation-manager";
55
import { NodePackageManager } from "../lib/node-package-manager";
66
import { YarnPackageManager } from "../lib/yarn-package-manager";
7+
import { Yarn2PackageManager } from "../lib/yarn2-package-manager";
78
import { PnpmPackageManager } from "../lib/pnpm-package-manager";
89
import { ProjectData } from "../lib/project-data";
910
import { ChildProcess } from "../lib/common/child-process";
@@ -74,6 +75,7 @@ function createTestInjector() {
7475
);
7576
testInjector.register("npm", NodePackageManager);
7677
testInjector.register("yarn", YarnPackageManager);
78+
testInjector.register("yarn2", Yarn2PackageManager);
7779
testInjector.register("pnpm", PnpmPackageManager);
7880
testInjector.register("fs", FileSystem);
7981
// const fileSystemStub = new stubs.FileSystemStub();

test/services/extensibility-service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { assert } from "chai";
55
import { NodePackageManager } from "../../lib/node-package-manager";
66
import { PackageManager } from "../../lib/package-manager";
77
import { YarnPackageManager } from "../../lib/yarn-package-manager";
8+
import { Yarn2PackageManager } from "../../lib/yarn2-package-manager";
89
import { PnpmPackageManager } from "../../lib/pnpm-package-manager";
910
import * as constants from "../../lib/constants";
1011
import { ChildProcess } from "../../lib/common/child-process";
@@ -75,6 +76,7 @@ describe("extensibilityService", () => {
7576
});
7677
testInjector.register("npm", NodePackageManager);
7778
testInjector.register("yarn", YarnPackageManager);
79+
testInjector.register("yarn2", Yarn2PackageManager);
7880
testInjector.register("pnpm", PnpmPackageManager);
7981
testInjector.register("settingsService", SettingsService);
8082
testInjector.register("requireService", {

0 commit comments

Comments
 (0)