@simplysm/sd-cli 12.11.2 → 12.11.4

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.
Files changed (36) hide show
  1. package/dist/fix/convert-extends-sd-print-template-base-to-interface.d.ts +1 -0
  2. package/dist/fix/convert-extends-sd-print-template-base-to-interface.js +179 -0
  3. package/dist/fix/convert-extends-sd-print-template-base-to-interface.js.map +1 -0
  4. package/dist/fix/convert-flat-pages-to-flat-menus.d.ts +1 -0
  5. package/dist/fix/convert-flat-pages-to-flat-menus.js +68 -0
  6. package/dist/fix/convert-flat-pages-to-flat-menus.js.map +1 -0
  7. package/dist/fix/convert-get-menus-to-usable-menus.d.ts +1 -0
  8. package/dist/fix/convert-get-menus-to-usable-menus.js +48 -0
  9. package/dist/fix/convert-get-menus-to-usable-menus.js.map +1 -0
  10. package/dist/fix/convert-modal-show-params.d.ts +1 -1
  11. package/dist/fix/convert-modal-show-params.js +1 -1
  12. package/dist/fix/convert-modal-show-params.js.map +1 -1
  13. package/dist/fix/convert-print-params.d.ts +1 -0
  14. package/dist/fix/convert-print-params.js +37 -0
  15. package/dist/fix/convert-print-params.js.map +1 -0
  16. package/dist/fix/convert-to-use-perms-signal.d.ts +1 -0
  17. package/dist/fix/convert-to-use-perms-signal.js +99 -0
  18. package/dist/fix/convert-to-use-perms-signal.js.map +1 -0
  19. package/dist/fix/remove-unused-imports.d.ts +1 -0
  20. package/dist/fix/remove-unused-imports.js +42 -0
  21. package/dist/fix/remove-unused-imports.js.map +1 -0
  22. package/dist/fix/remove-unused-injects.d.ts +1 -0
  23. package/dist/fix/remove-unused-injects.js +38 -0
  24. package/dist/fix/remove-unused-injects.js.map +1 -0
  25. package/dist/sd-cli-entry.js +16 -1
  26. package/dist/sd-cli-entry.js.map +1 -1
  27. package/package.json +9 -9
  28. package/src/fix/convert-extends-sd-print-template-base-to-interface.ts +201 -0
  29. package/src/fix/convert-flat-pages-to-flat-menus.ts +83 -0
  30. package/src/fix/convert-get-menus-to-usable-menus.ts +60 -0
  31. package/src/fix/convert-modal-show-params.ts +1 -1
  32. package/src/fix/convert-print-params.ts +51 -0
  33. package/src/fix/convert-to-use-perms-signal.ts +133 -0
  34. package/src/fix/remove-unused-imports.ts +50 -0
  35. package/src/fix/remove-unused-injects.ts +50 -0
  36. package/src/sd-cli-entry.ts +26 -4
