@simplysm/lint 13.0.99 → 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.
- package/dist/eslint-plugin.js +7 -10
- package/dist/eslint-plugin.js.map +1 -6
- package/dist/eslint-recommended.d.ts +2 -1
- package/dist/eslint-recommended.d.ts.map +1 -1
- package/dist/eslint-recommended.js +147 -244
- package/dist/eslint-recommended.js.map +1 -6
- package/dist/rules/no-hard-private.d.ts +6 -6
- package/dist/rules/no-hard-private.js +109 -88
- package/dist/rules/no-hard-private.js.map +1 -6
- package/dist/rules/no-subpath-imports-from-simplysm.d.ts +5 -5
- package/dist/rules/no-subpath-imports-from-simplysm.js +72 -60
- package/dist/rules/no-subpath-imports-from-simplysm.js.map +1 -6
- package/dist/rules/ts-no-throw-not-implemented-error.d.ts +5 -5
- package/dist/rules/ts-no-throw-not-implemented-error.js +92 -58
- package/dist/rules/ts-no-throw-not-implemented-error.js.map +1 -6
- package/dist/utils/create-rule.d.ts +3 -3
- package/dist/utils/create-rule.js +19 -7
- package/dist/utils/create-rule.js.map +1 -6
- package/package.json +9 -12
- package/src/eslint-recommended.ts +28 -115
- package/src/rules/no-hard-private.ts +23 -23
- package/src/rules/no-subpath-imports-from-simplysm.ts +13 -13
- package/src/rules/ts-no-throw-not-implemented-error.ts +14 -14
- package/src/utils/create-rule.ts +3 -3
- package/README.md +0 -81
- package/tests/no-hard-private.spec.ts +0 -888
- package/tests/no-subpath-imports-from-simplysm.spec.ts +0 -311
- package/tests/recommended.spec.ts +0 -145
- package/tests/ts-no-throw-not-implemented-error.spec.ts +0 -245
- package/tests/vitest.setup.ts +0 -10
|
@@ -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
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
2
|
+
* `@simplysm/*` 패키지에서 'src' 하위 경로 import를 금지하는 ESLint 규칙.
|
|
3
3
|
*
|
|
4
4
|
* @remarks
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
2
|
+
* `@simplysm/core-common`의 `NotImplementedError` 사용을 감지하고 경고하는 ESLint 규칙.
|
|
3
3
|
*
|
|
4
4
|
* @remarks
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* `@simplysm/core-common`에서 import한 `NotImplementedError`를 `new`로 인스턴스화하는 코드를 감지합니다.
|
|
6
|
+
* 미구현 코드가 프로덕션에 포함되는 것을 방지합니다.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
3
|
+
* ESLint 규칙을 생성하는 팩토리 함수.
|
|
4
4
|
*
|
|
5
5
|
* @remarks
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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"}
|