@proteinjs/build 1.3.0 → 1.4.0

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.
Files changed (71) hide show
  1. package/.eslintrc.js +20 -0
  2. package/.prettierignore +4 -0
  3. package/.prettierrc +8 -0
  4. package/CHANGELOG.md +30 -178
  5. package/dist/src/Github.d.ts.map +1 -1
  6. package/dist/src/Github.js +8 -4
  7. package/dist/src/Github.js.map +1 -1
  8. package/dist/src/bin/runBuildWorkspace.js.map +1 -1
  9. package/dist/src/bin/runCleanWorkspace.js.map +1 -1
  10. package/dist/src/bin/runLintWorkspace.d.ts +3 -0
  11. package/dist/src/bin/runLintWorkspace.d.ts.map +1 -0
  12. package/dist/src/bin/runLintWorkspace.js +6 -0
  13. package/dist/src/bin/runLintWorkspace.js.map +1 -0
  14. package/dist/src/bin/runSymlinkWorkspace.js.map +1 -1
  15. package/dist/src/bin/runTestWorkspace.js.map +1 -1
  16. package/dist/src/bin/runVersionWorkspace.js.map +1 -1
  17. package/dist/src/bin/runWatchWorkspace.js.map +1 -1
  18. package/dist/src/bin/runWorkspaceCommand.js.map +1 -1
  19. package/dist/src/bin/runWorkspacePackageCommand.js.map +1 -1
  20. package/dist/src/buildWorkspace.d.ts +1 -0
  21. package/dist/src/buildWorkspace.d.ts.map +1 -1
  22. package/dist/src/buildWorkspace.js +26 -9
  23. package/dist/src/buildWorkspace.js.map +1 -1
  24. package/dist/src/cleanWorkspace.d.ts.map +1 -1
  25. package/dist/src/cleanWorkspace.js.map +1 -1
  26. package/dist/src/lintWorkspace.d.ts +9 -0
  27. package/dist/src/lintWorkspace.d.ts.map +1 -0
  28. package/dist/src/lintWorkspace.js +134 -0
  29. package/dist/src/lintWorkspace.js.map +1 -0
  30. package/dist/src/symlinkWorkspace.d.ts.map +1 -1
  31. package/dist/src/symlinkWorkspace.js +2 -1
  32. package/dist/src/symlinkWorkspace.js.map +1 -1
  33. package/dist/src/testWorkspace.d.ts.map +1 -1
  34. package/dist/src/testWorkspace.js +2 -1
  35. package/dist/src/testWorkspace.js.map +1 -1
  36. package/dist/src/versionWorkspace.d.ts.map +1 -1
  37. package/dist/src/versionWorkspace.js +99 -59
  38. package/dist/src/versionWorkspace.js.map +1 -1
  39. package/dist/src/watchWorkspace.d.ts.map +1 -1
  40. package/dist/src/watchWorkspace.js +15 -8
  41. package/dist/src/watchWorkspace.js.map +1 -1
  42. package/dist/src/workspaceCommand.d.ts.map +1 -1
  43. package/dist/src/workspaceCommand.js +4 -3
  44. package/dist/src/workspaceCommand.js.map +1 -1
  45. package/dist/src/workspacePackageCommand.d.ts.map +1 -1
  46. package/dist/src/workspacePackageCommand.js +2 -1
  47. package/dist/src/workspacePackageCommand.js.map +1 -1
  48. package/jest.config.js +8 -17
  49. package/package.json +9 -3
  50. package/src/Github.ts +30 -27
  51. package/src/bin/runBuildWorkspace.ts +2 -2
  52. package/src/bin/runCleanWorkspace.ts +2 -2
  53. package/src/bin/runLintWorkspace.ts +5 -0
  54. package/src/bin/runSymlinkWorkspace.ts +2 -2
  55. package/src/bin/runTestWorkspace.ts +2 -2
  56. package/src/bin/runVersionWorkspace.ts +2 -2
  57. package/src/bin/runWatchWorkspace.ts +2 -2
  58. package/src/bin/runWorkspaceCommand.ts +2 -2
  59. package/src/bin/runWorkspacePackageCommand.ts +2 -2
  60. package/src/buildWorkspace.ts +37 -21
  61. package/src/cleanWorkspace.ts +17 -9
  62. package/src/lintWorkspace.ts +62 -0
  63. package/src/logColors.ts +1 -1
  64. package/src/symlinkWorkspace.ts +23 -16
  65. package/src/testWorkspace.ts +19 -10
  66. package/src/versionWorkspace.ts +183 -79
  67. package/src/watchWorkspace.ts +41 -24
  68. package/src/workspaceCommand.ts +26 -20
  69. package/src/workspacePackageCommand.ts +16 -11
  70. package/tsconfig.json +18 -22
  71. package/webpack.config.js +12 -12
