@simplysm/orm-node 13.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/.cache/typecheck-node.tsbuildinfo +1 -0
  2. package/README.md +418 -0
  3. package/dist/connections/mssql-db-conn.js +386 -0
  4. package/dist/connections/mssql-db-conn.js.map +7 -0
  5. package/dist/connections/mysql-db-conn.js +227 -0
  6. package/dist/connections/mysql-db-conn.js.map +7 -0
  7. package/dist/connections/postgresql-db-conn.js +191 -0
  8. package/dist/connections/postgresql-db-conn.js.map +7 -0
  9. package/dist/core-common/src/common.types.d.ts +74 -0
  10. package/dist/core-common/src/common.types.d.ts.map +1 -0
  11. package/dist/core-common/src/env.d.ts +6 -0
  12. package/dist/core-common/src/env.d.ts.map +1 -0
  13. package/dist/core-common/src/errors/argument-error.d.ts +25 -0
  14. package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
  15. package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
  16. package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
  17. package/dist/core-common/src/errors/sd-error.d.ts +27 -0
  18. package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
  19. package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
  20. package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
  21. package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
  22. package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
  23. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
  24. package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
  25. package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
  26. package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
  27. package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
  28. package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
  29. package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
  30. package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
  31. package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
  32. package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
  33. package/dist/core-common/src/features/event-emitter.d.ts +66 -0
  34. package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
  35. package/dist/core-common/src/features/serial-queue.d.ts +47 -0
  36. package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
  37. package/dist/core-common/src/index.d.ts +32 -0
  38. package/dist/core-common/src/index.d.ts.map +1 -0
  39. package/dist/core-common/src/types/date-only.d.ts +152 -0
  40. package/dist/core-common/src/types/date-only.d.ts.map +1 -0
  41. package/dist/core-common/src/types/date-time.d.ts +96 -0
  42. package/dist/core-common/src/types/date-time.d.ts.map +1 -0
  43. package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
  44. package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
  45. package/dist/core-common/src/types/time.d.ts +68 -0
  46. package/dist/core-common/src/types/time.d.ts.map +1 -0
  47. package/dist/core-common/src/types/uuid.d.ts +35 -0
  48. package/dist/core-common/src/types/uuid.d.ts.map +1 -0
  49. package/dist/core-common/src/utils/bytes.d.ts +51 -0
  50. package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
  51. package/dist/core-common/src/utils/date-format.d.ts +90 -0
  52. package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
  53. package/dist/core-common/src/utils/json.d.ts +34 -0
  54. package/dist/core-common/src/utils/json.d.ts.map +1 -0
  55. package/dist/core-common/src/utils/num.d.ts +60 -0
  56. package/dist/core-common/src/utils/num.d.ts.map +1 -0
  57. package/dist/core-common/src/utils/obj.d.ts +258 -0
  58. package/dist/core-common/src/utils/obj.d.ts.map +1 -0
  59. package/dist/core-common/src/utils/path.d.ts +23 -0
  60. package/dist/core-common/src/utils/path.d.ts.map +1 -0
  61. package/dist/core-common/src/utils/primitive.d.ts +18 -0
  62. package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
  63. package/dist/core-common/src/utils/str.d.ts +103 -0
  64. package/dist/core-common/src/utils/str.d.ts.map +1 -0
  65. package/dist/core-common/src/utils/template-strings.d.ts +84 -0
  66. package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
  67. package/dist/core-common/src/utils/transferable.d.ts +47 -0
  68. package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
  69. package/dist/core-common/src/utils/wait.d.ts +19 -0
  70. package/dist/core-common/src/utils/wait.d.ts.map +1 -0
  71. package/dist/core-common/src/utils/xml.d.ts +36 -0
  72. package/dist/core-common/src/utils/xml.d.ts.map +1 -0
  73. package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
  74. package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
  75. package/dist/db-conn-factory.js +88 -0
  76. package/dist/db-conn-factory.js.map +7 -0
  77. package/dist/index.js +9 -0
  78. package/dist/index.js.map +7 -0
  79. package/dist/node-db-context-executor.js +129 -0
  80. package/dist/node-db-context-executor.js.map +7 -0
  81. package/dist/orm-common/src/db-context.d.ts +669 -0
  82. package/dist/orm-common/src/db-context.d.ts.map +1 -0
  83. package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
  84. package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
  85. package/dist/orm-common/src/exec/executable.d.ts +79 -0
  86. package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
  87. package/dist/orm-common/src/exec/queryable.d.ts +708 -0
  88. package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
  89. package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
  90. package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
  91. package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
  92. package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
  93. package/dist/orm-common/src/expr/expr.d.ts +1369 -0
  94. package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
  95. package/dist/orm-common/src/index.d.ts +32 -0
  96. package/dist/orm-common/src/index.d.ts.map +1 -0
  97. package/dist/orm-common/src/models/system-migration.d.ts +10 -0
  98. package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
  99. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
  100. package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
  101. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
  102. package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
  103. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
  104. package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
  105. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
  106. package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
  107. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
  108. package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
  109. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
  110. package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
  111. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
  112. package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
  113. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
  114. package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
  115. package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
  116. package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
  117. package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
  118. package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
  119. package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
  120. package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
  121. package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
  122. package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
  123. package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
  124. package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
  125. package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
  126. package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
  127. package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
  128. package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
  129. package/dist/orm-common/src/types/column.d.ts +172 -0
  130. package/dist/orm-common/src/types/column.d.ts.map +1 -0
  131. package/dist/orm-common/src/types/db.d.ts +175 -0
  132. package/dist/orm-common/src/types/db.d.ts.map +1 -0
  133. package/dist/orm-common/src/types/expr.d.ts +474 -0
  134. package/dist/orm-common/src/types/expr.d.ts.map +1 -0
  135. package/dist/orm-common/src/types/query-def.d.ts +351 -0
  136. package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
  137. package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
  138. package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
  139. package/dist/orm-node/src/connections/mssql-db-conn.d.ts +44 -0
  140. package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +1 -0
  141. package/dist/orm-node/src/connections/mysql-db-conn.d.ts +38 -0
  142. package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +1 -0
  143. package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +39 -0
  144. package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +1 -0
  145. package/dist/orm-node/src/db-conn-factory.d.ts +25 -0
  146. package/dist/orm-node/src/db-conn-factory.d.ts.map +1 -0
  147. package/dist/orm-node/src/index.d.ts +9 -0
  148. package/dist/orm-node/src/index.d.ts.map +1 -0
  149. package/dist/orm-node/src/node-db-context-executor.d.ts +77 -0
  150. package/dist/orm-node/src/node-db-context-executor.d.ts.map +1 -0
  151. package/dist/orm-node/src/pooled-db-conn.d.ts +79 -0
  152. package/dist/orm-node/src/pooled-db-conn.d.ts.map +1 -0
  153. package/dist/orm-node/src/sd-orm.d.ts +78 -0
  154. package/dist/orm-node/src/sd-orm.d.ts.map +1 -0
  155. package/dist/orm-node/src/types/db-conn.d.ts +159 -0
  156. package/dist/orm-node/src/types/db-conn.d.ts.map +1 -0
  157. package/dist/pooled-db-conn.js +134 -0
  158. package/dist/pooled-db-conn.js.map +7 -0
  159. package/dist/sd-orm.js +44 -0
  160. package/dist/sd-orm.js.map +7 -0
  161. package/dist/types/db-conn.js +17 -0
  162. package/dist/types/db-conn.js.map +7 -0
  163. package/package.json +50 -0
  164. package/src/connections/mssql-db-conn.ts +483 -0
  165. package/src/connections/mysql-db-conn.ts +299 -0
  166. package/src/connections/postgresql-db-conn.ts +254 -0
  167. package/src/db-conn-factory.ts +114 -0
  168. package/src/index.ts +13 -0
  169. package/src/node-db-context-executor.ts +162 -0
  170. package/src/pooled-db-conn.ts +175 -0
  171. package/src/sd-orm.ts +102 -0
  172. package/src/types/db-conn.ts +196 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/connections/mysql-db-conn.ts"],
