@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.
- package/claude/references/sd-frontend-design.md +10 -9
- package/claude/references/sd-simplysm-v14/angular/README.md +497 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/provide-sd-angular.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/bootstrap/sd-angular-config-provider.md +16 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-command-directive.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-events.md +25 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-intersection-directive.md +36 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-invalid.md +24 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-resize-directive.md +42 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-ripple.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-router-link.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-show-effect.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/directives/sd-typed-template.md +69 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-address-search-modal.md +50 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-permission-table.md +20 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-shared-data-components.md +158 -0
- package/claude/references/sd-simplysm-v14/angular/features/sd-tiptap-editor.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/pipes/format-pipe.md +41 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-global-error-handler.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/plugins/sd-option-event-plugin.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-menu.md +65 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-modal-content-def.md +148 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/sd-toast-content-def.md +73 -0
- package/claude/references/sd-simplysm-v14/angular/provider-types/shared-data-base.md +59 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-activated-modal-provider.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-app-structure-provider.md +81 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-busy-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-file-dialog-provider.md +40 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-local-storage-provider.md +20 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-modal-provider.md +67 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-navigate-window-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-print-provider.md +25 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-service-client-factory-provider.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-shared-data-provider.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-config-provider.md +46 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-system-log-provider.md +18 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-theme-provider.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/providers/sd-toast-provider.md +65 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/_common-rules.md +336 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-a-edit-save.md +191 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-b-delete-restore.md +103 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-c-modal-view.md +198 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-d-control-view.md +109 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-e-auxiliary.md +87 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail/extension-f-complex-detail.md +202 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-detail.md +280 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-a-inline-edit.md +386 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-b-selection.md +215 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-c-inline-delete.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-d-select-modal.md +193 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-e-readonly-modal.md +140 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-f-modal-edit.md +123 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list/extension-g-excel.md +145 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/crud-list.md +377 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/data-select-button.md +368 -0
- package/claude/references/sd-simplysm-v14/angular/recipes/page-modal-container.md +238 -0
- package/claude/references/sd-simplysm-v14/angular/styling/classes.md +149 -0
- package/claude/references/sd-simplysm-v14/angular/styling/mixins.md +100 -0
- package/claude/references/sd-simplysm-v14/angular/styling/themes.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/styling/variables.md +147 -0
- package/claude/references/sd-simplysm-v14/angular/type-utilities/directive-input-signals.md +232 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-list.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-data/sd-sheet.md +212 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-additional-button.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-anchor.md +31 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-button.md +103 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox-group.md +39 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-checkbox.md +81 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-date-range-picker.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-form.md +89 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-modal-select-button.md +54 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-numpad.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-range.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-select.md +68 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-shared-data-select.md +52 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-state-preset.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-switch.md +27 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textarea.md +33 -0
- package/claude/references/sd-simplysm-v14/angular/ui-form/sd-textfield.md +145 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock-container.md +64 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-dock.md +37 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-gap.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-board.md +96 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban-lane.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-layout/sd-kanban.md +29 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-collapse.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-pagination.md +26 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-container.md +49 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-menu.md +22 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-sidebar-user.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-tab.md +51 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-container.md +97 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-menu.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar-user.md +38 -0
- package/claude/references/sd-simplysm-v14/angular/ui-navigation/sd-topbar.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-busy-container.md +69 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-confirm-modal.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-dropdown.md +40 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-modal.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-prompt-modal.md +30 -0
- package/claude/references/sd-simplysm-v14/angular/ui-overlay/sd-toast.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-barcode.md +36 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-calendar.md +34 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-echarts.md +32 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-label.md +24 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-note.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/ui-visual/sd-progress.md +23 -0
- package/claude/references/sd-simplysm-v14/angular/utils/inject-routing-signals.md +161 -0
- package/claude/references/sd-simplysm-v14/angular/utils/inject-sd-system-config-resource.md +35 -0
- package/claude/references/sd-simplysm-v14/angular/utils/mark.md +43 -0
- package/claude/references/sd-simplysm-v14/angular/utils/selection-managers.md +96 -0
- package/claude/references/sd-simplysm-v14/angular/utils/set-safe-style.md +19 -0
- package/claude/references/sd-simplysm-v14/angular/utils/setup-functions.md +93 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/README.md +38 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/apk-installer/apk-installer.md +115 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-auto-update/auto-update/auto-update.md +113 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-file-system/README.md +197 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-intent/README.md +235 -0
- package/claude/references/sd-simplysm-v14/capacitor-plugin-usb-storage/README.md +251 -0
- package/claude/references/sd-simplysm-v14/core-browser/README.md +52 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/copy-paste.md +59 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/element-prototype-extensions.md +137 -0
- package/claude/references/sd-simplysm-v14/core-browser/extensions/get-bounds.md +84 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/download-blob.md +59 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/fetch-url-bytes.md +91 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-store.md +131 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/indexed-db-virtual-fs.md +121 -0
- package/claude/references/sd-simplysm-v14/core-browser/utils/open-file-dialog.md +60 -0
- package/claude/references/sd-simplysm-v14/core-common/README.md +179 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/argument-error.md +26 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/not-implemented-error.md +33 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/sd-error.md +38 -0
- package/claude/references/sd-simplysm-v14/core-common/errors/timeout-error.md +36 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/array.md +125 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/map.md +43 -0
- package/claude/references/sd-simplysm-v14/core-common/extensions/set.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/features/debounce-queue.md +48 -0
- package/claude/references/sd-simplysm-v14/core-common/features/event-emitter.md +52 -0
- package/claude/references/sd-simplysm-v14/core-common/features/serial-queue.md +44 -0
- package/claude/references/sd-simplysm-v14/core-common/type-utils/common-types.md +100 -0
- package/claude/references/sd-simplysm-v14/core-common/type-utils/env.md +42 -0
- package/claude/references/sd-simplysm-v14/core-common/types/date-only.md +86 -0
- package/claude/references/sd-simplysm-v14/core-common/types/date-time.md +106 -0
- package/claude/references/sd-simplysm-v14/core-common/types/lazy-gc-map.md +59 -0
- package/claude/references/sd-simplysm-v14/core-common/types/time.md +62 -0
- package/claude/references/sd-simplysm-v14/core-common/types/uuid.md +41 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/bytes.md +36 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/dt.md +60 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/err.md +26 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/json.md +58 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/num.md +56 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/obj.md +107 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/path.md +30 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/primitive.md +28 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/str.md +63 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/template-strings.md +49 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/transfer.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/wait.md +35 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/xml.md +49 -0
- package/claude/references/sd-simplysm-v14/core-common/utils/zip-archive.md +77 -0
- package/claude/references/sd-simplysm-v14/core-node/README.md +59 -0
- package/claude/references/sd-simplysm-v14/core-node/features/fs-watcher.md +110 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/create-file-reporter.md +78 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/pretty-reporter.md +38 -0
- package/claude/references/sd-simplysm-v14/core-node/logging/setup-consola.md +77 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/cpx.md +128 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/fsx.md +168 -0
- package/claude/references/sd-simplysm-v14/core-node/utils/pathx.md +73 -0
- package/claude/references/sd-simplysm-v14/core-node/worker/create-worker.md +85 -0
- package/claude/references/sd-simplysm-v14/core-node/worker/worker.md +160 -0
- package/claude/references/sd-simplysm-v14/excel/README.md +66 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-cell.md +79 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-col.md +36 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-row.md +34 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-workbook.md +93 -0
- package/claude/references/sd-simplysm-v14/excel/core-classes/excel-worksheet.md +147 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-address-point.md +33 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-style-options.md +57 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-value-type.md +28 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-content-type-data.md +23 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-drawing-data.md +29 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-relationship-data.md +39 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-shared-string-data.md +42 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-style-data.md +97 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-workbook-data.md +22 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml-worksheet-data.md +68 -0
- package/claude/references/sd-simplysm-v14/excel/types/excel-xml.md +15 -0
- package/claude/references/sd-simplysm-v14/excel/utilities/excel-utils.md +101 -0
- package/claude/references/sd-simplysm-v14/excel/wrapper/excel-wrapper.md +108 -0
- package/claude/references/sd-simplysm-v14/lint/README.md +183 -0
- package/claude/references/sd-simplysm-v14/orm-common/README.md +156 -0
- package/claude/references/sd-simplysm-v14/orm-common/core/db-context.md +208 -0
- package/claude/references/sd-simplysm-v14/orm-common/core/db-transaction-error.md +64 -0
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr-unit.md +62 -0
- package/claude/references/sd-simplysm-v14/orm-common/expression/expr.md +198 -0
- package/claude/references/sd-simplysm-v14/orm-common/models/migration.md +37 -0
- package/claude/references/sd-simplysm-v14/orm-common/query-builder/create-query-builder.md +80 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/executable.md +54 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md +75 -0
- package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/queryable.md +238 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/column-builder.md +63 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/foreign-key-builder.md +137 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/index-builder.md +54 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/procedure.md +67 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/table.md +95 -0
- package/claude/references/sd-simplysm-v14/orm-common/schema-builders/view.md +71 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/data-type.md +146 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/dialect.md +151 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/expr.md +175 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/parse-query-result.md +58 -0
- package/claude/references/sd-simplysm-v14/orm-common/types/query-def.md +224 -0
- package/claude/references/sd-simplysm-v14/orm-node/README.md +65 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mssql-db-conn.md +85 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/mysql-db-conn.md +83 -0
- package/claude/references/sd-simplysm-v14/orm-node/connections/postgresql-db-conn.md +86 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-db-conn.md +62 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/create-orm.md +107 -0
- package/claude/references/sd-simplysm-v14/orm-node/core/node-db-context-executor.md +50 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-config.md +91 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn-constants.md +33 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/db-conn.md +60 -0
- package/claude/references/sd-simplysm-v14/orm-node/types/get-dialect-from-config.md +17 -0
- package/{README.md → claude/references/sd-simplysm-v14/sd-claude/README.md} +85 -84
- package/{docs → claude/references/sd-simplysm-v14/sd-claude}/assets.md +2 -2
- package/{docs → claude/references/sd-simplysm-v14/sd-claude}/hooks.md +15 -1
- package/claude/references/sd-simplysm-v14/sd-cli/README.md +138 -0
- package/claude/references/sd-simplysm-v14/sd-cli/angular-vite-plugin/sd-angular-plugin.md +60 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/build-target.md +31 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/npm-config.md +27 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-browser-support-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-build-package-config.md +21 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-capacitor-config.md +109 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-client-package-config.md +33 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-config.md +78 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-electron-config.md +27 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-package-config.md +18 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-post-publish-script-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-publish-config.md +72 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-pwa-config.md +41 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-scripts-package-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-server-package-config.md +32 -0
- package/claude/references/sd-simplysm-v14/sd-cli/config/sd-watch-hook-config.md +19 -0
- package/claude/references/sd-simplysm-v14/sd-cli/ts-compiler/sd-ts-compiler.md +158 -0
- package/claude/references/sd-simplysm-v14/service-client/README.md +74 -0
- package/claude/references/sd-simplysm-v14/service-client/features/event-client.md +93 -0
- package/claude/references/sd-simplysm-v14/service-client/features/file-client.md +63 -0
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-connector.md +89 -0
- package/claude/references/sd-simplysm-v14/service-client/features/orm-client-db-context-executor.md +31 -0
- package/claude/references/sd-simplysm-v14/service-client/main/service-client.md +206 -0
- package/claude/references/sd-simplysm-v14/service-client/protocol/client-protocol-wrapper.md +64 -0
- package/claude/references/sd-simplysm-v14/service-client/transport/service-transport.md +68 -0
- package/claude/references/sd-simplysm-v14/service-client/transport/socket-provider.md +100 -0
- package/claude/references/sd-simplysm-v14/service-client/types/blob-input.md +7 -0
- package/claude/references/sd-simplysm-v14/service-client/types/browser-worker.md +47 -0
- package/claude/references/sd-simplysm-v14/service-client/types/file-collection.md +21 -0
- package/claude/references/sd-simplysm-v14/service-client/types/service-connection-options.md +22 -0
- package/claude/references/sd-simplysm-v14/service-client/types/service-progress.md +39 -0
- package/claude/references/sd-simplysm-v14/service-common/README.md +161 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/app-structure-item.md +107 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md +57 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md +23 -0
- package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules.md +42 -0
- package/claude/references/sd-simplysm-v14/service-common/events/define-event.md +68 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/create-service-protocol.md +93 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/protocol-config.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-add-event-listener-message.md +23 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-auth-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-error-message.md +29 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-event-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-get-event-listener-infos-message.md +19 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-message.md +52 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-progress-message.md +21 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-remove-event-listener-message.md +19 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-request-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/protocol/service-response-message.md +17 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/app-structure-service.md +15 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/auto-update-service.md +20 -0
- package/claude/references/sd-simplysm-v14/service-common/service-types/orm-service.md +61 -0
- package/claude/references/sd-simplysm-v14/service-common/types/service-upload-result.md +19 -0
- package/claude/references/sd-simplysm-v14/service-server/README.md +162 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/auth-token-payload.md +18 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/sign-jwt.md +30 -0
- package/claude/references/sd-simplysm-v14/service-server/auth/verify-jwt.md +35 -0
- package/claude/references/sd-simplysm-v14/service-server/core/auth.md +64 -0
- package/claude/references/sd-simplysm-v14/service-server/core/define-service.md +81 -0
- package/claude/references/sd-simplysm-v14/service-server/core/execute-service-method.md +43 -0
- package/claude/references/sd-simplysm-v14/service-server/core/service-context.md +79 -0
- package/claude/references/sd-simplysm-v14/service-server/legacy/handle-v1-connection.md +25 -0
- package/claude/references/sd-simplysm-v14/service-server/main/create-service-server.md +32 -0
- package/claude/references/sd-simplysm-v14/service-server/main/service-server.md +113 -0
- package/claude/references/sd-simplysm-v14/service-server/protocol/server-protocol-wrapper.md +35 -0
- package/claude/references/sd-simplysm-v14/service-server/services/app-structure-service.md +59 -0
- package/claude/references/sd-simplysm-v14/service-server/services/auto-update-service.md +34 -0
- package/claude/references/sd-simplysm-v14/service-server/services/orm-service.md +43 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-http-request.md +33 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-static-file.md +29 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-http/handle-upload.md +33 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/service-socket.md +64 -0
- package/claude/references/sd-simplysm-v14/service-server/transport-socket/websocket-handler.md +57 -0
- package/claude/references/sd-simplysm-v14/service-server/types/service-server-options.md +36 -0
- package/claude/references/sd-simplysm-v14/service-server/utils/get-config.md +29 -0
- package/claude/references/sd-simplysm-v14/storage/README.md +99 -0
- package/claude/references/sd-simplysm-v14/storage/clients/ftp-storage-client.md +99 -0
- package/claude/references/sd-simplysm-v14/storage/clients/sftp-storage-client.md +108 -0
- package/claude/references/sd-simplysm-v14/storage/factory/storage-factory.md +114 -0
- package/claude/references/sd-simplysm-v14/storage/types/file-info.md +32 -0
- package/claude/references/sd-simplysm-v14/storage/types/storage-client.md +55 -0
- package/claude/references/sd-simplysm-v14/storage/types/storage-conn-config.md +34 -0
- package/claude/rules/sd-claude-rules.md +8 -8
- package/claude/rules/sd-simplysm-v14.md +33 -0
- package/claude/skills/sd-claude-docs/SKILL.md +41 -24
- package/claude/skills/sd-claude-docs/references/package-docs.md +240 -116
- package/claude/skills/sd-inner-debug/SKILL.md +1 -1
- package/claude/skills/sd-inner-review/SKILL.md +4 -2
- package/package.json +2 -3
- /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/cli.md +0 -0
- /package/{docs → claude/references/sd-simplysm-v14/sd-claude}/scripts.md +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# @simplysm/service-common
|
|
2
|
+
|
|
3
|
+
> 서비스 클라이언트(`@simplysm/service-client`)와 서버(`@simplysm/service-server`)가 공유하는 바이너리 프로토콜, 메시지 타입, 서비스 인터페이스, 앱 구조 정의 패키지.
|
|
4
|
+
> 의존성: `@simplysm/core-common`, `@simplysm/orm-common`. Node.js 및 브라우저 양쪽에서 사용 가능.
|
|
5
|
+
|
|
6
|
+
## 소비앱 설치 안내 (v14)
|
|
7
|
+
|
|
8
|
+
v14에서는 `import type`으로 타입을 직접 가져올 수 있으므로, 이전 버전에서 클라이언트-서버 간 타입 공유를 위해 필요하던 중간 패키지(`@simplysm/service-common`, `@simplysm/orm-common`)는 **소비앱의 의존성으로 불필요**하다. 서버 패키지(`@simplysm/service-server`, `@simplysm/orm-node`)의 타입을 직접 import하여 사용한다.
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
// v14: 서버 패키지에서 타입을 직접 import — common 패키지 의존성 불필요
|
|
12
|
+
import type { ServiceMethods } from "@simplysm/service-server";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @simplysm/service-common
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 하려는 작업 → 먼저 읽을 파일
|
|
22
|
+
|
|
23
|
+
| 작업 | 먼저 읽을 파일 |
|
|
24
|
+
|------|----------------|
|
|
25
|
+
| WebSocket 메시지 인코딩/디코딩 | [create-service-protocol.md](./protocol/create-service-protocol.md) |
|
|
26
|
+
| 프로토콜 상수 확인 (크기 제한, 청킹 등) | [protocol-config.md](./protocol/protocol-config.md) |
|
|
27
|
+
| 타입 안전 이벤트 정의 | [define-event.md](./events/define-event.md) |
|
|
28
|
+
| 메뉴 트리·권한 구조 정의 | [app-structure-item.md](./app-structure/app-structure-item.md) |
|
|
29
|
+
| 모듈 기반 권한 필터링 | [get-flat-permissions.md](./app-structure/get-flat-permissions.md) |
|
|
30
|
+
| ORM 서비스 타입 계약 확인 | [orm-service.md](./service-types/orm-service.md) |
|
|
31
|
+
| 메시지 타입 구조 파악 | [service-message.md](./protocol/service-message.md) |
|
|
32
|
+
|
|
33
|
+
## API Overview
|
|
34
|
+
|
|
35
|
+
### Protocol
|
|
36
|
+
|
|
37
|
+
| Entry | Kind | 언제 쓰나 |
|
|
38
|
+
|-------|------|-----------|
|
|
39
|
+
| [`PROTOCOL_CONFIG`](./protocol/protocol-config.md) | const | 프로토콜 크기 제한·청킹 임계값 등 설정 상수를 참조할 때 |
|
|
40
|
+
| [`ServiceMessage`](./protocol/service-message.md) | type | 양방향 메시지의 전체 유니언과 방향별 하위 유니언을 참조할 때 |
|
|
41
|
+
| [`ServiceProgressMessage`](./protocol/service-progress-message.md) | interface | 청크 수신 진행 상태를 처리할 때 |
|
|
42
|
+
| [`ServiceErrorMessage`](./protocol/service-error-message.md) | interface | 서버 에러 응답을 처리할 때 |
|
|
43
|
+
| [`ServiceAuthMessage`](./protocol/service-auth-message.md) | interface | 클라이언트 인증 토큰을 전송할 때 |
|
|
44
|
+
| [`ServiceRequestMessage`](./protocol/service-request-message.md) | interface | 서비스 메서드를 호출할 때 |
|
|
45
|
+
| [`ServiceResponseMessage`](./protocol/service-response-message.md) | interface | 서비스 메서드 응답을 처리할 때 |
|
|
46
|
+
| [`ServiceAddEventListenerMessage`](./protocol/service-add-event-listener-message.md) | interface | 이벤트 리스너를 등록할 때 |
|
|
47
|
+
| [`ServiceRemoveEventListenerMessage`](./protocol/service-remove-event-listener-message.md) | interface | 이벤트 리스너를 제거할 때 |
|
|
48
|
+
| [`ServiceGetEventListenerInfosMessage`](./protocol/service-get-event-listener-infos-message.md) | interface | 등록된 이벤트 리스너 정보를 조회할 때 |
|
|
49
|
+
| [`ServiceEmitEventMessage`](./protocol/service-emit-event-message.md) | interface | 클라이언트에서 이벤트를 발생시킬 때 |
|
|
50
|
+
| [`ServiceEventMessage`](./protocol/service-event-message.md) | interface | 서버에서 수신된 이벤트 알림을 처리할 때 |
|
|
51
|
+
| [`createServiceProtocol`](./protocol/create-service-protocol.md) | function | WebSocket 메시지를 인코딩/디코딩할 때 (자동 청킹·재조립 포함) |
|
|
52
|
+
|
|
53
|
+
### Service Types
|
|
54
|
+
|
|
55
|
+
| Entry | Kind | 언제 쓰나 |
|
|
56
|
+
|-------|------|-----------|
|
|
57
|
+
| [`OrmService`](./service-types/orm-service.md) | interface | DB 연결·트랜잭션·쿼리 실행의 서버-클라이언트 타입 계약을 정의할 때 |
|
|
58
|
+
| [`AutoUpdateService`](./service-types/auto-update-service.md) | interface | 클라이언트 자동 업데이트 버전 조회 타입 계약을 정의할 때 |
|
|
59
|
+
| [`AppStructureService`](./service-types/app-structure-service.md) | interface | 앱 구조 항목을 서버에서 조회하는 타입 계약을 정의할 때 |
|
|
60
|
+
|
|
61
|
+
### Types
|
|
62
|
+
|
|
63
|
+
| Entry | Kind | 언제 쓰나 |
|
|
64
|
+
|-------|------|-----------|
|
|
65
|
+
| [`ServiceUploadResult`](./types/service-upload-result.md) | interface | 파일 업로드 결과를 타입으로 사용할 때 |
|
|
66
|
+
|
|
67
|
+
### App Structure
|
|
68
|
+
|
|
69
|
+
| Entry | Kind | 언제 쓰나 |
|
|
70
|
+
|-------|------|-----------|
|
|
71
|
+
| [`AppStructureItem`](./app-structure/app-structure-item.md) | type | 앱 메뉴 트리·권한 구조를 정의할 때 |
|
|
72
|
+
| [`isUsableModules`](./app-structure/is-usable-modules.md) | function | 단일 항목의 모듈 접근 가능 여부를 판단할 때 |
|
|
73
|
+
| [`isUsableModulesChain`](./app-structure/is-usable-modules-chain.md) | function | 트리 경로 전체의 모듈 접근 가능 여부를 판단할 때 |
|
|
74
|
+
| [`getFlatPermissions`](./app-structure/get-flat-permissions.md) | function | 앱 구조 트리를 플래트닝하여 권한 목록을 얻을 때 |
|
|
75
|
+
|
|
76
|
+
### Events
|
|
77
|
+
|
|
78
|
+
| Entry | Kind | 언제 쓰나 |
|
|
79
|
+
|-------|------|-----------|
|
|
80
|
+
| [`defineEvent`](./events/define-event.md) | function | 서버-클라이언트 간 타입 안전 이벤트를 정의할 때 |
|
|
81
|
+
|
|
82
|
+
## Usage Examples
|
|
83
|
+
|
|
84
|
+
### 프로토콜 인코딩/디코딩
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { createServiceProtocol } from "@simplysm/service-common";
|
|
88
|
+
|
|
89
|
+
const protocol = createServiceProtocol();
|
|
90
|
+
|
|
91
|
+
// 메시지 인코딩 (3MB 초과 시 자동 청킹)
|
|
92
|
+
const { chunks, totalSize } = protocol.encode(uuid, {
|
|
93
|
+
name: "OrmService.connect",
|
|
94
|
+
body: [{ configName: "default" }],
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// 메시지 디코딩 (청크 자동 재조립)
|
|
98
|
+
for (const chunk of chunks) {
|
|
99
|
+
const result = protocol.decode(chunk);
|
|
100
|
+
if (result.type === "complete") {
|
|
101
|
+
// result.message: 재조립된 메시지
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 사용 후 반드시 해제
|
|
106
|
+
protocol.dispose();
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 타입 안전 이벤트 정의
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { defineEvent } from "@simplysm/service-common";
|
|
113
|
+
|
|
114
|
+
// 서버에서 이벤트 정의 + 타입 export
|
|
115
|
+
export const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
|
|
116
|
+
|
|
117
|
+
// 서버에서 이벤트 발생 (제네릭 타입 파라미터 + 문자열 이름 패턴)
|
|
118
|
+
await server.emitEvent<typeof OrderUpdated>("OrderUpdated", (info) => info.orderId === 123, { status: "shipped" });
|
|
119
|
+
|
|
120
|
+
// 클라이언트에서 구독 (import type으로 타입만 가져옴)
|
|
121
|
+
import type { OrderUpdated } from "@server-package";
|
|
122
|
+
await client.addListener<typeof OrderUpdated>("OrderUpdated", { orderId: 123 }, async (data) => {
|
|
123
|
+
// data.status는 string으로 타입 추론됨
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 앱 구조 권한 플래트닝
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
import { getFlatPermissions, isUsableModules } from "@simplysm/service-common";
|
|
131
|
+
import type { AppStructureItem } from "@simplysm/service-common";
|
|
132
|
+
|
|
133
|
+
const items: AppStructureItem<string>[] = [
|
|
134
|
+
{
|
|
135
|
+
code: "admin",
|
|
136
|
+
title: "관리",
|
|
137
|
+
children: [
|
|
138
|
+
{ code: "user", title: "사용자", perms: ["use", "edit"] },
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
code: "report",
|
|
143
|
+
title: "리포트",
|
|
144
|
+
modules: ["moduleA"],
|
|
145
|
+
perms: ["use"],
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
// 활성 모듈 기준으로 권한 플래트닝
|
|
150
|
+
const perms = getFlatPermissions(items, ["moduleA"]);
|
|
151
|
+
// [{ codeChain: ["admin", "user", "use"], ... }, { codeChain: ["admin", "user", "edit"], ... }, ...]
|
|
152
|
+
|
|
153
|
+
// 개별 모듈 접근 가능 여부 확인
|
|
154
|
+
const canAccess = isUsableModules(["moduleA", "moduleB"], undefined, ["moduleA"]); // true (OR 조건)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 이 패키지를 쓰지 말아야 할 때
|
|
158
|
+
|
|
159
|
+
- 서버 로직 구현 (서비스 메서드 등록, WebSocket 핸들링) → `@simplysm/service-server`
|
|
160
|
+
- 클라이언트에서 서버 호출 (RPC, 이벤트 구독) → `@simplysm/service-client`
|
|
161
|
+
- v14 소비앱에서 타입만 필요할 때 → 서버 패키지에서 직접 `import type`
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# AppStructureItem
|
|
2
|
+
|
|
3
|
+
앱 구조 항목 유니언 타입. `children` 필드 유무로 그룹(`AppStructureGroupItem`)과 리프(`AppStructureLeafItem`)를 구분한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export type AppStructureItem<TModule = unknown> =
|
|
7
|
+
| AppStructureGroupItem<TModule>
|
|
8
|
+
| AppStructureLeafItem<TModule>;
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`TModule` 제네릭은 모듈 식별자 타입이다 (일반적으로 `string`).
|
|
12
|
+
|
|
13
|
+
## Related Types
|
|
14
|
+
|
|
15
|
+
### `AppStructureGroupItem`
|
|
16
|
+
|
|
17
|
+
자식을 가진 그룹 메뉴 항목. `children` 필드로 하위 항목을 재귀적으로 포함한다.
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
export interface AppStructureGroupItem<TModule> {
|
|
21
|
+
code: string;
|
|
22
|
+
title: string;
|
|
23
|
+
modules?: TModule[];
|
|
24
|
+
requiredModules?: TModule[];
|
|
25
|
+
icon?: string;
|
|
26
|
+
children: AppStructureItem<TModule>[];
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Field | Type | Description |
|
|
31
|
+
|-------|------|-------------|
|
|
32
|
+
| `code` | `string` | 항목 코드 (권한 코드 체인에 사용) |
|
|
33
|
+
| `title` | `string` | 표시 이름 |
|
|
34
|
+
| `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건: 하나라도 있으면 접근 가능) |
|
|
35
|
+
| `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건: 모두 있어야 접근 가능) |
|
|
36
|
+
| `icon` | `string?` | 아이콘 식별자 |
|
|
37
|
+
| `children` | `AppStructureItem<TModule>[]` | 하위 메뉴 항목 배열 |
|
|
38
|
+
|
|
39
|
+
### `AppStructureLeafItem`
|
|
40
|
+
|
|
41
|
+
말단 메뉴 항목. 실제 페이지 URL과 권한(`perms`)을 가진다.
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
export interface AppStructureLeafItem<TModule> {
|
|
45
|
+
code: string;
|
|
46
|
+
title: string;
|
|
47
|
+
modules?: TModule[];
|
|
48
|
+
requiredModules?: TModule[];
|
|
49
|
+
perms?: ("use" | "edit")[];
|
|
50
|
+
subPerms?: AppStructureSubPermission<TModule>[];
|
|
51
|
+
icon?: string;
|
|
52
|
+
url?: string;
|
|
53
|
+
isNotMenu?: boolean;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
| Field | Type | Description |
|
|
58
|
+
|-------|------|-------------|
|
|
59
|
+
| `code` | `string` | 항목 코드 |
|
|
60
|
+
| `title` | `string` | 표시 이름 |
|
|
61
|
+
| `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건) |
|
|
62
|
+
| `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건) |
|
|
63
|
+
| `perms` | `("use" \| "edit")[]?` | 이 항목에 부여 가능한 권한 종류 |
|
|
64
|
+
| `subPerms` | `AppStructureSubPermission<TModule>[]?` | 하위 권한 정의 배열 |
|
|
65
|
+
| `icon` | `string?` | 아이콘 식별자 |
|
|
66
|
+
| `url` | `string?` | 페이지 URL |
|
|
67
|
+
| `isNotMenu` | `boolean?` | `true`이면 메뉴에 표시하지 않음 |
|
|
68
|
+
|
|
69
|
+
### `AppStructureSubPermission`
|
|
70
|
+
|
|
71
|
+
리프 항목의 하위 권한 정의. 각 하위 권한도 모듈 접근 제어를 가진다.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
export interface AppStructureSubPermission<TModule> {
|
|
75
|
+
code: string;
|
|
76
|
+
title: string;
|
|
77
|
+
modules?: TModule[];
|
|
78
|
+
requiredModules?: TModule[];
|
|
79
|
+
perms: ("use" | "edit")[];
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
| Field | Type | Description |
|
|
84
|
+
|-------|------|-------------|
|
|
85
|
+
| `code` | `string` | 하위 권한 코드 |
|
|
86
|
+
| `title` | `string` | 하위 권한 표시 이름 |
|
|
87
|
+
| `modules` | `TModule[]?` | 접근에 필요한 모듈 목록 (OR 조건) |
|
|
88
|
+
| `requiredModules` | `TModule[]?` | 접근에 필수인 모듈 목록 (AND 조건) |
|
|
89
|
+
| `perms` | `("use" \| "edit")[]` | 부여 가능한 권한 종류 |
|
|
90
|
+
|
|
91
|
+
### `FlatPermission`
|
|
92
|
+
|
|
93
|
+
트리를 플래트닝한 권한 결과. [`getFlatPermissions`](./get-flat-permissions.md)의 반환 타입이다.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
export interface FlatPermission<TModule = unknown> {
|
|
97
|
+
titleChain: string[];
|
|
98
|
+
codeChain: string[];
|
|
99
|
+
modulesChain: TModule[][];
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
| Field | Type | Description |
|
|
104
|
+
|-------|------|-------------|
|
|
105
|
+
| `titleChain` | `string[]` | 루트부터 현재 권한까지의 표시 이름 체인 (예: `["관리", "사용자"]`) |
|
|
106
|
+
| `codeChain` | `string[]` | 루트부터 현재 권한까지의 코드 체인 (예: `["admin", "user", "use"]`) |
|
|
107
|
+
| `modulesChain` | `TModule[][]` | 각 레벨에서 필요한 모듈 목록의 체인 |
|
package/claude/references/sd-simplysm-v14/service-common/app-structure/get-flat-permissions.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# getFlatPermissions
|
|
2
|
+
|
|
3
|
+
앱 구조 트리를 BFS로 순회하며 모듈 조건을 필터링하여 [`FlatPermission`](./app-structure-item.md)`[]`으로 플래트닝한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function getFlatPermissions<TModule>(
|
|
7
|
+
items: AppStructureItem<TModule>[],
|
|
8
|
+
usableModules: TModule[] | undefined,
|
|
9
|
+
): FlatPermission<TModule>[];
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Parameters
|
|
13
|
+
|
|
14
|
+
| Param | Type | Description |
|
|
15
|
+
|-------|------|-------------|
|
|
16
|
+
| `items` | `AppStructureItem<TModule>[]` | 앱 구조 트리의 최상위 항목 배열 |
|
|
17
|
+
| `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록. `undefined`이면 모듈 조건이 없는 항목만 포함 |
|
|
18
|
+
|
|
19
|
+
## Returns
|
|
20
|
+
|
|
21
|
+
`FlatPermission<TModule>[]` — 모듈 조건을 만족하는 모든 권한의 플랫 목록.
|
|
22
|
+
|
|
23
|
+
처리 로직:
|
|
24
|
+
1. BFS로 트리를 순회하며 각 레벨의 `modules`(OR)와 `requiredModules`(AND) 조건을 체크
|
|
25
|
+
2. 조건 미충족 항목은 하위 트리 전체를 건너뜀
|
|
26
|
+
3. `AppStructureLeafItem`의 `perms`를 `codeChain`에 추가하여 `FlatPermission` 생성
|
|
27
|
+
4. `subPerms`도 개별 모듈 조건을 체크하여 `FlatPermission`으로 변환
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { getFlatPermissions } from "@simplysm/service-common";
|
|
33
|
+
import type { AppStructureItem } from "@simplysm/service-common";
|
|
34
|
+
|
|
35
|
+
const items: AppStructureItem<string>[] = [
|
|
36
|
+
{
|
|
37
|
+
code: "admin",
|
|
38
|
+
title: "관리",
|
|
39
|
+
children: [
|
|
40
|
+
{ code: "user", title: "사용자", perms: ["use", "edit"] },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
code: "report",
|
|
45
|
+
title: "리포트",
|
|
46
|
+
modules: ["moduleA"],
|
|
47
|
+
perms: ["use"],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
const perms = getFlatPermissions(items, ["moduleA"]);
|
|
52
|
+
// [
|
|
53
|
+
// { titleChain: ["관리", "사용자"], codeChain: ["admin", "user", "use"], modulesChain: [] },
|
|
54
|
+
// { titleChain: ["관리", "사용자"], codeChain: ["admin", "user", "edit"], modulesChain: [] },
|
|
55
|
+
// { titleChain: ["리포트"], codeChain: ["report", "use"], modulesChain: [["moduleA"]] },
|
|
56
|
+
// ]
|
|
57
|
+
```
|
package/claude/references/sd-simplysm-v14/service-common/app-structure/is-usable-modules-chain.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# isUsableModulesChain
|
|
2
|
+
|
|
3
|
+
모듈 체인 전체의 접근 가능 여부를 판단한다. 트리의 각 레벨에서 모듈 조건을 모두 만족해야 한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function isUsableModulesChain<TModule>(
|
|
7
|
+
modulesChain: TModule[][],
|
|
8
|
+
requiredModulesChain: TModule[][],
|
|
9
|
+
usableModules: TModule[] | undefined,
|
|
10
|
+
): boolean;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Parameters
|
|
14
|
+
|
|
15
|
+
| Param | Type | Description |
|
|
16
|
+
|-------|------|-------------|
|
|
17
|
+
| `modulesChain` | `TModule[][]` | 각 레벨의 OR 조건 모듈 배열 |
|
|
18
|
+
| `requiredModulesChain` | `TModule[][]` | 각 레벨의 AND 조건 모듈 배열 |
|
|
19
|
+
| `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록 |
|
|
20
|
+
|
|
21
|
+
## Returns
|
|
22
|
+
|
|
23
|
+
`boolean` — 모든 레벨의 조건을 만족하면 `true`. 하나라도 실패하면 `false`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# isUsableModules
|
|
2
|
+
|
|
3
|
+
단일 항목의 모듈 접근 가능 여부를 판단한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function isUsableModules<TModule>(
|
|
7
|
+
modules: TModule[] | undefined,
|
|
8
|
+
requiredModules: TModule[] | undefined,
|
|
9
|
+
usableModules: TModule[] | undefined,
|
|
10
|
+
): boolean;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Parameters
|
|
14
|
+
|
|
15
|
+
| Param | Type | Description |
|
|
16
|
+
|-------|------|-------------|
|
|
17
|
+
| `modules` | `TModule[] \| undefined` | OR 조건 모듈 목록. 하나라도 `usableModules`에 포함되면 통과 |
|
|
18
|
+
| `requiredModules` | `TModule[] \| undefined` | AND 조건 모듈 목록. 모두 `usableModules`에 포함되어야 통과 |
|
|
19
|
+
| `usableModules` | `TModule[] \| undefined` | 사용자가 보유한 활성 모듈 목록 |
|
|
20
|
+
|
|
21
|
+
## Returns
|
|
22
|
+
|
|
23
|
+
`boolean` — `modules`와 `requiredModules` 조건을 모두 만족하면 `true`.
|
|
24
|
+
|
|
25
|
+
- `modules`가 `undefined`이거나 빈 배열이면 OR 조건은 자동 통과
|
|
26
|
+
- `requiredModules`가 `undefined`이거나 빈 배열이면 AND 조건은 자동 통과
|
|
27
|
+
- `usableModules`가 `undefined`이면 `modules`가 있을 때 `false`
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { isUsableModules } from "@simplysm/service-common";
|
|
33
|
+
|
|
34
|
+
// OR 조건: moduleA 또는 moduleB 중 하나라도 있으면 true
|
|
35
|
+
isUsableModules(["moduleA", "moduleB"], undefined, ["moduleA"]); // true
|
|
36
|
+
|
|
37
|
+
// AND 조건: 모두 있어야 true
|
|
38
|
+
isUsableModules(undefined, ["moduleA", "moduleB"], ["moduleA"]); // false
|
|
39
|
+
|
|
40
|
+
// 모듈 없음: 자동 통과
|
|
41
|
+
isUsableModules(undefined, undefined, undefined); // true
|
|
42
|
+
```
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# defineEvent
|
|
2
|
+
|
|
3
|
+
타입 안전한 서비스 이벤트를 정의하는 팩토리 함수.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function defineEvent<TInfo = unknown, TData = unknown>(
|
|
7
|
+
eventName: string,
|
|
8
|
+
): ServiceEventDef<TInfo, TData>;
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
| Param | Type | Description |
|
|
14
|
+
|-------|------|-------------|
|
|
15
|
+
| `eventName` | `string` | 이벤트 이름 (고유해야 함) |
|
|
16
|
+
|
|
17
|
+
| Type Parameter | Default | Description |
|
|
18
|
+
|---------------|---------|-------------|
|
|
19
|
+
| `TInfo` | `unknown` | 이벤트 필터링 조건의 타입. 구독 시 필터로 사용 |
|
|
20
|
+
| `TData` | `unknown` | 이벤트 페이로드의 타입. 이벤트 발생/수신 시 데이터 타입 |
|
|
21
|
+
|
|
22
|
+
## Returns
|
|
23
|
+
|
|
24
|
+
`ServiceEventDef<TInfo, TData>` — 이벤트 정의 인스턴스.
|
|
25
|
+
|
|
26
|
+
## Related Types
|
|
27
|
+
|
|
28
|
+
### `ServiceEventDef`
|
|
29
|
+
|
|
30
|
+
`defineEvent()`로 생성된 이벤트 정의. `$info`와 `$data`는 런타임에서 사용되지 않는 타입 전용 마커다.
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
export interface ServiceEventDef<TInfo = unknown, TData = unknown> {
|
|
34
|
+
eventName: string;
|
|
35
|
+
readonly $info: TInfo;
|
|
36
|
+
readonly $data: TData;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Field | Type | Description |
|
|
41
|
+
|-------|------|-------------|
|
|
42
|
+
| `eventName` | `string` | 이벤트 이름 |
|
|
43
|
+
| `$info` | `TInfo` | 타입 추출 전용 마커 (런타임에서 사용하지 않음). 이벤트 필터링 조건 타입 |
|
|
44
|
+
| `$data` | `TData` | 타입 추출 전용 마커 (런타임에서 사용하지 않음). 이벤트 페이로드 타입 |
|
|
45
|
+
|
|
46
|
+
## Usage
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { defineEvent } from "@simplysm/service-common";
|
|
50
|
+
|
|
51
|
+
// 서버에서 이벤트 정의 + 타입 export
|
|
52
|
+
export const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
|
|
53
|
+
|
|
54
|
+
// 서버에서 이벤트 발생 — getEvent() 프록시 방식 (권장)
|
|
55
|
+
const orderEvt = server.getEvent<typeof OrderUpdated>("OrderUpdated");
|
|
56
|
+
await orderEvt.emit((info) => info.orderId === 123, { status: "shipped" });
|
|
57
|
+
|
|
58
|
+
// 클라이언트에서 구독 (import type으로 타입만 가져옴)
|
|
59
|
+
import type { OrderUpdated } from "@server-package";
|
|
60
|
+
const orderEvt = client.getEvent<typeof OrderUpdated>("OrderUpdated");
|
|
61
|
+
const key = await orderEvt.addListener({ orderId: 123 }, async (data) => {
|
|
62
|
+
// data.status는 string으로 타입 추론됨
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// 직접 호출 방식 (하위 호환)
|
|
66
|
+
await server.emitEvent<typeof OrderUpdated>("OrderUpdated", (info) => info.orderId === 123, { status: "shipped" });
|
|
67
|
+
await client.addListener<typeof OrderUpdated>("OrderUpdated", { orderId: 123 }, async (data) => { /* ... */ });
|
|
68
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# createServiceProtocol
|
|
2
|
+
|
|
3
|
+
ServiceProtocol 인스턴스를 생성하는 팩토리 함수.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function createServiceProtocol(): ServiceProtocol;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
내부에 `LazyGcMap` 기반 청크 누적기를 캡슐화한다. 미완성 메시지는 60초 후 GC로 자동 정리된다. 사용 후 반드시 `dispose()`를 호출하여 GC 타이머를 해제해야 한다.
|
|
10
|
+
|
|
11
|
+
## Returns
|
|
12
|
+
|
|
13
|
+
`ServiceProtocol` — 인코딩/디코딩/해제 메서드를 포함한 프로토콜 인스턴스.
|
|
14
|
+
|
|
15
|
+
## Related Types
|
|
16
|
+
|
|
17
|
+
### `ServiceProtocol`
|
|
18
|
+
|
|
19
|
+
바이너리 프로토콜 V2 인코더/디코더 인터페이스.
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
export interface ServiceProtocol {
|
|
23
|
+
encode(uuid: string, message: ServiceMessage): { chunks: Bytes[]; totalSize: number };
|
|
24
|
+
decode<T extends ServiceMessage>(bytes: Bytes): ServiceMessageDecodeResult<T>;
|
|
25
|
+
dispose(): void;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
| Method | Parameters | Return | Description |
|
|
30
|
+
|--------|-----------|--------|-------------|
|
|
31
|
+
| `encode` | `uuid: string, message: ServiceMessage` | `{ chunks: Bytes[]; totalSize: number }` | 메시지를 인코딩한다. 3MB 초과 시 300KB 청크로 자동 분할. `totalSize` > 100MB이면 `ArgumentError` 발생 |
|
|
32
|
+
| `decode` | `bytes: Bytes` | `ServiceMessageDecodeResult<T>` | 청크를 디코딩한다. 청크가 모두 도착하면 `complete`, 아니면 `progress` 반환 |
|
|
33
|
+
| `dispose` | 없음 | `void` | 내부 GC 타이머와 청크 누적기를 해제한다. 사용 후 반드시 호출 |
|
|
34
|
+
|
|
35
|
+
헤더 구조 (28바이트, Big Endian):
|
|
36
|
+
|
|
37
|
+
| Offset | Size | Field |
|
|
38
|
+
|--------|------|-------|
|
|
39
|
+
| 0 | 16 | UUID (바이너리) |
|
|
40
|
+
| 16 | 8 | TotalSize (uint64, 상위 4바이트 = 0) |
|
|
41
|
+
| 24 | 4 | Index (uint32) |
|
|
42
|
+
|
|
43
|
+
### `ServiceMessageDecodeResult`
|
|
44
|
+
|
|
45
|
+
메시지 디코딩 결과 유니언 타입. `type` 필드로 분기한다.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
export type ServiceMessageDecodeResult<TMessage extends ServiceMessage> =
|
|
49
|
+
| { type: "complete"; uuid: string; message: TMessage }
|
|
50
|
+
| { type: "progress"; uuid: string; totalSize: number; completedSize: number };
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Variant: `complete`** — 모든 청크가 도착하여 메시지 재조립이 완료된 상태.
|
|
54
|
+
|
|
55
|
+
| Field | Type | Description |
|
|
56
|
+
|-------|------|-------------|
|
|
57
|
+
| `type` | `"complete"` | discriminant |
|
|
58
|
+
| `uuid` | `string` | 메시지 UUID |
|
|
59
|
+
| `message` | `TMessage` | 재조립된 메시지 |
|
|
60
|
+
|
|
61
|
+
**Variant: `progress`** — 청크 메시지 수신 진행 중.
|
|
62
|
+
|
|
63
|
+
| Field | Type | Description |
|
|
64
|
+
|-------|------|-------------|
|
|
65
|
+
| `type` | `"progress"` | discriminant |
|
|
66
|
+
| `uuid` | `string` | 메시지 UUID |
|
|
67
|
+
| `totalSize` | `number` | 전체 크기 (바이트) |
|
|
68
|
+
| `completedSize` | `number` | 수신 완료된 크기 (바이트) |
|
|
69
|
+
|
|
70
|
+
## Usage
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { createServiceProtocol } from "@simplysm/service-common";
|
|
74
|
+
|
|
75
|
+
const protocol = createServiceProtocol();
|
|
76
|
+
|
|
77
|
+
// 메시지 인코딩 (3MB 초과 시 자동 청킹)
|
|
78
|
+
const { chunks, totalSize } = protocol.encode(uuid, {
|
|
79
|
+
name: "OrmService.connect",
|
|
80
|
+
body: [{ configName: "default" }],
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// 메시지 디코딩 (청크 자동 재조립)
|
|
84
|
+
for (const chunk of chunks) {
|
|
85
|
+
const result = protocol.decode(chunk);
|
|
86
|
+
if (result.type === "complete") {
|
|
87
|
+
// result.message: 재조립된 메시지
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// 사용 후 반드시 해제
|
|
92
|
+
protocol.dispose();
|
|
93
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# PROTOCOL_CONFIG
|
|
2
|
+
|
|
3
|
+
서비스 프로토콜 설정 상수.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export const PROTOCOL_CONFIG = {
|
|
7
|
+
MAX_TOTAL_SIZE: 100 * 1024 * 1024,
|
|
8
|
+
SPLIT_MESSAGE_SIZE: 3 * 1024 * 1024,
|
|
9
|
+
CHUNK_SIZE: 300 * 1024,
|
|
10
|
+
GC_INTERVAL: 10 * 1000,
|
|
11
|
+
EXPIRE_TIME: 60 * 1000,
|
|
12
|
+
} as const;
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Field | Type | Description |
|
|
16
|
+
|-------|------|-------------|
|
|
17
|
+
| `MAX_TOTAL_SIZE` | `number` | 단일 메시지의 최대 허용 크기 (100MB). 초과 시 `ArgumentError` 발생 |
|
|
18
|
+
| `SPLIT_MESSAGE_SIZE` | `number` | 이 크기를 초과하면 자동으로 청크 분할 (3MB) |
|
|
19
|
+
| `CHUNK_SIZE` | `number` | 분할된 각 청크의 크기 (300KB) |
|
|
20
|
+
| `GC_INTERVAL` | `number` | 내부 청크 누적기의 가비지 컬렉션 주기 (10초, 밀리초 단위) |
|
|
21
|
+
| `EXPIRE_TIME` | `number` | 미완성 청크 메시지의 만료 시간 (60초). 이 시간 내에 모든 청크가 도착하지 않으면 제거 |
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ServiceAddEventListenerMessage
|
|
2
|
+
|
|
3
|
+
클라이언트가 보내는 이벤트 리스너 추가 메시지.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface ServiceAddEventListenerMessage {
|
|
7
|
+
name: "evt:add";
|
|
8
|
+
body: {
|
|
9
|
+
key: string;
|
|
10
|
+
name: string;
|
|
11
|
+
info: unknown;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Members
|
|
17
|
+
|
|
18
|
+
| Field | Type | Description |
|
|
19
|
+
|-------|------|-------------|
|
|
20
|
+
| `name` | `"evt:add"` | 고정 문자열 discriminant |
|
|
21
|
+
| `body.key` | `string` | 리스너 키 (UUID). `ServiceRemoveEventListenerMessage`에서 사용 |
|
|
22
|
+
| `body.name` | `string` | 이벤트 이름 (`ServiceEventDef.eventName`) |
|
|
23
|
+
| `body.info` | `unknown` | 이벤트 발생 시 필터링을 위한 추가 리스너 정보 |
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ServiceAuthMessage
|
|
2
|
+
|
|
3
|
+
클라이언트가 보내는 인증 메시지.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface ServiceAuthMessage {
|
|
7
|
+
name: "auth";
|
|
8
|
+
body: string;
|
|
9
|
+
}
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Members
|
|
13
|
+
|
|
14
|
+
| Field | Type | Description |
|
|
15
|
+
|-------|------|-------------|
|
|
16
|
+
| `name` | `"auth"` | 고정 문자열 discriminant |
|
|
17
|
+
| `body` | `string` | 인증 토큰 |
|
package/claude/references/sd-simplysm-v14/service-common/protocol/service-emit-event-message.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# ServiceEmitEventMessage
|
|
2
|
+
|
|
3
|
+
클라이언트가 보내는 이벤트 발생 메시지.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface ServiceEmitEventMessage {
|
|
7
|
+
name: "evt:emit";
|
|
8
|
+
body: {
|
|
9
|
+
keys: string[];
|
|
10
|
+
data: unknown;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Members
|
|
16
|
+
|
|
17
|
+
| Field | Type | Description |
|
|
18
|
+
|-------|------|-------------|
|
|
19
|
+
| `name` | `"evt:emit"` | 고정 문자열 discriminant |
|
|
20
|
+
| `body.keys` | `string[]` | 대상 리스너 키 목록 |
|
|
21
|
+
| `body.data` | `unknown` | 이벤트 데이터 |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# ServiceErrorMessage
|
|
2
|
+
|
|
3
|
+
서버가 보내는 에러 알림 메시지.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export interface ServiceErrorMessage {
|
|
7
|
+
name: "error";
|
|
8
|
+
body: {
|
|
9
|
+
name: string;
|
|
10
|
+
message: string;
|
|
11
|
+
code: string;
|
|
12
|
+
stack?: string;
|
|
13
|
+
detail?: unknown;
|
|
14
|
+
cause?: unknown;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Members
|
|
20
|
+
|
|
21
|
+
| Field | Type | Description |
|
|
22
|
+
|-------|------|-------------|
|
|
23
|
+
| `name` | `"error"` | 고정 문자열 discriminant |
|
|
24
|
+
| `body.name` | `string` | 에러 이름 (클래스명) |
|
|
25
|
+
| `body.message` | `string` | 에러 메시지 |
|
|
26
|
+
| `body.code` | `string` | 에러 코드 |
|
|
27
|
+
| `body.stack` | `string?` | 스택 트레이스 (선택) |
|
|
28
|
+
| `body.detail` | `unknown?` | 추가 상세 정보 (선택) |
|
|
29
|
+
| `body.cause` | `unknown?` | 원인 에러 (선택) |
|