@simplysm/sd-claude 14.0.47 → 14.0.48

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 (130) hide show
  1. package/{claude/references/sd-simplysm14/sd-claude/usage.md → README.md} +2 -2
  2. package/claude/rules/sd-claude-rules.md +25 -10
  3. package/claude/rules/sd-options.md +11 -6
  4. package/claude/sd-subagent-start.sh +6 -0
  5. package/claude/settings.json +1 -12
  6. package/claude/skills/sd-check/SKILL.md +18 -9
  7. package/claude/skills/sd-claude-docs/SKILL.md +30 -58
  8. package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
  9. package/claude/skills/sd-claude-docs/references/package-doc-gen.md +22 -12
  10. package/claude/skills/sd-commit/SKILL.md +1 -1
  11. package/claude/skills/sd-debug/SKILL.md +5 -3
  12. package/claude/skills/sd-deliverable/SKILL.md +1 -1
  13. package/claude/skills/sd-dev/SKILL.md +14 -9
  14. package/claude/skills/sd-doc-extract/SKILL.md +8 -10
  15. package/claude/skills/sd-doc-extract/_common.py +8 -1
  16. package/claude/skills/sd-doc-extract/_extract_docx.py +74 -34
  17. package/claude/skills/sd-doc-extract/_extract_pdf.py +12 -1
  18. package/claude/skills/sd-doc-extract/_extract_pptx.py +103 -23
  19. package/claude/skills/sd-doc-extract/_extract_xlsb.py +93 -4
  20. package/claude/skills/sd-doc-extract/_extract_xlsx.py +98 -36
  21. package/claude/skills/sd-doc-extract/extract.py +22 -3
  22. package/claude/skills/sd-inner-clarify/SKILL.md +78 -0
  23. package/claude/skills/sd-inner-debug/SKILL.md +1 -1
  24. package/claude/skills/sd-inner-review/SKILL.md +13 -0
  25. package/claude/skills/sd-issue/SKILL.md +1 -1
  26. package/claude/skills/sd-outlook/SKILL.md +1 -1
  27. package/claude/skills/sd-plan/SKILL.md +50 -17
  28. package/claude/skills/sd-prompt/SKILL.md +180 -178
  29. package/claude/skills/sd-prompt/references/eval-runner.md +5 -30
  30. package/claude/skills/sd-prompt/references/sd-eval-env-template.md +23 -0
  31. package/claude/skills/sd-refactor/SKILL.md +2 -2
  32. package/claude/skills/sd-tdd/SKILL.md +40 -10
  33. package/claude/skills/sd-use/SKILL.md +84 -80
  34. package/claude/skills/sd-wbs/SKILL.md +84 -27
  35. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/assets.md +2 -3
  36. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/hooks.md +7 -6
  37. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/scripts.md +1 -9
  38. package/package.json +3 -2
  39. package/scripts/sync.mjs +4 -2
  40. package/claude/references/sd-simplysm14/angular/docs/bootstrap.md +0 -48
  41. package/claude/references/sd-simplysm14/angular/docs/directives.md +0 -236
  42. package/claude/references/sd-simplysm14/angular/docs/features.md +0 -379
  43. package/claude/references/sd-simplysm14/angular/docs/pipes.md +0 -32
  44. package/claude/references/sd-simplysm14/angular/docs/plugins.md +0 -37
  45. package/claude/references/sd-simplysm14/angular/docs/provider-types.md +0 -283
  46. package/claude/references/sd-simplysm14/angular/docs/providers.md +0 -379
  47. package/claude/references/sd-simplysm14/angular/docs/styling.md +0 -222
  48. package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +0 -250
  49. package/claude/references/sd-simplysm14/angular/docs/ui-data.md +0 -275
  50. package/claude/references/sd-simplysm14/angular/docs/ui-form.md +0 -490
  51. package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +0 -140
  52. package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +0 -273
  53. package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +0 -157
  54. package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +0 -127
  55. package/claude/references/sd-simplysm14/angular/docs/utils.md +0 -295
  56. package/claude/references/sd-simplysm14/angular/usage.md +0 -489
  57. package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +0 -182
  58. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +0 -154
  59. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +0 -84
  60. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +0 -107
  61. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +0 -83
  62. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +0 -133
  63. package/claude/references/sd-simplysm14/capacitor-plugin-intent/usage.md +0 -203
  64. package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +0 -258
  65. package/claude/references/sd-simplysm14/core-browser/usage.md +0 -306
  66. package/claude/references/sd-simplysm14/core-common/docs/errors.md +0 -82
  67. package/claude/references/sd-simplysm14/core-common/docs/extensions.md +0 -167
  68. package/claude/references/sd-simplysm14/core-common/docs/features.md +0 -136
  69. package/claude/references/sd-simplysm14/core-common/docs/types.md +0 -245
  70. package/claude/references/sd-simplysm14/core-common/docs/utils.md +0 -591
  71. package/claude/references/sd-simplysm14/core-common/usage.md +0 -255
  72. package/claude/references/sd-simplysm14/core-node/docs/child-process.md +0 -182
  73. package/claude/references/sd-simplysm14/core-node/docs/features.md +0 -214
  74. package/claude/references/sd-simplysm14/core-node/docs/file-system.md +0 -509
  75. package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +0 -139
  76. package/claude/references/sd-simplysm14/core-node/docs/logging.md +0 -180
  77. package/claude/references/sd-simplysm14/core-node/docs/path.md +0 -176
  78. package/claude/references/sd-simplysm14/core-node/docs/utilities-cpx.md +0 -194
  79. package/claude/references/sd-simplysm14/core-node/docs/utilities-fsx.md +0 -469
  80. package/claude/references/sd-simplysm14/core-node/docs/utilities-pathx.md +0 -151
  81. package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +0 -334
  82. package/claude/references/sd-simplysm14/core-node/docs/worker.md +0 -205
  83. package/claude/references/sd-simplysm14/core-node/usage.md +0 -259
  84. package/claude/references/sd-simplysm14/excel/docs/core-classes.md +0 -453
  85. package/claude/references/sd-simplysm14/excel/docs/types.md +0 -459
  86. package/claude/references/sd-simplysm14/excel/docs/utilities.md +0 -194
  87. package/claude/references/sd-simplysm14/excel/docs/wrapper.md +0 -73
  88. package/claude/references/sd-simplysm14/excel/usage.md +0 -134
  89. package/claude/references/sd-simplysm14/lint/usage.md +0 -130
  90. package/claude/references/sd-simplysm14/orm-common/docs/core.md +0 -188
  91. package/claude/references/sd-simplysm14/orm-common/docs/expression.md +0 -190
  92. package/claude/references/sd-simplysm14/orm-common/docs/models.md +0 -17
  93. package/claude/references/sd-simplysm14/orm-common/docs/query-builder.md +0 -97
  94. package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +0 -250
  95. package/claude/references/sd-simplysm14/orm-common/docs/schema-builders.md +0 -364
  96. package/claude/references/sd-simplysm14/orm-common/docs/types.md +0 -522
  97. package/claude/references/sd-simplysm14/orm-common/usage.md +0 -229
  98. package/claude/references/sd-simplysm14/orm-node/docs/connections.md +0 -137
  99. package/claude/references/sd-simplysm14/orm-node/docs/core.md +0 -131
  100. package/claude/references/sd-simplysm14/orm-node/docs/types.md +0 -173
  101. package/claude/references/sd-simplysm14/orm-node/usage.md +0 -143
  102. package/claude/references/sd-simplysm14/sd-cli/usage.md +0 -782
  103. package/claude/references/sd-simplysm14/service-client/docs/features.md +0 -217
  104. package/claude/references/sd-simplysm14/service-client/docs/main.md +0 -148
  105. package/claude/references/sd-simplysm14/service-client/docs/protocol.md +0 -53
  106. package/claude/references/sd-simplysm14/service-client/docs/transport.md +0 -131
  107. package/claude/references/sd-simplysm14/service-client/docs/types.md +0 -129
  108. package/claude/references/sd-simplysm14/service-client/usage.md +0 -202
  109. package/claude/references/sd-simplysm14/service-common/docs/app-structure.md +0 -175
  110. package/claude/references/sd-simplysm14/service-common/docs/events.md +0 -64
  111. package/claude/references/sd-simplysm14/service-common/docs/protocol.md +0 -331
  112. package/claude/references/sd-simplysm14/service-common/docs/service-types.md +0 -90
  113. package/claude/references/sd-simplysm14/service-common/docs/types.md +0 -19
  114. package/claude/references/sd-simplysm14/service-common/usage.md +0 -154
  115. package/claude/references/sd-simplysm14/service-server/docs/auth.md +0 -64
  116. package/claude/references/sd-simplysm14/service-server/docs/core.md +0 -174
  117. package/claude/references/sd-simplysm14/service-server/docs/legacy.md +0 -25
  118. package/claude/references/sd-simplysm14/service-server/docs/main.md +0 -88
  119. package/claude/references/sd-simplysm14/service-server/docs/protocol.md +0 -33
  120. package/claude/references/sd-simplysm14/service-server/docs/services.md +0 -94
  121. package/claude/references/sd-simplysm14/service-server/docs/transport-http.md +0 -93
  122. package/claude/references/sd-simplysm14/service-server/docs/transport-socket.md +0 -119
  123. package/claude/references/sd-simplysm14/service-server/docs/types.md +0 -36
  124. package/claude/references/sd-simplysm14/service-server/docs/utils.md +0 -22
  125. package/claude/references/sd-simplysm14/service-server/usage.md +0 -171
  126. package/claude/references/sd-simplysm14/storage/usage.md +0 -301
  127. package/claude/references/sd-simplysm14.md +0 -35
  128. package/claude/rules/sd-clarify.md +0 -23
  129. package/claude/sd-session-start.sh +0 -10
  130. /package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/cli.md +0 -0
