@simplysm/sd-cli 13.0.99 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/commands/build.js +29 -19
  2. package/dist/commands/build.js.map +1 -6
  3. package/dist/commands/check.d.ts +1 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +130 -115
  6. package/dist/commands/check.js.map +1 -6
  7. package/dist/commands/dev.d.ts +6 -7
  8. package/dist/commands/dev.d.ts.map +1 -1
  9. package/dist/commands/dev.js +24 -14
  10. package/dist/commands/dev.js.map +1 -6
  11. package/dist/commands/lint.d.ts +1 -1
  12. package/dist/commands/lint.js +158 -116
  13. package/dist/commands/lint.js.map +1 -6
  14. package/dist/commands/publish.d.ts.map +1 -1
  15. package/dist/commands/publish.js +637 -510
  16. package/dist/commands/publish.js.map +1 -6
  17. package/dist/commands/replace-deps.js +12 -12
  18. package/dist/commands/replace-deps.js.map +1 -6
  19. package/dist/commands/typecheck.d.ts +5 -30
  20. package/dist/commands/typecheck.d.ts.map +1 -1
  21. package/dist/commands/typecheck.js +144 -207
  22. package/dist/commands/typecheck.js.map +1 -6
  23. package/dist/commands/watch.d.ts +6 -4
  24. package/dist/commands/watch.d.ts.map +1 -1
  25. package/dist/commands/watch.js +25 -16
  26. package/dist/commands/watch.js.map +1 -6
  27. package/dist/engines/NgtscEngine.d.ts +47 -0
  28. package/dist/engines/NgtscEngine.d.ts.map +1 -0
  29. package/dist/engines/NgtscEngine.js +151 -0
  30. package/dist/engines/NgtscEngine.js.map +1 -0
  31. package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
  32. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
  33. package/dist/engines/ServerEsbuildEngine.js +159 -0
  34. package/dist/engines/ServerEsbuildEngine.js.map +1 -0
  35. package/dist/engines/TscEngine.d.ts +47 -0
  36. package/dist/engines/TscEngine.d.ts.map +1 -0
  37. package/dist/engines/TscEngine.js +153 -0
  38. package/dist/engines/TscEngine.js.map +1 -0
  39. package/dist/engines/ViteEngine.d.ts +49 -0
  40. package/dist/engines/ViteEngine.d.ts.map +1 -0
  41. package/dist/engines/ViteEngine.js +161 -0
  42. package/dist/engines/ViteEngine.js.map +1 -0
  43. package/dist/engines/index.d.ts +26 -0
  44. package/dist/engines/index.d.ts.map +1 -0
  45. package/dist/engines/index.js +30 -0
  46. package/dist/engines/index.js.map +1 -0
  47. package/dist/engines/types.d.ts +77 -0
  48. package/dist/engines/types.d.ts.map +1 -0
  49. package/dist/engines/types.js +2 -0
  50. package/dist/engines/types.js.map +1 -0
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -2
  54. package/dist/index.js.map +1 -6
  55. package/dist/infra/ResultCollector.d.ts +1 -1
  56. package/dist/infra/ResultCollector.d.ts.map +1 -1
  57. package/dist/infra/ResultCollector.js +30 -27
  58. package/dist/infra/ResultCollector.js.map +1 -6
  59. package/dist/infra/SignalHandler.js +45 -42
  60. package/dist/infra/SignalHandler.js.map +1 -6
  61. package/dist/infra/WorkerManager.js +56 -53
  62. package/dist/infra/WorkerManager.js.map +1 -6
  63. package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
  64. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  65. package/dist/orchestrators/BuildOrchestrator.js +314 -309
  66. package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
  67. package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
  68. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
  69. package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
  70. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
  71. package/dist/sd-cli-entry.d.ts.map +1 -1
  72. package/dist/sd-cli-entry.js +190 -266
  73. package/dist/sd-cli-entry.js.map +1 -6
  74. package/dist/sd-cli.js +77 -49
  75. package/dist/sd-cli.js.map +1 -6
  76. package/dist/sd-config.types.d.ts +2 -0
  77. package/dist/sd-config.types.d.ts.map +1 -1
  78. package/dist/sd-config.types.js +2 -1
  79. package/dist/sd-config.types.js.map +1 -6
  80. package/dist/utils/angular-build.d.ts +77 -0
  81. package/dist/utils/angular-build.d.ts.map +1 -0
  82. package/dist/utils/angular-build.js +84 -0
  83. package/dist/utils/angular-build.js.map +1 -0
  84. package/dist/utils/build-env.js +9 -9
  85. package/dist/utils/build-env.js.map +1 -6
  86. package/dist/utils/concurrency.d.ts +15 -0
  87. package/dist/utils/concurrency.d.ts.map +1 -0
  88. package/dist/utils/concurrency.js +38 -0
  89. package/dist/utils/concurrency.js.map +1 -0
  90. package/dist/utils/copy-public.js +104 -87
  91. package/dist/utils/copy-public.js.map +1 -6
  92. package/dist/utils/copy-src.js +49 -35
  93. package/dist/utils/copy-src.js.map +1 -6
  94. package/dist/utils/esbuild-config.d.ts +0 -29
  95. package/dist/utils/esbuild-config.d.ts.map +1 -1
  96. package/dist/utils/esbuild-config.js +151 -218
  97. package/dist/utils/esbuild-config.js.map +1 -6
  98. package/dist/utils/ngtsc-build-core.d.ts +49 -0
  99. package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
  100. package/dist/utils/ngtsc-build-core.js +250 -0
  101. package/dist/utils/ngtsc-build-core.js.map +1 -0
  102. package/dist/utils/output-path-rewriter.d.ts +23 -0
  103. package/dist/utils/output-path-rewriter.d.ts.map +1 -0
  104. package/dist/utils/output-path-rewriter.js +74 -0
  105. package/dist/utils/output-path-rewriter.js.map +1 -0
  106. package/dist/utils/output-utils.js +55 -40
  107. package/dist/utils/output-utils.js.map +1 -6
  108. package/dist/utils/package-utils.d.ts +8 -0
  109. package/dist/utils/package-utils.d.ts.map +1 -1
  110. package/dist/utils/package-utils.js +103 -73
  111. package/dist/utils/package-utils.js.map +1 -6
  112. package/dist/utils/rebuild-manager.js +41 -44
  113. package/dist/utils/rebuild-manager.js.map +1 -6
  114. package/dist/utils/replace-deps.js +283 -184
  115. package/dist/utils/replace-deps.js.map +1 -6
  116. package/dist/utils/scss-compiler.d.ts +10 -0
  117. package/dist/utils/scss-compiler.d.ts.map +1 -0
  118. package/dist/utils/scss-compiler.js +36 -0
  119. package/dist/utils/scss-compiler.js.map +1 -0
  120. package/dist/utils/sd-config.js +29 -19
  121. package/dist/utils/sd-config.js.map +1 -6
  122. package/dist/utils/tsc-build.d.ts +36 -0
  123. package/dist/utils/tsc-build.d.ts.map +1 -0
  124. package/dist/utils/tsc-build.js +130 -0
  125. package/dist/utils/tsc-build.js.map +1 -0
  126. package/dist/utils/tsconfig.d.ts +7 -26
  127. package/dist/utils/tsconfig.d.ts.map +1 -1
  128. package/dist/utils/tsconfig.js +39 -64
  129. package/dist/utils/tsconfig.js.map +1 -6
  130. package/dist/utils/typecheck-non-package.d.ts +18 -0
  131. package/dist/utils/typecheck-non-package.d.ts.map +1 -0
  132. package/dist/utils/typecheck-non-package.js +64 -0
  133. package/dist/utils/typecheck-non-package.js.map +1 -0
  134. package/dist/utils/typecheck-serialization.js +58 -40
  135. package/dist/utils/typecheck-serialization.js.map +1 -6
  136. package/dist/utils/worker-events.js +48 -40
  137. package/dist/utils/worker-events.js.map +1 -6
  138. package/dist/utils/worker-utils.js +48 -28
  139. package/dist/utils/worker-utils.js.map +1 -6
  140. package/dist/vitest-plugin.d.ts +9 -0
  141. package/dist/vitest-plugin.d.ts.map +1 -0
  142. package/dist/vitest-plugin.js +85 -0
  143. package/dist/vitest-plugin.js.map +1 -0
  144. package/dist/workers/library-build.worker.d.ts +54 -0
  145. package/dist/workers/library-build.worker.d.ts.map +1 -0
  146. package/dist/workers/library-build.worker.js +97 -0
  147. package/dist/workers/library-build.worker.js.map +1 -0
  148. package/dist/workers/lint.worker.js +9 -6
  149. package/dist/workers/lint.worker.js.map +1 -6
  150. package/dist/workers/ngtsc-build.worker.d.ts +23 -0
  151. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
  152. package/dist/workers/ngtsc-build.worker.js +98 -0
  153. package/dist/workers/ngtsc-build.worker.js.map +1 -0
  154. package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
  155. package/dist/workers/server-build.worker.d.ts.map +1 -0
  156. package/dist/workers/server-build.worker.js +399 -0
  157. package/dist/workers/server-build.worker.js.map +1 -0
  158. package/dist/workers/server-runtime.worker.d.ts +3 -2
  159. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  160. package/dist/workers/server-runtime.worker.js +100 -95
  161. package/dist/workers/server-runtime.worker.js.map +1 -6
  162. package/dist/workers/vite-build.worker.d.ts +56 -0
  163. package/dist/workers/vite-build.worker.d.ts.map +1 -0
  164. package/dist/workers/vite-build.worker.js +167 -0
  165. package/dist/workers/vite-build.worker.js.map +1 -0
  166. package/package.json +10 -16
  167. package/src/commands/check.ts +21 -3
  168. package/src/commands/dev.ts +10 -8
  169. package/src/commands/lint.ts +1 -1
  170. package/src/commands/publish.ts +4 -0
  171. package/src/commands/typecheck.ts +89 -256
  172. package/src/commands/watch.ts +9 -8
  173. package/src/engines/NgtscEngine.ts +190 -0
  174. package/src/engines/ServerEsbuildEngine.ts +195 -0
  175. package/src/engines/TscEngine.ts +189 -0
  176. package/src/engines/ViteEngine.ts +203 -0
  177. package/src/engines/index.ts +49 -0
  178. package/src/engines/types.ts +79 -0
  179. package/src/index.ts +0 -3
  180. package/src/infra/ResultCollector.ts +1 -1
  181. package/src/orchestrators/BuildOrchestrator.ts +87 -157
  182. package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
  183. package/src/sd-cli-entry.ts +13 -116
  184. package/src/sd-config.types.ts +2 -0
  185. package/src/utils/angular-build.ts +157 -0
  186. package/src/utils/concurrency.ts +43 -0
  187. package/src/utils/esbuild-config.ts +1 -122
  188. package/src/utils/ngtsc-build-core.ts +379 -0
  189. package/src/utils/output-path-rewriter.ts +82 -0
  190. package/src/utils/package-utils.ts +20 -0
  191. package/src/utils/scss-compiler.ts +58 -0
  192. package/src/utils/tsc-build.ts +175 -0
  193. package/src/utils/tsconfig.ts +27 -95
  194. package/src/utils/typecheck-non-package.ts +87 -0
  195. package/src/vitest-plugin.ts +118 -0
  196. package/src/workers/library-build.worker.ts +153 -0
  197. package/src/workers/ngtsc-build.worker.ts +146 -0
  198. package/src/workers/server-build.worker.ts +565 -0
  199. package/src/workers/server-runtime.worker.ts +17 -26
  200. package/src/workers/vite-build.worker.ts +252 -0
  201. package/tests/commands/check.spec.ts +276 -0
  202. package/tests/commands/dev.spec.ts +53 -0
  203. package/tests/commands/lint.spec.ts +243 -0
  204. package/tests/commands/publish.spec.ts +1159 -0
  205. package/tests/commands/typecheck.spec.ts +294 -0
  206. package/tests/commands/watch.spec.ts +53 -0
  207. package/tests/engines/engine-selection.spec.ts +247 -0
  208. package/tests/engines/ngtsc-engine.spec.ts +274 -0
  209. package/tests/engines/server-esbuild-engine.spec.ts +256 -0
  210. package/tests/engines/tsc-engine.spec.ts +213 -0
  211. package/tests/engines/vite-engine.spec.ts +358 -0
  212. package/tests/infra/result-collector.spec.ts +46 -0
  213. package/tests/infra/signal-handler.spec.ts +32 -0
  214. package/tests/infra/worker-manager.spec.ts +63 -0
  215. package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
  216. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
  217. package/tests/sd-cli-entry.spec.ts +49 -0
  218. package/tests/utils/angular-build.spec.ts +251 -0
  219. package/tests/utils/build-env.spec.ts +33 -0
  220. package/tests/utils/concurrency.spec.ts +65 -0
  221. package/tests/utils/copy-src.spec.ts +144 -0
  222. package/tests/utils/esbuild-config.spec.ts +186 -0
  223. package/tests/utils/external-modules.spec.ts +161 -0
  224. package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
  225. package/tests/utils/output-path-rewriter.spec.ts +165 -0
  226. package/tests/utils/output-utils.spec.ts +104 -0
  227. package/tests/utils/package-utils.spec.ts +52 -0
  228. package/tests/utils/rebuild-manager.spec.ts +30 -27
  229. package/tests/utils/replace-deps.spec.ts +69 -0
  230. package/tests/utils/scss-compiler.spec.ts +131 -0
  231. package/tests/utils/sd-config.spec.ts +77 -0
  232. package/tests/utils/tsc-build.spec.ts +358 -0
  233. package/tests/utils/tsconfig-angular.spec.ts +71 -0
  234. package/tests/utils/typecheck-non-package.spec.ts +120 -0
  235. package/tests/utils/worker-events.spec.ts +155 -0
  236. package/tests/utils/worker-utils.spec.ts +43 -0
  237. package/tests/vitest-plugin-cwd.spec.ts +68 -0
  238. package/tests/vitest-plugin.spec.ts +103 -0
  239. package/tests/workers/library-build-worker.spec.ts +258 -0
  240. package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
  241. package/tests/workers/server-build-worker.spec.ts +566 -0
  242. package/tests/workers/server-runtime-worker.spec.ts +251 -0
  243. package/README.md +0 -295
  244. package/dist/builders/BaseBuilder.d.ts +0 -88
  245. package/dist/builders/BaseBuilder.d.ts.map +0 -1
  246. package/dist/builders/BaseBuilder.js +0 -142
  247. package/dist/builders/BaseBuilder.js.map +0 -6
  248. package/dist/builders/DtsBuilder.d.ts +0 -22
  249. package/dist/builders/DtsBuilder.d.ts.map +0 -1
  250. package/dist/builders/DtsBuilder.js +0 -72
  251. package/dist/builders/DtsBuilder.js.map +0 -6
  252. package/dist/builders/LibraryBuilder.d.ts +0 -22
  253. package/dist/builders/LibraryBuilder.d.ts.map +0 -1
  254. package/dist/builders/LibraryBuilder.js +0 -85
  255. package/dist/builders/LibraryBuilder.js.map +0 -6
  256. package/dist/builders/types.d.ts +0 -55
  257. package/dist/builders/types.d.ts.map +0 -1
  258. package/dist/builders/types.js +0 -1
  259. package/dist/builders/types.js.map +0 -6
  260. package/dist/capacitor/capacitor.d.ts +0 -151
  261. package/dist/capacitor/capacitor.d.ts.map +0 -1
  262. package/dist/capacitor/capacitor.js +0 -694
  263. package/dist/capacitor/capacitor.js.map +0 -6
  264. package/dist/commands/device.d.ts +0 -22
  265. package/dist/commands/device.d.ts.map +0 -1
  266. package/dist/commands/device.js +0 -98
  267. package/dist/commands/device.js.map +0 -6
  268. package/dist/commands/init.d.ts +0 -14
  269. package/dist/commands/init.d.ts.map +0 -1
  270. package/dist/commands/init.js +0 -72
  271. package/dist/commands/init.js.map +0 -6
  272. package/dist/electron/electron.d.ts +0 -84
  273. package/dist/electron/electron.d.ts.map +0 -1
  274. package/dist/electron/electron.js +0 -263
  275. package/dist/electron/electron.js.map +0 -6
  276. package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
  277. package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
  278. package/dist/orchestrators/DevOrchestrator.js +0 -540
  279. package/dist/orchestrators/DevOrchestrator.js.map +0 -6
  280. package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
  281. package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
  282. package/dist/orchestrators/WatchOrchestrator.js +0 -199
  283. package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
  284. package/dist/utils/tailwind-config-deps.d.ts +0 -8
  285. package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
  286. package/dist/utils/tailwind-config-deps.js +0 -82
  287. package/dist/utils/tailwind-config-deps.js.map +0 -6
  288. package/dist/utils/template.d.ts +0 -14
  289. package/dist/utils/template.d.ts.map +0 -1
  290. package/dist/utils/template.js +0 -33
  291. package/dist/utils/template.js.map +0 -6
  292. package/dist/utils/vite-config.d.ts +0 -35
  293. package/dist/utils/vite-config.d.ts.map +0 -1
  294. package/dist/utils/vite-config.js +0 -259
  295. package/dist/utils/vite-config.js.map +0 -6
  296. package/dist/workers/client.worker.d.ts +0 -83
  297. package/dist/workers/client.worker.d.ts.map +0 -1
  298. package/dist/workers/client.worker.js +0 -111
  299. package/dist/workers/client.worker.js.map +0 -6
  300. package/dist/workers/dts.worker.d.ts +0 -75
  301. package/dist/workers/dts.worker.d.ts.map +0 -1
  302. package/dist/workers/dts.worker.js +0 -270
  303. package/dist/workers/dts.worker.js.map +0 -6
  304. package/dist/workers/library.worker.d.ts +0 -75
  305. package/dist/workers/library.worker.d.ts.map +0 -1
  306. package/dist/workers/library.worker.js +0 -166
  307. package/dist/workers/library.worker.js.map +0 -6
  308. package/dist/workers/server.worker.d.ts.map +0 -1
  309. package/dist/workers/server.worker.js +0 -482
  310. package/dist/workers/server.worker.js.map +0 -6
  311. package/src/builders/BaseBuilder.ts +0 -218
  312. package/src/builders/DtsBuilder.ts +0 -92
  313. package/src/builders/LibraryBuilder.ts +0 -110
  314. package/src/builders/types.ts +0 -60
  315. package/src/capacitor/capacitor.ts +0 -931
  316. package/src/commands/device.ts +0 -140
  317. package/src/commands/init.ts +0 -113
  318. package/src/electron/electron.ts +0 -362
  319. package/src/orchestrators/DevOrchestrator.ts +0 -744
  320. package/src/orchestrators/WatchOrchestrator.ts +0 -277
  321. package/src/utils/tailwind-config-deps.ts +0 -98
  322. package/src/utils/template.ts +0 -56
  323. package/src/utils/vite-config.ts +0 -390
  324. package/src/workers/client.worker.ts +0 -250
  325. package/src/workers/dts.worker.ts +0 -453
  326. package/src/workers/library.worker.ts +0 -316
  327. package/src/workers/server.worker.ts +0 -734
  328. package/templates/init/.gitignore.hbs +0 -34
  329. package/templates/init/.npmrc.hbs +0 -1
  330. package/templates/init/.prettierignore +0 -1
  331. package/templates/init/.prettierrc.yaml +0 -12
  332. package/templates/init/eslint.config.ts +0 -15
  333. package/templates/init/mise.toml +0 -3
  334. package/templates/init/package.json.hbs +0 -32
  335. package/templates/init/packages/client-admin/index.html.hbs +0 -144
  336. package/templates/init/packages/client-admin/package.json.hbs +0 -27
  337. package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
  338. package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
  339. package/templates/init/packages/client-admin/public/favicon.ico +0 -0
  340. package/templates/init/packages/client-admin/src/App.tsx +0 -42
  341. package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
  342. package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
  343. package/templates/init/packages/client-admin/src/main.css +0 -4
  344. package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
  345. package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
  346. package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
  347. package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
  348. package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
  349. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
  350. package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
  351. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
  352. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
  353. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
  354. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
  355. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
  356. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
  357. package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
  358. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
  359. package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
  360. package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
  361. package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
  362. package/templates/init/packages/db-main/package.json.hbs +0 -13
  363. package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
  364. package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
  365. package/templates/init/packages/db-main/src/index.ts +0 -14
  366. package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
  367. package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
  368. package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
  369. package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
  370. package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
  371. package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
  372. package/templates/init/packages/server/package.json.hbs +0 -20
  373. package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  374. package/templates/init/packages/server/src/index.ts +0 -4
  375. package/templates/init/packages/server/src/main.ts.hbs +0 -34
  376. package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
  377. package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
  378. package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
  379. package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
  380. package/templates/init/pnpm-workspace.yaml +0 -15
  381. package/templates/init/sd.config.ts.hbs +0 -48
  382. package/templates/init/tsconfig.json.hbs +0 -39
  383. package/templates/init/vitest.config.ts +0 -36
  384. package/tests/capacitor-exclude.spec.ts +0 -78
  385. package/tests/capacitor.spec.ts +0 -49
  386. package/tests/copy-src.spec.ts +0 -50
  387. package/tests/electron-exclude.spec.ts +0 -61
  388. package/tests/get-compiler-options-for-package.spec.ts +0 -80
  389. package/tests/get-package-source-files.spec.ts +0 -139
  390. package/tests/get-types-from-package-json.spec.ts +0 -92
  391. package/tests/infra/ResultCollector.spec.ts +0 -30
  392. package/tests/infra/SignalHandler.spec.ts +0 -38
  393. package/tests/infra/WorkerManager.spec.ts +0 -63
  394. package/tests/load-ignore-patterns.spec.ts +0 -163
  395. package/tests/load-sd-config.spec.ts +0 -100
  396. package/tests/package-utils.spec.ts +0 -188
  397. package/tests/parse-root-tsconfig.spec.ts +0 -89
  398. package/tests/publish-config-narrowing.spec.ts +0 -20
  399. package/tests/replace-deps.spec.ts +0 -308
  400. package/tests/run-lint.spec.ts +0 -366
  401. package/tests/run-typecheck.spec.ts +0 -544
  402. package/tests/run-watch.spec.ts +0 -76
  403. package/tests/sd-cli.spec.ts +0 -265
  404. package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
  405. package/tests/tailwind-config-deps.spec.ts +0 -30
  406. package/tests/template.spec.ts +0 -70
  407. package/tests/vite-config-exclude.spec.ts +0 -35
  408. package/tests/vite-config-outdir.spec.ts +0 -38
  409. package/tests/write-changed-output-files.spec.ts +0 -97
