@simplysm/sd-claude 14.0.88 โ†’ 14.0.89

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 (122) hide show
  1. package/claude/references/sd-simplysm14/README.md +17 -17
  2. package/claude/references/sd-simplysm14/apis/angular/README.md +27 -53
  3. package/claude/references/sd-simplysm14/apis/angular/controls.md +37 -105
  4. package/claude/references/sd-simplysm14/apis/angular/crud.md +46 -43
  5. package/claude/references/sd-simplysm14/apis/angular/directives.md +22 -32
  6. package/claude/references/sd-simplysm14/apis/angular/features.md +40 -55
  7. package/claude/references/sd-simplysm14/apis/angular/infra.md +40 -40
  8. package/claude/references/sd-simplysm14/apis/angular/layout.md +25 -53
  9. package/claude/references/sd-simplysm14/apis/angular/overlay.md +70 -82
  10. package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +44 -39
  11. package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +21 -36
  12. package/claude/references/sd-simplysm14/apis/angular/shared-data.md +52 -65
  13. package/claude/references/sd-simplysm14/apis/angular/sheet.md +65 -70
  14. package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +33 -35
  15. package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +7 -7
  16. package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +29 -29
  17. package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +45 -50
  18. package/claude/references/sd-simplysm14/apis/core-browser/README.md +42 -55
  19. package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +62 -0
  20. package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +13 -12
  21. package/claude/references/sd-simplysm14/apis/core-common/README.md +222 -98
  22. package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +102 -53
  23. package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +128 -0
  24. package/claude/references/sd-simplysm14/apis/core-common/datetime.md +98 -64
  25. package/claude/references/sd-simplysm14/apis/core-common/errors.md +91 -0
  26. package/claude/references/sd-simplysm14/apis/core-common/json-transfer.md +34 -28
  27. package/claude/references/sd-simplysm14/apis/core-common/obj.md +104 -40
  28. package/claude/references/sd-simplysm14/apis/core-node/README.md +11 -8
  29. package/claude/references/sd-simplysm14/apis/core-node/consola.md +23 -31
  30. package/claude/references/sd-simplysm14/apis/core-node/cpx.md +33 -22
  31. package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +28 -25
  32. package/claude/references/sd-simplysm14/apis/core-node/fsx.md +39 -53
  33. package/claude/references/sd-simplysm14/apis/core-node/pathx.md +26 -29
  34. package/claude/references/sd-simplysm14/apis/core-node/worker.md +27 -29
  35. package/claude/references/sd-simplysm14/apis/excel/README.md +14 -14
  36. package/claude/references/sd-simplysm14/apis/lint/README.md +27 -21
  37. package/claude/references/sd-simplysm14/apis/lint/rules.md +89 -49
  38. package/claude/references/sd-simplysm14/apis/orm-common/README.md +5 -59
  39. package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +98 -67
  40. package/claude/references/sd-simplysm14/apis/orm-common/expr.md +107 -92
  41. package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +99 -65
  42. package/claude/references/sd-simplysm14/apis/orm-common/schema.md +83 -98
  43. package/claude/references/sd-simplysm14/apis/orm-common/types.md +62 -52
  44. package/claude/references/sd-simplysm14/apis/orm-node/README.md +62 -25
  45. package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +27 -27
  46. package/claude/references/sd-simplysm14/apis/sd-cli/README.md +12 -15
  47. package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +92 -45
  48. package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +226 -108
  49. package/claude/references/sd-simplysm14/apis/service-client/README.md +84 -86
  50. package/claude/references/sd-simplysm14/apis/service-client/orm.md +14 -11
  51. package/claude/references/sd-simplysm14/apis/service-client/transport.md +33 -10
  52. package/claude/references/sd-simplysm14/apis/service-common/README.md +37 -23
  53. package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +9 -9
  54. package/claude/references/sd-simplysm14/apis/service-common/protocol.md +13 -13
  55. package/claude/references/sd-simplysm14/apis/service-server/README.md +81 -65
  56. package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +32 -35
  57. package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +44 -33
  58. package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +34 -45
  59. package/claude/references/sd-simplysm14/apis/storage/README.md +24 -18
  60. package/claude/skills/sd-demo/SKILL.md +6 -0
  61. package/claude/skills/sd-impl/SKILL.md +4 -7
  62. package/claude/skills/sd-spec/SKILL.md +31 -858
  63. package/claude/skills/sd-spec/references/spec-authoring.md +519 -0
  64. package/claude/workflows/sd-docs.js +84 -0
  65. package/package.json +1 -1
  66. package/claude/references/sd-simplysm14/apis/orm-common/query-builder.md +0 -29
  67. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +0 -99
  68. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +0 -12
  69. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +0 -3
  70. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +0 -150
  71. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +0 -143
  72. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +0 -150
  73. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +0 -2
  74. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +0 -12
  75. package/claude/skills/sd-demo/evals/golden.jsonl +0 -1
  76. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +0 -8
  77. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  78. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  79. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tsconfig.json +0 -10
  80. package/claude/skills/sd-dev/evals/golden.jsonl +0 -1
  81. package/claude/skills/sd-docs/SKILL.md +0 -46
  82. package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +0 -7
  83. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +0 -5
  84. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +0 -3
  85. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +0 -6
  86. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +0 -1
  87. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +0 -5
  88. package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +0 -8
  89. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +0 -7
  90. package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +0 -3
  91. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +0 -5
  92. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +0 -3
  93. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +0 -6
  94. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +0 -1
  95. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +0 -5
  96. package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +0 -8
  97. package/claude/skills/sd-docs/evals/golden.jsonl +0 -2
  98. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +0 -101
  99. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +0 -101
  100. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +0 -46
  101. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +0 -89
  102. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +0 -101
  103. package/claude/skills/sd-impl/evals/golden.jsonl +0 -4
  104. package/claude/skills/sd-manual/evals/fixtures/new-manual/src/notification.ts +0 -25
  105. package/claude/skills/sd-manual/evals/fixtures/update-manual/.claude/references/sd-simplysm14/manuals/notification.md +0 -14
  106. package/claude/skills/sd-manual/evals/fixtures/update-manual/src/notification.ts +0 -37
  107. package/claude/skills/sd-manual/evals/golden.jsonl +0 -2
  108. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +0 -7
  109. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +0 -4
  110. package/claude/skills/sd-review/evals/golden.jsonl +0 -2
  111. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +0 -14
  112. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  113. package/claude/skills/sd-skill/evals/golden.jsonl +0 -2
  114. package/claude/skills/sd-spec/evals/fixtures/case-a-split//355/232/214/354/235/230/353/241/235.md +0 -20
  115. package/claude/skills/sd-spec/evals/fixtures/case-b-detail/.specs/260513120000_warehouse/spec.md +0 -95
  116. package/claude/skills/sd-spec/evals/golden.jsonl +0 -2
  117. package/claude/skills/sd-unpack/evals/fixtures/eml-with-text-attachment/meeting.eml +0 -21
  118. package/claude/skills/sd-unpack/evals/fixtures/simple-eml/meeting.eml +0 -10
  119. package/claude/skills/sd-unpack/evals/golden.jsonl +0 -2
  120. package/claude/skills/sd-use/evals/fixtures/empty/.gitkeep +0 -0
  121. package/claude/skills/sd-use/evals/golden.jsonl +0 -6
  122. /package/claude/{skills/sd-docs/references/doc-rules.md โ†’ workflows/sd-docs.rules.md} +0 -0
@@ -1,14 +1,14 @@
1
1
  # @simplysm/orm-node โ€” ์ €์ˆ˜์ค€ DB ์—ฐ๊ฒฐ
2
2
 
3
- `createOrm` ์ถ”์ƒํ™” ์—†์ด ์ง์ ‘ SQL/ํŒŒ๋ผ๋ฏธํ„ฐ ์ฟผ๋ฆฌ/bulk insert/์ˆ˜๋™ ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜, `DbContext` ์˜ executor ๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ„์ธต. ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑยท์—ฐ๊ฒฐ ์ธํ„ฐํŽ˜์ด์Šคยท์ ‘์†์„ค์ •ยทexecutorยทdialect ํ—ฌํผยท์ƒ์ˆ˜๋กœ ๊ตฌ์„ฑ.
3
+ `createOrm` ์ถ”์ƒํ™”๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  raw SQLยทํŒŒ๋ผ๋ฏธํ„ฐ ์ฟผ๋ฆฌยทbulk insertยท์ˆ˜๋™ ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ฑฐ๋‚˜, dialect๋ณ„ ์ ‘์† ์„ค์ • ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, `DbContext` ์˜ executor ๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•  ๋•Œ ๊ฐ™์ด ์ฝํžˆ๋Š” ๋ฌถ์Œ. ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑยท์—ฐ๊ฒฐ ์ธํ„ฐํŽ˜์ด์Šคยท์ ‘์† ์„ค์ •ยทexecutorยทdialect ํ—ฌํผยท์ƒ์ˆ˜๋กœ ๊ตฌ์„ฑ.
4
4
 
5
5
  ## createDbConn
6
6
 
7
7
  ```typescript
8
- createDbConn(config: DbConnConfig): Promise<DbConn>
8
+ function createDbConn(config: DbConnConfig): Promise<DbConn>
9
9
  ```
10
10
 
11
- `config.dialect` ์— ๋งž๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ **์ง€์—ฐ import** ํ•ด ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค(mysql โ†’ `mysql2/promise`, postgresql โ†’ `pg` + `pg-copy-streams`, mssql/mssql-azure โ†’ `tedious`). ํ•œ ๋ฒˆ ๋กœ๋“œํ•œ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋ชจ๋“ˆ ์บ์‹œ์— ๋ณด๊ด€. ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋Š” ์•„์ง **๋ฏธ์—ฐ๊ฒฐ** ์ƒํƒœ์ด๋ฏ€๋กœ `connect()` ๋ฅผ ๋ณ„๋„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ.
11
+ `config.dialect` ์— ๋งž๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ **์ง€์—ฐ import** ํ•ด ์—ฐ๊ฒฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค(mysql โ†’ `mysql2/promise`, postgresql โ†’ `pg` + `pg-copy-streams`, mssql/mssql-azure โ†’ `tedious`). ํ•œ ๋ฒˆ ๋กœ๋“œํ•œ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋ชจ๋“ˆ ์บ์‹œ์— ๋ณด๊ด€ํ•ด ์žฌ์‚ฌ์šฉ. ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋Š” ์•„์ง **๋ฏธ์—ฐ๊ฒฐ** ์ƒํƒœ์ด๋ฏ€๋กœ `connect()` ๋ฅผ ๋ณ„๋„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ.
12
12
 
