Skip to content

Commit c6e8e22

Browse files
committed
Merge branch 'master' of git@github.com:farfromrefug/nativescript-cli.git
2 parents 16b2416 + 52fb336 commit c6e8e22

15 files changed

+11118
-31399
lines changed

lib/base-package-manager.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export abstract class BasePackageManager implements INodePackageManager {
130130
protected getFlagsString(config: any, asArray: boolean): any {
131131
const array: Array<string> = [];
132132
for (const flag in config) {
133-
if (flag === "global" && this.packageManager !== "yarn") {
133+
if (flag === "global" && this.packageManager !== "yarn" && this.packageManager !== "yarn2") {
134134
array.push(`--${flag}`);
135135
array.push(`${config[flag]}`);
136136
} else if (config[flag]) {
@@ -141,7 +141,12 @@ export abstract class BasePackageManager implements INodePackageManager {
141141
flag === "gradle" ||
142142
flag === "version_info"
143143
) {
144-
array.push(` ${flag}`);
144+
if (this.packageManager === "yarn2") {
145+
array.push(`--fields ${flag}`);
146+
} else {
147+
array.push(` ${flag}`);
148+
149+
}
145150
continue;
146151
}
147152
array.push(`--${flag}`);

lib/bootstrap.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ injector.requireCommand("setup|*", "./commands/setup");
222222
injector.requirePublic("packageManager", "./package-manager");
223223
injector.requirePublic("npm", "./node-package-manager");
224224
injector.requirePublic("yarn", "./yarn-package-manager");
225+
injector.requirePublic("yarn2", "./yarn2-package-manager");
225226
injector.requirePublic("pnpm", "./pnpm-package-manager");
226227
injector.requireCommand(
227228
"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
@@ -664,6 +664,7 @@ interface IOptions
664664
frameworkName: string;
665665
frameworkVersion: string;
666666
yarn: string;
667+
yarn2: string;
667668
pnpm: string;
668669
ipa: string;
669670
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 npm info ${packageName} ${flags}`
93+
);
94+
} catch (e) {
95+
this.$errors.fail(e.message);
96+
}
97+
98+
try {
99+
return JSON.parse(viewResult);
100+
} catch (err) {
101+
this.$errors.fail(err.message);
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);

0 commit comments

Comments
 (0)