@servicetitan/startup 32.0.1 → 32.1.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 (72) hide show
  1. package/dist/cli/commands/review/rules/index.d.ts.map +1 -1
  2. package/dist/cli/commands/review/rules/index.js +10 -2
  3. package/dist/cli/commands/review/rules/index.js.map +1 -1
  4. package/dist/cli/commands/review/rules/no-deprecated-content-base.d.ts +13 -0
  5. package/dist/cli/commands/review/rules/no-deprecated-content-base.d.ts.map +1 -0
  6. package/dist/cli/commands/review/rules/no-deprecated-content-base.js +71 -0
  7. package/dist/cli/commands/review/rules/no-deprecated-content-base.js.map +1 -0
  8. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.d.ts +15 -0
  9. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.d.ts.map +1 -0
  10. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.js +75 -0
  11. package/dist/cli/commands/review/rules/no-direct-peer-dependencies.js.map +1 -0
  12. package/dist/cli/commands/review/rules/no-typescript-entry-point.d.ts +2 -2
  13. package/dist/cli/commands/review/rules/no-typescript-entry-point.d.ts.map +1 -1
  14. package/dist/cli/commands/review/rules/no-typescript-entry-point.js +58 -45
  15. package/dist/cli/commands/review/rules/no-typescript-entry-point.js.map +1 -1
  16. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.d.ts +20 -0
  17. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.d.ts.map +1 -0
  18. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.js +145 -0
  19. package/dist/cli/commands/review/rules/prefer-open-ended-peer-dependencies.js.map +1 -0
  20. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.d.ts +22 -0
  21. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.d.ts.map +1 -0
  22. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js +189 -0
  23. package/dist/cli/commands/review/rules/require-compatible-launch-darkly-sdk.js.map +1 -0
  24. package/dist/cli/commands/review/rules/require-explicit-side-effects.d.ts +2 -1
  25. package/dist/cli/commands/review/rules/require-explicit-side-effects.d.ts.map +1 -1
  26. package/dist/cli/commands/review/rules/require-explicit-side-effects.js +24 -11
  27. package/dist/cli/commands/review/rules/require-explicit-side-effects.js.map +1 -1
  28. package/dist/cli/commands/review/rules/require-one-collection-version.d.ts.map +1 -1
  29. package/dist/cli/commands/review/rules/require-one-collection-version.js +1 -1
  30. package/dist/cli/commands/review/rules/require-one-collection-version.js.map +1 -1
  31. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.d.ts.map +1 -1
  32. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.js +5 -7
  33. package/dist/cli/commands/review/rules/require-project-version-in-root-node-modules.js.map +1 -1
  34. package/dist/cli/commands/review/rules/require-servicetitan-scope.d.ts +2 -1
  35. package/dist/cli/commands/review/rules/require-servicetitan-scope.d.ts.map +1 -1
  36. package/dist/cli/commands/review/rules/require-servicetitan-scope.js +24 -11
  37. package/dist/cli/commands/review/rules/require-servicetitan-scope.js.map +1 -1
  38. package/dist/cli/commands/review/types.d.ts +4 -1
  39. package/dist/cli/commands/review/types.d.ts.map +1 -1
  40. package/dist/cli/commands/review/types.js.map +1 -1
  41. package/dist/cli/commands/review/utils/check-packages.d.ts +7 -0
  42. package/dist/cli/commands/review/utils/check-packages.d.ts.map +1 -0
  43. package/dist/cli/commands/review/utils/check-packages.js +30 -0
  44. package/dist/cli/commands/review/utils/check-packages.js.map +1 -0
  45. package/dist/cli/commands/review/utils/index.d.ts +1 -0
  46. package/dist/cli/commands/review/utils/index.d.ts.map +1 -1
  47. package/dist/cli/commands/review/utils/index.js +1 -0
  48. package/dist/cli/commands/review/utils/index.js.map +1 -1
  49. package/dist/cli/utils/cli-git.d.ts.map +1 -1
  50. package/dist/cli/utils/cli-git.js +11 -8
  51. package/dist/cli/utils/cli-git.js.map +1 -1
  52. package/package.json +4 -4
  53. package/src/cli/commands/review/rules/__mocks__/mock-config.ts +8 -2
  54. package/src/cli/commands/review/rules/__tests__/no-deprecated-content-base.test.ts +123 -0
  55. package/src/cli/commands/review/rules/__tests__/no-direct-peer-dependencies.test.ts +130 -0
  56. package/src/cli/commands/review/rules/__tests__/prefer-open-ended-peer-dependencies.test.ts +121 -0
  57. package/src/cli/commands/review/rules/__tests__/require-compatible-launch-darkly-sdk.test.ts +256 -0
  58. package/src/cli/commands/review/rules/index.ts +10 -2
  59. package/src/cli/commands/review/rules/no-deprecated-content-base.ts +50 -0
  60. package/src/cli/commands/review/rules/no-direct-peer-dependencies.ts +58 -0
  61. package/src/cli/commands/review/rules/no-typescript-entry-point.ts +5 -8
  62. package/src/cli/commands/review/rules/prefer-open-ended-peer-dependencies.ts +89 -0
  63. package/src/cli/commands/review/rules/require-compatible-launch-darkly-sdk.ts +141 -0
  64. package/src/cli/commands/review/rules/require-explicit-side-effects.ts +14 -14
  65. package/src/cli/commands/review/rules/require-one-collection-version.ts +1 -3
  66. package/src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts +5 -9
  67. package/src/cli/commands/review/rules/require-servicetitan-scope.ts +14 -14
  68. package/src/cli/commands/review/types.ts +16 -2
  69. package/src/cli/commands/review/utils/check-packages.ts +19 -0
  70. package/src/cli/commands/review/utils/index.ts +1 -0
  71. package/src/cli/utils/__tests__/cli-git.test.ts +20 -18
  72. package/src/cli/utils/cli-git.ts +8 -7
