@rushstack/eslint-plugin-packlets 0.3.0 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -1,6 +1,59 @@
1
1
  {
2
2
  "name": "@rushstack/eslint-plugin-packlets",
3
3
  "entries": [
4
+ {
5
+ "version": "0.3.4",
6
+ "tag": "@rushstack/eslint-plugin-packlets_v0.3.4",
7
+ "date": "Mon, 06 Dec 2021 16:08:32 GMT",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "comment": "Add support for ESLint v8"
12
+ }
13
+ ]
14
+ }
15
+ },
16
+ {
17
+ "version": "0.3.3",
18
+ "tag": "@rushstack/eslint-plugin-packlets_v0.3.3",
19
+ "date": "Wed, 27 Oct 2021 00:08:15 GMT",
20
+ "comments": {
21
+ "patch": [
22
+ {
23
+ "comment": "Update the package.json repository field to include the directory property."
24
+ }
25
+ ],
26
+ "dependency": [
27
+ {
28
+ "comment": "Updating dependency \"@rushstack/tree-pattern\" to `0.2.2`"
29
+ }
30
+ ]
31
+ }
32
+ },
33
+ {
34
+ "version": "0.3.2",
35
+ "tag": "@rushstack/eslint-plugin-packlets_v0.3.2",
36
+ "date": "Thu, 07 Oct 2021 07:13:35 GMT",
37
+ "comments": {
38
+ "patch": [
39
+ {
40
+ "comment": "Update typescript-eslint to add support for TypeScript 4.4."
41
+ }
42
+ ]
43
+ }
44
+ },
45
+ {
46
+ "version": "0.3.1",
47
+ "tag": "@rushstack/eslint-plugin-packlets_v0.3.1",
48
+ "date": "Thu, 23 Sep 2021 00:10:40 GMT",
49
+ "comments": {
50
+ "patch": [
51
+ {
52
+ "comment": "Upgrade the `@types/node` dependency to version to version 12."
53
+ }
54
+ ]
55
+ }
56
+ },
4
57
  {
5
58
  "version": "0.3.0",
6
59
  "tag": "@rushstack/eslint-plugin-packlets_v0.3.0",
package/CHANGELOG.md CHANGED
@@ -1,6 +1,34 @@
1
1
  # Change Log - @rushstack/eslint-plugin-packlets
2
2
 
3
- This log was last generated on Mon, 12 Jul 2021 23:08:26 GMT and should not be manually modified.
3
+ This log was last generated on Mon, 06 Dec 2021 16:08:32 GMT and should not be manually modified.
4
+
5
+ ## 0.3.4
6
+ Mon, 06 Dec 2021 16:08:32 GMT
7
+
8
+ ### Patches
9
+
10
+ - Add support for ESLint v8
11
+
12
+ ## 0.3.3
13
+ Wed, 27 Oct 2021 00:08:15 GMT
14
+
15
+ ### Patches
16
+
17
+ - Update the package.json repository field to include the directory property.
18
+
19
+ ## 0.3.2
20
+ Thu, 07 Oct 2021 07:13:35 GMT
21
+
22
+ ### Patches
23
+
24
+ - Update typescript-eslint to add support for TypeScript 4.4.
25
+
26
+ ## 0.3.1
27
+ Thu, 23 Sep 2021 00:10:40 GMT
28
+
29
+ ### Patches
30
+
31
+ - Upgrade the `@types/node` dependency to version to version 12.
4
32
 
5
33
  ## 0.3.0
6
34
  Mon, 12 Jul 2021 23:08:26 GMT
package/README.md CHANGED
@@ -143,7 +143,7 @@ require('@rushstack/eslint-config/patch/modern-module-resolution');
143
143
  module.exports = {
144
144
  extends: [
145
145
  "@rushstack/eslint-config/profile/node",
146
- "@rushstack/eslint-config/profile/mixins/packlets" // <--- ADD THIS
146
+ "@rushstack/eslint-config/mixins/packlets" // <--- ADD THIS
147
147
  ],
148
148
  parserOptions: { tsconfigRootDir: __dirname }
149
149
  };
@@ -171,7 +171,7 @@ require('@rushstack/eslint-config/patch/modern-module-resolution');
171
171
  module.exports = {
172
172
  extends: [
173
173
  "@rushstack/eslint-config/profile/node",
174
- "@rushstack/eslint-config/profile/mixins/packlets"
174
+ "@rushstack/eslint-config/mixins/packlets"
175
175
  ],
176
176
  parserOptions: { tsconfigRootDir: __dirname },
177
177
  overrides: [
@@ -1 +1 @@
1
- {"version":3,"file":"circular-deps.d.ts","sourceRoot":"","sources":["../src/circular-deps.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAOhG,oBAAY,UAAU,GAAG,iBAAiB,CAAC;AAC3C,aAAK,OAAO,GAAG,EAAE,CAAC;AAElB,QAAA,MAAM,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAyE1D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"circular-deps.d.ts","sourceRoot":"","sources":["../src/circular-deps.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkB,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAOhG,oBAAY,UAAU,GAAG,iBAAiB,CAAC;AAC3C,aAAK,OAAO,GAAG,EAAE,CAAC;AAElB,QAAA,MAAM,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA0E1D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -19,6 +19,7 @@ const circularDeps = {
19
19
  ],
20
20
  docs: {
21
21
  description: 'Check for circular dependencies between packlets',
22
+ // Deprecated in ESLint v8; Keep for backwards compatibility
22
23
  category: 'Best Practices',
23
24
  recommended: 'warn',
24
25
  url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'
@@ -1 +1 @@
1
- {"version":3,"file":"circular-deps.js","sourceRoot":"","sources":["../src/circular-deps.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAM3D,8EAAoE;AAEpE,uDAAoD;AACpD,6DAA0E;AAC1E,iCAA8B;AAK9B,MAAM,YAAY,GAA6C;IAC7D,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,EAAE,iBAAiB,EAAE,0DAA0D,EAAE;QAC3F,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE,iEAAiE;SACvE;KACF;IAED,MAAM,EAAE,CAAC,OAAkD,EAAE,EAAE;QAC7D,gEAAgE;QAChE,MAAM,aAAa,GAAW,OAAO,CAAC,WAAW,EAAE,CAAC;QAEpD,6CAA6C;QAC7C,MAAM,OAAO,GAAe,gCAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QAC3E,MAAM,gBAAgB,GAAuB,OAAO,CAAC,kBAAkB,EAAE,CAAC,gBAAgB,CAAW,CAAC;QAEtG,MAAM,eAAe,GAAoB,iCAAe,CAAC,gBAAgB,CACvE,aAAa,EACb,gBAAgB,CACjB,CAAC;QACF,IAAI,eAAe,CAAC,WAAW,EAAE;YAC/B,OAAO,EAAE,CAAC;SACX;QAED,OAAO;YACL,mGAAmG;YACnG,yGAAyG;YACzG,gDAAgD;YAChD,OAAO,EAAE,CAAC,IAAmB,EAAQ,EAAE;gBACrC,IAAI,eAAe,CAAC,YAAY,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;oBAC1D,MAAM,cAAc,GAClB,uCAAkB,CAAC,gCAAgC,CACjD,eAAe,CAAC,oBAAqB,EACrC,eAAe,EACf,OAAO,CACR,CAAC;oBAEJ,IAAI,cAAc,EAAE;wBAClB,MAAM,kBAAkB,GAAW,WAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;wBAElE,MAAM,oBAAoB,GAAa,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;wBAEhF,wGAAwG;wBACxG,4EAA4E;wBAC5E,oBAAoB,CAAC,IAAI,EAAE,CAAC;wBAC5B,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,oBAAoB,EAAE;4BACpE,IAAI,MAAM,GAAW,EAAE,CAAC;4BACxB,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;gCAC1C,MAAM,QAAQ,GAAW,WAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;gCACvF,MAAM,IAAI,IAAI,aAAa,CAAC,WAAW,sBAAsB,QAAQ,IAAI,CAAC;6BAC3E;4BAED,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI,EAAE,IAAI;gCACV,SAAS,EAAE,iBAAiB;gCAC5B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;6BACzB,CAAC,CAAC;yBACJ;qBACF;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEO,oCAAY","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport type * as ts from 'typescript';\r\nimport * as path from 'path';\r\n\r\nimport type { ParserServices, TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer } from './PackletAnalyzer';\r\nimport { DependencyAnalyzer, IPackletImport } from './DependencyAnalyzer';\r\nimport { Path } from './Path';\r\n\r\nexport type MessageIds = 'circular-import';\r\ntype Options = [];\r\n\r\nconst circularDeps: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: { 'circular-import': 'Packlet imports create a circular reference:\\n{{report}}' },\r\n schema: [\r\n {\r\n type: 'object',\r\n additionalProperties: false\r\n }\r\n ],\r\n docs: {\r\n description: 'Check for circular dependencies between packlets',\r\n category: 'Best Practices',\r\n recommended: 'warn',\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n }\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const program: ts.Program = ESLintUtils.getParserServices(context).program;\r\n const tsconfigFilePath: string | undefined = program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n if (packletAnalyzer.nothingToDo) {\r\n return {};\r\n }\r\n\r\n return {\r\n // Match the first node in the source file. Ideally we should be matching \"Program > :first-child\"\r\n // so a warning doesn't highlight the whole file. But that's blocked behind a bug in the query selector:\r\n // https://github.com/estools/esquery/issues/114\r\n Program: (node: TSESTree.Node): void => {\r\n if (packletAnalyzer.isEntryPoint && !packletAnalyzer.error) {\r\n const packletImports: IPackletImport[] | undefined =\r\n DependencyAnalyzer.checkEntryPointForCircularImport(\r\n packletAnalyzer.inputFilePackletName!,\r\n packletAnalyzer,\r\n program\r\n );\r\n\r\n if (packletImports) {\r\n const tsconfigFileFolder: string = Path.dirname(tsconfigFilePath);\r\n\r\n const affectedPackletNames: string[] = packletImports.map((x) => x.packletName);\r\n\r\n // If 3 different packlets form a circular dependency, we don't need to report the same warning 3 times.\r\n // Instead, only report the warning for the alphabetically smallest packlet.\r\n affectedPackletNames.sort();\r\n if (affectedPackletNames[0] === packletAnalyzer.inputFilePackletName) {\r\n let report: string = '';\r\n for (const packletImport of packletImports) {\r\n const filePath: string = Path.relative(tsconfigFileFolder, packletImport.fromFilePath);\r\n report += `\"${packletImport.packletName}\" is referenced by ${filePath}\\n`;\r\n }\r\n\r\n context.report({\r\n node: node,\r\n messageId: 'circular-import',\r\n data: { report: report }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }\r\n};\r\n\r\nexport { circularDeps };\r\n"]}
1
+ {"version":3,"file":"circular-deps.js","sourceRoot":"","sources":["../src/circular-deps.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAM3D,8EAAoE;AAEpE,uDAAoD;AACpD,6DAA0E;AAC1E,iCAA8B;AAK9B,MAAM,YAAY,GAA6C;IAC7D,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,EAAE,iBAAiB,EAAE,0DAA0D,EAAE;QAC3F,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,QAAQ;gBACd,oBAAoB,EAAE,KAAK;aAC5B;SACF;QACD,IAAI,EAAE;YACJ,WAAW,EAAE,kDAAkD;YAC/D,4DAA4D;YAC5D,QAAQ,EAAE,gBAAgB;YAC1B,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE,iEAAiE;SAC1C;KAC/B;IAED,MAAM,EAAE,CAAC,OAAkD,EAAE,EAAE;QAC7D,gEAAgE;QAChE,MAAM,aAAa,GAAW,OAAO,CAAC,WAAW,EAAE,CAAC;QAEpD,6CAA6C;QAC7C,MAAM,OAAO,GAAe,gCAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;QAC3E,MAAM,gBAAgB,GAAuB,OAAO,CAAC,kBAAkB,EAAE,CAAC,gBAAgB,CAAW,CAAC;QAEtG,MAAM,eAAe,GAAoB,iCAAe,CAAC,gBAAgB,CACvE,aAAa,EACb,gBAAgB,CACjB,CAAC;QACF,IAAI,eAAe,CAAC,WAAW,EAAE;YAC/B,OAAO,EAAE,CAAC;SACX;QAED,OAAO;YACL,mGAAmG;YACnG,yGAAyG;YACzG,gDAAgD;YAChD,OAAO,EAAE,CAAC,IAAmB,EAAQ,EAAE;gBACrC,IAAI,eAAe,CAAC,YAAY,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;oBAC1D,MAAM,cAAc,GAClB,uCAAkB,CAAC,gCAAgC,CACjD,eAAe,CAAC,oBAAqB,EACrC,eAAe,EACf,OAAO,CACR,CAAC;oBAEJ,IAAI,cAAc,EAAE;wBAClB,MAAM,kBAAkB,GAAW,WAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;wBAElE,MAAM,oBAAoB,GAAa,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;wBAEhF,wGAAwG;wBACxG,4EAA4E;wBAC5E,oBAAoB,CAAC,IAAI,EAAE,CAAC;wBAC5B,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,oBAAoB,EAAE;4BACpE,IAAI,MAAM,GAAW,EAAE,CAAC;4BACxB,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;gCAC1C,MAAM,QAAQ,GAAW,WAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;gCACvF,MAAM,IAAI,IAAI,aAAa,CAAC,WAAW,sBAAsB,QAAQ,IAAI,CAAC;6BAC3E;4BAED,OAAO,CAAC,MAAM,CAAC;gCACb,IAAI,EAAE,IAAI;gCACV,SAAS,EAAE,iBAAiB;gCAC5B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;6BACzB,CAAC,CAAC;yBACJ;qBACF;iBACF;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEO,oCAAY","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport type * as ts from 'typescript';\r\nimport * as path from 'path';\r\n\r\nimport type { ParserServices, TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer } from './PackletAnalyzer';\r\nimport { DependencyAnalyzer, IPackletImport } from './DependencyAnalyzer';\r\nimport { Path } from './Path';\r\n\r\nexport type MessageIds = 'circular-import';\r\ntype Options = [];\r\n\r\nconst circularDeps: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: { 'circular-import': 'Packlet imports create a circular reference:\\n{{report}}' },\r\n schema: [\r\n {\r\n type: 'object',\r\n additionalProperties: false\r\n }\r\n ],\r\n docs: {\r\n description: 'Check for circular dependencies between packlets',\r\n // Deprecated in ESLint v8; Keep for backwards compatibility\r\n category: 'Best Practices',\r\n recommended: 'warn',\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n } as TSESLint.RuleMetaDataDocs\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const program: ts.Program = ESLintUtils.getParserServices(context).program;\r\n const tsconfigFilePath: string | undefined = program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n if (packletAnalyzer.nothingToDo) {\r\n return {};\r\n }\r\n\r\n return {\r\n // Match the first node in the source file. Ideally we should be matching \"Program > :first-child\"\r\n // so a warning doesn't highlight the whole file. But that's blocked behind a bug in the query selector:\r\n // https://github.com/estools/esquery/issues/114\r\n Program: (node: TSESTree.Node): void => {\r\n if (packletAnalyzer.isEntryPoint && !packletAnalyzer.error) {\r\n const packletImports: IPackletImport[] | undefined =\r\n DependencyAnalyzer.checkEntryPointForCircularImport(\r\n packletAnalyzer.inputFilePackletName!,\r\n packletAnalyzer,\r\n program\r\n );\r\n\r\n if (packletImports) {\r\n const tsconfigFileFolder: string = Path.dirname(tsconfigFilePath);\r\n\r\n const affectedPackletNames: string[] = packletImports.map((x) => x.packletName);\r\n\r\n // If 3 different packlets form a circular dependency, we don't need to report the same warning 3 times.\r\n // Instead, only report the warning for the alphabetically smallest packlet.\r\n affectedPackletNames.sort();\r\n if (affectedPackletNames[0] === packletAnalyzer.inputFilePackletName) {\r\n let report: string = '';\r\n for (const packletImport of packletImports) {\r\n const filePath: string = Path.relative(tsconfigFileFolder, packletImport.fromFilePath);\r\n report += `\"${packletImport.packletName}\" is referenced by ${filePath}\\n`;\r\n }\r\n\r\n context.report({\r\n node: node,\r\n messageId: 'circular-import',\r\n data: { report: report }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }\r\n};\r\n\r\nexport { circularDeps };\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mechanics.d.ts","sourceRoot":"","sources":["../src/mechanics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAGhF,OAAO,EAAmC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE3G,oBAAY,UAAU,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAChE,aAAK,OAAO,GAAG,EAAE,CAAC;AAElB,QAAA,MAAM,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAmHvD,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"mechanics.d.ts","sourceRoot":"","sources":["../src/mechanics.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAGhF,OAAO,EAAmC,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE3G,oBAAY,UAAU,GAAG,mBAAmB,GAAG,gBAAgB,CAAC;AAChE,aAAK,OAAO,GAAG,EAAE,CAAC;AAElB,QAAA,MAAM,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAoHvD,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
package/lib/mechanics.js CHANGED
@@ -32,6 +32,7 @@ const mechanics = {
32
32
  ],
33
33
  docs: {
34
34
  description: 'Check that file paths and imports follow the basic mechanics for the packlet formalism',
35
+ // Deprecated in ESLint v8; Keep for backwards compatibility
35
36
  category: 'Best Practices',
36
37
  recommended: 'warn',
37
38
  url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'
@@ -1 +1 @@
1
- {"version":3,"file":"mechanics.js","sourceRoot":"","sources":["../src/mechanics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport type { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer, IAnalyzerError, InputFileMessageIds, ImportMessageIds } from './PackletAnalyzer';\r\n\r\nexport type MessageIds = InputFileMessageIds | ImportMessageIds;\r\ntype Options = [];\r\n\r\nconst mechanics: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: {\r\n // InputFileMessageIds\r\n 'file-in-packets-folder': 'The \"packlets\" folder must not contain regular source files',\r\n 'invalid-packlet-name':\r\n 'Invalid packlet name \"{{packletName}}\".' +\r\n ' The name must be lowercase alphanumeric words separated by hyphens. Example: \"my-packlet\"',\r\n 'misplaced-packlets-folder': 'The packlets folder must be located at \"{{expectedPackletsFolder}}\"',\r\n 'missing-src-folder': 'Expecting to find a \"src\" folder at: {{srcFolderPath}}',\r\n 'missing-tsconfig':\r\n 'In order to use @rushstack/eslint-plugin-packlets, your ESLint config file' +\r\n ' must configure the TypeScript parser',\r\n 'packlet-folder-case': 'The packlets folder must be all lower case: {{packletsFolderPath}}',\r\n\r\n // ImportMessageIds\r\n 'bypassed-entry-point':\r\n 'The import statement does not use the packlet\\'s entry point \"{{entryPointModulePath}}\"',\r\n 'circular-entry-point': 'Files under a packlet folder must not import from their own index.ts file',\r\n 'packlet-importing-project-file':\r\n 'A local project file cannot be imported.' +\r\n \" A packlet's dependencies must be NPM packages and/or other packlets.\"\r\n },\r\n schema: [\r\n {\r\n type: 'object',\r\n additionalProperties: false\r\n }\r\n ],\r\n docs: {\r\n description: 'Check that file paths and imports follow the basic mechanics for the packlet formalism',\r\n category: 'Best Practices',\r\n recommended: 'warn',\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n }\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const tsconfigFilePath: string | undefined = ESLintUtils.getParserServices(\r\n context\r\n ).program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n if (packletAnalyzer.nothingToDo) {\r\n return {};\r\n }\r\n\r\n return {\r\n // Match the first node in the source file. Ideally we should be matching \"Program > :first-child\"\r\n // so a warning doesn't highlight the whole file. But that's blocked behind a bug in the query selector:\r\n // https://github.com/estools/esquery/issues/114\r\n Program: (node: TSESTree.Node): void => {\r\n if (packletAnalyzer.error) {\r\n context.report({\r\n node: node,\r\n messageId: packletAnalyzer.error.messageId,\r\n data: packletAnalyzer.error.data\r\n });\r\n }\r\n },\r\n\r\n // ImportDeclaration matches these forms:\r\n // import { X } from '../../packlets/other-packlet';\r\n // import X from '../../packlets/other-packlet';\r\n // import type { X, Y } from '../../packlets/other-packlet';\r\n // import * as X from '../../packlets/other-packlet';\r\n //\r\n // ExportNamedDeclaration matches these forms:\r\n // export { X } from '../../packlets/other-packlet';\r\n //\r\n // ExportAllDeclaration matches these forms:\r\n // export * from '../../packlets/other-packlet';\r\n // export * as X from '../../packlets/other-packlet';\r\n 'ImportDeclaration, ExportNamedDeclaration, ExportAllDeclaration': (\r\n node: TSESTree.ImportDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportAllDeclaration\r\n ): void => {\r\n if (node.source?.type === AST_NODE_TYPES.Literal) {\r\n if (packletAnalyzer.projectUsesPacklets) {\r\n // Extract the import/export module path\r\n // Example: \"../../packlets/other-packlet\"\r\n const modulePath = node.source.value;\r\n if (typeof modulePath !== 'string') {\r\n return;\r\n }\r\n\r\n if (!(modulePath.startsWith('.') || modulePath.startsWith('..'))) {\r\n // It's not a local import.\r\n\r\n // Examples:\r\n // import { X } from \"npm-package\";\r\n // import { X } from \"raw-loader!./webpack-file.ts\";\r\n return;\r\n }\r\n\r\n const lint: IAnalyzerError | undefined = packletAnalyzer.analyzeImport(modulePath);\r\n if (lint) {\r\n context.report({\r\n node: node,\r\n messageId: lint.messageId,\r\n data: lint.data\r\n });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }\r\n};\r\n\r\nexport { mechanics };\r\n"]}
1
+ {"version":3,"file":"mechanics.js","sourceRoot":"","sources":["../src/mechanics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport type { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { AST_NODE_TYPES, ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer, IAnalyzerError, InputFileMessageIds, ImportMessageIds } from './PackletAnalyzer';\r\n\r\nexport type MessageIds = InputFileMessageIds | ImportMessageIds;\r\ntype Options = [];\r\n\r\nconst mechanics: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: {\r\n // InputFileMessageIds\r\n 'file-in-packets-folder': 'The \"packlets\" folder must not contain regular source files',\r\n 'invalid-packlet-name':\r\n 'Invalid packlet name \"{{packletName}}\".' +\r\n ' The name must be lowercase alphanumeric words separated by hyphens. Example: \"my-packlet\"',\r\n 'misplaced-packlets-folder': 'The packlets folder must be located at \"{{expectedPackletsFolder}}\"',\r\n 'missing-src-folder': 'Expecting to find a \"src\" folder at: {{srcFolderPath}}',\r\n 'missing-tsconfig':\r\n 'In order to use @rushstack/eslint-plugin-packlets, your ESLint config file' +\r\n ' must configure the TypeScript parser',\r\n 'packlet-folder-case': 'The packlets folder must be all lower case: {{packletsFolderPath}}',\r\n\r\n // ImportMessageIds\r\n 'bypassed-entry-point':\r\n 'The import statement does not use the packlet\\'s entry point \"{{entryPointModulePath}}\"',\r\n 'circular-entry-point': 'Files under a packlet folder must not import from their own index.ts file',\r\n 'packlet-importing-project-file':\r\n 'A local project file cannot be imported.' +\r\n \" A packlet's dependencies must be NPM packages and/or other packlets.\"\r\n },\r\n schema: [\r\n {\r\n type: 'object',\r\n additionalProperties: false\r\n }\r\n ],\r\n docs: {\r\n description: 'Check that file paths and imports follow the basic mechanics for the packlet formalism',\r\n // Deprecated in ESLint v8; Keep for backwards compatibility\r\n category: 'Best Practices',\r\n recommended: 'warn',\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n } as TSESLint.RuleMetaDataDocs\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const tsconfigFilePath: string | undefined = ESLintUtils.getParserServices(\r\n context\r\n ).program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n if (packletAnalyzer.nothingToDo) {\r\n return {};\r\n }\r\n\r\n return {\r\n // Match the first node in the source file. Ideally we should be matching \"Program > :first-child\"\r\n // so a warning doesn't highlight the whole file. But that's blocked behind a bug in the query selector:\r\n // https://github.com/estools/esquery/issues/114\r\n Program: (node: TSESTree.Node): void => {\r\n if (packletAnalyzer.error) {\r\n context.report({\r\n node: node,\r\n messageId: packletAnalyzer.error.messageId,\r\n data: packletAnalyzer.error.data\r\n });\r\n }\r\n },\r\n\r\n // ImportDeclaration matches these forms:\r\n // import { X } from '../../packlets/other-packlet';\r\n // import X from '../../packlets/other-packlet';\r\n // import type { X, Y } from '../../packlets/other-packlet';\r\n // import * as X from '../../packlets/other-packlet';\r\n //\r\n // ExportNamedDeclaration matches these forms:\r\n // export { X } from '../../packlets/other-packlet';\r\n //\r\n // ExportAllDeclaration matches these forms:\r\n // export * from '../../packlets/other-packlet';\r\n // export * as X from '../../packlets/other-packlet';\r\n 'ImportDeclaration, ExportNamedDeclaration, ExportAllDeclaration': (\r\n node: TSESTree.ImportDeclaration | TSESTree.ExportNamedDeclaration | TSESTree.ExportAllDeclaration\r\n ): void => {\r\n if (node.source?.type === AST_NODE_TYPES.Literal) {\r\n if (packletAnalyzer.projectUsesPacklets) {\r\n // Extract the import/export module path\r\n // Example: \"../../packlets/other-packlet\"\r\n const modulePath = node.source.value;\r\n if (typeof modulePath !== 'string') {\r\n return;\r\n }\r\n\r\n if (!(modulePath.startsWith('.') || modulePath.startsWith('..'))) {\r\n // It's not a local import.\r\n\r\n // Examples:\r\n // import { X } from \"npm-package\";\r\n // import { X } from \"raw-loader!./webpack-file.ts\";\r\n return;\r\n }\r\n\r\n const lint: IAnalyzerError | undefined = packletAnalyzer.analyzeImport(modulePath);\r\n if (lint) {\r\n context.report({\r\n node: node,\r\n messageId: lint.messageId,\r\n data: lint.data\r\n });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n }\r\n};\r\n\r\nexport { mechanics };\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../src/readme.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAKhF,oBAAY,UAAU,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AACtF,aAAK,OAAO,GAAG;IACb;QACE,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;CACF,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA4FpD,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../src/readme.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,uCAAuC,CAAC;AAKhF,oBAAY,UAAU,GAAG,gBAAgB,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AACtF,aAAK,OAAO,GAAG;IACb;QACE,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B;CACF,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA6FpD,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/lib/readme.js CHANGED
@@ -49,6 +49,7 @@ const readme = {
49
49
  ],
50
50
  docs: {
51
51
  description: 'Require each packlet folder to have a README.md file summarizing its purpose and usage',
52
+ // Deprecated in ESLint v8; Keep for backwards compatibility
52
53
  category: 'Best Practices',
53
54
  // Too strict to be recommended in the default configuration
54
55
  recommended: false,
package/lib/readme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"readme.js","sourceRoot":"","sources":["../src/readme.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\nimport type { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer } from './PackletAnalyzer';\r\n\r\nexport type MessageIds = 'missing-readme' | 'error-reading-file' | 'readme-too-short';\r\ntype Options = [\r\n {\r\n minimumReadmeWords?: number;\r\n }\r\n];\r\n\r\nconst readme: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: {\r\n 'missing-readme':\r\n 'The ESLint configuration requires each packlet to provide a README.md file summarizing' +\r\n ' its purpose and usage: {{readmePath}}',\r\n 'readme-too-short':\r\n 'The ESLint configuration requires at least {{minimumReadmeWords}} words of documentation in the' +\r\n ' README.md file: {{readmePath}}',\r\n 'error-reading-file': 'Error reading input file {{readmePath}}:\\n{{errorMessage}}'\r\n },\r\n schema: [\r\n {\r\n type: 'object',\r\n properties: {\r\n minimumReadmeWords: {\r\n type: 'number'\r\n }\r\n },\r\n additionalProperties: false\r\n }\r\n ],\r\n\r\n docs: {\r\n description: 'Require each packlet folder to have a README.md file summarizing its purpose and usage',\r\n category: 'Best Practices',\r\n // Too strict to be recommended in the default configuration\r\n recommended: false,\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n }\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n const minimumReadmeWords: number = context.options[0]?.minimumReadmeWords || 10;\r\n\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const tsconfigFilePath: string | undefined = ESLintUtils.getParserServices(\r\n context\r\n ).program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n\r\n if (!packletAnalyzer.nothingToDo && !packletAnalyzer.error) {\r\n if (packletAnalyzer.isEntryPoint) {\r\n return {\r\n Program: (node: TSESTree.Node): void => {\r\n const readmePath: string = path.join(\r\n packletAnalyzer.packletsFolderPath!,\r\n packletAnalyzer.inputFilePackletName!,\r\n 'README.md'\r\n );\r\n try {\r\n if (!fs.existsSync(readmePath)) {\r\n context.report({\r\n node: node,\r\n messageId: 'missing-readme',\r\n data: { readmePath }\r\n });\r\n } else {\r\n if (minimumReadmeWords > 0) {\r\n const readmeContent: string = fs.readFileSync(readmePath).toString();\r\n const words: string[] = readmeContent.split(/[^a-z'\"]+/i).filter((x) => x.length > 0);\r\n if (words.length < minimumReadmeWords) {\r\n context.report({\r\n node: node,\r\n messageId: 'readme-too-short',\r\n data: { readmePath, minimumReadmeWords }\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n context.report({\r\n node: node,\r\n messageId: 'error-reading-file',\r\n data: { readmePath, errorMessage: error.toString() }\r\n });\r\n }\r\n }\r\n };\r\n }\r\n }\r\n\r\n return {};\r\n }\r\n};\r\n\r\nexport { readme };\r\n"]}
1
+ {"version":3,"file":"readme.js","sourceRoot":"","sources":["../src/readme.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\r\n// See LICENSE in the project root for license information.\r\n\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\nimport type { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\r\nimport { ESLintUtils } from '@typescript-eslint/experimental-utils';\r\n\r\nimport { PackletAnalyzer } from './PackletAnalyzer';\r\n\r\nexport type MessageIds = 'missing-readme' | 'error-reading-file' | 'readme-too-short';\r\ntype Options = [\r\n {\r\n minimumReadmeWords?: number;\r\n }\r\n];\r\n\r\nconst readme: TSESLint.RuleModule<MessageIds, Options> = {\r\n meta: {\r\n type: 'problem',\r\n messages: {\r\n 'missing-readme':\r\n 'The ESLint configuration requires each packlet to provide a README.md file summarizing' +\r\n ' its purpose and usage: {{readmePath}}',\r\n 'readme-too-short':\r\n 'The ESLint configuration requires at least {{minimumReadmeWords}} words of documentation in the' +\r\n ' README.md file: {{readmePath}}',\r\n 'error-reading-file': 'Error reading input file {{readmePath}}:\\n{{errorMessage}}'\r\n },\r\n schema: [\r\n {\r\n type: 'object',\r\n properties: {\r\n minimumReadmeWords: {\r\n type: 'number'\r\n }\r\n },\r\n additionalProperties: false\r\n }\r\n ],\r\n\r\n docs: {\r\n description: 'Require each packlet folder to have a README.md file summarizing its purpose and usage',\r\n // Deprecated in ESLint v8; Keep for backwards compatibility\r\n category: 'Best Practices',\r\n // Too strict to be recommended in the default configuration\r\n recommended: false,\r\n url: 'https://www.npmjs.com/package/@rushstack/eslint-plugin-packlets'\r\n } as TSESLint.RuleMetaDataDocs\r\n },\r\n\r\n create: (context: TSESLint.RuleContext<MessageIds, Options>) => {\r\n const minimumReadmeWords: number = context.options[0]?.minimumReadmeWords || 10;\r\n\r\n // Example: /path/to/my-project/src/packlets/my-packlet/index.ts\r\n const inputFilePath: string = context.getFilename();\r\n\r\n // Example: /path/to/my-project/tsconfig.json\r\n const tsconfigFilePath: string | undefined = ESLintUtils.getParserServices(\r\n context\r\n ).program.getCompilerOptions()['configFilePath'] as string;\r\n\r\n const packletAnalyzer: PackletAnalyzer = PackletAnalyzer.analyzeInputFile(\r\n inputFilePath,\r\n tsconfigFilePath\r\n );\r\n\r\n if (!packletAnalyzer.nothingToDo && !packletAnalyzer.error) {\r\n if (packletAnalyzer.isEntryPoint) {\r\n return {\r\n Program: (node: TSESTree.Node): void => {\r\n const readmePath: string = path.join(\r\n packletAnalyzer.packletsFolderPath!,\r\n packletAnalyzer.inputFilePackletName!,\r\n 'README.md'\r\n );\r\n try {\r\n if (!fs.existsSync(readmePath)) {\r\n context.report({\r\n node: node,\r\n messageId: 'missing-readme',\r\n data: { readmePath }\r\n });\r\n } else {\r\n if (minimumReadmeWords > 0) {\r\n const readmeContent: string = fs.readFileSync(readmePath).toString();\r\n const words: string[] = readmeContent.split(/[^a-z'\"]+/i).filter((x) => x.length > 0);\r\n if (words.length < minimumReadmeWords) {\r\n context.report({\r\n node: node,\r\n messageId: 'readme-too-short',\r\n data: { readmePath, minimumReadmeWords }\r\n });\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n context.report({\r\n node: node,\r\n messageId: 'error-reading-file',\r\n data: { readmePath, errorMessage: (error as Error).toString() }\r\n });\r\n }\r\n }\r\n };\r\n }\r\n }\r\n\r\n return {};\r\n }\r\n};\r\n\r\nexport { readme };\r\n"]}
package/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "@rushstack/eslint-plugin-packlets",
3
- "version": "0.3.0",
3
+ "version": "0.3.4",
4
4
  "description": "A lightweight alternative to NPM packages for organizing source files within a single project",
5
5
  "license": "MIT",
6
6
  "repository": {
7
- "url": "https://github.com/microsoft/rushstack/tree/master/stack/eslint-plugin-packlets"
7
+ "url": "https://github.com/microsoft/rushstack.git",
8
+ "type": "git",
9
+ "directory": "stack/eslint-plugin-packlets"
8
10
  },
9
11
  "homepage": "https://rushstack.io",
10
12
  "keywords": [
@@ -16,23 +18,23 @@
16
18
  "main": "lib/index.js",
17
19
  "typings": "lib/index.d.ts",
18
20
  "dependencies": {
19
- "@rushstack/tree-pattern": "0.2.1",
20
- "@typescript-eslint/experimental-utils": "~4.28.2"
21
+ "@rushstack/tree-pattern": "0.2.2",
22
+ "@typescript-eslint/experimental-utils": "~5.3.0"
21
23
  },
22
24
  "peerDependencies": {
23
- "eslint": "^6.0.0 || ^7.0.0"
25
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
24
26
  },
25
27
  "devDependencies": {
26
- "@rushstack/heft": "0.32.0",
27
- "@rushstack/heft-node-rig": "1.0.31",
28
- "@types/eslint": "7.2.0",
29
- "@types/estree": "0.0.44",
28
+ "@rushstack/heft": "0.42.3",
29
+ "@rushstack/heft-node-rig": "1.2.32",
30
+ "@types/eslint": "8.2.0",
31
+ "@types/estree": "0.0.50",
30
32
  "@types/heft-jest": "1.0.1",
31
- "@types/node": "10.17.13",
32
- "@typescript-eslint/parser": "~4.28.2",
33
- "@typescript-eslint/typescript-estree": "~4.28.2",
34
- "eslint": "~7.12.1",
35
- "typescript": "~4.3.5"
33
+ "@types/node": "12.20.24",
34
+ "@typescript-eslint/parser": "~5.3.0",
35
+ "@typescript-eslint/typescript-estree": "~5.3.0",
36
+ "eslint": "~8.3.0",
37
+ "typescript": "~4.4.2"
36
38
  },
37
39
  "scripts": {
38
40
  "build": "heft test --clean"