@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,54 @@
|
|
|
1
|
+
# Executable
|
|
2
|
+
|
|
3
|
+
Stored Procedure 실행 래퍼 클래스. `DbContext.executable()`로 등록된 프로퍼티를 호출하면 반환된다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class Executable<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {
|
|
7
|
+
constructor(
|
|
8
|
+
db: DbContextBase,
|
|
9
|
+
builder: ProcedureBuilder<TParams, TReturns>,
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Members
|
|
15
|
+
|
|
16
|
+
| Member | Kind | Type | Description |
|
|
17
|
+
|--------|------|------|-------------|
|
|
18
|
+
| `execute(params)` | method | `Promise<InferColumnExprs<TReturns>[][]>` | 프로시저 실행. 결과는 결과 셋 배열의 배열 |
|
|
19
|
+
| `getExecProcQueryDef(params?)` | method | `ExecProcQueryDef` | 실행 없이 QueryDef만 반환 |
|
|
20
|
+
|
|
21
|
+
## Related Types
|
|
22
|
+
|
|
23
|
+
### `executable` (팩토리 함수)
|
|
24
|
+
|
|
25
|
+
`DbContext.executable()`이 내부적으로 사용하는 팩토리 함수.
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
export function executable<
|
|
29
|
+
TParams extends ColumnBuilderRecord,
|
|
30
|
+
TReturns extends ColumnBuilderRecord,
|
|
31
|
+
>(
|
|
32
|
+
db: DbContextBase,
|
|
33
|
+
builder: ProcedureBuilder<TParams, TReturns>,
|
|
34
|
+
): () => Executable<TParams, TReturns>;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// 프로시저 정의
|
|
41
|
+
const GetUserById = Procedure("GetUserById")
|
|
42
|
+
.database("mydb")
|
|
43
|
+
.params((c) => ({ userId: c.bigint() }))
|
|
44
|
+
.returns((c) => ({ id: c.bigint(), name: c.varchar(100) }))
|
|
45
|
+
.body("SELECT id, name FROM User WHERE id = userId");
|
|
46
|
+
|
|
47
|
+
// DbContext에 등록
|
|
48
|
+
class MyDb extends DbContext {
|
|
49
|
+
getUserById = this.executable(GetUserById);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// 실행
|
|
53
|
+
const [[user]] = await db.getUserById().execute({ userId: 1n });
|
|
54
|
+
```
|
package/claude/references/sd-simplysm-v14/orm-common/queryable-executable/parse-search-query.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# parseSearchQuery
|
|
2
|
+
|
|
3
|
+
사용자 입력 검색 텍스트를 파싱하여 SQL LIKE 패턴으로 변환한다. `Queryable.search()`가 내부적으로 사용한다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function parseSearchQuery(searchText: string): ParsedSearchQuery;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Parameters
|
|
10
|
+
|
|
11
|
+
| Param | Type | Description |
|
|
12
|
+
|-------|------|-------------|
|
|
13
|
+
| `searchText` | `string` | 검색 쿼리 문자열 |
|
|
14
|
+
|
|
15
|
+
## Returns
|
|
16
|
+
|
|
17
|
+
`ParsedSearchQuery` — 파싱된 검색 쿼리 객체
|
|
18
|
+
|
|
19
|
+
## Related Types
|
|
20
|
+
|
|
21
|
+
### `ParsedSearchQuery`
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
export interface ParsedSearchQuery {
|
|
25
|
+
/** 일반 검색어 (OR 조건) - LIKE 패턴 */
|
|
26
|
+
or: string[];
|
|
27
|
+
/** 필수 검색어 (AND 조건, + 접두사 또는 따옴표) - LIKE 패턴 */
|
|
28
|
+
must: string[];
|
|
29
|
+
/** 제외 검색어 (NOT 조건, - 접두사) - LIKE 패턴 */
|
|
30
|
+
not: string[];
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 검색 구문
|
|
35
|
+
|
|
36
|
+
| 구문 | 의미 | 예시 |
|
|
37
|
+
|------|------|------|
|
|
38
|
+
| `term1 term2` | OR (하나 이상 일치) | `apple banana` |
|
|
39
|
+
| `+term` | 필수 포함 (AND) | `+apple +banana` |
|
|
40
|
+
| `-term` | 제외 (NOT) | `apple -banana` |
|
|
41
|
+
| `"exact phrase"` | 정확한 구문 일치 (필수) | `"맛있는 과일"` |
|
|
42
|
+
| `*` | 와일드카드 | `app*` → `app%` |
|
|
43
|
+
|
|
44
|
+
## 이스케이프 시퀀스
|
|
45
|
+
|
|
46
|
+
| 입력 | 의미 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| `\\` | 리터럴 `\` |
|
|
49
|
+
| `\*` | 리터럴 `*` |
|
|
50
|
+
| `\%` | 리터럴 `%` |
|
|
51
|
+
| `\"` | 리터럴 `"` |
|
|
52
|
+
| `\+` | 리터럴 `+` |
|
|
53
|
+
| `\-` | 리터럴 `-` |
|
|
54
|
+
|
|
55
|
+
## Usage
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
parseSearchQuery('apple "delicious fruit" -banana +strawberry')
|
|
59
|
+
// {
|
|
60
|
+
// or: ["%apple%"],
|
|
61
|
+
// must: ["%delicious fruit%", "%strawberry%"],
|
|
62
|
+
// not: ["%banana%"]
|
|
63
|
+
// }
|
|
64
|
+
|
|
65
|
+
parseSearchQuery('app* test')
|
|
66
|
+
// {
|
|
67
|
+
// or: ["app%", "%test%"],
|
|
68
|
+
// must: [],
|
|
69
|
+
// not: []
|
|
70
|
+
// }
|
|
71
|
+
|
|
72
|
+
// Queryable.search()와 함께 사용
|
|
73
|
+
db.user()
|
|
74
|
+
.search((u) => [u.name, u.email], "John +admin -deleted")
|
|
75
|
+
```
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# Queryable
|
|
2
|
+
|
|
3
|
+
SELECT/INSERT/UPDATE/DELETE/UPSERT 체인 빌더. 메서드 체이닝으로 쿼리를 구성하고 `execute()` 계열 메서드로 실행한다. `DbContext.queryable()`로 등록된 프로퍼티를 호출하면 반환된다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class Queryable<
|
|
7
|
+
TData extends DataRecord,
|
|
8
|
+
TFrom extends TableBuilder<any, any> | never,
|
|
9
|
+
> {
|
|
10
|
+
constructor(readonly meta: QueryableMeta<TData>);
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`TFrom`은 CUD(INSERT/UPDATE/DELETE) 연산에 필요한 TableBuilder 타입이다. VIEW 기반이거나 `select()`로 변환된 경우 `never`가 되어 CUD 메서드를 사용할 수 없다.
|
|
15
|
+
|
|
16
|
+
## Members
|
|
17
|
+
|
|
18
|
+
### SELECT 옵션
|
|
19
|
+
|
|
20
|
+
| Member | Kind | Type | Description |
|
|
21
|
+
|--------|------|------|-------------|
|
|
22
|
+
| `select(fn)` | method | `Queryable<R, never>` | SELECT할 column 지정. fn이 반환한 구조로 결과 타입 변환 |
|
|
23
|
+
| `distinct()` | method | `Queryable<TData, never>` | DISTINCT 중복 제거 |
|
|
24
|
+
| `lock()` | method | `Queryable<TData, TFrom>` | FOR UPDATE 행 잠금 |
|
|
25
|
+
|
|
26
|
+
### 범위 제한
|
|
27
|
+
|
|
28
|
+
| Member | Kind | Type | Description |
|
|
29
|
+
|--------|------|------|-------------|
|
|
30
|
+
| `top(count)` | method | `Queryable<TData, TFrom>` | 상위 N개 행만 선택 |
|
|
31
|
+
| `limit(skip, take)` | method | `Queryable<TData, TFrom>` | LIMIT/OFFSET 페이지네이션. `orderBy()` 후에만 사용 가능 |
|
|
32
|
+
|
|
33
|
+
### 정렬
|
|
34
|
+
|
|
35
|
+
| Member | Kind | Type | Description |
|
|
36
|
+
|--------|------|------|-------------|
|
|
37
|
+
| `orderBy(fn, direction?)` | method | `Queryable<TData, TFrom>` | 정렬 조건 추가. 여러 번 호출 시 순서대로 적용. 함수 또는 chain path 문자열 |
|
|
38
|
+
|
|
39
|
+
### WHERE 조건
|
|
40
|
+
|
|
41
|
+
| Member | Kind | Type | Description |
|
|
42
|
+
|--------|------|------|-------------|
|
|
43
|
+
| `where(predicate)` | method | `Queryable<TData, TFrom>` | WHERE 조건 추가. 여러 번 호출 시 AND로 결합 |
|
|
44
|
+
| `search(fn, searchText)` | method | `Queryable<TData, TFrom>` | 텍스트 검색. `parseSearchQuery` 구문 지원 |
|
|
45
|
+
|
|
46
|
+
### GROUP BY / HAVING
|
|
47
|
+
|
|
48
|
+
| Member | Kind | Type | Description |
|
|
49
|
+
|--------|------|------|-------------|
|
|
50
|
+
| `groupBy(fn)` | method | `Queryable<TData, never>` | GROUP BY 절 추가 |
|
|
51
|
+
| `having(predicate)` | method | `Queryable<TData, never>` | HAVING 조건 추가 |
|
|
52
|
+
|
|
53
|
+
### JOIN
|
|
54
|
+
|
|
55
|
+
| Member | Kind | Type | Description |
|
|
56
|
+
|--------|------|------|-------------|
|
|
57
|
+
| `join(as, fn)` | method | `Queryable<TData & { [as]?: R[] }, TFrom>` | 1:N LEFT OUTER JOIN. 결과에 배열로 추가 |
|
|
58
|
+
| `joinSingle(as, fn)` | method | `Queryable<...>` | N:1 또는 1:1 LEFT OUTER JOIN. 결과에 단일 객체로 추가 |
|
|
59
|
+
| `include(fn)` | method | `Queryable<TData, TFrom>` | 테이블 관계 정의 기반 자동 JOIN. 중첩 경로 지원 (`p.user.company`) |
|
|
60
|
+
|
|
61
|
+
### 서브쿼리 / UNION
|
|
62
|
+
|
|
63
|
+
| Member | Kind | Type | Description |
|
|
64
|
+
|--------|------|------|-------------|
|
|
65
|
+
| `wrap()` | method | `Queryable<TData, never>` | 현재 쿼리를 서브쿼리로 래핑. `distinct()`/`groupBy()` 후 `count()` 사용 시 필요 |
|
|
66
|
+
| `static union(...queries)` | static | `Queryable<TData, never>` | 여러 Queryable을 UNION으로 결합 (중복 제거). 최소 2개 필요 |
|
|
67
|
+
|
|
68
|
+
### 재귀 CTE
|
|
69
|
+
|
|
70
|
+
| Member | Kind | Type | Description |
|
|
71
|
+
|--------|------|------|-------------|
|
|
72
|
+
| `recursive(fn)` | method | `Queryable<TData, never>` | WITH RECURSIVE CTE 생성. 계층 구조 쿼리에 사용 |
|
|
73
|
+
|
|
74
|
+
### SELECT 실행
|
|
75
|
+
|
|
76
|
+
| Member | Kind | Type | Description |
|
|
77
|
+
|--------|------|------|-------------|
|
|
78
|
+
| `execute()` | method | `Promise<TData[]>` | SELECT 실행, 결과 배열 반환 |
|
|
79
|
+
| `single()` | method | `Promise<TData \| undefined>` | 단일 결과 반환. 2개 이상이면 에러 |
|
|
80
|
+
| `first()` | method | `Promise<TData \| undefined>` | 첫 번째 결과만 반환 |
|
|
81
|
+
| `count(fn?)` | method | `Promise<number>` | 행 수 반환. `distinct()`/`groupBy()` 후에는 `wrap()` 필요 |
|
|
82
|
+
| `exists()` | method | `Promise<boolean>` | 조건에 일치하는 데이터 존재 여부 |
|
|
83
|
+
|
|
84
|
+
### INSERT
|
|
85
|
+
|
|
86
|
+
| Member | Kind | Type | Description |
|
|
87
|
+
|--------|------|------|-------------|
|
|
88
|
+
| `insert(records)` | method | `Promise<void>` | INSERT 실행. MSSQL 1000행 제한으로 자동 청크 분할 |
|
|
89
|
+
| `insert(records, outputColumns)` | method | `Promise<Pick<...>[]>` | INSERT 후 지정한 column 값 반환 |
|
|
90
|
+
| `insertIfNotExists(record)` | method | `Promise<void>` | WHERE 조건에 일치하는 데이터가 없을 때만 INSERT |
|
|
91
|
+
| `insertInto(targetTable)` | method | `Promise<void>` | INSERT INTO ... SELECT |
|
|
92
|
+
|
|
93
|
+
### UPDATE
|
|
94
|
+
|
|
95
|
+
| Member | Kind | Type | Description |
|
|
96
|
+
|--------|------|------|-------------|
|
|
97
|
+
| `update(recordFn)` | method | `Promise<void>` | UPDATE 실행 |
|
|
98
|
+
| `update(recordFn, outputColumns)` | method | `Promise<Pick<...>[]>` | UPDATE 후 지정한 column 값 반환 |
|
|
99
|
+
|
|
100
|
+
### DELETE
|
|
101
|
+
|
|
102
|
+
| Member | Kind | Type | Description |
|
|
103
|
+
|--------|------|------|-------------|
|
|
104
|
+
| `delete()` | method | `Promise<void>` | DELETE 실행 |
|
|
105
|
+
| `delete(outputColumns)` | method | `Promise<Pick<...>[]>` | DELETE 후 지정한 column 값 반환 |
|
|
106
|
+
|
|
107
|
+
### UPSERT
|
|
108
|
+
|
|
109
|
+
| Member | Kind | Type | Description |
|
|
110
|
+
|--------|------|------|-------------|
|
|
111
|
+
| `upsert(updateFn)` | method | `Promise<void>` | WHERE 일치 시 UPDATE, 없으면 INSERT (updateFn이 두 작업에 동일 적용) |
|
|
112
|
+
| `upsert(updateFn, insertFn)` | method | `Promise<void>` | UPDATE/INSERT 각각 다른 데이터로 UPSERT |
|
|
113
|
+
| `upsert(updateFn, outputColumns)` | method | `Promise<Pick<...>[]>` | UPSERT 후 지정한 column 값 반환 |
|
|
114
|
+
|
|
115
|
+
### QueryDef 생성기
|
|
116
|
+
|
|
117
|
+
실행 없이 `QueryDef`만 반환. 테스트나 수동 실행에 사용.
|
|
118
|
+
|
|
119
|
+
| Member | Kind | Type | Description |
|
|
120
|
+
|--------|------|------|-------------|
|
|
121
|
+
| `getSelectQueryDef()` | method | `SelectQueryDef` | SELECT QueryDef 생성 |
|
|
122
|
+
| `getResultMeta(outputColumns?)` | method | `ResultMeta` | SELECT 결과 변환용 메타데이터 생성 |
|
|
123
|
+
| `getInsertQueryDef(records, outputColumns?)` | method | `InsertQueryDef` | INSERT QueryDef 생성 |
|
|
124
|
+
| `getInsertIfNotExistsQueryDef(record)` | method | `InsertIfNotExistsQueryDef` | INSERT IF NOT EXISTS QueryDef |
|
|
125
|
+
| `getInsertIntoQueryDef(targetTable)` | method | `InsertIntoQueryDef` | INSERT INTO QueryDef |
|
|
126
|
+
| `getUpdateQueryDef(recordFn, outputColumns?)` | method | `UpdateQueryDef` | UPDATE QueryDef |
|
|
127
|
+
| `getDeleteQueryDef(outputColumns?)` | method | `DeleteQueryDef` | DELETE QueryDef |
|
|
128
|
+
| `getUpsertQueryDef(updateFn, insertFn, outputColumns?)` | method | `UpsertQueryDef` | UPSERT QueryDef |
|
|
129
|
+
| `switchFk(enabled)` | method | `Promise<void>` | FK 제약조건 활성화/비활성화 |
|
|
130
|
+
|
|
131
|
+
## Related Types
|
|
132
|
+
|
|
133
|
+
### `queryable` (팩토리 함수)
|
|
134
|
+
|
|
135
|
+
`DbContext.queryable()`이 내부적으로 사용하는 팩토리 함수. 직접 호출할 일은 드물다.
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
export function queryable<TBuilder extends TableBuilder<any, any> | ViewBuilder<any, any, any>>(
|
|
139
|
+
db: DbContextBase,
|
|
140
|
+
tableOrView: TBuilder,
|
|
141
|
+
as?: string,
|
|
142
|
+
): () => Queryable<TBuilder["$inferSelect"], ...>;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### `getMatchedPrimaryKeys`
|
|
146
|
+
|
|
147
|
+
FK column 배열과 대상 테이블의 PK를 매칭하여 PK column 이름 배열을 반환한다.
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
export function getMatchedPrimaryKeys(
|
|
151
|
+
fkCols: string[],
|
|
152
|
+
targetTable: TableBuilder<any, any>,
|
|
153
|
+
): string[];
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### `QueryableRecord<TData>`
|
|
157
|
+
|
|
158
|
+
Queryable 콜백 내부에서 column을 참조할 때 사용하는 프록시 레코드 타입. 각 필드가 `ExprUnit`으로 래핑된다.
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
export type QueryableRecord<TData extends DataRecord> = {
|
|
162
|
+
[K in keyof TData]: TData[K] extends ColumnPrimitive
|
|
163
|
+
? ExprUnit<TData[K]>
|
|
164
|
+
: ...;
|
|
165
|
+
};
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### `QueryableWriteRecord<TData>`
|
|
169
|
+
|
|
170
|
+
UPDATE/UPSERT에서 레코드를 작성할 때 사용하는 타입. 각 필드가 `ExprInput<T>`(ExprUnit 또는 리터럴 값)로 받는다.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
export type QueryableWriteRecord<TData> = {
|
|
174
|
+
[K in keyof TData]: TData[K] extends ColumnPrimitive ? ExprInput<TData[K]> : never;
|
|
175
|
+
};
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### `UnwrapQueryableRecord<R>`
|
|
179
|
+
|
|
180
|
+
`select(fn)` 반환 타입에서 `ExprUnit<T>`를 `T`로 언래핑하여 실제 데이터 타입을 추론한다.
|
|
181
|
+
|
|
182
|
+
### `PathProxy<TObject>`
|
|
183
|
+
|
|
184
|
+
`include(fn)` 에서 관계 경로를 타입 안전하게 지정하기 위한 프록시 타입. `ColumnPrimitive` 필드는 접근 불가.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
export type PathProxy<TObject> = {
|
|
188
|
+
[K in keyof TObject as TObject[K] extends ColumnPrimitive ? never : K]-?: PathProxy<...>;
|
|
189
|
+
};
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Usage
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// SELECT
|
|
196
|
+
const users = await db.user()
|
|
197
|
+
.where((u) => [expr.eq(u.isActive, true), expr.gt(u.age, 18)])
|
|
198
|
+
.select((u) => ({ id: u.id, fullName: expr.concat(u.name, " (", u.email, ")") }))
|
|
199
|
+
.include((i) => i.company)
|
|
200
|
+
.orderBy((u) => u.name)
|
|
201
|
+
.limit(0, 20)
|
|
202
|
+
.execute();
|
|
203
|
+
|
|
204
|
+
// INSERT
|
|
205
|
+
await db.user().insert([{ name: "Alice", createdAt: DateTime.now() }]);
|
|
206
|
+
|
|
207
|
+
// INSERT with output
|
|
208
|
+
const [inserted] = await db.user().insert([{ name: "Bob" }], ["id"]);
|
|
209
|
+
|
|
210
|
+
// UPDATE (column 참조)
|
|
211
|
+
await db.product()
|
|
212
|
+
.update((p) => ({
|
|
213
|
+
price: expr.mul(p.price, expr.val("number", 1.1)),
|
|
214
|
+
}));
|
|
215
|
+
|
|
216
|
+
// UPSERT
|
|
217
|
+
await db.user()
|
|
218
|
+
.where((u) => [expr.eq(u.email, "test@test.com")])
|
|
219
|
+
.upsert(
|
|
220
|
+
() => ({ loginCount: expr.val("number", 1) }),
|
|
221
|
+
(update) => ({ ...update, email: expr.val("string", "test@test.com") }),
|
|
222
|
+
);
|
|
223
|
+
|
|
224
|
+
// UNION
|
|
225
|
+
const combined = Queryable.union(
|
|
226
|
+
db.user().where((u) => [expr.eq(u.type, "admin")]),
|
|
227
|
+
db.user().where((u) => [expr.eq(u.type, "manager")]),
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
// 재귀 CTE (계층 구조)
|
|
231
|
+
const tree = await db.employee()
|
|
232
|
+
.where((e) => [expr.null(e.managerId)])
|
|
233
|
+
.recursive((cte) =>
|
|
234
|
+
cte.from(Employee)
|
|
235
|
+
.where((e) => [expr.eq(e.managerId, e.self[0].id)])
|
|
236
|
+
)
|
|
237
|
+
.execute();
|
|
238
|
+
```
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# ColumnBuilder
|
|
2
|
+
|
|
3
|
+
Column 타입, nullable, autoIncrement, default, description을 정의하는 빌더. `TableBuilder.columns()` 및 `ProcedureBuilder.params()`/`returns()` 콜백에서 `createColumnFactory()`가 반환하는 팩토리 객체를 통해 생성된다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class ColumnBuilder<TValue extends ColumnPrimitive, TMeta extends ColumnMeta> {
|
|
7
|
+
constructor(readonly meta: TMeta);
|
|
8
|
+
}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Members
|
|
12
|
+
|
|
13
|
+
| Member | Kind | Type | Description |
|
|
14
|
+
|--------|------|------|-------------|
|
|
15
|
+
| `meta` | property | `TMeta` | Column 메타데이터 |
|
|
16
|
+
| `autoIncrement()` | method | `ColumnBuilder<TValue, ...>` | AUTO_INCREMENT 설정. INSERT 타입에서 optional |
|
|
17
|
+
| `nullable()` | method | `ColumnBuilder<TValue \| undefined, ...>` | NULL 허용. 값 타입에 `undefined` 추가 |
|
|
18
|
+
| `default(value)` | method | `ColumnBuilder<TValue, ...>` | 기본값 설정. INSERT 타입에서 optional |
|
|
19
|
+
| `description(desc)` | method | `ColumnBuilder<TValue, ...>` | Column 설명 (DDL Comment) |
|
|
20
|
+
|
|
21
|
+
## Related Types
|
|
22
|
+
|
|
23
|
+
### `createColumnFactory`
|
|
24
|
+
|
|
25
|
+
`TableBuilder.columns()`, `ProcedureBuilder.params()`/`returns()` 콜백에서 자동으로 제공되는 팩토리.
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
export function createColumnFactory(): { ... };
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
#### 지원 Column 타입
|
|
32
|
+
|
|
33
|
+
| 메서드 | SQL 타입 | TypeScript 타입 | 비고 |
|
|
34
|
+
|--------|----------|-----------------|------|
|
|
35
|
+
| `int()` | INT | `number` | 4바이트 |
|
|
36
|
+
| `bigint()` | BIGINT | `number` | 8바이트 |
|
|
37
|
+
| `float()` | FLOAT | `number` | 4바이트 단정밀도 |
|
|
38
|
+
| `double()` | DOUBLE | `number` | 8바이트 배정밀도 |
|
|
39
|
+
| `decimal(precision, scale?)` | DECIMAL(p,s) | `number` | 고정 소수점 |
|
|
40
|
+
| `varchar(length)` | VARCHAR(n) | `string` | 가변 길이 |
|
|
41
|
+
| `char(length)` | CHAR(n) | `string` | 고정 길이 |
|
|
42
|
+
| `text()` | TEXT/LONGTEXT | `string` | 대용량 |
|
|
43
|
+
| `binary()` | LONGBLOB/VARBINARY(MAX)/BYTEA | `Bytes` | 바이너리 |
|
|
44
|
+
| `boolean()` | TINYINT(1)/BIT/BOOLEAN | `boolean` | DBMS별 다름 |
|
|
45
|
+
| `datetime()` | DATETIME | `DateTime` | |
|
|
46
|
+
| `date()` | DATE | `DateOnly` | |
|
|
47
|
+
| `time()` | TIME | `Time` | |
|
|
48
|
+
| `uuid()` | BINARY(16)/UNIQUEIDENTIFIER/UUID | `Uuid` | |
|
|
49
|
+
|
|
50
|
+
## Usage
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
Table("User")
|
|
54
|
+
.columns((c) => ({
|
|
55
|
+
id: c.bigint().autoIncrement(), // bigint, AUTO_INCREMENT, INSERT optional
|
|
56
|
+
name: c.varchar(100), // varchar(100), 필수
|
|
57
|
+
email: c.varchar(200).nullable(), // varchar(200), NULL 허용
|
|
58
|
+
status: c.varchar(20).default("active"), // varchar(20), 기본값 "active", INSERT optional
|
|
59
|
+
createdAt: c.datetime().description("생성일시"),
|
|
60
|
+
price: c.decimal(10, 2),
|
|
61
|
+
data: c.binary(),
|
|
62
|
+
}));
|
|
63
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# ForeignKeyBuilder
|
|
2
|
+
|
|
3
|
+
FK/역참조/논리적 관계 빌더들. `TableBuilder.relations()` 및 `ViewBuilder.relations()` 콜백에서 `createRelationFactory()`가 반환하는 팩토리 객체를 통해 생성된다.
|
|
4
|
+
|
|
5
|
+
**주의**: description/single 설정은 반드시 팩토리 함수의 `opts` 파라미터로 전달해야 한다. 메서드 체이닝(`.description()`, `.single()`)은 TypeScript 순환 참조(TS7022)를 유발하므로 제거되었다.
|
|
6
|
+
|
|
7
|
+
## 빌더 종류
|
|
8
|
+
|
|
9
|
+
| 클래스 | 관계 방향 | DB FK 생성 | 사용 가능 위치 |
|
|
10
|
+
|--------|-----------|------------|----------------|
|
|
11
|
+
| `ForeignKeyBuilder` | N:1 | O | Table |
|
|
12
|
+
| `ForeignKeyTargetBuilder` | 1:N 또는 1:1 | O (역참조) | Table |
|
|
13
|
+
| `RelationKeyBuilder` | N:1 | X | Table, View |
|
|
14
|
+
| `RelationKeyTargetBuilder` | 1:N 또는 1:1 | X (역참조) | Table, View |
|
|
15
|
+
|
|
16
|
+
## ForeignKeyBuilder
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
export class ForeignKeyBuilder<
|
|
20
|
+
TOwner extends TableBuilder<any, any>,
|
|
21
|
+
TTargetFn extends () => TableBuilder<any, any>,
|
|
22
|
+
> {
|
|
23
|
+
constructor(
|
|
24
|
+
readonly meta: {
|
|
25
|
+
ownerFn: () => TOwner;
|
|
26
|
+
columns: string[];
|
|
27
|
+
targetFn: TTargetFn;
|
|
28
|
+
description?: string;
|
|
29
|
+
},
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
팩토리 시그니처:
|
|
35
|
+
```typescript
|
|
36
|
+
r.foreignKey(columns, targetFn, opts?: { description?: string }): ForeignKeyBuilder<...>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## ForeignKeyTargetBuilder
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
export class ForeignKeyTargetBuilder<
|
|
43
|
+
TTargetTableFn extends () => TableBuilder<any, any>,
|
|
44
|
+
TIsSingle extends boolean,
|
|
45
|
+
> {
|
|
46
|
+
constructor(
|
|
47
|
+
readonly meta: {
|
|
48
|
+
targetTableFn: TTargetTableFn;
|
|
49
|
+
relationName: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
isSingle?: TIsSingle;
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
팩토리 시그니처 (오버로드):
|
|
58
|
+
```typescript
|
|
59
|
+
// 배열 관계 (1:N)
|
|
60
|
+
r.foreignKeyTarget(targetTableFn, relationName, opts?: { single?: false, description?: string }):
|
|
61
|
+
ForeignKeyTargetBuilder<..., false>
|
|
62
|
+
|
|
63
|
+
// 단일 관계 (1:1)
|
|
64
|
+
r.foreignKeyTarget(targetTableFn, relationName, opts: { single: true, description?: string }):
|
|
65
|
+
ForeignKeyTargetBuilder<..., true>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## RelationKeyBuilder
|
|
69
|
+
|
|
70
|
+
`ForeignKeyBuilder`와 동일하지만 DB에 FK 제약조건을 생성하지 않는다. View에서도 사용 가능하다.
|
|
71
|
+
|
|
72
|
+
팩토리 시그니처:
|
|
73
|
+
```typescript
|
|
74
|
+
r.relationKey(columns, targetFn, opts?: { description?: string }): RelationKeyBuilder<...>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## RelationKeyTargetBuilder
|
|
78
|
+
|
|
79
|
+
`ForeignKeyTargetBuilder`와 동일하지만 DB에 FK를 생성하지 않는다.
|
|
80
|
+
|
|
81
|
+
팩토리 시그니처 (오버로드):
|
|
82
|
+
```typescript
|
|
83
|
+
r.relationKeyTarget(targetTableFn, relationName, opts?: { single?: false, description?: string })
|
|
84
|
+
r.relationKeyTarget(targetTableFn, relationName, opts: { single: true, description?: string })
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Related Types
|
|
88
|
+
|
|
89
|
+
### `createRelationFactory`
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
export function createRelationFactory<
|
|
93
|
+
TOwner extends TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
94
|
+
TColumnKey extends string,
|
|
95
|
+
>(ownerFn: () => TOwner): RelationFactory;
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
TableBuilder → FK + RelationKey 모두 사용 가능.
|
|
99
|
+
ViewBuilder → RelationKey만 사용 가능 (`foreignKey`/`foreignKeyTarget` 없음).
|
|
100
|
+
|
|
101
|
+
## Usage
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
const Post = Table("Post")
|
|
105
|
+
.columns((c) => ({
|
|
106
|
+
id: c.bigint().autoIncrement(),
|
|
107
|
+
authorId: c.bigint(),
|
|
108
|
+
title: c.varchar(200),
|
|
109
|
+
}))
|
|
110
|
+
.primaryKey("id")
|
|
111
|
+
.relations((r) => ({
|
|
112
|
+
// N:1: Post → User (DB FK 생성)
|
|
113
|
+
author: r.foreignKey(["authorId"], () => User, { description: "작성자" }),
|
|
114
|
+
}));
|
|
115
|
+
|
|
116
|
+
const User = Table("User")
|
|
117
|
+
.columns((c) => ({
|
|
118
|
+
id: c.bigint().autoIncrement(),
|
|
119
|
+
name: c.varchar(100),
|
|
120
|
+
}))
|
|
121
|
+
.primaryKey("id")
|
|
122
|
+
.relations((r) => ({
|
|
123
|
+
// 1:N 역참조 (배열)
|
|
124
|
+
posts: r.foreignKeyTarget(() => Post, "author"),
|
|
125
|
+
// 1:1 역참조 (단일 객체)
|
|
126
|
+
profile: r.foreignKeyTarget(() => Profile, "user", { single: true }),
|
|
127
|
+
// 설명 포함
|
|
128
|
+
comments: r.foreignKeyTarget(() => Comment, "user", { description: "댓글목록" }),
|
|
129
|
+
}));
|
|
130
|
+
|
|
131
|
+
// View에서는 relationKey만 사용
|
|
132
|
+
const UserSummary = View("UserSummary")
|
|
133
|
+
.query((db: MyDb) => db.user().select(...))
|
|
134
|
+
.relations((r) => ({
|
|
135
|
+
company: r.relationKey(["companyId"], () => Company, { description: "소속회사" }),
|
|
136
|
+
}));
|
|
137
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# IndexBuilder
|
|
2
|
+
|
|
3
|
+
Index 정의 빌더. `TableBuilder.indexes()` 콜백에서 `createIndexFactory()`가 반환하는 팩토리 객체를 통해 생성된다.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export class IndexBuilder<TKeys extends string[]> {
|
|
7
|
+
constructor(
|
|
8
|
+
readonly meta: {
|
|
9
|
+
columns: TKeys;
|
|
10
|
+
name?: string;
|
|
11
|
+
unique?: boolean;
|
|
12
|
+
orderBy?: { [K in keyof TKeys]: "ASC" | "DESC" };
|
|
13
|
+
description?: string;
|
|
14
|
+
},
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Members
|
|
20
|
+
|
|
21
|
+
| Member | Kind | Type | Description |
|
|
22
|
+
|--------|------|------|-------------|
|
|
23
|
+
| `meta` | property | `{ columns, name?, unique?, orderBy?, description? }` | Index 메타데이터 |
|
|
24
|
+
| `name(name)` | method | `IndexBuilder<TKeys>` | Index 이름 설정 |
|
|
25
|
+
| `unique()` | method | `IndexBuilder<TKeys>` | UNIQUE 인덱스 설정 |
|
|
26
|
+
| `orderBy(...orderBy)` | method | `IndexBuilder<TKeys>` | 각 컬럼별 정렬 순서 설정 |
|
|
27
|
+
| `description(desc)` | method | `IndexBuilder<TKeys>` | Index 설명 (DDL Comment) |
|
|
28
|
+
|
|
29
|
+
## Related Types
|
|
30
|
+
|
|
31
|
+
### `createIndexFactory`
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
export function createIndexFactory<TColumnKey extends string>(): {
|
|
35
|
+
index<TKeys extends TColumnKey[]>(...columns: [...TKeys]): IndexBuilder<TKeys>;
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
Table("User")
|
|
43
|
+
.columns((c) => ({
|
|
44
|
+
id: c.bigint(),
|
|
45
|
+
email: c.varchar(200),
|
|
46
|
+
name: c.varchar(100),
|
|
47
|
+
createdAt: c.datetime(),
|
|
48
|
+
}))
|
|
49
|
+
.indexes((i) => [
|
|
50
|
+
i.index("email").unique(),
|
|
51
|
+
i.index("name", "createdAt").orderBy("ASC", "DESC"),
|
|
52
|
+
i.index("createdAt").name("IX_User_CreatedAt").orderBy("DESC"),
|
|
53
|
+
]);
|
|
54
|
+
```
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Procedure
|
|
2
|
+
|
|
3
|
+
Fluent API로 Stored Procedure 스키마를 정의하는 빌더 팩토리 함수.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export function Procedure(name: string): ProcedureBuilder<never, never>;
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Parameters
|
|
10
|
+
|
|
11
|
+
| Param | Type | Description |
|
|
12
|
+
|-------|------|-------------|
|
|
13
|
+
| `name` | `string` | Procedure 이름 |
|
|
14
|
+
|
|
15
|
+
## Returns
|
|
16
|
+
|
|
17
|
+
`ProcedureBuilder<never, never>` — 빈 ProcedureBuilder 인스턴스
|
|
18
|
+
|
|
19
|
+
## Related Types
|
|
20
|
+
|
|
21
|
+
### `ProcedureBuilder<TParams, TReturns>`
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
export class ProcedureBuilder<
|
|
25
|
+
TParams extends ColumnBuilderRecord,
|
|
26
|
+
TReturns extends ColumnBuilderRecord,
|
|
27
|
+
> {
|
|
28
|
+
readonly $params!: TParams;
|
|
29
|
+
readonly $returns!: TReturns;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
#### 빌더 메서드
|
|
34
|
+
|
|
35
|
+
| 메서드 | 설명 |
|
|
36
|
+
|--------|------|
|
|
37
|
+
| `description(desc)` | Procedure 설명 설정 (DDL Comment) |
|
|
38
|
+
| `database(db)` | Database 이름 설정 |
|
|
39
|
+
| `schema(schema)` | Schema 이름 설정 |
|
|
40
|
+
| `params(fn)` | 입력 파라미터 정의. `fn(c) => ({ userId: c.bigint(), ... })` |
|
|
41
|
+
| `returns(fn)` | 반환 컬럼 정의. `fn(c) => ({ id: c.bigint(), ... })` |
|
|
42
|
+
| `body(sql)` | Procedure 본문 SQL 설정 |
|
|
43
|
+
|
|
44
|
+
## Usage
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
const GetUserById = Procedure("GetUserById")
|
|
48
|
+
.database("mydb")
|
|
49
|
+
.params((c) => ({
|
|
50
|
+
userId: c.bigint(),
|
|
51
|
+
}))
|
|
52
|
+
.returns((c) => ({
|
|
53
|
+
id: c.bigint(),
|
|
54
|
+
name: c.varchar(100),
|
|
55
|
+
email: c.varchar(200).nullable(),
|
|
56
|
+
}))
|
|
57
|
+
.body("SELECT id, name, email FROM User WHERE id = userId");
|
|
58
|
+
// MSSQL: .body("SELECT id, name, email FROM [User] WHERE id = @userId")
|
|
59
|
+
|
|
60
|
+
// DbContext에 등록
|
|
61
|
+
class MainDb extends DbContext {
|
|
62
|
+
getUserById = this.executable(GetUserById);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 실행
|
|
66
|
+
const [[user]] = await db.getUserById().execute({ userId: 1n });
|
|
67
|
+
```
|