13
13
  ```typescript
14
14
  const conn = await createDbConn({ dialect: "postgresql", host: "localhost", username: "u", password: "p", database: "db" });
@@ -17,22 +17,22 @@ await conn.connect();
17
17
 
18
18
  ## DbConn
19
19
 
20
- ์ €์ˆ˜์ค€ ์—ฐ๊ฒฐ ์ธํ„ฐํŽ˜์ด์Šค. `EventEmitter<{ close: void }>` ๋ฅผ ์ƒ์†ํ•˜๋ฉฐ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ `close` ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ตฌํ˜„์ฒด `MysqlDbConn`/`MssqlDbConn`/`PostgresqlDbConn` ๋Š” ์ง์ ‘ export ๋˜์ง€ ์•Š๊ณ  `createDbConn` ์œผ๋กœ๋งŒ ํš๋“.
20
+ ์ €์ˆ˜์ค€ ์—ฐ๊ฒฐ ์ธํ„ฐํŽ˜์ด์Šค. `EventEmitter<{ close: void }>` ๋ฅผ ์ƒ์†ํ•˜๋ฉฐ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ `close` ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ตฌํ˜„์ฒด `MssqlDbConn`/`MysqlDbConn`/`PostgresqlDbConn` ๋Š” ์ง์ ‘ export ๋˜์ง€ ์•Š๊ณ  `createDbConn` ์œผ๋กœ๋งŒ ํš๋“(ํƒ€์ž… import ๋งŒ ๊ฐ€๋Šฅ).
21
21
 
22
- - `config: DbConnConfig` โ€” ์ด ์—ฐ๊ฒฐ์˜ ์ ‘์†์„ค์ •(์ฝ๊ธฐ์ „์šฉ).
23
- - `isConnected: boolean` โ€” ํ˜„์žฌ ์—ฐ๊ฒฐ ์—ฌ๋ถ€. `connect` ์„ฑ๊ณต ์‹œ `true`, `close`/์ข…๋ฃŒ ์ด๋ฒคํŠธ ์‹œ `false`.
24
- - `isInTransaction: boolean` โ€” ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์—ฌ๋ถ€. `beginTransaction` ํ›„ `true`, ์ปค๋ฐ‹/๋กค๋ฐฑ ํ›„ `false`.
22
+ - `config: DbConnConfig` โ€” ์ด ์—ฐ๊ฒฐ์˜ ์ ‘์† ์„ค์ •(์ฝ๊ธฐ ์ „์šฉ).
23
+ - `isConnected: boolean` โ€” ํ˜„์žฌ ์—ฐ๊ฒฐ ์—ฌ๋ถ€. `connect` ์„ฑ๊ณต ์‹œ `true`, `close`/์ข…๋ฃŒ(`end`) ์ด๋ฒคํŠธ ์‹œ `false`. ์ƒํƒœ ํ™•์ธยท์žฌ์—ฐ๊ฒฐ ํŒ๋‹จ์— ์‚ฌ์šฉ.
24
+ - `isInTransaction: boolean` โ€” ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์—ฌ๋ถ€. `beginTransaction` ํ›„ `true`, ์ปค๋ฐ‹ยท๋กค๋ฐฑ ํ›„ `false`.
25
25
  - `connect(): Promise<void>` โ€” ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ. ์ด๋ฏธ ์—ฐ๊ฒฐ๋ผ ์žˆ์œผ๋ฉด `DB_CONN_ERRORS.ALREADY_CONNECTED` throw.
26
- - `close(): Promise<void>` โ€” ์—ฐ๊ฒฐ ์ข…๋ฃŒ. ๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ๋ฉด ์•„๋ฌด ๋™์ž‘ ์—†์ด ๋ฐ˜ํ™˜.
27
- - `beginTransaction(isolationLevel?: IsolationLevel): Promise<void>` โ€” ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘. `isolationLevel` ๋ฏธ์ง€์ • ์‹œ `config.defaultIsolationLevel`, ๊ทธ๊ฒƒ๋„ ์—†์œผ๋ฉด `READ_UNCOMMITTED`.
26
+ - `close(): Promise<void>` โ€” ์—ฐ๊ฒฐ ์ข…๋ฃŒ. ๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ๋ฉด ์•„๋ฌด ๋™์ž‘ ์—†์ด ๋ฐ˜ํ™˜(throw ์•ˆ ํ•จ).
27
+ - `beginTransaction(isolationLevel?: IsolationLevel): Promise<void>` โ€” ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘. `isolationLevel` ๋ฏธ์ง€์ • ์‹œ `config.defaultIsolationLevel`, ๊ทธ๊ฒƒ๋„ ์—†์œผ๋ฉด `READ_UNCOMMITTED` ๋กœ ์‹œ์ž‘. ํ…Œ์ŠคํŠธ๋กœ ํ™•์ธ๋œ ํ—ˆ์šฉ ๊ฐ’: `"READ_UNCOMMITTED"|"READ_COMMITTED"|"REPEATABLE_READ"|"SERIALIZABLE"`.
28
28
  - `commitTransaction(): Promise<void>` โ€” ์ปค๋ฐ‹.
29
29
  - `rollbackTransaction(): Promise<void>` โ€” ๋กค๋ฐฑ.
30
- - `execute(queries: string[]): Promise<Record<string, unknown>[][]>` โ€” ์›์‹œ SQL ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์ˆœ์ฐจ ์‹คํ–‰. ๋นˆ ๋ฌธ์ž์—ด์€ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ, ๊ฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์…‹์„ ํ‰ํƒ„ํ™”ํ•ด ๋ฌถ์€ ๋ฐฐ์—ด ๋ฐ˜ํ™˜.
31
- - `executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>` โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฟผ๋ฆฌ ์‹คํ–‰. SQL ์ธ์ ์…˜ ํšŒํ”ผยท๊ฐ’ ์žฌ๋ฐ”์ธ๋”ฉ ์‹œ. ๋ฐ˜ํ™˜์€ ๊ฒฐ๊ณผ์…‹ ๋ฐฐ์—ด(MySQL ๋ฉ€ํ‹ฐ์Šคํ…Œ์ดํŠธ๋จผํŠธ๋Š” statement๋ณ„๋กœ ๋ถ„๋ฆฌ, INSERT/UPDATE/DELETE ์ž๋ฆฌ๋Š” ๋นˆ ๋ฐฐ์—ด).
32
- - `bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>` โ€” ๋„ค์ดํ‹ฐ๋ธŒ bulk API ๋กœ ๋Œ€๋Ÿ‰ ์‚ฝ์ž…. `tableName` ์€ `database.table` ๋˜๋Š” `database.schema.table`. `columnMetas` ๋Š” ์ปฌ๋Ÿผ๋ช… โ†’ `ColumnMeta`(ํƒ€์ž…ยทnullable) ๋งคํ•‘์ด๋ฉฐ ํ‚ค ์ˆœ์„œ๊ฐ€ ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •. `records` ๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋ฉด ์•„๋ฌด ๋™์ž‘ ์—†์ด ๋ฐ˜ํ™˜. dialect๋ณ„ ๊ฒฝ๋กœ: MSSQL tedious BulkLoad, MySQL `LOAD DATA LOCAL INFILE`(์ž„์‹œ CSV ํŒŒ์ผ ์ƒ์„ฑยท์‚ญ์ œ, UUID/binary ๋Š” `UNHEX`), PostgreSQL `COPY FROM STDIN`(CSV ์ŠคํŠธ๋ฆผ).
30
+ - `execute(queries: string[]): Promise<Record<string, unknown>[][]>` โ€” ์›์‹œ SQL ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์ˆœ์ฐจ ์‹คํ–‰. ๋นˆ/๊ณต๋ฐฑ ๋ฌธ์ž์—ด์€ ๊ฑด๋„ˆ๋œ€. ๊ฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์…‹๋“ค์„ ํ‰ํƒ„ํ™”ํ•ด ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋ฌถ์–ด ๋ฐ˜ํ™˜. DDLยท๋‹ค๊ฑด SQL ์ผ๊ด„ ์‹คํ–‰์— ์‚ฌ์šฉ.
31
+ - `executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>` โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์ฟผ๋ฆฌ ์‹คํ–‰. SQL ์ธ์ ์…˜ ํšŒํ”ผยท๊ฐ’ ์žฌ๋ฐ”์ธ๋”ฉ ์‹œ. ๋ฐ˜ํ™˜์€ ๊ฒฐ๊ณผ์…‹ ๋ฐฐ์—ด(MySQL ๋ฉ€ํ‹ฐ์Šคํ…Œ์ดํŠธ๋จผํŠธ๋Š” statement๋ณ„๋กœ ๋ถ„๋ฆฌ๋˜๋ฉฐ INSERT/UPDATE/DELETE ์ž๋ฆฌ๋Š” ๋นˆ ๋ฐฐ์—ด, PostgreSQL ์€ ๋‹จ์ผ ๊ฒฐ๊ณผ์…‹). `params` ๋ฏธ์ง€์ • ์‹œ MSSQL ์€ ๋ฐฐ์น˜(`execSqlBatch`) ๊ฒฝ๋กœ๋กœ ์‹คํ–‰.
32
+ - `bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]): Promise<void>` โ€” ๋„ค์ดํ‹ฐ๋ธŒ bulk API ๋กœ ๋Œ€๋Ÿ‰ ์‚ฝ์ž…. `tableName` ์€ `database.table` ๋˜๋Š” `database.schema.table`(dialect๋ณ„ ์ธ์šฉ ๋ถ€ํ˜ธ ํฌํ•จ๋œ ์™„์ „ ์ˆ˜์‹๋ช…). `columnMetas` ๋Š” ์ปฌ๋Ÿผ๋ช… โ†’ `ColumnMeta`(`dataType`ยท`nullable`) ๋งคํ•‘์ด๋ฉฐ **ํ‚ค ์ˆœ์„œ๊ฐ€ ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •**, `records` ์˜ ๊ฐ ๊ฐ์ฒด๋Š” ์ด ํ‚ค๋“ค๋กœ ๊ฐ’ ์ถ”์ถœ. `records` ๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋ฉด ์•„๋ฌด ๋™์ž‘ ์—†์ด ๋ฐ˜ํ™˜. dialect๋ณ„ ๊ฒฝ๋กœ: MSSQL tedious `BulkLoad`, MySQL `LOAD DATA LOCAL INFILE`(์ž„์‹œ CSV ํŒŒ์ผ ์ƒ์„ฑยท์‚ญ์ œ, UUID/binary ๋Š” `UNHEX`), PostgreSQL `COPY FROM STDIN`(CSV ์ŠคํŠธ๋ฆผ). `DateTime`/`DateOnly`/`Time`/`Uuid`/`Uint8Array` ๊ฐ’์€ dialect๋ณ„๋กœ ์ ์ ˆํžˆ ๋ณ€ํ™˜๋จ.
33
33
 
34
34
  ```typescript
