eslint-plugin-stratified-design 0.4.1 → 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.
@@ -8,13 +8,33 @@ jobs:
8
8
  publish:
9
9
  runs-on: ubuntu-latest
10
10
  steps:
11
- - uses: actions/checkout@v3
12
- - uses: actions/setup-node@v3
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
- - run: npm ci
17
- - run: npm test
18
- - run: npm publish
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
19
39
  env:
20
40
  NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
@@ -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 interface layer, set `interface` to `true`:
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", "interface": true }, "layer3"],
29
+ "structure": ["layer1", { "name": "layer2", "barrier": true }, "layer3"],
30
30
  }]
31
31
  ```
32
32
 
33
- For the 'interface layer,' refer to "[Grokking Simplicity](https://grokkingsimplicity.com)."
33
+ For the 'abstract barrier,' refer to "[Grokking Simplicity](https://grokkingsimplicity.com)."
34
34
 
35
- To locate a node module in the structure, set `isNodeModule` to `true`:
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", "isNodeModule": true }, "layer3"],
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", interface: true }, "layer3"]
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", "isNodeModule": true }, "layer3"],
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("interface");
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("interface");
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]: string | {name: string, isNodeModule: boolean, interface: boolean}}} structure
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("interface");
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]: string | {name: string, isNodeModule: boolean, interface: boolean}}} structure
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]: string | {name: string, isNodeModule: boolean, interface: boolean}}} structure
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
- interface: "An INTERFACE prevents '{{file}}' from importing '{{module}}'",
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.1",
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", interface: true },
21
+ { name: "layer2/subLayer1", barrier: true },
22
22
  "layer2/subLayer2",
23
- { name: "node-module", isNodeModule: true },
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: "interface",
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: "interface",
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: "interface",
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: "interface",
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: "interface",
305
+ messageId: "barrier",
306
306
  data: {
307
307
  module: "./component/2 layer/1 style",
308
308
  file: "./component/1 layer/1 style",