4
+ "sourcesContent": ["import { randomUUID } from \"crypto\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport type { Connection } from \"mysql2/promise\";\nimport { createConsola } from \"consola\";\nimport {\n bytesToHex,\n DateOnly,\n DateTime,\n SdError,\n EventEmitter,\n strIsNullOrEmpty,\n Time,\n Uuid,\n} from \"@simplysm/core-common\";\nimport type { ColumnMeta, DataType, IsolationLevel } from \"@simplysm/orm-common\";\nimport { DB_CONN_DEFAULT_TIMEOUT, DB_CONN_ERRORS, type DbConn, type MysqlDbConnConfig } from \"../types/db-conn\";\n\nconst logger = createConsola().withTag(\"mysql-db-conn\");\n\n/**\n * MySQL \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC5F0\uACB0 \uD074\uB798\uC2A4\n *\n * mysql2/promise \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD558\uC5EC MySQL \uC5F0\uACB0\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.\n */\nexport class MysqlDbConn extends EventEmitter<{ close: void }> implements DbConn {\n private static readonly _ROOT_USER = \"root\";\n private readonly _timeout = DB_CONN_DEFAULT_TIMEOUT;\n\n private _conn?: Connection;\n private _connTimeout?: ReturnType<typeof setTimeout>;\n\n isConnected = false;\n isOnTransaction = false;\n\n constructor(\n private readonly _mysql2: typeof import(\"mysql2/promise\"),\n readonly config: MysqlDbConnConfig,\n ) {\n super();\n }\n\n async connect(): Promise<void> {\n if (this.isConnected) {\n throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);\n }\n\n const conn = await this._mysql2.createConnection({\n host: this.config.host,\n port: this.config.port,\n user: this.config.username,\n password: this.config.password,\n // root \uC0AC\uC6A9\uC790\uB294 \uD2B9\uC815 database\uC5D0 \uBC14\uC778\uB529\uB418\uC9C0 \uC54A\uACE0 \uC5F0\uACB0\uD558\uC5EC\n // \uBAA8\uB4E0 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB3C4\uB85D \uD568 (\uAD00\uB9AC \uC791\uC5C5\uC6A9)\n database: this.config.username === MysqlDbConn._ROOT_USER ? undefined : this.config.database,\n multipleStatements: true,\n charset: \"utf8mb4\",\n infileStreamFactory: (filePath: string) => fs.createReadStream(filePath), // LOAD DATA LOCAL INFILE \uC9C0\uC6D0\n } as Parameters<typeof this._mysql2.createConnection>[0]);\n\n conn.on(\"end\", () => {\n this.emit(\"close\");\n this._resetState();\n });\n\n conn.on(\"error\", (error) => {\n logger.error(\"DB \uC5F0\uACB0 \uC624\uB958\", error.message);\n });\n\n this._conn = conn;\n this._startTimeout();\n this.isConnected = true;\n }\n\n async close(): Promise<void> {\n this._stopTimeout();\n\n if (this._conn == null || !this.isConnected) {\n return;\n }\n\n await this._conn.end();\n\n this.emit(\"close\");\n this._resetState();\n }\n\n async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {\n const conn = this._assertConnected();\n\n const level = (isolationLevel ?? this.config.defaultIsolationLevel ?? \"READ_UNCOMMITTED\").replace(/_/g, \" \");\n\n // \uACA9\uB9AC \uC218\uC900\uC744 \uBA3C\uC800 \uC124\uC815 (\uB2E4\uC74C \uD2B8\uB79C\uC7AD\uC158\uC5D0 \uC801\uC6A9\uB428)\n await conn.query({\n sql: `SET SESSION TRANSACTION ISOLATION LEVEL ${level}`,\n timeout: this._timeout,\n });\n\n // \uADF8 \uB2E4\uC74C \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791\n await conn.beginTransaction();\n\n this.isOnTransaction = true;\n }\n\n async commitTransaction(): Promise<void> {\n const conn = this._assertConnected();\n await conn.commit();\n this.isOnTransaction = false;\n }\n\n async rollbackTransaction(): Promise<void> {\n const conn = this._assertConnected();\n await conn.rollback();\n this.isOnTransaction = false;\n }\n\n async execute(queries: string[]): Promise<unknown[][]> {\n const results: unknown[][] = [];\n for (const query of queries.filter((item) => !strIsNullOrEmpty(item))) {\n const resultItems = await this.executeParametrized(query);\n results.push(...resultItems);\n }\n return results;\n }\n\n async executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]> {\n const conn = this._assertConnected();\n\n logger.debug(\"\uCFFC\uB9AC \uC2E4\uD589\", { queryLength: query.length, params });\n\n try {\n const [queryResults] = await conn.query({\n sql: query,\n timeout: this._timeout,\n values: params,\n });\n\n this._startTimeout();\n\n // MySQL\uC740 INSERT/UPDATE/DELETE \uBB38\uC5D0 \uB300\uD574 ResultSetHeader\uB97C \uBC18\uD658\uD568\n // SELECT \uACB0\uACFC\uB9CC \uCD94\uCD9C\uD558\uAE30 \uC704\uD574 ResultSetHeader \uAC1D\uCCB4\uB97C \uD544\uD130\uB9C1\uD568\n // ResultSetHeader\uB294 affectedRows, fieldCount \uB4F1\uC758 \uD544\uB4DC\uB97C \uAC00\uC9C0\uACE0 \uC788\uC74C\n const result: unknown[] = [];\n if (queryResults instanceof Array) {\n for (const queryResult of queryResults.filter(\n (item: unknown) =>\n !(typeof item === \"object\" && item !== null && \"affectedRows\" in item && \"fieldCount\" in item),\n )) {\n result.push(queryResult);\n }\n }\n\n return [result];\n } catch (err) {\n this._startTimeout();\n const error = err as Error & { sql?: string };\n throw new SdError(\n error,\n \"\uCFFC\uB9AC \uC218\uD589\uC911 \uC624\uB958\uBC1C\uC0DD\" + (error.sql != null ? \"\\n-- query\\n\" + error.sql.trim() + \"\\n--\" : \"\"),\n );\n }\n }\n\n async bulkInsert(\n tableName: string,\n columnMetas: Record<string, ColumnMeta>,\n records: Record<string, unknown>[],\n ): Promise<void> {\n const conn = this._assertConnected();\n\n if (records.length === 0) return;\n\n const colNames = Object.keys(columnMetas);\n\n // \uC784\uC2DC CSV \uD30C\uC77C \uC0DD\uC131\n const tmpDir = os.tmpdir();\n const tmpFile = path.join(tmpDir, `mysql_bulk_${randomUUID()}.csv`);\n\n try {\n // CSV \uB370\uC774\uD130 \uC0DD\uC131\n const csvLines: string[] = [];\n for (const record of records) {\n const row = colNames.map((colName) => this._escapeForCsv(record[colName], columnMetas[colName].dataType));\n csvLines.push(row.join(\"\\t\"));\n }\n const csvContent = csvLines.join(\"\\n\");\n\n // \uD30C\uC77C \uC4F0\uAE30\n await fs.promises.writeFile(tmpFile, csvContent, \"utf8\");\n\n // UUID/binary \uCEEC\uB7FC\uC740 \uC784\uC2DC \uBCC0\uC218\uB85C \uC77D\uACE0 SET \uC808\uC5D0\uC11C UNHEX() \uBCC0\uD658\n const binaryColNames = colNames.filter((c) => {\n const dt = columnMetas[c].dataType.type;\n return dt === \"uuid\" || dt === \"binary\";\n });\n const normalCols = colNames.map((c) => {\n if (binaryColNames.includes(c)) return `@_${c}`;\n return `\\`${c}\\``;\n });\n const setClauses = binaryColNames.map((c) => `\\`${c}\\` = UNHEX(@_${c})`);\n\n // LOAD DATA LOCAL INFILE \uC2E4\uD589\n let query = `LOAD DATA LOCAL INFILE ? INTO TABLE ${tableName} FIELDS TERMINATED BY '\\\\t' LINES TERMINATED BY '\\\\n' (${normalCols.join(\", \")})`;\n if (setClauses.length > 0) {\n query += ` SET ${setClauses.join(\", \")}`;\n }\n\n await conn.query({ sql: query, timeout: this._timeout, values: [tmpFile] });\n } finally {\n // \uC784\uC2DC \uD30C\uC77C \uC0AD\uC81C\n try {\n await fs.promises.unlink(tmpFile);\n } catch {\n // \uC0AD\uC81C \uC2E4\uD328 \uBB34\uC2DC\n }\n }\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Private helpers\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * MySQL LOAD DATA INFILE\uC6A9 \uAC12 \uC774\uC2A4\uCF00\uC774\uD504\n */\n private _escapeForCsv(value: unknown, dataType: DataType): string {\n if (value == null) {\n return \"\\\\N\"; // MySQL NULL \uD45C\uD604\n }\n\n switch (dataType.type) {\n case \"int\":\n case \"bigint\":\n case \"float\":\n case \"double\":\n case \"decimal\":\n return String(value);\n\n case \"boolean\":\n return (value as boolean) ? \"1\" : \"0\";\n\n case \"varchar\":\n case \"char\":\n case \"text\": {\n const str = value as string;\n // \uD0ED, \uC904\uBC14\uAFC8, \uBC31\uC2AC\uB798\uC2DC \uC774\uC2A4\uCF00\uC774\uD504\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\t/g, \"\\\\t\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\");\n }\n\n case \"datetime\":\n return (value as DateTime).toFormatString(\"yyyy-MM-dd HH:mm:ss.fff\");\n\n case \"date\":\n return (value as DateOnly).toFormatString(\"yyyy-MM-dd\");\n\n case \"time\":\n return (value as Time).toFormatString(\"HH:mm:ss\");\n\n case \"uuid\":\n return (value as Uuid).toString().replace(/-/g, \"\"); // BINARY(16) \uC800\uC7A5\uC6A9 hex\n\n case \"binary\":\n return bytesToHex(value as Uint8Array);\n\n default:\n throw new SdError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 DataType: ${JSON.stringify(dataType)}`);\n }\n }\n\n private _assertConnected(): Connection {\n if (this._conn == null || !this.isConnected) {\n throw new SdError(DB_CONN_ERRORS.NOT_CONNECTED);\n }\n this._startTimeout();\n return this._conn;\n }\n\n private _resetState(): void {\n this.isConnected = false;\n this.isOnTransaction = false;\n this._conn = undefined;\n }\n\n private _stopTimeout(): void {\n if (this._connTimeout != null) {\n clearTimeout(this._connTimeout);\n }\n }\n\n private _startTimeout(): void {\n this._stopTimeout();\n this._connTimeout = setTimeout(() => {\n this.close().catch((err) => {\n logger.error(\"close error\", err instanceof Error ? err.message : String(err));\n });\n }, this._timeout * 2);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,191 @@
1
+ import { Readable } from "stream";
2
+ import { createConsola } from "consola";
3
+ import {
4
+ bytesToHex,
5
+ DateOnly,
6
+ DateTime,
7
+ SdError,
8
+ EventEmitter,
9
+ strIsNullOrEmpty,
10
+ Time,
11
+ Uuid
12
+ } from "@simplysm/core-common";
13
+ import { DB_CONN_DEFAULT_TIMEOUT, DB_CONN_ERRORS } from "../types/db-conn";
14
+ const logger = createConsola().withTag("postgresql-db-conn");
15
+ class PostgresqlDbConn extends EventEmitter {
16
+ constructor(_pg, _pgCopyFrom, config) {
17
+ super();
18
+ this._pg = _pg;
19
+ this._pgCopyFrom = _pgCopyFrom;
20
+ this.config = config;
21
+ }
22
+ _timeout = DB_CONN_DEFAULT_TIMEOUT;
23
+ _client;
24
+ _connTimeout;
25
+ isConnected = false;
26
+ isOnTransaction = false;
27
+ async connect() {
28
+ if (this.isConnected) {
29
+ throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);
30
+ }
31
+ const client = new this._pg.Client({
32
+ host: this.config.host,
33
+ port: this.config.port ?? 5432,
34
+ user: this.config.username,
35
+ password: this.config.password,
36
+ database: this.config.database,
37
+ connectionTimeoutMillis: this._timeout,
38
+ query_timeout: this._timeout
39
+ });
40
+ client.on("end", () => {
41
+ this.emit("close");
42
+ this._resetState();
43
+ });
44
+ client.on("error", (error) => {
45
+ logger.error("DB \uC5F0\uACB0 \uC624\uB958", error.message);
46
+ });
47
+ await client.connect();
48
+ this._client = client;
49
+ this._startTimeout();
50
+ this.isConnected = true;
51
+ }
52
+ async close() {
53
+ this._stopTimeout();
54
+ if (this._client == null || !this.isConnected) {
55
+ return;
56
+ }
57
+ await this._client.end();
58
+ this.emit("close");
59
+ this._resetState();
60
+ }
61
+ async beginTransaction(isolationLevel) {
62
+ this._assertConnected();
63
+ const level = (isolationLevel ?? this.config.defaultIsolationLevel ?? "READ_UNCOMMITTED").replace(/_/g, " ");
64
+ await this._client.query("BEGIN");
65
+ await this._client.query(`SET TRANSACTION ISOLATION LEVEL ${level}`);
66
+ this.isOnTransaction = true;
67
+ }
68
+ async commitTransaction() {
69
+ this._assertConnected();
70
+ await this._client.query("COMMIT");
71
+ this.isOnTransaction = false;
72
+ }
73
+ async rollbackTransaction() {
74
+ this._assertConnected();
75
+ await this._client.query("ROLLBACK");
76
+ this.isOnTransaction = false;
77
+ }
78
+ async execute(queries) {
79
+ const results = [];
80
+ for (const query of queries.filter((item) => !strIsNullOrEmpty(item))) {
81
+ const resultItems = await this.executeParametrized(query);
82
+ results.push(...resultItems);
83
+ }
84
+ return results;
85
+ }
86
+ async executeParametrized(query, params) {
87
+ this._assertConnected();
88
+ logger.debug("\uCFFC\uB9AC \uC2E4\uD589", { queryLength: query.length, params });
89
+ try {
90
+ const result = await this._client.query(query, params);
91
+ this._startTimeout();
92
+ return [result.rows];
93
+ } catch (err) {
94
+ this._startTimeout();
95
+ const error = err instanceof Error ? err : new Error(String(err));
96
+ throw new SdError(error, "\uCFFC\uB9AC \uC218\uD589\uC911 \uC624\uB958\uBC1C\uC0DD\n-- query\n" + query.trim() + "\n--");
97
+ }
98
+ }
99
+ async bulkInsert(tableName, columnMetas, records) {
100
+ this._assertConnected();
101
+ if (records.length === 0) return;
102
+ const colNames = Object.keys(columnMetas);
103
+ const wrappedCols = colNames.map((c) => `"${c}"`).join(", ");
104
+ const copyQuery = `COPY ${tableName} (${wrappedCols}) FROM STDIN WITH (FORMAT csv, NULL '\\N')`;
105
+ const stream = this._client.query(this._pgCopyFrom(copyQuery));
106
+ const csvLines = [];
107
+ for (const record of records) {
108
+ const row = colNames.map((colName) => this._escapeForCsv(record[colName], columnMetas[colName].dataType));
109
+ csvLines.push(row.join(","));
110
+ }
111
+ const csvContent = csvLines.join("\n") + "\n";
112
+ await new Promise((resolve, reject) => {
113
+ const readable = Readable.from([csvContent]);
114
+ readable.on("error", reject);
115
+ stream.on("error", reject);
116
+ stream.on("finish", resolve);
117
+ readable.pipe(stream);
118
+ });
119
+ }
120
+ // ─────────────────────────────────────────────
121
+ // Private helpers
122
+ // ─────────────────────────────────────────────
123
+ /**
124
+ * PostgreSQL COPY CSV용 κ°’ μ΄μŠ€μΌ€μ΄ν”„
125
+ */
126
+ _escapeForCsv(value, dataType) {
127
+ if (value == null) {
128
+ return "\\N";
129
+ }
130
+ switch (dataType.type) {
131
+ case "int":
132
+ case "bigint":
133
+ case "float":
134
+ case "double":
135
+ case "decimal":
136
+ return String(value);
137
+ case "boolean":
138
+ return value ? "true" : "false";
139
+ case "varchar":
140
+ case "char":
141
+ case "text": {
142
+ const str = value;
143
+ if (str.includes('"') || str.includes(",") || str.includes("\n") || str.includes("\r")) {
144
+ return '"' + str.replace(/"/g, '""') + '"';
145
+ }
146
+ return str;
147
+ }
148
+ case "datetime":
149
+ return value.toFormatString("yyyy-MM-dd HH:mm:ss.fff");
150
+ case "date":
151
+ return value.toFormatString("yyyy-MM-dd");
152
+ case "time":
153
+ return value.toFormatString("HH:mm:ss");
154
+ case "uuid":
155
+ return value.toString();
156
+ case "binary":
157
+ return '"\\x' + bytesToHex(value) + '"';
158
+ // PostgreSQL bytea hex ν˜•μ‹ (CSV μŒλ”°μ˜΄ν‘œλ‘œ 감쌈)
159
+ default:
160
+ throw new SdError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 DataType: ${JSON.stringify(dataType)}`);
161
+ }
162
+ }
163
+ _assertConnected() {
164
+ if (this._client == null || !this.isConnected) {
165
+ throw new SdError(DB_CONN_ERRORS.NOT_CONNECTED);
166
+ }
167
+ this._startTimeout();
168
+ }
169
+ _resetState() {
170
+ this.isConnected = false;
171
+ this.isOnTransaction = false;
172
+ this._client = void 0;
173
+ }
174
+ _stopTimeout() {
175
+ if (this._connTimeout != null) {
176
+ clearTimeout(this._connTimeout);
177
+ }
178
+ }
179
+ _startTimeout() {
180
+ this._stopTimeout();
181
+ this._connTimeout = setTimeout(() => {
182
+ this.close().catch((err) => {
183
+ logger.error("close error", err instanceof Error ? err.message : String(err));
184
+ });
185
+ }, this._timeout * 2);
186
+ }
187
+ }
188
+ export {
189
+ PostgresqlDbConn
190
+ };
191
+ //# sourceMappingURL=postgresql-db-conn.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/connections/postgresql-db-conn.ts"],
4
+ "sourcesContent": ["import { Readable } from \"stream\";\nimport { createConsola } from \"consola\";\nimport {\n bytesToHex,\n DateOnly,\n DateTime,\n SdError,\n EventEmitter,\n strIsNullOrEmpty,\n Time,\n Uuid,\n} from \"@simplysm/core-common\";\nimport type { ColumnMeta, DataType, IsolationLevel } from \"@simplysm/orm-common\";\nimport { DB_CONN_DEFAULT_TIMEOUT, DB_CONN_ERRORS, type DbConn, type PostgresqlDbConnConfig } from \"../types/db-conn\";\nimport type { Client } from \"pg\";\nimport type { CopyStreamQuery } from \"pg-copy-streams\";\n\nconst logger = createConsola().withTag(\"postgresql-db-conn\");\n\n/**\n * PostgreSQL \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC5F0\uACB0 \uD074\uB798\uC2A4\n *\n * pg \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD558\uC5EC PostgreSQL \uC5F0\uACB0\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.\n */\nexport class PostgresqlDbConn extends EventEmitter<{ close: void }> implements DbConn {\n private readonly _timeout = DB_CONN_DEFAULT_TIMEOUT;\n\n private _client?: Client;\n private _connTimeout?: ReturnType<typeof setTimeout>;\n\n isConnected = false;\n isOnTransaction = false;\n\n constructor(\n private readonly _pg: typeof import(\"pg\"),\n private readonly _pgCopyFrom: (queryText: string) => CopyStreamQuery,\n readonly config: PostgresqlDbConnConfig,\n ) {\n super();\n }\n\n async connect(): Promise<void> {\n if (this.isConnected) {\n throw new SdError(DB_CONN_ERRORS.ALREADY_CONNECTED);\n }\n\n const client = new this._pg.Client({\n host: this.config.host,\n port: this.config.port ?? 5432,\n user: this.config.username,\n password: this.config.password,\n database: this.config.database,\n connectionTimeoutMillis: this._timeout,\n query_timeout: this._timeout,\n });\n\n client.on(\"end\", () => {\n this.emit(\"close\");\n this._resetState();\n });\n\n client.on(\"error\", (error) => {\n logger.error(\"DB \uC5F0\uACB0 \uC624\uB958\", error.message);\n });\n\n await client.connect();\n\n this._client = client;\n this._startTimeout();\n this.isConnected = true;\n }\n\n async close(): Promise<void> {\n this._stopTimeout();\n\n if (this._client == null || !this.isConnected) {\n return;\n }\n\n await this._client.end();\n\n this.emit(\"close\");\n this._resetState();\n }\n\n async beginTransaction(isolationLevel?: IsolationLevel): Promise<void> {\n this._assertConnected();\n\n const level = (isolationLevel ?? this.config.defaultIsolationLevel ?? \"READ_UNCOMMITTED\").replace(/_/g, \" \");\n\n await this._client!.query(\"BEGIN\");\n await this._client!.query(`SET TRANSACTION ISOLATION LEVEL ${level}`);\n\n this.isOnTransaction = true;\n }\n\n async commitTransaction(): Promise<void> {\n this._assertConnected();\n await this._client!.query(\"COMMIT\");\n this.isOnTransaction = false;\n }\n\n async rollbackTransaction(): Promise<void> {\n this._assertConnected();\n await this._client!.query(\"ROLLBACK\");\n this.isOnTransaction = false;\n }\n\n async execute(queries: string[]): Promise<unknown[][]> {\n const results: unknown[][] = [];\n for (const query of queries.filter((item) => !strIsNullOrEmpty(item))) {\n const resultItems = await this.executeParametrized(query);\n results.push(...resultItems);\n }\n return results;\n }\n\n async executeParametrized(query: string, params?: unknown[]): Promise<unknown[][]> {\n this._assertConnected();\n\n logger.debug(\"\uCFFC\uB9AC \uC2E4\uD589\", { queryLength: query.length, params });\n\n try {\n const result = await this._client!.query(query, params);\n\n this._startTimeout();\n\n // PostgreSQL\uC740 \uB2E8\uC77C \uACB0\uACFC\uC14B \uBC18\uD658\n return [result.rows];\n } catch (err) {\n this._startTimeout();\n const error = err instanceof Error ? err : new Error(String(err));\n throw new SdError(error, \"\uCFFC\uB9AC \uC218\uD589\uC911 \uC624\uB958\uBC1C\uC0DD\\n-- query\\n\" + query.trim() + \"\\n--\");\n }\n }\n\n async bulkInsert(\n tableName: string,\n columnMetas: Record<string, ColumnMeta>,\n records: Record<string, unknown>[],\n ): Promise<void> {\n this._assertConnected();\n\n if (records.length === 0) return;\n\n const colNames = Object.keys(columnMetas);\n const wrappedCols = colNames.map((c) => `\"${c}\"`).join(\", \");\n\n // COPY FROM STDIN \uC2A4\uD2B8\uB9BC \uC0DD\uC131\n const copyQuery = `COPY ${tableName} (${wrappedCols}) FROM STDIN WITH (FORMAT csv, NULL '\\\\N')`;\n const stream = this._client!.query(this._pgCopyFrom(copyQuery));\n\n // CSV \uB370\uC774\uD130 \uC0DD\uC131\n const csvLines: string[] = [];\n for (const record of records) {\n const row = colNames.map((colName) => this._escapeForCsv(record[colName], columnMetas[colName].dataType));\n csvLines.push(row.join(\",\"));\n }\n const csvContent = csvLines.join(\"\\n\") + \"\\n\";\n\n // \uC2A4\uD2B8\uB9BC\uC73C\uB85C \uB370\uC774\uD130 \uC804\uC1A1\n await new Promise<void>((resolve, reject) => {\n const readable = Readable.from([csvContent]);\n\n readable.on(\"error\", reject);\n stream.on(\"error\", reject);\n stream.on(\"finish\", resolve);\n\n readable.pipe(stream);\n });\n }\n\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Private helpers\n // \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * PostgreSQL COPY CSV\uC6A9 \uAC12 \uC774\uC2A4\uCF00\uC774\uD504\n */\n private _escapeForCsv(value: unknown, dataType: DataType): string {\n if (value == null) {\n return \"\\\\N\"; // NULL \uD45C\uD604\n }\n\n switch (dataType.type) {\n case \"int\":\n case \"bigint\":\n case \"float\":\n case \"double\":\n case \"decimal\":\n return String(value);\n\n case \"boolean\":\n return (value as boolean) ? \"true\" : \"false\";\n\n case \"varchar\":\n case \"char\":\n case \"text\": {\n const str = value as string;\n // CSV \uD615\uC2DD: \uC30D\uB530\uC634\uD45C\uB85C \uAC10\uC2F8\uACE0, \uB0B4\uBD80 \uC30D\uB530\uC634\uD45C\uB294 \uB450 \uBC88\n if (str.includes('\"') || str.includes(\",\") || str.includes(\"\\n\") || str.includes(\"\\r\")) {\n return '\"' + str.replace(/\"/g, '\"\"') + '\"';\n }\n return str;\n }\n\n case \"datetime\":\n return (value as DateTime).toFormatString(\"yyyy-MM-dd HH:mm:ss.fff\");\n\n case \"date\":\n return (value as DateOnly).toFormatString(\"yyyy-MM-dd\");\n\n case \"time\":\n return (value as Time).toFormatString(\"HH:mm:ss\");\n\n case \"uuid\":\n return (value as Uuid).toString();\n\n case \"binary\":\n return '\"\\\\x' + bytesToHex(value as Uint8Array) + '\"'; // PostgreSQL bytea hex \uD615\uC2DD (CSV \uC30D\uB530\uC634\uD45C\uB85C \uAC10\uC308)\n\n default:\n throw new SdError(`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 DataType: ${JSON.stringify(dataType)}`);\n }\n }\n\n private _assertConnected(): void {\n if (this._client == null || !this.isConnected) {\n throw new SdError(DB_CONN_ERRORS.NOT_CONNECTED);\n }\n this._startTimeout();\n }\n\n private _resetState(): void {\n this.isConnected = false;\n this.isOnTransaction = false;\n this._client = undefined;\n }\n\n private _stopTimeout(): void {\n if (this._connTimeout != null) {\n clearTimeout(this._connTimeout);\n }\n }\n\n private _startTimeout(): void {\n this._stopTimeout();\n this._connTimeout = setTimeout(() => {\n this.close().catch((err) => {\n logger.error(\"close error\", err instanceof Error ? err.message : String(err));\n });\n }, this._timeout * 2);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,74 @@
1
+ import { DateTime } from "./types/date-time";
2
+ import { DateOnly } from "./types/date-only";
3
+ import { Time } from "./types/time";
4
+ import { Uuid } from "./types/uuid";
5
+ /**
6
+ * Buffer λŒ€μ‹  μ‚¬μš©ν•˜λŠ” λ°”μ΄λ„ˆλ¦¬ νƒ€μž…
7
+ */
8
+ export type Bytes = Uint8Array;
9
+ /**
10
+ * Primitive νƒ€μž… λ§€ν•‘
11
+ * orm-common과 곡유
12
+ */
13
+ export type PrimitiveTypeMap = {
14
+ string: string;
15
+ number: number;
16
+ boolean: boolean;
17
+ DateTime: DateTime;
18
+ DateOnly: DateOnly;
19
+ Time: Time;
20
+ Uuid: Uuid;
21
+ Bytes: Bytes;
22
+ };
23
+ /**
24
+ * Primitive νƒ€μž… λ¬Έμžμ—΄ ν‚€
25
+ */
26
+ export type PrimitiveTypeStr = keyof PrimitiveTypeMap;
27
+ /**
28
+ * Primitive νƒ€μž… μœ λ‹ˆμ˜¨
29
+ */
30
+ export type PrimitiveType = PrimitiveTypeMap[PrimitiveTypeStr] | undefined;
31
+ /**
32
+ * κΉŠμ€ Partial νƒ€μž…
33
+ *
34
+ * 객체의 λͺ¨λ“  속성을 μž¬κ·€μ μœΌλ‘œ 선택적(optional)으둜 λ§Œλ“­λ‹ˆλ‹€.
35
+ * Primitive νƒ€μž…(string, number, boolean λ“±)은 κ·ΈλŒ€λ‘œ μœ μ§€ν•˜κ³ ,
36
+ * 객체/λ°°μ—΄ νƒ€μž…λ§Œ μž¬κ·€μ μœΌλ‘œ Partial을 μ μš©ν•©λ‹ˆλ‹€.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * interface User {
41
+ * name: string;
42
+ * profile: {
43
+ * age: number;
44
+ * address: { city: string };
45
+ * };
46
+ * }
47
+ *
48
+ * // λͺ¨λ“  깊이의 속성이 선택적이 됨
49
+ * const partial: DeepPartial<User> = {
50
+ * profile: { address: {} }
51
+ * };
52
+ * ```
53
+ */
54
+ export type DeepPartial<T> = Partial<{
55
+ [K in keyof T]: T[K] extends PrimitiveType ? T[K] : DeepPartial<T[K]>;
56
+ }>;
57
+ /**
58
+ * μƒμ„±μž νƒ€μž…
59
+ *
60
+ * 클래슀 μƒμ„±μžλ₯Ό νƒ€μž…μœΌλ‘œ ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
61
+ * 주둜 μ˜μ‘΄μ„± μ£Όμž…, νŒ©ν† λ¦¬ νŒ¨ν„΄, instanceof 체크 λ“±μ—μ„œ ν™œμš©λ©λ‹ˆλ‹€.
62
+ *
63
+ * @example
64
+ * function create<T>(ctor: Type<T>): T {
65
+ * return new ctor();
66
+ * }
67
+ *
68
+ * class MyClass { name = "test"; }
69
+ * const instance = create(MyClass); // MyClass μΈμŠ€ν„΄μŠ€
70
+ */
71
+ export interface Type<T> extends Function {
72
+ new (...args: unknown[]): T;
73
+ }
74
+ //# sourceMappingURL=common.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.types.d.ts","sourceRoot":"","sources":["../../../../core-common/src/common.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAIpC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC;AAM/B;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;AAM3E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC;KAClC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,CAAE,SAAQ,QAAQ;IACvC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;CAC7B"}
@@ -0,0 +1,6 @@
1
+ export declare const env: {
2
+ DEV: boolean;
3
+ VER?: string;
4
+ [key: string]: unknown;
5
+ };
6
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../core-common/src/env.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,EAAE;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAKxB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { SdError } from "./sd-error";
2
+ /**
3
+ * 인수 였λ₯˜
4
+ *
5
+ * 잘λͺ»λœ 인수λ₯Ό λ°›μ•˜μ„ λ•Œ λ°œμƒμ‹œν‚€λŠ” μ—λŸ¬μ΄λ‹€.
6
+ * 인수 객체λ₯Ό YAML ν˜•μ‹μœΌλ‘œ λ©”μ‹œμ§€μ— ν¬ν•¨ν•˜μ—¬ 디버깅을 μš©μ΄ν•˜κ²Œ ν•œλ‹€.
7
+ *
8
+ * @example
9
+ * // 인수 객체만 전달
10
+ * throw new ArgumentError({ userId: 123, name: null });
11
+ * // κ²°κ³Ό λ©”μ‹œμ§€: "μΈμˆ˜κ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.\n\nuserId: 123\nname: null"
12
+ *
13
+ * @example
14
+ * // μ»€μŠ€ν…€ λ©”μ‹œμ§€μ™€ 인수 객체 전달
15
+ * throw new ArgumentError("μœ νš¨ν•˜μ§€ μ•Šμ€ μ‚¬μš©μž", { userId: 123 });
16
+ * // κ²°κ³Ό λ©”μ‹œμ§€: "μœ νš¨ν•˜μ§€ μ•Šμ€ μ‚¬μš©μž\n\nuserId: 123"
17
+ */
18
+ export declare class ArgumentError extends SdError {
19
+ /** κΈ°λ³Έ λ©”μ‹œμ§€("μΈμˆ˜κ°€ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")와 ν•¨κ»˜ 인수 객체λ₯Ό YAML ν˜•μ‹μœΌλ‘œ 좜λ ₯ */
20
+ constructor(argObj: Record<string, unknown>);
21
+ /** μ»€μŠ€ν…€ λ©”μ‹œμ§€μ™€ ν•¨κ»˜ 인수 객체λ₯Ό YAML ν˜•μ‹μœΌλ‘œ 좜λ ₯ */
22
+ constructor(message: string, argObj: Record<string, unknown>);
23
+ constructor(arg1: Record<string, unknown> | string, arg2?: Record<string, unknown>);
24
+ }
25
+ //# sourceMappingURL=argument-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argument-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/argument-error.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,SAAQ,OAAO;IACxC,qDAAqD;gBACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3C,sCAAsC;gBAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAYnF"}
@@ -0,0 +1,29 @@
1
+ import { SdError } from "./sd-error";
2
+ /**
3
+ * λ―Έκ΅¬ν˜„ 였λ₯˜
4
+ *
5
+ * 아직 κ΅¬ν˜„λ˜μ§€ μ•Šμ€ κΈ°λŠ₯을 ν˜ΈμΆœν–ˆμ„ λ•Œ λ°œμƒμ‹œν‚€λŠ” μ—λŸ¬μ΄λ‹€.
6
+ * 좔상 λ©”μ„œλ“œ μŠ€ν…, ν–₯ν›„ κ΅¬ν˜„ μ˜ˆμ •μΈ λΆ„κΈ° 등에 μ‚¬μš©ν•œλ‹€.
7
+ *
8
+ * @example
9
+ * // 좔상 λ©”μ„œλ“œ κ΅¬ν˜„ μ „
10
+ * class BaseService {
11
+ * process(): void {
12
+ * throw new NotImplementedError("μ„œλΈŒν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ ν•„μš”");
13
+ * }
14
+ * }
15
+ *
16
+ * @example
17
+ * // ν–₯ν›„ κ΅¬ν˜„ μ˜ˆμ • λΆ„κΈ°
18
+ * switch (type) {
19
+ * case "A": return handleA();
20
+ * case "B": throw new NotImplementedError(`νƒ€μž… ${type} 처리`);
21
+ * }
22
+ */
23
+ export declare class NotImplementedError extends SdError {
24
+ /**
25
+ * @param message μΆ”κ°€ μ„€λͺ… λ©”μ‹œμ§€
26
+ */
27
+ constructor(message?: string);
28
+ }
29
+ //# sourceMappingURL=not-implemented-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-implemented-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/not-implemented-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,mBAAoB,SAAQ,OAAO;IAC9C;;OAEG;gBACS,OAAO,CAAC,EAAE,MAAM;CAI7B"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 였λ₯˜μ˜ Tree ꡬ쑰 ꡬ성이 κ°€λŠ₯ν•œ 였λ₯˜ 클래슀
3
+ * ES2024 cause 속성 ν™œμš©
4
+ *
5
+ * @example
6
+ * // 원인 μ—λŸ¬λ₯Ό κ°μ‹Έμ„œ 생성
7
+ * try {
8
+ * await fetch(url);
9
+ * } catch (err) {
10
+ * throw new SdError(err, "API 호좜 μ‹€νŒ¨", "μ‚¬μš©μž λ‘œλ“œ μ‹€νŒ¨");
11
+ * }
12
+ * // κ²°κ³Ό λ©”μ‹œμ§€: "μ‚¬μš©μž λ‘œλ“œ μ‹€νŒ¨ => API 호좜 μ‹€νŒ¨ => 원본 μ—λŸ¬ λ©”μ‹œμ§€"
13
+ *
14
+ * @example
15
+ * // λ©”μ‹œμ§€λ§ŒμœΌλ‘œ 생성
16
+ * throw new SdError("잘λͺ»λœ μƒνƒœ", "처리 λΆˆκ°€");
17
+ * // κ²°κ³Ό λ©”μ‹œμ§€: "처리 λΆˆκ°€ => 잘λͺ»λœ μƒνƒœ"
18
+ */
19
+ export declare class SdError extends Error {
20
+ cause?: Error;
21
+ /** 원인 μ—λŸ¬λ₯Ό κ°μ‹Έμ„œ 생성. λ©”μ‹œμ§€λŠ” μ—­μˆœμœΌλ‘œ 연결됨 (μƒμœ„ λ©”μ‹œμ§€ => ν•˜μœ„ λ©”μ‹œμ§€ => 원인 λ©”μ‹œμ§€) */
22
+ constructor(cause: Error, ...messages: string[]);
23
+ /** λ©”μ‹œμ§€λ§ŒμœΌλ‘œ 생성. λ©”μ‹œμ§€λŠ” μ—­μˆœμœΌλ‘œ 연결됨 (μƒμœ„ λ©”μ‹œμ§€ => ν•˜μœ„ λ©”μ‹œμ§€) */
24
+ constructor(...messages: string[]);
25
+ constructor(arg1?: unknown, ...messages: string[]);
26
+ }
27
+ //# sourceMappingURL=sd-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/sd-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAQ,SAAQ,KAAK;IACvB,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,gEAAgE;gBACpD,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;IAC/C,kDAAkD;gBACtC,GAAG,QAAQ,EAAE,MAAM,EAAE;gBACrB,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE;CA2BlD"}
@@ -0,0 +1,31 @@
1
+ import { SdError } from "./sd-error";
2
+ /**
3
+ * νƒ€μž„μ•„μ›ƒ 였λ₯˜
4
+ *
5
+ * λŒ€κΈ° μ‹œκ°„μ΄ μ΄ˆκ³Όλ˜μ—ˆμ„ λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬μ΄λ‹€.
6
+ * Wait.until() λ“±μ˜ 비동기 λŒ€κΈ° ν•¨μˆ˜μ—μ„œ μ΅œλŒ€ μ‹œλ„ 횟수λ₯Ό μ΄ˆκ³Όν•˜λ©΄ μžλ™μœΌλ‘œ λ°œμƒν•œλ‹€.
7
+ *
8
+ * @example
9
+ * // Wait.untilμ—μ„œ μžλ™ λ°œμƒ
10
+ * try {
11
+ * await Wait.until(() => isReady, 100, 50); // 100ms 간격, μ΅œλŒ€ 50회
12
+ * } catch (err) {
13
+ * if (err instanceof TimeoutError) {
14
+ * console.log("μ‹œκ°„ 초과");
15
+ * }
16
+ * }
17
+ *
18
+ * @example
19
+ * // 직접 λ°œμƒ
20
+ * if (elapsed > maxTime) {
21
+ * throw new TimeoutError(undefined, "API 응닡 λŒ€κΈ° 초과");
22
+ * }
23
+ */
24
+ export declare class TimeoutError extends SdError {
25
+ /**
26
+ * @param count μ‹œλ„ 횟수
27
+ * @param message μΆ”κ°€ λ©”μ‹œμ§€
28
+ */
29
+ constructor(count?: number, message?: string);
30
+ }
31
+ //# sourceMappingURL=timeout-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-error.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/errors/timeout-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,YAAa,SAAQ,OAAO;IACvC;;;OAGG;gBACS,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM7C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Array ν™•μž₯ λ©”μ„œλ“œ
3
+ *
4
+ * @remarks 각 λ©”μ„œλ“œμ˜ TSDoc은 νƒ€μž… μ •μ˜ 파일(arr-ext.types.ts) μ°Έμ‘°
5
+ */
6
+ import "./map-ext";
7
+ import type { ReadonlyArrayExt, MutableArrayExt } from "./arr-ext.types";
8
+ declare global {
9
+ interface ReadonlyArray<T> extends ReadonlyArrayExt<T> {
10
+ }
11
+ interface Array<T> extends ReadonlyArrayExt<T>, MutableArrayExt<T> {
12
+ }
13
+ }
14
+ export type { ArrayDiffsResult, ArrayDiffs2Result, TreeArray, ComparableType } from "./arr-ext.types";
15
+ //# sourceMappingURL=arr-ext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arr-ext.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/extensions/arr-ext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,WAAW,CAAC;AAUnB,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AA2uBzB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;KAAG;IACzD,UAAU,KAAK,CAAC,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;KAAG;CACtE;AAID,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Array ν™•μž₯ 헬퍼 ν•¨μˆ˜
3
+ */
4
+ import type { ComparableType } from "./arr-ext.types";
5
+ /**
6
+ * DateTime, DateOnly, Time을 비ꡐ κ°€λŠ₯ν•œ primitive κ°’μœΌλ‘œ λ³€ν™˜
7
+ */
8
+ export declare function toComparable(value: ComparableType): string | number | boolean | undefined;
9
+ /**
10
+ * 정렬을 μœ„ν•œ 비ꡐ ν•¨μˆ˜
11
+ *
12
+ * @param pp 비ꡐ λŒ€μƒ 1
13
+ * @param pn 비ꡐ λŒ€μƒ 2
14
+ * @param desc true: λ‚΄λ¦Όμ°¨μˆœ, false: μ˜€λ¦„μ°¨μˆœ
15
+ * @returns 음수: ppκ°€ μ•ž, 0: κ°™μŒ, μ–‘μˆ˜: pn이 μ•ž
16
+ * @note null/undefined 값은 μ˜€λ¦„μ°¨μˆœ μ‹œ μ•žμœΌλ‘œ, λ‚΄λ¦Όμ°¨μˆœ μ‹œ λ’€λ‘œ 정렬됨
17
+ */
18
+ export declare function compareForOrder(pp: ComparableType, pn: ComparableType, desc: boolean): number;
19
+ //# sourceMappingURL=arr-ext.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arr-ext.helpers.d.ts","sourceRoot":"","sources":["../../../../../core-common/src/extensions/arr-ext.helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAKzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAuB7F"}