35
- await conn.beginTransaction();
35
+ await conn.beginTransaction("READ_COMMITTED");
36
36
  const [rows] = await conn.executeParametrized('SELECT * FROM "User" WHERE id = $1', [1]);
37
37
  await conn.commitTransaction();
38
38
  ```
@@ -43,13 +43,13 @@ await conn.commitTransaction();
43
43
 
44
44
  ๊ณตํ†ต ํ•„๋“œ:
45
45
 
46
- - `dialect` โ€” `"mysql"` | `"mssql"` | `"mssql-azure"` | `"postgresql"`. DBMS ์„ ํƒ. `"mssql-azure"` ๋Š” Azure SQL ์šฉ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋Š” mssql ๊ณผ ๋™์ผํ•˜๋˜ ์—ฐ๊ฒฐ ์‹œ `encrypt` ํ™œ์„ฑํ™”. ์ฟผ๋ฆฌ ๋นŒ๋”์šฉ์œผ๋กœ๋Š” `getDialectFromConfig` ๊ฐ€ `"mssql"` ๋กœ ์ •๊ทœํ™”.
46
+ - `dialect` โ€” `"mysql"` | `"mssql"` | `"mssql-azure"` | `"postgresql"`. DBMS ์„ ํƒ. `"mssql-azure"` ๋Š” Azure SQL ์šฉ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋Š” mssql ๊ณผ ๋™์ผํ•˜๋˜ ์—ฐ๊ฒฐ ์‹œ `encrypt` ํ™œ์„ฑํ™”. ์ฟผ๋ฆฌ ๋นŒ๋”์šฉ dialect ๋กœ๋Š” `getDialectFromConfig` ๊ฐ€ `"mssql"` ๋กœ ์ •๊ทœํ™”.
47
47
  - `host: string` โ€” ์ ‘์† ํ˜ธ์ŠคํŠธ.
48
- - `port?: number` โ€” ํฌํŠธ. ๋ฏธ์ง€์ • ์‹œ ๋“œ๋ผ์ด๋ฒ„ ๊ธฐ๋ณธ๊ฐ’(PostgreSQL ์€ 5432 ๋กœ ๋ณด์ •).
48
+ - `port?: number` โ€” ํฌํŠธ. ๋ฏธ์ง€์ • ์‹œ ๋“œ๋ผ์ด๋ฒ„ ๊ธฐ๋ณธ๊ฐ’(PostgreSQL ์€ ๋ฏธ์ง€์ • ์‹œ 5432 ๋กœ ๋ณด์ •).
49
49
  - `username: string` โ€” ์ธ์ฆ ์‚ฌ์šฉ์ž.
50
50
  - `password: string` โ€” ์ธ์ฆ ๋น„๋ฐ€๋ฒˆํ˜ธ.
51
- - `database?: string` โ€” ๊ธฐ๋ณธ DB ์ด๋ฆ„.
52
- - `defaultIsolationLevel?: IsolationLevel` โ€” `beginTransaction` ์˜ `isolationLevel` ๋ฏธ์ง€์ • ์‹œ ์ ์šฉํ•  ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ์ˆ˜์ค€.
51
+ - `database?: string` โ€” ์ ‘์† ๊ธฐ๋ณธ DB ์ด๋ฆ„.
52
+ - `defaultIsolationLevel?: IsolationLevel` โ€” `beginTransaction` ์˜ `isolationLevel` ๋ฏธ์ง€์ • ์‹œ ์ ์šฉํ•  ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€.
53
53
 
54
54
  dialect๋ณ„ ์ถ”๊ฐ€ ํ•„๋“œ:
55
55
 
@@ -60,10 +60,10 @@ dialect๋ณ„ ์ถ”๊ฐ€ ํ•„๋“œ:
60
60
  ## getDialectFromConfig
61
61
 
62
62
  ```typescript
63
- getDialectFromConfig(config: DbConnConfig): Dialect
63
+ function getDialectFromConfig(config: DbConnConfig): Dialect
64
64
  ```
65
65
 
66
- `config.dialect` ๋ฅผ `@simplysm/orm-common` ์˜ `Dialect` ๋กœ ๋ณ€ํ™˜. `"mssql-azure"` โ†’ `"mssql"` ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜. ์ฟผ๋ฆฌ ๋นŒ๋”์˜ dialect ๊ฒฐ์ •์— ์‚ฌ์šฉ.
66
+ `config.dialect` ๋ฅผ `@simplysm/orm-common` ์˜ `Dialect` ๋กœ ๋ณ€ํ™˜. `"mssql-azure"` โ†’ `"mssql"` ๋กœ ์ •๊ทœํ™”ํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜. ์ฟผ๋ฆฌ ๋นŒ๋”์˜ dialect ๊ฒฐ์ •์— ์‚ฌ์šฉ. Azure ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ฐ™์€ SQL ๋ฐฉ์–ธ์„ ์จ์•ผ ํ•  ๋•Œ.
67
67
 
68
68
  ## NodeDbContextExecutor
69
69
 
@@ -71,24 +71,24 @@ getDialectFromConfig(config: DbConnConfig): Dialect
71
71
  new NodeDbContextExecutor(config: DbConnConfig)
72
72
  ```
73
73
 
74
- `@simplysm/orm-common` ์˜ `DbContextExecutor` ๋ฅผ Node ํ™˜๊ฒฝ์—์„œ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค. `createOrm` ์ด ๋‚ด๋ถ€์—์„œ ์ž๋™ ์ฃผ์ž…ํ•˜๋ฏ€๋กœ ๋ณดํ†ต ์ง์ ‘ ์“ธ ์ผ์€ ์—†๊ณ , `DbContext` ๋ฅผ `createOrm` ์—†์ด ์ˆ˜๋™ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ. ์ƒ์„ฑ์ž์—๋Š” `DbConnConfig` ๋งŒ ๋ฐ›๊ณ , ์‹ค์ œ ์—ฐ๊ฒฐ์€ `connect()` ์‹œ์ ์— `createDbConn` ์œผ๋กœ ์ง€์—ฐ ์ƒ์„ฑํ•œ๋‹ค.
74
+ `@simplysm/orm-common` ์˜ `DbContextExecutor` ๋ฅผ Node ํ™˜๊ฒฝ์—์„œ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค. `createOrm` ์ด ๋‚ด๋ถ€์—์„œ ์ž๋™ ์ฃผ์ž…ํ•˜๋ฏ€๋กœ ๋ณดํ†ต ์ง์ ‘ ์“ธ ์ผ์€ ์—†๊ณ , `DbContext` ๋ฅผ `createOrm` ์—†์ด ์ˆ˜๋™ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ. ์ƒ์„ฑ์ž๋Š” `DbConnConfig` ๋งŒ ๋ฐ›๊ณ , ์‹ค์ œ ์—ฐ๊ฒฐ์€ `connect()` ์‹œ์ ์— `createDbConn` ์œผ๋กœ ์ง€์—ฐ ์ƒ์„ฑํ•œ๋‹ค.
75
75
 
76
76
  - `connect(): Promise<void>` โ€” `createDbConn(config)` ๋กœ ์—ฐ๊ฒฐ ์ƒ์„ฑ ํ›„ ์ˆ˜๋ฆฝ.
77
77
  - `close(): Promise<void>` โ€” ์—ฐ๊ฒฐ ์ข…๋ฃŒ ํ›„ ๋‚ด๋ถ€ ์ฐธ์กฐ ํ•ด์ œ.
78
- - `beginTransaction(isolationLevel?: IsolationLevel)` / `commitTransaction()` / `rollbackTransaction()` โ€” ํŠธ๋žœ์žญ์…˜ ์œ„์ž„.
78
+ - `beginTransaction(isolationLevel?: IsolationLevel)` / `commitTransaction()` / `rollbackTransaction()` โ€” ๋‚ด๋ถ€ `DbConn` ์— ํŠธ๋žœ์žญ์…˜ ์œ„์ž„.
79
79
  - `executeParametrized(query: string, params?: unknown[]): Promise<Record<string, unknown>[][]>` โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ์ฟผ๋ฆฌ ์œ„์ž„.
80
80
  - `bulkInsert(tableName: string, columnMetas: Record<string, ColumnMeta>, records: DataRecord[]): Promise<void>` โ€” bulk insert ์œ„์ž„.
