Skip to content

Commit 86b8405

Browse files
Add configureNightly script.
1 parent b8b4c0f commit 86b8405

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ tests/baselines/reference/projectOutput/*
2525
tests/baselines/local/projectOutput/*
2626
tests/services/baselines/prototyping/local/*
2727
tests/services/browser/typescriptServices.js
28+
scripts/configureNightly.js
2829
scripts/processDiagnosticMessages.d.ts
2930
scripts/processDiagnosticMessages.js
3031
scripts/importDefinitelyTypedTests.js

scripts/configureNightly.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/// <reference path="../src/compiler/sys.ts" />
2+
3+
/**
4+
* A minimal description for a parsed package.json object.
5+
*/
6+
interface PackageJson {
7+
name: string;
8+
version: string;
9+
keywords: string[];
10+
}
11+
12+
function main(): void {
13+
const sys = ts.sys;
14+
if (sys.args.length < 2) {
15+
sys.write("Usage:" + sys.newLine)
16+
sys.write("\tnode configureNightly.js <package.json location> <file containing version>" + sys.newLine);
17+
return;
18+
}
19+
20+
// Acquire the version from the package.json file and modify it appropriately.
21+
const packageJsonFilePath = ts.normalizePath(sys.args[0]);
22+
const packageJsonContents = sys.readFile(packageJsonFilePath);
23+
const packageJsonValue: PackageJson = JSON.parse(packageJsonContents);
24+
25+
const nightlyVersion = getNightlyVersionString(packageJsonValue.version);
26+
27+
// Modify the package.json structure
28+
packageJsonValue.version = nightlyVersion;
29+
30+
if (packageJsonValue.name !== "typescript-nightly") {
31+
packageJsonValue.name = "typescript-nightly";
32+
packageJsonValue.keywords.push("nightly", "alpha", "beta", "prerelease");
33+
}
34+
35+
// Acquire and modify the source file that exposes the version string.
36+
const tsFilePath = ts.normalizePath(sys.args[1]);
37+
const tsFileContents = sys.readFile(tsFilePath);
38+
const versionAssignmentRegExp = /export\s+const\s+version\s+=\s+".*";/;
39+
const modifiedTsFileContents = tsFileContents.replace(versionAssignmentRegExp, `export const version = "${nightlyVersion}";`);
40+
41+
// Ensure we are actually changing something - the user probably wants to know that the update failed.
42+
if (tsFileContents === modifiedTsFileContents) {
43+
throw `File '${tsFilePath}' did not contain pattern ${versionAssignmentRegExp}`;
44+
}
45+
46+
// Finally write the changes to disk.
47+
sys.writeFile(packageJsonFilePath, JSON.stringify(packageJsonValue, /*replacer:*/ undefined, /*space:*/ 4))
48+
sys.writeFile(tsFilePath, modifiedTsFileContents);
49+
}
50+
51+
function getNightlyVersionString(versionString: string): string {
52+
// If the version string already contains "-nightly",
53+
// then get the base string and update based on that.
54+
const dashNightlyPos = versionString.indexOf("-nightly");
55+
if (dashNightlyPos >= 0) {
56+
versionString = versionString.slice(0, dashNightlyPos);
57+
}
58+
59+
// We're going to append a representation of the current time at the end of the current version.
60+
// String.prototype.toISOString() returns a 24-character string formatted as 'YYYY-MM-DDTHH:mm:ss.sssZ',
61+
// but we'd prefer to just use hyphens as separators instead of 'T', ':', and '.'.
62+
// The trailing 'Z' in this string can be removed; UTC time will always be implicit here.
63+
const now = new Date();
64+
const timeStr = now.toISOString().slice(0, -1).replace(/:|T|\./g, "-");
65+
66+
return `${versionString}-nightly-${timeStr}`;
67+
}
68+
69+
main();

0 commit comments

Comments
 (0)