@@ -0,0 +1,22 @@
1
+ import { PackageError, PackageRule, Project } from '../types';
2
+ interface ErrorData {
3
+ name?: string;
4
+ actualVersion: string;
5
+ targetVersion: string;
6
+ }
7
+ type RuleError = PackageError<ErrorData>;
8
+ export declare class RequireCompatibleLaunchDarklySdk implements PackageRule {
9
+ #private;
10
+ get id(): string;
11
+ run(project: Project): RuleError | RuleError[] | undefined;
12
+ fix({ data }: RuleError, project: Project): void;
13
+ private readonly checkPackage;
14
+ private checkProject;
15
+ private createError;
16
+ private formatDetails;
17
+ private getActualJsClientSdkVersion;
18
+ private getResolvedDependency;
19
+ private getTargetJsClientSdkVersion;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=require-compatible-launch-darkly-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-compatible-launch-darkly-sdk.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-compatible-launch-darkly-sdk.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAMpF,UAAU,SAAS;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAEzC,qBAAa,gCAAiC,YAAW,WAAW;;IAGhE,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,GAAG,SAAS;IAiB1D,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;IAsBzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAkB3B;IAEF,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,2BAA2B;CAQtC"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "RequireCompatibleLaunchDarklySdk", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return RequireCompatibleLaunchDarklySdk;
9
+ }
10
+ });
11
+ const _chalk = /*#__PURE__*/ _interop_require_default(require("chalk"));
12
+ const _child_process = require("child_process");
13
+ const _semver = require("semver");
14
+ const _types = require("../types");
15
+ const _utils = require("../utils");
16
+ function _check_private_redeclaration(obj, privateCollection) {
17
+ if (privateCollection.has(obj)) {
18
+ throw new TypeError("Cannot initialize the same private elements twice on an object");
19
+ }
20
+ }
21
+ function _class_apply_descriptor_get(receiver, descriptor) {
22
+ if (descriptor.get) {
23
+ return descriptor.get.call(receiver);
24
+ }
25
+ return descriptor.value;
26
+ }
27
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
28
+ if (descriptor.set) {
29
+ descriptor.set.call(receiver, value);
30
+ } else {
31
+ if (!descriptor.writable) {
32
+ throw new TypeError("attempted to set read only private field");
33
+ }
34
+ descriptor.value = value;
35
+ }
36
+ }
37
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
38
+ if (!privateMap.has(receiver)) {
39
+ throw new TypeError("attempted to " + action + " private field on non-instance");
40
+ }
41
+ return privateMap.get(receiver);
42
+ }
43
+ function _class_private_field_get(receiver, privateMap) {
44
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
45
+ return _class_apply_descriptor_get(receiver, descriptor);
46
+ }
47
+ function _class_private_field_init(obj, privateMap, value) {
48
+ _check_private_redeclaration(obj, privateMap);
49
+ privateMap.set(obj, value);
50
+ }
51
+ function _class_private_field_set(receiver, privateMap, value) {
52
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
53
+ _class_apply_descriptor_set(receiver, descriptor, value);
54
+ return value;
55
+ }
56
+ function _define_property(obj, key, value) {
57
+ if (key in obj) {
58
+ Object.defineProperty(obj, key, {
59
+ value: value,
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true
63
+ });
64
+ } else {
65
+ obj[key] = value;
66
+ }
67
+ return obj;
68
+ }
69
+ function _interop_require_default(obj) {
70
+ return obj && obj.__esModule ? obj : {
71
+ default: obj
72
+ };
73
+ }
74
+ const JS_CLIENT_SDK = 'launchdarkly-js-client-sdk';
75
+ const LD_SERVICE = '@servicetitan/launchdarkly-service';
76
+ var _project = /*#__PURE__*/ new WeakMap();
77
+ class RequireCompatibleLaunchDarklySdk {
78
+ get id() {
79
+ return 'require-compatible-launch-darkly-sdk';
80
+ }
81
+ run(project) {
82
+ var _project_config_rules;
83
+ _class_private_field_set(this, _project, project);
84
+ /*
85
+ * Pass an empty filter object to checkPackages to disable its filtering.
86
+ * The project-level check is only useful when there are no package-level
87
+ * errors so we need an accurate count.
88
+ */ const errors = (0, _utils.checkPackages)({}, project, this.checkPackage);
89
+ if (!errors.length) {
90
+ return this.checkProject();
91
+ }
92
+ return (0, _utils.applyFilter)((_project_config_rules = project.config.rules) === null || _project_config_rules === void 0 ? void 0 : _project_config_rules[this.id], errors, ({ data })=>data.name);
93
+ }
94
+ fix({ data }, project) {
95
+ const { name, targetVersion } = data !== null && data !== void 0 ? data : {};
96
+ if (!targetVersion) {
97
+ return;
98
+ }
99
+ if (name) {
100
+ (0, _utils.setVersion)({
101
+ project,
102
+ packageName: name,
103
+ dependency: JS_CLIENT_SDK,
104
+ version: targetVersion
105
+ });
106
+ return;
107
+ }
108
+ [
109
+ `npm pkg set dependencies["${JS_CLIENT_SDK}"]=${targetVersion}`,
110
+ 'npx startup install --fix --quiet',
111
+ `npm pkg delete dependencies["${JS_CLIENT_SDK}"]`
112
+ ].forEach((command)=>(0, _child_process.execSync)(command, {
113
+ stdio: 'inherit'
114
+ }));
115
+ }
116
+ checkProject() {
117
+ const actualVersion = this.getActualJsClientSdkVersion();
118
+ const targetVersion = this.getTargetJsClientSdkVersion();
119
+ if (actualVersion && targetVersion && !(0, _semver.satisfies)(actualVersion, targetVersion)) {
120
+ return this.createError({
121
+ message: `project depends on an incompatible version of ${JS_CLIENT_SDK}`,
122
+ location: _class_private_field_get(this, _project).packageLock.location,
123
+ data: {
124
+ actualVersion,
125
+ targetVersion
126
+ }
127
+ });
128
+ }
129
+ }
130
+ createError(params) {
131
+ const { message, data, location } = params;
132
+ return {
133
+ id: this.id,
134
+ message,
135
+ details: this.formatDetails(data),
136
+ location,
137
+ fixable: data.name ? _types.FixCategory.isolated : _types.FixCategory.lockFile,
138
+ data
139
+ };
140
+ }
141
+ formatDetails({ actualVersion, targetVersion }) {
142
+ return `${_chalk.default.yellow(actualVersion)} does not match ${targetVersion}`;
143
+ }
144
+ getActualJsClientSdkVersion(packageName) {
145
+ return this.getResolvedDependency({
146
+ packageName,
147
+ dependency: JS_CLIENT_SDK
148
+ }).version;
149
+ }
150
+ getResolvedDependency({ packageName, dependency }) {
151
+ const { packages } = _class_private_field_get(this, _project).packageLock;
152
+ var _ref, _ref1;
153
+ return (_ref1 = (_ref = packageName ? packages[`node_modules/${packageName}/node_modules/${dependency}`] : undefined) !== null && _ref !== void 0 ? _ref : packages[`node_modules/${dependency}`]) !== null && _ref1 !== void 0 ? _ref1 : {};
154
+ }
155
+ getTargetJsClientSdkVersion(packageName) {
156
+ const { dependencies = {}, peerDependencies = {} } = this.getResolvedDependency({
157
+ packageName,
158
+ dependency: LD_SERVICE
159
+ });
160
+ var _dependencies_JS_CLIENT_SDK;
161
+ return (_dependencies_JS_CLIENT_SDK = dependencies[JS_CLIENT_SDK]) !== null && _dependencies_JS_CLIENT_SDK !== void 0 ? _dependencies_JS_CLIENT_SDK : peerDependencies[JS_CLIENT_SDK];
162
+ }
163
+ constructor(){
164
+ _class_private_field_init(this, _project, {
165
+ writable: true,
166
+ value: void 0
167
+ });
168
+ _define_property(this, "checkPackage", ({ dependencies = {}, location, name })=>{
169
+ if (!dependencies[JS_CLIENT_SDK]) {
170
+ return;
171
+ }
172
+ const actualVersion = this.getActualJsClientSdkVersion(name);
173
+ const targetVersion = this.getTargetJsClientSdkVersion(name);
174
+ if (actualVersion && targetVersion && !(0, _semver.satisfies)(actualVersion, targetVersion)) {
175
+ return this.createError({
176
+ message: `package "${name}" depends on an incompatible version of ${JS_CLIENT_SDK}`,
177
+ location,
178
+ data: {
179
+ name,
180
+ actualVersion,
181
+ targetVersion
182
+ }
183
+ });
184
+ }
185
+ });
186
+ }
187
+ }
188
+
189
+ //# sourceMappingURL=require-compatible-launch-darkly-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-compatible-launch-darkly-sdk.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { satisfies } from 'semver';\nimport { FixCategory, Package, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, checkPackages, setVersion } from '../utils';\n\nconst JS_CLIENT_SDK = 'launchdarkly-js-client-sdk';\nconst LD_SERVICE = '@servicetitan/launchdarkly-service';\n\ninterface ErrorData {\n name?: string;\n actualVersion: string;\n targetVersion: string;\n}\n\ntype RuleError = PackageError<ErrorData>;\n\nexport class RequireCompatibleLaunchDarklySdk implements PackageRule {\n #project!: Project;\n\n get id() {\n return 'require-compatible-launch-darkly-sdk';\n }\n\n run(project: Project): RuleError | RuleError[] | undefined {\n this.#project = project;\n\n /*\n * Pass an empty filter object to checkPackages to disable its filtering.\n * The project-level check is only useful when there are no package-level\n * errors so we need an accurate count.\n */\n const errors = checkPackages({}, project, this.checkPackage);\n\n if (!errors.length) {\n return this.checkProject();\n }\n\n return applyFilter(project.config.rules?.[this.id], errors, ({ data }) => data!.name!);\n }\n\n fix({ data }: RuleError, project: Project) {\n const { name, targetVersion } = data ?? {};\n if (!targetVersion) {\n return;\n }\n if (name) {\n setVersion({\n project,\n packageName: name,\n dependency: JS_CLIENT_SDK,\n version: targetVersion,\n });\n return;\n }\n\n [\n `npm pkg set dependencies[\"${JS_CLIENT_SDK}\"]=${targetVersion}`,\n 'npx startup install --fix --quiet',\n `npm pkg delete dependencies[\"${JS_CLIENT_SDK}\"]`,\n ].forEach(command => execSync(command, { stdio: 'inherit' }));\n }\n\n private readonly checkPackage = ({\n dependencies = {},\n location,\n name,\n }: Package): RuleError | undefined => {\n if (!dependencies[JS_CLIENT_SDK]) {\n return;\n }\n\n const actualVersion = this.getActualJsClientSdkVersion(name);\n const targetVersion = this.getTargetJsClientSdkVersion(name);\n if (actualVersion && targetVersion && !satisfies(actualVersion, targetVersion)) {\n return this.createError({\n message: `package \"${name}\" depends on an incompatible version of ${JS_CLIENT_SDK}`,\n location,\n data: { name, actualVersion, targetVersion },\n });\n }\n };\n\n private checkProject() {\n const actualVersion = this.getActualJsClientSdkVersion();\n const targetVersion = this.getTargetJsClientSdkVersion();\n if (actualVersion && targetVersion && !satisfies(actualVersion, targetVersion)) {\n return this.createError({\n message: `project depends on an incompatible version of ${JS_CLIENT_SDK}`,\n location: this.#project.packageLock.location,\n data: { actualVersion, targetVersion },\n });\n }\n }\n\n private createError(params: { message: string; location: string; data: ErrorData }): RuleError {\n const { message, data, location } = params;\n return {\n id: this.id,\n message,\n details: this.formatDetails(data),\n location,\n fixable: data.name ? FixCategory.isolated : FixCategory.lockFile,\n data,\n };\n }\n\n private formatDetails({ actualVersion, targetVersion }: ErrorData) {\n return `${chalk.yellow(actualVersion)} does not match ${targetVersion}`;\n }\n\n private getActualJsClientSdkVersion(packageName?: string) {\n return this.getResolvedDependency({ packageName, dependency: JS_CLIENT_SDK }).version;\n }\n\n private getResolvedDependency({\n packageName,\n dependency,\n }: {\n packageName?: string;\n dependency: string;\n }) {\n const { packages } = this.#project.packageLock;\n return (\n (packageName\n ? packages[`node_modules/${packageName}/node_modules/${dependency}`]\n : undefined) ??\n packages[`node_modules/${dependency}`] ??\n {}\n );\n }\n\n private getTargetJsClientSdkVersion(packageName?: string) {\n const { dependencies = {}, peerDependencies = {} } = this.getResolvedDependency({\n packageName,\n dependency: LD_SERVICE,\n });\n\n return dependencies[JS_CLIENT_SDK] ?? peerDependencies[JS_CLIENT_SDK];\n }\n}\n"],"names":["RequireCompatibleLaunchDarklySdk","JS_CLIENT_SDK","LD_SERVICE","id","run","project","errors","checkPackages","checkPackage","length","checkProject","applyFilter","config","rules","data","name","fix","targetVersion","setVersion","packageName","dependency","version","forEach","command","execSync","stdio","actualVersion","getActualJsClientSdkVersion","getTargetJsClientSdkVersion","satisfies","createError","message","location","packageLock","params","details","formatDetails","fixable","FixCategory","isolated","lockFile","chalk","yellow","getResolvedDependency","packages","undefined","dependencies","peerDependencies"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { PackageError, PackageRule, Project } from '../types';
2
2
  export declare class RequireExplicitSideEffects implements PackageRule {
3
3
  get id(): string;
4
- run({ config, packages }: Project): PackageError[];
4
+ run(project: Project): PackageError[];
5
+ private readonly checkSideEffects;
5
6
  private needsSideEffects;
6
7
  }