81
- - `executeDefs<T>(defs: QueryDef[], resultMetas?: (ResultMeta | undefined)[]): Promise<T[][]>` โ€” `QueryDef` ๋ฐฐ์—ด์„ dialect ์ฟผ๋ฆฌ ๋นŒ๋”๋กœ SQL ๋ณ€ํ™˜ํ•ด ์‹คํ–‰. `resultMetas` ๊ฐ€ ์ „๋ถ€ `null`/๋ฏธ์ง€์ •์ด๋ฉด(๊ฒฐ๊ณผ ๋ถˆํ•„์š”) ๋ชจ๋“  def ๋ฅผ ํ•˜๋‚˜์˜ SQL ๋กœ ํ•ฉ์ณ ๋‹จ์ผ ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ด๊ณ  def ์ˆ˜๋งŒํผ ๋นˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜(์“ฐ๊ธฐ ์ „์šฉ ์ตœ์ ํ™”). ๊ทธ ์™ธ์—” def ๋งˆ๋‹ค ๊ฐœ๋ณ„ ์‹คํ–‰ ํ›„, ํ•ด๋‹น ์œ„์น˜์— `resultMeta` ๊ฐ€ ์žˆ์œผ๋ฉด `parseQueryResult` ๋กœ ํƒ€์ž… ๋ณ€ํ™˜ํ•ด ๋ฐ˜ํ™˜.
81
+ - `executeDefs<T>(defs: QueryDef[], resultMetas?: (ResultMeta | undefined)[]): Promise<T[][]>` โ€” `QueryDef` ๋ฐฐ์—ด์„ dialect ์ฟผ๋ฆฌ ๋นŒ๋”๋กœ SQL ๋ณ€ํ™˜ํ•ด ์‹คํ–‰. `resultMetas` ๊ฐ€ ์ „๋ถ€ `null`/๋ฏธ์ง€์ •์ด๋ฉด(๊ฒฐ๊ณผ ๋ถˆํ•„์š”) ๋ชจ๋“  def ๋ฅผ ํ•˜๋‚˜์˜ SQL ๋กœ ํ•ฉ์ณ ๋‹จ์ผ ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ด๊ณ  def ์ˆ˜๋งŒํผ ๋นˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜(์“ฐ๊ธฐ ์ „์šฉ ์ตœ์ ํ™”). ๊ทธ ์™ธ์—” def ๋งˆ๋‹ค ๊ฐœ๋ณ„ ์‹คํ–‰ ํ›„, ํ•ด๋‹น ์œ„์น˜์— `resultMeta` ๊ฐ€ ์žˆ์œผ๋ฉด `parseQueryResult` ๋กœ ํƒ€์ž… ๋ณ€ํ™˜ํ•ด ๋ฐ˜ํ™˜, ์—†์œผ๋ฉด raw ๊ฒฐ๊ณผ์…‹ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜.
82
82
  - ๋ชจ๋“  ์‹คํ–‰ ๋ฉ”์„œ๋“œ๋Š” ๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ์—์„œ ํ˜ธ์ถœ ์‹œ `SdError(DB_CONN_ERRORS.NOT_CONNECTED)` throw.
83
83
 
84
84
  ## ์ƒ์ˆ˜
85
85
 
86
- - `DB_CONN_CONNECT_TIMEOUT` โ€” ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ํƒ€์ž„์•„์›ƒ. `10 * 1000`(10์ดˆ).
87
- - `DB_CONN_DEFAULT_TIMEOUT` โ€” ์ฟผ๋ฆฌ ๊ธฐ๋ณธ ํƒ€์ž„์•„์›ƒ. `10 * 60 * 1000`(10๋ถ„). ๋งˆ์ง€๋ง‰ ํ™œ๋™ ํ›„ ์ด ๊ฐ’์˜ 2๋ฐฐ๊ฐ€ ์ง€๋‚˜๋ฉด ์—ฐ๊ฒฐ์„ ์ž๋™ ์ข…๋ฃŒ(idle ํƒ€์ž„์•„์›ƒ).
88
- - `DB_CONN_ERRORS` โ€” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ ๊ฐ์ฒด. `NOT_CONNECTED`(๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ ์‹คํ–‰ ์‹œ), `ALREADY_CONNECTED`(์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ ์žฌ์—ฐ๊ฒฐ ์‹œ). `expect(...).rejects.toThrow(DB_CONN_ERRORS.NOT_CONNECTED)` ์ฒ˜๋Ÿผ throw ๋น„๊ตยท๋ฉ”์‹œ์ง€ ๋งค์นญ์— ์‚ฌ์šฉ.
86
+ - `DB_CONN_CONNECT_TIMEOUT` โ€” ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ํƒ€์ž„์•„์›ƒ. `10 * 1000`(10์ดˆ). ์—ฐ๊ฒฐ ๋“œ๋ผ์ด๋ฒ„์˜ connect ํƒ€์ž„์•„์›ƒ์œผ๋กœ ์ „๋‹ฌ.
87
+ - `DB_CONN_DEFAULT_TIMEOUT` โ€” ์ฟผ๋ฆฌ ๊ธฐ๋ณธ ํƒ€์ž„์•„์›ƒ. `10 * 60 * 1000`(10๋ถ„). ๋งˆ์ง€๋ง‰ ํ™œ๋™ ํ›„ ์ด ๊ฐ’์˜ 2๋ฐฐ๊ฐ€ ์ง€๋‚˜๋ฉด ์—ฐ๊ฒฐ์„ ์ž๋™ ์ข…๋ฃŒ(idle ํƒ€์ž„์•„์›ƒ)ํ•˜๋Š” ๋ฐ๋„ ์‚ฌ์šฉ.
88
+ - `DB_CONN_ERRORS` โ€” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ƒ์ˆ˜ ๊ฐ์ฒด(`as const`). `NOT_CONNECTED`(๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ์—์„œ ์‹คํ–‰ ์‹œ), `ALREADY_CONNECTED`(์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ์—์„œ ์žฌ์—ฐ๊ฒฐ ์‹œ). `expect(...).rejects.toThrow(DB_CONN_ERRORS.NOT_CONNECTED)` ์ฒ˜๋Ÿผ throw ๋น„๊ตยท๋ฉ”์‹œ์ง€ ๋งค์นญ์— ์‚ฌ์šฉ.
89
89
 
90
90
  ## ์ฃผ์˜์‚ฌํ•ญ
91
91
 
92
92
  - `createDbConn` ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋Š” ๋ฏธ์—ฐ๊ฒฐ ์ƒํƒœ โ€” ๋ฐ˜๋“œ์‹œ `connect()` ํ˜ธ์ถœ ํ›„ ์‚ฌ์šฉ.
93
- - bulk insert ๋Š” dialect๋ณ„ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ(MySQL ์€ ์ž„์‹œํŒŒ์ผ + `LOCAL INFILE`, PostgreSQL ์€ `COPY`) ์„œ๋ฒ„ ์ธก ๊ถŒํ•œยท์„ค์ •์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Œ.
94
- - ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ `createOrm`(README)์œผ๋กœ ์ถฉ๋ถ„. ์ด ๊ณ„์ธต์€ ์›์‹œ SQLยทexecutor ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ.
93
+ - bulk insert ๋Š” dialect๋ณ„ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ(MySQL ์ž„์‹œํŒŒ์ผ + `LOCAL INFILE`, PostgreSQL `COPY`, MSSQL `BulkLoad`) ์„œ๋ฒ„ ์ธก ๊ถŒํ•œยท์„ค์ •์— ์˜์กดํ•  ์ˆ˜ ์žˆ์Œ.
94
+ - ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ `createOrm`(README)์œผ๋กœ ์ถฉ๋ถ„. ์ด ๊ณ„์ธต์€ raw SQLยทexecutor ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ.
@@ -1,29 +1,26 @@
1
1
  # @simplysm/sd-cli
2
2
 
3
- simplysm ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋นŒ๋“œ/๋ฐฐํฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ CLI. entry(`src/index.ts`)๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์žฌ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ `sd.config.ts` ์ž‘์„ฑ์šฉ ์„ค์ • ํƒ€์ž… ๋ฌถ์Œ, Vitest์šฉ Angular AOT Vite ํ”Œ๋Ÿฌ๊ทธ์ธ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ TS/Angular AOT ์ปดํŒŒ์ผ๋Ÿฌ ํด๋ž˜์Šค 3์ข…. (CLI ์„œ๋ธŒ์ปค๋งจ๋“œ ๊ตฌํ˜„ ์ž์ฒด๋Š” entry export ๋Œ€์ƒ ์•„๋‹˜.)
3
+ simplysm ๋นŒ๋“œ/๋ฐฐํฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ CLI. entry ์—์„œ ๊ณต๊ฐœ๋˜๋Š” ๊ฒƒ์€ CLI ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ โ‘  `sd.config.ts` ์ž‘์„ฑ์šฉ ์„ค์ • ํƒ€์ž…, โ‘ก ๋‚ด๋ถ€ TypeScript/Angular ์ปดํŒŒ์ผ๋Ÿฌ(`SdTsCompiler`), โ‘ข Vitest ์ „์šฉ Angular Vite ํ”Œ๋Ÿฌ๊ทธ์ธ(`sdAngularPlugin`) ์„ธ ๊ฐ€์ง€๋ฟ์ด๋‹ค.
4
4
 
5
5
  ## ์‚ฌ์šฉ ํŠธ๋ฆฌ๊ฑฐ ์ธ๋ฑ์Šค
6
6
 
