eslint-plugin-stratified-design 0.4.0 → 0.4.2-beta
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/.github/workflows/release.yml +27 -5
- package/README.md +1 -1
- package/docs/rules/lower-level-imports.md +7 -7
- package/lib/helpers/lowerLevelImports/1 layer.js +4 -4
- package/lib/helpers/lowerLevelImports/3 layer.js +4 -4
- package/lib/rules/lower-level-imports.js +4 -1
- package/package.json +3 -2
- package/scripts/versioning.js +38 -0
- package/tests/lib/rules/lower-level-imports.js +7 -7
- package/tests-in-package/node_modules/.package-lock.json +0 -56
|
@@ -8,11 +8,33 @@ jobs:
|
|
|
8
8
|
publish:
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
10
|
steps:
|
|
11
|
-
-
|
|
12
|
-
|
|
11
|
+
- name: Checkout repository
|
|
12
|
+
uses: actions/checkout@v3
|
|
13
|
+
|
|
14
|
+
- name: Set up Node.js
|
|
15
|
+
uses: actions/setup-node@v3
|
|
13
16
|
with:
|
|
14
17
|
node-version: 16
|
|
15
18
|
registry-url: https://registry.npmjs.org/
|
|
16
|
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
+
|
|
20
|
+
- name: Update package version
|
|
21
|
+
run: npm run versioning
|
|
22
|
+
|
|
23
|
+
- name: Commit and push package.json
|
|
24
|
+
run: |
|
|
25
|
+
git config --local user.email "action@github.com"
|
|
26
|
+
git config --local user.name "GitHub Action"
|
|
27
|
+
git commit -a -m "Update package version"
|
|
28
|
+
TARGET_COMMITISH=$(jq -r '.release.target_commitish' $GITHUB_EVENT_PATH)
|
|
29
|
+
git push origin HEAD:${TARGET_COMMITISH}
|
|
30
|
+
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: npm ci
|
|
33
|
+
|
|
34
|
+
- name: Test
|
|
35
|
+
run: npm test
|
|
36
|
+
|
|
37
|
+
- name: Publish
|
|
38
|
+
run: npm publish
|
|
39
|
+
env:
|
|
40
|
+
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
package/README.md
CHANGED
|
@@ -22,21 +22,21 @@ The syntax to specify the level structure is as follows:
|
|
|
22
22
|
|
|
23
23
|
In the folder array, the file or folder on the left is considered to be at a higher level than the one on the right.
|
|
24
24
|
|
|
25
|
-
To designate a layer as an
|
|
25
|
+
To designate a layer as an abstract barrier, set `barrier` to `true`:
|
|
26
26
|
|
|
27
27
|
```json
|
|
28
28
|
"lower-level-imports": ["error", {
|
|
29
|
-
"structure": ["layer1", { "name": "layer2", "
|
|
29
|
+
"structure": ["layer1", { "name": "layer2", "barrier": true }, "layer3"],
|
|
30
30
|
}]
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
For the '
|
|
33
|
+
For the 'abstract barrier,' refer to "[Grokking Simplicity](https://grokkingsimplicity.com)."
|
|
34
34
|
|
|
35
|
-
To locate a node module in the structure, set `
|
|
35
|
+
To locate a node module in the structure, set `nodeModule` to `true`:
|
|
36
36
|
|
|
37
37
|
```json
|
|
38
38
|
"lower-level-imports": ["error", {
|
|
39
|
-
"structure": ["layer1", { "name": "nodeModule", "
|
|
39
|
+
"structure": ["layer1", { "name": "nodeModule", "nodeModule": true }, "layer3"],
|
|
40
40
|
}]
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -120,7 +120,7 @@ import { func } from "../layer1";
|
|
|
120
120
|
|
|
121
121
|
```js
|
|
122
122
|
/* "lower-level-imports": ["error", {
|
|
123
|
-
"structure": ["layer1", { name: "layer2",
|
|
123
|
+
"structure": ["layer1", { name: "layer2", barrier: true }, "layer3"]
|
|
124
124
|
}] */
|
|
125
125
|
// ./src/layer1.js
|
|
126
126
|
import { func } from "../layer3/entry";
|
|
@@ -128,7 +128,7 @@ import { func } from "../layer3/entry";
|
|
|
128
128
|
|
|
129
129
|
```js
|
|
130
130
|
/* "lower-level-imports": ["error", {
|
|
131
|
-
"structure": ["layer1", { "name": "nodeModule", "
|
|
131
|
+
"structure": ["layer1", { "name": "nodeModule", "nodeModule": true }, "layer3"],
|
|
132
132
|
}] */
|
|
133
133
|
// ./src/layer3/entry.js
|
|
134
134
|
import { func } from "nodeModule";
|
|
@@ -108,7 +108,7 @@ const reportHasProperLevelNumber = (context, options, rootDir, filePath) => {
|
|
|
108
108
|
})();
|
|
109
109
|
|
|
110
110
|
if (isInterfaceError) {
|
|
111
|
-
report("
|
|
111
|
+
report("barrier");
|
|
112
112
|
return FINISHED;
|
|
113
113
|
}
|
|
114
114
|
|
|
@@ -123,7 +123,7 @@ const reportHasProperLevelNumber = (context, options, rootDir, filePath) => {
|
|
|
123
123
|
})();
|
|
124
124
|
|
|
125
125
|
if (fileLevel === null) {
|
|
126
|
-
report("
|
|
126
|
+
report("barrier");
|
|
127
127
|
return FINISHED;
|
|
128
128
|
}
|
|
129
129
|
|
|
@@ -159,7 +159,7 @@ const reportInSubDirOfFileDir = (fileDir) => {
|
|
|
159
159
|
/**
|
|
160
160
|
* Report error about using `options.structure`
|
|
161
161
|
* @param {import('eslint').Rule.RuleContext} context
|
|
162
|
-
* @param {{[string]:
|
|
162
|
+
* @param {{[string]: {name: string; nodeModule: boolean; nodeModule: boolean; isNodeModule: boolean; interface: boolean}}} structure
|
|
163
163
|
* @param {string} rootDir
|
|
164
164
|
* @param {number | null} fileLevel
|
|
165
165
|
* @param {string} filePath
|
|
@@ -201,7 +201,7 @@ const reportHasProperLevel = (
|
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
if (hasInterface(moduleLevel)) {
|
|
204
|
-
report("
|
|
204
|
+
report("barrier");
|
|
205
205
|
return FINISHED;
|
|
206
206
|
}
|
|
207
207
|
|
|
@@ -13,7 +13,7 @@ const {
|
|
|
13
13
|
const createStructure = (options, rootDir) => {
|
|
14
14
|
return options.structure.map((layer) => {
|
|
15
15
|
const theLayer = typeof layer === "string" ? { name: layer } : layer;
|
|
16
|
-
return theLayer.isNodeModule
|
|
16
|
+
return theLayer.nodeModule || theLayer.isNodeModule
|
|
17
17
|
? theLayer
|
|
18
18
|
: { ...theLayer, name: joinPath(rootDir, theLayer.name) };
|
|
19
19
|
});
|
|
@@ -63,7 +63,7 @@ const isNodeModule = (rootDir) => {
|
|
|
63
63
|
|
|
64
64
|
/**
|
|
65
65
|
* Find the layer level for a module
|
|
66
|
-
* @param {{[string]:
|
|
66
|
+
* @param {{[string]: {name: string; nodeModule: boolean; barrier: boolean; isNodeModule: boolean, interface: boolean}}} structure
|
|
67
67
|
* @returns the level of the module with `path`
|
|
68
68
|
*/
|
|
69
69
|
const findLevel = (structure) => {
|
|
@@ -83,7 +83,7 @@ const findLevel = (structure) => {
|
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
85
|
* Check if there is an interface between file layer and module layer
|
|
86
|
-
* @param {{[string]:
|
|
86
|
+
* @param {{[string]: {name: string; nodeModule: boolean; barrier: boolean; isNodeModule: boolean, interface: boolean}}} structure
|
|
87
87
|
* @param {number} fileLevel
|
|
88
88
|
*/
|
|
89
89
|
const hasInterface = (structure, fileLevel) => {
|
|
@@ -93,7 +93,7 @@ const hasInterface = (structure, fileLevel) => {
|
|
|
93
93
|
return (moduleLevel) => {
|
|
94
94
|
const layerInterface = structure
|
|
95
95
|
.slice(fileLevel + 1, moduleLevel)
|
|
96
|
-
.find((layer) => layer.interface);
|
|
96
|
+
.find((layer) => layer.barrier || layer.interface);
|
|
97
97
|
return Boolean(layerInterface);
|
|
98
98
|
};
|
|
99
99
|
};
|
|
@@ -38,7 +38,9 @@ const layerSchema = {
|
|
|
38
38
|
type: "string",
|
|
39
39
|
pattern: layerNamePattern,
|
|
40
40
|
},
|
|
41
|
+
barrier: { type: "boolean" },
|
|
41
42
|
interface: { type: "boolean" },
|
|
43
|
+
nodeModule: { type: "boolean" },
|
|
42
44
|
isNodeModule: { type: "boolean" },
|
|
43
45
|
},
|
|
44
46
|
required: ["name"],
|
|
@@ -95,7 +97,8 @@ module.exports = {
|
|
|
95
97
|
},
|
|
96
98
|
messages: {
|
|
97
99
|
"not-lower-level": "'{{module}}' is NOT LOWER level than '{{file}}'",
|
|
98
|
-
|
|
100
|
+
barrier:
|
|
101
|
+
"An ABSTRACT BARRIER prevents '{{file}}' from importing '{{module}}'",
|
|
99
102
|
"not-registered:file":
|
|
100
103
|
"'{{file}}' does NOT registered at layer structure",
|
|
101
104
|
"not-registered:module":
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-stratified-design",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2-beta",
|
|
4
4
|
"description": "ESlint rules for stratified design",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"eslint",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
"exports": "./lib/index.js",
|
|
20
20
|
"scripts": {
|
|
21
21
|
"lint": "eslint .",
|
|
22
|
-
"test": "mocha tests --recursive"
|
|
22
|
+
"test": "mocha tests --recursive",
|
|
23
|
+
"versioning": "node ./scripts/versioning"
|
|
23
24
|
},
|
|
24
25
|
"dependencies": {
|
|
25
26
|
"minimatch": "^9.0.1",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
|
|
3
|
+
function updatePackageVersion() {
|
|
4
|
+
const githubEventPath = process.env.GITHUB_EVENT_PATH || "";
|
|
5
|
+
const packageJsonPath = "package.json";
|
|
6
|
+
|
|
7
|
+
const version = (() => {
|
|
8
|
+
try {
|
|
9
|
+
const githubEventString = fs.readFileSync(githubEventPath, "utf-8");
|
|
10
|
+
const githubEvent = JSON.parse(githubEventString);
|
|
11
|
+
const tagName = githubEvent.release.tag_name;
|
|
12
|
+
const version = tagName.replace(/^v(.*)/, "$1");
|
|
13
|
+
return version;
|
|
14
|
+
} catch (error) {
|
|
15
|
+
throw new Error("Error parsing GITHUB_EVENT_PATH:", error);
|
|
16
|
+
}
|
|
17
|
+
})();
|
|
18
|
+
|
|
19
|
+
const packageJson = (() => {
|
|
20
|
+
try {
|
|
21
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
22
|
+
packageJson.version = version;
|
|
23
|
+
const updatedPackageJson = JSON.stringify(packageJson, null, 2) + "\n";
|
|
24
|
+
return updatedPackageJson;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
throw new Error("Error parsing package.json:", error);
|
|
27
|
+
}
|
|
28
|
+
})();
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
fs.writeFileSync(packageJsonPath, packageJson, "utf8");
|
|
32
|
+
console.log(`Successfully updated version to ${version}`);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
throw new Error("Error writing package.json:", error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
updatePackageVersion();
|
|
@@ -18,9 +18,9 @@ const rule = require("../../../lib/rules/lower-level-imports"),
|
|
|
18
18
|
const structure = [
|
|
19
19
|
"layer1/subLayer1",
|
|
20
20
|
"layer1/subLayer2",
|
|
21
|
-
{ name: "layer2/subLayer1",
|
|
21
|
+
{ name: "layer2/subLayer1", barrier: true },
|
|
22
22
|
"layer2/subLayer2",
|
|
23
|
-
{ name: "node-module",
|
|
23
|
+
{ name: "node-module", nodeModule: true },
|
|
24
24
|
"layer3/subLayer1",
|
|
25
25
|
"layer3/subLayer2",
|
|
26
26
|
"layer3/subLayer3",
|
|
@@ -200,7 +200,7 @@ ruleTester.run("lower-level-imports", rule, {
|
|
|
200
200
|
options: [{ structure, root: "./src", aliases: { "@/": "./src/" } }],
|
|
201
201
|
errors: [
|
|
202
202
|
{
|
|
203
|
-
messageId: "
|
|
203
|
+
messageId: "barrier",
|
|
204
204
|
data: { module: "./layer2/subLayer2", file: "./layer1/subLayer2" },
|
|
205
205
|
},
|
|
206
206
|
],
|
|
@@ -218,7 +218,7 @@ ruleTester.run("lower-level-imports", rule, {
|
|
|
218
218
|
],
|
|
219
219
|
errors: [
|
|
220
220
|
{
|
|
221
|
-
messageId: "
|
|
221
|
+
messageId: "barrier",
|
|
222
222
|
data: {
|
|
223
223
|
module: "./layer3/subLayer2/1 otherLayerA",
|
|
224
224
|
file: "./layer3/subLayer1",
|
|
@@ -239,7 +239,7 @@ ruleTester.run("lower-level-imports", rule, {
|
|
|
239
239
|
],
|
|
240
240
|
errors: [
|
|
241
241
|
{
|
|
242
|
-
messageId: "
|
|
242
|
+
messageId: "barrier",
|
|
243
243
|
data: {
|
|
244
244
|
module: "./layer3/subLayer2/1 otherLayerA",
|
|
245
245
|
file: "./layer3/subLayer1/1 otherLayerA",
|
|
@@ -260,7 +260,7 @@ ruleTester.run("lower-level-imports", rule, {
|
|
|
260
260
|
],
|
|
261
261
|
errors: [
|
|
262
262
|
{
|
|
263
|
-
messageId: "
|
|
263
|
+
messageId: "barrier",
|
|
264
264
|
data: {
|
|
265
265
|
module: "./component/2 layer/CompA",
|
|
266
266
|
file: "./component/1 layer",
|
|
@@ -302,7 +302,7 @@ ruleTester.run("lower-level-imports", rule, {
|
|
|
302
302
|
],
|
|
303
303
|
errors: [
|
|
304
304
|
{
|
|
305
|
-
messageId: "
|
|
305
|
+
messageId: "barrier",
|
|
306
306
|
data: {
|
|
307
307
|
module: "./component/2 layer/1 style",
|
|
308
308
|
file: "./component/1 layer/1 style",
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "tests-in-package",
|
|
3
|
-
"lockfileVersion": 3,
|
|
4
|
-
"requires": true,
|
|
5
|
-
"packages": {
|
|
6
|
-
"..": {
|
|
7
|
-
"version": "0.3.2",
|
|
8
|
-
"dev": true,
|
|
9
|
-
"license": "ISC",
|
|
10
|
-
"dependencies": {
|
|
11
|
-
"minimatch": "^9.0.1",
|
|
12
|
-
"requireindex": "^1.2.0"
|
|
13
|
-
},
|
|
14
|
-
"devDependencies": {
|
|
15
|
-
"eslint": "^8.19.0",
|
|
16
|
-
"eslint-plugin-eslint-plugin": "^5.0.0",
|
|
17
|
-
"eslint-plugin-node": "^11.1.0",
|
|
18
|
-
"mocha": "^10.0.0"
|
|
19
|
-
},
|
|
20
|
-
"engines": {
|
|
21
|
-
"node": "^14.17.0 || ^16.0.0 || >= 18.0.0"
|
|
22
|
-
},
|
|
23
|
-
"peerDependencies": {
|
|
24
|
-
"eslint": ">=7"
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
"../..": {
|
|
28
|
-
"name": "@anisotropy/eslint-plugin-stratified-design",
|
|
29
|
-
"version": "0.0.0",
|
|
30
|
-
"dev": true,
|
|
31
|
-
"license": "ISC",
|
|
32
|
-
"dependencies": {
|
|
33
|
-
"requireindex": "^1.2.0"
|
|
34
|
-
},
|
|
35
|
-
"devDependencies": {
|
|
36
|
-
"eslint": "^8.19.0",
|
|
37
|
-
"eslint-plugin-eslint-plugin": "^5.0.0",
|
|
38
|
-
"eslint-plugin-node": "^11.1.0",
|
|
39
|
-
"mocha": "^10.0.0"
|
|
40
|
-
},
|
|
41
|
-
"engines": {
|
|
42
|
-
"node": "^14.17.0 || ^16.0.0 || >= 18.0.0"
|
|
43
|
-
},
|
|
44
|
-
"peerDependencies": {
|
|
45
|
-
"eslint": ">=7"
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"../../lib": {
|
|
49
|
-
"extraneous": true
|
|
50
|
-
},
|
|
51
|
-
"node_modules/eslint-plugin-stratified-design": {
|
|
52
|
-
"resolved": "..",
|
|
53
|
-
"link": true
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|