@@ -0,0 +1 @@
1
+ export declare function convertExtendsSdPrintTemplateBaseToInterface(): void;
@@ -0,0 +1,179 @@
1
+ /* eslint-disable no-console */
2
+ import * as path from "path";
3
+ import { SyntaxKind } from "ts-morph";
4
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
5
+ import removeNamedImport from "./core/remove-named-import";
6
+ export function convertExtendsSdPrintTemplateBaseToInterface() {
7
+ const sourceFiles = getTsMorphSourceFiles();
8
+ let totalChanged = 0;
9
+ for (const sourceFile of sourceFiles) {
10
+ let changed = false;
11
+ const relPath = path.basename(sourceFile.getFilePath());
12
+ const printClass = sourceFile.getClasses().find((classDecl) => {
13
+ const extendsClause = classDecl
14
+ .getHeritageClauses()
15
+ .find((h) => h.getToken() === SyntaxKind.ExtendsKeyword);
16
+ if (!extendsClause)
17
+ return false;
18
+ const typeNodes = extendsClause.getTypeNodes();
19
+ return typeNodes.some((typeNode) => /^SdPrintTemplateBase\s*<[^>]+>$/.test(typeNode.getText()));
20
+ });
21
+ if (!printClass)
22
+ continue;
23
+ const extendsClause = printClass
24
+ .getHeritageClauses()
25
+ .find((h) => h.getToken() === SyntaxKind.ExtendsKeyword);
26
+ if (!extendsClause)
27
+ continue;
28
+ const typeNodes = extendsClause.getTypeNodes();
29
+ const match = typeNodes[0]?.getText().match(/^SdPrintTemplateBase\s*<([^>]+)>$/);
30
+ if (!match)
31
+ continue;
32
+ const paramTypeName = match[1].trim();
33
+ const paramInterface = sourceFile.getInterface(paramTypeName);
34
+ if (!paramInterface)
35
+ continue;
36
+ const props = paramInterface.getProperties();
37
+ const paramNames = props.map((p) => p.getName());
38
+ // 1. property/class 필드 추가
39
+ let lastPropIdx = 0;
40
+ for (const prop of props) {
41
+ const propName = prop.getName();
42
+ const isOptional = prop.hasQuestionToken();
43
+ const propType = prop.getTypeNode()?.getText() ?? "any";
44
+ const initializer = `input${isOptional ? "" : ".required"}<${propType}>()`;
45
+ if (!printClass.getProperty(propName)) {
46
+ printClass.insertProperty(lastPropIdx, { name: propName, initializer });
47
+ lastPropIdx++;
48
+ changed = true;
49
+ }
50
+ }
51
+ // 2. implements 추가
52
+ if (!printClass.getImplements().some(i => i.getText() === "ISdPrint")) {
53
+ printClass.addImplements("ISdPrint");
54
+ changed = true;
55
+ }
56
+ // 3. super() 삭제 (생성자)
57
+ const ctor = printClass.getConstructors().first();
58
+ if (ctor) {
59
+ ctor.getStatements().forEach((stmt) => {
60
+ if (stmt.getKind() === SyntaxKind.ExpressionStatement) {
61
+ const expr = stmt.asKind(SyntaxKind.ExpressionStatement)?.getExpression();
62
+ if (expr?.asKind(SyntaxKind.CallExpression)?.getExpression().getText() === "super") {
63
+ stmt.remove();
64
+ changed = true;
65
+ }
66
+ }
67
+ });
68
+ }
69
+ // 4. this.print() 전체 삭제
70
+ printClass
71
+ .getDescendantsOfKind(SyntaxKind.CallExpression)
72
+ .filter((expr) => expr.getExpression().getKind() === SyntaxKind.PropertyAccessExpression &&
73
+ expr.getExpression().getText() === "this.print")
74
+ .forEach((expr) => {
75
+ const parentStmt = expr.getFirstAncestorByKind(SyntaxKind.ExpressionStatement);
76
+ if (parentStmt) {
77
+ parentStmt.remove();
78
+ changed = true;
79
+ }
80
+ });
81
+ // 5. params().xxx → xxx() 및 this.params().xxx → this.xxx() AST 치환
82
+ printClass.forEachDescendant((node) => {
83
+ if (node.getKind() === SyntaxKind.PropertyAccessExpression) {
84
+ const propAccess = node.asKind(SyntaxKind.PropertyAccessExpression);
85
+ const propName = propAccess.getName();
86
+ if (!paramNames.includes(propName))
87
+ return;
88
+ const expr = propAccess.getExpression();
89
+ if (expr.getKind() === SyntaxKind.CallExpression) {
90
+ const callExpr = expr.asKind(SyntaxKind.CallExpression);
91
+ const innerExpr = callExpr.getExpression();
92
+ if (innerExpr.getKind() === SyntaxKind.Identifier && innerExpr.getText() === "params") {
93
+ propAccess.replaceWithText(`${propName}()`);
94
+ changed = true;
95
+ }
96
+ else if (innerExpr.getKind() === SyntaxKind.PropertyAccessExpression &&
97
+ innerExpr.asKind(SyntaxKind.PropertyAccessExpression).getExpression().getKind() === SyntaxKind.ThisKeyword &&
98
+ innerExpr.asKind(SyntaxKind.PropertyAccessExpression).getName() === "params") {
99
+ propAccess.replaceWithText(`this.${propName}()`);
100
+ changed = true;
101
+ }
102
+ }
103
+ }
104
+ });
105
+ // 6. @Component template: params().xxx → xxx() 치환
106
+ const componentDecorator = printClass.getDecorator("Component");
107
+ if (componentDecorator) {
108
+ const arg = componentDecorator.getArguments().first();
109
+ if (arg?.getKind() === SyntaxKind.ObjectLiteralExpression) {
110
+ const tplProp = arg.asKind(SyntaxKind.ObjectLiteralExpression).getProperty("template");
111
+ if (tplProp?.getKind() === SyntaxKind.PropertyAssignment &&
112
+ tplProp.asKind(SyntaxKind.PropertyAssignment).getInitializer()) {
113
+ const propAssign = tplProp.asKind(SyntaxKind.PropertyAssignment);
114
+ const init = propAssign.getInitializerOrThrow();
115
+ let tplText = init.getText();
116
+ let tplTextRaw = tplText;
117
+ for (const paramName of paramNames) {
118
+ const paramsPattern = new RegExp(`params\\(\\)\\.${paramName}\\b`, "g");
119
+ tplTextRaw = tplTextRaw.replace(paramsPattern, `${paramName}()`);
120
+ }
121
+ if (tplTextRaw !== tplText) {
122
+ propAssign.setInitializer(tplTextRaw);
123
+ changed = true;
124
+ }
125
+ }
126
+ }
127
+ }
128
+ // 7. import 정리
129
+ const sdAngularImport = sourceFile.getImportDeclaration(d => d.getModuleSpecifierValue() === "@simplysm/sd-angular");
130
+ if (sdAngularImport) {
131
+ const namedImports = sdAngularImport.getNamedImports();
132
+ if (!namedImports.some(n => n.getName() === "ISdPrint")) {
133
+ sdAngularImport.addNamedImport("ISdPrint");
134
+ changed = true;
135
+ }
136
+ }
137
+ else {
138
+ sourceFile.addImportDeclaration({
139
+ namedImports: ["ISdPrint"],
140
+ moduleSpecifier: "@simplysm/sd-angular"
141
+ });
142
+ changed = true;
143
+ }
144
+ const ngCoreImport = sourceFile.getImportDeclaration((d) => d.getModuleSpecifierValue() === "@angular/core");
145
+ if (ngCoreImport) {
146
+ const imports = ngCoreImport.getNamedImports().map((n) => n.getName());
147
+ if (!imports.includes("input")) {
148
+ ngCoreImport.addNamedImport("input");
149
+ changed = true;
150
+ }
151
+ }
152
+ else {
153
+ sourceFile.addImportDeclaration({
154
+ namedImports: ["input"],
155
+ moduleSpecifier: "@angular/core",
156
+ });
157
+ changed = true;
158
+ }
159
+ // 8. interface 선언 삭제
160
+ paramInterface.remove();
161
+ // 9. extends 삭제
162
+ printClass.removeExtends();
163
+ // 10. 불필요한 import 제거
164
+ removeNamedImport(sourceFile, "@simplysm/sd-angular", "SdPrintTemplateBase");
165
+ // 11. 저장 및 로그 출력
166
+ if (changed) {
167
+ sourceFile.saveSync();
168
+ totalChanged++;
169
+ console.log(`[print-updated] ${relPath} :: 프린트 기반 변경 완료`);
170
+ }
171
+ }
172
+ if (totalChanged > 0) {
173
+ console.log(`\n[완료] 프린트 변환 완료 (총 ${totalChanged}개)`);
174
+ }
175
+ else {
176
+ console.log(`[완료] 변환 대상 없음`);
177
+ }
178
+ }
179
+ //# sourceMappingURL=convert-extends-sd-print-template-base-to-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-extends-sd-print-template-base-to-interface.js","sourceRoot":"","sources":["../../src/fix/convert-extends-sd-print-template-base-to-interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function convertFlatPagesToUsableFlatMenus(): void;
@@ -0,0 +1,68 @@
1
+ /* eslint-disable no-console */
2
+ import { SyntaxKind } from "ts-morph";
3
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
4
+ export function convertFlatPagesToUsableFlatMenus() {
5
+ const sourceFiles = getTsMorphSourceFiles();
6
+ let totalChanged = 0;
7
+ for (const sourceFile of sourceFiles) {
8
+ let changed = false;
9
+ for (const cls of sourceFile.getClasses()) {
10
+ // 1. flatPages property 선언 확인
11
+ const prop = cls.getInstanceProperty("flatPages")?.asKind(SyntaxKind.PropertyDeclaration);
12
+ if (!prop)
13
+ continue;
14
+ const initializer = prop.getInitializer();
15
+ if (!initializer)
16
+ continue;
17
+ const callExpr = initializer.asKind(SyntaxKind.CallExpression);
18
+ if (!callExpr)
19
+ continue;
20
+ const expr = callExpr.getExpression();
21
+ if (expr.getKind() === SyntaxKind.PropertyAccessExpression &&
22
+ expr.getText() === "this._sdAppStructure.getFlatPages") {
23
+ // 2. 선언 변경
24
+ prop.rename("flatMenus");
25
+ prop.setInitializer("this._sdAppStructure.usableFlatMenus()");
26
+ changed = true;
27
+ console.log(`[변환됨] ${sourceFile.getBaseName()} → flatPages 선언 → flatMenus`);
28
+ }
29
+ // 3. 클래스 내 this.flatPages → this.flatMenus 치환
30
+ cls.forEachDescendant((node) => {
31
+ if (node.getKind() === SyntaxKind.PropertyAccessExpression) {
32
+ const propAccess = node.asKind(SyntaxKind.PropertyAccessExpression);
33
+ if (propAccess.getExpression().getKind() === SyntaxKind.ThisKeyword &&
34
+ propAccess.getName() === "flatPages") {
35
+ propAccess.replaceWithText("this.flatMenus");
36
+ changed = true;
37
+ }
38
+ }
39
+ });
40
+ // 4. @Component의 template 내 문자열 치환
41
+ const componentDecorator = cls.getDecorator("Component");
42
+ const arg = componentDecorator?.getArguments()[0]?.asKind(SyntaxKind.ObjectLiteralExpression);
43
+ const templateProp = arg?.getProperty("template")?.asKind(SyntaxKind.PropertyAssignment);
44
+ const templateInit = templateProp?.getInitializer();
45
+ if (templateInit &&
46
+ (templateInit.getKind() === SyntaxKind.NoSubstitutionTemplateLiteral ||
47
+ templateInit.getKind() === SyntaxKind.StringLiteral ||
48
+ templateInit.getKind() === SyntaxKind.TemplateExpression)) {
49
+ const originalText = templateInit.getText();
50
+ const newText = originalText.replace(/\bflatPages\b/g, "flatMenus");
51
+ if (newText !== originalText) {
52
+ templateInit.replaceWithText(newText);
53
+ changed = true;
54
+ console.log(`[변환됨] ${sourceFile.getBaseName()} → 템플릿 내 flatPages → flatMenus`);
55
+ }
56
+ }
57
+ }
58
+ if (changed) {
59
+ sourceFile.saveSync();
60
+ totalChanged++;
61
+ console.log(`[updated] ${sourceFile.getBaseName()} :: flatMenus 변환 완료`);
62
+ }
63
+ }
64
+ console.log(totalChanged > 0
65
+ ? `\n[완료] flatPages → flatMenus 전체 변환 완료 (총 ${totalChanged}개)`
66
+ : `[완료] 변환 대상 없음`);
67
+ }
68
+ //# sourceMappingURL=convert-flat-pages-to-flat-menus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-flat-pages-to-flat-menus.js","sourceRoot":"","sources":["../../src/fix/convert-flat-pages-to-flat-menus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function convertGetMenusToUsableMenus(): void;
@@ -0,0 +1,48 @@
1
+ /* eslint-disable no-console */
2
+ import { SyntaxKind } from "ts-morph";
3
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
4
+ export function convertGetMenusToUsableMenus() {
5
+ const sourceFiles = getTsMorphSourceFiles();
6
+ let totalChanged = 0;
7
+ for (const sourceFile of sourceFiles) {
8
+ let changed = false;
9
+ for (const cls of sourceFile.getClasses()) {
10
+ const menusProp = cls.getInstanceProperty("menus")?.asKind(SyntaxKind.PropertyDeclaration);
11
+ if (!menusProp)
12
+ continue;
13
+ const initializer = menusProp.getInitializer()?.asKind(SyntaxKind.CallExpression);
14
+ if (!initializer ||
15
+ initializer.getFirstChildByKind(SyntaxKind.Identifier)?.getText() !== "$computed") {
16
+ continue;
17
+ }
18
+ const arrowFn = initializer
19
+ .asKind(SyntaxKind.CallExpression)
20
+ ?.getArguments()
21
+ .first()
22
+ ?.asKind(SyntaxKind.ArrowFunction);
23
+ if (!arrowFn)
24
+ continue;
25
+ const body = arrowFn.getBody().asKind(SyntaxKind.CallExpression);
26
+ if (!body || !body.getText().includes("this._sdAppStructure.getMenus")) {
27
+ continue;
28
+ }
29
+ const callExpr = body.asKind(SyntaxKind.CallExpression);
30
+ const calleeExpr = callExpr.getExpression();
31
+ if (calleeExpr.getKind() === SyntaxKind.PropertyAccessExpression &&
32
+ calleeExpr.getText() === "this._sdAppStructure.getMenus") {
33
+ // 수정 실행: getMenus → usableMenus
34
+ calleeExpr.replaceWithText("this._sdAppStructure.usableMenus");
35
+ changed = true;
36
+ }
37
+ }
38
+ if (changed) {
39
+ sourceFile.saveSync();
40
+ totalChanged++;
41
+ console.log(`[updated] ${sourceFile.getBaseName()} :: menus → usableMenus 변경 완료`);
42
+ }
43
+ }
44
+ console.log(totalChanged > 0
45
+ ? `\n[완료] usableMenus 변경 완료 (총 ${totalChanged}개)`
46
+ : `[완료] 변환 대상 없음`);
47
+ }
48
+ //# sourceMappingURL=convert-get-menus-to-usable-menus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-get-menus-to-usable-menus.js","sourceRoot":"","sources":["../../src/fix/convert-get-menus-to-usable-menus.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,UAAU,4BAA4B;IAC1C,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAC3F,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAClF,IACE,CAAC,WAAW;gBACZ,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,WAAW,EACjF,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,WAAW;iBACxB,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC;gBAClC,EAAE,YAAY,EAAE;iBACf,KAAK,EAAE;gBACR,EAAE,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;gBACvE,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAE,CAAC;YACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC5C,IACE,UAAU,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,wBAAwB;gBAC5D,UAAU,CAAC,OAAO,EAAE,KAAK,+BAA+B,EACxD,CAAC;gBACD,gCAAgC;gBAChC,UAAU,CAAC,eAAe,CAAC,kCAAkC,CAAC,CAAC;gBAC/D,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,YAAY,GAAG,CAAC;QACd,CAAC,CAAC,+BAA+B,YAAY,IAAI;QACjD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- export default function convertShowAsyncCall(): void;
1
+ export default function convertModalShowParams(): void;
@@ -1,6 +1,6 @@
1
1
  import { Node, SyntaxKind } from "ts-morph";