7
- - **sd.config.ts ์„ค์ • ํƒ€์ž…** (`SdConfig`, `SdConfigFn`, `SdConfigParams`, `SdPackageConfig` ๊ณ„์—ด, `SdPublishConfig` ๊ณ„์—ด, Capacitor/Electron/PWA ์„ค์ • ๋“ฑ) โ€” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ `sd.config.ts` ๋ฅผ ์ž‘์„ฑยท์ˆ˜์ •ํ•ด ํŒจํ‚ค์ง€ ๋นŒ๋“œ ํƒ€๊ฒŸยท๋ฐฐํฌยท์•ฑ ํŒจํ‚ค์ง•์„ ์„ค์ •ํ•  ๋•Œ. ์ž์„ธํžˆ: [sd-config-types.md](./sd-config-types.md)
8
- - **SdTsCompiler** (`SdTsCompiler`, `ISdTsCompilerOptions`, `ISdTsCompilerResult`) โ€” ํŒจํ‚ค์ง€์˜ `.ts` ๋ฅผ TS/Angular AOT ๋กœ ์ฆ๋ถ„ ์ปดํŒŒ์ผํ•˜๊ณ  ์ง„๋‹จยทemitยทlintยทSCSS ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ์— ์–ป์„ ๋•Œ (๋นŒ๋“œ ์—”์ง„ยทํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ). ์ž์„ธํžˆ: [SdTsCompiler.md](./SdTsCompiler.md)
9
- - **sdAngularPlugin** โ€” Vitest ์—์„œ Angular ํŒจํ‚ค์ง€๋ฅผ AOT ์ปดํŒŒ์ผํ•ด TestBed ๋กœ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•œ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ์„ `vitest.config.ts` ์— ๋ผ์šธ ๋•Œ. ์•„๋ž˜ ์ธ๋ผ์ธ ์„น์…˜ ์ฐธ์กฐ.
7
+ - **sd.config.ts ์„ค์ • ํƒ€์ž…** โ€” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ `sd.config.ts` ๋ฅผ ์ž‘์„ฑยท์ˆ˜์ •ํ•˜๋ฉฐ ํŒจํ‚ค์ง€ ๋นŒ๋“œ ํƒ€๊ฒŸยท๋ฐฐํฌยทCapacitor/Electron/PWAยท์„œ๋ฒ„ ์˜ต์…˜์„ ์ง€์ •ํ•  ๋•Œ. ์ž์„ธํžˆ: [sd-config-types.md](./sd-config-types.md)
8
+ - **SdTsCompiler / ISdTsCompilerOptions / ISdTsCompilerResult** โ€” sd-cli ์™ธ๋ถ€์—์„œ ํŒจํ‚ค์ง€ ๋‹จ์œ„ TS(๋˜๋Š” Angular AOT) ์ฆ๋ถ„ ์ปดํŒŒ์ผ์„ ์ง์ ‘ ๊ตฌ๋™ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๊ฒฐ๊ณผ(emitยท์ง„๋‹จยทlintยทSCSS)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ. ์ž์„ธํžˆ: [SdTsCompiler.md](./SdTsCompiler.md)
9
+ - **sdAngularPlugin / SdAngularPluginOptions** โ€” Vitest ์˜ Angular project ์—์„œ `.ts` ๋ฅผ AOT ์ปดํŒŒ์ผํ•ด ์ฃผ์ž…ํ•˜๋Š” Vite ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์ •ํ•  ๋•Œ. (์ธ๋ผ์ธ, ์•„๋ž˜ ์ฐธ์กฐ)
10
10
 
11
11
  ## sdAngularPlugin
12
12
 
13
- Vitest ์ „์šฉ Vite ํ”Œ๋Ÿฌ๊ทธ์ธ. `SdTsCompiler` ๋กœ ๋Œ€์ƒ ํŒจํ‚ค์ง€์˜ `.ts` ๋ฅผ AOT ์ปดํŒŒ์ผํ•˜๊ณ , `transform` ํ›…์—์„œ ์ปดํŒŒ์ผ๋œ JS ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
14
-
15
- ```typescript
16
- function sdAngularPlugin(options: SdAngularPluginOptions): Plugin
13
+ ```ts
14
+ function sdAngularPlugin(options: SdAngularPluginOptions): Plugin // vite Plugin ๋ฐ˜ํ™˜
15
+ interface SdAngularPluginOptions { pkg: string }
17
16
  ```
18
17
 
19
- `SdAngularPluginOptions`:
20
-
21
- - pkg: string โ€” `sd.config.ts` ์˜ `packages` ํ‚ค(ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ๋ช…, `@simplysm/` ์ ‘๋‘์‚ฌ ์ œ์™ธ). `config()` ํ›…์—์„œ `packages/<pkg>` ๋ฅผ ์ปดํŒŒ์ผ ๋ฃจํŠธ๋กœ ํ•ด์„ํ•œ๋‹ค. ์–ด๋А Angular ํŒจํ‚ค์ง€๋ฅผ ํ…Œ์ŠคํŠธ ๋นŒ๋“œํ• ์ง€ ์ง€์ •.
18
+ Angular AOT ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Vite ํ”Œ๋Ÿฌ๊ทธ์ธ. **Vitest ์ „์šฉ**(`vitest.config.ts` ์˜ `angular` project plugins ์— ๋“ฑ๋ก). ๋‚ด๋ถ€์ ์œผ๋กœ `SdTsCompiler` ๋กœ ๋Œ€์ƒ ํŒจํ‚ค์ง€์˜ `.ts`(tests ํฌํ•จ, `includeTests: true`)๋ฅผ AOT ์ปดํŒŒ์ผํ•˜๊ณ , Vite `transform` ํ›…์—์„œ ์ปดํŒŒ์ผ๋œ JS ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. `enforce: "pre"` ๋กœ ๋‹ค๋ฅธ transform ๋ณด๋‹ค ๋จผ์ € ๋™์ž‘ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“  ์ธ๋ผ์ธ base64 ์†Œ์Šค๋งต์„ ๋ถ„๋ฆฌํ•ด Vite ํ˜ธํ™˜ ํ˜•ํƒœ(`{ code, map }`)๋กœ ๋„˜๊ธด๋‹ค. `buildEnd` ๋งˆ๋‹ค ๋‚ด๋ถ€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ๊ธฐํ•ด ๋‹ค์Œ watch ์žฌ๋นŒ๋“œ ๋•Œ ์žฌ์ƒ์„ฑํ•˜๊ณ , watch ๋ณ€๊ฒฝ ํŒŒ์ผ์€ `buildStart` ์˜ ์บ์‹œ ๋ฌดํšจํ™”์— ์‚ฌ์šฉํ•œ๋‹ค.
22
19
 
23
- ๋™์ž‘: `enforce: "pre"` ํ”Œ๋Ÿฌ๊ทธ์ธ. `buildStart` ์—์„œ ๋‚ด๋ถ€ `SdTsCompiler`(`output: { js: true, dts: false }`, `includeTests: true`, `rootDir` = cwd)๋กœ ํŒจํ‚ค์ง€ ์ „์ฒด๋ฅผ AOT ์ปดํŒŒ์ผํ•ด ์†Œ์Šค๊ฒฝ๋กœโ†’JS ๋งต์„ ๋งŒ๋“ค๊ณ , `transform` ํ›…์ด ๋งค์นญ๋˜๋Š” `.ts` ์š”์ฒญ์— ์ปดํŒŒ์ผ๋œ JS(์ธ๋ผ์ธ ์†Œ์Šค๋งต ๋ถ„๋ฆฌ)๋ฅผ ๋Œ๋ ค์ค€๋‹ค. `watchChange` ๋กœ ๋ชจ์€ ๋ณ€๊ฒฝ ํŒŒ์ผ์„ ๋‹ค์Œ `buildStart` ์˜ ์ฆ๋ถ„ ๋ฌดํšจํ™”์— ๋„˜๊ธฐ๊ณ , `buildEnd` ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ๊ธฐํ•ด ๋‹ค์Œ ๋ผ์šด๋“œ์— ์žฌ์ƒ์„ฑํ•œ๋‹ค. ์ง„๋‹จ์€ logger ๋กœ ๋ณด๊ณ , emit ๋””์Šคํฌ ์ถœ๋ ฅ์€ ํ•˜์ง€ ์•Š์Œ.
20
+ - pkg: string โ€” ์ปดํŒŒ์ผ ๋Œ€์ƒ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ๋ช…. `sd.config.ts` ์˜ `packages` ํ‚ค์™€ ๋™์ผ(`@simplysm/` ์ ‘๋‘์‚ฌ ์ œ์™ธํ•œ ์งง์€ ์ด๋ฆ„, ์˜ˆ: `"angular"`). ํ”Œ๋Ÿฌ๊ทธ์ธ์€ `process.cwd()/packages/<pkg>` ๋ฅผ ์ปดํŒŒ์ผ ๋ฃจํŠธ๋กœ ์žก์œผ๋ฏ€๋กœ, ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” Angular ํŒจํ‚ค์ง€๋ช…์„ ๊ทธ๋Œ€๋กœ ๋„ฃ๋Š”๋‹ค.
24
21
 
25
- ```typescript
22
+ ```ts
23
+ // vitest.config.ts
26
24
  import { sdAngularPlugin } from "@simplysm/sd-cli";
27
- // vitest.config.ts project.plugins ์— ์ถ”๊ฐ€
28
- plugins: [sdAngularPlugin({ pkg: "angular" })];
25
+ plugins: [sdAngularPlugin({ pkg: "angular" })]
29
26
  ```
@@ -1,70 +1,117 @@
1
1
  # @simplysm/sd-cli โ€” SdTsCompiler
2
2
 
3
- ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ์˜ `.ts` ๋ฅผ TS ๋˜๋Š” Angular AOT ๋กœ **์ฆ๋ถ„** ์ปดํŒŒ์ผํ•˜๋Š” ํด๋ž˜์Šค. ํ•œ ๋ฒˆ์˜ `compileAsync` ํ˜ธ์ถœ๋กœ ์ง๋ ฌํ™”๋œ ์ง„๋‹จ + emit ๊ฒฐ๊ณผ + lint + SCSS ๊ฒฐ๊ณผ๋ฅผ ๋ฌถ์–ด ๋ฐ˜ํ™˜. tsconfig ์˜ `angularCompilerOptions` ์กด์žฌ ์—ฌ๋ถ€๋กœ Angular/์ผ๋ฐ˜ ๋ชจ๋“œ๋ฅผ ์ž๋™ ํŒ๋ณ„. ๋นŒ๋“œ ์—”์ง„ยท`sdAngularPlugin` ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ. ์ง„๋‹จ์€ worker ๊ฒฝ๊ณ„๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก `SerializedDiagnostic` ์œผ๋กœ ์ง๋ ฌํ™”๋จ.
3
+ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ์˜ `.ts` ๋ฅผ TypeScript ๋˜๋Š” Angular AOT ๋กœ **์ฆ๋ถ„** ์ปดํŒŒ์ผํ•˜๋Š” ํด๋ž˜์Šค. ํ•œ ๋ฒˆ์˜ `compileAsync` ํ˜ธ์ถœ๋กœ ์ง๋ ฌํ™”๋œ ์ง„๋‹จ + emit ๊ฒฐ๊ณผ + lint + SCSS ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฌถ์Œ(`ISdTsCompilerResult`)์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. tsconfig ์˜ `angularCompilerOptions` ์กด์žฌ ์—ฌ๋ถ€๋กœ Angular/์ผ๋ฐ˜ ๋ชจ๋“œ๋ฅผ ์ž๋™ ํŒ๋ณ„. ๋นŒ๋“œ ์—”์ง„๊ณผ `sdAngularPlugin` ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ. ์ง„๋‹จ์€ worker ๊ฒฝ๊ณ„๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก `SerializedDiagnostic` ์œผ๋กœ ์ง๋ ฌํ™”๋˜๋ฉฐ, ๋‚ด๋ถ€ ํฌ๋ž˜์‹œ๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ์žก์•„ ์ง„๋‹จ์œผ๋กœ ๋ณด๊ณ (๋ถ€๋ถ„ ๋ณต๊ตฌ)ํ•œ๋‹ค.
4
4
 
