@simplysm/lint 13.0.100 → 14.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.
@@ -1,95 +1,116 @@
1
1
  import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
2
  import { createRule } from "../utils/create-rule.js";
3
3
  function isClassMemberWithAccessibility(node) {
4
- return node?.type === AST_NODE_TYPES.PropertyDefinition || node?.type === AST_NODE_TYPES.MethodDefinition || node?.type === AST_NODE_TYPES.AccessorProperty;
4
+ return (node?.type === AST_NODE_TYPES.PropertyDefinition ||
5
+ node?.type === AST_NODE_TYPES.MethodDefinition ||
6
+ node?.type === AST_NODE_TYPES.AccessorProperty);
5
7
  }
6
- var no_hard_private_default = createRule({
7
- name: "no-hard-private",
8
- meta: {
9
- type: "problem",
10
- docs: {
11
- description: 'Enforces TypeScript "private _" style instead of hard private fields (#).'
8
+ /**
9
+ * ECMAScript private 필드(`#field`)를 제한하고 TypeScript `private` 키워드 사용을 강제하는 ESLint 규칙.
10
+ *
11
+ * @remarks
12
+ * 이 규칙이 검사하는 항목:
13
+ * - 클래스 필드 선언: `#field`
14
+ * - 클래스 메서드 선언: `#method()`
15
+ * - 클래스 접근자 선언: `accessor #field`
16
+ * - 멤버 접근 표현식: `this.#field`
17
+ */
18
+ export default createRule({
19
+ name: "no-hard-private",
20
+ meta: {
21
+ type: "problem",
22
+ docs: {
23
+ description: 'hard private 필드(#) 대신 TypeScript "private _" 스타일을 강제합니다.',
24
+ },
25
+ messages: {
26
+ preferSoftPrivate: 'hard private 필드(#)는 사용할 수 없습니다. "private _" 스타일을 사용하세요.',
27
+ nameConflict: 'hard private 필드 "#{{name}}"을(를) "_{{name}}"(으)로 변환할 수 없습니다. 동일한 이름의 멤버가 이미 존재합니다.',
28
+ },
29
+ fixable: "code",
30
+ schema: [],
12
31
  },
13
- messages: {
14
- preferSoftPrivate: 'Hard private fields (#) are not allowed. Use the "private _" style instead.',
15
- nameConflict: 'Cannot convert hard private field "#{{name}}" to "_{{name}}". A member with the same name already exists.'
32
+ defaultOptions: [],
33
+ create(context) {
34
+ const sourceCode = context.sourceCode;
35
+ // 중첩 클래스 지원을 위한 스택 구조
36
+ const classStack = [];
37
+ return {
38
+ // 0. 클래스 진입 시 멤버 이름 수집
39
+ "ClassBody"(node) {
40
+ const memberNames = new Set();
41
+ for (const member of node.body) {
42
+ if (!("key" in member))
43
+ continue;
44
+ const key = member.key;
45
+ if (key.type === AST_NODE_TYPES.Identifier) {
46
+ memberNames.add(key.name);
47
+ }
48
+ }
49
+ classStack.push(memberNames);
50
+ },
51
+ "ClassBody:exit"() {
52
+ classStack.pop();
53
+ },
54
+ // 1. 선언 감지 (PropertyDefinition, MethodDefinition, AccessorProperty)
55
+ "PropertyDefinition > PrivateIdentifier, MethodDefinition > PrivateIdentifier, AccessorProperty > PrivateIdentifier"(node) {
56
+ const parent = node.parent;
57
+ if (!isClassMemberWithAccessibility(parent)) {
58
+ return;
59
+ }
60
+ const identifierName = node.name; // '#' 문자를 제외한 이름
61
+ const targetName = `_${identifierName}`;
62
+ const currentClassMembers = classStack.at(-1);
63
+ // 이름 충돌 확인
64
+ if (currentClassMembers?.has(targetName)) {
65
+ context.report({
66
+ node,
67
+ messageId: "nameConflict",
68
+ data: { name: identifierName },
69
+ });
70
+ return;
71
+ }
72
+ context.report({
73
+ node,
74
+ messageId: "preferSoftPrivate",
75
+ fix(fixer) {
76
+ const fixes = [];
77
+ // 1-1. 이름 변경 (#a -> _a)
78
+ fixes.push(fixer.replaceText(node, targetName));
79
+ // 1-2. 'private' 접근 제어자를 추가할 위치 계산
80
+ if (parent.accessibility == null) {
81
+ // 기본 삽입 위치: 부모 노드의 시작 (static, async 등 포함)
82
+ let tokenToInsertBefore = sourceCode.getFirstToken(parent);
83
+ // 데코레이터가 있으면 마지막 데코레이터 다음 토큰 앞에 삽입
84
+ // (@Deco private static _foo)
85
+ if (parent.decorators.length > 0) {
86
+ const lastDecorator = parent.decorators.at(-1);
87
+ tokenToInsertBefore = sourceCode.getTokenAfter(lastDecorator);
88
+ }
89
+ // tokenToInsertBefore는 현재 'static', 'async', 'readonly', 또는 변수명('_foo')입니다.
90
+ // 앞에 'private '를 삽입하면 자연스럽게 'private static ...' 순서가 됩니다.
91
+ // tokenToInsertBefore가 null이면 AST 파싱 오류 등의 예외 상황을 나타냅니다.
92
+ // 이런 경우 이름만 변경되는 불완전한 수정을 방지하기 위해 전체 수정을 건너뜁니다.
93
+ if (tokenToInsertBefore == null) {
94
+ return [];
95
+ }
96
+ fixes.push(fixer.insertTextBefore(tokenToInsertBefore, "private "));
97
+ }
98
+ return fixes;
99
+ },
100
+ });
101
+ },
102
+ // 2. 사용 감지 (this.#field)
103
+ "MemberExpression > PrivateIdentifier"(node) {
104
+ const identifierName = node.name;
105
+ context.report({
106
+ node,
107
+ messageId: "preferSoftPrivate",
108
+ fix(fixer) {
109
+ return fixer.replaceText(node, `_${identifierName}`);
110
+ },
111
+ });
112
+ },
113
+ };
16
114
  },
17
- fixable: "code",
18
- schema: []
19
- },
20
- defaultOptions: [],
21
- create(context) {
22
- const sourceCode = context.sourceCode;
23
- const classStack = [];
24
- return {
25
- // 0. Collect member names when entering a class
26
- "ClassBody"(node) {
27
- const memberNames = /* @__PURE__ */ new Set();
28
- for (const member of node.body) {
29
- if (!("key" in member)) continue;
30
- const key = member.key;
31
- if (key.type === AST_NODE_TYPES.Identifier) {
32
- memberNames.add(key.name);
33
- }
34
- }
35
- classStack.push(memberNames);
36
- },
37
- "ClassBody:exit"() {
38
- classStack.pop();
39
- },
40
- // 1. Detect declarations (PropertyDefinition, MethodDefinition, AccessorProperty)
41
- "PropertyDefinition > PrivateIdentifier, MethodDefinition > PrivateIdentifier, AccessorProperty > PrivateIdentifier"(node) {
42
- const parent = node.parent;
43
- if (!isClassMemberWithAccessibility(parent)) {
44
- return;
45
- }
46
- const identifierName = node.name;
47
- const targetName = `_${identifierName}`;
48
- const currentClassMembers = classStack.at(-1);
49
- if (currentClassMembers?.has(targetName)) {
50
- context.report({
51
- node,
52
- messageId: "nameConflict",
53
- data: { name: identifierName }
54
- });
55
- return;
56
- }
57
- context.report({
58
- node,
59
- messageId: "preferSoftPrivate",
60
- fix(fixer) {
61
- const fixes = [];
62
- fixes.push(fixer.replaceText(node, targetName));
63
- if (parent.accessibility == null) {
64
- let tokenToInsertBefore = sourceCode.getFirstToken(parent);
65
- if (parent.decorators.length > 0) {
66
- const lastDecorator = parent.decorators.at(-1);
67
- tokenToInsertBefore = sourceCode.getTokenAfter(lastDecorator);
68
- }
69
- if (tokenToInsertBefore == null) {
70
- return [];
71
- }
72
- fixes.push(fixer.insertTextBefore(tokenToInsertBefore, "private "));
73
- }
74
- return fixes;
75
- }
76
- });
77
- },
78
- // 2. Detect usage (this.#field)
79
- "MemberExpression > PrivateIdentifier"(node) {
80
- const identifierName = node.name;
81
- context.report({
82
- node,
83
- messageId: "preferSoftPrivate",
84
- fix(fixer) {
85
- return fixer.replaceText(node, `_${identifierName}`);
86
- }
87
- });
88
- }
89
- };
90
- }
91
115
  });
92
- export {
93
- no_hard_private_default as default
94
- };
95
- //# sourceMappingURL=no-hard-private.js.map
116
+ //# sourceMappingURL=no-hard-private.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/rules/no-hard-private.ts"],
4
- "mappings": "AAAA,SAAS,sBAAqC;AAE9C,SAAS,kBAAkB;AAO3B,SAAS,+BACP,MACsC;AACtC,SACE,MAAM,SAAS,eAAe,sBAC9B,MAAM,SAAS,eAAe,oBAC9B,MAAM,SAAS,eAAe;AAElC;AAYA,IAAO,0BAAQ,WAAW;AAAA,EACxB,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,mBACE;AAAA,MACF,cACE;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,EACX;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB,OAAO,SAAS;AACd,UAAM,aAAa,QAAQ;AAE3B,UAAM,aAA4B,CAAC;AAEnC,WAAO;AAAA;AAAA,MAEL,YAAY,MAA0B;AACpC,cAAM,cAAc,oBAAI,IAAY;AACpC,mBAAW,UAAU,KAAK,MAAM;AAC9B,cAAI,EAAE,SAAS,QAAS;AACxB,gBAAM,MAAM,OAAO;AACnB,cAAI,IAAI,SAAS,eAAe,YAAY;AAC1C,wBAAY,IAAI,IAAI,IAAI;AAAA,UAC1B;AAAA,QACF;AACA,mBAAW,KAAK,WAAW;AAAA,MAC7B;AAAA,MAEA,mBAAmB;AACjB,mBAAW,IAAI;AAAA,MACjB;AAAA;AAAA,MAGA,qHACE,MACA;AACA,cAAM,SAAS,KAAK;AACpB,YAAI,CAAC,+BAA+B,MAAM,GAAG;AAC3C;AAAA,QACF;AAEA,cAAM,iBAAiB,KAAK;AAC5B,cAAM,aAAa,IAAI,cAAc;AACrC,cAAM,sBAAsB,WAAW,GAAG,EAAE;AAG5C,YAAI,qBAAqB,IAAI,UAAU,GAAG;AACxC,kBAAQ,OAAO;AAAA,YACb;AAAA,YACA,WAAW;AAAA,YACX,MAAM,EAAE,MAAM,eAAe;AAAA,UAC/B,CAAC;AACD;AAAA,QACF;AAEA,gBAAQ,OAAO;AAAA,UACb;AAAA,UACA,WAAW;AAAA,UACX,IAAI,OAAO;AACT,kBAAM,QAAmB,CAAC;AAG1B,kBAAM,KAAK,MAAM,YAAY,MAAM,UAAU,CAAC;AAG9C,gBAAI,OAAO,iBAAiB,MAAM;AAEhC,kBAAI,sBAAsB,WAAW,cAAc,MAAM;AAIzD,kBAAI,OAAO,WAAW,SAAS,GAAG;AAChC,sBAAM,gBAAgB,OAAO,WAAW,GAAG,EAAE;AAC7C,sCAAsB,WAAW,cAAc,aAAa;AAAA,cAC9D;AAMA,kBAAI,uBAAuB,MAAM;AAC/B,uBAAO,CAAC;AAAA,cACV;AACA,oBAAM,KAAK,MAAM,iBAAiB,qBAAqB,UAAU,CAAC;AAAA,YACpE;AAEA,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,uCAAuC,MAAkC;AACvE,cAAM,iBAAiB,KAAK;AAC5B,gBAAQ,OAAO;AAAA,UACb;AAAA,UACA,WAAW;AAAA,UACX,IAAI,OAAO;AACT,mBAAO,MAAM,YAAY,MAAM,IAAI,cAAc,EAAE;AAAA,UACrD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF,CAAC;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"no-hard-private.js","sourceRoot":"","sources":["../../src/rules/no-hard-private.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  /**
2
- * ESLint rule that prohibits 'src' subpath imports from `@simplysm/*` packages.
2
+ * `@simplysm/*` 패키지에서 'src' 하위 경로 import를 금지하는 ESLint 규칙.
3
3
  *
4
4
  * @remarks
5
- * This rule checks:
6
- * - Static import statements: `import ... from '...'`
7
- * - Dynamic imports: `import('...')`
8
- * - Re-export statements: `export { ... } from '...'`, `export * from '...'`
5
+ * 규칙이 검사하는 항목:
6
+ * - 정적 import 문: `import ... from '...'`
7
+ * - 동적 import: `import('...')`
8
+ * - 재내보내기 문: `export { ... } from '...'`, `export * from '...'`
9
9
  */
10
10
  declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noSubpathImport", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
11
11
  name: string;
@@ -1,64 +1,76 @@
1
1
  import { AST_NODE_TYPES, TSESTree } from "@typescript-eslint/utils";
2
2
  import { createRule } from "../utils/create-rule.js";
3
- var no_subpath_imports_from_simplysm_default = createRule({
4
- name: "no-subpath-imports-from-simplysm",
5
- meta: {
6
- type: "problem",
7
- docs: {
8
- description: "Prohibits 'src' subpath imports from @simplysm packages. (e.g., @simplysm/pkg/src/x \u2192 prohibited)"
3
+ /**
4
+ * `@simplysm/*` 패키지에서 'src' 하위 경로 import를 금지하는 ESLint 규칙.
5
+ *
6
+ * @remarks
7
+ * 이 규칙이 검사하는 항목:
8
+ * - 정적 import 문: `import ... from '...'`
9
+ * - 동적 import: `import('...')`
10
+ * - 재내보내기 문: `export { ... } from '...'`, `export * from '...'`
11
+ */
12
+ export default createRule({
13
+ name: "no-subpath-imports-from-simplysm",
14
+ meta: {
15
+ type: "problem",
16
+ docs: {
17
+ description: "@simplysm 패키지에서 'src' 하위 경로 import를 금지합니다. (예: @simplysm/pkg/src/x → 금지)",
18
+ },
19
+ fixable: "code",
20
+ schema: [],
21
+ messages: {
22
+ noSubpathImport: "'@simplysm/{{pkg}}' 패키지에서 'src' 하위 경로를 import할 수 없습니다: '{{importPath}}'",
23
+ },
24
+ },
25
+ defaultOptions: [],
26
+ create(context) {
27
+ function checkAndReport(sourceNode, importPath) {
28
+ if (!importPath.startsWith("@simplysm/"))
29
+ return;
30
+ const parts = importPath.split("/");
31
+ // 허용: @simplysm/pkg, @simplysm/pkg/xxx, @simplysm/pkg/xxx/yyy
32
+ // 금지: @simplysm/pkg/src, @simplysm/pkg/src/xxx
33
+ if (parts.length >= 3 && parts[2] === "src") {
34
+ const fixedPath = `@simplysm/${parts[1]}`;
35
+ context.report({
36
+ node: sourceNode,
37
+ messageId: "noSubpathImport",
38
+ data: {
39
+ pkg: parts[1],
40
+ importPath,
41
+ },
42
+ fix(fixer) {
43
+ const quote = sourceNode.raw[0];
44
+ return fixer.replaceText(sourceNode, `${quote}${fixedPath}${quote}`);
45
+ },
46
+ });
47
+ }
48
+ }
49
+ return {
50
+ // 정적 import: import { x } from '...'
51
+ ImportDeclaration(node) {
52
+ checkAndReport(node.source, node.source.value);
53
+ },
54
+ // 동적 import: import('...')
55
+ ImportExpression(node) {
56
+ if (node.source.type !== AST_NODE_TYPES.Literal)
57
+ return;
58
+ const importPath = node.source.value;
59
+ if (typeof importPath !== "string")
60
+ return;
61
+ checkAndReport(node.source, importPath);
62
+ },
63
+ // 재내보내기: export { x } from '...'
64
+ ExportNamedDeclaration(node) {
65
+ if (!node.source)
66
+ return;
67
+ checkAndReport(node.source, node.source.value);
68
+ },
69
+ // 전체 재내보내기: export * from '...'
70
+ ExportAllDeclaration(node) {
71
+ checkAndReport(node.source, node.source.value);
72
+ },
73
+ };
9
74
  },
10
- fixable: "code",
11
- schema: [],
12
- messages: {
13
- noSubpathImport: "Cannot import 'src' subpath from '@simplysm/{{pkg}}' package: '{{importPath}}'"
14
- }
15
- },
16
- defaultOptions: [],
17
- create(context) {
18
- function checkAndReport(sourceNode, importPath) {
19
- if (!importPath.startsWith("@simplysm/")) return;
20
- const parts = importPath.split("/");
21
- if (parts.length >= 3 && parts[2] === "src") {
22
- const fixedPath = `@simplysm/${parts[1]}`;
23
- context.report({
24
- node: sourceNode,
25
- messageId: "noSubpathImport",
26
- data: {
27
- pkg: parts[1],
28
- importPath
29
- },
30
- fix(fixer) {
31
- const quote = sourceNode.raw[0];
32
- return fixer.replaceText(sourceNode, `${quote}${fixedPath}${quote}`);
33
- }
34
- });
35
- }
36
- }
37
- return {
38
- // Static import: import { x } from '...'
39
- ImportDeclaration(node) {
40
- checkAndReport(node.source, node.source.value);
41
- },
42
- // Dynamic import: import('...')
43
- ImportExpression(node) {
44
- if (node.source.type !== AST_NODE_TYPES.Literal) return;
45
- const importPath = node.source.value;
46
- if (typeof importPath !== "string") return;
47
- checkAndReport(node.source, importPath);
48
- },
49
- // Re-export: export { x } from '...'
50
- ExportNamedDeclaration(node) {
51
- if (!node.source) return;
52
- checkAndReport(node.source, node.source.value);
53
- },
54
- // Re-export all: export * from '...'
55
- ExportAllDeclaration(node) {
56
- checkAndReport(node.source, node.source.value);
57
- }
58
- };
59
- }
60
75
  });
61
- export {
62
- no_subpath_imports_from_simplysm_default as default
63
- };
64
- //# sourceMappingURL=no-subpath-imports-from-simplysm.js.map
76
+ //# sourceMappingURL=no-subpath-imports-from-simplysm.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/rules/no-subpath-imports-from-simplysm.ts"],
4
- "mappings": "AAAA,SAAS,gBAAgB,gBAAgB;AACzC,SAAS,kBAAkB;AAW3B,IAAO,2CAAQ,WAAW;AAAA,EACxB,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,aACE;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,MACR,iBACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB,OAAO,SAAS;AACd,aAAS,eAAe,YAAoC,YAAoB;AAC9E,UAAI,CAAC,WAAW,WAAW,YAAY,EAAG;AAE1C,YAAM,QAAQ,WAAW,MAAM,GAAG;AAIlC,UAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,OAAO;AAC3C,cAAM,YAAY,aAAa,MAAM,CAAC,CAAC;AACvC,gBAAQ,OAAO;AAAA,UACb,MAAM;AAAA,UACN,WAAW;AAAA,UACX,MAAM;AAAA,YACJ,KAAK,MAAM,CAAC;AAAA,YACZ;AAAA,UACF;AAAA,UACA,IAAI,OAAO;AACT,kBAAM,QAAQ,WAAW,IAAI,CAAC;AAC9B,mBAAO,MAAM,YAAY,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,EAAE;AAAA,UACrE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA;AAAA,MAEL,kBAAkB,MAAM;AACtB,uBAAe,KAAK,QAAQ,KAAK,OAAO,KAAK;AAAA,MAC/C;AAAA;AAAA,MAGA,iBAAiB,MAAM;AACrB,YAAI,KAAK,OAAO,SAAS,eAAe,QAAS;AACjD,cAAM,aAAa,KAAK,OAAO;AAC/B,YAAI,OAAO,eAAe,SAAU;AACpC,uBAAe,KAAK,QAAQ,UAAU;AAAA,MACxC;AAAA;AAAA,MAGA,uBAAuB,MAAM;AAC3B,YAAI,CAAC,KAAK,OAAQ;AAClB,uBAAe,KAAK,QAAQ,KAAK,OAAO,KAAK;AAAA,MAC/C;AAAA;AAAA,MAGA,qBAAqB,MAAM;AACzB,uBAAe,KAAK,QAAQ,KAAK,OAAO,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF,CAAC;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"no-subpath-imports-from-simplysm.js","sourceRoot":"","sources":["../../src/rules/no-subpath-imports-from-simplysm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAe,UAAU,CAAC;IACxB,IAAI,EAAE,kCAAkC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,0EAA0E;SAC7E;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EACb,yEAAyE;SAC5E;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,SAAS,cAAc,CAAC,UAAkC,EAAE,UAAkB;YAC5E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC;gBAAE,OAAO;YAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEpC,8DAA8D;YAC9D,+CAA+C;YAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,iBAAiB;oBAC5B,IAAI,EAAE;wBACJ,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;wBACb,UAAU;qBACX;oBACD,GAAG,CAAC,KAAK;wBACP,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAChC,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;oBACvE,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,qCAAqC;YACrC,iBAAiB,CAAC,IAAI;gBACpB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YAED,2BAA2B;YAC3B,gBAAgB,CAAC,IAAI;gBACnB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;oBAAE,OAAO;gBACxD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBACrC,IAAI,OAAO,UAAU,KAAK,QAAQ;oBAAE,OAAO;gBAC3C,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC1C,CAAC;YAED,iCAAiC;YACjC,sBAAsB,CAAC,IAAI;gBACzB,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACzB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;YAED,gCAAgC;YAChC,oBAAoB,CAAC,IAAI;gBACvB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -1,16 +1,16 @@
1
1
  /**
2
- * ESLint rule that detects and warns about the use of `NotImplementedError` from `@simplysm/core-common`.
2
+ * `@simplysm/core-common`의 `NotImplementedError` 사용을 감지하고 경고하는 ESLint 규칙.
3
3
  *
4
4
  * @remarks
5
- * This rule detects code that instantiates `NotImplementedError` imported from `@simplysm/core-common` using `new`.
6
- * It prevents unimplemented code from being included in production.
5
+ * `@simplysm/core-common`에서 import한 `NotImplementedError`를 `new`로 인스턴스화하는 코드를 감지합니다.
6
+ * 미구현 코드가 프로덕션에 포함되는 것을 방지합니다.
7
7
  *
8
- * Supported import forms:
8
+ * 지원하는 import 형태:
9
9
  * - named import: `import { NotImplementedError } from "@simplysm/core-common"`
10
10
  * - aliased import: `import { NotImplementedError as NIE } from "@simplysm/core-common"`
11
11
  * - namespace import: `import * as CC from "@simplysm/core-common"` → `new CC.NotImplementedError()`
12
12
  *
13
- * Dynamic imports (`await import(...)`) are not detected.
13
+ * 동적 import (`await import(...)`) 감지하지 않습니다.
14
14
  */
15
15
  declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"noThrowNotImplementedError", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
16
16
  name: string;
@@ -1,63 +1,97 @@
1
1
  import { AST_NODE_TYPES, ASTUtils } from "@typescript-eslint/utils";
2
2
  import { createRule } from "../utils/create-rule.js";
3
- var ts_no_throw_not_implemented_error_default = createRule({
4
- name: "ts-no-throw-not-implemented-error",
5
- meta: {
6
- type: "suggestion",
7
- docs: {
8
- description: "Warns about 'NotImplementedError' usage"
3
+ /**
4
+ * `@simplysm/core-common`의 `NotImplementedError` 사용을 감지하고 경고하는 ESLint 규칙.
5
+ *
6
+ * @remarks
7
+ * `@simplysm/core-common`에서 import한 `NotImplementedError`를 `new`로 인스턴스화하는 코드를 감지합니다.
8
+ * 미구현 코드가 프로덕션에 포함되는 것을 방지합니다.
9
+ *
10
+ * 지원하는 import 형태:
11
+ * - named import: `import { NotImplementedError } from "@simplysm/core-common"`
12
+ * - aliased import: `import { NotImplementedError as NIE } from "@simplysm/core-common"`
13
+ * - namespace import: `import * as CC from "@simplysm/core-common"` → `new CC.NotImplementedError()`
14
+ *
15
+ * 동적 import (`await import(...)`)는 감지하지 않습니다.
16
+ */
17
+ export default createRule({
18
+ name: "ts-no-throw-not-implemented-error",
19
+ meta: {
20
+ type: "suggestion",
21
+ docs: {
22
+ description: "'NotImplementedError' 사용에 대해 경고합니다",
23
+ },
24
+ schema: [],
25
+ messages: {
26
+ noThrowNotImplementedError: "{{text}}",
27
+ },
9
28
  },
10
- schema: [],
11
- messages: {
12
- noThrowNotImplementedError: "{{text}}"
13
- }
14
- },
15
- defaultOptions: [],
16
- create(context) {
17
- function isImportedFromSimplysm(identifier, expectedImportedName) {
18
- const scope = context.sourceCode.getScope(identifier);
19
- const variable = ASTUtils.findVariable(scope, identifier.name);
20
- if (!variable) return false;
21
- for (const def of variable.defs) {
22
- if (def.type !== "ImportBinding") continue;
23
- if (def.parent.type !== AST_NODE_TYPES.ImportDeclaration) continue;
24
- if (def.parent.source.value !== "@simplysm/core-common") continue;
25
- if (def.node.type === AST_NODE_TYPES.ImportSpecifier && expectedImportedName != null) {
26
- const imported = def.node.imported;
27
- if (imported.type === AST_NODE_TYPES.Identifier && imported.name === expectedImportedName) {
28
- return true;
29
- }
29
+ defaultOptions: [],
30
+ create(context) {
31
+ /**
32
+ * 식별자가 @simplysm/core-common에서 import되었는지 확인합니다.
33
+ * @param identifier - 확인할 식별자
34
+ * @param expectedImportedName - named import에서 확인할 원래 이름 (namespace import의 경우 undefined)
35
+ * @returns import 소스가 @simplysm/core-common이면 true, 아니면 false
36
+ */
37
+ function isImportedFromSimplysm(identifier, expectedImportedName) {
38
+ const scope = context.sourceCode.getScope(identifier);
39
+ const variable = ASTUtils.findVariable(scope, identifier.name);
40
+ if (!variable)
41
+ return false;
42
+ for (const def of variable.defs) {
43
+ if (def.type !== "ImportBinding")
44
+ continue;
45
+ if (def.parent.type !== AST_NODE_TYPES.ImportDeclaration)
46
+ continue;
47
+ if (def.parent.source.value !== "@simplysm/core-common")
48
+ continue;
49
+ // named/aliased import: import { NotImplementedError } 또는 import { NotImplementedError as NIE }
50
+ if (def.node.type === AST_NODE_TYPES.ImportSpecifier && expectedImportedName != null) {
51
+ const imported = def.node.imported;
52
+ if (imported.type === AST_NODE_TYPES.Identifier &&
53
+ imported.name === expectedImportedName) {
54
+ return true;
55
+ }
56
+ }
57
+ // namespace import: import * as CC
58
+ if (def.node.type === AST_NODE_TYPES.ImportNamespaceSpecifier &&
59
+ expectedImportedName == null) {
60
+ return true;
61
+ }
62
+ }
63
+ return false;
30
64
  }
31
- if (def.node.type === AST_NODE_TYPES.ImportNamespaceSpecifier && expectedImportedName == null) {
32
- return true;
33
- }
34
- }
35
- return false;
36
- }
37
- return {
38
- NewExpression(node) {
39
- let shouldReport = false;
40
- if (node.callee.type === AST_NODE_TYPES.Identifier) {
41
- shouldReport = isImportedFromSimplysm(node.callee, "NotImplementedError");
42
- } else if (node.callee.type === AST_NODE_TYPES.MemberExpression && node.callee.property.type === AST_NODE_TYPES.Identifier && node.callee.property.name === "NotImplementedError" && node.callee.object.type === AST_NODE_TYPES.Identifier) {
43
- shouldReport = isImportedFromSimplysm(node.callee.object, void 0);
44
- }
45
- if (!shouldReport) return;
46
- let msg = "Not implemented";
47
- const firstArg = node.arguments.at(0);
48
- if (firstArg?.type === AST_NODE_TYPES.Literal && typeof firstArg.value === "string" && firstArg.value !== "") {
49
- msg = firstArg.value;
50
- }
51
- context.report({
52
- node,
53
- messageId: "noThrowNotImplementedError",
54
- data: { text: msg }
55
- });
56
- }
57
- };
58
- }
65
+ return {
66
+ NewExpression(node) {
67
+ let shouldReport = false;
68
+ // 케이스 1: new NotImplementedError() 또는 new NIE() (named/aliased import)
69
+ if (node.callee.type === AST_NODE_TYPES.Identifier) {
70
+ shouldReport = isImportedFromSimplysm(node.callee, "NotImplementedError");
71
+ }
72
+ // 케이스 2: new CC.NotImplementedError() (namespace import)
73
+ else if (node.callee.type === AST_NODE_TYPES.MemberExpression &&
74
+ node.callee.property.type === AST_NODE_TYPES.Identifier &&
75
+ node.callee.property.name === "NotImplementedError" &&
76
+ node.callee.object.type === AST_NODE_TYPES.Identifier) {
77
+ shouldReport = isImportedFromSimplysm(node.callee.object, undefined);
78
+ }
79
+ if (!shouldReport)
80
+ return;
81
+ let msg = "미구현";
82
+ const firstArg = node.arguments.at(0);
83
+ if (firstArg?.type === AST_NODE_TYPES.Literal &&
84
+ typeof firstArg.value === "string" &&
85
+ firstArg.value !== "") {
86
+ msg = firstArg.value;
87
+ }
88
+ context.report({
89
+ node,
90
+ messageId: "noThrowNotImplementedError",
91
+ data: { text: msg },
92
+ });
93
+ },
94
+ };
95
+ },
59
96
  });
60
- export {
61
- ts_no_throw_not_implemented_error_default as default
62
- };
63
- //# sourceMappingURL=ts-no-throw-not-implemented-error.js.map
97
+ //# sourceMappingURL=ts-no-throw-not-implemented-error.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/rules/ts-no-throw-not-implemented-error.ts"],
4
- "mappings": "AAAA,SAAS,gBAAgB,gBAA+B;AACxD,SAAS,kBAAkB;AAgB3B,IAAO,4CAAQ,WAAW;AAAA,EACxB,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,aAAa;AAAA,IACf;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,UAAU;AAAA,MACR,4BAA4B;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB,OAAO,SAAS;AAOd,aAAS,uBACP,YACA,sBACS;AACT,YAAM,QAAQ,QAAQ,WAAW,SAAS,UAAU;AACpD,YAAM,WAAW,SAAS,aAAa,OAAO,WAAW,IAAI;AAC7D,UAAI,CAAC,SAAU,QAAO;AAEtB,iBAAW,OAAO,SAAS,MAAM;AAC/B,YAAI,IAAI,SAAS,gBAAiB;AAClC,YAAI,IAAI,OAAO,SAAS,eAAe,kBAAmB;AAC1D,YAAI,IAAI,OAAO,OAAO,UAAU,wBAAyB;AAGzD,YAAI,IAAI,KAAK,SAAS,eAAe,mBAAmB,wBAAwB,MAAM;AACpF,gBAAM,WAAW,IAAI,KAAK;AAC1B,cACE,SAAS,SAAS,eAAe,cACjC,SAAS,SAAS,sBAClB;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAGA,YACE,IAAI,KAAK,SAAS,eAAe,4BACjC,wBAAwB,MACxB;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,cAAc,MAA8B;AAC1C,YAAI,eAAe;AAGnB,YAAI,KAAK,OAAO,SAAS,eAAe,YAAY;AAClD,yBAAe,uBAAuB,KAAK,QAAQ,qBAAqB;AAAA,QAC1E,WAIE,KAAK,OAAO,SAAS,eAAe,oBACpC,KAAK,OAAO,SAAS,SAAS,eAAe,cAC7C,KAAK,OAAO,SAAS,SAAS,yBAC9B,KAAK,OAAO,OAAO,SAAS,eAAe,YAC3C;AACA,yBAAe,uBAAuB,KAAK,OAAO,QAAQ,MAAS;AAAA,QACrE;AAEA,YAAI,CAAC,aAAc;AAEnB,YAAI,MAAM;AACV,cAAM,WAAW,KAAK,UAAU,GAAG,CAAC;AACpC,YACE,UAAU,SAAS,eAAe,WAClC,OAAO,SAAS,UAAU,YAC1B,SAAS,UAAU,IACnB;AACA,gBAAM,SAAS;AAAA,QACjB;AAEA,gBAAQ,OAAO;AAAA,UACb;AAAA,UACA,WAAW;AAAA,UACX,MAAM,EAAE,MAAM,IAAI;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF,CAAC;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"ts-no-throw-not-implemented-error.js","sourceRoot":"","sources":["../../src/rules/ts-no-throw-not-implemented-error.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { ESLintUtils } from "@typescript-eslint/utils";
2
2
  /**
3
- * Factory function to create ESLint rules.
3
+ * ESLint 규칙을 생성하는 팩토리 함수.
4
4
  *
5
5
  * @remarks
6
- * Wraps `RuleCreator` from `@typescript-eslint/utils` and
7
- * automatically generates rule documentation URLs.
6
+ * `@typescript-eslint/utils`의 `RuleCreator`를 래핑하며
7
+ * 규칙 문서 URL을 자동으로 생성합니다.
8
8
  *
9
9
  * @example
10
10
  * ```typescript
@@ -1,8 +1,20 @@
1
1
  import { ESLintUtils } from "@typescript-eslint/utils";
2
- const createRule = ESLintUtils.RuleCreator(
3
- (name) => `https://github.com/kslhunter/simplysm/blob/master/packages/eslint-plugin/README.md#${name}`
4
- );
5
- export {
6
- createRule
7
- };
8
- //# sourceMappingURL=create-rule.js.map
2
+ /**
3
+ * ESLint 규칙을 생성하는 팩토리 함수.
4
+ *
5
+ * @remarks
6
+ * `@typescript-eslint/utils`의 `RuleCreator`를 래핑하며
7
+ * 규칙 문서 URL을 자동으로 생성합니다.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * export default createRule({
12
+ * name: "my-rule",
13
+ * meta: { ... },
14
+ * defaultOptions: [],
15
+ * create(context) { ... },
16
+ * });
17
+ * ```
18
+ */
19
+ export const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/kslhunter/simplysm/blob/master/packages/eslint-plugin/README.md#${name}`);
20
+ //# sourceMappingURL=create-rule.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/create-rule.ts"],
4
- "mappings": "AAAA,SAAS,mBAAmB;AAmBrB,MAAM,aAAa,YAAY;AAAA,EACpC,CAAC,SACC,sFAAsF,IAAI;AAC9F;",
5
- "names": []
6
- }
1
+ {"version":3,"file":"create-rule.js","sourceRoot":"","sources":["../../src/utils/create-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAC/C,CAAC,IAAI,EAAE,EAAE,CACP,sFAAsF,IAAI,EAAE,CAC/F,CAAC"}