7
8
  //# sourceMappingURL=require-explicit-side-effects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"require-explicit-side-effects.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-explicit-side-effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGtF,qBAAa,0BAA2B,YAAW,WAAW;IAC1D,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,YAAY,EAAE;IAelD,OAAO,CAAC,gBAAgB;CAO3B"}
1
+ {"version":3,"file":"require-explicit-side-effects.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-explicit-side-effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGtF,qBAAa,0BAA2B,YAAW,WAAW;IAC1D,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE;IAIrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAS/B;IAEF,OAAO,CAAC,gBAAgB;CAO3B"}
@@ -10,27 +10,40 @@ Object.defineProperty(exports, "RequireExplicitSideEffects", {
10
10
  });
11
11
  const _types = require("../types");
12
12
  const _utils = require("../utils");
13
+ function _define_property(obj, key, value) {
14
+ if (key in obj) {
15
+ Object.defineProperty(obj, key, {
16
+ value: value,
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true
20
+ });
21
+ } else {
22
+ obj[key] = value;
23
+ }
24
+ return obj;
25
+ }
13
26
  class RequireExplicitSideEffects {
14
27
  get id() {
15
28
  return 'require-explicit-side-effects';
16
29
  }
17
- run({ config, packages }) {
18
- var _config_rules;
19
- const ruleConfig = (_config_rules = config.rules) === null || _config_rules === void 0 ? void 0 : _config_rules[this.id];
20
- return (0, _utils.applyFilter)(ruleConfig, packages, ({ name })=>name).reduce((result, pkg)=>{
30
+ run(project) {
31
+ return (0, _utils.checkPackages)(this, project, this.checkSideEffects);
32
+ }
33
+ needsSideEffects(pkg) {
34
+ return (0, _utils.isLibrary)(pkg) && (pkg.main !== undefined || pkg.exports !== undefined) && pkg.sideEffects === undefined;
35
+ }
36
+ constructor(){
37
+ _define_property(this, "checkSideEffects", (pkg)=>{
21
38
  if (this.needsSideEffects(pkg)) {
22
- result.push({
39
+ return {
23
40
  id: this.id,
24
41
  message: `package "${pkg.name}" omits sideEffects property`,
25
42
  severity: _types.ErrorSeverity.warning,
26
43
  location: pkg.location
27
- });
44
+ };
28
45
  }
29
- return result;
30
- }, []);
31
- }
32
- needsSideEffects(pkg) {
33
- return (0, _utils.isLibrary)(pkg) && (pkg.main !== undefined || pkg.exports !== undefined) && pkg.sideEffects === undefined;
46
+ });
34
47
  }
35
48
  }
36
49
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-explicit-side-effects.ts"],"sourcesContent":["import { ErrorSeverity, Package, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, isLibrary } from '../utils';\n\nexport class RequireExplicitSideEffects implements PackageRule {\n get id() {\n return 'require-explicit-side-effects';\n }\n\n run({ config, packages }: Project): PackageError[] {\n const ruleConfig = config.rules?.[this.id];\n return applyFilter(ruleConfig, packages, ({ name }) => name).reduce((result, pkg) => {\n if (this.needsSideEffects(pkg)) {\n result.push({\n id: this.id,\n message: `package \"${pkg.name}\" omits sideEffects property`,\n severity: ErrorSeverity.warning,\n location: pkg.location,\n });\n }\n return result;\n }, [] as PackageError[]);\n }\n\n private needsSideEffects(pkg: Package) {\n return (\n isLibrary(pkg) &&\n (pkg.main !== undefined || pkg.exports !== undefined) &&\n pkg.sideEffects === undefined\n );\n }\n}\n"],"names":["RequireExplicitSideEffects","id","run","config","packages","ruleConfig","rules","applyFilter","name","reduce","result","pkg","needsSideEffects","push","message","severity","ErrorSeverity","warning","location","isLibrary","main","undefined","exports","sideEffects"],"mappings":";;;;+BAGaA;;;eAAAA;;;uBAH8D;uBACpC;AAEhC,MAAMA;IACT,IAAIC,KAAK;QACL,OAAO;IACX;IAEAC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAW,EAAkB;YAC5BD;QAAnB,MAAME,cAAaF,gBAAAA,OAAOG,KAAK,cAAZH,oCAAAA,aAAc,CAAC,IAAI,CAACF,EAAE,CAAC;QAC1C,OAAOM,IAAAA,kBAAW,EAACF,YAAYD,UAAU,CAAC,EAAEI,IAAI,EAAE,GAAKA,MAAMC,MAAM,CAAC,CAACC,QAAQC;YACzE,IAAI,IAAI,CAACC,gBAAgB,CAACD,MAAM;gBAC5BD,OAAOG,IAAI,CAAC;oBACRZ,IAAI,IAAI,CAACA,EAAE;oBACXa,SAAS,CAAC,SAAS,EAAEH,IAAIH,IAAI,CAAC,4BAA4B,CAAC;oBAC3DO,UAAUC,oBAAa,CAACC,OAAO;oBAC/BC,UAAUP,IAAIO,QAAQ;gBAC1B;YACJ;YACA,OAAOR;QACX,GAAG,EAAE;IACT;IAEQE,iBAAiBD,GAAY,EAAE;QACnC,OACIQ,IAAAA,gBAAS,EAACR,QACTA,CAAAA,IAAIS,IAAI,KAAKC,aAAaV,IAAIW,OAAO,KAAKD,SAAQ,KACnDV,IAAIY,WAAW,KAAKF;IAE5B;AACJ"}
1
+ {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-explicit-side-effects.ts"],"sourcesContent":["import { ErrorSeverity, Package, PackageError, PackageRule, Project } from '../types';\nimport { checkPackages, isLibrary } from '../utils';\n\nexport class RequireExplicitSideEffects implements PackageRule {\n get id() {\n return 'require-explicit-side-effects';\n }\n\n run(project: Project): PackageError[] {\n return checkPackages(this, project, this.checkSideEffects);\n }\n\n private readonly checkSideEffects = (pkg: Package) => {\n if (this.needsSideEffects(pkg)) {\n return {\n id: this.id,\n message: `package \"${pkg.name}\" omits sideEffects property`,\n severity: ErrorSeverity.warning,\n location: pkg.location,\n };\n }\n };\n\n private needsSideEffects(pkg: Package) {\n return (\n isLibrary(pkg) &&\n (pkg.main !== undefined || pkg.exports !== undefined) &&\n pkg.sideEffects === undefined\n );\n }\n}\n"],"names":["RequireExplicitSideEffects","id","run","project","checkPackages","checkSideEffects","needsSideEffects","pkg","isLibrary","main","undefined","exports","sideEffects","message","name","severity","ErrorSeverity","warning","location"],"mappings":";;;;+BAGaA;;;eAAAA;;;uBAH8D;uBAClC;;;;;;;;;;;;;;AAElC,MAAMA;IACT,IAAIC,KAAK;QACL,OAAO;IACX;IAEAC,IAAIC,OAAgB,EAAkB;QAClC,OAAOC,IAAAA,oBAAa,EAAC,IAAI,EAAED,SAAS,IAAI,CAACE,gBAAgB;IAC7D;IAaQC,iBAAiBC,GAAY,EAAE;QACnC,OACIC,IAAAA,gBAAS,EAACD,QACTA,CAAAA,IAAIE,IAAI,KAAKC,aAAaH,IAAII,OAAO,KAAKD,SAAQ,KACnDH,IAAIK,WAAW,KAAKF;IAE5B;;QAjBA,uBAAiBL,oBAAmB,CAACE;YACjC,IAAI,IAAI,CAACD,gBAAgB,CAACC,MAAM;gBAC5B,OAAO;oBACHN,IAAI,IAAI,CAACA,EAAE;oBACXY,SAAS,CAAC,SAAS,EAAEN,IAAIO,IAAI,CAAC,4BAA4B,CAAC;oBAC3DC,UAAUC,oBAAa,CAACC,OAAO;oBAC/BC,UAAUX,IAAIW,QAAQ;gBAC1B;YACJ;QACJ;;AASJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"require-one-collection-version.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-one-collection-version.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGpF,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,UAAU,QAAQ;IACd,CAAC,OAAO,EAAE,MAAM,GAAG;QACf,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACnC,CAAC;CACL;AAED,UAAU,SAAS;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,QAAQ,CAAC;CAC3B;AAQD,qBAAa,2BAA4B,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEnD,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS;IA0B1D,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO;IAoBvD,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAWvB"}
1
+ {"version":3,"file":"require-one-collection-version.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-one-collection-version.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGpF,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,UAAU,QAAQ;IACd,CAAC,OAAO,EAAE,MAAM,GAAG;QACf,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACnC,CAAC;CACL;AAED,UAAU,SAAS;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,QAAQ,CAAC;CAC3B;AAQD,qBAAa,2BAA4B,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAEnD,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS;IA0B1D,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO;IAoBvD,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAWvB"}
@@ -112,7 +112,7 @@ class RequireOneCollectionVersion {
112
112
  /**
113
113
  * Assumes first version is the most common and the other ones are extra (see sortVersions)
114
114
  */ getExtra(versions) {
115
- return new Set(Object.entries(versions).slice(1).flatMap(([_version, dependencies])=>Object.entries(dependencies).map(([pkg])=>pkg)));
115
+ return new Set(Object.entries(versions).slice(1).flatMap(([_version, dependencies])=>Object.keys(dependencies)));
116
116
  }
117
117
  /**
118
118
  * Orders details so that extraneous packages are at the top
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-one-collection-version.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { log } from '../../../../utils';\nimport { FixCategory, Package, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, compareVersion, formatDependsOn, nameToLocation, setVersion } from '../utils';\n\nexport interface Collection {\n name: string;\n packages: string[];\n}\n\n/**\n * Maps version number to packages with that version and their dependents.\n */\ninterface Versions {\n [version: string]: {\n [packageName: string]: string[];\n };\n}\n\ninterface ErrorData {\n targetVersion: string;\n otherVersions: Versions;\n}\n\ninterface ErrorDetail {\n dependents: string[];\n extra: boolean;\n packageName: string;\n}\n\nexport class RequireOneCollectionVersion implements PackageRule {\n constructor(private readonly collection: Collection) {}\n\n get id() {\n return `require-one-${this.collection.name}-version`;\n }\n\n run(project: Project): PackageError<ErrorData> | undefined {\n const versions = this.collateVersions(project);\n\n /* istanbul ignore next: debug only */\n log.debug(`review:${this.collection.name}-versions`, () =>\n JSON.stringify(versions, null, 2)\n );\n\n const keys = Object.keys(versions);\n if (keys.length <= 1) {\n return;\n }\n\n const message = `project depends on multiple versions of ${this.collection.name} packages`;\n const details = this.composeDetails(project, versions);\n const targetVersion = keys[0];\n const otherVersions = Object.fromEntries(Object.entries(versions).slice(1));\n return {\n id: this.id,\n message,\n details,\n fixable: FixCategory.normal,\n data: { targetVersion, otherVersions },\n };\n }\n\n fix({ data }: PackageError<ErrorData>, project: Project) {\n const { targetVersion, otherVersions } = data ?? {};\n if (!(targetVersion && otherVersions)) {\n return;\n }\n\n Object.values(otherVersions).forEach(packages => {\n Object.entries(packages).forEach(([name, dependents]) => {\n dependents.forEach(dependent =>\n setVersion({\n project,\n packageName: dependent,\n dependency: name,\n version: targetVersion,\n })\n );\n });\n });\n }\n\n private collateVersions(project: Project) {\n const dependencies = this.getDependencies(project);\n return this.sortVersions(\n this.collection.packages.reduce<Versions>((result, name) => {\n Object.entries(dependencies[name] ?? {}).forEach(([version, dependents]) => {\n result[version] ??= {};\n result[version][name] = dependents;\n });\n return result;\n }, {})\n );\n }\n\n private composeDetails({ packages }: Project, versions: Versions) {\n const extra = this.getExtra(versions);\n return this.sortDetails(this.getDetails(packages, versions, extra)).map(detail =>\n this.formatDetail(detail)\n );\n }\n\n private formatDetail({ dependents, packageName, extra }: ErrorDetail) {\n return formatDependsOn(dependents, chalk[extra ? 'red' : 'yellow'](packageName));\n }\n\n private getDependencies({ config, dependencies }: Project) {\n const ruleConfig = config.rules?.[this.id];\n return Object.fromEntries(\n applyFilter(ruleConfig, Object.entries(dependencies), ([name]) => name)\n ) as Project['dependencies'];\n }\n\n private getDetails(packages: Package[], versions: Versions, extra: Set<string>) {\n return Object.entries(versions).reduce((result, [version, dependencies]) => {\n Object.entries(dependencies).forEach(([pkg, dependents]) => {\n result.push({\n packageName: `${pkg}@${version}`,\n dependents: dependents.map(name => nameToLocation(name, packages)),\n extra: extra.has(pkg),\n });\n });\n return result;\n }, [] as ErrorDetail[]);\n }\n\n /**\n * Assumes first version is the most common and the other ones are extra (see sortVersions)\n */\n private getExtra(versions: Versions): Set<string> {\n return new Set(\n Object.entries(versions)\n .slice(1)\n .flatMap(([_version, dependencies]) =>\n Object.entries(dependencies).map(([pkg]) => pkg)\n )\n );\n }\n\n /**\n * Orders details so that extraneous packages are at the top\n */\n private sortDetails(details: ErrorDetail[]) {\n return details.sort((a, b) => {\n if (a.extra === b.extra) {\n return 0;\n }\n return a.extra === true ? -1 : 1;\n });\n }\n\n /**\n * Orders versions in descending order by the number of packages using the version\n * and then by version number. I.e., It puts most common version at the top and if\n * multiple versions tie for the top position, it puts the highest version first.\n */\n private sortVersions(versions: Versions): Versions {\n return Object.fromEntries(\n Object.entries(versions)\n .sort(\n ([v1, depsV1], [v2, depsV2]) =>\n Object.keys(depsV1).length - Object.keys(depsV2).length ||\n compareVersion(v1, v2)\n )\n .reverse()\n );\n }\n}\n"],"names":["RequireOneCollectionVersion","id","collection","name","run","project","versions","collateVersions","log","debug","JSON","stringify","keys","Object","length","message","details","composeDetails","targetVersion","otherVersions","fromEntries","entries","slice","fixable","FixCategory","normal","data","fix","values","forEach","packages","dependents","dependent","setVersion","packageName","dependency","version","dependencies","getDependencies","sortVersions","reduce","result","extra","getExtra","sortDetails","getDetails","map","detail","formatDetail","formatDependsOn","chalk","config","ruleConfig","rules","applyFilter","pkg","push","nameToLocation","has","Set","flatMap","_version","sort","a","b","v1","depsV1","v2","depsV2","compareVersion","reverse"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-one-collection-version.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { log } from '../../../../utils';\nimport { FixCategory, Package, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, compareVersion, formatDependsOn, nameToLocation, setVersion } from '../utils';\n\nexport interface Collection {\n name: string;\n packages: string[];\n}\n\n/**\n * Maps version number to packages with that version and their dependents.\n */\ninterface Versions {\n [version: string]: {\n [packageName: string]: string[];\n };\n}\n\ninterface ErrorData {\n targetVersion: string;\n otherVersions: Versions;\n}\n\ninterface ErrorDetail {\n dependents: string[];\n extra: boolean;\n packageName: string;\n}\n\nexport class RequireOneCollectionVersion implements PackageRule {\n constructor(private readonly collection: Collection) {}\n\n get id() {\n return `require-one-${this.collection.name}-version`;\n }\n\n run(project: Project): PackageError<ErrorData> | undefined {\n const versions = this.collateVersions(project);\n\n /* istanbul ignore next: debug only */\n log.debug(`review:${this.collection.name}-versions`, () =>\n JSON.stringify(versions, null, 2)\n );\n\n const keys = Object.keys(versions);\n if (keys.length <= 1) {\n return;\n }\n\n const message = `project depends on multiple versions of ${this.collection.name} packages`;\n const details = this.composeDetails(project, versions);\n const targetVersion = keys[0];\n const otherVersions = Object.fromEntries(Object.entries(versions).slice(1));\n return {\n id: this.id,\n message,\n details,\n fixable: FixCategory.normal,\n data: { targetVersion, otherVersions },\n };\n }\n\n fix({ data }: PackageError<ErrorData>, project: Project) {\n const { targetVersion, otherVersions } = data ?? {};\n if (!(targetVersion && otherVersions)) {\n return;\n }\n\n Object.values(otherVersions).forEach(packages => {\n Object.entries(packages).forEach(([name, dependents]) => {\n dependents.forEach(dependent =>\n setVersion({\n project,\n packageName: dependent,\n dependency: name,\n version: targetVersion,\n })\n );\n });\n });\n }\n\n private collateVersions(project: Project) {\n const dependencies = this.getDependencies(project);\n return this.sortVersions(\n this.collection.packages.reduce<Versions>((result, name) => {\n Object.entries(dependencies[name] ?? {}).forEach(([version, dependents]) => {\n result[version] ??= {};\n result[version][name] = dependents;\n });\n return result;\n }, {})\n );\n }\n\n private composeDetails({ packages }: Project, versions: Versions) {\n const extra = this.getExtra(versions);\n return this.sortDetails(this.getDetails(packages, versions, extra)).map(detail =>\n this.formatDetail(detail)\n );\n }\n\n private formatDetail({ dependents, packageName, extra }: ErrorDetail) {\n return formatDependsOn(dependents, chalk[extra ? 'red' : 'yellow'](packageName));\n }\n\n private getDependencies({ config, dependencies }: Project) {\n const ruleConfig = config.rules?.[this.id];\n return Object.fromEntries(\n applyFilter(ruleConfig, Object.entries(dependencies), ([name]) => name)\n ) as Project['dependencies'];\n }\n\n private getDetails(packages: Package[], versions: Versions, extra: Set<string>) {\n return Object.entries(versions).reduce((result, [version, dependencies]) => {\n Object.entries(dependencies).forEach(([pkg, dependents]) => {\n result.push({\n packageName: `${pkg}@${version}`,\n dependents: dependents.map(name => nameToLocation(name, packages)),\n extra: extra.has(pkg),\n });\n });\n return result;\n }, [] as ErrorDetail[]);\n }\n\n /**\n * Assumes first version is the most common and the other ones are extra (see sortVersions)\n */\n private getExtra(versions: Versions): Set<string> {\n return new Set(\n Object.entries(versions)\n .slice(1)\n .flatMap(([_version, dependencies]) => Object.keys(dependencies))\n );\n }\n\n /**\n * Orders details so that extraneous packages are at the top\n */\n private sortDetails(details: ErrorDetail[]) {\n return details.sort((a, b) => {\n if (a.extra === b.extra) {\n return 0;\n }\n return a.extra === true ? -1 : 1;\n });\n }\n\n /**\n * Orders versions in descending order by the number of packages using the version\n * and then by version number. I.e., It puts most common version at the top and if\n * multiple versions tie for the top position, it puts the highest version first.\n */\n private sortVersions(versions: Versions): Versions {\n return Object.fromEntries(\n Object.entries(versions)\n .sort(\n ([v1, depsV1], [v2, depsV2]) =>\n Object.keys(depsV1).length - Object.keys(depsV2).length ||\n compareVersion(v1, v2)\n )\n .reverse()\n );\n }\n}\n"],"names":["RequireOneCollectionVersion","id","collection","name","run","project","versions","collateVersions","log","debug","JSON","stringify","keys","Object","length","message","details","composeDetails","targetVersion","otherVersions","fromEntries","entries","slice","fixable","FixCategory","normal","data","fix","values","forEach","packages","dependents","dependent","setVersion","packageName","dependency","version","dependencies","getDependencies","sortVersions","reduce","result","extra","getExtra","sortDetails","getDetails","map","detail","formatDetail","formatDependsOn","chalk","config","ruleConfig","rules","applyFilter","pkg","push","nameToLocation","has","Set","flatMap","_version","sort","a","b","v1","depsV1","v2","depsV2","compareVersion","reverse"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"require-project-version-in-root-node-modules.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAK3E,UAAU,QAAQ;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,SAAS;IACf,UAAU,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAED,qBAAa,sCAAuC,YAAW,WAAW;IACtE,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS;IAgB1D,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO;IAwCvD,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,eAAe;CAI1B"}
1
+ {"version":3,"file":"require-project-version-in-root-node-modules.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAK3E,UAAU,QAAQ;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,SAAS;IACf,UAAU,EAAE,QAAQ,EAAE,CAAC;CAC1B;AAED,qBAAa,sCAAuC,YAAW,WAAW;IACtE,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,SAAS;IAgB1D,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO;IAoCvD,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,eAAe;CAI1B"}
@@ -59,13 +59,11 @@ class RequireProjectVersionInRootNodeModules {
59
59
  return;
60
60
  }
61
61
  /* istanbul ignore next: debug only */ _utils1.log.debug(`review:${this.id}`, ()=>JSON.stringify(dependencies, null, 2));
62
- entries.forEach(([name, version])=>(0, _child_process.execSync)(`npm pkg set dependencies["${name}"]="${version}"`, {
63
- stdio: 'inherit'
64
- }));
65
- (0, _child_process.execSync)('npx startup install --fix --quiet', {
66
- stdio: 'inherit'
67
- });
68
- entries.forEach(([name])=>(0, _child_process.execSync)(`npm pkg delete dependencies["${name}"]`, {
62
+ [
63
+ ...entries.map(([name, version])=>`npm pkg set dependencies["${name}"]="${version}"`),
64
+ 'npx startup install --fix --quiet',
65
+ ...entries.map(([name])=>`npm pkg delete dependencies["${name}"]`)
66
+ ].forEach((command)=>(0, _child_process.execSync)(command, {
69
67
  stdio: 'inherit'
70
68
  }));
71
69
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { satisfies } from 'semver';\nimport { FixCategory, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, getKey, getMaxVersion } from '../utils';\nimport { execSync } from 'child_process';\nimport { log } from '../../../../utils';\n\ninterface Mismatch {\n name: string;\n projectVersions: string[];\n rootVersion: string;\n}\n\ninterface ErrorData {\n mismatches: Mismatch[];\n}\n\nexport class RequireProjectVersionInRootNodeModules implements PackageRule {\n get id() {\n return 'require-project-version-in-root-node-modules';\n }\n\n run(project: Project): PackageError<ErrorData> | undefined {\n const mismatches = this.findMismatches(project);\n if (!mismatches.length) {\n return;\n }\n\n return {\n id: this.id,\n message: 'project has unexpected version in root node_modules',\n details: this.formatDetails(mismatches),\n fixable: FixCategory.lockFile,\n location: project.packageLock.location,\n data: { mismatches },\n };\n }\n\n fix({ data }: PackageError<ErrorData>, project: Project) {\n const { mismatches } = data ?? {};\n if (!mismatches) {\n return;\n }\n\n const root = project.packages.find(({ location }) => location === '.');\n if (!root) {\n return;\n }\n\n const dependencies = mismatches.reduce<Record<string, string>>(\n (result, { name, projectVersions }) => {\n if (!getKey(root, name)) {\n result[name] = getMaxVersion(projectVersions);\n }\n return result;\n },\n {}\n );\n\n const entries = Object.entries(dependencies);\n if (entries.length === 0) {\n return;\n }\n\n /* istanbul ignore next: debug only */\n log.debug(`review:${this.id}`, () => JSON.stringify(dependencies, null, 2));\n\n entries.forEach(([name, version]) =>\n execSync(`npm pkg set dependencies[\"${name}\"]=\"${version}\"`, { stdio: 'inherit' })\n );\n\n execSync('npx startup install --fix --quiet', { stdio: 'inherit' });\n\n entries.forEach(([name]) =>\n execSync(`npm pkg delete dependencies[\"${name}\"]`, { stdio: 'inherit' })\n );\n }\n\n private formatDetails(mismatches: Mismatch[]) {\n return mismatches.map(({ name, projectVersions, rootVersion }) => {\n const pkg = chalk.yellow(`${name}@${rootVersion}`);\n return `${pkg} does not match ${chalk.yellow(projectVersions.join(', '))}`;\n });\n }\n\n private findMismatches(project: Project) {\n const { packageLock } = project;\n return this.getDependencies(project).reduce((result, [name, versions]) => {\n const rootVersion = packageLock.packages[`node_modules/${name}`]?.version;\n if (rootVersion) {\n const projectVersions = Object.keys(versions);\n if (!projectVersions.some(version => satisfies(rootVersion, version))) {\n result.push({ name, projectVersions, rootVersion });\n }\n }\n return result;\n }, [] as Mismatch[]);\n }\n\n private getDependencies({ config, dependencies }: Project) {\n const ruleConfig = config.rules?.[this.id];\n return applyFilter(ruleConfig, Object.entries(dependencies), ([name]) => name);\n }\n}\n"],"names":["RequireProjectVersionInRootNodeModules","id","run","project","mismatches","findMismatches","length","message","details","formatDetails","fixable","FixCategory","lockFile","location","packageLock","data","fix","root","packages","find","dependencies","reduce","result","name","projectVersions","getKey","getMaxVersion","entries","Object","log","debug","JSON","stringify","forEach","version","execSync","stdio","map","rootVersion","pkg","chalk","yellow","join","getDependencies","versions","keys","some","satisfies","push","config","ruleConfig","rules","applyFilter"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-project-version-in-root-node-modules.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { satisfies } from 'semver';\nimport { FixCategory, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, getKey, getMaxVersion } from '../utils';\nimport { execSync } from 'child_process';\nimport { log } from '../../../../utils';\n\ninterface Mismatch {\n name: string;\n projectVersions: string[];\n rootVersion: string;\n}\n\ninterface ErrorData {\n mismatches: Mismatch[];\n}\n\nexport class RequireProjectVersionInRootNodeModules implements PackageRule {\n get id() {\n return 'require-project-version-in-root-node-modules';\n }\n\n run(project: Project): PackageError<ErrorData> | undefined {\n const mismatches = this.findMismatches(project);\n if (!mismatches.length) {\n return;\n }\n\n return {\n id: this.id,\n message: 'project has unexpected version in root node_modules',\n details: this.formatDetails(mismatches),\n fixable: FixCategory.lockFile,\n location: project.packageLock.location,\n data: { mismatches },\n };\n }\n\n fix({ data }: PackageError<ErrorData>, project: Project) {\n const { mismatches } = data ?? {};\n if (!mismatches) {\n return;\n }\n\n const root = project.packages.find(({ location }) => location === '.');\n if (!root) {\n return;\n }\n\n const dependencies = mismatches.reduce<Record<string, string>>(\n (result, { name, projectVersions }) => {\n if (!getKey(root, name)) {\n result[name] = getMaxVersion(projectVersions);\n }\n return result;\n },\n {}\n );\n\n const entries = Object.entries(dependencies);\n if (entries.length === 0) {\n return;\n }\n\n /* istanbul ignore next: debug only */\n log.debug(`review:${this.id}`, () => JSON.stringify(dependencies, null, 2));\n\n [\n ...entries.map(([name, version]) => `npm pkg set dependencies[\"${name}\"]=\"${version}\"`),\n 'npx startup install --fix --quiet',\n ...entries.map(([name]) => `npm pkg delete dependencies[\"${name}\"]`),\n ].forEach(command => execSync(command, { stdio: 'inherit' }));\n }\n\n private formatDetails(mismatches: Mismatch[]) {\n return mismatches.map(({ name, projectVersions, rootVersion }) => {\n const pkg = chalk.yellow(`${name}@${rootVersion}`);\n return `${pkg} does not match ${chalk.yellow(projectVersions.join(', '))}`;\n });\n }\n\n private findMismatches(project: Project) {\n const { packageLock } = project;\n return this.getDependencies(project).reduce((result, [name, versions]) => {\n const rootVersion = packageLock.packages[`node_modules/${name}`]?.version;\n if (rootVersion) {\n const projectVersions = Object.keys(versions);\n if (!projectVersions.some(version => satisfies(rootVersion, version))) {\n result.push({ name, projectVersions, rootVersion });\n }\n }\n return result;\n }, [] as Mismatch[]);\n }\n\n private getDependencies({ config, dependencies }: Project) {\n const ruleConfig = config.rules?.[this.id];\n return applyFilter(ruleConfig, Object.entries(dependencies), ([name]) => name);\n }\n}\n"],"names":["RequireProjectVersionInRootNodeModules","id","run","project","mismatches","findMismatches","length","message","details","formatDetails","fixable","FixCategory","lockFile","location","packageLock","data","fix","root","packages","find","dependencies","reduce","result","name","projectVersions","getKey","getMaxVersion","entries","Object","log","debug","JSON","stringify","map","version","forEach","command","execSync","stdio","rootVersion","pkg","chalk","yellow","join","getDependencies","versions","keys","some","satisfies","push","config","ruleConfig","rules","applyFilter"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { PackageError, PackageRule, Project } from '../types';
2
2
  export declare class RequireServiceTitanScope implements PackageRule {
3
3
  get id(): string;
4
- run({ config, packages }: Project): PackageError[];
4
+ run(project: Project): PackageError[];
5
+ private readonly checkScope;
5
6
  private needsScope;
6
7
  }
7
8
  //# sourceMappingURL=require-servicetitan-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"require-servicetitan-scope.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-servicetitan-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGtF,qBAAa,wBAAyB,YAAW,WAAW;IACxD,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,YAAY,EAAE;IAelD,OAAO,CAAC,UAAU;CAGrB"}
1
+ {"version":3,"file":"require-servicetitan-scope.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/rules/require-servicetitan-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGtF,qBAAa,wBAAyB,YAAW,WAAW;IACxD,IAAI,EAAE,WAEL;IAED,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,EAAE;IAIrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CASzB;IAEF,OAAO,CAAC,UAAU;CAGrB"}
@@ -10,27 +10,40 @@ Object.defineProperty(exports, "RequireServiceTitanScope", {
10
10
  });
11
11
  const _types = require("../types");
12
12
  const _utils = require("../utils");
13
+ function _define_property(obj, key, value) {
14
+ if (key in obj) {
15
+ Object.defineProperty(obj, key, {
16
+ value: value,
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true
20
+ });
21
+ } else {
22
+ obj[key] = value;
23
+ }
24
+ return obj;
25
+ }
13
26
  class RequireServiceTitanScope {
14
27
  get id() {
15
28
  return 'require-servicetitan-scope';
16
29
  }
17
- run({ config, packages }) {
18
- var _config_rules;
19
- const ruleConfig = (_config_rules = config.rules) === null || _config_rules === void 0 ? void 0 : _config_rules[this.id];
20
- return (0, _utils.applyFilter)(ruleConfig, packages, ({ name })=>name).reduce((result, pkg)=>{
30
+ run(project) {
31
+ return (0, _utils.checkPackages)(this, project, this.checkScope);
32
+ }
33
+ needsScope(pkg) {
34
+ return (0, _utils.isLibrary)(pkg) && pkg.private !== true && !pkg.name.startsWith('@servicetitan/');
35
+ }
36
+ constructor(){
37
+ _define_property(this, "checkScope", (pkg)=>{
21
38
  if (this.needsScope(pkg)) {
22
- result.push({
39
+ return {
23
40
  id: this.id,
24
41
  message: `package "${pkg.name}" should have @servicetitan scope`,
25
42
  severity: _types.ErrorSeverity.warning,
26
43
  location: pkg.location
27
- });
44
+ };
28
45
  }
29
- return result;
30
- }, []);
31
- }
32
- needsScope(pkg) {
33
- return (0, _utils.isLibrary)(pkg) && pkg.private !== true && !pkg.name.startsWith('@servicetitan/');
46
+ });
34
47
  }
35
48
  }
36
49
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-servicetitan-scope.ts"],"sourcesContent":["import { ErrorSeverity, Package, PackageError, PackageRule, Project } from '../types';\nimport { applyFilter, isLibrary } from '../utils';\n\nexport class RequireServiceTitanScope implements PackageRule {\n get id() {\n return 'require-servicetitan-scope';\n }\n\n run({ config, packages }: Project): PackageError[] {\n const ruleConfig = config.rules?.[this.id];\n return applyFilter(ruleConfig, packages, ({ name }) => name).reduce((result, pkg) => {\n if (this.needsScope(pkg)) {\n result.push({\n id: this.id,\n message: `package \"${pkg.name}\" should have @servicetitan scope`,\n severity: ErrorSeverity.warning,\n location: pkg.location,\n });\n }\n return result;\n }, [] as PackageError[]);\n }\n\n private needsScope(pkg: Package) {\n return isLibrary(pkg) && pkg.private !== true && !pkg.name.startsWith('@servicetitan/');\n }\n}\n"],"names":["RequireServiceTitanScope","id","run","config","packages","ruleConfig","rules","applyFilter","name","reduce","result","pkg","needsScope","push","message","severity","ErrorSeverity","warning","location","isLibrary","private","startsWith"],"mappings":";;;;+BAGaA;;;eAAAA;;;uBAH8D;uBACpC;AAEhC,MAAMA;IACT,IAAIC,KAAK;QACL,OAAO;IACX;IAEAC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAW,EAAkB;YAC5BD;QAAnB,MAAME,cAAaF,gBAAAA,OAAOG,KAAK,cAAZH,oCAAAA,aAAc,CAAC,IAAI,CAACF,EAAE,CAAC;QAC1C,OAAOM,IAAAA,kBAAW,EAACF,YAAYD,UAAU,CAAC,EAAEI,IAAI,EAAE,GAAKA,MAAMC,MAAM,CAAC,CAACC,QAAQC;YACzE,IAAI,IAAI,CAACC,UAAU,CAACD,MAAM;gBACtBD,OAAOG,IAAI,CAAC;oBACRZ,IAAI,IAAI,CAACA,EAAE;oBACXa,SAAS,CAAC,SAAS,EAAEH,IAAIH,IAAI,CAAC,iCAAiC,CAAC;oBAChEO,UAAUC,oBAAa,CAACC,OAAO;oBAC/BC,UAAUP,IAAIO,QAAQ;gBAC1B;YACJ;YACA,OAAOR;QACX,GAAG,EAAE;IACT;IAEQE,WAAWD,GAAY,EAAE;QAC7B,OAAOQ,IAAAA,gBAAS,EAACR,QAAQA,IAAIS,OAAO,KAAK,QAAQ,CAACT,IAAIH,IAAI,CAACa,UAAU,CAAC;IAC1E;AACJ"}
1
+ {"version":3,"sources":["../../../../../src/cli/commands/review/rules/require-servicetitan-scope.ts"],"sourcesContent":["import { ErrorSeverity, Package, PackageError, PackageRule, Project } from '../types';\nimport { checkPackages, isLibrary } from '../utils';\n\nexport class RequireServiceTitanScope implements PackageRule {\n get id() {\n return 'require-servicetitan-scope';\n }\n\n run(project: Project): PackageError[] {\n return checkPackages(this, project, this.checkScope);\n }\n\n private readonly checkScope = (pkg: Package) => {\n if (this.needsScope(pkg)) {\n return {\n id: this.id,\n message: `package \"${pkg.name}\" should have @servicetitan scope`,\n severity: ErrorSeverity.warning,\n location: pkg.location,\n };\n }\n };\n\n private needsScope(pkg: Package) {\n return isLibrary(pkg) && pkg.private !== true && !pkg.name.startsWith('@servicetitan/');\n }\n}\n"],"names":["RequireServiceTitanScope","id","run","project","checkPackages","checkScope","needsScope","pkg","isLibrary","private","name","startsWith","message","severity","ErrorSeverity","warning","location"],"mappings":";;;;+BAGaA;;;eAAAA;;;uBAH8D;uBAClC;;;;;;;;;;;;;;AAElC,MAAMA;IACT,IAAIC,KAAK;QACL,OAAO;IACX;IAEAC,IAAIC,OAAgB,EAAkB;QAClC,OAAOC,IAAAA,oBAAa,EAAC,IAAI,EAAED,SAAS,IAAI,CAACE,UAAU;IACvD;IAaQC,WAAWC,GAAY,EAAE;QAC7B,OAAOC,IAAAA,gBAAS,EAACD,QAAQA,IAAIE,OAAO,KAAK,QAAQ,CAACF,IAAIG,IAAI,CAACC,UAAU,CAAC;IAC1E;;QAbA,uBAAiBN,cAAa,CAACE;YAC3B,IAAI,IAAI,CAACD,UAAU,CAACC,MAAM;gBACtB,OAAO;oBACHN,IAAI,IAAI,CAACA,EAAE;oBACXW,SAAS,CAAC,SAAS,EAAEL,IAAIG,IAAI,CAAC,iCAAiC,CAAC;oBAChEG,UAAUC,oBAAa,CAACC,OAAO;oBAC/BC,UAAUT,IAAIS,QAAQ;gBAC1B;YACJ;QACJ;;AAKJ"}
@@ -9,6 +9,8 @@ export interface Project {
9
9
  packageLock: {
10
10
  packages: Record<string, {
11
11
  version: string;
12
+ dependencies?: Record<string, string>;
13
+ peerDependencies?: Record<string, string>;
12
14
  }>;
13
15
  location: string;
14
16
  };
@@ -34,6 +36,7 @@ export interface Package {
34
36
  main?: string;
35
37
  module?: string;
36
38
  name: string;
39
+ peerDependencies?: Record<string, string>;
37
40
  private?: boolean;
38
41
  sideEffects?: any;
39
42
  workspaces?: string[];
@@ -65,7 +68,7 @@ export interface ReviewConfiguration {
65
68
  };
66
69
  }
67
70
  export type RuleConfiguration = Level | [Level] | [Level, {
68
- exclude?: string[];
71
+ exclude?: string[] | Record<string, string[]>;
69
72
  }];
70
73
  export type Level = 'warn' | 'error' | 'off';
71
74
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review/types.ts"],"names":[],"mappings":"AAAA,8BAAsB,WAAW;IAC7B,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,EAAE,GAAG,SAAS;IACzE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAC7D;AAED,MAAM,WAAW,OAAO;IACpB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAE3B,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACjF,QAAQ,EAAE,OAAO,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,CAAC,WAAW,EAAE,MAAM,GAAG;QACnB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC/B,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACpB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,UAAU,UAAU;IAChB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACjC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED,oBAAY,aAAa;IACrB,KAAK,IAAI;IACT,OAAO,IAAI;CACd;AAED,oBAAY,WAAW;IACnB,QAAQ,aAAa,CAAE,0EAA0E;IACjG,MAAM,WAAW,CAAE,6DAA6D;IAChF,QAAQ,aAAa;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC;AAElF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/review/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/cli/commands/review/types.ts"],"sourcesContent":["export abstract class PackageRule {\n abstract get id(): string;\n abstract run(project: Project): PackageError | PackageError[] | undefined;\n abstract fix?(error: PackageError, project: Project): void;\n}\n\nexport interface Project {\n config: ReviewConfiguration;\n dependencies: Dependencies;\n // Only using this subset of package-lock.json\n packageLock: { packages: Record<string, { version: string }>; location: string };\n packages: Package[];\n}\n\n/**\n * Maps package name to versions and dependents of those versions.\n */\nexport interface Dependencies {\n [packageName: string]: {\n [version: string]: string[];\n };\n}\n\n/**\n * Subset of package.json used by rules\n */\nexport interface Package {\n cli?: CliOptions;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n exports?: string | Record<string, string | Record<string, string>> | null;\n location: string;\n main?: string;\n module?: string;\n name: string;\n private?: boolean;\n sideEffects?: any;\n workspaces?: string[];\n}\n\ninterface CliOptions {\n webpack?: false | Record<string, any>;\n}\n\nexport interface PackageError<T = any> {\n data?: T;\n details?: string | string[];\n fixable?: FixCategory;\n id: string;\n location?: string;\n message: string;\n severity?: ErrorSeverity;\n}\n\nexport enum ErrorSeverity {\n error = 1,\n warning = 2,\n}\n\nexport enum FixCategory {\n isolated = 'isolated', // fix examines and changes at most one dependency or package.json, if any\n normal = 'normal', // fix potentially examines and changes multiple dependencies\n lockFile = 'lockFile', // fix examines and changes package-lock.json\n}\n\nexport interface ReviewConfiguration {\n rules?: { [id: string]: RuleConfiguration };\n}\n\nexport type RuleConfiguration = Level | [Level] | [Level, { exclude?: string[] }];\n\nexport type Level = 'warn' | 'error' | 'off';\n"],"names":["ErrorSeverity","FixCategory","PackageRule"],"mappings":";;;;;;;;;;;QAsDYA;eAAAA;;QAKAC;eAAAA;;QA3DUC;eAAAA;;;AAAf,MAAeA;AAItB;AAkDO,IAAA,AAAKF,uCAAAA;;;WAAAA;;AAKL,IAAA,AAAKC,qCAAAA;;;;WAAAA"}
1
+ {"version":3,"sources":["../../../../src/cli/commands/review/types.ts"],"sourcesContent":["export abstract class PackageRule {\n abstract get id(): string;\n abstract run(project: Project): PackageError | PackageError[] | undefined;\n abstract fix?(error: PackageError, project: Project): void;\n}\n\nexport interface Project {\n config: ReviewConfiguration;\n dependencies: Dependencies;\n // Only using this subset of package-lock.json\n packageLock: {\n packages: Record<\n string,\n {\n version: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n }\n >;\n location: string;\n };\n packages: Package[];\n}\n\n/**\n * Maps package name to versions and dependents of those versions.\n */\nexport interface Dependencies {\n [packageName: string]: {\n [version: string]: string[];\n };\n}\n\n/**\n * Subset of package.json used by rules\n */\nexport interface Package {\n cli?: CliOptions;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n exports?: string | Record<string, string | Record<string, string>> | null;\n location: string;\n main?: string;\n module?: string;\n name: string;\n peerDependencies?: Record<string, string>;\n private?: boolean;\n sideEffects?: any;\n workspaces?: string[];\n}\n\ninterface CliOptions {\n webpack?: false | Record<string, any>;\n}\n\nexport interface PackageError<T = any> {\n data?: T;\n details?: string | string[];\n fixable?: FixCategory;\n id: string;\n location?: string;\n message: string;\n severity?: ErrorSeverity;\n}\n\nexport enum ErrorSeverity {\n error = 1,\n warning = 2,\n}\n\nexport enum FixCategory {\n isolated = 'isolated', // fix examines and changes at most one dependency or package.json, if any\n normal = 'normal', // fix potentially examines and changes multiple dependencies\n lockFile = 'lockFile', // fix examines and changes package-lock.json\n}\n\nexport interface ReviewConfiguration {\n rules?: { [id: string]: RuleConfiguration };\n}\n\nexport type RuleConfiguration =\n | Level\n | [Level]\n | [Level, { exclude?: string[] | Record<string, string[]> }];\n\nexport type Level = 'warn' | 'error' | 'off';\n"],"names":["ErrorSeverity","FixCategory","PackageRule"],"mappings":";;;;;;;;;;;QAiEYA;eAAAA;;QAKAC;eAAAA;;QAtEUC;eAAAA;;;AAAf,MAAeA;AAItB;AA6DO,IAAA,AAAKF,uCAAAA;;;WAAAA;;AAKL,IAAA,AAAKC,qCAAAA;;;;WAAAA"}
@@ -0,0 +1,7 @@
1
+ import { Package, PackageError, Project } from '../types';
2
+ type CheckFn<T> = (pkg: Package) => PackageError<T>[] | PackageError<T> | undefined;
3
+ export declare function checkPackages<T>({ id }: {
4
+ id?: string;
5
+ }, { config, packages }: Project, fn: CheckFn<T>): PackageError<T>[];
6
+ export {};
7
+ //# sourceMappingURL=check-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-packages.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/review/utils/check-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1D,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEpF,wBAAgB,aAAa,CAAC,CAAC,EAC3B,EAAE,EAAE,EAAE,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACvB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAC7B,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,qBAUjB"}