5
- ## SdTsCompiler
5
+ ## ISdTsCompilerOptions (์ƒ์„ฑ์ž ์ธ์ž)
6
+
7
+ ```typescript
8
+ interface ISdTsCompilerOptions {
9
+ pkgDir: string;
10
+ cwd: string;
11
+ output: { js: boolean; dts: boolean };
12
+ includeTests?: boolean;
13
+ env?: TypecheckEnv;
14
+ // Angular ์ „์šฉ (isForAngular ์‹œ ํ™œ์„ฑ)
15
+ sourceFileCache?: AngularSourceFileCache;
16
+ transformStylesheet?: (data: string, containingFile: string, stylesheetFile?: string) => Promise<string | null>;
17
+ externalStylesheets?: Map<string, string>;
18
+ compilerOptionsTransformer?: (options: ts.CompilerOptions) => ts.CompilerOptions;
19
+ // SCSS/lint ํ†ตํ•ฉ
20
+ lint?: boolean;
21
+ globalScss?: boolean;
22
+ }
23
+ ```
24
+
25
+ - pkgDir: string โ€” ์ปดํŒŒ์ผ ๋Œ€์ƒ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ. `<pkgDir>/tsconfig.json` ์„ ํŒŒ์‹ฑํ•˜๊ณ  `<pkgDir>/dist` ๋กœ emit, `<pkgDir>/.cache` ์— tsbuildinfo ๋ฅผ ๋‘”๋‹ค.
26
+ - cwd: string โ€” ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฃจํŠธ. ์ง„๋‹จ ํ•„ํ„ฐ๋ง(`isWorkspaceDiagnostic`)ยท๊ฒฝ๋กœ ์ƒ๋Œ€ํ™”ยท์—๋Ÿฌ ํฌ๋งท ๊ธฐ์ค€์ .
27
+ - output.js: boolean โ€” JS emit ์—ฌ๋ถ€. true ๋ฉด `.js` ์‚ฐ์ถœ(non-Angular ์€ import ์— `.js` ํ™•์žฅ์ž ๋ถ€์ฐฉ + ๊ฒฝ๋กœ ์žฌ์ž‘์„ฑ, Angular ์€ `emitResults` ๋กœ ๋ฐ˜ํ™˜).
28
+ - output.dts: boolean โ€” `.d.ts` emit ์—ฌ๋ถ€. `js`/`dts` ์กฐํ•ฉ์— ๋”ฐ๋ผ emit-onlyยทdeclaration-onlyยทnoEmit(๋‘˜ ๋‹ค false = ํƒ€์ž…์ฒดํฌ๋งŒ) ์œผ๋กœ ๋ถ„๊ธฐ.
29
+ - includeTests?: boolean โ€” `tests/` ํŒŒ์ผ์„ rootNames ์— ํฌํ•จํ• ์ง€. ๊ธฐ๋ณธ false. ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋ฉด true(์˜ˆ: `sdAngularPlugin`).
30
+ - env?: TypecheckEnv โ€” ํƒ€์ž…์ฒดํฌ ํ™˜๊ฒฝ. ์ง€์ • ์‹œ `getCompilerOptionsForEnv()` ๋กœ ํ™˜๊ฒฝ๋ณ„ compilerOptions ๋ฅผ ์ ์šฉํ•˜๊ณ  tsbuildinfo ํŒŒ์ผ๋ช…์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ถ™์ž„. ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ํƒ€์ž…์ฒดํฌ์— ์“ด๋‹ค.
31
+ - sourceFileCache?: AngularSourceFileCache โ€” Angular ์ฆ๋ถ„์šฉ SourceFile ์บ์‹œ. ๋ฏธ์ œ๊ณต ์‹œ ๋‚ด๋ถ€ ์ƒ์„ฑ. ์—ฌ๋Ÿฌ `compileAsync` ๋ผ์šด๋“œ ๊ฐ„ ์บ์‹œ๋ฅผ ๊ณต์œ ํ•˜๋ ค๋ฉด ์™ธ๋ถ€์—์„œ ์ฃผ์ž….
32
+ - transformStylesheet?: (data, containingFile, stylesheetFile?) => Promise<string|null> โ€” ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ๋ณ€ํ™˜ ์ฝœ๋ฐฑ(Angular only). `null` ๋ฐ˜ํ™˜ ์‹œ ๋ณ€ํ™˜ ์•ˆ ํ•จ. ๋ฏธ์ œ๊ณต์ด๊ณ  Angular ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์šฉ SCSS ๋ณ€ํ™˜ ์ฝœ๋ฐฑ์„ ์ž๋™ ์ƒ์„ฑ. ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ์ฒ˜๋Ÿผ ์ปค์Šคํ…€ ์Šคํƒ€์ผ ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•„์š”ํ•  ๋•Œ ์ง์ ‘ ์ œ๊ณต.
33
+ - externalStylesheets?: Map<string, string> โ€” ์™ธ๋ถ€ ์Šคํƒ€์ผ์‹œํŠธ ๋งต(ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ์šฉ). ์ง€์ • ์‹œ ๋น„-ํ…œํ”Œ๋ฆฟ ์Šคํƒ€์ผ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์‹œ ๊ธฐ๋ฐ˜ `.css` ์™ธ๋ถ€ ํŒŒ์ผ๋ช…์œผ๋กœ ๋งคํ•‘(`resourceNameToFileName`). ์Šคํƒ€์ผ์„ ๋ณ„๋„ ์ฒญํฌ๋กœ ๋ฝ‘์„ ๋•Œ.
34
+ - compilerOptionsTransformer?: (options) => ts.CompilerOptions โ€” ์ตœ์ข… compilerOptions ํ›„์ฒ˜๋ฆฌ ํ›…. ํด๋ผ์ด์–ธํŠธ์˜ `target`/`module`/`rootDir` ๊ฐ•์ œ ๋“ฑ์— ์“ด๋‹ค.
35
+ - lint?: boolean โ€” true ๋ฉด `compileAsync` ๊ฐ€ program ๊ธฐ๋ฐ˜ lint ๋ฅผ ํ•จ๊ป˜ ๋Œ๋ ค ๊ฒฐ๊ณผ๋ฅผ `result.lint` ์— ๋‹ด๋Š”๋‹ค(affected ํŒŒ์ผ๋งŒ ๋Œ€์ƒ). ์ปดํŒŒ์ผ๊ณผ ๋™์‹œ์— lint ํ•˜๊ณ  ์‹ถ์„ ๋•Œ.
36
+ - globalScss?: boolean โ€” true ๋ฉด `scss/styles.scss` โ†’ `dist/styles.css` ๊ธ€๋กœ๋ฒŒ SCSS ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์—๋Ÿฌ๋ฅผ `result.scssErrors` ์— ๋”ํ•œ๋‹ค.
37
+
38
+ ## ISdTsCompilerEmitOptions (compileAsync 2๋ฒˆ์งธ ์ธ์ž)
39
+
40
+ ```typescript
41
+ interface ISdTsCompilerEmitOptions {
42
+ sourceFilter?: (fileName: string) => boolean;
43
+ additionalTransformers?: {
44
+ before?: ts.TransformerFactory<ts.SourceFile>[];
45
+ after?: ts.TransformerFactory<ts.SourceFile>[];
46
+ };
47
+ }
48
+ ```
49
+
50
+ - sourceFilter?: (fileName) => boolean โ€” emit ๊ฒฐ๊ณผ ํ•„ํ„ฐ(Angular only). true ์ธ ์†Œ์Šค๋งŒ `emitResults` ์— ๋‚จ๊ธด๋‹ค. ํŠน์ • ํŒŒ์ผ์˜ emit ๋งŒ ํ•„์š”ํ•  ๋•Œ(์˜ˆ: HMR ๋‹จ์ผ ํŒŒ์ผ).
51
+ - additionalTransformers?.before / .after โ€” Angular ๊ธฐ๋ณธ transformers ์•ž/๋’ค์— ๋ผ์šธ ์ถ”๊ฐ€ TS transformer ๋ฐฐ์—ด(Angular only). ์ปค์Šคํ…€ ์ฝ”๋“œ ๋ณ€ํ™˜์„ ์ฃผ์ž…ํ•  ๋•Œ.
52
+
53
+ ## SdTsCompiler โ€” ๋ฉ”์„œ๋“œ
6
54
 
7
55
  ```typescript
8
56
  class SdTsCompiler {
9
57
  constructor(options: ISdTsCompilerOptions);
10
58
  compileAsync(modifiedFiles?: ReadonlySet<string>, emitOptions?: ISdTsCompilerEmitOptions): Promise<ISdTsCompilerResult>;
59
+ get sideEffectScssRegistry(): Map<string, SideEffectScssEntry>;
11
60
  compileSideEffectScss(): void;
12
61
  findAffectedByScss(scssPath: string): string[];
13
- get sideEffectScssRegistry(): Map<string, SideEffectScssEntry>;
14
62
  }
15
63
  ```
16
64
 