@@ -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 } = await PackageUtil.getWorkspaceMetadata(workspacePath);
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 !!localPackage.packageJson.scripts?.clean
24
- && !!localPackage.packageJson.scripts?.build
25
- && !skippedPackages.includes(packageName)
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 (let packageName of filteredPackageNames) {
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 (localPackage.workspace?.lernaJson?.version === 'fixed') {
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 !!localPackage.packageJson.scripts?.clean
59
- && !!localPackage.packageJson.scripts?.build
60
- && packageName != 'typescript-parser'
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 (let packageName of filteredPackageNames) {
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 (let localDependency of localDependencies) {
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(`Package (${cw.color(localPackage.name)}) has dependency on ${localDependency}, but cannot find version in ${cw.color(localPackage.name)}'s package.json`);
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 = { prefix: currentDependencyVersion.prefix, version: localDependencyVersion };
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(`(${cw.color(localPackage.name)}) bumping version from ${currentVersion} -> ${localPackage.packageJson.version}`);
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, version: string, isLocalPath?: boolean }
108
-
109
- function getDependencyVersion(dependencyPackageName: string, localPackage: LocalPackage): DependencyVersion|undefined {
110
- let currentRawDependencyVersion = localPackage.packageJson.dependencies ? localPackage.packageJson.dependencies[dependencyPackageName] : undefined;
111
- if (!currentRawDependencyVersion)
112
- currentRawDependencyVersion = localPackage.packageJson.devDependencies ? localPackage.packageJson.devDependencies[dependencyPackageName] : undefined;
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(dependencyPackageName: string, currentVersion: DependencyVersion, newVersion: DependencyVersion, localPackage: LocalPackage) {
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 ? currentVersion.prefix + currentVersion.version : currentVersion.version;
132
- logger.info(`(${cw.color(localPackage.name)}) updating dependency version of ${cw.color(dependencyPackageName)} (${currentRawVersion} -> ${newRawVersion})`);
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(fixedVersionWorkspacePaths: string[], packageMap: LocalPackageMap, workspaceToPackageMap: {[workspacePath: string]: string[]}) {
136
- if (fixedVersionWorkspacePaths.length == 0)
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 (let workspacePath of fixedVersionWorkspacePaths) {
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
- const syncedVersion = await syncFixedVersions(workspacePackages);
149
- if (!syncedVersion)
193
+ const syncedVersion = await syncFixedVersions(workspacePath, workspacePackages);
194
+ if (!syncedVersion) {
150
195
  continue;
196
+ }
151
197
 
152
198
  await pushAndTagFixedVersionRepo(workspacePath, syncedVersion);
153
199
  }
@@ -155,33 +201,49 @@ async function syncFixedVersionWorkspaces(fixedVersionWorkspacePaths: string[],
155
201
  logger.info(`> Synced fixed-version workspaces`);
156
202
  }
157
203
 
158
- async function syncFixedVersions(localPackages: LocalPackage[]): Promise<string|false> {
159
- let highestVersion: string|undefined;
160
- for (let localPackage of localPackages) {
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 (let localPackage of localPackages) {
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(`(${cw.color(localPackage.name)}) bumping version from ${currentVersion} -> ${localPackage.packageJson.version}`);
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
 
236
+ if (syncedFixedVersions) {
237
+ const lernaJson = localPackages[0].workspace?.lernaJson;
238
+ if (!lernaJson) {
239
+ throw new Error(`Cannot find lerna.json for workspace: ${workspacePath}`);
240
+ }
241
+
242
+ const lernaJsonPath = path.join(workspacePath, 'lerna.json');
243
+ lernaJson.version = highestVersion;
244
+ await Fs.writeFiles([{ path: lernaJsonPath, content: JSON.stringify(lernaJson, null, 2) }]);
245
+ }
246
+
185
247
  return syncedFixedVersions ? highestVersion : false;
186
248
  }
187
249
 
@@ -214,7 +276,12 @@ async function pushAndTag(localPackage: LocalPackage): Promise<Commit> {
214
276
  const packageDir = path.dirname(localPackage.filePath);
215
277
  logger.info(`(${cw.color(localPackage.name)}) pushing latest version (${localPackage.packageJson.version})`);
216
278
  await cmd('git', ['add', '.'], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
217
- await cmd('git', ['commit', '-m', `chore(version): bumping dependency versions for ${localPackage.name} [skip ci]`], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
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
+ );
218
285
  await cmd('git', ['push'], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
219
286
  logger.info(`(${cw.color(localPackage.name)}) pushed latest version (${localPackage.packageJson.version})`);
220
287
  const latestCommitSha = await getLatestCommitSha(packageDir);
@@ -222,8 +289,18 @@ async function pushAndTag(localPackage: LocalPackage): Promise<Commit> {
222
289
  const commit = { sha: latestCommitSha, ...repoInfo };
223
290
  const tagName = `${localPackage.name}@${localPackage.packageJson.version}`;
224
291
  logger.info(`(${cw.color(localPackage.name)}) pushing tag (${tagName})`);
225
- await cmd('git', ['tag', '-a', tagName, '-m', `Release ${tagName}`], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
226
- await cmd('git', ['push', 'origin', tagName], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
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
+ );
227
304
  logger.info(`(${cw.color(localPackage.name)}) pushed tag (${tagName})`);
228
305
  return commit;
229
306
  }
@@ -232,7 +309,12 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
232
309
  const repoName = path.basename(dir.endsWith(path.sep) ? dir.slice(0, -1) : dir);
233
310
  logger.info(`(${cw.color(repoName)}) pushing latest version (${version})`);
234
311
  await cmd('git', ['add', '.'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
235
- await cmd('git', ['commit', '-m', `chore(version): bumping dependency versions [skip ci]`], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
312
+ await cmd(
313
+ 'git',
314
+ ['commit', '-m', `chore(version): bumping dependency versions [skip ci]`],
315
+ { cwd: dir },
316
+ { logPrefix: `[${cw.color(repoName)}] ` }
317
+ );
236
318
  await cmd('git', ['push'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
237
319
  logger.info(`(${cw.color(repoName)}) pushed latest version (${version})`);
238
320
  const latestCommitSha = await getLatestCommitSha(dir);
@@ -240,7 +322,12 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
240
322
  const commit = { sha: latestCommitSha, ...repoInfo };
241
323
  const tagName = `v${version}`;
242
324
  logger.info(`(${cw.color(repoName)}) pushing tag (${tagName})`);
243
- await cmd('git', ['tag', '-a', tagName, '-m', `Release ${tagName}`], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
325
+ await cmd(
326
+ 'git',
327
+ ['tag', '-a', tagName, '-m', `Release ${tagName}`],
328
+ { cwd: dir },
329
+ { logPrefix: `[${cw.color(repoName)}] ` }
330
+ );
244
331
  await cmd('git', ['push', 'origin', tagName], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
245
332
  logger.info(`(${cw.color(repoName)}) pushed tag (${tagName})`);
246
333
  return commit;
@@ -248,18 +335,23 @@ async function pushAndTagFixedVersionRepo(dir: string, version: string): Promise
248
335
 
249
336
  async function pushMetarepos(dir: string) {
250
337
  const metarepoPaths = (await Fs.getFilePathsMatchingGlob(dir, '**/.gitmodules', ['**/node_modules/**', '**/dist/**']))
251
- .map(gitmodulesPath => path.dirname(gitmodulesPath))
252
- .sort((a, b) => b.localeCompare(a))
253
- ;
254
- for (let metarepoPath of metarepoPaths)
338
+ .map((gitmodulesPath) => path.dirname(gitmodulesPath))
339
+ .sort((a, b) => b.localeCompare(a));
340
+ for (const metarepoPath of metarepoPaths) {
255
341
  await pushMetarepo(metarepoPath);
342
+ }
256
343
  }
257
344
 
258
345
  async function pushMetarepo(dir: string) {
259
346
  const repoName = path.basename(dir.endsWith(path.sep) ? dir.slice(0, -1) : dir);
260
347
  logger.info(`(${cw.color(repoName)}) pushing metarepo (${dir})`);
261
348
  await cmd('git', ['add', '.'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
262
- await cmd('git', ['commit', '-m', `chore(version): bumping submodule versions [skip ci]`], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
349
+ await cmd(
350
+ 'git',
351
+ ['commit', '-m', `chore(version): bumping submodule versions [skip ci]`],
352
+ { cwd: dir },
353
+ { logPrefix: `[${cw.color(repoName)}] ` }
354
+ );
263
355
  await cmd('git', ['pull'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
264
356
  await cmd('git', ['push'], { cwd: dir }, { logPrefix: `[${cw.color(repoName)}] ` });
265
357
  logger.info(`(${cw.color(repoName)}) pushed metarepo (${dir})`);
@@ -267,7 +359,7 @@ async function pushMetarepo(dir: string) {
267
359
 
268
360
  async function symlinkWorkspace(workspacePath: string, packageNames: string[], packageMap: LocalPackageMap) {
269
361
  logger.info(`> Symlinking local dependencies in workspace (${workspacePath})`);
270
- for (let packageName of packageNames) {
362
+ for (const packageName of packageNames) {
271
363
  const localPackage = packageMap[packageName];
272
364
  await PackageUtil.symlinkDependencies(localPackage, packageMap, logger);
273
365
  }
@@ -285,7 +377,7 @@ async function getLatestCommitSha(dir: string): Promise<string> {
285
377
  resolve(stdout.trim());
286
378
  });
287
379
  });
288
- };
380
+ }
289
381
 
290
382
  type RepoInfo = {
291
383
  owner: string;
@@ -303,6 +395,7 @@ async function getRepoInfo(dir: string): Promise<RepoInfo> {
303
395
  const lines = stdout.split('\n');
304
396
  for (const line of lines) {
305
397
  if (line.startsWith('origin')) {
398
+ // eslint-disable-next-line no-useless-escape
306
399
  const match = line.match(/github\.com[:\/](.+?)\/(.+?)\.git/);
307
400
  if (match) {
308
401
  const [_, owner, repo] = match;
@@ -315,7 +408,7 @@ async function getRepoInfo(dir: string): Promise<RepoInfo> {
315
408
  reject(new Error('Origin remote not found or is not a GitHub repository'));
316
409
  });
317
410
  });
318
- };
411
+ }
319
412
 
320
413
  async function publish(localPackage: LocalPackage) {
321
414
  if (localPackage.packageJson.private) {
@@ -330,14 +423,25 @@ async function publish(localPackage: LocalPackage) {
330
423
 
331
424
  const packageDir = path.dirname(localPackage.filePath);
332
425
  logger.info(`(${cw.color(localPackage.name)}) publishing latest version (${localPackage.packageJson.version})`);
333
- await cmd('npm', ['set', `//registry.npmjs.org/:_authToken=${getNpmToken()}`], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
334
- await cmd('npm', ['publish', '--tag', 'latest', '--access', 'public'], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
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
+ );
335
438
  logger.info(`(${cw.color(localPackage.name)}) published latest version (${localPackage.packageJson.version})`);
336
439
  }
337
440
 
338
441
  function getNpmToken() {
339
- if (process.env.NPM_TOKEN)
442
+ if (process.env.NPM_TOKEN) {
340
443
  return process.env.NPM_TOKEN;
444
+ }
341
445
 
342
446
  throw new Error(`NPM_TOKEN env variable not set`);
343
- }
447
+ }
@@ -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 ? workspaceMetadata : await PackageUtil.getWorkspaceMetadata(workspacePath);
10
+ const { packageMap, sortedPackageNames } = workspaceMetadata
11
+ ? workspaceMetadata
12
+ : await PackageUtil.getWorkspaceMetadata(workspacePath);
11
13
  const skippedPackages = ['root'];
12
- const filteredPackageNames = sortedPackageNames.filter(packageName => !!packageMap[packageName].packageJson.scripts?.watch && !skippedPackages.includes(packageName));
14
+ const filteredPackageNames = sortedPackageNames.filter(
15
+ (packageName) => !!packageMap[packageName].packageJson.scripts?.watch && !skippedPackages.includes(packageName)
16
+ );
13
17
 
14
- logger.info(`> Watching ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
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 (let packageName of filteredPackageNames) {
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('npm', ['run', 'watch'], { cwd: packageDir }, {
51
- omitLogs: {
52
- stdout: {
53
- filter: stdoutFilter,
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
+ };
@@ -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 hasScript(command, packageName, packageMap) &&
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(`> Running \`npm run ${command}\` for ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
35
- for (let packageName of filteredPackageNames) {
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(`> Ran \`npm run ${command}\` for ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
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 (let argName in argsMap) {
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
+ }