@@ -1,243 +0,0 @@
1
- import { createMemo, Show } from "solid-js";
2
- import { CrudDetail, DatePicker, FormTable, TextInput, useSharedData } from "@simplysm/solid";
3
- import type { DateOnly } from "@simplysm/core-common";
4
- import { expr, type IDataLogJoinResult } from "@{{projectName}}/db-main";
5
- import { useAuth } from "../../../../providers/AuthProvider";
6
- import { useAppService } from "../../../../providers/AppServiceProvider";
7
- import type { AppSharedData } from "../../../../providers/configureSharedData";
8
-
9
- type DetailData = {
10
- name?: string;
11
- email?: string;
12
- phoneNumber?: string;
13
- birthDate?: DateOnly;
14
- enteringDate?: DateOnly;
15
- leavingDate?: DateOnly;
16
- socialSecurityNumber?: string;
17
- payrollAccountBank?: string;
18
- payrollAccountNumber?: string;
19
- password?: string;
20
- isDeleted: boolean;
21
- };
22
-
23
- export function EmployeeDetail(props: { itemId?: number }) {
24
- const auth = useAuth();
25
- const appService = useAppService();
26
- const sharedData = useSharedData<AppSharedData>();
27
-
28
- const perms = createMemo(() => {
29
- const p = auth.authInfo()?.permissions ?? {};
30
- return {
31
- edit: Boolean(p["/home/base/employee/edit"]),
32
- authUse: Boolean(p["/home/base/employee/auth/use"]),
33
- authEdit: Boolean(p["/home/base/employee/auth/edit"]),
34
- personalUse: Boolean(p["/home/base/employee/personal/use"]),
35
- personalEdit: Boolean(p["/home/base/employee/personal/edit"]),
36
- payrollUse: Boolean(p["/home/base/employee/payroll/use"]),
37
- payrollEdit: Boolean(p["/home/base/employee/payroll/edit"]),
38
- };
39
- });
40
-
41
- // toggleDelete에서 현재 데이터 접근용
42
- let dataRef: DetailData = { isDeleted: false };
43
-
44
- async function handleLoad() {
45
- if (props.itemId == null) {
46
- return {
47
- data: { isDeleted: false } as DetailData,
48
- info: { isNew: true, isDeleted: false },
49
- };
50
- }
51
-
52
- return appService.orm.connect(async (db) => {
53
- const emp = await db
54
- .employee()
55
- .joinLastDataLog()
56
- .where((c) => [expr.eq(c.id, props.itemId)])
57
- .select((c) => ({
58
- name: c.name,
59
- email: c.email,
60
- phoneNumber: c.phoneNumber,
61
- birthDate: c.birthDate,
62
- enteringDate: c.enteringDate,
63
- leavingDate: c.leavingDate,
64
- socialSecurityNumber: c.socialSecurityNumber,
65
- payrollAccountBank: c.payrollAccountBank,
66
- payrollAccountNumber: c.payrollAccountNumber,
67
- isDeleted: c.isDeleted,
68
- lastDataLog: c.lastDataLog,
69
- }))
70
- .single();
71
-
72
- if (!emp) throw new Error("직원를 찾을 수 없습니다.");
73
-
74
- const lastDataLog = emp.lastDataLog as IDataLogJoinResult | undefined;
75
-
76
- return {
77
- data: {
78
- name: emp.name,
79
- email: emp.email,
80
- phoneNumber: emp.phoneNumber,
81
- birthDate: emp.birthDate,
82
- enteringDate: emp.enteringDate,
83
- leavingDate: emp.leavingDate,
84
- socialSecurityNumber: emp.socialSecurityNumber,
85
- payrollAccountBank: emp.payrollAccountBank,
86
- payrollAccountNumber: emp.payrollAccountNumber,
87
- isDeleted: emp.isDeleted,
88
- } as DetailData,
89
- info: {
90
- isNew: false,
91
- isDeleted: emp.isDeleted,
92
- lastModifiedAt: lastDataLog?.dateTime,
93
- lastModifiedBy: lastDataLog?.employeeName,
94
- },
95
- };
96
- });
97
- }
98
-
99
- async function handleSubmit(data: DetailData) {
100
- const ids = await appService.employee.save([{ id: props.itemId, ...data }]);
101
- await sharedData.employee.emit(ids);
102
- return true;
103
- }
104
-
105
- async function handleToggleDelete(del: boolean) {
106
- const ids = await appService.employee.save([{ id: props.itemId!, ...dataRef, isDeleted: del }]);
107
- await sharedData.employee.emit(ids);
108
- return true;
109
- }
110
-
111
- return (
112
- <CrudDetail<DetailData>
113
- editable={perms().edit}
114
- deletable={props.itemId != null && props.itemId !== auth.authInfo()?.employeeId}
115
- load={handleLoad}
116
- submit={handleSubmit}
117
- toggleDelete={handleToggleDelete}
118
- >
119
- {(ctx) => {
120
- dataRef = ctx.data;
121
- return (
122
- <div class="flex flex-col gap-8">
123
- <section class={"flex flex-col gap-2"}>
124
- <h3 class="font-bold text-base-400">직원정보</h3>
125
- <FormTable>
126
- <FormTable.Row>
127
- <FormTable.Item label="이름">
128
- <TextInput
129
- required
130
- disabled={!perms().edit}
131
- value={ctx.data.name ?? ""}
132
- onValueChange={(v) => ctx.setData("name", v)}
133
- />
134
- </FormTable.Item>
135
- <FormTable.Item label="이메일">
136
- <TextInput
137
- type="email"
138
- disabled={!perms().edit}
139
- value={ctx.data.email ?? ""}
140
- onValueChange={(v) => ctx.setData("email", v)}
141
- />
142
- </FormTable.Item>
143
- </FormTable.Row>
144
- <FormTable.Row>
145
- <FormTable.Item label="전화번호">
146
- <TextInput
147
- disabled={!perms().edit}
148
- value={ctx.data.phoneNumber ?? ""}
149
- onValueChange={(v) => ctx.setData("phoneNumber", v)}
150
- />
151
- </FormTable.Item>
152
- <FormTable.Item label="생년월일">
153
- <DatePicker
154
- disabled={!perms().edit}
155
- value={ctx.data.birthDate}
156
- onValueChange={(v) => ctx.setData("birthDate", v)}
157
- />
158
- </FormTable.Item>
159
- </FormTable.Row>
160
- <FormTable.Row>
161
- <FormTable.Item label="입사일자">
162
- <DatePicker
163
- disabled={!perms().edit}
164
- value={ctx.data.enteringDate}
165
- onValueChange={(v) => ctx.setData("enteringDate", v)}
166
- />
167
- </FormTable.Item>
168
- <FormTable.Item label="퇴사일자">
169
- <DatePicker
170
- disabled={!perms().edit}
171
- value={ctx.data.leavingDate}
172
- onValueChange={(v) => ctx.setData("leavingDate", v)}
173
- />
174
- </FormTable.Item>
175
- </FormTable.Row>
176
- </FormTable>
177
- </section>
178
-
179
- <Show when={perms().authUse}>
180
- <section class={"flex flex-col gap-2"}>
181
- <h3 class="font-bold text-base-400">인증정보</h3>
182
- <FormTable>
183
- <FormTable.Row>
184
- <FormTable.Item label="비밀번호" colspan={3}>
185
- <TextInput
186
- type="password"
187
- disabled={!perms().authEdit}
188
- value={ctx.data.password ?? ""}
189
- onValueChange={(v) => ctx.setData("password", v)}
190
- />
191
- </FormTable.Item>
192
- </FormTable.Row>
193
- </FormTable>
194
- </section>
195
- </Show>
196
-
197
- <Show when={perms().personalUse}>
198
- <section class={"flex flex-col gap-2"}>
199
- <h3 class="font-bold text-base-400">개인정보</h3>
200
- <FormTable>
201
- <FormTable.Row>
202
- <FormTable.Item label="주민번호" colspan={3}>
203
- <TextInput
204
- format="XXXXXX-XXXXXXX"
205
- disabled={!perms().personalEdit}
206
- value={ctx.data.socialSecurityNumber ?? ""}
207
- onValueChange={(v) => ctx.setData("socialSecurityNumber", v)}
208
- />
209
- </FormTable.Item>
210
- </FormTable.Row>
211
- </FormTable>
212
- </section>
213
- </Show>
214
-
215
- <Show when={perms().payrollUse}>
216
- <section class={"flex flex-col gap-2"}>
217
- <h3 class="font-bold text-base-400">급여정보</h3>
218
- <FormTable>
219
- <FormTable.Row>
220
- <FormTable.Item label="계좌은행">
221
- <TextInput
222
- disabled={!perms().payrollEdit}
223
- value={ctx.data.payrollAccountBank ?? ""}
224
- onValueChange={(v) => ctx.setData("payrollAccountBank", v)}
225
- />
226
- </FormTable.Item>
227
- <FormTable.Item label="계좌번호">
228
- <TextInput
229
- disabled={!perms().payrollEdit}
230
- value={ctx.data.payrollAccountNumber ?? ""}
231
- onValueChange={(v) => ctx.setData("payrollAccountNumber", v)}
232
- />
233
- </FormTable.Item>
234
- </FormTable.Row>
235
- </FormTable>
236
- </section>
237
- </Show>
238
- </div>
239
- );
240
- }}
241
- </CrudDetail>
242
- );
243
- }
@@ -1,271 +0,0 @@
1
- import { Show } from "solid-js";
2
- import {
3
- Checkbox,
4
- CrudSheet,
5
- type ExcelConfig,
6
- FormGroup,
7
- type DialogEditConfig,
8
- type SortingDef,
9
- TextInput,
10
- useDialog,
11
- useSharedData,
12
- } from "@simplysm/solid";
13
- import { DateOnly, type DateTime, objGetChainValue, strIsNullOrEmpty } from "@simplysm/core-common";
14
- import { expr } from "@{{projectName}}/db-main";
15
- import { type ExprUnit } from "@simplysm/orm-common";
16
- import { ExcelWrapper } from "@simplysm/excel";
17
- import { downloadBlob } from "@simplysm/core-browser";
18
- import { z } from "zod";
19
- import { useAppService } from "../../../../providers/AppServiceProvider";
20
- import { useAppStructure } from "../../../../providers/AppStructureProvider";
21
- import { EmployeeDetail } from "./EmployeeDetail";
22
- import type { AppSharedData } from "../../../../providers/configureSharedData";
23
-
24
- type SheetItem = {
25
- id?: number;
26
- name?: string;
27
- email?: string;
28
- phoneNumber?: string;
29
- birthDate?: DateOnly;
30
- enteringDate?: DateOnly;
31
- leavingDate?: DateOnly;
32
- socialSecurityNumber?: string;
33
- payrollAccountBank?: string;
34
- payrollAccountNumber?: string;
35
- isDeleted: boolean;
36
- lastDataLog?: {
37
- action: string;
38
- dateTime: DateTime;
39
- employeeName?: string;
40
- };
41
- };
42
-
43
- type Filter = {
44
- searchText?: string;
45
- isIncludeLeft: boolean;
46
- isIncludeDeleted: boolean;
47
- };
48
-
49
- const ITEMS_PER_PAGE = 50;
50
-
51
- const excelWrapper = new ExcelWrapper(
52
- z.object({
53
- id: z.number().optional().describe("ID"),
54
- name: z.string().describe("이름"),
55
- email: z.string().optional().describe("이메일"),
56
- phoneNumber: z.string().optional().describe("전화번호"),
57
- birthDate: z.custom<DateOnly>().optional().describe("생년월일"),
58
- enteringDate: z.custom<DateOnly>().optional().describe("입사일자"),
59
- leavingDate: z.custom<DateOnly>().optional().describe("퇴사일자"),
60
- isDeleted: z.boolean().describe("삭제여부"),
61
- socialSecurityNumber: z.string().optional().describe("주민번호"),
62
- payrollAccountBank: z.string().optional().describe("급여계좌은행"),
63
- payrollAccountNumber: z.string().optional().describe("급여계좌번호"),
64
- password: z.string().optional().describe("비밀번호"),
65
- }),
66
- );
67
-
68
- export function EmployeeSheet() {
69
- const appService = useAppService();
70
- const dialog = useDialog();
71
- const sharedData = useSharedData<AppSharedData>();
72
-
73
- const { perms } = useAppStructure();
74
- const employeePerms = perms.home.base.employee;
75
-
76
- const dialogEdit: DialogEditConfig<SheetItem> = {
77
- editItem: (item) =>
78
- dialog.show(() => <EmployeeDetail itemId={item?.id} />, {
79
- header: item ? "직원 수정" : "직원 등록",
80
- }),
81
- };
82
-
83
- const excel: ExcelConfig<SheetItem> = {
84
- download: async (items) => {
85
- await using wb = await excelWrapper.write("직원", items, {
86
- excludes: [
87
- ...(!employeePerms.personal.use ? (["socialSecurityNumber"] as const) : []),
88
- ...(!employeePerms.payroll.use
89
- ? (["payrollAccountBank", "payrollAccountNumber"] as const)
90
- : []),
91
- ...(!employeePerms.auth.edit ? (["password"] as const) : []),
92
- ],
93
- });
94
- const blob = await wb.getBlob();
95
- downloadBlob(blob, "직원.xlsx");
96
- },
97
- upload: async (file) => {
98
- const excelItems = await excelWrapper.read(file);
99
- const ids = await appService.employee.save(excelItems);
100
- await sharedData.employee.emit(ids);
101
- },
102
- };
103
-
104
- async function search(filter: Filter, page: number | undefined, sorts: SortingDef[]) {
105
- return appService.orm.connect(async (db) => {
106
- let qr = db.employee();
107
-
108
- const searchText = filter.searchText?.trim();
109
- if (!strIsNullOrEmpty(searchText)) {
110
- qr = qr.search((c) => [c.name, c.email, c.phoneNumber], searchText);
111
- }
112
-
113
- if (!filter.isIncludeLeft) {
114
- qr = qr.where((c) => [
115
- expr.or([expr.null(c.leavingDate), expr.gt(c.leavingDate, new DateOnly())]),
116
- ]);
117
- }
118
-
119
- if (!filter.isIncludeDeleted) {
120
- qr = qr.where((c) => [expr.eq(c.isDeleted, false)]);
121
- }
122
-
123
- const pageCount = page != null ? Math.ceil((await qr.count()) / ITEMS_PER_PAGE) : undefined;
124
-
125
- let qr2 = qr.joinLastDataLog().select((c) => ({
126
- id: c.id,
127
- name: c.name,
128
- email: c.email,
129
- phoneNumber: c.phoneNumber,
130
- birthDate: c.birthDate,
131
- enteringDate: c.enteringDate,
132
- leavingDate: c.leavingDate,
133
- ...(employeePerms.personal.use ? { socialSecurityNumber: c.socialSecurityNumber } : {}),
134
- ...(employeePerms.payroll.use
135
- ? {
136
- payrollAccountBank: c.payrollAccountBank,
137
- payrollAccountNumber: c.payrollAccountNumber,
138
- }
139
- : {}),
140
- isDeleted: c.isDeleted,
141
- lastDataLog: c.lastDataLog,
142
- }));
143
-
144
- for (const sort of sorts) {
145
- qr2 = qr2.orderBy(
146
- (c) => objGetChainValue(c, sort.key) as ExprUnit<any>,
147
- sort.desc ? "DESC" : "ASC",
148
- );
149
- }
150
- if (!sorts.some((s) => s.key === "id")) {
151
- qr2 = qr2.orderBy((c) => c.id, "DESC");
152
- }
153
-
154
- if (page != null) {
155
- qr2 = qr2.limit((page - 1) * ITEMS_PER_PAGE, ITEMS_PER_PAGE);
156
- }
157
-
158
- const items = (await qr2.result()) as SheetItem[];
159
- return { items, pageCount };
160
- });
161
- }
162
-
163
- return (
164
- <CrudSheet<SheetItem, Filter>
165
- search={search}
166
- getItemKey={(item) => item.id}
167
- isItemDeleted={(item) => item.isDeleted}
168
- isItemSelectable={(item) => item.id != null}
169
- persistKey="employee-page"
170
- editable={employeePerms.edit}
171
- filterInitial=\{{ isIncludeLeft: false, isIncludeDeleted: false } as Filter}
172
- dialogEdit={dialogEdit}
173
- excel={excel}
174
- lastModifiedAtProp="lastDataLog.dateTime"
175
- lastModifiedByProp="lastDataLog.employeeName"
176
- >
177
- <CrudSheet.Filter<Filter>>
178
- {(filter, setFilter) => (
179
- <>
180
- <FormGroup.Item label="검색어">
181
- <TextInput
182
- value={filter.searchText}
183
- onValueChange={(v) => setFilter("searchText", v)}
184
- />
185
- </FormGroup.Item>
186
- <FormGroup.Item>
187
- <Checkbox
188
- value={filter.isIncludeLeft}
189
- onValueChange={(v) => setFilter("isIncludeLeft", v)}
190
- >
191
- 퇴사자 포함
192
- </Checkbox>
193
- </FormGroup.Item>
194
- <FormGroup.Item>
195
- <Checkbox
196
- value={filter.isIncludeDeleted}
197
- onValueChange={(v) => setFilter("isIncludeDeleted", v)}
198
- >
199
- 삭제항목 포함
200
- </Checkbox>
201
- </FormGroup.Item>
202
- </>
203
- )}
204
- </CrudSheet.Filter>
205
-
206
- <CrudSheet.Column<SheetItem> key="id" header="#" editTrigger>
207
- {({ item }) => <div class="px-2 py-1 text-right">{item.id}</div>}
208
- </CrudSheet.Column>
209
-
210
- <CrudSheet.Column<SheetItem> key="name" header="이름">
211
- {({ item }) => <div class="px-2 py-1">{item.name}</div>}
212
- </CrudSheet.Column>
213
-
214
- <CrudSheet.Column<SheetItem> key="email" header="이메일">
215
- {({ item }) => <div class="px-2 py-1">{item.email}</div>}
216
- </CrudSheet.Column>
217
-
218
- <CrudSheet.Column<SheetItem> key="phoneNumber" header="전화번호">
219
- {({ item }) => <div class="px-2 py-1">{item.phoneNumber}</div>}
220
- </CrudSheet.Column>
221
-
222
- <CrudSheet.Column<SheetItem> key="birthDate" header="생년월일">
223
- {({ item }) => (
224
- <div class="px-2 py-1">{item.birthDate?.toFormatString("yyyy-MM-dd") ?? ""}</div>
225
- )}
226
- </CrudSheet.Column>
227
-
228
- <CrudSheet.Column<SheetItem> key="enteringDate" header="입사일자">
229
- {({ item }) => (
230
- <div class="px-2 py-1">{item.enteringDate?.toFormatString("yyyy-MM-dd") ?? ""}</div>
231
- )}
232
- </CrudSheet.Column>
233
-
234
- <CrudSheet.Column<SheetItem> key="leavingDate" header="퇴사일자">
235
- {({ item }) => (
236
- <div class={`px-2 py-1${item.leavingDate != null ? " text-warning-600" : ""}`}>
237
- {item.leavingDate?.toFormatString("yyyy-MM-dd") ?? ""}
238
- </div>
239
- )}
240
- </CrudSheet.Column>
241
-
242
- <Show when={employeePerms.auth.use}>
243
- <CrudSheet.Column<SheetItem>
244
- key="password"
245
- header={["인증정보", "비밀번호"]}
246
- sortable={false}
247
- >
248
- {() => <div class="px-2 py-1">****</div>}
249
- </CrudSheet.Column>
250
- </Show>
251
-
252
- <Show when={employeePerms.personal.use}>
253
- <CrudSheet.Column<SheetItem> key="socialSecurityNumber" header={["개인정보", "주민번호"]}>
254
- {({ item }) => <div class="px-2 py-1">{item.socialSecurityNumber}</div>}
255
- </CrudSheet.Column>
256
- </Show>
257
-
258
- <Show when={employeePerms.payroll.use}>
259
- <CrudSheet.Column<SheetItem> key="payrollAccountBank" header={["급여정보", "계좌은행"]}>
260
- {({ item }) => <div class="px-2 py-1">{item.payrollAccountBank}</div>}
261
- </CrudSheet.Column>
262
- </Show>
263
-
264
- <Show when={employeePerms.payroll.use}>
265
- <CrudSheet.Column<SheetItem> key="payrollAccountNumber" header={["급여정보", "계좌번호"]}>
266
- {({ item }) => <div class="px-2 py-1">{item.payrollAccountNumber}</div>}
267
- </CrudSheet.Column>
268
- </Show>
269
- </CrudSheet>
270
- );
271
- }
@@ -1,146 +0,0 @@
1
- import { createMemo } from "solid-js";
2
- import { CrudDetail, FormTable, TextInput, useSharedData } from "@simplysm/solid";
3
- import { expr } from "@{{projectName}}/db-main";
4
- import { useAuth } from "../../../../providers/AuthProvider";
5
- import { useAppService } from "../../../../providers/AppServiceProvider";
6
- import type { AppSharedData } from "../../../../providers/configureSharedData";
7
-
8
- type DetailData = {
9
- name?: string;
10
- isDeleted: boolean;
11
- };
12
-
13
- export function RoleDetail(props: { itemId?: number }) {
14
- const auth = useAuth();
15
- const appService = useAppService();
16
- const sharedData = useSharedData<AppSharedData>();
17
-
18
- const perms = createMemo(() => {
19
- const p = auth.authInfo()?.permissions ?? {};
20
- return {
21
- edit: Boolean(p["/home/base/role-permission/edit"]),
22
- };
23
- });
24
-
25
- async function handleLoad() {
26
- if (props.itemId == null) {
27
- return {
28
- data: { isDeleted: false } as DetailData,
29
- info: { isNew: true, isDeleted: false },
30
- };
31
- }
32
-
33
- return appService.orm.connectWithoutTransaction(async (db) => {
34
- const role = await db
35
- .role()
36
- .where((c) => [expr.eq(c.id, props.itemId)])
37
- .select((c) => ({
38
- name: c.name,
39
- isDeleted: c.isDeleted,
40
- }))
41
- .single();
42
-
43
- if (!role) throw new Error("권한그룹을 찾을 수 없습니다.");
44
-
45
- return {
46
- data: {
47
- name: role.name,
48
- isDeleted: role.isDeleted,
49
- } as DetailData,
50
- info: {
51
- isNew: false,
52
- isDeleted: role.isDeleted,
53
- },
54
- };
55
- });
56
- }
57
-
58
- async function handleSubmit(data: DetailData) {
59
- // 이름 중복 검증
60
- await appService.orm.connect(async (db) => {
61
- const count = await db
62
- .role()
63
- .where((c) => [
64
- expr.eq(c.name, data.name ?? ""),
65
-
66
- props.itemId == null
67
- ? expr.eq(c.id, -1) // 신규: 절대 매칭 안 되게
68
- : expr.not(expr.eq(c.id, props.itemId)),
69
- expr.eq(c.isDeleted, false),
70
- ])
71
- .count();
72
-
73
- if (count > 0) {
74
- throw new Error("이미 존재하는 권한그룹 이름입니다.");
75
- }
76
- });
77
-
78
- // 저장
79
- const savedId = await appService.orm.connect(async (db) => {
80
- if (props.itemId == null) {
81
- const [inserted] = await db.role().insert(
82
- [
83
- {
84
- id: undefined,
85
- name: data.name ?? "",
86
- isDeleted: false,
87
- },
88
- ],
89
- ["id"],
90
- );
91
- return inserted.id;
92
- } else {
93
- await db
94
- .role()
95
- .where((_c) => [expr.eq(_c.id, props.itemId)])
96
- .update((_c) => ({
97
- name: data.name ?? "",
98
- }));
99
- return props.itemId;
100
- }
101
- });
102
-
103
- await sharedData.role.emit([savedId]);
104
- return true;
105
- }
106
-
107
- async function handleToggleDelete(del: boolean) {
108
- await appService.orm.connect(async (db) => {
109
- await db
110
- .role()
111
- .where((_c) => [expr.eq(_c.id, props.itemId!)])
112
- .update((_c) => ({
113
- isDeleted: del,
114
- }));
115
- });
116
- await sharedData.role.emit([props.itemId!]);
117
- return true;
118
- }
119
-
120
- return (
121
- <CrudDetail<DetailData>
122
- editable={perms().edit}
123
- deletable={props.itemId != null}
124
- load={handleLoad}
125
- submit={handleSubmit}
126
- toggleDelete={handleToggleDelete}
127
- >
128
- {(ctx) => (
129
- <div class="p-2">
130
- <FormTable>
131
- <FormTable.Row>
132
- <FormTable.Item label="이름">
133
- <TextInput
134
- required
135
- disabled={!perms().edit}
136
- value={ctx.data.name ?? ""}
137
- onValueChange={(v) => ctx.setData("name", v)}
138
- />
139
- </FormTable.Item>
140
- </FormTable.Row>
141
- </FormTable>
142
- </div>
143
- )}
144
- </CrudDetail>
145
- );
146
- }