@luma-layered-ts/eslint-plugin 0.0.0-stage → 1.0.1

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.
@@ -0,0 +1,6 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ declare const createRule: <Options extends readonly unknown[], MessageIds extends string>({ meta, name, ...rule }: Readonly<ESLintUtils.RuleWithMetaAndName<Options, MessageIds, unknown>>) => ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ export { createRule };
6
+ //# sourceMappingURL=create-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rule.d.ts","sourceRoot":"","sources":["../src/create-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,QAAA,MAAM,UAAU;;CAGf,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRule = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const createRule = utils_1.ESLintUtils.RuleCreator((name) => `https://github.com/LumaKernel/luma-layered-ts/blob/main/prompts/eslint-rules.md#${name}`);
6
+ exports.createRule = createRule;
7
+ //# sourceMappingURL=create-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-rule.js","sourceRoot":"","sources":["../src/create-rule.ts"],"names":[],"mappings":";;;AAAA,oDAAuD;AAEvD,MAAM,UAAU,GAAG,mBAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,mFAAmF,IAAI,EAAE,CAC5F,CAAC;AAEO,gCAAU"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ import type { TSESLint } from "@typescript-eslint/utils";
2
+ export declare const rules: {
3
+ server: TSESLint.RuleModule<"importViolation" | "encodedGlobal" | "ioGlobal" | "schemaBoundary" | "encodedMethod", [{
4
+ [x: string]: never;
5
+ }], unknown, TSESLint.RuleListener> & {
6
+ name: string;
7
+ };
8
+ react: TSESLint.RuleModule<"importViolation" | "encodedGlobal" | "schemaBoundary" | "encodedMethod" | "componentParseMethod", [{
9
+ [x: string]: never;
10
+ }], unknown, TSESLint.RuleListener> & {
11
+ name: string;
12
+ };
13
+ };
14
+ export declare const configs: {
15
+ recommended: {
16
+ plugins: {
17
+ "@luma-layered-ts": {
18
+ rules: {
19
+ server: TSESLint.RuleModule<"importViolation" | "encodedGlobal" | "ioGlobal" | "schemaBoundary" | "encodedMethod", [{
20
+ [x: string]: never;
21
+ }], unknown, TSESLint.RuleListener> & {
22
+ name: string;
23
+ };
24
+ react: TSESLint.RuleModule<"importViolation" | "encodedGlobal" | "schemaBoundary" | "encodedMethod" | "componentParseMethod", [{
25
+ [x: string]: never;
26
+ }], unknown, TSESLint.RuleListener> & {
27
+ name: string;
28
+ };
29
+ };
30
+ };
31
+ };
32
+ rules: {
33
+ "@luma-layered-ts/server": "error";
34
+ "@luma-layered-ts/react": "error";
35
+ };
36
+ };
37
+ };
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,eAAO,MAAM,KAAK;;;;;;;;;;;CAGjB,CAAC;AAMF,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;CAUnB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.configs = exports.rules = void 0;
7
+ const server_1 = __importDefault(require("./rules/server"));
8
+ const react_1 = __importDefault(require("./rules/react"));
9
+ exports.rules = {
10
+ server: server_1.default,
11
+ react: react_1.default,
12
+ };
13
+ const plugin = {
14
+ rules: exports.rules,
15
+ };
16
+ exports.configs = {
17
+ recommended: {
18
+ plugins: {
19
+ "@luma-layered-ts": plugin,
20
+ },
21
+ rules: {
22
+ "@luma-layered-ts/server": "error",
23
+ "@luma-layered-ts/react": "error",
24
+ },
25
+ },
26
+ };
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;AACpC,0DAAkC;AAGrB,QAAA,KAAK,GAAG;IACnB,MAAM,EAAN,gBAAM;IACN,KAAK,EAAL,eAAK;CACN,CAAC;AAEF,MAAM,MAAM,GAAG;IACb,KAAK,EAAL,aAAK;CAC2B,CAAC;AAEtB,QAAA,OAAO,GAAG;IACrB,WAAW,EAAE;QACX,OAAO,EAAE;YACP,kBAAkB,EAAE,MAAM;SAC3B;QACD,KAAK,EAAE;YACL,yBAAyB,EAAE,OAAO;YAClC,wBAAwB,EAAE,OAAO;SAClC;KACmC;CACvC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const LAYER_NAMES: readonly ["core", "service", "adapter", "infra", "ui/hooks", "ui/components", "ui/pages"];
2
+ export type LayerName = (typeof LAYER_NAMES)[number];
3
+ export declare function getLayerFromPath(filePath: string): LayerName | null;
4
+ export declare function getLayerFromImport(importPath: string): LayerName | null;
5
+ export declare function canImport(from: LayerName, to: LayerName): boolean;
6
+ export declare const ENCODING_GLOBALS: Set<string>;
7
+ export declare const IO_GLOBALS: Set<string>;
8
+ export declare const SCHEMA_BOUNDARY_METHODS: Set<string>;
9
+ export declare const STRING_INTERPRETATION_METHODS: Set<string>;
10
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,2FAQd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAarD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMnE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAcvE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAGjE;AAKD,eAAO,MAAM,gBAAgB,aAU3B,CAAC;AAGH,eAAO,MAAM,UAAU,aAMrB,CAAC;AAGH,eAAO,MAAM,uBAAuB,aAWlC,CAAC;AAGH,eAAO,MAAM,6BAA6B,aAyBxC,CAAC"}
package/lib/layers.js ADDED
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STRING_INTERPRETATION_METHODS = exports.SCHEMA_BOUNDARY_METHODS = exports.IO_GLOBALS = exports.ENCODING_GLOBALS = exports.LAYER_NAMES = void 0;
4
+ exports.getLayerFromPath = getLayerFromPath;
5
+ exports.getLayerFromImport = getLayerFromImport;
6
+ exports.canImport = canImport;
7
+ exports.LAYER_NAMES = [
8
+ "core",
9
+ "service",
10
+ "adapter",
11
+ "infra",
12
+ "ui/hooks",
13
+ "ui/components",
14
+ "ui/pages",
15
+ ];
16
+ // import行列: 各レイヤがimport可能なレイヤ (自身は常に可)
17
+ const allowedImports = {
18
+ core: [],
19
+ service: ["core"],
20
+ adapter: ["core", "service"],
21
+ infra: ["core", "service", "adapter"],
22
+ "ui/hooks": ["core", "service"],
23
+ "ui/components": ["core", "ui/hooks"],
24
+ "ui/pages": ["core", "service", "ui/hooks", "ui/components"],
25
+ };
26
+ function getLayerFromPath(filePath) {
27
+ const match = filePath.match(/\/src\/(ui\/(?:hooks|components|pages)|core|service|adapter|infra)\//);
28
+ if (!match)
29
+ return null;
30
+ return match[1];
31
+ }
32
+ function getLayerFromImport(importPath) {
33
+ for (const layer of exports.LAYER_NAMES) {
34
+ if (importPath.includes(`/${layer}/`) ||
35
+ importPath.startsWith(`${layer}/`) ||
36
+ importPath === layer) {
37
+ return layer;
38
+ }
39
+ if (importPath.startsWith(`@/${layer}/`) || importPath === `@/${layer}`) {
40
+ return layer;
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ function canImport(from, to) {
46
+ if (from === to)
47
+ return true;
48
+ return allowedImports[from].includes(to);
49
+ }
50
+ // --- Encoded representation restrictions ---
51
+ // Globals that interact with encoded representations (serialization, parsing)
52
+ exports.ENCODING_GLOBALS = new Set([
53
+ "JSON",
54
+ "parseInt",
55
+ "parseFloat",
56
+ "encodeURIComponent",
57
+ "decodeURIComponent",
58
+ "encodeURI",
59
+ "decodeURI",
60
+ "atob",
61
+ "btoa",
62
+ ]);
63
+ // IO boundary globals
64
+ exports.IO_GLOBALS = new Set([
65
+ "fetch",
66
+ "Request",
67
+ "Response",
68
+ "Headers",
69
+ "FormData",
70
+ ]);
71
+ // Schema boundary methods (decode/encode = canonical ↔ encoded conversion)
72
+ exports.SCHEMA_BOUNDARY_METHODS = new Set([
73
+ "decode",
74
+ "decodeSync",
75
+ "decodeUnknown",
76
+ "decodeUnknownSync",
77
+ "decodePromise",
78
+ "encode",
79
+ "encodeSync",
80
+ "encodeUnknown",
81
+ "encodeUnknownSync",
82
+ "encodePromise",
83
+ ]);
84
+ // String interpretation methods (structural access, pattern matching, content inspection)
85
+ exports.STRING_INTERPRETATION_METHODS = new Set([
86
+ "split",
87
+ "match",
88
+ "matchAll",
89
+ "replace",
90
+ "replaceAll",
91
+ "search",
92
+ "includes",
93
+ "startsWith",
94
+ "endsWith",
95
+ "indexOf",
96
+ "lastIndexOf",
97
+ "slice",
98
+ "substring",
99
+ "charAt",
100
+ "charCodeAt",
101
+ "codePointAt",
102
+ "normalize",
103
+ "padStart",
104
+ "padEnd",
105
+ "repeat",
106
+ "localeCompare",
107
+ "trim",
108
+ "trimStart",
109
+ "trimEnd",
110
+ ]);
111
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":";;;AAuBA,4CAMC;AAED,gDAcC;AAED,8BAGC;AAlDY,QAAA,WAAW,GAAG;IACzB,MAAM;IACN,SAAS;IACT,SAAS;IACT,OAAO;IACP,UAAU;IACV,eAAe;IACf,UAAU;CACF,CAAC;AAIX,uCAAuC;AACvC,MAAM,cAAc,GAA4C;IAC9D,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC5B,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;IACrC,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC/B,eAAe,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;IACrC,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC;CAC7D,CAAC;AAEF,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAC1B,sEAAsE,CACvE,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,KAAK,CAAC,CAAC,CAAc,CAAC;AAC/B,CAAC;AAED,SAAgB,kBAAkB,CAAC,UAAkB;IACnD,KAAK,MAAM,KAAK,IAAI,mBAAW,EAAE,CAAC;QAChC,IACE,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC;YACjC,UAAU,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC;YAClC,UAAU,KAAK,KAAK,EACpB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,UAAU,KAAK,KAAK,KAAK,EAAE,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,SAAS,CAAC,IAAe,EAAE,EAAa;IACtD,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,8CAA8C;AAE9C,8EAA8E;AACjE,QAAA,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM;IACN,UAAU;IACV,YAAY;IACZ,oBAAoB;IACpB,oBAAoB;IACpB,WAAW;IACX,WAAW;IACX,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,sBAAsB;AACT,QAAA,UAAU,GAAG,IAAI,GAAG,CAAC;IAChC,OAAO;IACP,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC,CAAC;AAEH,2EAA2E;AAC9D,QAAA,uBAAuB,GAAG,IAAI,GAAG,CAAC;IAC7C,QAAQ;IACR,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,eAAe;IACf,QAAQ;IACR,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,eAAe;CAChB,CAAC,CAAC;AAEH,0FAA0F;AAC7E,QAAA,6BAA6B,GAAG,IAAI,GAAG,CAAC;IACnD,OAAO;IACP,OAAO;IACP,UAAU;IACV,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;IACT,aAAa;IACb,OAAO;IACP,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,WAAW;IACX,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,eAAe;IACf,MAAM;IACN,WAAW;IACX,SAAS;CACV,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ type Options = Record<string, never>;
2
+ type MessageId = "importViolation" | "encodedGlobal" | "schemaBoundary" | "encodedMethod" | "componentParseMethod";
3
+ declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
4
+ name: string;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":"AAYA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAQrC,KAAK,SAAS,GACV,iBAAiB,GACjB,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,sBAAsB,CAAC;;;;AAE3B,wBAqJG"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@typescript-eslint/utils");
4
+ const create_rule_js_1 = require("../create-rule.js");
5
+ const layers_js_1 = require("../layers.js");
6
+ const defaultOptions = {};
7
+ const UI_LAYERS = new Set(["ui/hooks", "ui/components", "ui/pages"]);
8
+ // components can call .display(), .trim(), .toString() — these don't interpret structure
9
+ const COMPONENT_ALLOWED_METHODS = new Set(["display", "trim", "toString"]);
10
+ exports.default = (0, create_rule_js_1.createRule)({
11
+ name: "react",
12
+ meta: {
13
+ type: "problem",
14
+ docs: {
15
+ description: "Enforce layered architecture for React UI layers (ui/hooks, ui/components, ui/pages). Checks imports, encoded representation globals, Schema boundary, and string interpretation.",
16
+ },
17
+ messages: {
18
+ importViolation: "'{{fromLayer}}' cannot import from '{{toLayer}}'.",
19
+ encodedGlobal: "'{{name}}' is an encoded representation API. Not allowed in '{{layer}}'. Use canonical types (Effect.ts) instead.",
20
+ schemaBoundary: "Schema.{{method}}() crosses the canonical/encoded boundary. Not allowed in '{{layer}}'. Decoding belongs in adapter.",
21
+ encodedMethod: "'.{{method}}()' interprets encoded representation. Not allowed in '{{layer}}'.",
22
+ componentParseMethod: "'.{{method}}()' interprets string structure. Components may only call .display() and .trim().",
23
+ },
24
+ schema: [],
25
+ },
26
+ defaultOptions: [defaultOptions],
27
+ create(context) {
28
+ const filePath = context.filename;
29
+ const layer = (0, layers_js_1.getLayerFromPath)(filePath);
30
+ if (!layer || !UI_LAYERS.has(layer))
31
+ return {};
32
+ const isComponent = layer === "ui/components";
33
+ function checkImport(importPath, node) {
34
+ const toLayer = (0, layers_js_1.getLayerFromImport)(importPath);
35
+ if (!toLayer)
36
+ return;
37
+ if (!(0, layers_js_1.canImport)(layer, toLayer)) {
38
+ context.report({
39
+ node,
40
+ messageId: "importViolation",
41
+ data: { fromLayer: layer, toLayer },
42
+ });
43
+ }
44
+ }
45
+ return {
46
+ // --- Import checks ---
47
+ ImportDeclaration(node) {
48
+ checkImport(node.source.value, node);
49
+ },
50
+ ImportExpression(node) {
51
+ if (node.source.type === utils_1.AST_NODE_TYPES.Literal &&
52
+ typeof node.source.value === "string") {
53
+ checkImport(node.source.value, node);
54
+ }
55
+ },
56
+ TSExternalModuleReference(node) {
57
+ if (node.expression.type === utils_1.AST_NODE_TYPES.Literal &&
58
+ typeof node.expression.value === "string") {
59
+ checkImport(node.expression.value, node);
60
+ }
61
+ },
62
+ // --- Encoding globals (all UI layers) ---
63
+ Identifier(node) {
64
+ if (!layers_js_1.ENCODING_GLOBALS.has(node.name))
65
+ return;
66
+ // Skip property access right-hand side
67
+ if (node.parent?.type === utils_1.AST_NODE_TYPES.MemberExpression &&
68
+ node.parent.property === node &&
69
+ !node.parent.computed) {
70
+ return;
71
+ }
72
+ // Skip type contexts
73
+ if (isInTypeContext(node))
74
+ return;
75
+ context.report({
76
+ node,
77
+ messageId: "encodedGlobal",
78
+ data: { name: node.name, layer },
79
+ });
80
+ },
81
+ // --- Schema boundary + string interpretation ---
82
+ CallExpression(node) {
83
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression ||
84
+ node.callee.property.type !== utils_1.AST_NODE_TYPES.Identifier) {
85
+ return;
86
+ }
87
+ const method = node.callee.property.name;
88
+ // Schema boundary (all UI layers)
89
+ if (layers_js_1.SCHEMA_BOUNDARY_METHODS.has(method)) {
90
+ context.report({
91
+ node,
92
+ messageId: "schemaBoundary",
93
+ data: { method, layer },
94
+ });
95
+ return;
96
+ }
97
+ // toString is always allowed
98
+ if (method === "toString")
99
+ return;
100
+ if (isComponent) {
101
+ // Components: display/trim allowed, parse methods forbidden
102
+ if (COMPONENT_ALLOWED_METHODS.has(method))
103
+ return;
104
+ if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
105
+ context.report({
106
+ node,
107
+ messageId: "componentParseMethod",
108
+ data: { method },
109
+ });
110
+ }
111
+ }
112
+ else {
113
+ // hooks/pages: all string interpretation forbidden
114
+ if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
115
+ context.report({
116
+ node,
117
+ messageId: "encodedMethod",
118
+ data: { method, layer },
119
+ });
120
+ }
121
+ }
122
+ },
123
+ };
124
+ function isInTypeContext(node) {
125
+ let current = node.parent;
126
+ while (current) {
127
+ if (current.type.startsWith("TS") &&
128
+ current.type !== utils_1.AST_NODE_TYPES.TSAsExpression &&
129
+ current.type !== utils_1.AST_NODE_TYPES.TSSatisfiesExpression) {
130
+ return true;
131
+ }
132
+ current = current.parent;
133
+ }
134
+ return false;
135
+ }
136
+ },
137
+ });
138
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/rules/react.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ type Options = Record<string, never>;
2
+ type MessageId = "importViolation" | "encodedGlobal" | "ioGlobal" | "schemaBoundary" | "encodedMethod";
3
+ declare const _default: import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<MessageId, [Options], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
4
+ name: string;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rules/server.ts"],"names":[],"mappings":"AAaA,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAWrC,KAAK,SAAS,GACV,iBAAiB,GACjB,eAAe,GACf,UAAU,GACV,gBAAgB,GAChB,eAAe,CAAC;;;;AAEpB,wBAkJG"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@typescript-eslint/utils");
4
+ const create_rule_js_1 = require("../create-rule.js");
5
+ const layers_js_1 = require("../layers.js");
6
+ const defaultOptions = {};
7
+ const SERVER_LAYERS = new Set([
8
+ "core",
9
+ "service",
10
+ "adapter",
11
+ "infra",
12
+ ]);
13
+ const INNER_LAYERS = new Set(["core", "service"]);
14
+ exports.default = (0, create_rule_js_1.createRule)({
15
+ name: "server",
16
+ meta: {
17
+ type: "problem",
18
+ docs: {
19
+ description: "Enforce layered architecture for server-side layers (core, service, adapter, infra). Checks imports, encoded representation globals, Schema boundary, and string interpretation.",
20
+ },
21
+ messages: {
22
+ importViolation: "'{{fromLayer}}' cannot import from '{{toLayer}}'.",
23
+ encodedGlobal: "'{{name}}' is an encoded representation API. Not allowed in '{{layer}}'. Use canonical types (Effect.ts) instead.",
24
+ ioGlobal: "'{{name}}' is an IO boundary API. Not allowed in '{{layer}}'. IO belongs in infra.",
25
+ schemaBoundary: "Schema.{{method}}() crosses the canonical/encoded boundary. Only allowed in adapter/infra. Current layer: '{{layer}}'.",
26
+ encodedMethod: "'.{{method}}()' interprets encoded representation. Not allowed in '{{layer}}'. Encoded interpretation belongs in adapter.",
27
+ },
28
+ schema: [],
29
+ },
30
+ defaultOptions: [defaultOptions],
31
+ create(context) {
32
+ const filePath = context.filename;
33
+ const layer = (0, layers_js_1.getLayerFromPath)(filePath);
34
+ if (!layer || !SERVER_LAYERS.has(layer))
35
+ return {};
36
+ const isInner = INNER_LAYERS.has(layer);
37
+ function checkImport(importPath, node) {
38
+ const toLayer = (0, layers_js_1.getLayerFromImport)(importPath);
39
+ if (!toLayer)
40
+ return;
41
+ if (!(0, layers_js_1.canImport)(layer, toLayer)) {
42
+ context.report({
43
+ node,
44
+ messageId: "importViolation",
45
+ data: { fromLayer: layer, toLayer },
46
+ });
47
+ }
48
+ }
49
+ return {
50
+ // --- Import checks (all server layers) ---
51
+ ImportDeclaration(node) {
52
+ checkImport(node.source.value, node);
53
+ },
54
+ ImportExpression(node) {
55
+ if (node.source.type === utils_1.AST_NODE_TYPES.Literal &&
56
+ typeof node.source.value === "string") {
57
+ checkImport(node.source.value, node);
58
+ }
59
+ },
60
+ TSExternalModuleReference(node) {
61
+ if (node.expression.type === utils_1.AST_NODE_TYPES.Literal &&
62
+ typeof node.expression.value === "string") {
63
+ checkImport(node.expression.value, node);
64
+ }
65
+ },
66
+ // --- Inner layer restrictions (core/service only) ---
67
+ ...(isInner
68
+ ? {
69
+ // Restricted globals
70
+ Identifier(node) {
71
+ // Skip property access right-hand side (obj.JSON is fine)
72
+ if (node.parent?.type === utils_1.AST_NODE_TYPES.MemberExpression &&
73
+ node.parent.property === node &&
74
+ !node.parent.computed) {
75
+ return;
76
+ }
77
+ // Skip type contexts
78
+ if (isInTypeContext(node))
79
+ return;
80
+ if (layers_js_1.ENCODING_GLOBALS.has(node.name)) {
81
+ context.report({
82
+ node,
83
+ messageId: "encodedGlobal",
84
+ data: { name: node.name, layer },
85
+ });
86
+ }
87
+ else if (layers_js_1.IO_GLOBALS.has(node.name)) {
88
+ context.report({
89
+ node,
90
+ messageId: "ioGlobal",
91
+ data: { name: node.name, layer },
92
+ });
93
+ }
94
+ },
95
+ // Schema boundary + string interpretation methods
96
+ CallExpression(node) {
97
+ if (node.callee.type !== utils_1.AST_NODE_TYPES.MemberExpression ||
98
+ node.callee.property.type !== utils_1.AST_NODE_TYPES.Identifier) {
99
+ return;
100
+ }
101
+ const method = node.callee.property.name;
102
+ if (layers_js_1.SCHEMA_BOUNDARY_METHODS.has(method)) {
103
+ context.report({
104
+ node,
105
+ messageId: "schemaBoundary",
106
+ data: { method, layer },
107
+ });
108
+ return;
109
+ }
110
+ // toString is allowed (logging, debugging)
111
+ if (method === "toString")
112
+ return;
113
+ if (layers_js_1.STRING_INTERPRETATION_METHODS.has(method)) {
114
+ context.report({
115
+ node,
116
+ messageId: "encodedMethod",
117
+ data: { method, layer },
118
+ });
119
+ }
120
+ },
121
+ }
122
+ : {}),
123
+ };
124
+ function isInTypeContext(node) {
125
+ let current = node.parent;
126
+ while (current) {
127
+ if (current.type.startsWith("TS") &&
128
+ current.type !== utils_1.AST_NODE_TYPES.TSAsExpression &&
129
+ current.type !== utils_1.AST_NODE_TYPES.TSSatisfiesExpression) {
130
+ return true;
131
+ }
132
+ current = current.parent;
133
+ }
134
+ return false;
135
+ }
136
+ },
137
+ });
138
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/rules/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,57 @@
1
1
  {
2
2
  "name": "@luma-layered-ts/eslint-plugin",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "ESLint plugin for luma-layered-ts architecture",
8
+ "main": "lib/index.js",
9
+ "types": "lib/index.d.ts",
10
+ "files": [
11
+ "lib"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/LumaKernel/luma-layered-ts",
16
+ "directory": "packages/eslint-plugin"
17
+ },
18
+ "homepage": "https://github.com/LumaKernel/luma-layered-ts/tree/main/packages/eslint-plugin",
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json",
21
+ "test": "vitest",
22
+ "test-cov": "vitest --coverage",
23
+ "lint": "eslint src && prettier . --list-different",
24
+ "lint-fix": "eslint src && prettier . --write",
25
+ "typecheck": "tsc --noEmit"
26
+ },
27
+ "keywords": [
28
+ "eslint",
29
+ "eslintplugin",
30
+ "typescript",
31
+ "layered-architecture"
32
+ ],
33
+ "author": "Luma <world@luma.email>",
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@typescript-eslint/rule-tester": "^8.67.0",
37
+ "@typescript-eslint/utils": "^8.67.0"
38
+ },
39
+ "devDependencies": {
40
+ "@eslint/js": "^10.0.1",
41
+ "@types/node": "^24.0.3",
42
+ "@typescript-eslint/eslint-plugin": "^8.67.0",
43
+ "@typescript-eslint/parser": "^8.67.0",
44
+ "@vitest/coverage-v8": "^3.2.4",
45
+ "eslint": "^10.0.0",
46
+ "prettier": "^3.5.3",
47
+ "semantic-release": "^25.0.9",
48
+ "typescript": "^5.8.3",
49
+ "typescript-eslint": "^8.67.0",
50
+ "vitest": "^3.2.4"
51
+ },
52
+ "peerDependencies": {
53
+ "@typescript-eslint/parser": "^8.0.0",
54
+ "eslint": "^9.0.0 || ^10.0.0",
55
+ "typescript": "^5.0.0"
56
+ }
57
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.