@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,110 @@
|
|
|
1
|
+
# FsWatcher
|
|
2
|
+
|
|
3
|
+
Chokidar 기반 파일 시스템 감시 래퍼. 짧은 시간 내에 발생하는 이벤트를 병합하여 콜백을 한 번만 호출한다.
|
|
4
|
+
EPERM 에러 발생 시 최대 3회까지 watcher를 자동 재시작한다.
|
|
5
|
+
|
|
6
|
+
## When to use
|
|
7
|
+
|
|
8
|
+
- ✅ 파일/디렉토리 변경을 지속적으로 감시하고, 짧은 시간 내 연속 이벤트를 하나로 병합해야 할 때
|
|
9
|
+
- ✅ glob 패턴으로 특정 파일만 감시하면서 이벤트 디바운싱이 필요할 때
|
|
10
|
+
- ❌ 단발성 파일 변경 확인 → `fsx.stat`으로 mtime 비교
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
export class FsWatcher {
|
|
14
|
+
static async watch(paths: string[], options?: chokidar.ChokidarOptions): Promise<FsWatcher>
|
|
15
|
+
onChange(opt: { delay?: number }, cb: (changeInfos: FsWatcherChangeInfo[]) => void | Promise<void>): this
|
|
16
|
+
async close(): Promise<void>
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Members
|
|
21
|
+
|
|
22
|
+
| Member | Kind | Type | Description |
|
|
23
|
+
|--------|------|------|-------------|
|
|
24
|
+
| `watch` | static method | `(paths: string[], options?: ChokidarOptions) => Promise<FsWatcher>` | 파일 감시 시작. `ready` 이벤트까지 대기 후 반환 |
|
|
25
|
+
| `onChange` | method | `(opt: { delay?: number }, cb: ...) => this` | 파일 변경 이벤트 핸들러 등록 |
|
|
26
|
+
| `close` | method | `() => Promise<void>` | 파일 감시자 종료 |
|
|
27
|
+
|
|
28
|
+
## `ignoreInitial` 주의
|
|
29
|
+
|
|
30
|
+
chokidar의 `ignoreInitial` 옵션은 내부적으로 항상 `true`로 설정된다.
|
|
31
|
+
`options.ignoreInitial: false`를 전달하면 첫 번째 `onChange` 호출 시 빈 배열로 콜백이 호출되지만, 실제 초기 파일 목록은 포함되지 않는다. 이는 이벤트 병합 로직과의 충돌을 방지하기 위한 의도적인 동작이다.
|
|
32
|
+
|
|
33
|
+
## Related Types
|
|
34
|
+
|
|
35
|
+
### `FsWatcherEvent`
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
export type FsWatcherEvent = "add" | "addDir" | "change" | "unlink" | "unlinkDir";
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
지원되는 파일 변경 이벤트 타입.
|
|
42
|
+
|
|
43
|
+
### `FsWatcherChangeInfo`
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
export interface FsWatcherChangeInfo {
|
|
47
|
+
event: FsWatcherEvent;
|
|
48
|
+
path: PosixPath;
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| Field | Type | Description |
|
|
53
|
+
|-------|------|-------------|
|
|
54
|
+
| `event` | `FsWatcherEvent` | 변경 이벤트 타입 |
|
|
55
|
+
| `path` | [`PosixPath`](../utils/pathx.md#posixpath) | 변경된 파일/디렉토리 경로 (정규화됨) |
|
|
56
|
+
|
|
57
|
+
## 이벤트 병합 전략
|
|
58
|
+
|
|
59
|
+
같은 파일에 대해 `delay` 시간 내에 여러 이벤트가 발생하면 최종 상태만 전달된다:
|
|
60
|
+
|
|
61
|
+
| 이전 이벤트 | 신규 이벤트 | 결과 |
|
|
62
|
+
|------------|------------|------|
|
|
63
|
+
| `add` | `change` | `add` (생성 직후 수정 → 생성) |
|
|
64
|
+
| `add` | `unlink` | 제거 (생성 직후 삭제 → 변경 없음) |
|
|
65
|
+
| `addDir` | `unlinkDir` | 제거 (생성 직후 삭제 → 변경 없음) |
|
|
66
|
+
| `unlink` | `add` | `add` (삭제 후 재생성 → 생성) |
|
|
67
|
+
| `unlink` | `change` | `change` |
|
|
68
|
+
| `unlinkDir` | `addDir` | `addDir` (디렉토리 재생성) |
|
|
69
|
+
| 그 외 | — | 최신 이벤트로 덮어쓰기 |
|
|
70
|
+
|
|
71
|
+
## Glob 패턴 처리
|
|
72
|
+
|
|
73
|
+
glob 패턴이 포함된 경로(`*`, `?`, `{`, `[`, `]`)는 glob base 디렉토리를 감시하고, Minimatch로 이벤트를 필터링한다.
|
|
74
|
+
|
|
75
|
+
## Usage
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { FsWatcher } from "@simplysm/core-node";
|
|
79
|
+
|
|
80
|
+
const watcher = await FsWatcher.watch(["src/**/*.ts"]);
|
|
81
|
+
|
|
82
|
+
watcher.onChange({ delay: 300 }, (changes) => {
|
|
83
|
+
for (const { event, path } of changes) {
|
|
84
|
+
// event: "add" | "addDir" | "change" | "unlink" | "unlinkDir"
|
|
85
|
+
// path: PosixPath
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// 종료
|
|
90
|
+
await watcher.close();
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 🚫 Anti-patterns
|
|
94
|
+
|
|
95
|
+
### close() 누락
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// ❌ close하지 않으면 프로세스가 종료되지 않음
|
|
99
|
+
const watcher = await FsWatcher.watch(["src/**/*.ts"]);
|
|
100
|
+
watcher.onChange({ delay: 300 }, handler);
|
|
101
|
+
// 프로세스 행
|
|
102
|
+
|
|
103
|
+
// ✅ 작업 완료 후 반드시 close
|
|
104
|
+
const watcher = await FsWatcher.watch(["src/**/*.ts"]);
|
|
105
|
+
watcher.onChange({ delay: 300 }, handler);
|
|
106
|
+
// ... 작업 완료 후
|
|
107
|
+
await watcher.close();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**근거**: chokidar watcher는 persistent 모드로 동작하여 close하지 않으면 프로세스가 종료되지 않는다.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# createFileReporter
|
|
2
|
+
|
|
3
|
+
파일 기반 consola reporter를 생성한다. `.logs/` 디렉토리에 `app.YYYY-MM-DD.log` 형식으로 JSON 라인을 기록하며, 날짜별 로테이션과 크기 제한을 지원한다.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- ✅ 로그를 파일로 영구 보관하고, 날짜별 로테이션/크기 제한이 필요할 때
|
|
8
|
+
- ❌ 터미널 출력용 → [`PrettyReporter`](./pretty-reporter.md) 사용
|
|
9
|
+
- ❌ 환경별 자동 구성 → [`setupConsola`](./setup-consola.md) 사용
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export function createFileReporter(options?: FileReporterOptions): ConsolaReporter
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Parameters
|
|
16
|
+
|
|
17
|
+
| Param | Type | Description |
|
|
18
|
+
|-------|------|-------------|
|
|
19
|
+
| `options` | `FileReporterOptions` (optional) | 파일 reporter 옵션 |
|
|
20
|
+
|
|
21
|
+
## Returns
|
|
22
|
+
|
|
23
|
+
`ConsolaReporter` — consola reporter 인터페이스 구현체
|
|
24
|
+
|
|
25
|
+
## Related Types
|
|
26
|
+
|
|
27
|
+
### `FileReporterOptions`
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
export interface FileReporterOptions {
|
|
31
|
+
/** @default 20MB */
|
|
32
|
+
maxSize?: number;
|
|
33
|
+
/** @default 14 */
|
|
34
|
+
maxDays?: number;
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Field | Type | Default | Description |
|
|
39
|
+
|-------|------|---------|-------------|
|
|
40
|
+
| `maxSize` | `number` (optional) | `20 * 1024 * 1024` (20MB) | 파일 1개의 최대 크기(bytes). 초과 시 `app.YYYY-MM-DD.N.log`로 순번 파일 생성 |
|
|
41
|
+
| `maxDays` | `number` (optional) | `14` | 보관할 최대 일수. 날짜가 바뀔 때 이전 파일을 정리 |
|
|
42
|
+
|
|
43
|
+
## 로그 파일 형식
|
|
44
|
+
|
|
45
|
+
각 라인은 JSON 객체:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{"time":"2024-01-15T10:30:00.000Z","level":"INFO","msg":"서버 시작"}
|
|
49
|
+
{"time":"2024-01-15T10:30:01.000Z","level":"ERROR","tag":"db","err":{"message":"연결 실패","stack":"Error: ..."}}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| 필드 | 설명 |
|
|
53
|
+
|------|------|
|
|
54
|
+
| `time` | ISO 8601 타임스탬프 |
|
|
55
|
+
| `level` | 로그 타입 대문자 (INFO, ERROR, DEBUG 등) |
|
|
56
|
+
| `tag` | consola 태그 (있을 때만 포함) |
|
|
57
|
+
| `msg` | 문자열 인자를 공백으로 합친 메시지 (있을 때만 포함) |
|
|
58
|
+
| `err` | Error 객체 (있을 때만 포함): `{ message, stack }` |
|
|
59
|
+
|
|
60
|
+
## 파일 명명 규칙
|
|
61
|
+
|
|
62
|
+
- 기본: `.logs/app.YYYY-MM-DD.log`
|
|
63
|
+
- 크기 초과 시: `.logs/app.YYYY-MM-DD.1.log`, `.logs/app.YYYY-MM-DD.2.log`, ...
|
|
64
|
+
- `process.cwd()` 기준 `.logs/` 디렉토리에 저장
|
|
65
|
+
|
|
66
|
+
## Usage
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { createFileReporter } from "@simplysm/core-node";
|
|
70
|
+
import consola from "consola";
|
|
71
|
+
|
|
72
|
+
// 기본 옵션
|
|
73
|
+
consola.options.reporters = [createFileReporter()];
|
|
74
|
+
|
|
75
|
+
// 크기/기간 커스텀
|
|
76
|
+
const reporter = createFileReporter({ maxSize: 10 * 1024 * 1024, maxDays: 7 });
|
|
77
|
+
consola.options.reporters = [reporter];
|
|
78
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# PrettyReporter
|
|
2
|
+
|
|
3
|
+
터미널 출력용 consola reporter. 로그 타입별 아이콘과 색상을 지원하며, 에러 스택 트레이스를 포맷팅한다.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- ✅ 터미널에 아이콘/색상이 포함된 가독성 좋은 로그를 출력할 때
|
|
8
|
+
- ✅ `setupConsola()`의 기본 동작 대신 reporter를 직접 조합할 때
|
|
9
|
+
- ❌ 로그를 파일로 저장 → [`createFileReporter`](./create-file-reporter.md) 사용
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export class PrettyReporter implements ConsolaReporter {
|
|
13
|
+
log(logObj: LogObject, ctx: { options: ConsolaOptions }): void
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Members
|
|
18
|
+
|
|
19
|
+
| Member | Kind | Type | Description |
|
|
20
|
+
|--------|------|------|-------------|
|
|
21
|
+
| `log` | method | `(logObj: LogObject, ctx: { options: ConsolaOptions }) => void` | 로그 항목을 터미널에 출력 |
|
|
22
|
+
|
|
23
|
+
## 동작 방식
|
|
24
|
+
|
|
25
|
+
- `logObj.level < 2` (error/fatal)이면 `stderr`, 그 외이면 `stdout`에 출력
|
|
26
|
+
- 컬러 지원 자동 감지: `NO_COLOR` 환경 변수 → `FORCE_COLOR` 환경 변수 → `process.stdout.isTTY` → Windows 여부 순으로 판단
|
|
27
|
+
- 로그 타입별 아이콘: `error`/`fatal`/`fail` = `✖`, `ready`/`success` = `✔`, `warn` = `⚠`, `info` = `ℹ`, `debug` = `⚙`, `trace` = `→`
|
|
28
|
+
- `Error` 객체는 메시지 + 스택 트레이스로 포맷팅되며, `cause` 체인도 재귀적으로 표시됨
|
|
29
|
+
- `badge` 옵션이나 error/fatal 레벨이면 로그 앞뒤에 빈 줄을 추가 (시각적 강조)
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { PrettyReporter } from "@simplysm/core-node";
|
|
35
|
+
import consola from "consola";
|
|
36
|
+
|
|
37
|
+
consola.options.reporters = [new PrettyReporter()];
|
|
38
|
+
```
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# setupConsola
|
|
2
|
+
|
|
3
|
+
환경에 따라 consola reporter를 자동 구성한다. 이 패키지의 `console.*` 사용 금지 규칙을 대체하는 표준 로깅 진입점이다.
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- ✅ 서버/CLI 애플리케이션 시작 시 환경별(개발/프로덕션) 로깅을 한 번에 구성할 때
|
|
8
|
+
- ❌ reporter를 세밀하게 커스텀 조합할 때 → `createFileReporter`/`PrettyReporter`를 직접 사용
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
export function setupConsola(opts?: SetupConsolaOptions): void
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Parameters
|
|
15
|
+
|
|
16
|
+
| Param | Type | Description |
|
|
17
|
+
|-------|------|-------------|
|
|
18
|
+
| `opts` | `SetupConsolaOptions` (optional) | 구성 옵션 |
|
|
19
|
+
|
|
20
|
+
## Related Types
|
|
21
|
+
|
|
22
|
+
### `SetupConsolaOptions`
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
export interface SetupConsolaOptions {
|
|
26
|
+
cli?: boolean;
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Field | Type | Description |
|
|
31
|
+
|-------|------|-------------|
|
|
32
|
+
| `cli` | `boolean` (optional) | CLI 모드 여부. `true`이면 프로덕션에서도 개발 경로(FileReporter + PrettyReporter)를 사용 |
|
|
33
|
+
|
|
34
|
+
## 환경별 동작
|
|
35
|
+
|
|
36
|
+
| 조건 | Reporter | 레벨 |
|
|
37
|
+
|------|----------|------|
|
|
38
|
+
| 프로덕션 (`DEV` 아님, `cli` 아님) | `FileReporter`만 | debug까지 파일 기록 |
|
|
39
|
+
| 개발 또는 `cli: true` + `SD_DEBUG=true` | `PrettyReporter`만 | debug까지 터미널 출력 |
|
|
40
|
+
| 개발 또는 `cli: true` (일반) | `FileReporter` + `PrettyReporter` (info 이하만) | debug는 파일에만 기록, info 이하는 터미널 출력 |
|
|
41
|
+
|
|
42
|
+
`DEV` 환경 변수 감지에는 `@simplysm/core-common`의 `parseBoolEnv(env("DEV"))`를 사용한다.
|
|
43
|
+
|
|
44
|
+
## `withMaxLevel`
|
|
45
|
+
|
|
46
|
+
reporter에 로그 레벨 상한선을 설정한 래퍼를 반환한다. `setupConsola()` 내부에서 PrettyReporter를 info 레벨로 제한할 때 사용된다.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
export function withMaxLevel(reporter: ConsolaReporter, maxLevel: number): ConsolaReporter
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
| Param | Type | Description |
|
|
53
|
+
|-------|------|-------------|
|
|
54
|
+
| `reporter` | `ConsolaReporter` | 감쌀 reporter |
|
|
55
|
+
| `maxLevel` | `number` | 이 레벨보다 높은 로그는 무시 (consola의 `LogLevels` 상수 사용 권장) |
|
|
56
|
+
|
|
57
|
+
## Usage
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { setupConsola, withMaxLevel, PrettyReporter } from "@simplysm/core-node";
|
|
61
|
+
import { LogLevels } from "consola";
|
|
62
|
+
|
|
63
|
+
// 환경별 자동 구성 (일반 서버)
|
|
64
|
+
setupConsola();
|
|
65
|
+
|
|
66
|
+
// CLI 모드 (프로덕션에서도 터미널 출력)
|
|
67
|
+
setupConsola({ cli: true });
|
|
68
|
+
|
|
69
|
+
// 개별 reporter 직접 조합
|
|
70
|
+
import consola from "consola";
|
|
71
|
+
import { createFileReporter } from "@simplysm/core-node";
|
|
72
|
+
|
|
73
|
+
consola.options.reporters = [
|
|
74
|
+
createFileReporter(),
|
|
75
|
+
withMaxLevel(new PrettyReporter(), LogLevels.info),
|
|
76
|
+
];
|
|
77
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# cpx
|
|
2
|
+
|
|
3
|
+
자식 프로세스 실행 및 인코딩 감지 유틸리티 네임스페이스.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { cpx } from "@simplysm/core-node";
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
- ✅ 외부 명령어(git, npm, 빌드 도구 등)를 실행하고 결과를 받아야 할 때
|
|
12
|
+
- ✅ 자식 프로세스의 stdout/stderr를 Uint8Array로 수집하고 시스템 인코딩에 맞게 디코딩해야 할 때
|
|
13
|
+
- ❌ Worker thread로 CPU 작업 분리 → [`Worker`](../worker/worker.md) 사용
|
|
14
|
+
|
|
15
|
+
## Members
|
|
16
|
+
|
|
17
|
+
| Member | Kind | Signature | Description |
|
|
18
|
+
|--------|------|-----------|-------------|
|
|
19
|
+
| `spawn` | function | `(cmd: string, args: string[], options?: SpawnOptions & { reject?: boolean }) => SpawnProcess` | 자식 프로세스 실행 (비동기). `SpawnProcess`를 반환한다 |
|
|
20
|
+
| `spawnSync` | function | `(cmd: string, args: string[], options?: SpawnSyncOptions & { reject?: boolean }) => SpawnResult` | 자식 프로세스 동기 실행 |
|
|
21
|
+
| `getSystemEncoding` | function | `() => string` | 시스템 기본 인코딩 감지. 결과는 캐시됨 |
|
|
22
|
+
| `codePageToEncoding` | function | `(codePage: number) => string` | Windows 코드 페이지 번호를 인코딩 이름으로 변환 |
|
|
23
|
+
| `resetEncodingCache` | function | `() => void` | 캐시된 시스템 인코딩 초기화 |
|
|
24
|
+
| `decodeBytes` | function | `(raw: Uint8Array, systemEncoding?: string) => string` | Uint8Array를 문자열로 디코딩 |
|
|
25
|
+
| `resolveStdioPipe` | function | `(stdio: SpawnOptions["stdio"]) => { stdout: boolean; stderr: boolean }` | stdio 옵션에서 pipe 여부 추출 |
|
|
26
|
+
| `SpawnProcess` | class | — | `spawn()` 반환 타입. PromiseLike 구현, kill() 지원 |
|
|
27
|
+
| `SpawnResult` | interface | — | `spawn`/`spawnSync` 결과 타입 |
|
|
28
|
+
|
|
29
|
+
## `SpawnProcess`
|
|
30
|
+
|
|
31
|
+
`spawn()`이 반환하는 클래스. `PromiseLike<SpawnResult>`를 구현하여 `await`로 사용 가능하다.
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
export class SpawnProcess implements PromiseLike<SpawnResult> {
|
|
35
|
+
get pid(): number | undefined
|
|
36
|
+
then<TResult1 = SpawnResult, TResult2 = never>(
|
|
37
|
+
onfulfilled?: ((value: SpawnResult) => TResult1 | PromiseLike<TResult1>) | null,
|
|
38
|
+
onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,
|
|
39
|
+
): Promise<TResult1 | TResult2>
|
|
40
|
+
catch<TResult = never>(
|
|
41
|
+
onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,
|
|
42
|
+
): Promise<SpawnResult | TResult>
|
|
43
|
+
kill(signal?: NodeJS.Signals | number): boolean
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
| Member | Kind | Type | Description |
|
|
48
|
+
|--------|------|------|-------------|
|
|
49
|
+
| `pid` | getter | `number \| undefined` | 자식 프로세스의 PID |
|
|
50
|
+
| `then` | method | `PromiseLike.then` | Promise then 메서드 |
|
|
51
|
+
| `catch` | method | `PromiseLike.catch` | Promise catch 메서드 |
|
|
52
|
+
| `kill` | method | `(signal?: NodeJS.Signals \| number) => boolean` | 프로세스에 신호를 보냄 (기본값: SIGTERM) |
|
|
53
|
+
|
|
54
|
+
## `SpawnResult`
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
export interface SpawnResult {
|
|
58
|
+
stdout: string;
|
|
59
|
+
stderr: string;
|
|
60
|
+
exitCode: number;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
| Field | Type | Description |
|
|
65
|
+
|-------|------|-------------|
|
|
66
|
+
| `stdout` | `string` | 표준 출력 내용. stdio가 "pipe"가 아니면 빈 문자열 |
|
|
67
|
+
| `stderr` | `string` | 표준 에러 내용. stdio가 "pipe"가 아니면 빈 문자열 |
|
|
68
|
+
| `exitCode` | `number` | 프로세스 종료 코드 |
|
|
69
|
+
|
|
70
|
+
## reject 옵션
|
|
71
|
+
|
|
72
|
+
`spawn`/`spawnSync` 모두 기본적으로 `exitCode !== 0`이면 오류를 발생시킨다. `options.reject: false`를 지정하면 항상 정상 반환된다.
|
|
73
|
+
|
|
74
|
+
## getSystemEncoding 인코딩 감지 로직
|
|
75
|
+
|
|
76
|
+
- **Windows**: `chcp` 명령으로 코드 페이지를 얻어 `codePageToEncoding()`으로 변환
|
|
77
|
+
- **Linux/macOS**: `LANG` 또는 `LC_ALL` 환경 변수의 `.` 이후 부분 사용
|
|
78
|
+
- 감지 실패 시 `"utf-8"` 반환
|
|
79
|
+
|
|
80
|
+
## decodeBytes 디코딩 로직
|
|
81
|
+
|
|
82
|
+
- `systemEncoding`이 `"utf-8"`이면 UTF-8로 바로 디코딩
|
|
83
|
+
- 그렇지 않으면 먼저 UTF-8 strict 디코딩을 시도하고, 실패하면 `systemEncoding`으로 디코딩
|
|
84
|
+
|
|
85
|
+
## Usage
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { cpx } from "@simplysm/core-node";
|
|
89
|
+
|
|
90
|
+
// 기본 실행 (결과 대기)
|
|
91
|
+
const result = await cpx.spawn("git", ["status"], { cwd: "/project" });
|
|
92
|
+
console.log(result.stdout);
|
|
93
|
+
|
|
94
|
+
// 실시간 출력 표시
|
|
95
|
+
await cpx.spawn("npm", ["run", "build"], { stdio: "inherit" });
|
|
96
|
+
|
|
97
|
+
// 오류 무시
|
|
98
|
+
const result2 = await cpx.spawn("cmd", ["nonexistent"], { reject: false });
|
|
99
|
+
// result2.exitCode가 0이 아니어도 throw되지 않음
|
|
100
|
+
|
|
101
|
+
// 프로세스 제어
|
|
102
|
+
const proc = cpx.spawn("long-running", []);
|
|
103
|
+
setTimeout(() => proc.kill(), 5000);
|
|
104
|
+
const r = await proc;
|
|
105
|
+
|
|
106
|
+
// 동기 실행
|
|
107
|
+
const syncResult = cpx.spawnSync("node", ["--version"]);
|
|
108
|
+
|
|
109
|
+
// 인코딩 감지
|
|
110
|
+
const encoding = cpx.getSystemEncoding(); // e.g. "utf-8", "euc-kr"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 🚫 Anti-patterns
|
|
114
|
+
|
|
115
|
+
### reject: false 없이 실패 허용 프로세스 실행
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// ❌ exitCode !== 0이면 throw — 의도적으로 실패를 허용할 때 문제
|
|
119
|
+
const result = await cpx.spawn("grep", ["pattern", "file.txt"]);
|
|
120
|
+
|
|
121
|
+
// ✅ reject: false로 종료 코드를 직접 확인
|
|
122
|
+
const result = await cpx.spawn("grep", ["pattern", "file.txt"], { reject: false });
|
|
123
|
+
if (result.exitCode === 0) {
|
|
124
|
+
// 매칭 있음
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**근거**: `spawn`/`spawnSync`는 기본적으로 `exitCode !== 0`이면 오류를 발생시킨다. 실패가 정상 흐름인 경우 `reject: false` 필수.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# fsx
|
|
2
|
+
|
|
3
|
+
파일 시스템 작업을 위한 유틸리티 네임스페이스. 모든 연산은 동기(`*Sync`)와 비동기 쌍으로 제공된다.
|
|
4
|
+
비동기 버전을 기본으로 사용하고, CLI 초기화 등 동기가 반드시 필요한 경우에만 동기 버전을 사용한다.
|
|
5
|
+
|
|
6
|
+
```typescript
|
|
7
|
+
import { fsx } from "@simplysm/core-node";
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## When to use
|
|
11
|
+
|
|
12
|
+
- ✅ Node.js에서 파일/디렉토리 CRUD, glob 검색, JSON 파일 처리가 필요할 때
|
|
13
|
+
- ✅ 상위 디렉토리 자동 생성, 복사 시 필터링, 삭제 시 자동 재시도 등 편의 기능이 필요할 때
|
|
14
|
+
- ❌ 브라우저 환경 → `@simplysm/core-browser` 또는 Web API 사용
|
|
15
|
+
- ❌ 스트림 기반 대용량 파일 처리 → Node.js `fs.createReadStream` 직접 사용
|
|
16
|
+
|
|
17
|
+
## Members
|
|
18
|
+
|
|
19
|
+
### 존재 여부 확인
|
|
20
|
+
|
|
21
|
+
| Member | Kind | Signature | Description |
|
|
22
|
+
|--------|------|-----------|-------------|
|
|
23
|
+
| `exists` | function | `(targetPath: string) => Promise<boolean>` | 파일 또는 디렉토리가 존재하는지 확인 (비동기) |
|
|
24
|
+
| `existsSync` | function | `(targetPath: string) => boolean` | 파일 또는 디렉토리가 존재하는지 확인 (동기) |
|
|
25
|
+
|
|
26
|
+
### 디렉토리 생성
|
|
27
|
+
|
|
28
|
+
| Member | Kind | Signature | Description |
|
|
29
|
+
|--------|------|-----------|-------------|
|
|
30
|
+
| `mkdir` | function | `(targetPath: string) => Promise<void>` | 디렉토리를 재귀적으로 생성 (비동기) |
|
|
31
|
+
| `mkdirSync` | function | `(targetPath: string) => void` | 디렉토리를 재귀적으로 생성 (동기) |
|
|
32
|
+
|
|
33
|
+
### 삭제
|
|
34
|
+
|
|
35
|
+
| Member | Kind | Signature | Description |
|
|
36
|
+
|--------|------|-----------|-------------|
|
|
37
|
+
| `rm` | function | `(targetPath: string) => Promise<void>` | 파일/디렉토리 삭제. 파일 잠금 오류 시 최대 6회(500ms 간격) 재시도 (비동기) |
|
|
38
|
+
| `rmSync` | function | `(targetPath: string) => void` | 파일/디렉토리 삭제. 재시도 없이 즉시 실패 (동기) |
|
|
39
|
+
|
|
40
|
+
### 복사
|
|
41
|
+
|
|
42
|
+
| Member | Kind | Signature | Description |
|
|
43
|
+
|--------|------|-----------|-------------|
|
|
44
|
+
| `copy` | function | `(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean) => Promise<void>` | 파일/디렉토리 복사. sourcePath가 없으면 아무것도 하지 않음 (비동기) |
|
|
45
|
+
| `copySync` | function | `(sourcePath: string, targetPath: string, filter?: (absolutePath: string) => boolean) => void` | 파일/디렉토리 복사 (동기) |
|
|
46
|
+
|
|
47
|
+
### 파일 읽기
|
|
48
|
+
|
|
49
|
+
| Member | Kind | Signature | Description |
|
|
50
|
+
|--------|------|-----------|-------------|
|
|
51
|
+
| `read` | function | `(targetPath: string) => Promise<string>` | 파일을 UTF-8 문자열로 읽음 (비동기) |
|
|
52
|
+
| `readSync` | function | `(targetPath: string) => string` | 파일을 UTF-8 문자열로 읽음 (동기) |
|
|
53
|
+
| `readBytes` | function | `(targetPath: string) => Promise<Uint8Array>` | 파일을 Uint8Array로 읽음 (비동기) |
|
|
54
|
+
| `readBytesSync` | function | `(targetPath: string) => Uint8Array` | 파일을 Uint8Array로 읽음 (동기) |
|
|
55
|
+
| `readJson` | function | `<TData = unknown>(targetPath: string) => Promise<TData>` | JSON 파일 읽기, `@simplysm/core-common`의 `json.parse` 사용 (비동기) |
|
|
56
|
+
| `readJsonSync` | function | `<TData = unknown>(targetPath: string) => TData` | JSON 파일 읽기 (동기) |
|
|
57
|
+
|
|
58
|
+
### 파일 쓰기
|
|
59
|
+
|
|
60
|
+
| Member | Kind | Signature | Description |
|
|
61
|
+
|--------|------|-----------|-------------|
|
|
62
|
+
| `write` | function | `(targetPath: string, data: string \| Uint8Array) => Promise<void>` | 파일에 데이터 쓰기. 상위 디렉토리 자동 생성 (비동기) |
|
|
63
|
+
| `writeSync` | function | `(targetPath: string, data: string \| Uint8Array) => void` | 파일에 데이터 쓰기. 상위 디렉토리 자동 생성 (동기) |
|
|
64
|
+
| `writeJson` | function | `(targetPath: string, data: unknown, options?: { replacer?: ...; space?: string \| number }) => Promise<void>` | JSON 파일 쓰기, `@simplysm/core-common`의 `json.stringify` 사용 (비동기) |
|
|
65
|
+
| `writeJsonSync` | function | `(targetPath: string, data: unknown, options?: { replacer?: ...; space?: string \| number }) => void` | JSON 파일 쓰기 (동기) |
|
|
66
|
+
|
|
67
|
+
### 디렉토리 읽기
|
|
68
|
+
|
|
69
|
+
| Member | Kind | Signature | Description |
|
|
70
|
+
|--------|------|-----------|-------------|
|
|
71
|
+
| `readdir` | function | `(targetPath: string) => Promise<string[]>` | 디렉토리 내용 읽기 (비동기) |
|
|
72
|
+
| `readdirSync` | function | `(targetPath: string) => string[]` | 디렉토리 내용 읽기 (동기) |
|
|
73
|
+
|
|
74
|
+
### 파일 정보
|
|
75
|
+
|
|
76
|
+
| Member | Kind | Signature | Description |
|
|
77
|
+
|--------|------|-----------|-------------|
|
|
78
|
+
| `stat` | function | `(targetPath: string) => Promise<fs.Stats>` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라감 (비동기) |
|
|
79
|
+
| `statSync` | function | `(targetPath: string) => fs.Stats` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라감 (동기) |
|
|
80
|
+
| `lstat` | function | `(targetPath: string) => Promise<fs.Stats>` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라가지 않음 (비동기) |
|
|
81
|
+
| `lstatSync` | function | `(targetPath: string) => fs.Stats` | 파일/디렉토리 정보 조회. 심볼릭 링크를 따라가지 않음 (동기) |
|
|
82
|
+
|
|
83
|
+
### Glob
|
|
84
|
+
|
|
85
|
+
| Member | Kind | Signature | Description |
|
|
86
|
+
|--------|------|-----------|-------------|
|
|
87
|
+
| `glob` | function | `(pattern: string, options?: GlobOptions) => Promise<string[]>` | Glob 패턴으로 파일 검색. 절대 경로 배열 반환 (비동기) |
|
|
88
|
+
| `globSync` | function | `(pattern: string, options?: GlobOptions) => string[]` | Glob 패턴으로 파일 검색 (동기) |
|
|
89
|
+
|
|
90
|
+
### 유틸리티
|
|
91
|
+
|
|
92
|
+
| Member | Kind | Signature | Description |
|
|
93
|
+
|--------|------|-----------|-------------|
|
|
94
|
+
| `clearEmptyDirectory` | function | `(dirPath: string) => Promise<void>` | 지정 디렉토리 하위의 빈 디렉토리를 재귀적으로 삭제 |
|
|
95
|
+
| `findAllParentChildPaths` | function | `(childGlob: string, fromPath: string, rootPath?: string) => Promise<string[]>` | 시작 경로에서 루트 방향으로 부모 디렉토리를 순회하며 glob 패턴에 매칭되는 파일 검색 (비동기) |
|
|
96
|
+
| `findAllParentChildPathsSync` | function | `(childGlob: string, fromPath: string, rootPath?: string) => string[]` | 시작 경로에서 루트 방향으로 부모 디렉토리를 순회하며 glob 패턴에 매칭되는 파일 검색 (동기) |
|
|
97
|
+
|
|
98
|
+
## `copy` / `copySync` — filter 파라미터
|
|
99
|
+
|
|
100
|
+
- 각 파일/디렉토리의 **절대 경로**가 전달된다
|
|
101
|
+
- `true` 반환 시 복사, `false` 반환 시 제외
|
|
102
|
+
- 최상위 `sourcePath`는 필터링 대상이 아니다. 필터는 모든 하위 항목(직접 및 간접)에 재귀적으로 적용된다
|
|
103
|
+
- 디렉토리에 대해 `false`를 반환하면 해당 디렉토리와 모든 내용을 건너뛴다
|
|
104
|
+
|
|
105
|
+
## `findAllParentChildPaths` / `findAllParentChildPathsSync` — rootPath 주의
|
|
106
|
+
|
|
107
|
+
- `fromPath`는 `rootPath`의 하위 경로여야 한다. 그렇지 않으면 파일 시스템 루트까지 검색한다
|
|
108
|
+
|
|
109
|
+
## Usage
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import { fsx } from "@simplysm/core-node";
|
|
113
|
+
|
|
114
|
+
// 파일 존재 확인
|
|
115
|
+
const exists = await fsx.exists("/path/to/file.txt");
|
|
116
|
+
|
|
117
|
+
// 읽기/쓰기
|
|
118
|
+
const content = await fsx.read("/path/to/file.txt");
|
|
119
|
+
await fsx.write("/path/to/new-file.txt", "Hello, World!");
|
|
120
|
+
|
|
121
|
+
// JSON 읽기/쓰기
|
|
122
|
+
const data = await fsx.readJson<{ name: string }>("/config.json");
|
|
123
|
+
await fsx.writeJson("/config.json", { name: "test" });
|
|
124
|
+
|
|
125
|
+
// 복사 (필터 적용)
|
|
126
|
+
await fsx.copy("/src/dir", "/dst/dir", (filePath) => !filePath.includes("node_modules"));
|
|
127
|
+
|
|
128
|
+
// Glob 검색
|
|
129
|
+
const tsFiles = await fsx.glob("src/**/*.ts");
|
|
130
|
+
|
|
131
|
+
// 빈 디렉토리 정리
|
|
132
|
+
await fsx.clearEmptyDirectory("/output");
|
|
133
|
+
|
|
134
|
+
// 부모 디렉토리에서 파일 검색
|
|
135
|
+
const configs = await fsx.findAllParentChildPaths("package.json", "/project/src/components");
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## 🚫 Anti-patterns
|
|
139
|
+
|
|
140
|
+
### 동기 버전을 기본으로 사용
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// ❌ 비동기 컨텍스트에서 동기 함수 사용
|
|
144
|
+
async function process() {
|
|
145
|
+
const content = fsx.readSync("/path/to/file.txt");
|
|
146
|
+
fsx.writeSync("/path/to/output.txt", content);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ✅ 비동기 버전 사용
|
|
150
|
+
async function process() {
|
|
151
|
+
const content = await fsx.read("/path/to/file.txt");
|
|
152
|
+
await fsx.write("/path/to/output.txt", content);
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**근거**: 동기 버전은 이벤트 루프를 차단한다. CLI 초기화 등 반드시 동기가 필요한 경우에만 `*Sync` 사용.
|
|
157
|
+
|
|
158
|
+
### rmSync로 일시적 파일 잠금 오류 처리
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
// ❌ rmSync는 재시도 없이 즉시 실패
|
|
162
|
+
fsx.rmSync("/path/to/locked-file");
|
|
163
|
+
|
|
164
|
+
// ✅ rm은 파일 잠금 시 최대 6회(500ms 간격) 재시도
|
|
165
|
+
await fsx.rm("/path/to/locked-file");
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**근거**: Windows에서 파일 잠금은 흔한 일시적 오류. 비동기 `rm`을 사용하면 자동 재시도된다.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# pathx
|
|
2
|
+
|
|
3
|
+
경로 처리 및 `PosixPath` 브랜드 타입 유틸리티 네임스페이스.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { pathx } from "@simplysm/core-node";
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
- ✅ Windows 경로를 POSIX 슬래시로 정규화해야 할 때
|
|
12
|
+
- ✅ 경로 간 하위 관계를 확인하거나, 파일 경로의 디렉토리를 바꿔야 할 때
|
|
13
|
+
- ❌ 단순 `path.join`/`path.resolve`만 필요한 경우 → Node.js `path` 모듈 직접 사용
|
|
14
|
+
|
|
15
|
+
## Members
|
|
16
|
+
|
|
17
|
+
| Member | Kind | Signature | Description |
|
|
18
|
+
|--------|------|-----------|-------------|
|
|
19
|
+
| `PosixPath` | type | `string & { [POSIX]: never }` | POSIX 스타일(슬래시) 경로 브랜드 타입 |
|
|
20
|
+
| `posix` | function | `(p: string) => PosixPath` | 백슬래시를 슬래시로 변환. resolve는 수행하지 않음 |
|
|
21
|
+
| `posixResolve` | function | `(...args: string[]) => PosixPath` | 절대 경로로 resolve한 뒤 POSIX 스타일로 변환 |
|
|
22
|
+
| `changeFileDirectory` | function | `(filePath: string, fromDirectory: string, toDirectory: string) => string` | 파일 경로의 디렉토리를 변경 |
|
|
23
|
+
| `basenameWithoutExt` | function | `(filePath: string) => string` | 확장자를 제외한 파일명(basename) 반환 |
|
|
24
|
+
| `isChildPath` | function | `(childPath: string, parentPath: string) => boolean` | childPath가 parentPath의 하위 경로인지 확인 |
|
|
25
|
+
| `filterByTargets` | function | `(files: string[], targets: string[], cwd: string) => string[]` | 대상 경로 목록에 기반한 파일 필터링 |
|
|
26
|
+
|
|
27
|
+
## `PosixPath`
|
|
28
|
+
|
|
29
|
+
슬래시(`/`) 구분자임을 타입 수준에서 보장하는 브랜드 타입. `posix()` 또는 `posixResolve()`를 통해서만 생성할 수 있다. `FsWatcher`가 반환하는 경로는 항상 `PosixPath`다.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
export type PosixPath = string & {
|
|
33
|
+
[POSIX]: never;
|
|
34
|
+
};
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## `changeFileDirectory` — 예외 조건
|
|
38
|
+
|
|
39
|
+
`filePath`가 `fromDirectory` 내부에 없으면 `ArgumentError`를 throw한다.
|
|
40
|
+
|
|
41
|
+
## `isChildPath` — 동일 경로 처리
|
|
42
|
+
|
|
43
|
+
동일한 경로이면 `false`를 반환한다. 내부적으로 `posixResolve()`로 정규화하여 비교한다.
|
|
44
|
+
|
|
45
|
+
## `filterByTargets` — files 파라미터 주의
|
|
46
|
+
|
|
47
|
+
`files`는 `cwd` 하위의 절대 경로여야 한다. `cwd` 외부 경로는 상대 경로(`../`)로 변환되어 처리되며 의도치 않은 결과가 생길 수 있다. `targets`가 비어있으면 `files`를 그대로 반환한다.
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { pathx } from "@simplysm/core-node";
|
|
53
|
+
|
|
54
|
+
// POSIX 경로 변환
|
|
55
|
+
const p = pathx.posix("C:\\Users\\test"); // "C:/Users/test"
|
|
56
|
+
|
|
57
|
+
// 절대 경로 resolve + POSIX
|
|
58
|
+
const abs = pathx.posixResolve("./relative", "path"); // e.g. "D:/cwd/relative/path"
|
|
59
|
+
|
|
60
|
+
// 파일 디렉토리 변경
|
|
61
|
+
const newPath = pathx.changeFileDirectory("/a/b/c.txt", "/a", "/x"); // "/x/b/c.txt"
|
|
62
|
+
|
|
63
|
+
// 확장자 없는 basename
|
|
64
|
+
pathx.basenameWithoutExt("file.spec.ts"); // "file.spec"
|
|
65
|
+
|
|
66
|
+
// 자식 경로 확인
|
|
67
|
+
pathx.isChildPath("/a/b/c", "/a/b"); // true
|
|
68
|
+
pathx.isChildPath("/a/b", "/a/b"); // false (동일 경로)
|
|
69
|
+
|
|
70
|
+
// 파일 필터링
|
|
71
|
+
const files = ["/proj/src/a.ts", "/proj/tests/b.ts"];
|
|
72
|
+
pathx.filterByTargets(files, ["src"], "/proj"); // ["/proj/src/a.ts"]
|
|
73
|
+
```
|