@simplysm/sd-claude 14.0.50 → 14.0.52

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 (318) hide show
  1. package/claude/references/sd-frontend-design.md +10 -9
  2. package/claude/references/sd-simplysm-v14/angular/README.md +497 -0
  3. package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +37 -0
  4. package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +16 -0
  5. package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +27 -0
  6. package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +25 -0
  7. package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +36 -0
  8. package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +24 -0
  9. package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +42 -0
  10. package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +23 -0
  11. package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +38 -0
  12. package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +18 -0
  13. package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +69 -0
  14. package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +50 -0
  15. package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +20 -0
  16. package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +158 -0
  17. package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +26 -0
  18. package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +41 -0
  19. package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +23 -0
  20. package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +34 -0
  21. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +65 -0
  22. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +148 -0
  23. package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +73 -0
  24. package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +59 -0
  25. package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +34 -0
  26. package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +81 -0
  27. package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +18 -0
  28. package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +40 -0
  29. package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +20 -0
  30. package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +67 -0
  31. package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +18 -0
  32. package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +25 -0
  33. package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +43 -0
  34. package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +64 -0
  35. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +46 -0
  36. package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +18 -0
  37. package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +38 -0
  38. package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +65 -0
  39. package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +336 -0
  40. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +191 -0
  41. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +103 -0
  42. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +198 -0
  43. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +109 -0
  44. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +87 -0
  45. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +202 -0
  46. package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +280 -0
  47. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +386 -0
  48. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +215 -0
  49. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +64 -0
  50. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +193 -0
  51. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +140 -0
  52. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +123 -0
  53. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +145 -0
  54. package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +377 -0
  55. package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +368 -0
  56. package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +238 -0
  57. package/claude/references/sd-simplysm-v14/angular/styling/classes.md +149 -0
  58. package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +100 -0
  59. package/claude/references/sd-simplysm-v14/angular/styling/themes.md +35 -0
  60. package/claude/references/sd-simplysm-v14/angular/styling/variables.md +147 -0
  61. package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +232 -0
  62. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +37 -0
  63. package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +212 -0
  64. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +26 -0
  65. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +31 -0
  66. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +103 -0
  67. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +39 -0
  68. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +81 -0
  69. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +27 -0
  70. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +89 -0
  71. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +54 -0
  72. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +26 -0
  73. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +26 -0
  74. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +68 -0
  75. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +52 -0
  76. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +37 -0
  77. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +27 -0
  78. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +33 -0
  79. package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +145 -0
  80. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +64 -0
  81. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +37 -0
  82. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +26 -0
  83. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +96 -0
  84. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +34 -0
  85. package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +29 -0
  86. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +35 -0
  87. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +26 -0
  88. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +49 -0
  89. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +22 -0
  90. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +43 -0
  91. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +51 -0
  92. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +97 -0
  93. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +23 -0
  94. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +38 -0
  95. package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +30 -0
  96. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +69 -0
  97. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +30 -0
  98. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +40 -0
  99. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +34 -0
  100. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +30 -0
  101. package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +35 -0
  102. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +36 -0
  103. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +34 -0
  104. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +32 -0
  105. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +24 -0
  106. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +23 -0
  107. package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +23 -0
  108. package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +161 -0
  109. package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +35 -0
  110. package/claude/references/sd-simplysm-v14/angular/utils/mark.md +43 -0
  111. package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +96 -0
  112. package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +19 -0
  113. package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +93 -0
  114. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +38 -0
  115. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +115 -0
  116. package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +113 -0
  117. package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +197 -0
  118. package/claude/references/sd-simplysm-v14/capacitor-plugin-intent/README.md +235 -0
  119. package/claude/references/sd-simplysm-v14/capacitor-plugin-usb-storage/README.md +251 -0
  120. package/claude/references/sd-simplysm-v14/core-browser/README.md +52 -0
  121. package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +59 -0
  122. package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +137 -0
  123. package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +84 -0
  124. package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +59 -0
  125. package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +91 -0
  126. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +131 -0
  127. package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +121 -0
  128. package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +60 -0
  129. package/claude/references/sd-simplysm-v14/core-common/README.md +179 -0
  130. package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +26 -0
  131. package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +33 -0
  132. package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +38 -0
  133. package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +36 -0
  134. package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +125 -0
  135. package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +43 -0
  136. package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +35 -0
  137. package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +48 -0
  138. package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +52 -0
  139. package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +44 -0
  140. package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +100 -0
  141. package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +42 -0
  142. package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +86 -0
  143. package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +106 -0
  144. package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +59 -0
  145. package/claude/references/sd-simplysm-v14/core-common/types/time.md +62 -0
  146. package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +41 -0
  147. package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +36 -0
  148. package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +60 -0
  149. package/claude/references/sd-simplysm-v14/core-common/utils/err.md +26 -0
  150. package/claude/references/sd-simplysm-v14/core-common/utils/json.md +58 -0
  151. package/claude/references/sd-simplysm-v14/core-common/utils/num.md +56 -0
  152. package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +107 -0
  153. package/claude/references/sd-simplysm-v14/core-common/utils/path.md +30 -0
  154. package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +28 -0
  155. package/claude/references/sd-simplysm-v14/core-common/utils/str.md +63 -0
  156. package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +49 -0
  157. package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +35 -0
  158. package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +35 -0
  159. package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +49 -0
  160. package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +77 -0
  161. package/claude/references/sd-simplysm-v14/core-node/README.md +59 -0
  162. package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +110 -0
  163. package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +78 -0
  164. package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +38 -0
  165. package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +77 -0
  166. package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +128 -0
  167. package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +168 -0
  168. package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +73 -0
  169. package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +85 -0
  170. package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +160 -0
  171. package/claude/references/sd-simplysm-v14/excel/README.md +66 -0
  172. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +79 -0
  173. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +36 -0
  174. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +34 -0
  175. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +93 -0
  176. package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +147 -0
  177. package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +33 -0
  178. package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +57 -0
  179. package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +28 -0
  180. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +23 -0
  181. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +29 -0
  182. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +39 -0
  183. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +42 -0
  184. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +97 -0
  185. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +22 -0
  186. package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +68 -0
  187. package/claude/references/sd-simplysm-v14/excel/types/excel-xml.md +15 -0
  188. package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +101 -0
  189. package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +108 -0
  190. package/claude/references/sd-simplysm-v14/lint/README.md +183 -0
  191. package/claude/references/sd-simplysm-v14/orm-common/README.md +156 -0
  192. package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +208 -0
  193. package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +64 -0
  194. package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +62 -0
  195. package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +198 -0
  196. package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +37 -0
  197. package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +80 -0
  198. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +54 -0
  199. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +75 -0
  200. package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +238 -0
  201. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +63 -0
  202. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +137 -0
  203. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +54 -0
  204. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +67 -0
  205. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +95 -0
  206. package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +71 -0
  207. package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +146 -0
  208. package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +151 -0
  209. package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +175 -0
  210. package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +58 -0
  211. package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +224 -0
  212. package/claude/references/sd-simplysm-v14/orm-node/README.md +65 -0
  213. package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +85 -0
  214. package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +83 -0
  215. package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +86 -0
  216. package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +62 -0
  217. package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +107 -0
  218. package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +50 -0
  219. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +91 -0
  220. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +33 -0
  221. package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +60 -0
  222. package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +17 -0
  223. package/{README.md → claude/references/sd-simplysm-v14/sd-claude/README.md} +85 -84
  224. package/{docs → claude/references/sd-simplysm-v14/sd-claude}/assets.md +2 -2
  225. package/{docs → claude/references/sd-simplysm-v14/sd-claude}/hooks.md +15 -1
  226. package/claude/references/sd-simplysm-v14/sd-cli/README.md +138 -0
  227. package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +60 -0
  228. package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +31 -0
  229. package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +27 -0
  230. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +19 -0
  231. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +21 -0
  232. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +109 -0
  233. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +33 -0
  234. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +78 -0
  235. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +27 -0
  236. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +18 -0
  237. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +19 -0
  238. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +72 -0
  239. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +41 -0
  240. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +19 -0
  241. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +32 -0
  242. package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +19 -0
  243. package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +158 -0
  244. package/claude/references/sd-simplysm-v14/service-client/README.md +74 -0
  245. package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +93 -0
  246. package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +63 -0
  247. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +89 -0
  248. package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +31 -0
  249. package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +206 -0
  250. package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +64 -0
  251. package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +68 -0
  252. package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +100 -0
  253. package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +7 -0
  254. package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +47 -0
  255. package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +21 -0
  256. package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +22 -0
  257. package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +39 -0
  258. package/claude/references/sd-simplysm-v14/service-common/README.md +161 -0
  259. package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +107 -0
  260. package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +57 -0
  261. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +23 -0
  262. package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +42 -0
  263. package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +68 -0
  264. package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +93 -0
  265. package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +21 -0
  266. package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +23 -0
  267. package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +17 -0
  268. package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +21 -0
  269. package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +29 -0
  270. package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +21 -0
  271. package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +19 -0
  272. package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +52 -0
  273. package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +21 -0
  274. package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +19 -0
  275. package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +17 -0
  276. package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +17 -0
  277. package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +15 -0
  278. package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +20 -0
  279. package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +61 -0
  280. package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +19 -0
  281. package/claude/references/sd-simplysm-v14/service-server/README.md +162 -0
  282. package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +18 -0
  283. package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +30 -0
  284. package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +35 -0
  285. package/claude/references/sd-simplysm-v14/service-server/core/auth.md +64 -0
  286. package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +81 -0
  287. package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +43 -0
  288. package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +79 -0
  289. package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +25 -0
  290. package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +32 -0
  291. package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +113 -0
  292. package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +35 -0
  293. package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +59 -0
  294. package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +34 -0
  295. package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +43 -0
  296. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +33 -0
  297. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +29 -0
  298. package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +33 -0
  299. package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +64 -0
  300. package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +57 -0
  301. package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +36 -0
  302. package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +29 -0
  303. package/claude/references/sd-simplysm-v14/storage/README.md +99 -0
  304. package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +99 -0
  305. package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +108 -0
  306. package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +114 -0
  307. package/claude/references/sd-simplysm-v14/storage/types/file-info.md +32 -0
  308. package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +55 -0
  309. package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +34 -0
  310. package/claude/rules/sd-claude-rules.md +8 -8
  311. package/claude/rules/sd-simplysm-v14.md +33 -0
  312. package/claude/skills/sd-claude-docs/SKILL.md +41 -24
  313. package/claude/skills/sd-claude-docs/references/package-docs.md +240 -116
  314. package/claude/skills/sd-inner-debug/SKILL.md +1 -1
  315. package/claude/skills/sd-inner-review/SKILL.md +4 -2
  316. package/package.json +2 -3
  317. /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/cli.md +0 -0
  318. /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/scripts.md +0 -0
