@proteinjs/build 1.3.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +20 -0
- package/.prettierignore +4 -0
- package/.prettierrc +8 -0
- package/CHANGELOG.md +32 -180
- package/dist/src/Github.d.ts.map +1 -1
- package/dist/src/Github.js +8 -4
- package/dist/src/Github.js.map +1 -1
- package/dist/src/bin/runBuildWorkspace.js.map +1 -1
- package/dist/src/bin/runCleanWorkspace.js.map +1 -1
- package/dist/src/bin/runLintWorkspace.d.ts +3 -0
- package/dist/src/bin/runLintWorkspace.d.ts.map +1 -0
- package/dist/src/bin/runLintWorkspace.js +6 -0
- package/dist/src/bin/runLintWorkspace.js.map +1 -0
- package/dist/src/bin/runSymlinkWorkspace.js.map +1 -1
- package/dist/src/bin/runTestWorkspace.js.map +1 -1
- package/dist/src/bin/runVersionWorkspace.js.map +1 -1
- package/dist/src/bin/runWatchWorkspace.js.map +1 -1
- package/dist/src/bin/runWorkspaceCommand.js.map +1 -1
- package/dist/src/bin/runWorkspacePackageCommand.js.map +1 -1
- package/dist/src/buildWorkspace.d.ts +1 -0
- package/dist/src/buildWorkspace.d.ts.map +1 -1
- package/dist/src/buildWorkspace.js +27 -9
- package/dist/src/buildWorkspace.js.map +1 -1
- package/dist/src/cleanWorkspace.d.ts.map +1 -1
- package/dist/src/cleanWorkspace.js.map +1 -1
- package/dist/src/lintWorkspace.d.ts +11 -0
- package/dist/src/lintWorkspace.d.ts.map +1 -0
- package/dist/src/lintWorkspace.js +171 -0
- package/dist/src/lintWorkspace.js.map +1 -0
- package/dist/src/symlinkWorkspace.d.ts.map +1 -1
- package/dist/src/symlinkWorkspace.js +2 -1
- package/dist/src/symlinkWorkspace.js.map +1 -1
- package/dist/src/testWorkspace.d.ts.map +1 -1
- package/dist/src/testWorkspace.js +2 -1
- package/dist/src/testWorkspace.js.map +1 -1
- package/dist/src/versionWorkspace.d.ts.map +1 -1
- package/dist/src/versionWorkspace.js +59 -31
- package/dist/src/versionWorkspace.js.map +1 -1
- package/dist/src/watchWorkspace.d.ts.map +1 -1
- package/dist/src/watchWorkspace.js +15 -8
- package/dist/src/watchWorkspace.js.map +1 -1
- package/dist/src/workspaceCommand.d.ts.map +1 -1
- package/dist/src/workspaceCommand.js +4 -3
- package/dist/src/workspaceCommand.js.map +1 -1
- package/dist/src/workspacePackageCommand.d.ts.map +1 -1
- package/dist/src/workspacePackageCommand.js +2 -1
- package/dist/src/workspacePackageCommand.js.map +1 -1
- package/jest.config.js +8 -17
- package/package.json +9 -3
- package/src/Github.ts +30 -27
- package/src/bin/runBuildWorkspace.ts +2 -2
- package/src/bin/runCleanWorkspace.ts +2 -2
- package/src/bin/runLintWorkspace.ts +5 -0
- package/src/bin/runSymlinkWorkspace.ts +2 -2
- package/src/bin/runTestWorkspace.ts +2 -2
- package/src/bin/runVersionWorkspace.ts +2 -2
- package/src/bin/runWatchWorkspace.ts +2 -2
- package/src/bin/runWorkspaceCommand.ts +2 -2
- package/src/bin/runWorkspacePackageCommand.ts +2 -2
- package/src/buildWorkspace.ts +38 -21
- package/src/cleanWorkspace.ts +17 -9
- package/src/lintWorkspace.ts +105 -0
- package/src/logColors.ts +1 -1
- package/src/symlinkWorkspace.ts +23 -16
- package/src/testWorkspace.ts +19 -10
- package/src/versionWorkspace.ts +173 -79
- package/src/watchWorkspace.ts +41 -24
- package/src/workspaceCommand.ts +26 -20
- package/src/workspacePackageCommand.ts +16 -11
- package/tsconfig.json +18 -22
- package/webpack.config.js +12 -12
package/src/versionWorkspace.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import * as path from 'path'
|
|
2
|
-
import { exec } from 'child_process'
|
|
3
|
-
import { LocalPackage, LocalPackageMap, PackageUtil, cmd, Fs, LogColorWrapper } from '@proteinjs/util-node'
|
|
4
|
-
import { Logger } from '@proteinjs/util'
|
|
5
|
-
import semver from 'semver'
|
|
6
|
-
import { Commit } from './Github'
|
|
7
|
-
import { primaryLogColor, secondaryLogColor } from './logColors'
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { exec } from 'child_process';
|
|
3
|
+
import { LocalPackage, LocalPackageMap, PackageUtil, cmd, Fs, LogColorWrapper } from '@proteinjs/util-node';
|
|
4
|
+
import { Logger } from '@proteinjs/util';
|
|
5
|
+
import semver from 'semver';
|
|
6
|
+
import { Commit } from './Github';
|
|
7
|
+
import { primaryLogColor, secondaryLogColor } from './logColors';
|
|
8
8
|
|
|
9
9
|
const cw = new LogColorWrapper();
|
|
10
10
|
const logger = new Logger(cw.color('workspace:', primaryLogColor) + cw.color('version', secondaryLogColor));
|
|
11
|
-
const fixedVersionWorkspacesToVersion: {[workspacePath: string]: boolean} = {};
|
|
11
|
+
const fixedVersionWorkspacesToVersion: { [workspacePath: string]: boolean } = {};
|
|
12
12
|
|
|
13
13
|
export async function versionWorkspace() {
|
|
14
14
|
// fail fast if npm token is not available
|
|
@@ -16,33 +16,41 @@ export async function versionWorkspace() {
|
|
|
16
16
|
|
|
17
17
|
const workspacePath = process.cwd();
|
|
18
18
|
await pullWorkspace(workspacePath);
|
|
19
|
-
const { packageMap, packageGraph, sortedPackageNames, workspaceToPackageMap } =
|
|
19
|
+
const { packageMap, packageGraph, sortedPackageNames, workspaceToPackageMap } =
|
|
20
|
+
await PackageUtil.getWorkspaceMetadata(workspacePath);
|
|
20
21
|
const skippedPackages = ['root', 'typescript-parser'];
|
|
21
|
-
const filteredPackageNames = sortedPackageNames.filter(packageName => {
|
|
22
|
+
const filteredPackageNames = sortedPackageNames.filter((packageName) => {
|
|
22
23
|
const localPackage = packageMap[packageName];
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
&&
|
|
26
|
-
|
|
24
|
+
return (
|
|
25
|
+
!!localPackage.packageJson.scripts?.clean &&
|
|
26
|
+
!!localPackage.packageJson.scripts?.build &&
|
|
27
|
+
!skippedPackages.includes(packageName)
|
|
28
|
+
);
|
|
27
29
|
});
|
|
28
30
|
|
|
29
31
|
logger.info(`> Versioning workspace (${workspacePath})`);
|
|
30
|
-
for (
|
|
32
|
+
for (const packageName of filteredPackageNames) {
|
|
31
33
|
const localPackage = packageMap[packageName];
|
|
32
34
|
const dependenciesChanged = await bumpDependencies(localPackage, packageMap, packageGraph);
|
|
33
|
-
if (!dependenciesChanged)
|
|
35
|
+
if (!dependenciesChanged) {
|
|
34
36
|
continue;
|
|
37
|
+
}
|
|
35
38
|
|
|
36
39
|
await buildAndTest(localPackage);
|
|
37
|
-
if (
|
|
40
|
+
if (
|
|
41
|
+
localPackage.workspace &&
|
|
42
|
+
localPackage.workspace.lernaJson &&
|
|
43
|
+
localPackage.workspace.lernaJson.version !== 'independent'
|
|
44
|
+
) {
|
|
38
45
|
fixedVersionWorkspacesToVersion[localPackage.workspace.path] = true;
|
|
39
46
|
logger.info(`(${cw.color(packageName)}) skipping version push for package in a fixed-version workspace`);
|
|
40
47
|
continue;
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
await pushAndTag(localPackage);
|
|
44
|
-
if (!localPackage.packageJson.private && localPackage.packageJson.publishConfig?.access === 'public')
|
|
51
|
+
if (!localPackage.packageJson.private && localPackage.packageJson.publishConfig?.access === 'public') {
|
|
45
52
|
await publish(localPackage);
|
|
53
|
+
}
|
|
46
54
|
}
|
|
47
55
|
|
|
48
56
|
await syncFixedVersionWorkspaces(Object.keys(fixedVersionWorkspacesToVersion), packageMap, workspaceToPackageMap);
|
|
@@ -53,16 +61,17 @@ export async function versionWorkspace() {
|
|
|
53
61
|
|
|
54
62
|
async function pullWorkspace(workspacePath: string) {
|
|
55
63
|
const { packageMap, sortedPackageNames } = await PackageUtil.getWorkspaceMetadata(workspacePath);
|
|
56
|
-
const filteredPackageNames = sortedPackageNames.filter(packageName => {
|
|
64
|
+
const filteredPackageNames = sortedPackageNames.filter((packageName) => {
|
|
57
65
|
const localPackage = packageMap[packageName];
|
|
58
|
-
return
|
|
59
|
-
|
|
60
|
-
&&
|
|
61
|
-
|
|
66
|
+
return (
|
|
67
|
+
!!localPackage.packageJson.scripts?.clean &&
|
|
68
|
+
!!localPackage.packageJson.scripts?.build &&
|
|
69
|
+
packageName != 'typescript-parser'
|
|
70
|
+
);
|
|
62
71
|
});
|
|
63
72
|
|
|
64
73
|
logger.info(`> Pulling workspace (${workspacePath})`);
|
|
65
|
-
for (
|
|
74
|
+
for (const packageName of filteredPackageNames) {
|
|
66
75
|
const localPackage = packageMap[packageName];
|
|
67
76
|
await pull(localPackage);
|
|
68
77
|
}
|
|
@@ -72,24 +81,33 @@ async function pullWorkspace(workspacePath: string) {
|
|
|
72
81
|
|
|
73
82
|
async function bumpDependencies(localPackage: LocalPackage, packageMap: LocalPackageMap, packageGraph: any) {
|
|
74
83
|
const localDependencies = packageGraph.successors(localPackage.name);
|
|
75
|
-
if (!localDependencies || localDependencies.length == 0)
|
|
84
|
+
if (!localDependencies || localDependencies.length == 0) {
|
|
76
85
|
return false;
|
|
86
|
+
}
|
|
77
87
|
|
|
78
88
|
let dependenciesChanged = false;
|
|
79
|
-
for (
|
|
89
|
+
for (const localDependency of localDependencies) {
|
|
80
90
|
const localDependencyPackage = packageMap[localDependency];
|
|
81
91
|
const localDependencyVersion = localDependencyPackage.packageJson.version as string;
|
|
82
92
|
const currentDependencyVersion = getDependencyVersion(localDependency, localPackage);
|
|
83
|
-
if (!currentDependencyVersion)
|
|
84
|
-
throw new Error(
|
|
93
|
+
if (!currentDependencyVersion) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Package (${cw.color(localPackage.name)}) has dependency on ${localDependency}, but cannot find version in ${cw.color(localPackage.name)}'s package.json`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
85
98
|
|
|
86
|
-
if (currentDependencyVersion.isLocalPath)
|
|
99
|
+
if (currentDependencyVersion.isLocalPath) {
|
|
87
100
|
continue;
|
|
101
|
+
}
|
|
88
102
|
|
|
89
|
-
if (currentDependencyVersion?.version == localDependencyVersion)
|
|
103
|
+
if (currentDependencyVersion?.version == localDependencyVersion) {
|
|
90
104
|
continue;
|
|
105
|
+
}
|
|
91
106
|
|
|
92
|
-
const newDependencyVersion: DependencyVersion = {
|
|
107
|
+
const newDependencyVersion: DependencyVersion = {
|
|
108
|
+
prefix: currentDependencyVersion.prefix,
|
|
109
|
+
version: localDependencyVersion,
|
|
110
|
+
};
|
|
93
111
|
setDependencyVersion(localDependency, currentDependencyVersion, newDependencyVersion, localPackage);
|
|
94
112
|
dependenciesChanged = true;
|
|
95
113
|
}
|
|
@@ -97,57 +115,85 @@ async function bumpDependencies(localPackage: LocalPackage, packageMap: LocalPac
|
|
|
97
115
|
if (dependenciesChanged) {
|
|
98
116
|
const currentVersion = localPackage.packageJson.version;
|
|
99
117
|
localPackage.packageJson.version = semver.inc(currentVersion, 'patch');
|
|
100
|
-
logger.info(
|
|
118
|
+
logger.info(
|
|
119
|
+
`(${cw.color(localPackage.name)}) bumping version from ${currentVersion} -> ${localPackage.packageJson.version}`
|
|
120
|
+
);
|
|
101
121
|
await Fs.writeFiles([{ path: localPackage.filePath, content: JSON.stringify(localPackage.packageJson, null, 2) }]);
|
|
102
122
|
}
|
|
103
123
|
|
|
104
124
|
return dependenciesChanged;
|
|
105
125
|
}
|
|
106
126
|
|
|
107
|
-
type DependencyVersion = { prefix?: string
|
|
108
|
-
|
|
109
|
-
function getDependencyVersion(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
127
|
+
type DependencyVersion = { prefix?: string; version: string; isLocalPath?: boolean };
|
|
128
|
+
|
|
129
|
+
function getDependencyVersion(
|
|
130
|
+
dependencyPackageName: string,
|
|
131
|
+
localPackage: LocalPackage
|
|
132
|
+
): DependencyVersion | undefined {
|
|
133
|
+
let currentRawDependencyVersion = localPackage.packageJson.dependencies
|
|
134
|
+
? localPackage.packageJson.dependencies[dependencyPackageName]
|
|
135
|
+
: undefined;
|
|
136
|
+
if (!currentRawDependencyVersion) {
|
|
137
|
+
currentRawDependencyVersion = localPackage.packageJson.devDependencies
|
|
138
|
+
? localPackage.packageJson.devDependencies[dependencyPackageName]
|
|
139
|
+
: undefined;
|
|
140
|
+
}
|
|
113
141
|
|
|
114
|
-
if (!currentRawDependencyVersion)
|
|
142
|
+
if (!currentRawDependencyVersion) {
|
|
115
143
|
return undefined;
|
|
144
|
+
}
|
|
116
145
|
|
|
117
|
-
if (currentRawDependencyVersion.startsWith('file:') || currentRawDependencyVersion.startsWith('.'))
|
|
146
|
+
if (currentRawDependencyVersion.startsWith('file:') || currentRawDependencyVersion.startsWith('.')) {
|
|
118
147
|
return { version: currentRawDependencyVersion, isLocalPath: true };
|
|
148
|
+
}
|
|
119
149
|
|
|
120
150
|
const match = currentRawDependencyVersion.match(/^([~^]?)(\d+\.\d+\.\d+)/);
|
|
121
151
|
return { prefix: match[1], version: match[2] };
|
|
122
152
|
}
|
|
123
153
|
|
|
124
|
-
function setDependencyVersion(
|
|
154
|
+
function setDependencyVersion(
|
|
155
|
+
dependencyPackageName: string,
|
|
156
|
+
currentVersion: DependencyVersion,
|
|
157
|
+
newVersion: DependencyVersion,
|
|
158
|
+
localPackage: LocalPackage
|
|
159
|
+
) {
|
|
125
160
|
const newRawVersion = newVersion.prefix ? newVersion.prefix + newVersion.version : newVersion.version;
|
|
126
|
-
if (localPackage.packageJson.dependencies && localPackage.packageJson.dependencies[dependencyPackageName])
|
|
161
|
+
if (localPackage.packageJson.dependencies && localPackage.packageJson.dependencies[dependencyPackageName]) {
|
|
127
162
|
localPackage.packageJson.dependencies[dependencyPackageName] = newRawVersion;
|
|
128
|
-
else
|
|
163
|
+
} else {
|
|
129
164
|
localPackage.packageJson.devDependencies[dependencyPackageName] = newRawVersion;
|
|
165
|
+
}
|
|
130
166
|
|
|
131
|
-
const currentRawVersion = currentVersion.prefix
|
|
132
|
-
|
|
167
|
+
const currentRawVersion = currentVersion.prefix
|
|
168
|
+
? currentVersion.prefix + currentVersion.version
|
|
169
|
+
: currentVersion.version;
|
|
170
|
+
logger.info(
|
|
171
|
+
`(${cw.color(localPackage.name)}) updating dependency version of ${cw.color(dependencyPackageName)} (${currentRawVersion} -> ${newRawVersion})`
|
|
172
|
+
);
|
|
133
173
|
}
|
|
134
174
|
|
|
135
|
-
async function syncFixedVersionWorkspaces(
|
|
136
|
-
|
|
175
|
+
async function syncFixedVersionWorkspaces(
|
|
176
|
+
fixedVersionWorkspacePaths: string[],
|
|
177
|
+
packageMap: LocalPackageMap,
|
|
178
|
+
workspaceToPackageMap: { [workspacePath: string]: string[] }
|
|
179
|
+
) {
|
|
180
|
+
if (fixedVersionWorkspacePaths.length == 0) {
|
|
137
181
|
return;
|
|
182
|
+
}
|
|
138
183
|
|
|
139
184
|
logger.info(`> Syncing fixed-version workspaces`);
|
|
140
|
-
for (
|
|
185
|
+
for (const workspacePath of fixedVersionWorkspacePaths) {
|
|
141
186
|
const workspacePackages = workspaceToPackageMap[workspacePath]
|
|
142
|
-
.filter(packageName => packageName != 'typescript-parser')
|
|
143
|
-
.map(packageName => packageMap[packageName])
|
|
144
|
-
|
|
145
|
-
if (workspacePackages.length == 0)
|
|
187
|
+
.filter((packageName) => packageName != 'typescript-parser')
|
|
188
|
+
.map((packageName) => packageMap[packageName]);
|
|
189
|
+
if (workspacePackages.length == 0) {
|
|
146
190
|
continue;
|
|
191
|
+
}
|
|
147
192
|
|
|
148
193
|
const syncedVersion = await syncFixedVersions(workspacePath, workspacePackages);
|
|
149
|
-
if (!syncedVersion)
|
|
194
|
+
if (!syncedVersion) {
|
|
150
195
|
continue;
|
|
196
|
+
}
|
|
151
197
|
|
|
152
198
|
await pushAndTagFixedVersionRepo(workspacePath, syncedVersion);
|
|
153
199
|
}
|
|
@@ -155,37 +201,43 @@ async function syncFixedVersionWorkspaces(fixedVersionWorkspacePaths: string[],
|
|
|
155
201
|
logger.info(`> Synced fixed-version workspaces`);
|
|
156
202
|
}
|
|
157
203
|
|
|
158
|
-
async function syncFixedVersions(workspacePath: string, localPackages: LocalPackage[]): Promise<string|false> {
|
|
159
|
-
let highestVersion: string|undefined;
|
|
160
|
-
for (
|
|
204
|
+
async function syncFixedVersions(workspacePath: string, localPackages: LocalPackage[]): Promise<string | false> {
|
|
205
|
+
let highestVersion: string | undefined;
|
|
206
|
+
for (const localPackage of localPackages) {
|
|
161
207
|
if (!highestVersion) {
|
|
162
208
|
highestVersion = localPackage.packageJson.version;
|
|
163
209
|
continue;
|
|
164
210
|
}
|
|
165
211
|
|
|
166
|
-
if (semver.gt(localPackage.packageJson.version, highestVersion))
|
|
212
|
+
if (semver.gt(localPackage.packageJson.version, highestVersion)) {
|
|
167
213
|
highestVersion = localPackage.packageJson.version;
|
|
214
|
+
}
|
|
168
215
|
}
|
|
169
216
|
|
|
170
|
-
if (!highestVersion)
|
|
217
|
+
if (!highestVersion) {
|
|
171
218
|
throw new Error(`Unable to find version for packages`);
|
|
219
|
+
}
|
|
172
220
|
|
|
173
221
|
let syncedFixedVersions = false;
|
|
174
|
-
for (
|
|
222
|
+
for (const localPackage of localPackages) {
|
|
175
223
|
const currentVersion = localPackage.packageJson.version;
|
|
176
|
-
if (currentVersion === highestVersion)
|
|
224
|
+
if (currentVersion === highestVersion) {
|
|
177
225
|
continue;
|
|
226
|
+
}
|
|
178
227
|
|
|
179
228
|
localPackage.packageJson.version = highestVersion;
|
|
180
|
-
logger.info(
|
|
229
|
+
logger.info(
|
|
230
|
+
`(${cw.color(localPackage.name)}) bumping version from ${currentVersion} -> ${localPackage.packageJson.version}`
|
|
231
|
+
);
|
|
181
232
|
await Fs.writeFiles([{ path: localPackage.filePath, content: JSON.stringify(localPackage.packageJson, null, 2) }]);
|
|
182
233
|
syncedFixedVersions = true;
|
|
183
234
|
}
|
|
184
235
|
|
|
185
236
|
if (syncedFixedVersions) {
|
|
186
237
|
const lernaJson = localPackages[0].workspace?.lernaJson;
|
|
187
|
-
if (!lernaJson)
|
|
238
|
+
if (!lernaJson) {
|
|
188
239
|
throw new Error(`Cannot find lerna.json for workspace: ${workspacePath}`);
|
|
240
|
+
}
|
|
189
241
|
|
|
190
242
|
const lernaJsonPath = path.join(workspacePath, 'lerna.json');
|
|
191
243
|
lernaJson.version = highestVersion;
|
|
@@ -224,7 +276,12 @@ async function pushAndTag(localPackage: LocalPackage): Promise<Commit> {
|
|
|
224
276
|
const packageDir = path.dirname(localPackage.filePath);
|
|
225
277
|
logger.info(`(${cw.color(localPackage.name)}) pushing latest version (${localPackage.packageJson.version})`);
|
|
226
278
|
await cmd('git', ['add', '.'], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
|
|
227
|
-
await cmd(
|
|
279
|
+
await cmd(
|
|
280
|
+
'git',
|
|
281
|
+
['commit', '-m', `chore(version): bumping dependency versions for ${localPackage.name} [skip ci]`],
|
|
282
|
+
{ cwd: packageDir },
|
|
283
|
+
{ logPrefix: `[${cw.color(localPackage.name)}] ` }
|
|
284
|
+
);
|
|
228
285
|
await cmd('git', ['push'], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
|
|
229
286
|
logger.info(`(${cw.color(localPackage.name)}) pushed latest version (${localPackage.packageJson.version})`);
|
|
230
287
|
const latestCommitSha = await getLatestCommitSha(packageDir);
|
|
@@ -232,8 +289,18 @@ async function pushAndTag(localPackage: LocalPackage): Promise<Commit> {
|
|
|
232
289
|
const commit = { sha: latestCommitSha, ...repoInfo };
|
|
233
290
|
const tagName = `${localPackage.name}@${localPackage.packageJson.version}`;
|
|
234
291
|
logger.info(`(${cw.color(localPackage.name)}) pushing tag (${tagName})`);
|
|
235
|
-
await cmd(
|
|
236
|
-
|
|
292
|
+
await cmd(
|
|
293
|
+
'git',
|
|
294
|
+
['tag', '-a', tagName, '-m', `Release ${tagName}`],
|
|
295
|
+
{ cwd: packageDir },
|
|
296
|
+
{ logPrefix: `[${cw.color(localPackage.name)}] ` }
|
|
297
|
+
);
|
|
298
|
+
await cmd(
|
|
299
|
+
'git',
|
|
300
|
+
['push', 'origin', tagName],
|
|
301
|
+
{ cwd: packageDir },
|
|
302
|
+
{ logPrefix: `[${cw.color(localPackage.name)}] ` }
|
|
303
|
+
);
|
|
237
304
|
logger.info(`(${cw.color(localPackage.name)}) pushed tag (${tagName})`);
|
|
238
305
|
return commit;
|
|
239
306
|
}
|
|
@@ -242,7 +309,12 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
|
|
|
242
309
|
const repoName = path.basename(dir.endsWith(path.sep) ? dir.slice(0, -1) : dir);
|
|
243
310
|
logger.info(`(${cw.color(repoName)}) pushing latest version (${version})`);
|
|
244
311
|
await cmd('git', ['add', '.'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
245
|
-
await cmd(
|
|
312
|
+
await cmd(
|
|
313
|
+
'git',
|
|
314
|
+
['commit', '-m', `chore(version): bumping dependency versions [skip ci]`],
|
|
315
|
+
{ cwd: dir },
|
|
316
|
+
{ logPrefix: `[${cw.color(repoName)}] ` }
|
|
317
|
+
);
|
|
246
318
|
await cmd('git', ['push'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
247
319
|
logger.info(`(${cw.color(repoName)}) pushed latest version (${version})`);
|
|
248
320
|
const latestCommitSha = await getLatestCommitSha(dir);
|
|
@@ -250,7 +322,12 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
|
|
|
250
322
|
const commit = { sha: latestCommitSha, ...repoInfo };
|
|
251
323
|
const tagName = `v${version}`;
|
|
252
324
|
logger.info(`(${cw.color(repoName)}) pushing tag (${tagName})`);
|
|
253
|
-
await cmd(
|
|
325
|
+
await cmd(
|
|
326
|
+
'git',
|
|
327
|
+
['tag', '-a', tagName, '-m', `Release ${tagName}`],
|
|
328
|
+
{ cwd: dir },
|
|
329
|
+
{ logPrefix: `[${cw.color(repoName)}] ` }
|
|
330
|
+
);
|
|
254
331
|
await cmd('git', ['push', 'origin', tagName], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
255
332
|
logger.info(`(${cw.color(repoName)}) pushed tag (${tagName})`);
|
|
256
333
|
return commit;
|
|
@@ -258,18 +335,23 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
|
|
|
258
335
|
|
|
259
336
|
async function pushMetarepos(dir: string) {
|
|
260
337
|
const metarepoPaths = (await Fs.getFilePathsMatchingGlob(dir, '**/.gitmodules', ['**/node_modules/**', '**/dist/**']))
|
|
261
|
-
.map(gitmodulesPath => path.dirname(gitmodulesPath))
|
|
262
|
-
.sort((a, b) => b.localeCompare(a))
|
|
263
|
-
|
|
264
|
-
for (let metarepoPath of metarepoPaths)
|
|
338
|
+
.map((gitmodulesPath) => path.dirname(gitmodulesPath))
|
|
339
|
+
.sort((a, b) => b.localeCompare(a));
|
|
340
|
+
for (const metarepoPath of metarepoPaths) {
|
|
265
341
|
await pushMetarepo(metarepoPath);
|
|
342
|
+
}
|
|
266
343
|
}
|
|
267
344
|
|
|
268
345
|
async function pushMetarepo(dir: string) {
|
|
269
346
|
const repoName = path.basename(dir.endsWith(path.sep) ? dir.slice(0, -1) : dir);
|
|
270
347
|
logger.info(`(${cw.color(repoName)}) pushing metarepo (${dir})`);
|
|
271
348
|
await cmd('git', ['add', '.'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
272
|
-
await cmd(
|
|
349
|
+
await cmd(
|
|
350
|
+
'git',
|
|
351
|
+
['commit', '-m', `chore(version): bumping submodule versions [skip ci]`],
|
|
352
|
+
{ cwd: dir },
|
|
353
|
+
{ logPrefix: `[${cw.color(repoName)}] ` }
|
|
354
|
+
);
|
|
273
355
|
await cmd('git', ['pull'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
274
356
|
await cmd('git', ['push'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
|
|
275
357
|
logger.info(`(${cw.color(repoName)}) pushed metarepo (${dir})`);
|
|
@@ -277,7 +359,7 @@ async function pushMetarepo(dir: string) {
|
|
|
277
359
|
|
|
278
360
|
async function symlinkWorkspace(workspacePath: string, packageNames: string[], packageMap: LocalPackageMap) {
|
|
279
361
|
logger.info(`> Symlinking local dependencies in workspace (${workspacePath})`);
|
|
280
|
-
for (
|
|
362
|
+
for (const packageName of packageNames) {
|
|
281
363
|
const localPackage = packageMap[packageName];
|
|
282
364
|
await PackageUtil.symlinkDependencies(localPackage, packageMap, logger);
|
|
283
365
|
}
|
|
@@ -295,7 +377,7 @@ async function getLatestCommitSha(dir: string): Promise<string> {
|
|
|
295
377
|
resolve(stdout.trim());
|
|
296
378
|
});
|
|
297
379
|
});
|
|
298
|
-
}
|
|
380
|
+
}
|
|
299
381
|
|
|
300
382
|
type RepoInfo = {
|
|
301
383
|
owner: string;
|
|
@@ -313,6 +395,7 @@ async function getRepoInfo(dir: string): Promise<RepoInfo> {
|
|
|
313
395
|
const lines = stdout.split('\n');
|
|
314
396
|
for (const line of lines) {
|
|
315
397
|
if (line.startsWith('origin')) {
|
|
398
|
+
// eslint-disable-next-line no-useless-escape
|
|
316
399
|
const match = line.match(/github\.com[:\/](.+?)\/(.+?)\.git/);
|
|
317
400
|
if (match) {
|
|
318
401
|
const [_, owner, repo] = match;
|
|
@@ -325,7 +408,7 @@ async function getRepoInfo(dir: string): Promise<RepoInfo> {
|
|
|
325
408
|
reject(new Error('Origin remote not found or is not a GitHub repository'));
|
|
326
409
|
});
|
|
327
410
|
});
|
|
328
|
-
}
|
|
411
|
+
}
|
|
329
412
|
|
|
330
413
|
async function publish(localPackage: LocalPackage) {
|
|
331
414
|
if (localPackage.packageJson.private) {
|
|
@@ -340,14 +423,25 @@ async function publish(localPackage: LocalPackage) {
|
|
|
340
423
|
|
|
341
424
|
const packageDir = path.dirname(localPackage.filePath);
|
|
342
425
|
logger.info(`(${cw.color(localPackage.name)}) publishing latest version (${localPackage.packageJson.version})`);
|
|
343
|
-
await cmd(
|
|
344
|
-
|
|
426
|
+
await cmd(
|
|
427
|
+
'npm',
|
|
428
|
+
['set', `//registry.npmjs.org/:_authToken=${getNpmToken()}`],
|
|
429
|
+
{ cwd: packageDir },
|
|
430
|
+
{ logPrefix: `[${cw.color(localPackage.name)}] ` }
|
|
431
|
+
);
|
|
432
|
+
await cmd(
|
|
433
|
+
'npm',
|
|
434
|
+
['publish', '--tag', 'latest', '--access', 'public'],
|
|
435
|
+
{ cwd: packageDir },
|
|
436
|
+
{ logPrefix: `[${cw.color(localPackage.name)}] ` }
|
|
437
|
+
);
|
|
345
438
|
logger.info(`(${cw.color(localPackage.name)}) published latest version (${localPackage.packageJson.version})`);
|
|
346
439
|
}
|
|
347
440
|
|
|
348
441
|
function getNpmToken() {
|
|
349
|
-
if (process.env.NPM_TOKEN)
|
|
442
|
+
if (process.env.NPM_TOKEN) {
|
|
350
443
|
return process.env.NPM_TOKEN;
|
|
444
|
+
}
|
|
351
445
|
|
|
352
446
|
throw new Error(`NPM_TOKEN env variable not set`);
|
|
353
|
-
}
|
|
447
|
+
}
|
package/src/watchWorkspace.ts
CHANGED
|
@@ -1,35 +1,45 @@
|
|
|
1
|
-
import * as path from 'path'
|
|
2
|
-
import { PackageUtil, WorkspaceMetadata, cmd, LogColorWrapper } from '@proteinjs/util-node'
|
|
3
|
-
import { Logger } from '@proteinjs/util'
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { PackageUtil, WorkspaceMetadata, cmd, LogColorWrapper } from '@proteinjs/util-node';
|
|
3
|
+
import { Logger } from '@proteinjs/util';
|
|
4
4
|
import { primaryLogColor, secondaryLogColor } from './logColors';
|
|
5
5
|
|
|
6
6
|
export const watchWorkspace = async (workspaceMetadata?: WorkspaceMetadata) => {
|
|
7
7
|
const cw = new LogColorWrapper();
|
|
8
8
|
const logger = new Logger(cw.color('workspace:', primaryLogColor) + cw.color('watch', secondaryLogColor));
|
|
9
9
|
const workspacePath = process.cwd();
|
|
10
|
-
const { packageMap, sortedPackageNames } = workspaceMetadata
|
|
10
|
+
const { packageMap, sortedPackageNames } = workspaceMetadata
|
|
11
|
+
? workspaceMetadata
|
|
12
|
+
: await PackageUtil.getWorkspaceMetadata(workspacePath);
|
|
11
13
|
const skippedPackages = ['root'];
|
|
12
|
-
const filteredPackageNames = sortedPackageNames.filter(
|
|
14
|
+
const filteredPackageNames = sortedPackageNames.filter(
|
|
15
|
+
(packageName) => !!packageMap[packageName].packageJson.scripts?.watch && !skippedPackages.includes(packageName)
|
|
16
|
+
);
|
|
13
17
|
|
|
14
|
-
logger.info(
|
|
18
|
+
logger.info(
|
|
19
|
+
`> Watching ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
|
|
20
|
+
);
|
|
15
21
|
const loggingStartDelay = 0;
|
|
16
|
-
for (
|
|
22
|
+
for (const packageName of filteredPackageNames) {
|
|
17
23
|
const localPackage = packageMap[packageName];
|
|
18
24
|
const packageDir = path.dirname(localPackage.filePath);
|
|
19
25
|
const loggingEnabledState = { loggingEnabled: false };
|
|
20
|
-
setTimeout(() => loggingEnabledState.loggingEnabled = true, loggingStartDelay);
|
|
26
|
+
setTimeout(() => (loggingEnabledState.loggingEnabled = true), loggingStartDelay);
|
|
21
27
|
const logPrefix = `[${cw.color(packageName)}] `;
|
|
22
28
|
let inMultiLineLog = false;
|
|
23
29
|
const stdoutFilter = (log: string) => {
|
|
24
|
-
if (log.includes('File change detected. Starting incremental compilation'))
|
|
30
|
+
if (log.includes('File change detected. Starting incremental compilation')) {
|
|
25
31
|
return;
|
|
26
|
-
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line no-control-regex
|
|
27
35
|
let filteredOutput = log.replace(/\x1Bc|\x1B\[2J\x1B\[0;0H/g, ''); // char sequence for clearing terminal
|
|
28
|
-
if (filteredOutput.includes('Watching for file changes.'))
|
|
36
|
+
if (filteredOutput.includes('Watching for file changes.')) {
|
|
29
37
|
filteredOutput = filteredOutput.replace(/^\n/, '');
|
|
38
|
+
}
|
|
30
39
|
|
|
31
|
-
if (filteredOutput.trim() == '')
|
|
40
|
+
if (filteredOutput.trim() == '') {
|
|
32
41
|
return;
|
|
42
|
+
}
|
|
33
43
|
|
|
34
44
|
// Replace newline with newline+prefix under the following conditions:
|
|
35
45
|
// 1. It is not at the start of the string (?<!^)
|
|
@@ -37,22 +47,29 @@ export const watchWorkspace = async (workspaceMetadata?: WorkspaceMetadata) => {
|
|
|
37
47
|
// 3. It is not followed by another newline (?!\r?\n)
|
|
38
48
|
filteredOutput = filteredOutput.replace(/(?<!^)(\r?\n)(?!\r?\n|$)/g, `$1${logPrefix}`);
|
|
39
49
|
|
|
40
|
-
if (!inMultiLineLog)
|
|
50
|
+
if (!inMultiLineLog) {
|
|
41
51
|
filteredOutput = `${logPrefix}${filteredOutput}`;
|
|
52
|
+
}
|
|
42
53
|
|
|
43
|
-
if (filteredOutput.endsWith('\n') || filteredOutput.endsWith('\r\n'))
|
|
54
|
+
if (filteredOutput.endsWith('\n') || filteredOutput.endsWith('\r\n')) {
|
|
44
55
|
inMultiLineLog = false;
|
|
45
|
-
else
|
|
56
|
+
} else {
|
|
46
57
|
inMultiLineLog = true;
|
|
47
|
-
|
|
58
|
+
}
|
|
59
|
+
|
|
48
60
|
return filteredOutput;
|
|
49
61
|
};
|
|
50
|
-
cmd(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
cmd(
|
|
63
|
+
'npm',
|
|
64
|
+
['run', 'watch'],
|
|
65
|
+
{ cwd: packageDir },
|
|
66
|
+
{
|
|
67
|
+
omitLogs: {
|
|
68
|
+
stdout: {
|
|
69
|
+
filter: stdoutFilter,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
);
|
|
57
74
|
}
|
|
58
|
-
}
|
|
75
|
+
};
|
package/src/workspaceCommand.ts
CHANGED
|
@@ -1,56 +1,62 @@
|
|
|
1
|
-
import * as path from 'path'
|
|
2
|
-
import { LocalPackageMap, LogColorWrapper, PackageUtil, cmd, parseArgsMap } from '@proteinjs/util-node'
|
|
3
|
-
import { Logger } from '@proteinjs/util'
|
|
4
|
-
import { primaryLogColor, secondaryLogColor } from './logColors'
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { LocalPackageMap, LogColorWrapper, PackageUtil, cmd, parseArgsMap } from '@proteinjs/util-node';
|
|
3
|
+
import { Logger } from '@proteinjs/util';
|
|
4
|
+
import { primaryLogColor, secondaryLogColor } from './logColors';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Run a npm command against all packages in the workspace, in dependency order.
|
|
8
|
-
*
|
|
8
|
+
*
|
|
9
9
|
* ie: `npx workspace test --skip=@some/package,@another/package`
|
|
10
|
-
*
|
|
10
|
+
*
|
|
11
11
|
* Optional args:
|
|
12
|
-
*
|
|
12
|
+
*
|
|
13
13
|
* --skip=@some/package,@another/package
|
|
14
14
|
*/
|
|
15
15
|
export const workspaceCommand = async () => {
|
|
16
|
-
const command = process.argv[2]
|
|
16
|
+
const command = process.argv[2];
|
|
17
17
|
const cw = new LogColorWrapper();
|
|
18
18
|
const logger = new Logger(cw.color('workspace:', primaryLogColor) + cw.color(command, secondaryLogColor));
|
|
19
19
|
const args = getArgs();
|
|
20
20
|
const workspacePath = process.cwd();
|
|
21
21
|
const { packageMap, sortedPackageNames } = await PackageUtil.getWorkspaceMetadata(workspacePath);
|
|
22
22
|
const skippedPackages = ['root'];
|
|
23
|
-
const filteredPackageNames = sortedPackageNames.filter(packageName => {
|
|
24
|
-
return
|
|
23
|
+
const filteredPackageNames = sortedPackageNames.filter((packageName) => {
|
|
24
|
+
return (
|
|
25
|
+
hasScript(command, packageName, packageMap) &&
|
|
25
26
|
!(args.skip && args.skip.includes(packageName)) &&
|
|
26
27
|
!skippedPackages.includes(packageName)
|
|
27
|
-
;
|
|
28
|
+
);
|
|
28
29
|
});
|
|
29
30
|
if (filteredPackageNames.length == 0) {
|
|
30
31
|
logger.info(`> There are no packages with the \`${command}\` script in workspace (${workspacePath})`);
|
|
31
32
|
return;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
logger.info(
|
|
35
|
-
|
|
35
|
+
logger.info(
|
|
36
|
+
`> Running \`npm run ${command}\` for ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
|
|
37
|
+
);
|
|
38
|
+
for (const packageName of filteredPackageNames) {
|
|
36
39
|
const localPackage = packageMap[packageName];
|
|
37
40
|
const packageDir = path.dirname(localPackage.filePath);
|
|
38
41
|
await cmd('npm', ['run', command], { cwd: packageDir }, { logPrefix: `[${cw.color(packageName)}] ` });
|
|
39
42
|
}
|
|
40
|
-
logger.info(
|
|
41
|
-
}
|
|
43
|
+
logger.info(
|
|
44
|
+
`> Ran \`npm run ${command}\` for ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
|
|
45
|
+
);
|
|
46
|
+
};
|
|
42
47
|
|
|
43
48
|
type Args = {
|
|
44
|
-
skip?: string[]
|
|
45
|
-
}
|
|
49
|
+
skip?: string[];
|
|
50
|
+
};
|
|
46
51
|
|
|
47
52
|
function getArgs() {
|
|
48
53
|
const args: Args = {};
|
|
49
54
|
const argsMap = parseArgsMap(process.argv.slice(3));
|
|
50
|
-
for (
|
|
55
|
+
for (const argName in argsMap) {
|
|
51
56
|
const argValue = argsMap[argName];
|
|
52
|
-
if (argName == 'skip' && typeof argValue === 'string')
|
|
57
|
+
if (argName == 'skip' && typeof argValue === 'string') {
|
|
53
58
|
args.skip = argValue.split(',');
|
|
59
|
+
}
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
return args;
|
|
@@ -58,4 +64,4 @@ function getArgs() {
|
|
|
58
64
|
|
|
59
65
|
function hasScript(scriptName: string, packageName: string, packageMap: LocalPackageMap) {
|
|
60
66
|
return !!packageMap[packageName].packageJson.scripts && !!packageMap[packageName].packageJson.scripts[scriptName];
|
|
61
|
-
}
|
|
67
|
+
}
|