@proteinjs/build 1.3.1 → 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 +29 -188
  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 +59 -31
  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 +173 -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 { LogColorWrapper, PackageUtil, parseArgsMap } from '@proteinjs/util-node'
2
- import { Logger } from '@proteinjs/util'
3
- import { primaryLogColor, secondaryLogColor } from './logColors'
1
+ import { LogColorWrapper, PackageUtil, parseArgsMap } from '@proteinjs/util-node';
2
+ import { Logger } from '@proteinjs/util';
3
+ import { primaryLogColor, secondaryLogColor } from './logColors';
4
4
 
5
5
  /**
6
6
  * Symlink dependencies to local packages for each package in the workspace.
7
- *
7
+ *
8
8
  * ie: `npx symlink-workspace --skip=@some/package,@another/package`
9
- *
9
+ *
10
10
  * Optional args:
11
- *
11
+ *
12
12
  * --skip=@some/package,@another/package
13
13
  */
14
14
  export const symlinkWorkspace = async () => {
@@ -18,32 +18,39 @@ export const symlinkWorkspace = async () => {
18
18
  const workspacePath = process.cwd();
19
19
  const { packageMap, sortedPackageNames } = await PackageUtil.getWorkspaceMetadata(workspacePath);
20
20
  const skippedPackages = ['root'];
21
- const filteredPackageNames = sortedPackageNames.filter(packageName => !(args.skip && args.skip.includes(packageName)) && !skippedPackages.includes(packageName));
21
+ const filteredPackageNames = sortedPackageNames.filter(
22
+ (packageName) => !(args.skip && args.skip.includes(packageName)) && !skippedPackages.includes(packageName)
23
+ );
22
24
  if (filteredPackageNames.length == 0) {
23
25
  logger.info(`> There are no packages to symlink in workspace (${workspacePath})`);
24
26
  return;
25
27
  }
26
28
 
27
- logger.info(`> Symlinking ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
28
- for (let packageName of filteredPackageNames) {
29
+ logger.info(
30
+ `> Symlinking ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
31
+ );
32
+ for (const packageName of filteredPackageNames) {
29
33
  const localPackage = packageMap[packageName];
30
34
  await PackageUtil.symlinkDependencies(localPackage, packageMap, logger);
31
35
  }
32
- logger.info(`> Symlinked ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
33
- }
36
+ logger.info(
37
+ `> Symlinked ${cw.color(`${filteredPackageNames.length}`, secondaryLogColor)} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
38
+ );
39
+ };
34
40
 
35
41
  type Args = {
36
- skip?: string[],
37
- }
42
+ skip?: string[];
43
+ };
38
44
 
39
45
  function getArgs() {
40
46
  const args: Args = {};
41
47
  const argsMap = parseArgsMap(process.argv.slice(2));
42
- for (let argName in argsMap) {
48
+ for (const argName in argsMap) {
43
49
  const argValue = argsMap[argName];
44
- if (argName == 'skip' && typeof argValue === 'string')
50
+ if (argName == 'skip' && typeof argValue === 'string') {
45
51
  args.skip = argValue.split(',');
52
+ }
46
53
  }
47
54
 
48
55
  return args;
49
- }
56
+ }
@@ -1,22 +1,31 @@
1
- import * as path from 'path'
2
- import { PackageUtil, cmd, WorkspaceMetadata } from '@proteinjs/util-node'
3
- import { Logger } from '@proteinjs/util'
1
+ import * as path from 'path';
2
+ import { PackageUtil, cmd, WorkspaceMetadata } from '@proteinjs/util-node';
3
+ import { Logger } from '@proteinjs/util';
4
4
 
5
5
  export const testWorkspace = async (workspaceMetadata?: WorkspaceMetadata) => {
6
6
  const logger = new Logger('workspace:test');
7
7
  const workspacePath = process.cwd();
8
- const { packageMap, sortedPackageNames } = workspaceMetadata ? workspaceMetadata : await PackageUtil.getWorkspaceMetadata(workspacePath);
8
+ const { packageMap, sortedPackageNames } = workspaceMetadata
9
+ ? workspaceMetadata
10
+ : await PackageUtil.getWorkspaceMetadata(workspacePath);
9
11
  const skippedPackages = ['root'];
10
- const filteredPackageNames = sortedPackageNames.filter(packageName => !!packageMap[packageName].packageJson.scripts?.test && !skippedPackages.includes(packageName));
12
+ const filteredPackageNames = sortedPackageNames.filter(
13
+ (packageName) => !!packageMap[packageName].packageJson.scripts?.test && !skippedPackages.includes(packageName)
14
+ );
11
15
 
12
- logger.info(`> Testing ${filteredPackageNames.length} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
13
- for (let packageName of filteredPackageNames) {
16
+ logger.info(
17
+ `> Testing ${filteredPackageNames.length} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
18
+ );
19
+ for (const packageName of filteredPackageNames) {
14
20
  const localPackage = packageMap[packageName];
15
21
  const packageDir = path.dirname(localPackage.filePath);
16
- if (!await PackageUtil.hasTests(packageDir))
22
+ if (!(await PackageUtil.hasTests(packageDir))) {
17
23
  continue;
24
+ }
18
25
 
19
26
  await cmd('npm', ['run', 'test'], { cwd: packageDir });
20
27
  }
21
- logger.info(`> Finished testing ${filteredPackageNames.length} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`);
22
- }
28
+ logger.info(
29
+ `> Finished testing ${filteredPackageNames.length} package${filteredPackageNames.length != 1 ? 's' : ''} in workspace (${workspacePath})`
30
+ );
31
+ };
@@ -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 && localPackage.workspace.lernaJson && localPackage.workspace.lernaJson.version !== 'independent') {
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
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 (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
 
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('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
+ );
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('git', ['tag', '-a', tagName, '-m', `Release ${tagName}`], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
236
- 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
+ );
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('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
+ );
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('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
+ );
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('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
+ );
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 (let packageName of packageNames) {
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('npm', ['set', `//registry.npmjs.org/:_authToken=${getNpmToken()}`], { cwd: packageDir }, { logPrefix: `[${cw.color(localPackage.name)}] ` });
344
- 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
+ );
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
+ }