17
- - compileAsync(modifiedFiles?, emitOptions?) โ€” 1ํšŒ ์ฆ๋ถ„ ์ปดํŒŒ์ผ. `modifiedFiles` = ์ง์ „ ๋ณ€๊ฒฝ ํŒŒ์ผ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ง‘ํ•ฉ(์ „๋‹ฌ ์‹œ sourceFileCacheยทpackageJsonCache ๋ฌดํšจํ™”, ๋ฏธ์ „๋‹ฌ ์‹œ ์ „์ฒด). `emitOptions` = emit ์„ธ๋ถ€ ์ œ์–ด. ์œ„ํ—˜ ๊ตฌ๊ฐ„์„ ๋‹จ๊ณ„๋ณ„ try/catch ๋กœ ๊ฐ์‹ธ ๋ถ€๋ถ„ ๋ณต๊ตฌํ•˜๋ฉฐ, ์žกํžŒ ํฌ๋ž˜์‹œ๋Š” ๊ฒฐ๊ณผ์˜ `diagnostics`/`errors` ์— ํ•ฉ์‚ฐ๋จ(silent skip ์•„๋‹˜).
18
- - compileSideEffectScss() โ€” `sideEffectScssRegistry` ์— ๋“ฑ๋ก๋œ side-effect SCSS ํ•ญ๋ชฉ์„ ๋ชจ๋‘ CSS ๋กœ ์ปดํŒŒ์ผ. emit ์ฝ”๋“œ๊ฐ€ ํ•ญ๋ชฉ์„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ฑ„์šด ๋’ค ํ˜ธ์ถœ.
19
- - findAffectedByScss(scssPath) โ€” ์ฃผ์–ด์ง„ SCSS ๊ฒฝ๋กœ์— ์˜์กดํ•˜๋Š” ์†Œ์Šค ํŒŒ์ผ ๋ชฉ๋ก ๋ฐ˜ํ™˜(์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰). watch ์—์„œ SCSS ๋ณ€๊ฒฝ ์‹œ ์žฌ์ปดํŒŒ์ผ ๋Œ€์ƒ์„ ์ฐพ์„ ๋•Œ.
20
- - sideEffectScssRegistry โ€” side-effect SCSS ํ•ญ๋ชฉ ๋งต(์†Œ์Šค๊ฒฝ๋กœ โ†’ ์—”ํŠธ๋ฆฌ). emit ์ฝ”๋“œ๊ฐ€ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•˜๋Š” ํ†ต๋กœ.
65
+ - compileAsync(modifiedFiles?, emitOptions?) โ€” 1ํšŒ ์ฆ๋ถ„ ์ปดํŒŒ์ผ ์‹คํ–‰. `modifiedFiles` = ์ง์ „ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ์ ˆ๋Œ€๊ฒฝ๋กœ ์ง‘ํ•ฉ(์ฆ๋ถ„ ๋ฌดํšจํ™”์šฉ, ๋ฏธ์ง€์ •ยท๋นˆ ์ง‘ํ•ฉ์ด๋ฉด ์บ์‹œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ; node_modules ํฌํ•จ ๋ณ€๊ฒฝ ์‹œ packageJsonCache ํด๋ฆฌ์–ด). `emitOptions` ๋Š” ์œ„ emit ํ•„ํ„ฐ/transformer. ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•ด ์ฆ๋ถ„ ๋นŒ๋“œ๋ฅผ ์ด์–ด๊ฐ„๋‹ค.
66
+ - sideEffectScssRegistry (getter) โ€” side-effect SCSS ๋“ฑ๋ก๋ถ€(`Map<์†Œ์Šค, SideEffectScssEntry>`) ์ฐธ์กฐ. emit ์ฝ”๋“œ๊ฐ€ ํ•ญ๋ชฉ์„ ๋“ฑ๋กํ•˜๋Š” ํ†ต๋กœ.
67
+ - compileSideEffectScss() โ€” ์œ„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ CSS ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์—๋Ÿฌ/์˜์กด์„ฑ์„ ๋‚ด๋ถ€ ์ƒํƒœ์— ๋ฐ˜์˜.
68
+ - findAffectedByScss(scssPath) โ€” ์ฃผ์–ด์ง„ SCSS ๊ฒฝ๋กœ์— ์˜์กดํ•˜๋Š” ์†Œ์œ ์ž ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜(์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰). watch ์—์„œ SCSS ๋ณ€๊ฒฝ ์‹œ ์žฌ์ปดํŒŒ์ผ ๋Œ€์ƒ ์‚ฐ์ถœ์— ์“ด๋‹ค.
21
69
 
22
- `compileAsync` ๋™์ž‘ ์š”์•ฝ: tsconfig ํŒŒ์‹ฑ โ†’ `includeTests` ์— ๋”ฐ๋ผ rootNames ๊ฒฐ์ • โ†’ `output` ํ”Œ๋ž˜๊ทธ๋กœ compilerOptions ๊ตฌ์„ฑ(`compilerOptionsTransformer` ๋งˆ์ง€๋ง‰ ์ ์šฉ) โ†’ Angular ๋ฉด `NgtscProgram.analyzeAsync`, ์•„๋‹ˆ๋ฉด `EmitAndSemanticDiagnosticsBuilderProgram` โ†’ affected ํŒŒ์ผ ์ถ”์  โ†’ emit โ†’ ์ง„๋‹จ ์ˆ˜์ง‘ยท์ง๋ ฌํ™”ยทํ•„ํ„ฐ(workspace ๋‚ด๋ถ€๋งŒ) โ†’ `globalScss`/`lint` ๋ณ‘๋ ฌ ์‹คํ–‰. ๋น„-Angular emit ์€ writeFile ํ›…์œผ๋กœ ๋””์Šคํฌ์— ์ง์ ‘ ์“ฐ๊ณ (`emitResults` undefined), Angular emit ์€ `emitResults` ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜.
70
+ ์‚ฌ์šฉ ์˜ˆ:
23
71
 
24
72
  ```typescript
25
73
  import { SdTsCompiler } from "@simplysm/sd-cli";
26
- const compiler = new SdTsCompiler({ pkgDir, cwd, output: { js: true, dts: true }, lint: true });
74
+
75
+ const compiler = new SdTsCompiler({
76
+ pkgDir: "/repo/packages/core-common",
77
+ cwd: "/repo",
78
+ output: { js: true, dts: true },
79
+ });
27
80
  const result = await compiler.compileAsync();
28
81
  if (result.errorCount > 0) console.error(result.errors);
82
+ // watch ๋ผ์šด๋“œ: ๋ณ€๊ฒฝ ํŒŒ์ผ๋งŒ ๋„˜๊ฒจ ์ฆ๋ถ„ ์ปดํŒŒ์ผ
83
+ const next = await compiler.compileAsync(new Set(["/repo/packages/core-common/src/foo.ts"]));
29
84
  ```
30
85
 
31
- ## ISdTsCompilerOptions
32
-
33
- ์ƒ์„ฑ์ž ์˜ต์…˜.
34
-
35
- - pkgDir: string โ€” ์ปดํŒŒ์ผ ๋Œ€์ƒ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ ์ ˆ๋Œ€๊ฒฝ๋กœ. rootNamesยทoutDirยทSCSS loadPath ๊ธฐ์ค€.
36
- - cwd: string โ€” workspace ๋ฃจํŠธ. diagnostics ํ•„ํ„ฐ๋ง(์›Œํฌ์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€ ์ง„๋‹จ๋งŒ ๋‚จ๊น€)ยท์ƒ๋Œ€๊ฒฝ๋กœ ๋กœ๊น… ๊ธฐ์ค€.
37
- - output: { js: boolean; dts: boolean } โ€” ์ถœ๋ ฅ ์ œ์–ด. `js` = `.js` emit ์—ฌ๋ถ€, `dts` = `.d.ts` emit ์—ฌ๋ถ€. ๋‘˜ ๋‹ค false ๋ฉด noEmit(ํƒ€์ž…์ฒดํฌ๋งŒ). ์กฐํ•ฉ์— ๋”ฐ๋ผ declaration/sourceMap/tsBuildInfoFile ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ง.
38
- - includeTests?: boolean โ€” `tests/` ํŒŒ์ผ์„ rootNames ์— ํฌํ•จํ• ์ง€. ๊ธฐ๋ณธ false. ํ…Œ์ŠคํŠธ AOT ์ปดํŒŒ์ผ(Vitest)์—์„œ true.
39
- - env?: "node" | "browser" โ€” ํƒ€์ž…์ฒดํฌ ํ™˜๊ฒฝ. ์„ค์ • ์‹œ ํ™˜๊ฒฝ๋ณ„ compilerOptions ์กฐ์ •(`getCompilerOptionsForEnv`) ์ ์šฉ. ๋™์ผ ํŒจํ‚ค์ง€๋ฅผ ํ™˜๊ฒฝ๋ณ„๋กœ ๋ถ„๋ฆฌ ๊ฒ€์ฆํ•  ๋•Œ.
40
- - sourceFileCache?: AngularSourceFileCache โ€” Angular ์ฆ๋ถ„ ๋นŒ๋“œ์šฉ SourceFile ์บ์‹œ. ๋ฏธ์ œ๊ณต ์‹œ ๋‚ด๋ถ€ ์ƒ์„ฑ. ์ธ์Šคํ„ด์Šค ๊ฐ„ ์บ์‹œ ๊ณต์œ ๋กœ ์ฆ๋ถ„ ์†๋„ ํ™•๋ณด.
41
- - transformStylesheet?: (data, containingFile, stylesheetFile?) => Promise<string | null> โ€” ์Šคํƒ€์ผ์‹œํŠธ ๋ณ€ํ™˜ ์ฝœ๋ฐฑ(Angular ์ „์šฉ). ์ธ๋ผ์ธ/์™ธ๋ถ€ ์Šคํƒ€์ผ์„ ๊ฐ€๊ณตํ•ด ๋ฐ˜ํ™˜, `null` ์ด๋ฉด ๋ฏธ๋ณ€ํ™˜. ๋ฏธ์ œ๊ณต + Angular ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์šฉ SCSS ๋ณ€ํ™˜ ์ฝœ๋ฐฑ์ด ์ž๋™ ์ƒ์„ฑ๋จ.
42
- - externalStylesheets?: Map<string, string> โ€” ์™ธ๋ถ€ ์Šคํƒ€์ผ์‹œํŠธ ๋งต(ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ์šฉ). `resourceNameToFileName` ์—์„œ ๋น„-ํ…œํ”Œ๋ฆฟ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์‹œ ๊ธฐ๋ฐ˜ `.css` ์™ธ๋ถ€ ID ๋กœ ์น˜ํ™˜ํ•  ๋•Œ ์ฑ„์›Œ์ง.
43
- - compilerOptionsTransformer?: (options) => ts.CompilerOptions โ€” compilerOptions ์ตœ์ข… ํ›„์ฒ˜๋ฆฌ. ๋‚ด๋ถ€ ๊ตฌ์„ฑ ์ดํ›„ ๋งˆ์ง€๋ง‰์— ์ ์šฉ๋˜์–ด target/module/rootDir ๋“ฑ์„ ๊ฐ•์ œ ๊ฐ€๋Šฅ. ํด๋ผ์ด์–ธํŠธยทVitest ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉ.
44
- - lint?: boolean โ€” true ๋ฉด `compileAsync` ๊ฐ€ lint ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ `result.lint` ์— ํฌํ•จ. lint runner ๋Š” lazy init ํ›„ ์ธ์Šคํ„ด์Šค ์žฌ์‚ฌ์šฉ.
45
- - globalScss?: boolean โ€” true ๋ฉด `scss/styles.scss` โ†’ `dist/styles.css` ๊ธ€๋กœ๋ฒŒ SCSS ์ปดํŒŒ์ผ ์ˆ˜ํ–‰. ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ ์‚ฐ์ถœ์ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€์—์„œ.
46
-
47
- ## ISdTsCompilerEmitOptions
86
+ ## ISdTsCompilerResult (compileAsync ๋ฐ˜ํ™˜)
48
87
 