2
2
  import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
3
- export default function convertShowAsyncCall() {
3
+ export default function convertModalShowParams() {
4
4
  const sourceFiles = getTsMorphSourceFiles();
5
5
  for (const sourceFile of sourceFiles) {
6
6
  const callExprs = sourceFile
@@ -1 +1 @@
1
- {"version":3,"file":"convert-modal-show-params.js","sourceRoot":"","sources":["../../src/fix/convert-modal-show-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,CAAC,OAAO,UAAU,oBAAoB;IAC1C,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAE5C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,UAAU;aACzB,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC;aAC/C,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YACtC,OAAO,CACL,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;gBACrC,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW;gBAC9B,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,eAAe,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,eAAe;YAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;YAE9C,MAAM,KAAK,GAAG,CAAC,SAAS,QAAQ,EAAE,EAAE,UAAU,SAAS,EAAE,EAAE,WAAW,UAAU,EAAE,CAAC,CAAC;YACpF,MAAM,iBAAiB,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAE3D,MAAM,OAAO,GAAG,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElG,QAAQ,CAAC,eAAe,CAAC,2BAA2B,OAAO,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,UAAU,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"convert-modal-show-params.js","sourceRoot":"","sources":["../../src/fix/convert-modal-show-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,CAAC,OAAO,UAAU,sBAAsB;IAC5C,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAE5C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,UAAU;aACzB,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC;aAC/C,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YACtC,OAAO,CACL,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;gBACrC,IAAI,CAAC,OAAO,EAAE,KAAK,WAAW;gBAC9B,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,eAAe,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,eAAe;YAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;YAE9C,MAAM,KAAK,GAAG,CAAC,SAAS,QAAQ,EAAE,EAAE,UAAU,SAAS,EAAE,EAAE,WAAW,UAAU,EAAE,CAAC,CAAC;YACpF,MAAM,iBAAiB,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAE3D,MAAM,OAAO,GAAG,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElG,QAAQ,CAAC,eAAe,CAAC,2BAA2B,OAAO,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,UAAU,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export default function convertPrintParams(): void;
@@ -0,0 +1,37 @@
1
+ import { Node, SyntaxKind } from "ts-morph";
2
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
3
+ export default function convertPrintParams() {
4
+ const sourceFiles = getTsMorphSourceFiles();
5
+ for (const sourceFile of sourceFiles) {
6
+ const typeChecker = sourceFile.getProject().getTypeChecker();
7
+ const callExprs = sourceFile
8
+ .getDescendantsOfKind(SyntaxKind.CallExpression)
9
+ .filter((callExpr) => {
10
+ const expr = callExpr.getExpression();
11
+ return (Node.isPropertyAccessExpression(expr) &&
12
+ expr.getName() === "printAsync" &&
13
+ expr.getExpression().getText() === "this._sdPrint");
14
+ });
15
+ for (const callExpr of callExprs) {
16
+ const args = callExpr.getArguments();
17
+ if (args.length < 2)
18
+ continue;
19
+ const firstArg = args[0];
20
+ const type = typeChecker.getTypeAtLocation(firstArg);
21
+ // 클래스 타입인지 확인 (Symbol이 존재하고, 선언이 class인지 여부 판단)
22
+ const symbol = type.getSymbol();
23
+ const isClass = symbol?.getDeclarations().some((decl) => Node.isClassDeclaration(decl)) ?? false;
24
+ if (!isClass)
25
+ continue;
26
+ // 변환 처리
27
+ const typeText = firstArg.getText();
28
+ const inputsText = args[1]?.getText() ?? "{}";
29
+ const props = [`type: ${typeText}`, `inputs: ${inputsText}`];
30
+ const objectLiteralText = `{\n ${props.join(",\n ")}\n}`;
31
+ const newArgs = [`${objectLiteralText}`, ...args.slice(2).map((arg) => arg.getText())].join(", ");
32
+ callExpr.replaceWithText(`this._sdPrint.printAsync(${newArgs})`);
33
+ }
34
+ sourceFile.saveSync();
35
+ }
36
+ }
37
+ //# sourceMappingURL=convert-print-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-print-params.js","sourceRoot":"","sources":["../../src/fix/convert-print-params.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,CAAC,OAAO,UAAU,kBAAkB;IACxC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAE5C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,CAAC;QAE7D,MAAM,SAAS,GAAG,UAAU;aACzB,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC;aAC/C,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YACtC,OAAO,CACL,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;gBACrC,IAAI,CAAC,OAAO,EAAE,KAAK,YAAY;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,KAAK,eAAe,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAErD,gDAAgD;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,OAAO,GACX,MAAM,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAEnF,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,QAAQ;YACR,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;YAE9C,MAAM,KAAK,GAAG,CAAC,SAAS,QAAQ,EAAE,EAAE,WAAW,UAAU,EAAE,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAE3D,MAAM,OAAO,GAAG,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CACzF,IAAI,CACL,CAAC;YAEF,QAAQ,CAAC,eAAe,CAAC,4BAA4B,OAAO,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,UAAU,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function convertToUsePermsSignal(): void;
@@ -0,0 +1,99 @@
1
+ /* eslint-disable no-console */
2
+ import { SyntaxKind, } from "ts-morph";
3
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
4
+ export function convertToUsePermsSignal() {
5
+ const sourceFiles = getTsMorphSourceFiles();
6
+ let totalChanged = 0;
7
+ for (const sourceFile of sourceFiles) {
8
+ let changed = false;
9
+ for (const cls of sourceFile.getClasses()) {
10
+ try {
11
+ const result = processClass(cls);
12
+ if (result.success) {
13
+ changed = true;
14
+ }
15
+ }
16
+ catch (error) {
17
+ console.error(`[오류] ${sourceFile.getBaseName()} 클래스 처리 중 오류:`, error);
18
+ }
19
+ }
20
+ if (changed) {
21
+ addImportIfNeeded(sourceFile);
22
+ sourceFile.saveSync();
23
+ totalChanged++;
24
+ console.log(`[updated] ${sourceFile.getBaseName()} :: usePermsSignal 변환 완료`);
25
+ }
26
+ }
27
+ console.log(totalChanged > 0 ? `\n[완료] 변환 완료 (총 ${totalChanged}개)` : `[완료] 변환 대상 없음`);
28
+ }
29
+ function processClass(cls) {
30
+ const viewCodesProp = getPropertyDeclaration(cls, "viewCodes");
31
+ const permsProp = getPropertyDeclaration(cls, "perms");
32
+ if (!viewCodesProp || !permsProp) {
33
+ return { success: false, reason: "필수 프로퍼티 없음" };
34
+ }
35
+ const viewCodesInit = viewCodesProp.getInitializer();
36
+ const permsInit = permsProp.getInitializer();
37
+ if (!isValidViewCodesInit(viewCodesInit) || !isValidPermsInit(permsInit)) {
38
+ return { success: false, reason: "초기화 값이 유효하지 않음" };
39
+ }
40
+ const permsCallExpr = permsInit;
41
+ const arrowFunction = getArrowFunction(permsCallExpr);
42
+ if (!arrowFunction) {
43
+ return { success: false, reason: "Arrow function을 찾을 수 없음" };
44
+ }
45
+ const callExpression = getPermsCallExpression(arrowFunction);
46
+ if (!callExpression) {
47
+ return { success: false, reason: "getViewPerms 호출을 찾을 수 없음" };
48
+ }
49
+ const args = callExpression.getArguments();
50
+ if (args.length !== 2) {
51
+ return { success: false, reason: "인자 개수가 맞지 않음" };
52
+ }
53
+ // 변환 실행
54
+ const viewCodesText = viewCodesInit.getText();
55
+ const permsText = args[1].getText();
56
+ permsProp.setInitializer(`usePermsSignal(${viewCodesText}, ${permsText})`);
57
+ viewCodesProp.remove();
58
+ return { success: true };
59
+ }
60
+ function getPropertyDeclaration(cls, name) {
61
+ const prop = cls.getInstanceProperty(name);
62
+ return prop?.getKind() === SyntaxKind.PropertyDeclaration ? prop : undefined;
63
+ }
64
+ function isValidViewCodesInit(init) {
65
+ return init?.getKind() === SyntaxKind.ArrayLiteralExpression;
66
+ }
67
+ function isValidPermsInit(init) {
68
+ return init?.getKind() === SyntaxKind.CallExpression;
69
+ }
70
+ function getArrowFunction(callExpr) {
71
+ const firstArg = callExpr.getArguments().first();
72
+ return firstArg?.getKind() === SyntaxKind.ArrowFunction ? firstArg : undefined;
73
+ }
74
+ function getPermsCallExpression(arrowFn) {
75
+ const body = arrowFn.getBody();
76
+ if (body.getKind() !== SyntaxKind.CallExpression) {
77
+ return undefined;
78
+ }
79
+ const callExpr = body;
80
+ return callExpr.getText().includes("this._sdAppStructure.getViewPerms") ? callExpr : undefined;
81
+ }
82
+ function addImportIfNeeded(sourceFile) {
83
+ const sdAngularImport = sourceFile.getImportDeclaration((d) => d.getModuleSpecifierValue() === "@simplysm/sd-angular");
84
+ if (sdAngularImport) {
85
+ const hasImport = sdAngularImport
86
+ .getNamedImports()
87
+ .some((n) => n.getName() === "usePermsSignal");
88
+ if (!hasImport) {
89
+ sdAngularImport.addNamedImport("usePermsSignal");
90
+ }
91
+ }
92
+ else {
93
+ sourceFile.addImportDeclaration({
94
+ namedImports: ["usePermsSignal"],
95
+ moduleSpecifier: "@simplysm/sd-angular",
96
+ });
97
+ }
98
+ }
99
+ //# sourceMappingURL=convert-to-use-perms-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-to-use-perms-signal.js","sourceRoot":"","sources":["../../src/fix/convert-to-use-perms-signal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function removeUnusedImports(): void;
@@ -0,0 +1,42 @@
1
+ /* eslint-disable no-console */
2
+ import { SyntaxKind } from "ts-morph";
3
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
4
+ export function removeUnusedImports() {
5
+ const sourceFiles = getTsMorphSourceFiles();
6
+ let totalChanged = 0;
7
+ for (const sourceFile of sourceFiles) {
8
+ let changed = false;
9
+ for (const importDecl of sourceFile.getImportDeclarations()) {
10
+ // ⚠️ 사이드이펙트 import는 유지
11
+ if (importDecl.getNamedImports().length === 0) {
12
+ continue;
13
+ }
14
+ // ⚙️ Named import 제거
15
+ for (const namedImport of importDecl.getNamedImports()) {
16
+ const name = namedImport.getName();
17
+ const used = sourceFile
18
+ .getDescendantsOfKind(SyntaxKind.Identifier)
19
+ .some((id) => id.getText() === name && id !== namedImport.getNameNode());
20
+ if (!used) {
21
+ namedImport.remove();
22
+ changed = true;
23
+ console.log(`[정리됨] ${sourceFile.getBaseName()} → 미사용 import: ${name}`);
24
+ }
25
+ }
26
+ // 모든 import가 제거된 경우 전체 import 선언 제거
27
+ if (importDecl.getNamedImports().length === 0) {
28
+ importDecl.remove();
29
+ changed = true;
30
+ }
31
+ }
32
+ if (changed) {
33
+ sourceFile.saveSync();
34
+ totalChanged++;
35
+ console.log(`[updated] ${sourceFile.getBaseName()} :: import 정리 완료`);
36
+ }
37
+ }
38
+ console.log(totalChanged > 0
39
+ ? `\n[완료] 미사용 import 정리 완료 (총 ${totalChanged}개)`
40
+ : `[완료] 정리 대상 없음`);
41
+ }
42
+ //# sourceMappingURL=remove-unused-imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-unused-imports.js","sourceRoot":"","sources":["../../src/fix/remove-unused-imports.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,UAAU,mBAAmB;IACjC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC5D,uBAAuB;YACvB,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,qBAAqB;YACrB,KAAK,MAAM,WAAW,IAAI,UAAU,CAAC,eAAe,EAAE,EAAE,CAAC;gBACvD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,UAAU;qBACpB,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;qBAC3C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC3E,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,WAAW,CAAC,MAAM,EAAE,CAAC;oBACrB,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,oCAAoC;YACpC,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,UAAU,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,YAAY,GAAG,CAAC;QACd,CAAC,CAAC,8BAA8B,YAAY,IAAI;QAChD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function removeUnusedInjects(): void;
@@ -0,0 +1,38 @@
1
+ /* eslint-disable no-console */
2
+ import { SyntaxKind } from "ts-morph";
3
+ import getTsMorphSourceFiles from "./core/get-ts-morph-source-files";
4
+ export function removeUnusedInjects() {
5
+ const sourceFiles = getTsMorphSourceFiles();
6
+ let totalChanged = 0;
7
+ for (const sourceFile of sourceFiles) {
8
+ let changed = false;
9
+ for (const cls of sourceFile.getClasses()) {
10
+ const injectVars = cls
11
+ .getInstanceProperties()
12
+ .filter((p) => p.isKind(SyntaxKind.PropertyDeclaration) &&
13
+ p.getInitializer()?.isKind(SyntaxKind.CallExpression) &&
14
+ p.getInitializer().getText().startsWith("inject("));
15
+ for (const propDecl of injectVars) {
16
+ const name = propDecl.getName();
17
+ // 클래스 전체에서 해당 변수명이 참조되고 있는지 확인
18
+ const references = cls
19
+ .getDescendants()
20
+ .filter((desc) => desc.getText() === name && desc !== propDecl.getNameNode());
21
+ if (references.length === 0) {
22
+ propDecl.remove();
23
+ changed = true;
24
+ console.log(`[정리됨] ${sourceFile.getBaseName()} → 미사용 inject: ${name}`);
25
+ }
26
+ }
27
+ }
28
+ if (changed) {
29
+ sourceFile.saveSync();
30
+ totalChanged++;
31
+ console.log(`[updated] ${sourceFile.getBaseName()} :: inject 정리 완료`);
32
+ }
33
+ }
34
+ console.log(totalChanged > 0
35
+ ? `\n[완료] 미사용 inject 정리 완료 (총 ${totalChanged}개)`
36
+ : `[완료] 정리 대상 없음`);
37
+ }
38
+ //# sourceMappingURL=remove-unused-injects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-unused-injects.js","sourceRoot":"","sources":["../../src/fix/remove-unused-injects.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,qBAAqB,MAAM,kCAAkC,CAAC;AAErE,MAAM,UAAU,mBAAmB;IACjC,MAAM,WAAW,GAAG,qBAAqB,EAAE,CAAC;IAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,GAAG;iBACnB,qBAAqB,EAAE;iBACvB,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC;gBACxC,CAAC,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC;gBACrD,CAAC,CAAC,cAAc,EAAG,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CACtD,CAAC;YAEJ,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAEhC,+BAA+B;gBAC/B,MAAM,UAAU,GAAG,GAAG;qBACnB,cAAc,EAAE;qBAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAEhF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAClB,OAAO,GAAG,IAAI,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,WAAW,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,QAAQ,EAAE,CAAC;YACtB,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CACT,YAAY,GAAG,CAAC;QACd,CAAC,CAAC,8BAA8B,YAAY,IAAI;QAChD,CAAC,CAAC,eAAe,CACpB,CAAC;AACJ,CAAC"}