@@ -0,0 +1,179 @@
1
+ # @simplysm/core-common
2
+
3
+ 브라우저와 Node.js 모두에서 사용 가능한 순수 공통 유틸리티 패키지. 다른 `@simplysm/*` 패키지에 대한 내부 의존성이 없는 리프 패키지다.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @simplysm/core-common
9
+ ```
10
+
11
+ ## 하려는 작업 → 먼저 읽을 파일
12
+
13
+ | 작업 | 먼저 읽을 파일 |
14
+ |------|----------------|
15
+ | 날짜/시간 연산 | [DateTime](./types/date-time.md), [DateOnly](./types/date-only.md), [Time](./types/time.md) |
16
+ | 배열 필터/정렬/그룹화/비교 | [Array Extensions](./extensions/array.md) |
17
+ | 객체 복사/비교/병합 | [obj](./utils/obj.md) |
18
+ | JSON 직렬화 (커스텀 타입 포함) | [json](./utils/json.md) |
19
+ | 에러 체인 구성 | [SdError](./errors/sd-error.md) |
20
+ | 이벤트 기반 통신 | [EventEmitter](./features/event-emitter.md) |
21
+ | 비동기 제어 (디바운스/직렬) | [DebounceQueue](./features/debounce-queue.md), [SerialQueue](./features/serial-queue.md) |
22
+ | UUID 생성 | [Uuid](./types/uuid.md) |
23
+ | 환경변수 접근 | [env](./type-utils/env.md) |
24
+ | Worker 간 데이터 전송 | [transfer](./utils/transfer.md) |
25
+ | ZIP 파일 처리 | [ZipArchive](./utils/zip-archive.md) |
26
+ | 바이너리 변환 (hex/base64) | [bytes](./utils/bytes.md) |
27
+ | 문자열 케이스 변환/한국어 조사 | [str](./utils/str.md) |
28
+ | 자동 만료 캐시 | [LazyGcMap](./types/lazy-gc-map.md) |
29
+
30
+ ## API Overview
31
+
32
+ ### Errors
33
+
34
+ | Entry | Kind | 언제 쓰나 |
35
+ |-------|------|-----------|
36
+ | [`SdError`](./errors/sd-error.md) | class | 원인 에러를 감싸 트리 구조 에러 체인을 구성할 때 |
37
+ | [`ArgumentError`](./errors/argument-error.md) | class | 인자 유효성 오류를 YAML 형식 메시지로 표시할 때 |
38
+ | [`NotImplementedError`](./errors/not-implemented-error.md) | class | 미구현 기능이 호출되었음을 표시할 때 |
39
+ | [`TimeoutError`](./errors/timeout-error.md) | class | 대기 시간 초과를 시도 횟수와 함께 표시할 때 |
40
+
41
+ ### Types (Value Objects)
42
+
43
+ | Entry | Kind | 언제 쓰나 |
44
+ |-------|------|-----------|
45
+ | [`DateTime`](./types/date-time.md) | class | 날짜+시간을 불변 객체로 다룰 때 (밀리초 정밀도, 로컬 타임존) |
46
+ | [`DateOnly`](./types/date-only.md) | class | 시간 없이 날짜만 다룰 때 (주차 계산 지원) |
47
+ | [`Time`](./types/time.md) | class | 날짜 없이 시간만 다룰 때 (24시간 순환) |
48
+ | [`Uuid`](./types/uuid.md) | class | UUID v4를 생성하거나 검증할 때 |
49
+ | [`LazyGcMap`](./types/lazy-gc-map.md) | class | 일정 시간 미접근 항목을 자동 삭제하는 캐시가 필요할 때 |
50
+
51
+ ### Features
52
+
53
+ | Entry | Kind | 언제 쓰나 |
54
+ |-------|------|-----------|
55
+ | [`EventEmitter`](./features/event-emitter.md) | class | 타입 안전한 이벤트 기반 통신이 필요할 때 (`events`/`eventemitter3` 대체) |
56
+ | [`DebounceQueue`](./features/debounce-queue.md) | class | 짧은 시간 내 다수 호출을 마지막 하나로 축약할 때 |
57
+ | [`SerialQueue`](./features/serial-queue.md) | class | 비동기 작업의 순차 실행을 보장할 때 |
58
+
59
+ ### Extensions (Prototype)
60
+
61
+ `@simplysm/core-common`을 import하면 `Array`, `Map`, `Set` 프로토타입 확장이 자동 등록된다.
62
+
63
+ | Entry | 언제 쓰나 |
64
+ |-------|-----------|
65
+ | [`Array Extensions`](./extensions/array.md) | 배열 필터/정렬/그룹화/비교/변환이 필요할 때 |
66
+ | [`Map Extensions`](./extensions/map.md) | Map에서 기본값 생성(`getOrCreate`) 또는 값 업데이트(`update`)가 필요할 때 |
67
+ | [`Set Extensions`](./extensions/set.md) | Set에 여러 값 일괄 추가(`adds`) 또는 토글(`toggle`)이 필요할 때 |
68
+
69
+ ### Utils (Namespace Imports)
70
+
71
+ ```typescript
72
+ import { obj, str, num, bytes, path, json, xml, wait, transfer, err, dt, primitive } from "@simplysm/core-common";
73
+ ```
74
+
75
+ | Entry | Kind | 언제 쓰나 |
76
+ |-------|------|-----------|
77
+ | [`obj`](./utils/obj.md) | namespace | 객체 깊은 복사/비교/병합, key 조작, 체인 경로 접근이 필요할 때 |
78
+ | [`str`](./utils/str.md) | namespace | 한국어 조사 처리, 케이스 변환, 전각→반각 변환이 필요할 때 |
79
+ | [`num`](./utils/num.md) | namespace | 문자열→숫자 파싱, 숫자 포맷이 필요할 때 |
80
+ | [`bytes`](./utils/bytes.md) | namespace | Uint8Array ↔ hex/base64 변환, 결합이 필요할 때 |
81
+ | [`path`](./utils/path.md) | namespace | POSIX 경로 결합/파일명 추출이 필요할 때 (브라우저 환경용) |
82
+ | [`json`](./utils/json.md) | namespace | DateTime/Uuid 등 커스텀 타입을 포함한 JSON 직렬화/역직렬화가 필요할 때 |
83
+ | [`xml`](./utils/xml.md) | namespace | XML 파싱/직렬화가 필요할 때 |
84
+ | [`wait`](./utils/wait.md) | namespace | 조건 대기(`until`) 또는 시간 대기(`time`)가 필요할 때 |
85
+ | [`transfer`](./utils/transfer.md) | namespace | Worker 간 커스텀 타입 데이터 전송이 필요할 때 |
86
+ | [`err`](./utils/err.md) | namespace | catch 블록의 unknown 에러에서 메시지를 추출할 때 |
87
+ | [`dt`](./utils/dt.md) | namespace | 날짜/시간 포맷 문자열 변환, 월 정규화가 필요할 때 |
88
+ | [`primitive`](./utils/primitive.md) | namespace | 런타임에 값의 PrimitiveTypeStr을 추론할 때 |
89
+
90
+ ### Utils (Direct Exports)
91
+
92
+ | Entry | Kind | 언제 쓰나 |
93
+ |-------|------|-----------|
94
+ | [`js`, `ts`, `html`, `tsql`, `mysql`, `pgsql`](./utils/template-strings.md) | function | IDE 코드 하이라이팅이 필요한 태그드 템플릿 리터럴을 작성할 때 |
95
+ | [`ZipArchive`](./utils/zip-archive.md) | class | ZIP 파일 읽기/쓰기/압축/해제가 필요할 때 |
96
+
97
+ ### Type Utilities
98
+
99
+ | Entry | Kind | 언제 쓰나 |
100
+ |-------|------|-----------|
101
+ | [`env`, `parseBoolEnv`](./type-utils/env.md) | function | 환경변수를 읽거나 쓸 때 (`process.env`/`import.meta.env` 직접 접근 대신) |
102
+ | [`Bytes`, `PrimitiveTypeMap`, `PrimitiveTypeStr`, `PrimitiveType`, `DeepPartial`, `Type`](./type-utils/common-types.md) | type/interface | 공용 타입 정의가 필요할 때 |
103
+
104
+ ## Usage Examples
105
+
106
+ ### 프로토타입 확장 사용
107
+
108
+ ```typescript
109
+ import "@simplysm/core-common";
110
+
111
+ const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
112
+ const user = users.single((u) => u.id === 1);
113
+ const grouped = users.groupBy((u) => u.name[0]);
114
+ const sorted = users.orderBy((u) => u.name);
115
+ const diffs = newUsers.diffs(oldUsers, { keys: ["id"] });
116
+
117
+ const cache = new Map<string, number[]>();
118
+ const arr = cache.getOrCreate("key", []);
119
+
120
+ const set = new Set<string>();
121
+ set.adds("a", "b", "c");
122
+ ```
123
+
124
+ ### 에러 체인 처리
125
+
126
+ ```typescript
127
+ import { SdError } from "@simplysm/core-common";
128
+
129
+ try {
130
+ await fetch(url);
131
+ } catch (err) {
132
+ throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
133
+ // message: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
134
+ }
135
+ ```
136
+
137
+ ### 네임스페이스 유틸리티 사용
138
+
139
+ ```typescript
140
+ import { obj, str, json, DateTime, Uuid } from "@simplysm/core-common";
141
+
142
+ const copied = obj.clone({ nested: { data: [1, 2, 3] } });
143
+ const isEqual = obj.equal(a, b, { topLevelExcludes: ["updatedAt"] });
144
+ const noId = obj.omit(user, ["id"]);
145
+
146
+ const suffix = str.getKoreanSuffix("파일", "을"); // "을"
147
+ const camel = str.toCamelCase("HelloWorld"); // "helloWorld"
148
+
149
+ const serialized = json.stringify({ date: new DateTime(), id: Uuid.generate() });
150
+ const restored = json.parse(serialized); // DateTime, Uuid 타입 복원됨
151
+ ```
152
+
153
+ ### 비동기 큐 사용
154
+
155
+ ```typescript
156
+ import { DebounceQueue, SerialQueue } from "@simplysm/core-common";
157
+
158
+ const dq = new DebounceQueue(300);
159
+ dq.on("error", (err) => console.error(err));
160
+ dq.run(() => saveData());
161
+
162
+ const sq = new SerialQueue();
163
+ sq.run(async () => await step1());
164
+ sq.run(async () => await step2()); // step1 완료 후 실행
165
+ ```
166
+
167
+ ### DateTime 사용
168
+
169
+ ```typescript
170
+ import { DateTime, DateOnly, Time, Uuid } from "@simplysm/core-common";
171
+
172
+ const now = new DateTime();
173
+ const parsed = DateTime.parse("2025-01-15 10:30:00");
174
+ const formatted = now.toFormatString("yyyy-MM-dd HH:mm:ss");
175
+ const nextMonth = now.addMonths(1);
176
+
177
+ const today = new DateOnly();
178
+ const id = Uuid.generate();
179
+ ```
@@ -0,0 +1,26 @@
1
+ # ArgumentError
2
+
3
+ 인자 유효성 오류. 유효하지 않은 인자를 전달받았을 때 발생하는 에러. 디버깅을 용이하게 하기 위해 인자 객체를 YAML 형식으로 메시지에 포함한다. [`SdError`](./sd-error.md)를 상속한다.
4
+
5
+ ```typescript
6
+ export class ArgumentError extends SdError {
7
+ /** 기본 메시지("잘못된 인자입니다.")와 함께 인자 객체를 YAML 형식으로 출력 */
8
+ constructor(argObj: Record<string, unknown>);
9
+ /** 커스텀 메시지와 함께 인자 객체를 YAML 형식으로 출력 */
10
+ constructor(message: string, argObj: Record<string, unknown>);
11
+ }
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```typescript
17
+ import { ArgumentError } from "@simplysm/core-common";
18
+
19
+ // 인자 객체만 전달
20
+ throw new ArgumentError({ userId: 123, name: null });
21
+ // message: "잘못된 인자입니다.\n\nuserId: 123\nname: null"
22
+
23
+ // 커스텀 메시지와 인자 객체를 전달
24
+ throw new ArgumentError("잘못된 사용자", { userId: 123 });
25
+ // message: "잘못된 사용자\n\nuserId: 123"
26
+ ```
@@ -0,0 +1,33 @@
1
+ # NotImplementedError
2
+
3
+ 미구현 오류. 아직 구현되지 않은 기능이 호출되었을 때 발생하는 에러. 추상 메서드 스텁, 향후 구현 예정인 분기 등에 사용된다. [`SdError`](./sd-error.md)를 상속한다.
4
+
5
+ ```typescript
6
+ export class NotImplementedError extends SdError {
7
+ /**
8
+ * @param message 추가 설명 메시지
9
+ */
10
+ constructor(message?: string);
11
+ }
12
+ ```
13
+
14
+ 메시지 형식: `"미구현"` 또는 `"미구현: {message}"`
15
+
16
+ ## Usage
17
+
18
+ ```typescript
19
+ import { NotImplementedError } from "@simplysm/core-common";
20
+
21
+ // 추상 메서드 구현 전
22
+ class BaseService {
23
+ process(): void {
24
+ throw new NotImplementedError("서브클래스에서 구현 필요");
25
+ }
26
+ }
27
+
28
+ // 향후 구현 예정인 분기
29
+ switch (type) {
30
+ case "A": return handleA();
31
+ case "B": throw new NotImplementedError(`타입 ${type} 처리`);
32
+ }
33
+ ```
@@ -0,0 +1,38 @@
1
+ # SdError
2
+
3
+ 트리 구조 조합을 지원하는 에러 클래스. 원인 에러를 감싸서 계층적 메시지를 구성한다. ES2024 `cause` 속성을 활용하며 V8 엔진(Node.js, Chrome)에서는 `captureStackTrace`를 통해 스택 추적을 최적화한다.
4
+
5
+ ```typescript
6
+ export class SdError extends Error {
7
+ override cause?: Error;
8
+
9
+ /** 원인 에러를 감싸서 생성. 메시지는 역순으로 결합됨 (상위 메시지 => 하위 메시지 => 원인 메시지) */
10
+ constructor(cause: Error, ...messages: string[]);
11
+ /** 메시지만으로 생성. 메시지는 역순으로 결합됨 (상위 메시지 => 하위 메시지) */
12
+ constructor(...messages: string[]);
13
+ }
14
+ ```
15
+
16
+ ## Members
17
+
18
+ | Member | Kind | Type | Description |
19
+ |--------|------|------|-------------|
20
+ | `cause` | property | `Error \| undefined` | 원인 에러 (override) |
21
+
22
+ ## Usage
23
+
24
+ ```typescript
25
+ import { SdError } from "@simplysm/core-common";
26
+
27
+ // 원인 에러를 감싸기
28
+ try {
29
+ await fetch(url);
30
+ } catch (err) {
31
+ throw new SdError(err, "API 호출 실패", "사용자 로드 실패");
32
+ // message: "사용자 로드 실패 => API 호출 실패 => 원본 에러 메시지"
33
+ }
34
+
35
+ // 메시지만으로 생성
36
+ throw new SdError("잘못된 상태", "처리 불가");
37
+ // message: "처리 불가 => 잘못된 상태"
38
+ ```
@@ -0,0 +1,36 @@
1
+ # TimeoutError
2
+
3
+ 타임아웃 오류. 대기 시간이 초과되었을 때 발생하는 에러. [`wait.until()`](../utils/wait.md) 같은 비동기 대기 함수에서 최대 시도 횟수를 초과하면 자동으로 발생한다. [`SdError`](./sd-error.md)를 상속한다.
4
+
5
+ ```typescript
6
+ export class TimeoutError extends SdError {
7
+ /**
8
+ * @param count 시도 횟수
9
+ * @param message 추가 메시지
10
+ */
11
+ constructor(count?: number, message?: string);
12
+ }
13
+ ```
14
+
15
+ 메시지 형식: `"대기 시간 초과"`, `"대기 시간 초과(N회 시도)"`, `"대기 시간 초과: {message}"`, `"대기 시간 초과(N회 시도): {message}"`
16
+
17
+ ## Usage
18
+
19
+ ```typescript
20
+ import { TimeoutError } from "@simplysm/core-common";
21
+ import { wait } from "@simplysm/core-common";
22
+
23
+ // wait.until에서 자동 발생
24
+ try {
25
+ await wait.until(() => isReady, 100, 50); // 100ms 간격, 최대 50회 시도
26
+ } catch (err) {
27
+ if (err instanceof TimeoutError) {
28
+ console.log("타임아웃 초과");
29
+ }
30
+ }
31
+
32
+ // 직접 발생
33
+ if (elapsed > maxTime) {
34
+ throw new TimeoutError(undefined, "API 응답 대기 초과");
35
+ }
36
+ ```
@@ -0,0 +1,125 @@
1
+ # Array Extensions
2
+
3
+ `@simplysm/core-common`을 import하면 `Array.prototype`에 확장 메서드가 자동 등록된다. `ReadonlyArray<T>`와 `Array<T>` 모두에 적용된다.
4
+
5
+ side-effect import로 활성화:
6
+
7
+ ```typescript
8
+ import "@simplysm/core-common";
9
+ ```
10
+
11
+ ## 불변(Immutable) 메서드
12
+
13
+ 원본 배열을 변경하지 않고 새 배열 또는 값을 반환한다.
14
+
15
+ | Method | Signature | Description |
16
+ |--------|-----------|-------------|
17
+ | `single` | `(predicate?) => T \| undefined` | 조건에 맞는 단일 요소 반환. 2개 이상이면 `ArgumentError` 발생 |
18
+ | `first` | `(predicate?) => T \| undefined` | 첫 번째 요소 반환 |
19
+ | `last` | `(predicate?) => T \| undefined` | 마지막 요소 반환 |
20
+ | `filterExists` | `() => NonNullable<T>[]` | null/undefined 제거 |
21
+ | `ofType` | `(type: PrimitiveTypeStr \| Type<N>) => N[]` | 특정 타입의 요소만 필터 |
22
+ | `filterAsync` | `(predicate) => Promise<T[]>` | 비동기 필터 (순차 실행) |
23
+ | `mapAsync` | `(selector) => Promise<R[]>` | 비동기 매핑 (순차 실행) |
24
+ | `mapMany` | `(selector?) => R[]` | 매핑 후 평탄화 (또는 중첩 배열 평탄화) |
25
+ | `mapManyAsync` | `(selector?) => Promise<R[]>` | 비동기 매핑 후 평탄화 (순차 실행) |
26
+ | `parallelAsync` | `(fn) => Promise<R[]>` | 비동기 병렬 처리 (`Promise.all` 사용). 하나라도 reject되면 전체 reject |
27
+ | `groupBy` | `(keySelector, valueSelector?) => { key, values }[]` | key 기준 그룹화. 객체 key 지원을 위해 O(n²) 복잡도. 원시 key는 O(n) |
28
+ | `toMap` | `(keySelector, valueSelector?) => Map<K, V>` | Map으로 변환. 중복 key이면 `ArgumentError` 발생 |
29
+ | `toMapAsync` | `(keySelector, valueSelector?) => Promise<Map<K, V>>` | 비동기 Map 변환 |
30
+ | `toArrayMap` | `(keySelector, valueSelector?) => Map<K, V[]>` | 배열 값 Map으로 변환 (O(n)) |
31
+ | `toSetMap` | `(keySelector, valueSelector?) => Map<K, Set<V>>` | Set 값 Map으로 변환 |
32
+ | `toMapValues` | `(keySelector, valueSelector) => Map<K, V>` | 그룹별 집계 Map으로 변환 |
33
+ | `toObject` | `(keySelector, valueSelector?) => Record<string, V>` | 객체로 변환. 중복 key이면 `ArgumentError` 발생 |
34
+ | `toTree` | `(keyProp, parentKey) => TreeArray<T>[]` | 평면 배열을 트리 구조로 변환 (O(n)). `parentKey`가 null/undefined인 항목이 루트 |
35
+ | `distinct` | `(options?) => T[]` | 중복 제거. 객체 배열에서 keyFn 없이 사용하면 O(n²) |
36
+ | `orderBy` | `(selector?) => T[]` | 오름차순 정렬 (새 배열 반환) |
37
+ | `orderByDesc` | `(selector?) => T[]` | 내림차순 정렬 (새 배열 반환) |
38
+ | `diffs` | `(target, options?) => ArrayDiffsResult<T, P>[]` | 두 배열 비교 (INSERT/DELETE/UPDATE) |
39
+ | `oneWayDiffs` | `(orgItems, keyPropNameOrGetValFn, options?) => ArrayOneWayDiffResult<T>[]` | 단방향 비교 (create/update/same) |
40
+ | `merge` | `(target, options?) => (T \| P \| T & P)[]` | 두 배열 병합 (`diffs` 기반) |
41
+ | `sum` | `(selector?) => number` | 합계. 빈 배열이면 0 반환 |
42
+ | `min` | `(selector?) => T \| undefined` | 최솟값 |
43
+ | `max` | `(selector?) => T \| undefined` | 최댓값 |
44
+ | `shuffle` | `() => T[]` | 무작위 순서로 섞은 새 배열 반환 |
45
+
46
+ ## 가변(Mutable) 메서드
47
+
48
+ 원본 배열을 직접 수정하고 `this`를 반환한다.
49
+
50
+ | Method | Signature | Description |
51
+ |--------|-----------|-------------|
52
+ | `remove` | `(item: T) => this` | 항목 제거 |
53
+ | `remove` | `(selector: (item, index) => boolean) => this` | 조건에 맞는 항목 제거 |
54
+ | `insert` | `(index: number, ...items: T[]) => this` | 특정 위치에 항목 삽입 |
55
+ | `toggle` | `(item: T) => this` | 항목 토글 (있으면 제거, 없으면 추가) |
56
+ | `clear` | `() => this` | 배열 비우기 |
57
+ | `distinctThis` | `(options?) => T[]` | 원본 배열에서 중복 제거 |
58
+ | `orderByThis` | `(selector?) => T[]` | 원본 배열 오름차순 정렬 |
59
+ | `orderByDescThis` | `(selector?) => T[]` | 원본 배열 내림차순 정렬 |
60
+
61
+ ## Related Types
62
+
63
+ ### `ArrayDiffsResult<TOriginal, TOther>`
64
+
65
+ `diffs()` 결과 타입. Discriminated union:
66
+
67
+ ```typescript
68
+ export type ArrayDiffsResult<TOriginal, TOther> =
69
+ | { source: undefined; target: TOther } // INSERT (target에만 있음)
70
+ | { source: TOriginal; target: undefined } // DELETE (source에만 있음)
71
+ | { source: TOriginal; target: TOther }; // UPDATE (양쪽에 있고 다름)
72
+ ```
73
+
74
+ ### `ArrayOneWayDiffResult<TItem>`
75
+
76
+ `oneWayDiffs()` 결과 타입. Discriminated union (`type` 필드로 분기):
77
+
78
+ ```typescript
79
+ export type ArrayOneWayDiffResult<TItem> =
80
+ | { type: "create"; item: TItem; orgItem: undefined }
81
+ | { type: "update"; item: TItem; orgItem: TItem }
82
+ | { type: "same"; item: TItem; orgItem: TItem };
83
+ ```
84
+
85
+ ### `TreeArray<TNode>`
86
+
87
+ `toTree()` 결과 타입. 원본 타입에 `children` 속성이 추가된다:
88
+
89
+ ```typescript
90
+ export type TreeArray<TNode> = TNode & { children: TreeArray<TNode>[] };
91
+ ```
92
+
93
+ ### `ComparableType`
94
+
95
+ `orderBy`/`orderByDesc` selector의 반환 타입:
96
+
97
+ ```typescript
98
+ export type ComparableType = string | number | boolean | DateTime | DateOnly | Time | undefined;
99
+ ```
100
+
101
+ ## Usage
102
+
103
+ ```typescript
104
+ import "@simplysm/core-common";
105
+
106
+ const users = [{ id: 1, name: "Alice" }, { id: 2, name: "Bob" }];
107
+
108
+ // 불변 메서드
109
+ const alice = users.single((u) => u.id === 1);
110
+ const sorted = users.orderBy((u) => u.name);
111
+ const grouped = users.groupBy((u) => u.name[0]);
112
+ const diffs = newUsers.diffs(oldUsers, { keys: ["id"] });
113
+
114
+ // toTree
115
+ const items = [
116
+ { id: 1, parentId: undefined, name: "root" },
117
+ { id: 2, parentId: 1, name: "child" },
118
+ ];
119
+ const tree = items.toTree("id", "parentId");
120
+
121
+ // 가변 메서드
122
+ const list = [1, 2, 3, 4, 5];
123
+ list.remove((x) => x % 2 === 0); // [1, 3, 5]
124
+ list.insert(1, 10); // [1, 10, 3, 5]
125
+ ```
@@ -0,0 +1,43 @@
1
+ # Map Extensions
2
+
3
+ `@simplysm/core-common`을 import하면 `Map.prototype`에 확장 메서드가 자동 등록된다.
4
+
5
+ side-effect import로 활성화:
6
+
7
+ ```typescript
8
+ import "@simplysm/core-common";
9
+ ```
10
+
11
+ ## Methods
12
+
13
+ | Method | Signature | Description |
14
+ |--------|-----------|-------------|
15
+ | `getOrCreate` | `(key: K, newValue: V) => V` | key가 없으면 값을 설정하고 반환 |
16
+ | `getOrCreate` | `(key: K, newValueFn: () => V) => V` | key가 없으면 팩토리 함수를 호출하여 값을 설정하고 반환 |
17
+ | `update` | `(key: K, updateFn: (v: V \| undefined) => V) => void` | 현재 값을 받아 새 값으로 업데이트. key가 없으면 `undefined`가 전달됨 |
18
+
19
+ ## Usage
20
+
21
+ ```typescript
22
+ import "@simplysm/core-common";
23
+
24
+ // getOrCreate — 값으로
25
+ const map = new Map<string, number[]>();
26
+ const arr = map.getOrCreate("key", []); // 없으면 [] 설정 후 반환
27
+
28
+ // getOrCreate — 팩토리로 (비용이 큰 연산에 사용)
29
+ const val = map.getOrCreate("key", () => expensiveComputation());
30
+
31
+ // 함수를 값으로 저장 시 팩토리로 감싸야 함
32
+ const fnMap = new Map<string, () => void>();
33
+ const myFn = () => console.log("hello");
34
+ fnMap.getOrCreate("key", () => myFn); // 팩토리로 감싸기
35
+
36
+ // update — 카운터
37
+ const countMap = new Map<string, number>();
38
+ countMap.update("key", (v) => (v ?? 0) + 1);
39
+
40
+ // update — 배열에 추가
41
+ const arrayMap = new Map<string, string[]>();
42
+ arrayMap.update("key", (v) => [...(v ?? []), "item"]);
43
+ ```
@@ -0,0 +1,35 @@
1
+ # Set Extensions
2
+
3
+ `@simplysm/core-common`을 import하면 `Set.prototype`에 확장 메서드가 자동 등록된다.
4
+
5
+ side-effect import로 활성화:
6
+
7
+ ```typescript
8
+ import "@simplysm/core-common";
9
+ ```
10
+
11
+ ## Methods
12
+
13
+ | Method | Signature | Description |
14
+ |--------|-----------|-------------|
15
+ | `adds` | `(...values: T[]) => this` | 여러 값을 한 번에 추가 |
16
+ | `toggle` | `(value: T, addOrDel?: "add" \| "del") => this` | 값 토글 (있으면 제거, 없으면 추가). `addOrDel`로 강제 추가/제거 가능 |
17
+
18
+ ## Usage
19
+
20
+ ```typescript
21
+ import "@simplysm/core-common";
22
+
23
+ const set = new Set<number>([1, 2, 3]);
24
+
25
+ // adds — 여러 항목 추가
26
+ set.adds(4, 5, 6); // {1, 2, 3, 4, 5, 6}
27
+
28
+ // toggle — 자동
29
+ set.toggle(2); // 2가 있으므로 제거 → {1, 3, 4, 5, 6}
30
+ set.toggle(10); // 10이 없으므로 추가 → {1, 3, 4, 5, 6, 10}
31
+
32
+ // toggle — 강제
33
+ const isAdmin = true;
34
+ set.toggle(5, isAdmin ? "add" : "del"); // 강제 추가
35
+ ```
@@ -0,0 +1,48 @@
1
+ # DebounceQueue
2
+
3
+ 비동기 디바운스 큐. 짧은 시간 내에 여러 번 호출되면 마지막 요청만 실행하고 이전 요청은 무시한다. 입력 필드 자동완성, 연속적인 상태 변경 일괄 처리 등에 유용하다. [`EventEmitter`](./event-emitter.md)를 상속한다.
4
+
5
+ ```typescript
6
+ export class DebounceQueue extends EventEmitter<{ error: SdError }> {
7
+ /**
8
+ * @param _delay 디바운스 지연 시간 (밀리초). 생략 시 즉시 실행 (다음 이벤트 루프)
9
+ */
10
+ constructor(_delay?: number);
11
+
12
+ run(fn: () => void | Promise<void>): void;
13
+ override dispose(): void;
14
+ }
15
+ ```
16
+
17
+ 에러 발생 시 `"error"` 이벤트로 전파되며, 리스너가 없으면 `consola`로 로그 출력된다.
18
+
19
+ 실행 중에 추가된 요청은 디바운스 지연 없이 현재 실행이 완료된 직후 즉시 처리된다. 이는 실행 완료 전에 도착한 요청을 놓치지 않기 위한 의도적인 설계다.
20
+
21
+ ## Members
22
+
23
+ | Member | Kind | Type | Description |
24
+ |--------|------|------|-------------|
25
+ | `run` | method | `(fn: () => void \| Promise<void>) => void` | 큐에 함수 추가. 이전에 추가된 함수가 있으면 교체됨 |
26
+ | `dispose` | method | `() => void` | 대기 중인 작업과 타이머 정리 후 부모 `dispose()` 호출 |
27
+
28
+ ## Usage
29
+
30
+ ```typescript
31
+ import { DebounceQueue } from "@simplysm/core-common";
32
+
33
+ const queue = new DebounceQueue(300); // 300ms 지연
34
+
35
+ // 에러 처리
36
+ queue.on("error", (err) => console.error(err));
37
+
38
+ queue.run(() => console.log("1")); // 무시됨
39
+ queue.run(() => console.log("2")); // 무시됨
40
+ queue.run(() => console.log("3")); // 300ms 후 실행
41
+
42
+ // 자원 정리
43
+ try {
44
+ queue.run(() => saveData());
45
+ } finally {
46
+ queue.dispose();
47
+ }
48
+ ```
@@ -0,0 +1,52 @@
1
+ # EventEmitter
2
+
3
+ 타입 안전 EventEmitter. 내부적으로 `EventTarget`을 사용하며 브라우저와 Node.js 모두에서 사용 가능하다. `events`/`eventemitter3` 대신 이 클래스를 사용한다.
4
+
5
+ ```typescript
6
+ export class EventEmitter<
7
+ TEvents extends { [K in keyof TEvents]: unknown } = Record<string, unknown>,
8
+ > {
9
+ on<TEventName extends keyof TEvents & string>(type: TEventName, listener: (data: TEvents[TEventName]) => void): void;
10
+ off<TEventName extends keyof TEvents & string>(type: TEventName, listener: (data: TEvents[TEventName]) => void): void;
11
+ emit<TEventName extends keyof TEvents & string>(type: TEventName, ...args: TEvents[TEventName] extends void ? [] : [data: TEvents[TEventName]]): void;
12
+ listenerCount<TEventName extends keyof TEvents & string>(type: TEventName): number;
13
+ dispose(): void;
14
+ }
15
+ ```
16
+
17
+ ## Members
18
+
19
+ | Member | Kind | Type | Description |
20
+ |--------|------|------|-------------|
21
+ | `on` | method | `(type, listener) => void` | 이벤트 리스너 등록. 같은 리스너를 같은 이벤트에 중복 등록하면 무시됨 |
22
+ | `off` | method | `(type, listener) => void` | 이벤트 리스너 제거 |
23
+ | `emit` | method | `(type, ...args) => void` | 이벤트 발행. `void` 타입 이벤트는 인자 없이 호출 |
24
+ | `listenerCount` | method | `(type) => number` | 특정 이벤트의 등록된 리스너 수 반환 |
25
+ | `dispose` | method | `() => void` | 모든 이벤트 리스너 제거 |
26
+
27
+ ## Usage
28
+
29
+ ```typescript
30
+ import { EventEmitter } from "@simplysm/core-common";
31
+
32
+ // 이벤트 타입 정의
33
+ interface MyEvents {
34
+ data: string;
35
+ error: Error;
36
+ done: void;
37
+ }
38
+
39
+ // EventEmitter를 상속하여 사용
40
+ class MyService extends EventEmitter<MyEvents> {
41
+ async load() {
42
+ this.emit("data", "Loading...");
43
+ this.emit("done"); // void 타입은 인자 없이 호출
44
+ }
45
+ }
46
+
47
+ const svc = new MyService();
48
+ svc.on("data", (data) => { /* data: string */ });
49
+ svc.on("done", () => { /* ... */ });
50
+ await svc.load();
51
+ svc.dispose(); // 모든 리스너 정리
52
+ ```
@@ -0,0 +1,44 @@
1
+ # SerialQueue
2
+
3
+ 비동기 직렬 큐. 큐에 추가된 함수들은 순차적으로 실행된다. 하나의 작업이 완료된 후에야 다음 작업이 시작된다. 에러가 발생해도 후속 작업은 계속 실행된다. [`EventEmitter`](./event-emitter.md)를 상속한다.
4
+
5
+ ```typescript
6
+ export class SerialQueue extends EventEmitter<{ error: SdError }> {
7
+ /**
8
+ * @param _gap 각 작업 사이의 간격 (ms). 기본값: 0
9
+ */
10
+ constructor(_gap?: number);
11
+
12
+ run(fn: () => void | Promise<void>): void;
13
+ override dispose(): void;
14
+ }
15
+ ```
16
+
17
+ 에러 발생 시 `"error"` 이벤트로 전파되며, 리스너가 없으면 `consola`로 로그 출력된다.
18
+
19
+ ## Members
20
+
21
+ | Member | Kind | Type | Description |
22
+ |--------|------|------|-------------|
23
+ | `run` | method | `(fn: () => void \| Promise<void>) => void` | 큐에 함수 추가하고 실행 예약 |
24
+ | `dispose` | method | `() => void` | 대기 중인 큐 비우기 (현재 실행 중인 작업은 완료됨) |
25
+
26
+ ## Usage
27
+
28
+ ```typescript
29
+ import { SerialQueue } from "@simplysm/core-common";
30
+
31
+ const queue = new SerialQueue();
32
+
33
+ // 에러 처리
34
+ queue.on("error", (err) => console.error(err));
35
+
36
+ queue.run(async () => { await fetch("/api/1"); });
37
+ queue.run(async () => { await fetch("/api/2"); }); // 1 완료 후 실행
38
+ queue.run(async () => { await fetch("/api/3"); }); // 2 완료 후 실행
39
+
40
+ // 간격 있는 큐
41
+ const gapQueue = new SerialQueue(100); // 각 작업 사이 100ms 간격
42
+ gapQueue.run(() => step1());
43
+ gapQueue.run(() => step2()); // step1 완료 후 100ms 뒤에 실행
44
+ ```