49
- `compileAsync` ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž(emit ์„ธ๋ถ€ ์ œ์–ด, Angular ์ „์šฉ).
50
-
51
- - sourceFilter?: (fileName: string) => boolean โ€” emit ๋Œ€์ƒ ์†Œ์Šค ํ•„ํ„ฐ. ์ง€์ • ์‹œ ํ†ต๊ณผํ•œ ์†Œ์Šค์˜ EmitResult ๋งŒ ๊ฒฐ๊ณผ์— ํฌํ•จ. ์ผ๋ถ€ ํŒŒ์ผ๋งŒ ์žฌemit ํ•  ๋•Œ.
52
- - additionalTransformers?: { before?; after? } โ€” Angular transformers ์™ธ ์ถ”๊ฐ€ TS transformer factory. `before`/`after` ๊ฐ๊ฐ `ts.TransformerFactory<ts.SourceFile>[]`. ์ปดํŒŒ์ผ ํŒŒ์ดํ”„๋ผ์ธ์— ์‚ฌ์šฉ์ž ๋ณ€ํ™˜์„ ๋ผ์šธ ๋•Œ.
53
-
54
- ## ISdTsCompilerResult
55
-
56
- `compileAsync` ๋ฐ˜ํ™˜๊ฐ’.
88
+ ```typescript
89
+ interface ISdTsCompilerResult {
90
+ program: ts.Program;
91
+ builderProgram: ts.EmitAndSemanticDiagnosticsBuilderProgram;
92
+ isForAngular: boolean;
93
+ affectedFiles: ReadonlySet<string> | undefined;
94
+ diagnostics: SerializedDiagnostic[];
95
+ errorCount: number;
96
+ warningCount: number;
97
+ errors?: string[];
98
+ ngtscProgram?: NgtscProgram;
99
+ emitResults?: EmitResult[]; // EmitResult: { filename; contents; sourceFileName }
100
+ lint?: LintWithProgramResult;
101
+ scssErrors: string[];
102
+ scssDependencies: ReadonlyMap<string, ReadonlySet<string>>;
103
+ }
104
+ ```
57
105
 
58
- - program: ts.Program โ€” TypeScript Program ์ฐธ์กฐ. lintยท์™ธ๋ถ€ ๋„๊ตฌ์šฉ.
59
- - builderProgram: ts.EmitAndSemanticDiagnosticsBuilderProgram โ€” Builder Program ์ฐธ์กฐ. ๋‹ค์Œ ์ฆ๋ถ„ ํ˜ธ์ถœ์— ์žฌ์‚ฌ์šฉ๋จ.
60
- - isForAngular: boolean โ€” Angular ํŒจํ‚ค์ง€ ์—ฌ๋ถ€(tsconfig `angularCompilerOptions` ์กด์žฌ๋กœ ํŒ๋ณ„).
61
- - affectedFiles: ReadonlySet<string> | undefined โ€” ์ด๋ฒˆ ๋นŒ๋“œ์—์„œ ์˜ํ–ฅ๋ฐ›์€ ํŒŒ์ผ(posix ๊ฒฝ๋กœ). `undefined` = ์ „์—ญ ๋ณ€๊ฒฝ(์ „์ฒด ๋ฆฌ๋นŒ๋“œ).
62
- - diagnostics: SerializedDiagnostic[] โ€” ์ง๋ ฌํ™”๋œ ์ง„๋‹จ ์ •๋ณด(worker ๊ฒฝ๊ณ„ ํ†ต๊ณผ์šฉ). ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€ ์ง„๋‹จ๋งŒ ๋‚จ๊ธฐ๊ณ  ํ•„ํ„ฐ๋จ.
63
- - errorCount: number โ€” Error ์นดํ…Œ๊ณ ๋ฆฌ ์ง„๋‹จ ์ˆ˜(๋‹จ๊ณ„๋ณ„ ํฌ๋ž˜์‹œ ์ง„๋‹จ ํ•ฉ์‚ฐ).
64
- - warningCount: number โ€” Warning ์นดํ…Œ๊ณ ๋ฆฌ ์ง„๋‹จ ์ˆ˜.
65
- - errors?: string[] โ€” Error ์ง„๋‹จ์„ "ํŒŒ์ผ:์ค„:์—ด: TS์ฝ”๋“œ: ๋ฉ”์‹œ์ง€" ํ˜•์‹์œผ๋กœ ํฌ๋งทํ•œ ๋ฐฐ์—ด. ์—†์œผ๋ฉด undefined.
66
- - ngtscProgram?: NgtscProgram โ€” NgtscProgram ์ฐธ์กฐ(Angular ์ „์šฉ, HMR ์šฉ). ๋น„-Angular ์ด๋ฉด undefined.
67
- - emitResults?: EmitResult[] โ€” Angular emit ๊ฒฐ๊ณผ ๋ฐฐ์—ด(`{ filename, contents, sourceFileName }`). ๋น„-Angular ๋ฉด undefined(writeFile ํ›…์ด ๋””์Šคํฌ์— ์ง์ ‘ ์”€).
68
- - lint?: LintWithProgramResult โ€” lint ๊ฒฐ๊ณผ. `lint` ์˜ต์…˜ ํ™œ์„ฑ ์‹œ์—๋งŒ ์กด์žฌ.
106
+ - program: ts.Program โ€” TS Program ์ฐธ์กฐ. lintยท์™ธ๋ถ€ ๋„๊ตฌ์— ๋„˜๊ธธ ๋•Œ.
107
+ - builderProgram โ€” ์ฆ๋ถ„ BuilderProgram ์ฐธ์กฐ.
108
+ - isForAngular: boolean โ€” Angular ๋ชจ๋“œ๋กœ ์ปดํŒŒ์ผ๋๋Š”์ง€(tsconfig ์˜ `angularCompilerOptions` ์œ ๋ฌด๋กœ ๊ฒฐ์ •). ํ›„์† ์ฒ˜๋ฆฌ ๋ถ„๊ธฐ์— ์“ด๋‹ค.
109
+ - affectedFiles: ReadonlySet<string> | undefined โ€” ์ด๋ฒˆ ๋นŒ๋“œ์—์„œ ์˜ํ–ฅ๋ฐ›์€ ํŒŒ์ผ(posix ๊ฒฝ๋กœ). `undefined` = ์ „์—ญ ๋ณ€๊ฒฝ(์ „์ฒด ๋ฆฌ๋นŒ๋“œ). ๋ถ€๋ถ„ ์žฌ์ฒ˜๋ฆฌ ๋ฒ”์œ„ ํŒ๋‹จ์— ์“ด๋‹ค.
110
+ - diagnostics: SerializedDiagnostic[] โ€” ์ง๋ ฌํ™”๋œ ์ง„๋‹จ ์ „์ฒด(worker ๊ฒฝ๊ณ„ ํ†ต๊ณผ์šฉ). ๋‚ด๋ถ€ ํฌ๋ž˜์‹œ ์ง„๋‹จ๋„ ํ•ฉ์‚ฐ๋จ.
111
+ - errorCount / warningCount: number โ€” Error / Warning ์นดํ…Œ๊ณ ๋ฆฌ ์ง„๋‹จ ์ˆ˜. ํฌ๋ž˜์‹œ๋Š” errorCount ์— ๊ฐ€์‚ฐ.
112
+ - errors?: string[] โ€” Error ์ง„๋‹จ์„ `"ํŒŒ์ผ:์ค„:์—ด: TS์ฝ”๋“œ: ๋ฉ”์‹œ์ง€"` ํ˜•์‹์œผ๋กœ ํฌ๋งทํ•œ ๋ฐฐ์—ด(์—†์œผ๋ฉด undefined). ๋กœ๊ทธ ์ถœ๋ ฅ์— ๋ฐ”๋กœ ์“ด๋‹ค.
113
+ - ngtscProgram?: NgtscProgram โ€” NgtscProgram ์ฐธ์กฐ(Angular only, HMR ์šฉ). non-Angular ์ด๋ฉด undefined.
114
+ - emitResults?: EmitResult[] โ€” Angular emit ๊ฒฐ๊ณผ ๋ฐฐ์—ด. ๊ฐ ํ•ญ๋ชฉ `{ filename; contents; sourceFileName }`(sourceFileName = ์›๋ณธ ์†Œ์Šค ๊ฒฝ๋กœ). non-Angular ์€ writeFile ํ›…์œผ๋กœ ๋””์Šคํฌ์— ์ง์ ‘ ์“ฐ๋ฏ€๋กœ undefined. ๋ฉ”๋ชจ๋ฆฌ์ƒ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์†Œ๋น„.
115
+ - lint?: LintWithProgramResult โ€” lint ๊ฒฐ๊ณผ(`lint: true` ์ผ ๋•Œ๋งŒ).
69
116
  - scssErrors: string[] โ€” SCSS ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ชฉ๋ก.
70
117
  - scssDependencies: ReadonlyMap<string, ReadonlySet<string>> โ€” SCSS ์˜์กด์„ฑ ๋งต(์†Œ์œ ์ž ํŒŒ์ผ โ†’ ์˜์กด SCSS ๊ฒฝ๋กœ ์ง‘ํ•ฉ). watch ์—ญ๋ฐฉํ–ฅ ํƒ์ƒ‰์šฉ.