@@ -1,283 +0,0 @@
1
- # Provider Types
2
-
3
- ## `SdMenu`
4
-
5
- 메뉴 트리 노드.
6
-
7
- ```typescript
8
- interface SdMenu {
9
- title: string;
10
- codeChain: string[];
11
- url?: string;
12
- icon?: string;
13
- children?: SdMenu[];
14
- }
15
- ```
16
-
17
- | Field | Type | Description |
18
- |-------|------|-------------|
19
- | `title` | `string` | 메뉴 제목 |
20
- | `codeChain` | `string[]` | 코드 체인 (루트부터 현재까지) |
21
- | `url` | `string \| undefined` | 외부 URL |
22
- | `icon` | `string \| undefined` | 아이콘 |
23
- | `children` | `SdMenu[] \| undefined` | 하위 메뉴 |
24
-
25
- ## `SdFlatMenu`
26
-
27
- 플랫 메뉴 항목 (리프만).
28
-
29
- ```typescript
30
- interface SdFlatMenu<TModule = unknown> {
31
- titleChain: string[];
32
- codeChain: string[];
33
- modulesChain: TModule[][];
34
- }
35
- ```
36
-
37
- | Field | Type | Description |
38
- |-------|------|-------------|
39
- | `titleChain` | `string[]` | 타이틀 체인 |
40
- | `codeChain` | `string[]` | 코드 체인 |
41
- | `modulesChain` | `TModule[][]` | 모듈 체인 |
42
-
43
- ## `SdPermission`
44
-
45
- 권한 트리 노드.
46
-
47
- ```typescript
48
- interface SdPermission<TModule = unknown> {
49
- title: string;
50
- codeChain: string[];
51
- modules: TModule[] | undefined;
52
- perms: ("use" | "edit")[] | undefined;
53
- children: SdPermission<TModule>[] | undefined;
54
- }
55
- ```
56
-
57
- | Field | Type | Description |
58
- |-------|------|-------------|
59
- | `title` | `string` | 권한 제목 |
60
- | `codeChain` | `string[]` | 코드 체인 |
61
- | `modules` | `TModule[] \| undefined` | 모듈 제한 |
62
- | `perms` | `("use" \| "edit")[] \| undefined` | 권한 목록 |
63
- | `children` | `SdPermission<TModule>[] \| undefined` | 하위 권한 |
64
-
65
- ## `SharedDataBase`
66
-
67
- 공유 데이터 기본 인터페이스. 모든 공유 데이터 항목이 구현해야 한다.
68
-
69
- ```typescript
70
- interface SharedDataBase<TKey extends string | number> {
71
- __valueKey: TKey;
72
- __searchText: string;
73
- __isHidden: boolean;
74
- __parentKey?: TKey;
75
- }
76
- ```
77
-
78
- | Field | Type | Description |
79
- |-------|------|-------------|
80
- | `__valueKey` | `TKey` | 고유 키 |
81
- | `__searchText` | `string` | 검색 대상 텍스트 |
82
- | `__isHidden` | `boolean` | 숨김 여부 |
83
- | `__parentKey` | `TKey \| undefined` | 부모 키 (트리 구조용) |
84
-
85
- ## `SharedDataInfo`
86
-
87
- 공유 데이터 등록 정보.
88
-
89
- ```typescript
90
- interface SharedDataInfo<T extends SharedDataBase<string | number>> {
91
- serviceKey: string;
92
- getter: (changeKeys?: (string | number)[]) => Promise<T[]>;
93
- filter?: unknown;
94
- orderBy?: (a: T, b: T) => number;
95
- }
96
- ```
97
-
98
- | Field | Type | Description |
99
- |-------|------|-------------|
100
- | `serviceKey` | `string` | ServiceClient 연결 키 |
101
- | `getter` | `(changeKeys?) => Promise<T[]>` | 데이터 조회 함수. changeKeys 전달 시 부분 조회 |
102
- | `filter` | `unknown` | 이벤트 필터 (같은 이름의 다른 필터 구분용) |
103
- | `orderBy` | `((a, b) => number) \| undefined` | 정렬 함수 |
104
-
105
- ## `SharedDataHandle`
106
-
107
- 공유 데이터 핸들. `getHandle()`이 반환하는 객체.
108
-
109
- ```typescript
110
- interface SharedDataHandle<T extends SharedDataBase<string | number>> {
111
- items: Signal<T[]>;
112
- get(key: T["__valueKey"] | undefined): T | undefined;
113
- }
114
- ```
115
-
116
- | Field | Type | Description |
117
- |-------|------|-------------|
118
- | `items` | `Signal<T[]>` | 데이터 항목 signal |
119
- | `get(key)` | `(key) => T \| undefined` | 키로 항목 조회 |
120
-
121
- ## `SdModalContentDef`
122
-
123
- 모달 컴포넌트가 구현해야 하는 인터페이스.
124
-
125
- ```typescript
126
- interface SdModalContentDef<O> {
127
- initialized: Signal<boolean>;
128
- close: OutputEmitterRef<O | undefined>;
129
- actionTplRef?: TemplateRef<any>;
130
- readonly _optionalModalInputs?: string;
131
- }
132
- ```
133
-
134
- | Field | Type | Description |
135
- |-------|------|-------------|
136
- | `initialized` | `Signal<boolean>` | 초기화 완료 여부 |
137
- | `close` | `OutputEmitterRef<O \| undefined>` | 닫기 output (결과 전달) |
138
- | `actionTplRef` | `TemplateRef<any> \| undefined` | 모달 헤더 액션 영역 템플릿 |
139
- | `_optionalModalInputs` | `string \| undefined` | optional로 취급할 input 키 목록 (리터럴 타입) |
140
-
141
- ## `SdModalInfo`
142
-
143
- 모달 생성 시 전달하는 정보.
144
-
145
- ```typescript
146
- interface SdModalInfo<T extends SdModalContentDef<any>, X extends keyof any = ""> {
147
- title: string;
148
- type: Type<T>;
149
- inputs: WithOptional<Omit<DirectiveInputSignals<T>, SdModalExcludeKeys | X>, ...>;
150
- }
151
- ```
152
-
153
- | Field | Type | Description |
154
- |-------|------|-------------|
155
- | `title` | `string` | 모달 제목 |
156
- | `type` | `Type<T>` | 모달 컴포넌트 타입 |
157
- | `inputs` | `object` | 컴포넌트 inputs (initialized, close, actionTplRef 제외) |
158
-
159
- ## `SdModalOptions`
160
-
161
- 모달 옵션.
162
-
163
- ```typescript
164
- interface SdModalOptions {
165
- key?: string;
166
- hideHeader?: boolean;
167
- hideCloseButton?: boolean;
168
- useCloseByBackdrop?: boolean;
169
- useCloseByEscapeKey?: boolean;
170
- float?: boolean;
171
- fill?: boolean;
172
- resizable?: boolean;
173
- movable?: boolean;
174
- position?: "bottom-right" | "top-right";
175
- minHeightPx?: number;
176
- minWidthPx?: number;
177
- heightPx?: number;
178
- widthPx?: number;
179
- headerStyle?: string;
180
- noFirstControlFocusing?: boolean;
181
- }
182
- ```
183
-
184
- | Field | Type | Description |
185
- |-------|------|-------------|
186
- | `key` | `string \| undefined` | 동일 키의 모달이 이미 열려 있으면 재사용 |
187
- | `hideHeader` | `boolean \| undefined` | 헤더 숨김 |
188
- | `hideCloseButton` | `boolean \| undefined` | 닫기 버튼 숨김 |
189
- | `useCloseByBackdrop` | `boolean \| undefined` | 배경 클릭으로 닫기 |
190
- | `useCloseByEscapeKey` | `boolean \| undefined` | ESC 키로 닫기 |
191
- | `float` | `boolean \| undefined` | 플로팅 모달 |
192
- | `fill` | `boolean \| undefined` | 전체 화면 채우기 |
193
- | `resizable` | `boolean \| undefined` | 크기 조절 가능 |
194
- | `movable` | `boolean \| undefined` | 이동 가능 |
195
- | `position` | `"bottom-right" \| "top-right" \| undefined` | 위치 프리셋 |
196
- | `minHeightPx` | `number \| undefined` | 최소 높이 (px) |
197
- | `minWidthPx` | `number \| undefined` | 최소 너비 (px) |
198
- | `heightPx` | `number \| undefined` | 높이 (px) |
199
- | `widthPx` | `number \| undefined` | 너비 (px) |
200
- | `headerStyle` | `string \| undefined` | 헤더 인라인 스타일 |
201
- | `noFirstControlFocusing` | `boolean \| undefined` | 첫 번째 컨트롤 자동 포커스 비활성화 |
202
-
203
- ## `SdToastContentDef`
204
-
205
- 커스텀 토스트 컴포넌트가 구현해야 하는 인터페이스.
206
-
207
- ```typescript
208
- interface SdToastContentDef<O> {
209
- close: OutputEmitterRef<O | undefined>;
210
- }
211
- ```
212
-
213
- ## `SdToastInput`
214
-
215
- 커스텀 토스트 생성 입력.
216
-
217
- ```typescript
218
- interface SdToastInput<T extends SdToastContentDef<any>> {
219
- type: Type<T>;
220
- inputs: Omit<DirectiveInputSignals<T>, "close">;
221
- }
222
- ```
223
-
224
- ## `SdToastSeverity`
225
-
226
- ```typescript
227
- type SdToastSeverity = "info" | "success" | "warning" | "danger";
228
- ```
229
-
230
- ## `SdToastTheme`
231
-
232
- ```typescript
233
- type SdToastTheme = "primary" | "secondary" | SdToastSeverity | "gray" | "blue-gray";
234
- ```
235
-
236
- ## `SdBusyType`
237
-
238
- ```typescript
239
- type SdBusyType = "spinner" | "bar" | "cube";
240
- ```
241
-
242
- ## `SdPrint`
243
-
244
- 인쇄 컴포넌트가 구현해야 하는 인터페이스.
245
-
246
- ```typescript
247
- interface SdPrint {
248
- initialized: Signal<boolean>;
249
- readonly _optionalPrintInputs?: string;
250
- }
251
- ```
252
-
253
- | Field | Type | Description |
254
- |-------|------|-------------|
255
- | `initialized` | `Signal<boolean>` | 초기화 완료 여부 (true 될 때까지 대기 후 인쇄) |
256
- | `_optionalPrintInputs` | `string \| undefined` | optional로 취급할 input 키 목록 |
257
-
258
- ## `SdPrintInput`
259
-
260
- 인쇄 생성 입력.
261
-
262
- ```typescript
263
- interface SdPrintInput<T, X extends keyof any = ""> {
264
- type: Type<T>;
265
- inputs: WithOptional<Omit<DirectiveInputSignals<T>, "_optionalPrintInputs" | X>, ...>;
266
- }
267
- ```
268
-
269
- ## `SelectModalOutputResult`
270
-
271
- 모달 선택 결과.
272
-
273
- ```typescript
274
- interface SelectModalOutputResult<T> {
275
- selectedItemKeys: any[];
276
- selectedItems: T[];
277
- }
278
- ```
279
-
280
- | Field | Type | Description |
281
- |-------|------|-------------|
282
- | `selectedItemKeys` | `any[]` | 선택된 항목 키 배열 |
283
- | `selectedItems` | `T[]` | 선택된 항목 배열 |
@@ -1,379 +0,0 @@
1
- # Providers
2
-
3
- ## `SdThemeProvider`
4
-
5
- 다크모드/폰트 크기 프로바이더. `dark` signal 변경 시 body에 `sd-theme-dark` 클래스를 토글하고, `fontSize` signal 변경 시 `html` 요소의 font-size를 설정한다.
6
-
7
- ```typescript
8
- @Injectable({ providedIn: "root" })
9
- class SdThemeProvider {
10
- dark = signal<boolean>(false);
11
- readonly fontSizePresets: readonly number[] = [12, 14, 16, 20, 24, 28];
12
- fontSize = signal<number>(12);
13
-
14
- increaseFontSize(): void;
15
- decreaseFontSize(): void;
16
- }
17
- ```
18
-
19
- | Field | Type | Description |
20
- |-------|------|-------------|
21
- | `dark` | `WritableSignal<boolean>` | 다크모드 활성화 여부 |
22
- | `fontSizePresets` | `readonly number[]` | 사용 가능한 폰트 크기 프리셋 배열 |
23
- | `fontSize` | `WritableSignal<number>` | 현재 폰트 크기 (px). 기본값 12 |
24
-
25
- | Method | Description |
26
- |--------|-------------|
27
- | `increaseFontSize()` | `fontSizePresets`에서 현재보다 큰 다음 크기로 변경 |
28
- | `decreaseFontSize()` | `fontSizePresets`에서 현재보다 작은 이전 크기로 변경 |
29
-
30
- ## `SdThemeSelector`
31
-
32
- 테마 설정 드롭다운 컴포넌트. 다크모드 토글과 폰트 크기 증감 버튼을 제공한다. `SdThemeProvider`를 inject하여 사용한다.
33
-
34
- ```typescript
35
- @Component({
36
- selector: "sd-theme-selector",
37
- standalone: true,
38
- })
39
- class SdThemeSelector {}
40
- ```
41
-
42
- inputs 없음. `SdThemeProvider`의 `dark`, `fontSize`를 직접 조작한다.
43
-
44
- ## `SdSystemLogProvider`
45
-
46
- 시스템 로그 기록 프로바이더. console 출력 + 커스텀 `writeFn` 콜백 호출.
47
-
48
- ```typescript
49
- @Injectable({ providedIn: "root" })
50
- class SdSystemLogProvider {
51
- writeFn?: (severity: "error" | "warn" | "log", ...data: any[]) => Promise<void> | void;
52
- async writeAsync(severity: "error" | "warn" | "log", ...data: any[]): Promise<void>;
53
- }
54
- ```
55
-
56
- | Field | Type | Description |
57
- |-------|------|-------------|
58
- | `writeFn` | `((severity, ...data) => Promise<void> \| void) \| undefined` | 커스텀 로그 기록 함수 |
59
-
60
- | Method | Description |
61
- |--------|-------------|
62
- | `writeAsync(severity, ...data)` | console 출력 후 `writeFn` 호출 |
63
-
64
- ## `SdAppStructureProvider`
65
-
66
- 앱 구조(메뉴/권한) 관리 프로바이더. 서브클래스 없이 직접 사용한다.
67
-
68
- ```typescript
69
- @Injectable({ providedIn: "root" })
70
- class SdAppStructureProvider<TModule = unknown> {
71
- readonly usableModules = signal<TModule[] | undefined>(undefined);
72
- readonly permRecord = signal<Record<string, boolean> | undefined>(undefined);
73
- readonly items = signal<AppStructureItem<TModule>[]>([]);
74
-
75
- usableMenus: Signal<SdMenu[]>;
76
- usableFlatMenus: Signal<SdFlatMenu<TModule>[]>;
77
-
78
- async initialize(serviceKey: string): Promise<void>;
79
- getPermissionsByStructure(items, codeChain?): SdPermission<TModule>[];
80
- getTitleByFullCode(fullCode: string): string;
81
- getItemChainByFullCode(fullCode: string): AppStructureItem<TModule>[];
82
- getPermsByFullCode<K extends string>(fullCodes: string[], permKeys: K[]): K[];
83
- }
84
- ```
85
-
86
- | WritableSignal Field | Type | Description |
87
- |----------------------|------|-------------|
88
- | `usableModules` | `WritableSignal<TModule[] \| undefined>` | 사용 가능한 모듈 목록. 외부에서 `set()`/`update()`로 설정 |
89
- | `permRecord` | `WritableSignal<Record<string, boolean> \| undefined>` | 권한 레코드. 외부에서 `set()`/`update()`로 설정 |
90
- | `items` | `WritableSignal<AppStructureItem<TModule>[]>` | 앱 구조 항목 배열 (`initialize()`로 초기화) |
91
-
92
- | Computed | Type | Description |
93
- |----------|------|-------------|
94
- | `usableMenus` | `Signal<SdMenu[]>` | 사용 가능한 메뉴 트리 |
95
- | `usableFlatMenus` | `Signal<SdFlatMenu<TModule>[]>` | 사용 가능한 플랫 메뉴 |
96
-
97
- ## `injectPermsSignal`
98
-
99
- 현재 뷰의 권한 목록을 signal로 반환하는 함수. 생성자에서 호출한다.
100
-
101
- ```typescript
102
- function injectPermsSignal<K extends string>(viewCodes: string[], keys: K[]): Signal<K[]>
103
- ```
104
-
105
- | Parameter | Type | Description |
106
- |-----------|------|-------------|
107
- | `viewCodes` | `string[]` | 뷰 코드 배열 |
108
- | `keys` | `K[]` | 확인할 권한 키 배열 |
109
-
110
- 반환: 활성화된 권한 키 배열의 signal
111
-
112
- ## `SdAppStructureUtils`
113
-
114
- 앱 구조 유틸리티. 정적 메서드로 메뉴/권한 조회 로직을 제공한다.
115
-
116
- ```typescript
117
- abstract class SdAppStructureUtils {
118
- static getTitleByFullCode<TModule>(items, fullCode): string;
119
- static getPermsByFullCode<TModule, K extends string>(items, fullCodes, permKeys, permRecord): K[];
120
- static getItemChainByFullCode<TModule>(items, fullCode): AppStructureItem<TModule>[];
121
- static getMenus<TModule>(items, codeChain, usableModules, permRecord): SdMenu[];
122
- static getFlatMenus<TModule>(items, usableModules, permRecord): SdFlatMenu<TModule>[];
123
- static getPermissions<TModule>(items, codeChain, usableModules): SdPermission<TModule>[];
124
- static getFlatPermissions<TModule>(items, usableModules): FlatPermission<TModule>[];
125
- }
126
- ```
127
-
128
- ## `SdFileDialogProvider`
129
-
130
- 네이티브 파일 선택 대화상자 프로바이더.
131
-
132
- ```typescript
133
- @Injectable({ providedIn: "root" })
134
- class SdFileDialogProvider {
135
- async showAsync(multiple?: false, accept?: string): Promise<File | undefined>;
136
- async showAsync(multiple: true, accept?: string): Promise<File[] | undefined>;
137
- }
138
- ```
139
-
140
- | Parameter | Type | Description |
141
- |-----------|------|-------------|
142
- | `multiple` | `boolean` | 다중 선택 여부 |
143
- | `accept` | `string` | 허용 파일 타입 (예: `"image/*"`) |
144
-
145
- ## `SdLocalStorageProvider`
146
-
147
- `clientName` 스코프 localStorage 래퍼. 키가 `{clientName}.{key}` 형태로 저장된다.
148
-
149
- ```typescript
150
- @Injectable({ providedIn: "root" })
151
- class SdLocalStorageProvider<T> {
152
- set<K extends keyof T & string>(key: K, value: T[K]): void;
153
- get<K extends keyof T & string>(key: K): T[K] | undefined;
154
- remove(key: keyof T & string): void;
155
- }
156
- ```
157
-
158
- ## `SdSystemConfigProvider`
159
-
160
- 비동기 설정 저장/조회 프로바이더. `fn` 필드를 설정하면 서버 저장, 미설정 시 localStorage에 저장.
161
-
162
- ```typescript
163
- @Injectable({ providedIn: "root" })
164
- class SdSystemConfigProvider<T> {
165
- fn?: {
166
- set<K extends keyof T & string>(key: K, data: T[K]): Promise<void> | void;
167
- get(key: keyof T & string): PromiseLike<any>;
168
- };
169
-
170
- async setAsync<K extends keyof T & string>(key: K, data: T[K]): Promise<void>;
171
- async getAsync(key: keyof T & string): Promise<any>;
172
- }
173
- ```
174
-
175
- ## `SdServiceClientFactoryProvider`
176
-
177
- ServiceClient 인스턴스 팩토리/관리. key별로 연결을 관리한다.
178
-
179
- ```typescript
180
- @Injectable({ providedIn: "root" })
181
- class SdServiceClientFactoryProvider {
182
- async connectAsync(key: string, options?: Partial<ServiceConnectionOptions>): Promise<void>;
183
- async closeAsync(key: string): Promise<void>;
184
- get(key: string): ServiceClient;
185
- }
186
- ```
187
-
188
- | Method | Description |
189
- |--------|-------------|
190
- | `connectAsync(key, options?)` | WebSocket 연결. 요청/응답 진행률을 토스트로 표시 |
191
- | `closeAsync(key)` | 연결 종료 |
192
- | `get(key)` | 연결된 ServiceClient 인스턴스 반환 |
193
-
194
- ## `SdSharedDataProvider`
195
-
196
- 이벤트 기반 공유 데이터 캐시 추상 프로바이더. `@Injectable()`로 제공되며, 소비 프로젝트에서 상속한다.
197
-
198
- 내부적으로 `client.getEvent()` 프록시를 사용하여 이벤트를 구독/발행한다:
199
- - `client.getEvent<typeof SdSharedDataChangeEvent>("SdSharedDataChange").addListener(info, cb)`
200
- - `client.getEvent<typeof SdSharedDataChangeEvent>("SdSharedDataChange").emit(selector, data)`
201
-
202
- ```typescript
203
- @Injectable()
204
- abstract class SdSharedDataProvider<T extends Record<string, SharedDataBase<string | number>>> {
205
- readonly loadingCount: WritableSignal<number>;
206
-
207
- abstract initialize(): void;
208
- register<K extends string & keyof T>(name: K, info: SharedDataInfo<T[K]>): void;
209
- getHandle<K extends string & keyof T>(name: K): SharedDataHandle<T[K]>;
210
- async emitAsync<K extends string & keyof T>(name: K, changeKeys?: (string | number)[]): Promise<void>;
211
- async wait(): Promise<void>;
212
- }
213
- ```
214
-
215
- | Method | Description |
216
- |--------|-------------|
217
- | `register(name, info)` | 공유 데이터 등록 (getter, serviceKey, filter, orderBy) |
218
- | `getHandle(name)` | 등록된 공유 데이터 핸들 반환 (items signal + get 메서드) |
219
- | `emitAsync(name, changeKeys?)` | 변경 이벤트 발행. 내부에서 `client.getEvent<typeof SdSharedDataChangeEvent>("SdSharedDataChange").emit(...)` 호출 |
220
- | `wait()` | 모든 로딩 완료까지 대기 |
221
-
222
- ### 로딩 전략 (Lazy Loading)
223
-
224
- **`register()`는 메타정보만 등록하고 실제 데이터를 가져오지 않는다.** 타입별 데이터는 해당 타입의 `getHandle(name)`이 **처음 호출되는 시점**에 `info.getter()`를 실행하여 로딩된다. 즉 `initialize()`에서 여러 타입을 `register()` 해도 앱 시작 시 전체가 일괄 로딩되지 않으며, 실제로 사용되는 타입만 온디맨드로 로딩된다.
225
-
226
- - 첫 `getHandle()` 호출 → `getter()` 실행 + `SdSharedDataChange` 리스너 등록
227
- - 이후 같은 타입의 `getHandle()` 호출은 캐시된 `itemsSignal`을 재사용
228
- - 이후 갱신은 서버에서 `emitAsync()`로 발행된 `SdSharedDataChange` 이벤트 수신 시에만 발생 (`changeKeys`가 있으면 부분 업데이트, 없으면 전체 리로드)
229
- - `register()`를 동일 `name`으로 재호출하면 `generation`이 증가하고 `needsReload=true`로 표시되어, 다음 `getHandle()` 호출 시 재로딩된다
230
-
231
- ## `SdSharedDataChangeEvent`
232
-
233
- 공유 데이터 변경 이벤트 정의. `defineEvent`로 생성되며, 이벤트 이름 문자열 `"SdSharedDataChange"`를 인자로 받는다.
234
-
235
- ```typescript
236
- const SdSharedDataChangeEvent = defineEvent<
237
- { name: string; filter: unknown },
238
- (string | number)[] | undefined
239
- >("SdSharedDataChange");
240
- ```
241
-
242
- ## `SdNavigateWindowProvider`
243
-
244
- 새 윈도우 네비게이션 + 자동 닫기 프로바이더.
245
-
246
- ```typescript
247
- @Injectable({ providedIn: "root" })
248
- class SdNavigateWindowProvider {
249
- get isWindow(): boolean;
250
- open(navigate: string, params?: Record<string, string>, features?: string): void;
251
- }
252
- ```
253
-
254
- | Property/Method | Description |
255
- |-----------------|-------------|
256
- | `isWindow` | 현재 페이지가 팝업 윈도우인지 여부 |
257
- | `open(navigate, params?, features?)` | 새 윈도우 열기. `features` 지정 시 팝업, 미지정 시 새 탭 |
258
-
259
- ## `SdActivatedModalProvider`
260
-
261
- 모달 내부에서 inject하여 모달/컨텐츠 컴포넌트 참조를 얻는 프로바이더. `@Injectable()`로 모달별 인스턴스 생성.
262
-
263
- ```typescript
264
- @Injectable()
265
- class SdActivatedModalProvider<T extends SdModalContentDef<any> = SdModalContentDef<any>> {
266
- modalComponent = signal<any>(undefined);
267
- contentComponent = signal<T | undefined>(undefined);
268
- canDeactivateFn: () => boolean;
269
- }
270
- ```
271
-
272
- | Field | Type | Description |
273
- |-------|------|-------------|
274
- | `modalComponent` | `WritableSignal<any>` | SdModal 인스턴스 |
275
- | `contentComponent` | `WritableSignal<T \| undefined>` | 컨텐츠 컴포넌트 인스턴스 |
276
- | `canDeactivateFn` | `() => boolean` | 모달 닫기 가능 여부 판별 함수 (기본: `() => true`) |
277
-
278
- ## `SdToastProvider`
279
-
280
- 토스트 알림 프로바이더. 4가지 심각도(info/success/warning/danger) 메시지, 프로그래스 모드, 커스텀 토스트를 지원한다.
281
-
282
- ```typescript
283
- @Injectable({ providedIn: "root" })
284
- class SdToastProvider {
285
- alertThemes = signal<SdToastSeverity[]>([]);
286
- overlap = signal(false);
287
- beforeShowFn?: (theme: SdToastSeverity) => void;
288
-
289
- info(message: string, useProgress?: true): WritableSignal<number>;
290
- info(message: string, useProgress?: false): void;
291
- success(message: string, useProgress?: true): WritableSignal<number>;
292
- success(message: string, useProgress?: false): void;
293
- warning(message: string, useProgress?: true): WritableSignal<number>;
294
- warning(message: string, useProgress?: false): void;
295
- danger(message: string, useProgress?: true): WritableSignal<number>;
296
- danger(message: string, useProgress?: false): void;
297
-
298
- notify<T extends SdToastContentDef<any>>(input: SdToastInput<T>): Promise<...>;
299
- async try<R>(fn: () => Promise<R>, messageFn?: (err: Error) => string): Promise<R | undefined>;
300
- try<R>(fn: () => R, messageFn?: (err: Error) => string): R | undefined;
301
- }
302
- ```
303
-
304
- | Field | Type | Description |
305
- |-------|------|-------------|
306
- | `alertThemes` | `WritableSignal<SdToastSeverity[]>` | alert()로 표시할 테마 목록 |
307
- | `overlap` | `WritableSignal<boolean>` | 오버랩 모드 (새 토스트 시 기존 제거) |
308
- | `beforeShowFn` | `((theme) => void) \| undefined` | 토스트 표시 전 콜백 |
309
-
310
- | Method | Description |
311
- |--------|-------------|
312
- | `info/success/warning/danger(message, useProgress?)` | 토스트 표시. `useProgress=true`면 progress signal 반환 |
313
- | `notify(input)` | 커스텀 토스트 컴포넌트 표시 |
314
- | `try(fn, messageFn?)` | 에러 catch 시 danger 토스트 표시 후 undefined 반환 |
315
-
316
- ## `SdBusyProvider`
317
-
318
- 글로벌 busy 상태 관리 프로바이더.
319
-
320
- ```typescript
321
- @Injectable({ providedIn: "root" })
322
- class SdBusyProvider {
323
- type = signal<SdBusyType>("bar");
324
- globalBusyCount = signal(0);
325
- }
326
- ```
327
-
328
- | Field | Type | Description |
329
- |-------|------|-------------|
330
- | `type` | `WritableSignal<SdBusyType>` | busy 표시 유형 (`"spinner" \| "bar" \| "cube"`) |
331
- | `globalBusyCount` | `WritableSignal<number>` | 글로벌 busy 카운트 (0보다 크면 busy 표시) |
332
-
333
- ## `SdPrintProvider`
334
-
335
- 인쇄 및 PDF 생성 프로바이더. jsPDF + html-to-image 사용.
336
-
337
- ```typescript
338
- @Injectable({ providedIn: "root" })
339
- class SdPrintProvider {
340
- async printAsync<T extends SdPrint>(
341
- template: SdPrintInput<T>,
342
- options?: { size?: string; margin?: string },
343
- ): Promise<void>;
344
-
345
- async getPdfBufferAsync<T extends SdPrint>(
346
- template: SdPrintInput<T>,
347
- options?: { orientation?: "portrait" | "landscape"; pageSize?: string },
348
- ): Promise<Uint8Array>;
349
- }
350
- ```
351
-
352
- | Method | Description |
353
- |--------|-------------|
354
- | `printAsync(template, options?)` | 브라우저 인쇄 대화상자 열기. `size` 기본값 `"A4 auto"`, `margin` 기본값 `"0"` |
355
- | `getPdfBufferAsync(template, options?)` | PDF 바이너리 생성. `.page` 클래스 요소 단위로 페이지 분할 |
356
-
357
- ## `SdModalProvider`
358
-
359
- 프로그래밍 방식으로 모달을 생성하는 프로바이더.
360
-
361
- ```typescript
362
- @Injectable({ providedIn: "root" })
363
- class SdModalProvider {
364
- modalCount = signal(0);
365
-
366
- async showAsync<T extends SdModalContentDef<any>>(
367
- modal: SdModalInfo<T>,
368
- options?: SdModalOptions,
369
- ): Promise<Parameters<T["close"]["emit"]>[0] | undefined>;
370
- }
371
- ```
372
-
373
- | Field | Type | Description |
374
- |-------|------|-------------|
375
- | `modalCount` | `WritableSignal<number>` | 현재 열린 모달 수 |
376
-
377
- | Method | Description |
378
- |--------|-------------|
379
- | `showAsync(modal, options?)` | 모달 생성 후 close 결과를 Promise로 반환 |