microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
0.13.2

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

gulpfile.js

307lines · modeblame

b8ecee4ddigeff10 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
8ba55f4cJimmy Thomson10 years ago3
74dba829Yuri Skorokhodov7 years ago4const gulp = require("gulp");
5fd423caYuri Skorokhodov7 years ago5const log = require("fancy-log");
6const istanbul = require("gulp-istanbul");
7const isparta = require("isparta");
74dba829Yuri Skorokhodov7 years ago8const sourcemaps = require("gulp-sourcemaps");
9const path = require("path");
10const preprocess = require("gulp-preprocess");
11const ts = require("gulp-typescript");
12const mocha = require("gulp-mocha");
13const GulpExtras = require("./tools/gulp-extras");
14const minimist = require("minimist");
15const os = require("os");
16const fs = require("fs");
17const Q = require("q");
5fd423caYuri Skorokhodov7 years ago18const es = require("event-stream");
19const remapIstanbul = require("remap-istanbul/lib/gulpRemapIstanbul");
20const nls = require("vscode-nls-dev");
f6ac01ceRuslan Bikkinin7 years ago21const libtslint = require("tslint");
22const tslint = require("gulp-tslint");
8ba55f4cJimmy Thomson10 years ago23
74dba829Yuri Skorokhodov7 years ago24const copyright = GulpExtras.checkCopyright;
25const imports = GulpExtras.checkImports;
26const executeCommand = GulpExtras.executeCommand;
27
b6c68212Yuri Skorokhodov7 years ago28const translationProjectName = "vscode-extensions";
29const translationExtensionName = "vscode-react-native";
74dba829Yuri Skorokhodov7 years ago30const defaultLanguages = [
f6ac01ceRuslan Bikkinin7 years ago31{ id: "zh-tw", folderName: "cht", transifexId: "zh-hant" },
32{ id: "zh-cn", folderName: "chs", transifexId: "zh-hans" },
33{ id: "ja", folderName: "jpn" },
34{ id: "ko", folderName: "kor" },
35{ id: "de", folderName: "deu" },
36{ id: "fr", folderName: "fra" },
37{ id: "es", folderName: "esn" },
38{ id: "ru", folderName: "rus" },
5fd423caYuri Skorokhodov7 years ago39{ id: "it", folderName: "ita" },
74dba829Yuri Skorokhodov7 years ago40
41// These language-pack languages are included for VS but excluded from the vscode package
5fd423caYuri Skorokhodov7 years ago42{ id: "cs", folderName: "csy" },
43{ id: "tr", folderName: "trk" },
d5de836bYuri Skorokhodov7 years ago44{ id: "pt-br", folderName: "ptb", transifexId: "pt-BR" },
5fd423caYuri Skorokhodov7 years ago45{ id: "pl", folderName: "plk" }
74dba829Yuri Skorokhodov7 years ago46];
936ae21cmax-mironov8 years ago47
f6ac01ceRuslan Bikkinin7 years ago48const srcPath = "src";
49const testPath = "test";
89973b41dlebu10 years ago50
f6ac01ceRuslan Bikkinin7 years ago51const sources = [srcPath, testPath].map((tsFolder) => tsFolder + "/**/*.ts");
8ba55f4cJimmy Thomson10 years ago52
f6ac01ceRuslan Bikkinin7 years ago53const knownOptions = {
62b110e3Dmitry Zinovyev9 years ago54string: "env",
55default: { env: "production" }
572cd3badigeff10 years ago56};
57
f6ac01ceRuslan Bikkinin7 years ago58const options = minimist(process.argv.slice(2), knownOptions);
3aa3017bDmitry Zinovyev9 years ago59
f6ac01ceRuslan Bikkinin7 years ago60let lintSources = [srcPath, testPath].map((tsFolder) => tsFolder + "/**/*.ts");
61lintSources = lintSources.concat([
62"!src/typings/**",
f2568005Ruslan Bikkinin7 years ago63"!test/resources/sampleReactNative022Project/**",
64"!test/smoke/**",
65"!/SmokeTestLogs/**"
f6ac01ceRuslan Bikkinin7 years ago66]);
5fd423caYuri Skorokhodov7 years ago67
68function build(failOnError, buildNls) {
f6ac01ceRuslan Bikkinin7 years ago69const tsProject = ts.createProject("tsconfig.json");
70const isProd = options.env === "production";
71const preprocessorContext = isProd ? { PROD: true } : { DEBUG: true };
74dba829Yuri Skorokhodov7 years ago72let gotError = false;
572cd3badigeff10 years ago73log(`Building with preprocessor context: ${JSON.stringify(preprocessorContext)}`);
f6ac01ceRuslan Bikkinin7 years ago74const tsResult = tsProject.src()
9c1d0f41digeff10 years ago75.pipe(preprocess({ context: preprocessorContext })) //To set environment variables in-line
8ba55f4cJimmy Thomson10 years ago76.pipe(sourcemaps.init())
5fd423caYuri Skorokhodov7 years ago77.pipe(tsProject());
74dba829Yuri Skorokhodov7 years ago78
f6ac01ceRuslan Bikkinin7 years ago79return tsResult.js
74dba829Yuri Skorokhodov7 years ago80.pipe(buildNls ? nls.rewriteLocalizeCalls() : es.through())
5fd423caYuri Skorokhodov7 years ago81.pipe(buildNls ? nls.createAdditionalLanguageFiles(defaultLanguages, "i18n", ".") : es.through())
1287ea58Yuri Skorokhodov7 years ago82.pipe(buildNls ? nls.bundleMetaDataFiles("msjsdiag.vscode-react-native", ".") : es.through())
f6ac01ceRuslan Bikkinin7 years ago83.pipe(buildNls ? nls.bundleLanguageFiles() : es.through())
5fd423caYuri Skorokhodov7 years ago84.pipe(sourcemaps.write(".", { includeContent: false, sourceRoot: "." }))
f6ac01ceRuslan Bikkinin7 years ago85.pipe(gulp.dest((file) => file.cwd))
5fd423caYuri Skorokhodov7 years ago86.once("error", () => {
74dba829Yuri Skorokhodov7 years ago87gotError = true;
88})
5fd423caYuri Skorokhodov7 years ago89.once("finish", () => {
74dba829Yuri Skorokhodov7 years ago90if (failOnError && gotError) {
91process.exit(1);
92}
93});
3aa3017bDmitry Zinovyev9 years ago94}
8ba55f4cJimmy Thomson10 years ago95
f6ac01ceRuslan Bikkinin7 years ago96function test() {
97// Check if arguments were passed
98if (options.pattern) {
99log(`\nTesting cases that match pattern: ${options.pattern}`);
100} else {
e586af40Yuri Skorokhodov7 years ago101log("\nTesting cases that don't match pattern: extensionContext|localizationContext");
f6ac01ceRuslan Bikkinin7 years ago102}
103
e586af40Yuri Skorokhodov7 years ago104const testResultsPath = path.join(__dirname, "test", "DebuggerTests.xml");
105process.env.MOCHA_FILE = testResultsPath;
f6ac01ceRuslan Bikkinin7 years ago106return gulp.src(["test/**/*.test.js", "!test/extension/**"])
107.pipe(mocha({
108ui: "tdd",
109useColors: true,
110invert: !options.pattern,
e586af40Yuri Skorokhodov7 years ago111grep: options.pattern || "(extensionContext|localizationContext)",
112reporter: "mocha-multi-reporters",
113reporterOptions: {
114configFile: path.resolve("test/mochaReporterConfig.json"),
115},
f6ac01ceRuslan Bikkinin7 years ago116}));
117}
118
119gulp.task("check-imports", () => {
120const tsProject = ts.createProject("tsconfig.json");
121return tsProject.src()
122.pipe(imports());
123});
124
125gulp.task("check-copyright", () => {
126return gulp.src([
127"**/*.ts",
128"**/*.js",
129"!**/*.d.ts",
130"!coverage/**",
131"!node_modules/**",
132"!test/**/*.js",
133"!SampleApplication/**",
f2568005Ruslan Bikkinin7 years ago134"!test/resources/sampleReactNative022Project/**/*.js",
135"!test/smoke/node_modules/**",
136"!test/smoke/resources/**"
f6ac01ceRuslan Bikkinin7 years ago137])
138.pipe(copyright());
139});
140
141gulp.task("tslint", () => {
142const program = libtslint.Linter.createProgram("./tsconfig.json");
fc602bb6Yuri Skorokhodov7 years ago143return gulp.src(lintSources, { base: "." })
144.pipe(tslint({
145formatter: "verbose",
146program: program
147}))
148.pipe(tslint.report());
149});
150
5fd423caYuri Skorokhodov7 years ago151// TODO: The file property should point to the generated source (this implementation adds an extra folder to the path)
152// We should also make sure that we always generate urls in all the path properties (We shouldn"t have \\s. This seems to
153// be an issue on Windows platforms)
f6ac01ceRuslan Bikkinin7 years ago154gulp.task("build", gulp.series("check-imports", "check-copyright", "tslint", function runBuild(done) {
e416b901Yuri Skorokhodov7 years ago155build(true, true)
f6ac01ceRuslan Bikkinin7 years ago156.once("finish", () => {
157done();
158});
5fd423caYuri Skorokhodov7 years ago159}));
160
f6ac01ceRuslan Bikkinin7 years ago161gulp.task("build-dev", gulp.series("check-imports", "check-copyright", function runBuild(done) {
e416b901Yuri Skorokhodov7 years ago162build(false, false)
f6ac01ceRuslan Bikkinin7 years ago163.once("finish", () => {
164done();
165});
5fd423caYuri Skorokhodov7 years ago166}));
167
fc602bb6Yuri Skorokhodov7 years ago168gulp.task("quick-build", gulp.series("build-dev"));
5fd423caYuri Skorokhodov7 years ago169
f6ac01ceRuslan Bikkinin7 years ago170gulp.task("watch", gulp.series("build", function runWatch() {
62b110e3Dmitry Zinovyev9 years ago171log("Watching build sources...");
5fd423caYuri Skorokhodov7 years ago172return gulp.watch(sources, gulp.series("build"));
173}));
8ba55f4cJimmy Thomson10 years ago174
f6ac01ceRuslan Bikkinin7 years ago175gulp.task("clean", () => {
176const del = require("del");
177const pathsToDelete = [
5fd423caYuri Skorokhodov7 years ago178"src/**/*.js",
179"src/**/*.js.map",
180"test/**/*.js",
181"test/**/*.js.map",
182"out/",
183"!test/resources/sampleReactNative022Project/**/*.js",
184".vscode-test/",
fc602bb6Yuri Skorokhodov7 years ago185"nls.*.json",
49798d4dRedMickey6 years ago186"!test/smoke/**/*.js",
187"!test/smoke/**/*.js.map",
5fd423caYuri Skorokhodov7 years ago188]
189return del(pathsToDelete, { force: true });
3fb37ad5unknown10 years ago190});
8ba55f4cJimmy Thomson10 years ago191
fc602bb6Yuri Skorokhodov7 years ago192gulp.task("default", gulp.series("clean", "build"));
5fd423caYuri Skorokhodov7 years ago193
194gulp.task("test", gulp.series("build", "tslint", test));
28d84585Vladimir Kotikov8 years ago195
f6ac01ceRuslan Bikkinin7 years ago196gulp.task("coverage:instrument", () => {
0a283547Anna Kocheshkova8 years ago197return gulp.src(["src/**/*.js", "!test/**"])
28d84585Vladimir Kotikov8 years ago198.pipe(istanbul({
199// Use the isparta instrumenter (code coverage for ES6)
200instrumenter: isparta.Instrumenter,
201includeUntested: true
202}))
203// Force `require` to return covered files
204.pipe(istanbul.hookRequire());
205});
206
f6ac01ceRuslan Bikkinin7 years ago207gulp.task("coverage:report", () => {
28d84585Vladimir Kotikov8 years ago208return gulp.src(
0a283547Anna Kocheshkova8 years ago209["src/**/*.js", "!test/**"],
28d84585Vladimir Kotikov8 years ago210{ read: false }
211)
f6ac01ceRuslan Bikkinin7 years ago212.pipe(istanbul.writeReports({
213reporters: ["json", "text-summary"]
214}));
28d84585Vladimir Kotikov8 years ago215});
216
f6ac01ceRuslan Bikkinin7 years ago217gulp.task("coverage:remap", () => {
5fd423caYuri Skorokhodov7 years ago218return gulp.src("coverage/coverage-final.json")
28d84585Vladimir Kotikov8 years ago219.pipe(remapIstanbul({
220reports: {
5fd423caYuri Skorokhodov7 years ago221"json": "coverage/coverage.json",
222"html": "coverage/html-report"
28d84585Vladimir Kotikov8 years ago223}
224}));
225});
226
62b110e3Dmitry Zinovyev9 years ago227gulp.task("test-no-build", test);
8ba55f4cJimmy Thomson10 years ago228
5fd423caYuri Skorokhodov7 years ago229gulp.task("test:coverage", gulp.series("quick-build", "coverage:instrument", "test-no-build", "coverage:report", "coverage:remap"));
89973b41dlebu10 years ago230
f6ac01ceRuslan Bikkinin7 years ago231gulp.task("watch-build-test", gulp.series("build", "test", function runWatch() {
5fd423caYuri Skorokhodov7 years ago232return gulp.watch(sources, gulp.series("build", "test"));
233}));
7212311dDaniel Lebu10 years ago234
f6ac01ceRuslan Bikkinin7 years ago235gulp.task("package", (callback) => {
236const command = path.join(__dirname, "node_modules", ".bin", "vsce");
237const args = ["package"];
7212311dDaniel Lebu10 years ago238executeCommand(command, args, callback);
92f13422Jimmy Thomson9 years ago239});
240
f6ac01ceRuslan Bikkinin7 years ago241gulp.task("release", gulp.series("build", function prepareLicenses() {
242const licenseFiles = ["LICENSE.txt", "ThirdPartyNotices.txt"];
243const backupFolder = path.resolve(path.join(os.tmpdir(), "vscode-react-native"));
92f13422Jimmy Thomson9 years ago244if (!fs.existsSync(backupFolder)) {
245fs.mkdirSync(backupFolder);
246}
247
248return Q({})
f6ac01ceRuslan Bikkinin7 years ago249.then(() => {
92f13422Jimmy Thomson9 years ago250/* back up LICENSE.txt, ThirdPartyNotices.txt, README.md */
f6ac01ceRuslan Bikkinin7 years ago251log("Backing up license files to " + backupFolder + "...");
252licenseFiles.forEach((fileName) => {
92f13422Jimmy Thomson9 years ago253fs.writeFileSync(path.join(backupFolder, fileName), fs.readFileSync(fileName));
254});
255
256/* copy over the release package license files */
f6ac01ceRuslan Bikkinin7 years ago257log("Preparing license files for release...");
62b110e3Dmitry Zinovyev9 years ago258fs.writeFileSync("LICENSE.txt", fs.readFileSync("release/LICENSE.txt"));
259fs.writeFileSync("ThirdPartyNotices.txt", fs.readFileSync("release/ThirdPartyNotices.txt"));
3aa3017bDmitry Zinovyev9 years ago260}).then(() => {
f6ac01ceRuslan Bikkinin7 years ago261log("Creating release package...");
92f13422Jimmy Thomson9 years ago262var deferred = Q.defer();
263// NOTE: vsce must see npm 3.X otherwise it will not correctly strip out dev dependencies.
f6ac01ceRuslan Bikkinin7 years ago264executeCommand("vsce", ["package"], (arg) => { if (arg) { deferred.reject(arg); } deferred.resolve() }, { cwd: path.resolve(__dirname) });
92f13422Jimmy Thomson9 years ago265return deferred.promise;
f6ac01ceRuslan Bikkinin7 years ago266}).finally(() => {
92f13422Jimmy Thomson9 years ago267/* restore backed up files */
f6ac01ceRuslan Bikkinin7 years ago268log("Restoring modified files...");
269licenseFiles.forEach((fileName) => {
92f13422Jimmy Thomson9 years ago270fs.writeFileSync(path.join(__dirname, fileName), fs.readFileSync(path.join(backupFolder, fileName)));
271});
272});
5fd423caYuri Skorokhodov7 years ago273}));
74dba829Yuri Skorokhodov7 years ago274
fc602bb6Yuri Skorokhodov7 years ago275// Creates package.i18n.json files for all languages from {workspaceRoot}/i18n folder into project root
f6ac01ceRuslan Bikkinin7 years ago276gulp.task("add-i18n", () => {
5fd423caYuri Skorokhodov7 years ago277return gulp.src(["package.nls.json"])
278.pipe(nls.createAdditionalLanguageFiles(defaultLanguages, "i18n"))
f6ac01ceRuslan Bikkinin7 years ago279.pipe(gulp.dest("."))
74dba829Yuri Skorokhodov7 years ago280});
281
b6c68212Yuri Skorokhodov7 years ago282// Creates MLCP readable .xliff file and saves it locally
283gulp.task("translations-export", gulp.series("build", function runTranslationExport() {
f6ac01ceRuslan Bikkinin7 years ago284return gulp.src(["package.nls.json", "nls.metadata.header.json", "nls.metadata.json"])
b6c68212Yuri Skorokhodov7 years ago285.pipe(nls.createXlfFiles(translationProjectName, translationExtensionName))
286.pipe(gulp.dest(path.join("..", `${translationProjectName}-localization-export`)));
5fd423caYuri Skorokhodov7 years ago287}));
74dba829Yuri Skorokhodov7 years ago288
b6c68212Yuri Skorokhodov7 years ago289// Imports localization from raw localized MLCP strings to VS Code .i18n.json files
290gulp.task("translations-import", (done) => {
291var options = minimist(process.argv.slice(2), {
292string: "location",
293default: {
294location: "../vscode-translations-import"
295}
296});
f6ac01ceRuslan Bikkinin7 years ago297es.merge(defaultLanguages.map((language) => {
b6c68212Yuri Skorokhodov7 years ago298let id = language.transifexId || language.id;
299log(path.join(options.location, id, 'vscode-extensions', `${translationExtensionName}.xlf`));
300return gulp.src(path.join(options.location, id, 'vscode-extensions', `${translationExtensionName}.xlf`))
74dba829Yuri Skorokhodov7 years ago301.pipe(nls.prepareJsonFiles())
b6c68212Yuri Skorokhodov7 years ago302.pipe(gulp.dest(path.join("./i18n", language.folderName)));
4dbbdaadYuri Skorokhodov7 years ago303}))
f6ac01ceRuslan Bikkinin7 years ago304.pipe(es.wait(() => {
305done();
306}));
74dba829Yuri Skorokhodov7 years ago307});