@wener/common 2.0.3 → 2.0.5

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 (168) hide show
  1. package/lib/ai/qwen3vl/utils.js.map +1 -1
  2. package/lib/cn/ChineseResidentIdNo.js +1 -1
  3. package/lib/cn/ChineseResidentIdNo.js.map +1 -1
  4. package/lib/cn/Mod11.js +1 -1
  5. package/lib/cn/Mod11.js.map +1 -1
  6. package/lib/consola/formatLogObject.js +5 -5
  7. package/lib/consola/formatLogObject.js.map +1 -1
  8. package/lib/data/maybeNumber.js +1 -1
  9. package/lib/data/maybeNumber.js.map +1 -1
  10. package/lib/data/types.d.js.map +1 -1
  11. package/lib/dayjs/formatDuration.js.map +1 -1
  12. package/lib/dayjs/resolveRelativeTime.js +9 -80
  13. package/lib/dayjs/resolveRelativeTime.js.map +1 -1
  14. package/lib/drain3/Drain.js +356 -0
  15. package/lib/drain3/Drain.js.map +1 -0
  16. package/lib/drain3/LogCluster.js +38 -0
  17. package/lib/drain3/LogCluster.js.map +1 -0
  18. package/lib/drain3/Node.js +39 -0
  19. package/lib/drain3/Node.js.map +1 -0
  20. package/lib/drain3/TemplateMiner.js +204 -0
  21. package/lib/drain3/TemplateMiner.js.map +1 -0
  22. package/lib/drain3/index.js +31 -0
  23. package/lib/drain3/index.js.map +1 -0
  24. package/lib/drain3/persistence/FilePersistence.js +24 -0
  25. package/lib/drain3/persistence/FilePersistence.js.map +1 -0
  26. package/lib/drain3/persistence/MemoryPersistence.js +18 -0
  27. package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
  28. package/lib/drain3/persistence/PersistenceHandler.js +5 -0
  29. package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
  30. package/lib/drain3/types.js +7 -0
  31. package/lib/drain3/types.js.map +1 -0
  32. package/lib/fs/IFileSystem.d.js.map +1 -1
  33. package/lib/fs/createBrowserFileSystem.js +4 -2
  34. package/lib/fs/createBrowserFileSystem.js.map +1 -1
  35. package/lib/fs/createMemoryFileSystem.js +7 -6
  36. package/lib/fs/createMemoryFileSystem.js.map +1 -1
  37. package/lib/fs/createSandboxFileSystem.js.map +1 -1
  38. package/lib/fs/createWebDavFileSystem.js +22 -5
  39. package/lib/fs/createWebDavFileSystem.js.map +1 -1
  40. package/lib/fs/createWebFileSystem.js +225 -0
  41. package/lib/fs/createWebFileSystem.js.map +1 -0
  42. package/lib/fs/findMimeType.js +1 -1
  43. package/lib/fs/findMimeType.js.map +1 -1
  44. package/lib/fs/index.js +1 -1
  45. package/lib/fs/index.js.map +1 -1
  46. package/lib/fs/minio/createMinioFileSystem.js +974 -0
  47. package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
  48. package/lib/fs/minio/index.js +2 -0
  49. package/lib/fs/minio/index.js.map +1 -0
  50. package/lib/fs/orpc/createContractClientFileSystem.js +3 -3
  51. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -1
  52. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -1
  53. package/lib/fs/s3/createS3MiniFileSystem.js +116 -68
  54. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -1
  55. package/lib/fs/server/createDatabaseFileSystem.js +7 -7
  56. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -1
  57. package/lib/fs/server/createNodeFileSystem.js +30 -5
  58. package/lib/fs/server/createNodeFileSystem.js.map +1 -1
  59. package/lib/fs/tests/runFileSystemTest.js +27 -26
  60. package/lib/fs/tests/runFileSystemTest.js.map +1 -1
  61. package/lib/fs/utils.js.map +1 -1
  62. package/lib/fs/webdav/index.js +2 -0
  63. package/lib/fs/webdav/index.js.map +1 -0
  64. package/lib/jsonschema/JsonSchema.js +5 -5
  65. package/lib/jsonschema/JsonSchema.js.map +1 -1
  66. package/lib/jsonschema/forEachJsonSchema.js +1 -1
  67. package/lib/jsonschema/forEachJsonSchema.js.map +1 -1
  68. package/lib/jsonschema/types.d.js.map +1 -1
  69. package/lib/meta/defineMetadata.js.map +1 -1
  70. package/lib/orpc/createOpenApiContractClient.js.map +1 -1
  71. package/lib/password/PHC.js +2 -2
  72. package/lib/password/PHC.js.map +1 -1
  73. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
  74. package/lib/password/createBase64PasswordAlgorithm.js +1 -1
  75. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
  76. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
  77. package/lib/password/createPBKDF2PasswordAlgorithm.js +1 -1
  78. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
  79. package/lib/password/createScryptPasswordAlgorithm.js +3 -3
  80. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
  81. package/lib/resource/ListQuery.js.map +1 -1
  82. package/lib/resource/index.js.map +1 -1
  83. package/lib/s3/formatS3Url.js +2 -2
  84. package/lib/s3/formatS3Url.js.map +1 -1
  85. package/lib/s3/parseS3Url.js +1 -1
  86. package/lib/s3/parseS3Url.js.map +1 -1
  87. package/lib/schema/SchemaRegistry.js.map +1 -1
  88. package/lib/schema/TypeSchema.d.js.map +1 -1
  89. package/lib/schema/createSchemaData.js +4 -4
  90. package/lib/schema/createSchemaData.js.map +1 -1
  91. package/lib/schema/findJsonSchemaByPath.js.map +1 -1
  92. package/lib/schema/formatZodError.js +42 -44
  93. package/lib/schema/formatZodError.js.map +1 -1
  94. package/lib/schema/toJsonSchema.js +4 -4
  95. package/lib/schema/toJsonSchema.js.map +1 -1
  96. package/lib/schema/validate.js +1 -1
  97. package/lib/schema/validate.js.map +1 -1
  98. package/lib/utils/buildRedactorFormSchema.js +1 -1
  99. package/lib/utils/buildRedactorFormSchema.js.map +1 -1
  100. package/package.json +32 -13
  101. package/src/ai/qwen3vl/utils.ts +1 -1
  102. package/src/cn/ChineseResidentIdNo.ts +1 -1
  103. package/src/cn/Mod11.ts +1 -1
  104. package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
  105. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +0 -23
  106. package/src/cn/parseChineseNumber.test.ts +4 -4
  107. package/src/consola/formatLogObject.ts +6 -6
  108. package/src/data/maybeNumber.ts +1 -1
  109. package/src/data/parseSort.test.ts +0 -1
  110. package/src/data/types.d.ts +2 -2
  111. package/src/dayjs/formatDuration.ts +2 -2
  112. package/src/dayjs/resolveRelativeTime.ts +11 -14
  113. package/src/drain3/Drain.test.ts +378 -0
  114. package/src/drain3/Drain.ts +394 -0
  115. package/src/drain3/LogCluster.ts +46 -0
  116. package/src/drain3/Node.ts +53 -0
  117. package/src/drain3/TemplateMiner.ts +246 -0
  118. package/src/drain3/index.ts +36 -0
  119. package/src/drain3/persistence/FilePersistence.ts +24 -0
  120. package/src/drain3/persistence/MemoryPersistence.ts +23 -0
  121. package/src/drain3/persistence/PersistenceHandler.ts +19 -0
  122. package/src/drain3/types.ts +75 -0
  123. package/src/fs/IFileSystem.d.ts +1 -2
  124. package/src/fs/createBrowserFileSystem.ts +7 -5
  125. package/src/fs/createMemoryFileSystem.ts +9 -13
  126. package/src/fs/createSandboxFileSystem.ts +1 -1
  127. package/src/fs/createWebDavFileSystem.ts +28 -10
  128. package/src/fs/createWebFileSystem.ts +242 -0
  129. package/src/fs/findMimeType.ts +1 -4
  130. package/src/fs/index.ts +1 -1
  131. package/src/fs/minio/createMinioFileSystem.ts +1148 -0
  132. package/src/fs/minio/index.ts +1 -0
  133. package/src/fs/orpc/createContractClientFileSystem.ts +5 -5
  134. package/src/fs/orpc/server/createFileSystemContractImpl.ts +1 -1
  135. package/src/fs/s3/createS3MiniFileSystem.ts +119 -78
  136. package/src/fs/s3/s3fs.test.ts +441 -0
  137. package/src/fs/s3/s3mini.test.ts +2 -2
  138. package/src/fs/server/createDatabaseFileSystem.ts +7 -7
  139. package/src/fs/server/createNodeFileSystem.ts +32 -13
  140. package/src/fs/server/dbfs.test.ts +2 -1
  141. package/src/fs/tests/runFileSystemTest.ts +29 -28
  142. package/src/fs/utils.ts +1 -1
  143. package/src/fs/webdav/index.ts +1 -0
  144. package/src/jsonschema/JsonSchema.ts +5 -5
  145. package/src/jsonschema/forEachJsonSchema.ts +1 -1
  146. package/src/jsonschema/types.d.ts +1 -1
  147. package/src/meta/defineMetadata.ts +1 -1
  148. package/src/orpc/createOpenApiContractClient.ts +2 -2
  149. package/src/password/PHC.ts +3 -3
  150. package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
  151. package/src/password/createBase64PasswordAlgorithm.ts +2 -2
  152. package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
  153. package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
  154. package/src/password/createScryptPasswordAlgorithm.ts +4 -4
  155. package/src/resource/ListQuery.ts +4 -1
  156. package/src/resource/index.ts +2 -2
  157. package/src/s3/formatS3Url.test.ts +1 -1
  158. package/src/s3/formatS3Url.ts +2 -2
  159. package/src/s3/parseS3Url.ts +1 -1
  160. package/src/schema/SchemaRegistry.ts +1 -1
  161. package/src/schema/TypeSchema.d.ts +6 -6
  162. package/src/schema/createSchemaData.ts +4 -4
  163. package/src/schema/findJsonSchemaByPath.ts +4 -4
  164. package/src/schema/formatZodError.test.ts +2 -1
  165. package/src/schema/formatZodError.ts +50 -62
  166. package/src/schema/toJsonSchema.ts +6 -6
  167. package/src/schema/validate.ts +1 -1
  168. package/src/utils/buildRedactorFormSchema.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fs/server/createNodeFileSystem.ts"],"sourcesContent":["import {\n\tcreateReadStream as nodeCreateReadStream,\n\tcreateWriteStream as nodeCreateWriteStream,\n\ttype Stats,\n} from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable, type Writable } from 'node:stream';\nimport { pathToFileURL } from 'node:url';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileStat,\n\tIFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWriteFileOptions,\n} from '../IFileSystem';\n\nexport type INodeFileSystem = IFileSystem & {\n\treadonly root: string;\n\tresolvePath(filePath: string): string;\n};\n\n/**\n * Creates a Node.js filesystem adapter that implements the IFileSystem interface\n * @param options Configuration options for the filesystem\n * @param options.root Optional root directory to restrict all operations within\n */\nexport function createNodeFileSystem(options: { root?: string } = {}): INodeFileSystem {\n\treturn new NodeFs(options);\n}\n\ntype IFS = typeof import('fs/promises');\n\nclass NodeFs implements IFileSystem, INodeFileSystem {\n\treadonly root: string;\n\tprivate readonly fs: IFS;\n\n\tconstructor({\n\t\troot,\n\t\tfs = fsp,\n\t}: {\n\t\troot?: string;\n\t\tfs?: IFS;\n\t} = {}) {\n\t\t// Normalize the root path if provided\n\t\tif (root) {\n\t\t\tthis.root = path.resolve(root);\n\t\t} else {\n\t\t\tthis.root = '';\n\t\t}\n\t\tthis.fs = fs;\n\t}\n\n\t// Helper method to handle aborted signals consistently\n\tprivate checkAborted(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error('The operation was aborted');\n\t\t}\n\t}\n\n\t/**\n\t * Resolves and secures a path by:\n\t * 1. Normalizing the path\n\t * 2. Prepending the root directory if one is set\n\t * 3. Verifying the resulting path is within the root directory\n\t *\n\t * This prevents path traversal attacks.\n\t */\n\tresolvePath(filePath: string): string {\n\t\t// Handle empty paths\n\t\tif (!filePath) {\n\t\t\treturn this.root || '';\n\t\t}\n\n\t\t// Normalize to remove any '..' segments and handle slashes\n\t\tconst normalizedPath = path.normalize(filePath);\n\n\t\t// If no root is set, just return the normalized path\n\t\tif (!this.root) {\n\t\t\treturn normalizedPath;\n\t\t}\n\n\t\t// Join with root and resolve to absolute path\n\t\tconst resolvedPath = path.resolve(path.join(this.root, normalizedPath));\n\n\t\t// Security check: ensure the path is within the root directory\n\t\tif (!resolvedPath.startsWith(this.root)) {\n\t\t\tthrow new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);\n\t\t}\n\n\t\treturn resolvedPath;\n\t}\n\n\t/**\n\t * Removes the root prefix from a path for external representation\n\t */\n\tprivate stripRoot(fullPath: string): string {\n\t\tif (!this.root || !fullPath.startsWith(this.root)) {\n\t\t\treturn fullPath;\n\t\t}\n\n\t\t// Remove the root prefix and ensure there's a leading slash\n\t\tlet relativePath = fullPath.substring(this.root.length);\n\t\tif (!relativePath) {\n\t\t\treturn '/';\n\t\t}\n\n\t\tif (!relativePath.startsWith('/') && !relativePath.startsWith('\\\\')) {\n\t\t\trelativePath = '/' + relativePath;\n\t\t}\n\n\t\t// Normalize to ensure consistent path separators\n\t\treturn path.normalize(relativePath).replace(/\\\\/g, '/');\n\t}\n\n\t/**\n\t * Converts a system file stat to our IFileStat interface,\n\t * stripping the root prefix from paths\n\t */\n\tprivate toFileStat(fullPath: string, fsStats: Stats): IFileStat {\n\t\tconst normalizedPath = this.stripRoot(fullPath);\n\t\tconst directoryPath = path.dirname(normalizedPath);\n\t\tconst directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\\\/g, '/');\n\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tpath: normalizedPath,\n\t\t\tname: path.basename(fullPath),\n\t\t\tkind: fsStats.isDirectory() ? 'directory' : 'file',\n\t\t\tmtime: fsStats.mtimeMs,\n\t\t\tsize: fsStats.size,\n\t\t\tmeta: {},\n\t\t};\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}): Promise<IFileStat[]> {\n\t\tconst { fs } = this;\n\t\tconst { glob, recursive, depth = 1, kind, hidden = true, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// Resolve the directory path with security checks\n\t\tconst resolvedDir = this.resolvePath(dir);\n\n\t\t// Basic file listing\n\t\tconst entries = await fs.readdir(resolvedDir, { withFileTypes: true });\n\t\tlet results = await Promise.all(\n\t\t\tentries\n\t\t\t\t.filter((entry) => hidden || !entry.name.startsWith('.'))\n\t\t\t\t.filter((entry) => !kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile()))\n\t\t\t\t.map(async (entry) => {\n\t\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\t\tconst entryFullPath = path.join(resolvedDir, entry.name);\n\t\t\t\t\tconst stat = await fs.stat(entryFullPath);\n\n\t\t\t\t\t// Convert to external representation\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdirectory: this.stripRoot(resolvedDir),\n\t\t\t\t\t\tpath: this.stripRoot(entryFullPath),\n\t\t\t\t\t\tname: entry.name,\n\t\t\t\t\t\tkind: entry.isDirectory() ? 'directory' : 'file',\n\t\t\t\t\t\tmtime: stat.mtimeMs,\n\t\t\t\t\t\tsize: stat.size,\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t} as IFileStat;\n\t\t\t\t}),\n\t\t);\n\n\t\t// Handle recursive option\n\t\tif (recursive || depth > 1) {\n\t\t\tconst subdirs = results.filter((entry) => entry.kind === 'directory');\n\n\t\t\tfor (const subdir of subdirs) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\tconst maxDepth = recursive ? Infinity : depth - 1;\n\t\t\t\tif (maxDepth > 0) {\n\t\t\t\t\t// Need to convert the path back to a full path for the recursive call\n\t\t\t\t\tconst subdirFullPath = this.resolvePath(subdir.path);\n\n\t\t\t\t\tconst subEntries = await this.readdir(subdir.path, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tdepth: maxDepth,\n\t\t\t\t\t});\n\t\t\t\t\tresults = [...results, ...subEntries];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle glob filtering\n\t\tif (glob) {\n\t\t\tconst { matcher } = await import('micromatch');\n\t\t\tconst match = matcher(glob);\n\t\t\tresults = results.filter((entry) => match(entry.path));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stat(filePath: string, options: StatOptions = {}): Promise<IFileStat> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\treturn this.toFileStat(resolvedPath, stat);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync mkdir(dirPath: string, options: MkdirOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(dirPath);\n\n\t\ttry {\n\t\t\tawait fs.mkdir(resolvedPath, { recursive });\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'EEXIST' && recursive) {\n\t\t\t\t// Ignore if directory exists and recursive is true\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync readFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n\t\tconst { fs } = this;\n\n\t\tconst { encoding = 'binary', signal, onDownloadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\t// Handle progress reporting if needed\n\t\t\tif (onDownloadProgress) {\n\t\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\t\tconst stream = this.createReadStream(path, { signal });\n\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tconst chunks: Buffer[] = [];\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tstream.on('data', (chunk) => {\n\t\t\t\t\t\tchunks.push(Buffer.from(chunk));\n\t\t\t\t\t\tloaded += chunk.length;\n\t\t\t\t\t\tonDownloadProgress({ loaded, total: stat.size });\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('end', () => {\n\t\t\t\t\t\tconst buffer = Buffer.concat(chunks);\n\t\t\t\t\t\tif (encoding === 'text') {\n\t\t\t\t\t\t\tresolve(buffer.toString('utf-8'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(buffer);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('error', reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Standard file reading\n\t\t\tif (encoding === 'text') {\n\t\t\t\treturn await fs.readFile(resolvedPath, { encoding: 'utf-8' });\n\t\t\t} else {\n\t\t\t\treturn await fs.readFile(resolvedPath);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${path}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tdata: string | Buffer | ArrayBuffer | Readable,\n\t\toptions: WriteFileOptions = {},\n\t): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, onUploadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\t// Check if file exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(path);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`File already exists: ${path}`);\n\t\t\t}\n\t\t}\n\n\t\t// Create parent directories if they don't exist\n\t\tconst directory = this.getDirectoryName(resolvedPath);\n\t\tif (directory !== resolvedPath) {\n\t\t\ttry {\n\t\t\t\tawait this.mkdir(this.stripRoot(directory), { recursive: true });\n\t\t\t} catch (err: any) {\n\t\t\t\t// Ignore directory exists error\n\t\t\t\tif (err?.code !== 'EEXIST') {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof Readable) {\n\t\t\tlet _data = data;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst writeStream = this.createWriteStream(path, options);\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t_data.on('data', (chunk) => {\n\t\t\t\t\t\ttotalBytes += chunk.length;\n\t\t\t\t\t\tonUploadProgress({ loaded: totalBytes, total: -1 });\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_data.pipe(writeStream);\n\n\t\t\t\twriteStream.on('finish', () => resolve());\n\t\t\t\twriteStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t_data.destroy();\n\t\t\t\t\t\twriteStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Convert ArrayBuffer to Buffer if necessary\n\t\t\tif (data instanceof ArrayBuffer) {\n\t\t\t\tdata = Buffer.from(data);\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, data);\n\t\t}\n\t}\n\n\tasync rm(path: string, options: RmOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, force = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\tawait fs.rm(resolvedPath, { recursive, force });\n\t\t} catch (err: any) {\n\t\t\tif (force && err.code === 'ENOENT') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options: RenameOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedOldPath = this.resolvePath(oldPath);\n\t\tconst resolvedNewPath = this.resolvePath(newPath);\n\n\t\t// Check if target exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(newPath);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`Destination already exists: ${newPath}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait fs.rename(resolvedOldPath, resolvedNewPath);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${oldPath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst { fs } = this;\n\n\t\ttry {\n\t\t\tawait fs.access(this.resolvePath(path));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync copy(src: string, dest: string, options: CopyOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, shallow = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedSrc = this.resolvePath(src);\n\t\tconst resolvedDest = this.resolvePath(dest);\n\n\t\t// Check if source exists\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedSrc);\n\n\t\t\t// Check if destination exists and overwrite is false\n\t\t\tif (!overwrite) {\n\t\t\t\tconst exists = await this.exists(dest);\n\t\t\t\tif (exists) {\n\t\t\t\t\tthrow new Error(`Destination already exists: ${dest}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create parent directory if it doesn't exist\n\t\t\tconst parentDir = this.getDirectoryName(resolvedDest);\n\t\t\tawait this.mkdir(this.stripRoot(parentDir), { recursive: true });\n\n\t\t\t// Copy recursively or not based on shallow and if it's a directory\n\t\t\tawait fs.cp(resolvedSrc, resolvedDest, {\n\t\t\t\trecursive: !shallow && stat.isDirectory(),\n\t\t\t\tforce: overwrite,\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${src}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tcreateReadStream(filePath: string, options: CreateReadStreamOptions = {}): Readable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal, range } = options;\n\t\tconst stream = nodeCreateReadStream(resolvedPath, {\n\t\t\tstart: range?.start,\n\t\t\tend: range?.end,\n\t\t});\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\tcreateWriteStream(filePath: string, options: CreateWriteStreamOptions = {}): Writable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal } = options;\n\t\tconst stream = nodeCreateWriteStream(resolvedPath, { flags: options.overwrite === false ? 'wx' : 'w' });\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\t// Helper to extract directory name correctly\n\tprivate getDirectoryName(filePath: string): string {\n\t\treturn path.dirname(filePath);\n\t}\n\n\tgetUrl(needle: IFileStat | string) {\n\t\tif (typeof needle === 'object' && needle?.kind !== 'file') {\n\t\t\treturn;\n\t\t}\n\t\tlet path = typeof needle === 'string' ? needle : needle.path;\n\t\tif (!path) {\n\t\t\treturn;\n\t\t}\n\t\t// file://\n\t\treturn pathToFileURL(this.resolvePath(path)).toString();\n\t}\n}\n"],"names":["createReadStream","nodeCreateReadStream","createWriteStream","nodeCreateWriteStream","fsp","path","Readable","pathToFileURL","createNodeFileSystem","options","NodeFs","root","fs","resolve","checkAborted","signal","aborted","Error","resolvePath","filePath","normalizedPath","normalize","resolvedPath","join","startsWith","stripRoot","fullPath","relativePath","substring","length","replace","toFileStat","fsStats","directoryPath","dirname","directory","name","basename","kind","isDirectory","mtime","mtimeMs","size","meta","readdir","dir","glob","recursive","depth","hidden","resolvedDir","entries","withFileTypes","results","Promise","all","filter","entry","isFile","map","entryFullPath","stat","subdirs","subdir","maxDepth","Infinity","subdirFullPath","subEntries","matcher","match","err","code","mkdir","dirPath","readFile","encoding","onDownloadProgress","stream","reject","chunks","loaded","on","chunk","push","Buffer","from","total","buffer","concat","toString","writeFile","data","overwrite","onUploadProgress","exists","getDirectoryName","_data","writeStream","totalBytes","pipe","addEventListener","destroy","ArrayBuffer","rm","force","rename","oldPath","newPath","resolvedOldPath","resolvedNewPath","access","copy","src","dest","shallow","resolvedSrc","resolvedDest","parentDir","cp","range","start","end","flags","getUrl","needle"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fs/server/createNodeFileSystem.ts"],"sourcesContent":["import {\n\tcreateReadStream as nodeCreateReadStream,\n\tcreateWriteStream as nodeCreateWriteStream,\n\ttype Stats,\n} from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable, type Writable } from 'node:stream';\nimport { pathToFileURL } from 'node:url';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileStat,\n\tIServerFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWritableData,\n\tWriteFileOptions,\n} from '../IFileSystem';\n\nexport type INodeFileSystem = IServerFileSystem & {\n\treadonly root: string;\n\tresolvePath(filePath: string): string;\n};\n\n/**\n * Creates a Node.js filesystem adapter that implements the IFileSystem interface\n * @param options Configuration options for the filesystem\n * @param options.root Optional root directory to restrict all operations within\n */\nexport function createNodeFileSystem(options: { root?: string } = {}): INodeFileSystem {\n\treturn new NodeFs(options);\n}\n\ntype IFS = typeof import('fs/promises');\n\nclass NodeFs implements IServerFileSystem, INodeFileSystem {\n\treadonly root: string;\n\tprivate readonly fs: IFS;\n\n\tconstructor({\n\t\troot,\n\t\tfs = fsp,\n\t}: {\n\t\troot?: string;\n\t\tfs?: IFS;\n\t} = {}) {\n\t\t// Normalize the root path if provided\n\t\tif (root) {\n\t\t\tthis.root = path.resolve(root);\n\t\t} else {\n\t\t\tthis.root = '';\n\t\t}\n\t\tthis.fs = fs;\n\t}\n\n\t// Helper method to handle aborted signals consistently\n\tprivate checkAborted(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error('The operation was aborted');\n\t\t}\n\t}\n\n\t/**\n\t * Resolves and secures a path by:\n\t * 1. Normalizing the path\n\t * 2. Prepending the root directory if one is set\n\t * 3. Verifying the resulting path is within the root directory\n\t *\n\t * This prevents path traversal attacks.\n\t */\n\tresolvePath(filePath: string): string {\n\t\t// Handle empty paths\n\t\tif (!filePath) {\n\t\t\treturn this.root || '';\n\t\t}\n\n\t\t// Normalize to remove any '..' segments and handle slashes\n\t\tconst normalizedPath = path.normalize(filePath);\n\n\t\t// If no root is set, just return the normalized path\n\t\tif (!this.root) {\n\t\t\treturn normalizedPath;\n\t\t}\n\n\t\t// Join with root and resolve to absolute path\n\t\tconst resolvedPath = path.resolve(path.join(this.root, normalizedPath));\n\n\t\t// Security check: ensure the path is within the root directory\n\t\tif (!resolvedPath.startsWith(this.root)) {\n\t\t\tthrow new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);\n\t\t}\n\n\t\treturn resolvedPath;\n\t}\n\n\t/**\n\t * Removes the root prefix from a path for external representation\n\t */\n\tprivate stripRoot(fullPath: string): string {\n\t\tif (!this.root || !fullPath.startsWith(this.root)) {\n\t\t\treturn fullPath;\n\t\t}\n\n\t\t// Remove the root prefix and ensure there's a leading slash\n\t\tlet relativePath = fullPath.substring(this.root.length);\n\t\tif (!relativePath) {\n\t\t\treturn '/';\n\t\t}\n\n\t\tif (!relativePath.startsWith('/') && !relativePath.startsWith('\\\\')) {\n\t\t\trelativePath = `/${relativePath}`;\n\t\t}\n\n\t\t// Normalize to ensure consistent path separators\n\t\treturn path.normalize(relativePath).replace(/\\\\/g, '/');\n\t}\n\n\t/**\n\t * Converts a system file stat to our IFileStat interface,\n\t * stripping the root prefix from paths\n\t */\n\tprivate toFileStat(fullPath: string, fsStats: Stats): IFileStat {\n\t\tconst normalizedPath = this.stripRoot(fullPath);\n\t\tconst directoryPath = path.dirname(normalizedPath);\n\t\tconst directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\\\/g, '/');\n\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tpath: normalizedPath,\n\t\t\tname: path.basename(fullPath),\n\t\t\tkind: fsStats.isDirectory() ? 'directory' : 'file',\n\t\t\tmtime: fsStats.mtimeMs,\n\t\t\tsize: fsStats.size,\n\t\t\tmeta: {},\n\t\t};\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}): Promise<IFileStat[]> {\n\t\tconst { fs } = this;\n\t\tconst { glob, recursive, depth = 1, kind, hidden = true, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// Resolve the directory path with security checks\n\t\tconst resolvedDir = this.resolvePath(dir);\n\n\t\t// Basic file listing\n\t\tconst entries = await fs.readdir(resolvedDir, { withFileTypes: true });\n\t\tlet results = await Promise.all(\n\t\t\tentries\n\t\t\t\t.filter((entry) => hidden || !entry.name.startsWith('.'))\n\t\t\t\t.filter((entry) => !kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile()))\n\t\t\t\t.map(async (entry) => {\n\t\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\t\tconst entryFullPath = path.join(resolvedDir, entry.name);\n\t\t\t\t\tconst stat = await fs.stat(entryFullPath);\n\n\t\t\t\t\t// Convert to external representation\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdirectory: this.stripRoot(resolvedDir),\n\t\t\t\t\t\tpath: this.stripRoot(entryFullPath),\n\t\t\t\t\t\tname: entry.name,\n\t\t\t\t\t\tkind: entry.isDirectory() ? 'directory' : 'file',\n\t\t\t\t\t\tmtime: stat.mtimeMs,\n\t\t\t\t\t\tsize: stat.size,\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t} as IFileStat;\n\t\t\t\t}),\n\t\t);\n\n\t\t// Handle recursive option\n\t\tif (recursive || depth > 1) {\n\t\t\tconst subdirs = results.filter((entry) => entry.kind === 'directory');\n\n\t\t\tfor (const subdir of subdirs) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\tconst maxDepth = recursive ? Infinity : depth - 1;\n\t\t\t\tif (maxDepth > 0) {\n\t\t\t\t\t// Need to convert the path back to a full path for the recursive call\n\t\t\t\t\tconst _subdirFullPath = this.resolvePath(subdir.path);\n\n\t\t\t\t\tconst subEntries = await this.readdir(subdir.path, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tdepth: maxDepth,\n\t\t\t\t\t});\n\t\t\t\t\tresults = [...results, ...subEntries];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle glob filtering\n\t\tif (glob) {\n\t\t\tconst { matcher } = await import('micromatch');\n\t\t\tconst match = matcher(glob);\n\t\t\tresults = results.filter((entry) => match(entry.path));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stat(filePath: string, options: StatOptions = {}): Promise<IFileStat> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\treturn this.toFileStat(resolvedPath, stat);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync mkdir(dirPath: string, options: MkdirOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(dirPath);\n\n\t\ttry {\n\t\t\tawait fs.mkdir(resolvedPath, { recursive });\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'EEXIST' && recursive) {\n\t\t\t\t// Ignore if directory exists and recursive is true\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync readFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n\t\tconst { fs } = this;\n\n\t\tconst { encoding = 'binary', signal, onDownloadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\t// Handle progress reporting if needed\n\t\t\tif (onDownloadProgress) {\n\t\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\t\tconst stream = this.createReadStream(path, { signal });\n\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tconst chunks: Buffer[] = [];\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tstream.on('data', (chunk) => {\n\t\t\t\t\t\tchunks.push(Buffer.from(chunk));\n\t\t\t\t\t\tloaded += chunk.length;\n\t\t\t\t\t\tonDownloadProgress({ loaded, total: stat.size });\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('end', () => {\n\t\t\t\t\t\tconst buffer = Buffer.concat(chunks);\n\t\t\t\t\t\tif (encoding === 'text') {\n\t\t\t\t\t\t\tresolve(buffer.toString('utf-8'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(buffer);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('error', reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Standard file reading\n\t\t\tif (encoding === 'text') {\n\t\t\t\treturn await fs.readFile(resolvedPath, { encoding: 'utf-8' });\n\t\t\t} else {\n\t\t\t\treturn await fs.readFile(resolvedPath);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${path}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync writeFile(path: string, data: WritableData, options: WriteFileOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, onUploadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\t// Check if file exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(path);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`File already exists: ${path}`);\n\t\t\t}\n\t\t}\n\n\t\t// Create parent directories if they don't exist\n\t\tconst directory = this.getDirectoryName(resolvedPath);\n\t\tif (directory !== resolvedPath) {\n\t\t\ttry {\n\t\t\t\tawait this.mkdir(this.stripRoot(directory), { recursive: true });\n\t\t\t} catch (err: any) {\n\t\t\t\t// Ignore directory exists error\n\t\t\t\tif (err?.code !== 'EEXIST') {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof Readable) {\n\t\t\tlet _data = data;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst writeStream = this.createWriteStream(path, options);\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t_data.on('data', (chunk) => {\n\t\t\t\t\t\ttotalBytes += chunk.length;\n\t\t\t\t\t\tonUploadProgress({ loaded: totalBytes, total: -1 });\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_data.pipe(writeStream);\n\n\t\t\t\twriteStream.on('finish', () => resolve());\n\t\t\t\twriteStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t_data.destroy();\n\t\t\t\t\t\twriteStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (data instanceof ReadableStream) {\n\t\t\t// Handle web ReadableStream\n\t\t\tconst reader = data.getReader();\n\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\tlet loaded = 0;\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tif (value) {\n\t\t\t\t\tchunks.push(value);\n\t\t\t\t\tloaded += value.length;\n\t\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t\tonUploadProgress({ loaded, total: -1 });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, Buffer.concat(chunks));\n\t\t} else {\n\t\t\t// Convert ArrayBuffer/ArrayBufferView to Buffer if necessary\n\t\t\tlet writeData: string | Buffer;\n\t\t\tif (data instanceof ArrayBuffer) {\n\t\t\t\twriteData = Buffer.from(data);\n\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\twriteData = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n\t\t\t} else {\n\t\t\t\twriteData = data;\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, writeData);\n\t\t}\n\t}\n\n\tasync rm(path: string, options: RmOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, force = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\tawait fs.rm(resolvedPath, { recursive, force });\n\t\t} catch (err: any) {\n\t\t\tif (force && err.code === 'ENOENT') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options: RenameOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedOldPath = this.resolvePath(oldPath);\n\t\tconst resolvedNewPath = this.resolvePath(newPath);\n\n\t\t// Check if target exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(newPath);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`Destination already exists: ${newPath}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait fs.rename(resolvedOldPath, resolvedNewPath);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${oldPath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst { fs } = this;\n\n\t\ttry {\n\t\t\tawait fs.access(this.resolvePath(path));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync copy(src: string, dest: string, options: CopyOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, shallow = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedSrc = this.resolvePath(src);\n\t\tconst resolvedDest = this.resolvePath(dest);\n\n\t\t// Check if source exists\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedSrc);\n\n\t\t\t// Check if destination exists and overwrite is false\n\t\t\tif (!overwrite) {\n\t\t\t\tconst exists = await this.exists(dest);\n\t\t\t\tif (exists) {\n\t\t\t\t\tthrow new Error(`Destination already exists: ${dest}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create parent directory if it doesn't exist\n\t\t\tconst parentDir = this.getDirectoryName(resolvedDest);\n\t\t\tawait this.mkdir(this.stripRoot(parentDir), { recursive: true });\n\n\t\t\t// Copy recursively or not based on shallow and if it's a directory\n\t\t\tawait fs.cp(resolvedSrc, resolvedDest, {\n\t\t\t\trecursive: !shallow && stat.isDirectory(),\n\t\t\t\tforce: overwrite,\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${src}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tcreateReadStream(filePath: string, options: CreateReadStreamOptions = {}): Readable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal, range } = options;\n\t\tconst stream = nodeCreateReadStream(resolvedPath, {\n\t\t\tstart: range?.start,\n\t\t\tend: range?.end,\n\t\t});\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\tcreateWriteStream(filePath: string, options: CreateWriteStreamOptions = {}): Writable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal } = options;\n\t\tconst stream = nodeCreateWriteStream(resolvedPath, { flags: options.overwrite === false ? 'wx' : 'w' });\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\t// Helper to extract directory name correctly\n\tprivate getDirectoryName(filePath: string): string {\n\t\treturn path.dirname(filePath);\n\t}\n\n\tgetUrl(needle: IFileStat | string) {\n\t\tif (typeof needle === 'object' && needle?.kind !== 'file') {\n\t\t\treturn;\n\t\t}\n\t\tlet path = typeof needle === 'string' ? needle : needle.path;\n\t\tif (!path) {\n\t\t\treturn;\n\t\t}\n\t\t// file://\n\t\treturn pathToFileURL(this.resolvePath(path)).toString();\n\t}\n}\n"],"names":["createReadStream","nodeCreateReadStream","createWriteStream","nodeCreateWriteStream","fsp","path","Readable","pathToFileURL","createNodeFileSystem","options","NodeFs","root","fs","resolve","checkAborted","signal","aborted","Error","resolvePath","filePath","normalizedPath","normalize","resolvedPath","join","startsWith","stripRoot","fullPath","relativePath","substring","length","replace","toFileStat","fsStats","directoryPath","dirname","directory","name","basename","kind","isDirectory","mtime","mtimeMs","size","meta","readdir","dir","glob","recursive","depth","hidden","resolvedDir","entries","withFileTypes","results","Promise","all","filter","entry","isFile","map","entryFullPath","stat","subdirs","subdir","maxDepth","Infinity","_subdirFullPath","subEntries","matcher","match","err","code","mkdir","dirPath","readFile","encoding","onDownloadProgress","stream","reject","chunks","loaded","on","chunk","push","Buffer","from","total","buffer","concat","toString","writeFile","data","overwrite","onUploadProgress","exists","getDirectoryName","_data","writeStream","totalBytes","pipe","addEventListener","destroy","ReadableStream","reader","getReader","done","value","read","writeData","ArrayBuffer","isView","byteOffset","byteLength","rm","force","rename","oldPath","newPath","resolvedOldPath","resolvedNewPath","access","copy","src","dest","shallow","resolvedSrc","resolvedDest","parentDir","cp","range","start","end","flags","getUrl","needle"],"mappings":"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"}
@@ -81,18 +81,19 @@ export async function runFileSystemTest(fs, options = {}) {
81
81
  code: FileSystemErrorCode.EINVAL
82
82
  });
83
83
  // should support streaming operations
84
- if (readStream && fs.createReadStream) {
84
+ const serverFs = fs;
85
+ if (readStream && "createReadStream" in fs) {
85
86
  await fs.writeFile("/stream.txt", "Hello, World!");
86
87
  // Test createReadStream
87
- const readStream = fs.createReadStream("/stream.txt");
88
- expect(readStream).toBeDefined();
88
+ const readStreamObj = serverFs.createReadStream("/stream.txt");
89
+ expect(readStreamObj).toBeDefined();
89
90
  const chunks = [];
90
- for await (const chunk of readStream) {
91
+ for await (const chunk of readStreamObj) {
91
92
  chunks.push(chunk);
92
93
  }
93
94
  expect(Buffer.concat(chunks).toString()).toBe("Hello, World!");
94
95
  // Test createReadStream with range
95
- const rangeStream = fs.createReadStream("/stream.txt", {
96
+ const rangeStream = serverFs.createReadStream("/stream.txt", {
96
97
  range: {
97
98
  start: 0,
98
99
  end: 4
@@ -104,32 +105,32 @@ export async function runFileSystemTest(fs, options = {}) {
104
105
  }
105
106
  expect(Buffer.concat(rangeChunks).toString()).toBe("Hello");
106
107
  }
107
- if (writeStream && fs.createWriteStream) {
108
+ if (writeStream && "createWriteStream" in fs) {
108
109
  // Test createWriteStream
109
- const writeStream = fs.createWriteStream("/write-test.txt");
110
- expect(writeStream).toBeDefined();
111
- writeStream.write("Test content");
112
- writeStream.end();
113
- await new Promise((resolve) => writeStream.on("finish", resolve));
110
+ const writeStreamObj = serverFs.createWriteStream("/write-test.txt");
111
+ expect(writeStreamObj).toBeDefined();
112
+ writeStreamObj.write("Test content");
113
+ writeStreamObj.end();
114
+ await new Promise((resolve) => writeStreamObj.on("finish", resolve));
114
115
  expect(await fs.readFile("/write-test.txt", {
115
116
  encoding: "text"
116
117
  })).toBe("Test content");
117
118
  }
118
119
  // should support Web Streams API
119
- if (readableStream) {
120
+ if (readableStream && fs.createReadableStream) {
120
121
  await fs.writeFile("/webstream.txt", "Web Stream Test");
121
122
  // Test createReadableStream
122
- const readableStream = fs.createReadableStream("/webstream.txt");
123
- expect(readableStream).toBeDefined();
124
- const reader = readableStream.getReader();
123
+ const readableStreamObj = fs.createReadableStream("/webstream.txt");
124
+ expect(readableStreamObj).toBeDefined();
125
+ const reader = readableStreamObj.getReader();
125
126
  const { value } = await reader.read();
126
127
  expect(value?.toString()).toBe("Web Stream Test");
127
128
  }
128
- if (writableStream) {
129
+ if (writableStream && fs.createWritableStream) {
129
130
  // Test createWritableStream
130
- const writableStream = fs.createWritableStream("/web-write-test.txt");
131
- expect(writableStream).toBeDefined();
132
- const writer = writableStream.getWriter();
131
+ const writableStreamObj = fs.createWritableStream("/web-write-test.txt");
132
+ expect(writableStreamObj).toBeDefined();
133
+ const writer = writableStreamObj.getWriter();
133
134
  await writer.write(Buffer.from("Web Stream Write Test"));
134
135
  await writer.close();
135
136
  expect(await fs.readFile("/web-write-test.txt", {
@@ -137,27 +138,27 @@ export async function runFileSystemTest(fs, options = {}) {
137
138
  })).toBe("Web Stream Write Test");
138
139
  }
139
140
  // should handle streaming errors
140
- if (abort && readStream && fs.createReadStream) {
141
+ if (abort && readStream && "createReadStream" in fs) {
141
142
  const controller2 = new AbortController();
142
143
  // Test read stream with abort
143
- const readStream = fs.createReadStream("/README.txt", {
144
+ const readStreamObj = serverFs.createReadStream("/README.txt", {
144
145
  signal: controller2.signal
145
146
  });
146
147
  controller2.abort();
147
148
  await expect(new Promise((_, reject) => {
148
- readStream.on("error", reject);
149
+ readStreamObj.on("error", reject);
149
150
  })).rejects.toThrow(Error);
150
151
  }
151
- if (abort && writeStream && fs.createWriteStream) {
152
+ if (abort && writeStream && "createWriteStream" in fs) {
152
153
  // Test write stream with abort
153
154
  const controller3 = new AbortController();
154
- const writeStream = fs.createWriteStream("/abort-test.txt", {
155
+ const writeStreamObj = serverFs.createWriteStream("/abort-test.txt", {
155
156
  signal: controller3.signal
156
157
  });
157
158
  controller3.abort();
158
159
  await expect(new Promise((_, reject) => {
159
- writeStream.on("error", reject);
160
- writeStream.write("test");
160
+ writeStreamObj.on("error", reject);
161
+ writeStreamObj.write("test");
161
162
  })).rejects.toThrow(Error);
162
163
  }
163
164
  // should handle file operations correctly
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fs/tests/runFileSystemTest.ts"],"sourcesContent":["import { expect } from 'vitest';\nimport { FileSystemError, FileSystemErrorCode } from '../FileSystemError';\nimport type { IFileSystem } from '../IFileSystem';\n\nexport type RunFileSystemTestOptions = {\n\twritableStream?: boolean;\n\treadableStream?: boolean;\n\treadStream?: boolean;\n\twriteStream?: boolean;\n\tabort?: boolean;\n};\n\nexport async function runFileSystemTest(fs: IFileSystem, options: RunFileSystemTestOptions = {}) {\n\tconst { writableStream = true, readableStream = true, readStream = true, writeStream = true, abort = true } = options;\n\t// should be implemented\n\tconst stat = await fs.stat('/README.txt');\n\texpect(stat).toMatchObject({\n\t\tpath: '/README.txt',\n\t\tdirectory: '/',\n\t\tname: 'README.txt',\n\t\tkind: 'file',\n\t\tsize: 5,\n\t});\n\tawait fs.mkdir('/');\n\tconst entries = await fs.readdir('/');\n\texpect(entries.some((e) => e.name === 'README.txt')).toBe(true);\n\tawait fs.mkdir('/test');\n\n\tif (fs.getUrl) {\n\t\texpect(fs.getUrl(await fs.stat('/README.txt'))).toBeTypeOf('string');\n\t}\n\n\t// should handle AbortSignal\n\tif (abort) {\n\t\tconst controller = new AbortController();\n\t\tcontroller.abort();\n\n\t\tawait expect(fs.stat('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.readdir('/', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.mkdir('/test', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.readFile('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.writeFile('/test.txt', 'test', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.rm('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.rename('/README.txt', '/new.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.copy('/README.txt', '/copy.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t}\n\n\t// should validate input parameters\n\tawait expect(fs.stat('')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat('')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(null as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(null as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(undefined as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(undefined as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(123 as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(123 as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\n\tawait expect(fs.writeFile('', 'test')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('', 'test')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/test', null as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/test', null as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/test', undefined as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/test', undefined as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/', 'test')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/', 'test')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\n\t// should support streaming operations\n\tif (readStream && fs.createReadStream) {\n\t\tawait fs.writeFile('/stream.txt', 'Hello, World!');\n\n\t\t// Test createReadStream\n\t\tconst readStream = fs.createReadStream('/stream.txt');\n\t\texpect(readStream).toBeDefined();\n\n\t\tconst chunks: Buffer[] = [];\n\t\tfor await (const chunk of readStream) {\n\t\t\tchunks.push(chunk);\n\t\t}\n\t\texpect(Buffer.concat(chunks).toString()).toBe('Hello, World!');\n\n\t\t// Test createReadStream with range\n\t\tconst rangeStream = fs.createReadStream('/stream.txt', { range: { start: 0, end: 4 } });\n\t\tconst rangeChunks: Buffer[] = [];\n\t\tfor await (const chunk of rangeStream) {\n\t\t\trangeChunks.push(chunk);\n\t\t}\n\t\texpect(Buffer.concat(rangeChunks).toString()).toBe('Hello');\n\t}\n\n\tif (writeStream && fs.createWriteStream) {\n\t\t// Test createWriteStream\n\t\tconst writeStream = fs.createWriteStream('/write-test.txt');\n\t\texpect(writeStream).toBeDefined();\n\n\t\twriteStream.write('Test content');\n\t\twriteStream.end();\n\n\t\tawait new Promise((resolve) => writeStream.on('finish', resolve));\n\t\texpect(await fs.readFile('/write-test.txt', { encoding: 'text' })).toBe('Test content');\n\t}\n\n\t// should support Web Streams API\n\tif (readableStream) {\n\t\tawait fs.writeFile('/webstream.txt', 'Web Stream Test');\n\n\t\t// Test createReadableStream\n\t\tconst readableStream = fs.createReadableStream('/webstream.txt');\n\t\texpect(readableStream).toBeDefined();\n\n\t\tconst reader = readableStream.getReader();\n\t\tconst { value } = await reader.read();\n\t\texpect(value?.toString()).toBe('Web Stream Test');\n\t}\n\n\tif (writableStream) {\n\t\t// Test createWritableStream\n\t\tconst writableStream = fs.createWritableStream('/web-write-test.txt');\n\t\texpect(writableStream).toBeDefined();\n\n\t\tconst writer = writableStream.getWriter();\n\t\tawait writer.write(Buffer.from('Web Stream Write Test'));\n\t\tawait writer.close();\n\n\t\texpect(await fs.readFile('/web-write-test.txt', { encoding: 'text' })).toBe('Web Stream Write Test');\n\t}\n\n\t// should handle streaming errors\n\tif (abort && readStream && fs.createReadStream) {\n\t\tconst controller2 = new AbortController();\n\n\t\t// Test read stream with abort\n\t\tconst readStream = fs.createReadStream('/README.txt', { signal: controller2.signal });\n\t\tcontroller2.abort();\n\n\t\tawait expect(\n\t\t\tnew Promise((_, reject) => {\n\t\t\t\treadStream.on('error', reject);\n\t\t\t}),\n\t\t).rejects.toThrow(Error);\n\t}\n\n\tif (abort && writeStream && fs.createWriteStream) {\n\t\t// Test write stream with abort\n\t\tconst controller3 = new AbortController();\n\t\tconst writeStream = fs.createWriteStream('/abort-test.txt', { signal: controller3.signal });\n\t\tcontroller3.abort();\n\n\t\tawait expect(\n\t\t\tnew Promise((_, reject) => {\n\t\t\t\twriteStream.on('error', reject);\n\t\t\t\twriteStream.write('test');\n\t\t\t}),\n\t\t).rejects.toThrow(Error);\n\t}\n\n\t// should handle file operations correctly\n\t// Test file creation\n\tawait fs.writeFile('/newfile.txt', 'New content');\n\texpect(await fs.exists('/newfile.txt')).toBe(true);\n\n\tconst stat2 = await fs.stat('/newfile.txt');\n\texpect(stat2.kind).toBe('file');\n\texpect(stat2.size).toBe(11); // \"New content\" is 11 bytes\n\n\t// Test file reading\n\tconst content = await fs.readFile('/newfile.txt', { encoding: 'text' });\n\texpect(content).toBe('New content');\n\n\t// Test file reading as binary\n\tconst binary = await fs.readFile('/newfile.txt');\n\texpect(Buffer.from(binary).toString()).toBe('New content');\n\n\t// Test file overwrite\n\tawait fs.writeFile('/newfile.txt', 'Updated content');\n\texpect(await fs.readFile('/newfile.txt', { encoding: 'text' })).toBe('Updated content');\n\n\t// Test file overwrite protection\n\tawait expect(fs.writeFile('/newfile.txt', 'Should fail', { overwrite: false })).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/newfile.txt', 'Should fail', { overwrite: false })).rejects.toMatchObject({\n\t\tcode: FileSystemErrorCode.EEXIST,\n\t});\n\n\t// Test large file write (should use file_node_content table)\n\t// Create ~1KB data to test large file handling\n\tconst largeData = 'x'.repeat(1024); // 1KB of data\n\tawait fs.writeFile('/largefile.txt', largeData);\n\tconst largeFileStat = await fs.stat('/largefile.txt');\n\texpect(largeFileStat.size).toBe(1024);\n\tconst largeFileContent = await fs.readFile('/largefile.txt', { encoding: 'text' });\n\texpect(largeFileContent).toBe(largeData);\n\texpect(largeFileContent.length).toBe(1024);\n\n\t// should handle directory operations correctly\n\t// Test directory creation\n\tawait fs.mkdir('/newdir');\n\texpect(await fs.exists('/newdir')).toBe(true);\n\n\tconst stat3 = await fs.stat('/newdir');\n\texpect(stat3.kind).toBe('directory');\n\n\t// Test recursive directory creation\n\tawait fs.mkdir('/deep/nested/dir', { recursive: true });\n\texpect(await fs.exists('/deep/nested/dir')).toBe(true);\n\n\t// Test non-recursive directory creation failure\n\tawait expect(fs.mkdir('/another/deep/dir')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.mkdir('/another/deep/dir')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\n\t// Test directory listing\n\tawait fs.writeFile('/newdir/file1.txt', 'File 1');\n\tawait fs.writeFile('/newdir/file2.txt', 'File 2');\n\n\tconst contents = await fs.readdir('/newdir');\n\texpect(contents).toHaveLength(2);\n\texpect(contents.map((f) => f.name)).toContain('file1.txt');\n\texpect(contents.map((f) => f.name)).toContain('file2.txt');\n\n\t// should handle file removal correctly\n\tawait fs.writeFile('/toremove.txt', 'Remove me');\n\texpect(await fs.exists('/toremove.txt')).toBe(true);\n\n\tawait fs.rm('/toremove.txt');\n\texpect(await fs.exists('/toremove.txt')).toBe(false);\n\n\t// Test force removal\n\tawait expect(fs.rm('/nonexistent.txt')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/nonexistent.txt')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait fs.rm('/nonexistent.txt', { force: true }); // Should not throw\n\n\t// Test recursive removal\n\tawait fs.mkdir('/dirwithfiles', { recursive: true });\n\tawait fs.writeFile('/dirwithfiles/file.txt', 'content');\n\tawait expect(fs.rm('/dirwithfiles')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/dirwithfiles')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOTEMPTY });\n\tawait fs.rm('/dirwithfiles', { recursive: true });\n\texpect(await fs.exists('/dirwithfiles')).toBe(false);\n\n\t// should handle file rename correctly\n\tawait fs.writeFile('/rename.txt', 'Original content');\n\texpect(await fs.exists('/rename.txt')).toBe(true);\n\n\tawait fs.rename('/rename.txt', '/renamed.txt');\n\texpect(await fs.exists('/rename.txt')).toBe(false);\n\texpect(await fs.exists('/renamed.txt')).toBe(true);\n\texpect(await fs.readFile('/renamed.txt', { encoding: 'text' })).toBe('Original content');\n\n\t// should handle file copy correctly\n\tawait fs.writeFile('/copy.txt', 'Copy me');\n\texpect(await fs.exists('/copy.txt')).toBe(true);\n\n\tawait fs.copy('/copy.txt', '/copied.txt');\n\texpect(await fs.exists('/copy.txt')).toBe(true);\n\texpect(await fs.exists('/copied.txt')).toBe(true);\n\texpect(await fs.readFile('/copied.txt', { encoding: 'text' })).toBe('Copy me');\n\n\t// Test copy overwrite\n\tawait fs.writeFile('/target2.txt', 'Target content');\n\tawait expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toMatchObject({ code: FileSystemErrorCode.EEXIST });\n\tawait fs.copy('/copy.txt', '/target2.txt', { overwrite: true });\n\texpect(await fs.readFile('/target2.txt', { encoding: 'text' })).toBe('Copy me');\n\n\t// should handle edge cases correctly\n\t// Test root directory operations\n\tawait expect(fs.stat('/')).resolves.toBeDefined();\n\tawait expect(fs.readdir('/')).resolves.toBeDefined();\n\tawait fs.mkdir('/'); // Should not throw\n\n\t// Test path normalization\n\tawait fs.writeFile('/normalize.txt', 'test');\n\texpect(await fs.exists('/normalize.txt')).toBe(true);\n\texpect(await fs.exists('/./normalize.txt')).toBe(true);\n\t// Note: the exists method may return true for files with trailing slashes due to normalization\n\n\t// Test error cases\n\tawait expect(fs.stat('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.readdir('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.readdir('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.readFile('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.readFile('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.rm('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.rename('/nonexistent', '/new')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rename('/nonexistent', '/new')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.copy('/nonexistent', '/new')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.copy('/nonexistent', '/new')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n}\n"],"names":["expect","FileSystemError","FileSystemErrorCode","runFileSystemTest","fs","options","writableStream","readableStream","readStream","writeStream","abort","stat","toMatchObject","path","directory","name","kind","size","mkdir","entries","readdir","some","e","toBe","getUrl","toBeTypeOf","controller","AbortController","signal","rejects","toThrow","Error","readFile","writeFile","rm","rename","copy","code","EINVAL","undefined","createReadStream","toBeDefined","chunks","chunk","push","Buffer","concat","toString","rangeStream","range","start","end","rangeChunks","createWriteStream","write","Promise","resolve","on","encoding","createReadableStream","reader","getReader","value","read","createWritableStream","writer","getWriter","from","close","controller2","_","reject","controller3","exists","stat2","content","binary","overwrite","EEXIST","largeData","repeat","largeFileStat","largeFileContent","length","stat3","recursive","ENOENT","contents","toHaveLength","map","f","toContain","force","ENOTEMPTY","resolves"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fs/tests/runFileSystemTest.ts"],"sourcesContent":["import { expect } from 'vitest';\nimport { FileSystemError, FileSystemErrorCode } from '../FileSystemError';\nimport type { IFileSystem, IServerFileSystem } from '../IFileSystem';\n\nexport type RunFileSystemTestOptions = {\n\twritableStream?: boolean;\n\treadableStream?: boolean;\n\treadStream?: boolean;\n\twriteStream?: boolean;\n\tabort?: boolean;\n};\n\nexport async function runFileSystemTest(fs: IFileSystem | IServerFileSystem, options: RunFileSystemTestOptions = {}) {\n\tconst { writableStream = true, readableStream = true, readStream = true, writeStream = true, abort = true } = options;\n\t// should be implemented\n\tconst stat = await fs.stat('/README.txt');\n\texpect(stat).toMatchObject({\n\t\tpath: '/README.txt',\n\t\tdirectory: '/',\n\t\tname: 'README.txt',\n\t\tkind: 'file',\n\t\tsize: 5,\n\t});\n\tawait fs.mkdir('/');\n\tconst entries = await fs.readdir('/');\n\texpect(entries.some((e) => e.name === 'README.txt')).toBe(true);\n\tawait fs.mkdir('/test');\n\n\tif (fs.getUrl) {\n\t\texpect(fs.getUrl(await fs.stat('/README.txt'))).toBeTypeOf('string');\n\t}\n\n\t// should handle AbortSignal\n\tif (abort) {\n\t\tconst controller = new AbortController();\n\t\tcontroller.abort();\n\n\t\tawait expect(fs.stat('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.readdir('/', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.mkdir('/test', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.readFile('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.writeFile('/test.txt', 'test', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.rm('/README.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.rename('/README.txt', '/new.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t\tawait expect(fs.copy('/README.txt', '/copy.txt', { signal: controller.signal })).rejects.toThrow(Error);\n\t}\n\n\t// should validate input parameters\n\tawait expect(fs.stat('')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat('')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(null as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(null as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(undefined as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(undefined as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.stat(123 as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat(123 as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\n\tawait expect(fs.writeFile('', 'test')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('', 'test')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/test', null as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/test', null as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/test', undefined as any)).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/test', undefined as any)).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\tawait expect(fs.writeFile('/', 'test')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/', 'test')).rejects.toMatchObject({ code: FileSystemErrorCode.EINVAL });\n\n\t// should support streaming operations\n\tconst serverFs = fs as IServerFileSystem;\n\tif (readStream && 'createReadStream' in fs) {\n\t\tawait fs.writeFile('/stream.txt', 'Hello, World!');\n\n\t\t// Test createReadStream\n\t\tconst readStreamObj = serverFs.createReadStream('/stream.txt');\n\t\texpect(readStreamObj).toBeDefined();\n\n\t\tconst chunks: Buffer[] = [];\n\t\tfor await (const chunk of readStreamObj) {\n\t\t\tchunks.push(chunk);\n\t\t}\n\t\texpect(Buffer.concat(chunks).toString()).toBe('Hello, World!');\n\n\t\t// Test createReadStream with range\n\t\tconst rangeStream = serverFs.createReadStream('/stream.txt', { range: { start: 0, end: 4 } });\n\t\tconst rangeChunks: Buffer[] = [];\n\t\tfor await (const chunk of rangeStream) {\n\t\t\trangeChunks.push(chunk);\n\t\t}\n\t\texpect(Buffer.concat(rangeChunks).toString()).toBe('Hello');\n\t}\n\n\tif (writeStream && 'createWriteStream' in fs) {\n\t\t// Test createWriteStream\n\t\tconst writeStreamObj = serverFs.createWriteStream('/write-test.txt');\n\t\texpect(writeStreamObj).toBeDefined();\n\n\t\twriteStreamObj.write('Test content');\n\t\twriteStreamObj.end();\n\n\t\tawait new Promise((resolve) => writeStreamObj.on('finish', resolve));\n\t\texpect(await fs.readFile('/write-test.txt', { encoding: 'text' })).toBe('Test content');\n\t}\n\n\t// should support Web Streams API\n\tif (readableStream && fs.createReadableStream) {\n\t\tawait fs.writeFile('/webstream.txt', 'Web Stream Test');\n\n\t\t// Test createReadableStream\n\t\tconst readableStreamObj = fs.createReadableStream('/webstream.txt');\n\t\texpect(readableStreamObj).toBeDefined();\n\n\t\tconst reader = readableStreamObj.getReader();\n\t\tconst { value } = await reader.read();\n\t\texpect(value?.toString()).toBe('Web Stream Test');\n\t}\n\n\tif (writableStream && fs.createWritableStream) {\n\t\t// Test createWritableStream\n\t\tconst writableStreamObj = fs.createWritableStream('/web-write-test.txt');\n\t\texpect(writableStreamObj).toBeDefined();\n\n\t\tconst writer = writableStreamObj.getWriter();\n\t\tawait writer.write(Buffer.from('Web Stream Write Test'));\n\t\tawait writer.close();\n\n\t\texpect(await fs.readFile('/web-write-test.txt', { encoding: 'text' })).toBe('Web Stream Write Test');\n\t}\n\n\t// should handle streaming errors\n\tif (abort && readStream && 'createReadStream' in fs) {\n\t\tconst controller2 = new AbortController();\n\n\t\t// Test read stream with abort\n\t\tconst readStreamObj = serverFs.createReadStream('/README.txt', { signal: controller2.signal });\n\t\tcontroller2.abort();\n\n\t\tawait expect(\n\t\t\tnew Promise((_, reject) => {\n\t\t\t\treadStreamObj.on('error', reject);\n\t\t\t}),\n\t\t).rejects.toThrow(Error);\n\t}\n\n\tif (abort && writeStream && 'createWriteStream' in fs) {\n\t\t// Test write stream with abort\n\t\tconst controller3 = new AbortController();\n\t\tconst writeStreamObj = serverFs.createWriteStream('/abort-test.txt', { signal: controller3.signal });\n\t\tcontroller3.abort();\n\n\t\tawait expect(\n\t\t\tnew Promise((_, reject) => {\n\t\t\t\twriteStreamObj.on('error', reject);\n\t\t\t\twriteStreamObj.write('test');\n\t\t\t}),\n\t\t).rejects.toThrow(Error);\n\t}\n\n\t// should handle file operations correctly\n\t// Test file creation\n\tawait fs.writeFile('/newfile.txt', 'New content');\n\texpect(await fs.exists('/newfile.txt')).toBe(true);\n\n\tconst stat2 = await fs.stat('/newfile.txt');\n\texpect(stat2.kind).toBe('file');\n\texpect(stat2.size).toBe(11); // \"New content\" is 11 bytes\n\n\t// Test file reading\n\tconst content = await fs.readFile('/newfile.txt', { encoding: 'text' });\n\texpect(content).toBe('New content');\n\n\t// Test file reading as binary\n\tconst binary = await fs.readFile('/newfile.txt');\n\texpect(Buffer.from(binary).toString()).toBe('New content');\n\n\t// Test file overwrite\n\tawait fs.writeFile('/newfile.txt', 'Updated content');\n\texpect(await fs.readFile('/newfile.txt', { encoding: 'text' })).toBe('Updated content');\n\n\t// Test file overwrite protection\n\tawait expect(fs.writeFile('/newfile.txt', 'Should fail', { overwrite: false })).rejects.toThrow(FileSystemError);\n\tawait expect(fs.writeFile('/newfile.txt', 'Should fail', { overwrite: false })).rejects.toMatchObject({\n\t\tcode: FileSystemErrorCode.EEXIST,\n\t});\n\n\t// Test large file write (should use file_node_content table)\n\t// Create ~1KB data to test large file handling\n\tconst largeData = 'x'.repeat(1024); // 1KB of data\n\tawait fs.writeFile('/largefile.txt', largeData);\n\tconst largeFileStat = await fs.stat('/largefile.txt');\n\texpect(largeFileStat.size).toBe(1024);\n\tconst largeFileContent = await fs.readFile('/largefile.txt', { encoding: 'text' });\n\texpect(largeFileContent).toBe(largeData);\n\texpect(largeFileContent.length).toBe(1024);\n\n\t// should handle directory operations correctly\n\t// Test directory creation\n\tawait fs.mkdir('/newdir');\n\texpect(await fs.exists('/newdir')).toBe(true);\n\n\tconst stat3 = await fs.stat('/newdir');\n\texpect(stat3.kind).toBe('directory');\n\n\t// Test recursive directory creation\n\tawait fs.mkdir('/deep/nested/dir', { recursive: true });\n\texpect(await fs.exists('/deep/nested/dir')).toBe(true);\n\n\t// Test non-recursive directory creation failure\n\tawait expect(fs.mkdir('/another/deep/dir')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.mkdir('/another/deep/dir')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\n\t// Test directory listing\n\tawait fs.writeFile('/newdir/file1.txt', 'File 1');\n\tawait fs.writeFile('/newdir/file2.txt', 'File 2');\n\n\tconst contents = await fs.readdir('/newdir');\n\texpect(contents).toHaveLength(2);\n\texpect(contents.map((f) => f.name)).toContain('file1.txt');\n\texpect(contents.map((f) => f.name)).toContain('file2.txt');\n\n\t// should handle file removal correctly\n\tawait fs.writeFile('/toremove.txt', 'Remove me');\n\texpect(await fs.exists('/toremove.txt')).toBe(true);\n\n\tawait fs.rm('/toremove.txt');\n\texpect(await fs.exists('/toremove.txt')).toBe(false);\n\n\t// Test force removal\n\tawait expect(fs.rm('/nonexistent.txt')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/nonexistent.txt')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait fs.rm('/nonexistent.txt', { force: true }); // Should not throw\n\n\t// Test recursive removal\n\tawait fs.mkdir('/dirwithfiles', { recursive: true });\n\tawait fs.writeFile('/dirwithfiles/file.txt', 'content');\n\tawait expect(fs.rm('/dirwithfiles')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/dirwithfiles')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOTEMPTY });\n\tawait fs.rm('/dirwithfiles', { recursive: true });\n\texpect(await fs.exists('/dirwithfiles')).toBe(false);\n\n\t// should handle file rename correctly\n\tawait fs.writeFile('/rename.txt', 'Original content');\n\texpect(await fs.exists('/rename.txt')).toBe(true);\n\n\tawait fs.rename('/rename.txt', '/renamed.txt');\n\texpect(await fs.exists('/rename.txt')).toBe(false);\n\texpect(await fs.exists('/renamed.txt')).toBe(true);\n\texpect(await fs.readFile('/renamed.txt', { encoding: 'text' })).toBe('Original content');\n\n\t// should handle file copy correctly\n\tawait fs.writeFile('/copy.txt', 'Copy me');\n\texpect(await fs.exists('/copy.txt')).toBe(true);\n\n\tawait fs.copy('/copy.txt', '/copied.txt');\n\texpect(await fs.exists('/copy.txt')).toBe(true);\n\texpect(await fs.exists('/copied.txt')).toBe(true);\n\texpect(await fs.readFile('/copied.txt', { encoding: 'text' })).toBe('Copy me');\n\n\t// Test copy overwrite\n\tawait fs.writeFile('/target2.txt', 'Target content');\n\tawait expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toMatchObject({ code: FileSystemErrorCode.EEXIST });\n\tawait fs.copy('/copy.txt', '/target2.txt', { overwrite: true });\n\texpect(await fs.readFile('/target2.txt', { encoding: 'text' })).toBe('Copy me');\n\n\t// should handle edge cases correctly\n\t// Test root directory operations\n\tawait expect(fs.stat('/')).resolves.toBeDefined();\n\tawait expect(fs.readdir('/')).resolves.toBeDefined();\n\tawait fs.mkdir('/'); // Should not throw\n\n\t// Test path normalization\n\tawait fs.writeFile('/normalize.txt', 'test');\n\texpect(await fs.exists('/normalize.txt')).toBe(true);\n\texpect(await fs.exists('/./normalize.txt')).toBe(true);\n\t// Note: the exists method may return true for files with trailing slashes due to normalization\n\n\t// Test error cases\n\tawait expect(fs.stat('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.stat('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.readdir('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.readdir('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.readFile('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.readFile('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.rm('/nonexistent')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rm('/nonexistent')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.rename('/nonexistent', '/new')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.rename('/nonexistent', '/new')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n\tawait expect(fs.copy('/nonexistent', '/new')).rejects.toThrow(FileSystemError);\n\tawait expect(fs.copy('/nonexistent', '/new')).rejects.toMatchObject({ code: FileSystemErrorCode.ENOENT });\n}\n"],"names":["expect","FileSystemError","FileSystemErrorCode","runFileSystemTest","fs","options","writableStream","readableStream","readStream","writeStream","abort","stat","toMatchObject","path","directory","name","kind","size","mkdir","entries","readdir","some","e","toBe","getUrl","toBeTypeOf","controller","AbortController","signal","rejects","toThrow","Error","readFile","writeFile","rm","rename","copy","code","EINVAL","undefined","serverFs","readStreamObj","createReadStream","toBeDefined","chunks","chunk","push","Buffer","concat","toString","rangeStream","range","start","end","rangeChunks","writeStreamObj","createWriteStream","write","Promise","resolve","on","encoding","createReadableStream","readableStreamObj","reader","getReader","value","read","createWritableStream","writableStreamObj","writer","getWriter","from","close","controller2","_","reject","controller3","exists","stat2","content","binary","overwrite","EEXIST","largeData","repeat","largeFileStat","largeFileContent","length","stat3","recursive","ENOENT","contents","toHaveLength","map","f","toContain","force","ENOTEMPTY","resolves"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fs/utils.ts"],"sourcesContent":["import { ArrayBuffers, classOf } from '@wener/utils';\nimport type { IFileStat, WritableData } from './IFileSystem';\n\nexport function resolveData(data: WritableData) {\n\tlet buf: Uint8Array;\n\tif (typeof data === 'string') {\n\t\tbuf = ArrayBuffers.toUint8Array(ArrayBuffers.from(data, 'utf8'));\n\t} else if (data instanceof ArrayBuffer) {\n\t\tbuf = new Uint8Array(data);\n\t} else if (data instanceof Uint8Array) {\n\t\tbuf = data;\n\t} else {\n\t\tthrow new Error(`unable to resolve data: ${typeof data} ${classOf(data)}`);\n\t}\n\treturn buf;\n}\n\nexport function getPath(f: IFileStat | string) {\n\tif (typeof f === 'string') {\n\t\treturn f;\n\t}\n\treturn f.path;\n}\n"],"names":["ArrayBuffers","classOf","resolveData","data","buf","toUint8Array","from","ArrayBuffer","Uint8Array","Error","getPath","f","path"],"mappings":"AAAA,SAASA,YAAY,EAAEC,OAAO,QAAQ,eAAe;AAGrD,OAAO,SAASC,YAAYC,IAAkB;IAC7C,IAAIC;IACJ,IAAI,OAAOD,SAAS,UAAU;QAC7BC,MAAMJ,aAAaK,YAAY,CAACL,aAAaM,IAAI,CAACH,MAAM;IACzD,OAAO,IAAIA,gBAAgBI,aAAa;QACvCH,MAAM,IAAII,WAAWL;IACtB,OAAO,IAAIA,gBAAgBK,YAAY;QACtCJ,MAAMD;IACP,OAAO;QACN,MAAM,IAAIM,MAAM,CAAC,wBAAwB,EAAE,OAAON,KAAK,CAAC,EAAEF,QAAQE,OAAO;IAC1E;IACA,OAAOC;AACR;AAEA,OAAO,SAASM,QAAQC,CAAqB;IAC5C,IAAI,OAAOA,MAAM,UAAU;QAC1B,OAAOA;IACR;IACA,OAAOA,EAAEC,IAAI;AACd"}
1
+ {"version":3,"sources":["../../src/fs/utils.ts"],"sourcesContent":["import { ArrayBuffers, classOf } from '@wener/utils';\nimport type { IFileStat, WritableData } from './IFileSystem';\n\nexport function resolveData(data: WritableData) {\n\tlet buf: Uint8Array;\n\tif (typeof data === 'string') {\n\t\tbuf = ArrayBuffers.toUint8Array(ArrayBuffers.from(data, 'utf8') as BufferSource);\n\t} else if (data instanceof ArrayBuffer) {\n\t\tbuf = new Uint8Array(data);\n\t} else if (data instanceof Uint8Array) {\n\t\tbuf = data;\n\t} else {\n\t\tthrow new Error(`unable to resolve data: ${typeof data} ${classOf(data)}`);\n\t}\n\treturn buf;\n}\n\nexport function getPath(f: IFileStat | string) {\n\tif (typeof f === 'string') {\n\t\treturn f;\n\t}\n\treturn f.path;\n}\n"],"names":["ArrayBuffers","classOf","resolveData","data","buf","toUint8Array","from","ArrayBuffer","Uint8Array","Error","getPath","f","path"],"mappings":"AAAA,SAASA,YAAY,EAAEC,OAAO,QAAQ,eAAe;AAGrD,OAAO,SAASC,YAAYC,IAAkB;IAC7C,IAAIC;IACJ,IAAI,OAAOD,SAAS,UAAU;QAC7BC,MAAMJ,aAAaK,YAAY,CAACL,aAAaM,IAAI,CAACH,MAAM;IACzD,OAAO,IAAIA,gBAAgBI,aAAa;QACvCH,MAAM,IAAII,WAAWL;IACtB,OAAO,IAAIA,gBAAgBK,YAAY;QACtCJ,MAAMD;IACP,OAAO;QACN,MAAM,IAAIM,MAAM,CAAC,wBAAwB,EAAE,OAAON,KAAK,CAAC,EAAEF,QAAQE,OAAO;IAC1E;IACA,OAAOC;AACR;AAEA,OAAO,SAASM,QAAQC,CAAqB;IAC5C,IAAI,OAAOA,MAAM,UAAU;QAC1B,OAAOA;IACR;IACA,OAAOA,EAAEC,IAAI;AACd"}
@@ -0,0 +1,2 @@
1
+ export { createWebDavFileSystem } from "../createWebDavFileSystem.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fs/webdav/index.ts"],"sourcesContent":["export { createWebDavFileSystem } from '../createWebDavFileSystem';\n"],"names":["createWebDavFileSystem"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,4BAA4B"}
@@ -53,7 +53,7 @@ function addSchema(schema, { onConflict = 'throw' } = {}) {
53
53
  onConflict = (_, neo)=>neo;
54
54
  break;
55
55
  case 'throw':
56
- onConflict = (old, neo)=>{
56
+ onConflict = (_old, neo)=>{
57
57
  throw new Error(`Schema ${neo.$id} already exists`);
58
58
  };
59
59
  break;
@@ -113,9 +113,9 @@ function create(schema, data) {
113
113
  return create(schema.oneOf[0]);
114
114
  }).with({
115
115
  type: 'string'
116
- }, (schema)=>'').with({
116
+ }, (_schema)=>'').with({
117
117
  type: P.union('number', 'integer')
118
- }, (schema)=>0).with({
118
+ }, (_schema)=>0).with({
119
119
  type: 'object'
120
120
  }, (schema)=>{
121
121
  let out = validate({
@@ -147,9 +147,9 @@ function create(schema, data) {
147
147
  type: 'null'
148
148
  }, ()=>null).with({
149
149
  type: 'boolean'
150
- }, (schema)=>false).with({
150
+ }, (_schema)=>false).with({
151
151
  type: 'array'
152
- }, (schema)=>[]).otherwise(()=>{
152
+ }, (_schema)=>[]).otherwise(()=>{
153
153
  return undefined;
154
154
  });
155
155
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport { isNil } from '@wener/utils';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport addKeywords from 'ajv-keywords';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createValidator(opt: Options) {\n\tconst ajv = new Ajv(opt);\n\taddKeywords(ajv);\n\taddFormats(ajv);\n\treturn ajv;\n}\n\ntype ValidateOptions = { mutate?: boolean; clone?: boolean; validator?: Ajv };\n\ntype ValidateResult<T> =\n\t| { data: T; success: true; message: undefined }\n\t| { data: undefined; success: false; message: string; errors: ErrorObject[] };\n\nfunction validate({ schema, data, mutate, clone, validator }: ValidateOptions & { schema: any; data: any }) {\n\tlet opts: Options = {\n\t\t// strict: 'log',\n\t\tstrict: true,\n\t\tstrictSchema: 'log', // skip unknown keywords in schema\n\t};\n\n\tif (mutate) {\n\t\tObject.assign(opts, { removeAdditional: true, useDefaults: true, coerceTypes: true, allErrors: true });\n\t}\n\n\tif (clone) {\n\t\tdata = structuredClone(data);\n\t}\n\n\tif (!validator) {\n\t\tvalidator = JsonSchema.createValidator(opts);\n\t}\n\n\tconst validate = validator.compile(schema);\n\n\t// consider reusing validate instance\n\n\tconst valid = validate(data);\n\tconst errors = validate.errors;\n\t// localize(errors);\n\n\treturn { data, success: valid, message: validator.errorsText(errors), errors: errors };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nlet schemas: JsonSchemaDef[] = [];\n\nlet createValidator = _createValidator;\n\nfunction addSchema(\n\tschema: JsonSchemaDef,\n\t{\n\t\tonConflict = 'throw',\n\t}: {\n\t\tonConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n\t} = {},\n) {\n\tif (!schema.$id) throw new Error('Schema must have $id');\n\tswitch (onConflict) {\n\t\tcase 'ignore':\n\t\t\tonConflict = (old) => old;\n\t\t\tbreak;\n\t\tcase 'replace':\n\t\t\tonConflict = (_, neo) => neo;\n\t\t\tbreak;\n\t\tcase 'throw':\n\t\t\tonConflict = (old, neo) => {\n\t\t\t\tthrow new Error(`Schema ${neo.$id} already exists`);\n\t\t\t};\n\t\t\tbreak;\n\t}\n\tlet idx = schemas.findIndex((s) => s.$id === schema.$id);\n\tif (idx >= 0) {\n\t\tschemas[idx] = onConflict(schemas[idx], schema);\n\t} else {\n\t\tschemas.push(schema);\n\t}\n}\n\n/**\n * Check data is valid, will not use default\n */\nfunction check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: false, clone: true }) as any;\n}\n\n/**\n * Parse data with default value and coerceTypes\n */\nfunction safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: true, clone: true }) as any;\n}\n\nfunction parse<S>(schema: S, data: any): TypeOfSchema<S> {\n\tconst { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n\tif (errors) {\n\t\tthrow new Error(message);\n\t}\n\treturn out;\n}\n\nfunction create<S>(schema: S, data?: any): TypeOfSchema<S> {\n\t// will not ensure value match the rule\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<any>()\n\t\t.with({ const: P.nonNullable }, (v) => v)\n\t\t.with({ default: P.select() }, (v) => v)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.oneOf[0]);\n\t\t})\n\t\t.with({ type: 'string' }, (schema) => '')\n\t\t.with({ type: P.union('number', 'integer') }, (schema) => 0)\n\t\t.with({ type: 'object' }, (schema: JsonSchemaDef) => {\n\t\t\tlet out = validate({ schema, data: data ?? {}, mutate: true });\n\t\t\tif (!out.success) {\n\t\t\t\t// fallback\n\t\t\t\tlet obj = data || {};\n\t\t\t\tschema.required?.forEach((key) => {\n\t\t\t\t\tif (!(key in obj)) {\n\t\t\t\t\t\tlet last = obj[key];\n\t\t\t\t\t\tlet prop = schema.properties?.[key];\n\t\t\t\t\t\tif (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tout = validate({ schema, data: obj, mutate: true });\n\t\t\t\tif (!out.success) {\n\t\t\t\t\tconsole.warn(`Failed to create object with schema: ${out.message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out.data;\n\t\t})\n\t\t.with({ type: 'null' }, () => null)\n\t\t.with({ type: 'boolean' }, (schema) => false)\n\t\t.with({ type: 'array' }, (schema) => [])\n\t\t.otherwise(() => {\n\t\t\treturn undefined;\n\t\t});\n}\n\nfunction isPrimitiveType(schema: any): boolean {\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<boolean>()\n\t\t.with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.oneOf[0]);\n\t\t})\n\t\t.otherwise(() => false);\n}\n\nexport const JsonSchema = {\n\tcreateValidator,\n\taddSchema,\n\tschemas,\n\tcheck,\n\tsafeParse,\n\tparse,\n\tcreate,\n\tisPrimitiveType,\n} as const;\n"],"names":["isNil","Ajv","addFormats","addKeywords","match","P","_createValidator","opt","ajv","validate","schema","data","mutate","clone","validator","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createValidator","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","nonNullable","v","default","select","anyOf","oneOf","type","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"AACA,SAASA,KAAK,QAAQ,eAAe;AACrC,OAAOC,SAA6C,MAAM;AAC1D,OAAOC,gBAAgB,cAAc;AACrC,OAAOC,iBAAiB,eAAe;AACvC,SAASC,KAAK,EAAEC,CAAC,QAAQ,aAAa;AAGtC,SAASC,iBAAiBC,GAAY;IACrC,MAAMC,MAAM,IAAIP,IAAIM;IACpBJ,YAAYK;IACZN,WAAWM;IACX,OAAOA;AACR;AAQA,SAASC,SAAS,EAAEC,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAgD;IACzG,IAAIC,OAAgB;QACnB,iBAAiB;QACjBC,QAAQ;QACRC,cAAc;IACf;IAEA,IAAIL,QAAQ;QACXM,OAAOC,MAAM,CAACJ,MAAM;YAAEK,kBAAkB;YAAMC,aAAa;YAAMC,aAAa;YAAMC,WAAW;QAAK;IACrG;IAEA,IAAIV,OAAO;QACVF,OAAOa,gBAAgBb;IACxB;IAEA,IAAI,CAACG,WAAW;QACfA,YAAYW,WAAWC,eAAe,CAACX;IACxC;IAEA,MAAMN,WAAWK,UAAUa,OAAO,CAACjB;IAEnC,qCAAqC;IAErC,MAAMkB,QAAQnB,SAASE;IACvB,MAAMkB,SAASpB,SAASoB,MAAM;IAC9B,oBAAoB;IAEpB,OAAO;QAAElB;QAAMmB,SAASF;QAAOG,SAASjB,UAAUkB,UAAU,CAACH;QAASA,QAAQA;IAAO;AACtF;AAIA,IAAII,UAA2B,EAAE;AAEjC,IAAIP,kBAAkBpB;AAEtB,SAAS4B,UACRxB,MAAqB,EACrB,EACCyB,aAAa,OAAO,EAGpB,GAAG,CAAC,CAAC;IAEN,IAAI,CAACzB,OAAO0B,GAAG,EAAE,MAAM,IAAIC,MAAM;IACjC,OAAQF;QACP,KAAK;YACJA,aAAa,CAACG,MAAQA;YACtB;QACD,KAAK;YACJH,aAAa,CAACI,GAAGC,MAAQA;YACzB;QACD,KAAK;YACJL,aAAa,CAACG,KAAKE;gBAClB,MAAM,IAAIH,MAAM,CAAC,OAAO,EAAEG,IAAIJ,GAAG,CAAC,eAAe,CAAC;YACnD;YACA;IACF;IACA,IAAIK,MAAMR,QAAQS,SAAS,CAAC,CAACC,IAAMA,EAAEP,GAAG,KAAK1B,OAAO0B,GAAG;IACvD,IAAIK,OAAO,GAAG;QACbR,OAAO,CAACQ,IAAI,GAAGN,WAAWF,OAAO,CAACQ,IAAI,EAAE/B;IACzC,OAAO;QACNuB,QAAQW,IAAI,CAAClC;IACd;AACD;AAEA;;CAEC,GACD,SAASmC,MAASnC,MAAS,EAAEC,IAAS;IACrC,OAAOF,SAAS;QAAEC;QAAQC;QAAMC,QAAQ;QAAOC,OAAO;IAAK;AAC5D;AAEA;;CAEC,GACD,SAASiC,UAAapC,MAAS,EAAEC,IAAS;IACzC,OAAOF,SAAS;QAAEC;QAAQC;QAAMC,QAAQ;QAAMC,OAAO;IAAK;AAC3D;AAEA,SAASkC,MAASrC,MAAS,EAAEC,IAAS;IACrC,MAAM,EAAEA,MAAMqC,GAAG,EAAEjB,OAAO,EAAEF,MAAM,EAAE,GAAGpB,SAAS;QAAEC;QAAQC;QAAMC,QAAQ;QAAMC,OAAO;IAAK;IAC1F,IAAIgB,QAAQ;QACX,MAAM,IAAIQ,MAAMN;IACjB;IACA,OAAOiB;AACR;AAEA,SAASC,OAAUvC,MAAS,EAAEC,IAAU;IACvC,uCAAuC;IACvC,OAAOP,MAAMM,QACXwC,UAAU,GACVC,IAAI,CAAC;QAAEC,OAAO/C,EAAEgD,WAAW;IAAC,GAAG,CAACC,IAAMA,GACtCH,IAAI,CAAC;QAAEI,SAASlD,EAAEmD,MAAM;IAAG,GAAG,CAACF,IAAMA,GACrCH,IAAI,CAAC;QAAEM,OAAOpD,EAAEgD,WAAW;IAAC,GAAG,CAAC3C;QAChC,OAAOuC,OAAOvC,OAAO+C,KAAK,CAAC,EAAE;IAC9B,GACCN,IAAI,CAAC;QAAEO,OAAOrD,EAAEgD,WAAW;IAAC,GAAG,CAAC3C;QAChC,OAAOuC,OAAOvC,OAAOgD,KAAK,CAAC,EAAE;IAC9B,GACCP,IAAI,CAAC;QAAEQ,MAAM;IAAS,GAAG,CAACjD,SAAW,IACrCyC,IAAI,CAAC;QAAEQ,MAAMtD,EAAEuD,KAAK,CAAC,UAAU;IAAW,GAAG,CAAClD,SAAW,GACzDyC,IAAI,CAAC;QAAEQ,MAAM;IAAS,GAAG,CAACjD;QAC1B,IAAIsC,MAAMvC,SAAS;YAAEC;YAAQC,MAAMA,QAAQ,CAAC;YAAGC,QAAQ;QAAK;QAC5D,IAAI,CAACoC,IAAIlB,OAAO,EAAE;YACjB,WAAW;YACX,IAAI+B,MAAMlD,QAAQ,CAAC;YACnBD,OAAOoD,QAAQ,EAAEC,QAAQ,CAACC;gBACzB,IAAI,CAAEA,CAAAA,OAAOH,GAAE,GAAI;oBAClB,IAAII,OAAOJ,GAAG,CAACG,IAAI;oBACnB,IAAIE,OAAOxD,OAAOyD,UAAU,EAAE,CAACH,IAAI;oBACnC,IAAIE,QAAQlE,MAAMiE,OAAOJ,GAAG,CAACG,IAAI,GAAGvC,WAAWwB,MAAM,CAACiB,MAAMD;gBAC7D;YACD;YACAjB,MAAMvC,SAAS;gBAAEC;gBAAQC,MAAMkD;gBAAKjD,QAAQ;YAAK;YACjD,IAAI,CAACoC,IAAIlB,OAAO,EAAE;gBACjBsC,QAAQC,IAAI,CAAC,CAAC,qCAAqC,EAAErB,IAAIjB,OAAO,EAAE;YACnE;QACD;QACA,OAAOiB,IAAIrC,IAAI;IAChB,GACCwC,IAAI,CAAC;QAAEQ,MAAM;IAAO,GAAG,IAAM,MAC7BR,IAAI,CAAC;QAAEQ,MAAM;IAAU,GAAG,CAACjD,SAAW,OACtCyC,IAAI,CAAC;QAAEQ,MAAM;IAAQ,GAAG,CAACjD,SAAW,EAAE,EACtC4D,SAAS,CAAC;QACV,OAAOC;IACR;AACF;AAEA,SAASC,gBAAgB9D,MAAW;IACnC,OAAON,MAAMM,QACXwC,UAAU,GACVC,IAAI,CAAC;QAAEQ,MAAMtD,EAAEuD,KAAK,CAAC,UAAU,WAAW,UAAU;IAAW,GAAG,IAAM,MACxET,IAAI,CAAC;QAAEM,OAAOpD,EAAEgD,WAAW;IAAC,GAAG,CAAC3C;QAChC,OAAO8D,gBAAgB9D,OAAO+C,KAAK,CAAC,EAAE;IACvC,GACCN,IAAI,CAAC;QAAEO,OAAOrD,EAAEgD,WAAW;IAAC,GAAG,CAAC3C;QAChC,OAAO8D,gBAAgB9D,OAAOgD,KAAK,CAAC,EAAE;IACvC,GACCY,SAAS,CAAC,IAAM;AACnB;AAEA,OAAO,MAAM7C,aAAa;IACzBC;IACAQ;IACAD;IACAY;IACAC;IACAC;IACAE;IACAuB;AACD,EAAW"}
1
+ {"version":3,"sources":["../../src/jsonschema/JsonSchema.ts"],"sourcesContent":["import type { Static, TSchema } from '@sinclair/typebox';\nimport { isNil } from '@wener/utils';\nimport Ajv, { type ErrorObject, type Options } from 'ajv';\nimport addFormats from 'ajv-formats';\nimport addKeywords from 'ajv-keywords';\nimport { match, P } from 'ts-pattern';\nimport type { JsonSchemaDef } from './types';\n\nfunction _createValidator(opt: Options) {\n\tconst ajv = new Ajv(opt);\n\taddKeywords(ajv);\n\taddFormats(ajv);\n\treturn ajv;\n}\n\ntype ValidateOptions = { mutate?: boolean; clone?: boolean; validator?: Ajv };\n\ntype ValidateResult<T> =\n\t| { data: T; success: true; message: undefined }\n\t| { data: undefined; success: false; message: string; errors: ErrorObject[] };\n\nfunction validate({ schema, data, mutate, clone, validator }: ValidateOptions & { schema: any; data: any }) {\n\tlet opts: Options = {\n\t\t// strict: 'log',\n\t\tstrict: true,\n\t\tstrictSchema: 'log', // skip unknown keywords in schema\n\t};\n\n\tif (mutate) {\n\t\tObject.assign(opts, { removeAdditional: true, useDefaults: true, coerceTypes: true, allErrors: true });\n\t}\n\n\tif (clone) {\n\t\tdata = structuredClone(data);\n\t}\n\n\tif (!validator) {\n\t\tvalidator = JsonSchema.createValidator(opts);\n\t}\n\n\tconst validate = validator.compile(schema);\n\n\t// consider reusing validate instance\n\n\tconst valid = validate(data);\n\tconst errors = validate.errors;\n\t// localize(errors);\n\n\treturn { data, success: valid, message: validator.errorsText(errors), errors: errors };\n}\n\ntype TypeOfSchema<S> = S extends TSchema ? Static<S> : any;\n\nlet schemas: JsonSchemaDef[] = [];\n\nlet createValidator = _createValidator;\n\nfunction addSchema(\n\tschema: JsonSchemaDef,\n\t{\n\t\tonConflict = 'throw',\n\t}: {\n\t\tonConflict?: 'throw' | 'ignore' | 'replace' | ((old: JsonSchemaDef, neo: JsonSchemaDef) => JsonSchemaDef);\n\t} = {},\n) {\n\tif (!schema.$id) throw new Error('Schema must have $id');\n\tswitch (onConflict) {\n\t\tcase 'ignore':\n\t\t\tonConflict = (old) => old;\n\t\t\tbreak;\n\t\tcase 'replace':\n\t\t\tonConflict = (_, neo) => neo;\n\t\t\tbreak;\n\t\tcase 'throw':\n\t\t\tonConflict = (_old, neo) => {\n\t\t\t\tthrow new Error(`Schema ${neo.$id} already exists`);\n\t\t\t};\n\t\t\tbreak;\n\t}\n\tlet idx = schemas.findIndex((s) => s.$id === schema.$id);\n\tif (idx >= 0) {\n\t\tschemas[idx] = onConflict(schemas[idx], schema);\n\t} else {\n\t\tschemas.push(schema);\n\t}\n}\n\n/**\n * Check data is valid, will not use default\n */\nfunction check<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: false, clone: true }) as any;\n}\n\n/**\n * Parse data with default value and coerceTypes\n */\nfunction safeParse<S>(schema: S, data: any): ValidateResult<TypeOfSchema<S>> {\n\treturn validate({ schema, data, mutate: true, clone: true }) as any;\n}\n\nfunction parse<S>(schema: S, data: any): TypeOfSchema<S> {\n\tconst { data: out, message, errors } = validate({ schema, data, mutate: true, clone: true });\n\tif (errors) {\n\t\tthrow new Error(message);\n\t}\n\treturn out;\n}\n\nfunction create<S>(schema: S, data?: any): TypeOfSchema<S> {\n\t// will not ensure value match the rule\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<any>()\n\t\t.with({ const: P.nonNullable }, (v) => v)\n\t\t.with({ default: P.select() }, (v) => v)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn create(schema.oneOf[0]);\n\t\t})\n\t\t.with({ type: 'string' }, (_schema) => '')\n\t\t.with({ type: P.union('number', 'integer') }, (_schema) => 0)\n\t\t.with({ type: 'object' }, (schema: JsonSchemaDef) => {\n\t\t\tlet out = validate({ schema, data: data ?? {}, mutate: true });\n\t\t\tif (!out.success) {\n\t\t\t\t// fallback\n\t\t\t\tlet obj = data || {};\n\t\t\t\tschema.required?.forEach((key) => {\n\t\t\t\t\tif (!(key in obj)) {\n\t\t\t\t\t\tlet last = obj[key];\n\t\t\t\t\t\tlet prop = schema.properties?.[key];\n\t\t\t\t\t\tif (prop && isNil(last)) obj[key] = JsonSchema.create(prop, last);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tout = validate({ schema, data: obj, mutate: true });\n\t\t\t\tif (!out.success) {\n\t\t\t\t\tconsole.warn(`Failed to create object with schema: ${out.message}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out.data;\n\t\t})\n\t\t.with({ type: 'null' }, () => null)\n\t\t.with({ type: 'boolean' }, (_schema) => false)\n\t\t.with({ type: 'array' }, (_schema) => [])\n\t\t.otherwise(() => {\n\t\t\treturn undefined;\n\t\t});\n}\n\nfunction isPrimitiveType(schema: any): boolean {\n\treturn match(schema as JsonSchemaDef)\n\t\t.returnType<boolean>()\n\t\t.with({ type: P.union('number', 'integer', 'string', 'boolean') }, () => true)\n\t\t.with({ anyOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.anyOf[0]);\n\t\t})\n\t\t.with({ oneOf: P.nonNullable }, (schema) => {\n\t\t\treturn isPrimitiveType(schema.oneOf[0]);\n\t\t})\n\t\t.otherwise(() => false);\n}\n\nexport const JsonSchema = {\n\tcreateValidator,\n\taddSchema,\n\tschemas,\n\tcheck,\n\tsafeParse,\n\tparse,\n\tcreate,\n\tisPrimitiveType,\n} as const;\n"],"names":["isNil","Ajv","addFormats","addKeywords","match","P","_createValidator","opt","ajv","validate","schema","data","mutate","clone","validator","opts","strict","strictSchema","Object","assign","removeAdditional","useDefaults","coerceTypes","allErrors","structuredClone","JsonSchema","createValidator","compile","valid","errors","success","message","errorsText","schemas","addSchema","onConflict","$id","Error","old","_","neo","_old","idx","findIndex","s","push","check","safeParse","parse","out","create","returnType","with","const","nonNullable","v","default","select","anyOf","oneOf","type","_schema","union","obj","required","forEach","key","last","prop","properties","console","warn","otherwise","undefined","isPrimitiveType"],"mappings":"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"}
@@ -2,7 +2,7 @@ export function forEachJsonSchema(js, cb) {
2
2
  const ctx = {
3
3
  path: []
4
4
  };
5
- const _visit = (js, _f, parent, path, k)=>{
5
+ const _visit = (js, _f, parent, path, _k)=>{
6
6
  if (!js) {
7
7
  return;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/forEachJsonSchema.ts"],"sourcesContent":["import type { JsonSchemaDef } from './types';\n\nexport type VisitJsonSchemaContext = { path: string[]; parent?: JsonSchemaDef };\n\nexport function forEachJsonSchema(js: JsonSchemaDef, cb: (js: JsonSchemaDef, ctx: VisitJsonSchemaContext) => void) {\n\tconst ctx: VisitJsonSchemaContext = { path: [] };\n\tconst _visit = (\n\t\tjs: JsonSchemaDef,\n\t\t_f: (js: JsonSchemaDef, ctx: VisitJsonSchemaContext) => void,\n\t\tparent: JsonSchemaDef | undefined,\n\t\tpath: string[],\n\t\tk?: string,\n\t) => {\n\t\tif (!js) {\n\t\t\treturn;\n\t\t}\n\t\tctx.path = path;\n\t\tctx.parent = parent;\n\t\t_f(js, ctx);\n\t\tif (js.properties) {\n\t\t\tfor (const [k, v] of Object.entries(js.properties)) {\n\t\t\t\tif (v) {\n\t\t\t\t\t_visit(v, _f, js, path.concat(k), 'properties');\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (js.items) {\n\t\t\t// array should be `key[].subkey` or `key.*.subkey`?\n\t\t\tif (Array.isArray(js.items)) {\n\t\t\t\tfor (const v of js.items) {\n\t\t\t\t\t_visit(v, _f, js, path, 'items');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_visit(js.items, _f, js, path, 'items');\n\t\t\t}\n\t\t} else if (js.anyOf) {\n\t\t\tfor (const v of js.anyOf) {\n\t\t\t\t_visit(v, _f, js, path, 'anyOf');\n\t\t\t}\n\t\t} else if (js.oneOf) {\n\t\t\tfor (const v of js.oneOf) {\n\t\t\t\t_visit(v, _f, js, path, 'oneOf');\n\t\t\t}\n\t\t} else if (js.allOf) {\n\t\t\tfor (const v of js.allOf) {\n\t\t\t\t_visit(v, _f, js, path, 'allOf');\n\t\t\t}\n\t\t}\n\t};\n\t_visit(js, cb, undefined, []);\n}\n"],"names":["forEachJsonSchema","js","cb","ctx","path","_visit","_f","parent","k","properties","v","Object","entries","concat","items","Array","isArray","anyOf","oneOf","allOf","undefined"],"mappings":"AAIA,OAAO,SAASA,kBAAkBC,EAAiB,EAAEC,EAA4D;IAChH,MAAMC,MAA8B;QAAEC,MAAM,EAAE;IAAC;IAC/C,MAAMC,SAAS,CACdJ,IACAK,IACAC,QACAH,MACAI;QAEA,IAAI,CAACP,IAAI;YACR;QACD;QACAE,IAAIC,IAAI,GAAGA;QACXD,IAAII,MAAM,GAAGA;QACbD,GAAGL,IAAIE;QACP,IAAIF,GAAGQ,UAAU,EAAE;YAClB,KAAK,MAAM,CAACD,GAAGE,EAAE,IAAIC,OAAOC,OAAO,CAACX,GAAGQ,UAAU,EAAG;gBACnD,IAAIC,GAAG;oBACNL,OAAOK,GAAGJ,IAAIL,IAAIG,KAAKS,MAAM,CAACL,IAAI;gBACnC;YACD;QACD,OAAO,IAAIP,GAAGa,KAAK,EAAE;YACpB,oDAAoD;YACpD,IAAIC,MAAMC,OAAO,CAACf,GAAGa,KAAK,GAAG;gBAC5B,KAAK,MAAMJ,KAAKT,GAAGa,KAAK,CAAE;oBACzBT,OAAOK,GAAGJ,IAAIL,IAAIG,MAAM;gBACzB;YACD,OAAO;gBACNC,OAAOJ,GAAGa,KAAK,EAAER,IAAIL,IAAIG,MAAM;YAChC;QACD,OAAO,IAAIH,GAAGgB,KAAK,EAAE;YACpB,KAAK,MAAMP,KAAKT,GAAGgB,KAAK,CAAE;gBACzBZ,OAAOK,GAAGJ,IAAIL,IAAIG,MAAM;YACzB;QACD,OAAO,IAAIH,GAAGiB,KAAK,EAAE;YACpB,KAAK,MAAMR,KAAKT,GAAGiB,KAAK,CAAE;gBACzBb,OAAOK,GAAGJ,IAAIL,IAAIG,MAAM;YACzB;QACD,OAAO,IAAIH,GAAGkB,KAAK,EAAE;YACpB,KAAK,MAAMT,KAAKT,GAAGkB,KAAK,CAAE;gBACzBd,OAAOK,GAAGJ,IAAIL,IAAIG,MAAM;YACzB;QACD;IACD;IACAC,OAAOJ,IAAIC,IAAIkB,WAAW,EAAE;AAC7B"}
1
+ {"version":3,"sources":["../../src/jsonschema/forEachJsonSchema.ts"],"sourcesContent":["import type { JsonSchemaDef } from './types';\n\nexport type VisitJsonSchemaContext = { path: string[]; parent?: JsonSchemaDef };\n\nexport function forEachJsonSchema(js: JsonSchemaDef, cb: (js: JsonSchemaDef, ctx: VisitJsonSchemaContext) => void) {\n\tconst ctx: VisitJsonSchemaContext = { path: [] };\n\tconst _visit = (\n\t\tjs: JsonSchemaDef,\n\t\t_f: (js: JsonSchemaDef, ctx: VisitJsonSchemaContext) => void,\n\t\tparent: JsonSchemaDef | undefined,\n\t\tpath: string[],\n\t\t_k?: string,\n\t) => {\n\t\tif (!js) {\n\t\t\treturn;\n\t\t}\n\t\tctx.path = path;\n\t\tctx.parent = parent;\n\t\t_f(js, ctx);\n\t\tif (js.properties) {\n\t\t\tfor (const [k, v] of Object.entries(js.properties)) {\n\t\t\t\tif (v) {\n\t\t\t\t\t_visit(v, _f, js, path.concat(k), 'properties');\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (js.items) {\n\t\t\t// array should be `key[].subkey` or `key.*.subkey`?\n\t\t\tif (Array.isArray(js.items)) {\n\t\t\t\tfor (const v of js.items) {\n\t\t\t\t\t_visit(v, _f, js, path, 'items');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t_visit(js.items, _f, js, path, 'items');\n\t\t\t}\n\t\t} else if (js.anyOf) {\n\t\t\tfor (const v of js.anyOf) {\n\t\t\t\t_visit(v, _f, js, path, 'anyOf');\n\t\t\t}\n\t\t} else if (js.oneOf) {\n\t\t\tfor (const v of js.oneOf) {\n\t\t\t\t_visit(v, _f, js, path, 'oneOf');\n\t\t\t}\n\t\t} else if (js.allOf) {\n\t\t\tfor (const v of js.allOf) {\n\t\t\t\t_visit(v, _f, js, path, 'allOf');\n\t\t\t}\n\t\t}\n\t};\n\t_visit(js, cb, undefined, []);\n}\n"],"names":["forEachJsonSchema","js","cb","ctx","path","_visit","_f","parent","_k","properties","k","v","Object","entries","concat","items","Array","isArray","anyOf","oneOf","allOf","undefined"],"mappings":"AAIA,OAAO,SAASA,kBAAkBC,EAAiB,EAAEC,EAA4D;IAChH,MAAMC,MAA8B;QAAEC,MAAM,EAAE;IAAC;IAC/C,MAAMC,SAAS,CACdJ,IACAK,IACAC,QACAH,MACAI;QAEA,IAAI,CAACP,IAAI;YACR;QACD;QACAE,IAAIC,IAAI,GAAGA;QACXD,IAAII,MAAM,GAAGA;QACbD,GAAGL,IAAIE;QACP,IAAIF,GAAGQ,UAAU,EAAE;YAClB,KAAK,MAAM,CAACC,GAAGC,EAAE,IAAIC,OAAOC,OAAO,CAACZ,GAAGQ,UAAU,EAAG;gBACnD,IAAIE,GAAG;oBACNN,OAAOM,GAAGL,IAAIL,IAAIG,KAAKU,MAAM,CAACJ,IAAI;gBACnC;YACD;QACD,OAAO,IAAIT,GAAGc,KAAK,EAAE;YACpB,oDAAoD;YACpD,IAAIC,MAAMC,OAAO,CAAChB,GAAGc,KAAK,GAAG;gBAC5B,KAAK,MAAMJ,KAAKV,GAAGc,KAAK,CAAE;oBACzBV,OAAOM,GAAGL,IAAIL,IAAIG,MAAM;gBACzB;YACD,OAAO;gBACNC,OAAOJ,GAAGc,KAAK,EAAET,IAAIL,IAAIG,MAAM;YAChC;QACD,OAAO,IAAIH,GAAGiB,KAAK,EAAE;YACpB,KAAK,MAAMP,KAAKV,GAAGiB,KAAK,CAAE;gBACzBb,OAAOM,GAAGL,IAAIL,IAAIG,MAAM;YACzB;QACD,OAAO,IAAIH,GAAGkB,KAAK,EAAE;YACpB,KAAK,MAAMR,KAAKV,GAAGkB,KAAK,CAAE;gBACzBd,OAAOM,GAAGL,IAAIL,IAAIG,MAAM;YACzB;QACD,OAAO,IAAIH,GAAGmB,KAAK,EAAE;YACpB,KAAK,MAAMT,KAAKV,GAAGmB,KAAK,CAAE;gBACzBf,OAAOM,GAAGL,IAAIL,IAAIG,MAAM;YACzB;QACD;IACD;IACAC,OAAOJ,IAAIC,IAAImB,WAAW,EAAE;AAC7B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jsonschema/types.d.ts"],"sourcesContent":["type JsonSchemaTypeName =\n\t| 'string' //\n\t| 'number'\n\t| 'integer'\n\t| 'boolean'\n\t| 'object'\n\t| 'array'\n\t| 'null'\n\t| undefined;\n\ntype JsonValue =\n\t| string //\n\t| number\n\t| boolean\n\t| { [key: string]: JsonValue }\n\t| JsonValue[]\n\t| null\n\t| undefined; //\n\ntype JsonSchemaVersion =\n\t| 'http://json-schema.org/schema' // latest\n\t//\n\t| 'https://json-schema.org/draft/2020-12/schema'\n\t| 'https://json-schema.org/draft/2019-09/schema'\n\t// draft-07\n\t| 'https://json-schema.org/draft-07/schema'\n\t| 'http://json-schema.org/draft-07/schema'\n\t| 'https://json-schema.org/draft-07/hyper-schema'\n\t| 'http://json-schema.org/draft-07/hyper-schema'\n\t//\n\t| 'https://json-schema.org/draft-04/schema';\ntype JsonSchemaFormatName =\n\t//\n\t| 'date-time'\n\t| 'date'\n\t| 'time'\n\t| 'duration'\n\t//\n\t| 'email'\n\t| 'idn-email'\n\t//\n\t| 'hostname'\n\t| 'idn-hostname'\n\t| 'ipv4'\n\t| 'ipv6'\n\t//\n\t| 'uri'\n\t| 'uri-reference'\n\t| 'iri'\n\t| 'iri-reference'\n\t| 'uuid'\n\t| 'uri-template'\n\t| 'regex'\n\t| 'json-pointer'\n\t| 'relative-json-pointer';\n\n/**\n * JSON Schema Definition\n *\n * @see https://json-schema.org/specification-links.html\n */\nexport type JsonSchemaDef<I = any, O = I> = {\n\t$id?: string;\n\t$ref?: string;\n\t/**\n\t * Meta schema\n\t *\n\t * Recommended values:\n\t * - 'http://json-schema.org/schema#'\n\t * - 'http://json-schema.org/hyper-schema#'\n\t * - 'http://json-schema.org/draft-07/schema#'\n\t * - 'http://json-schema.org/draft-07/hyper-schema#'\n\t *\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5\n\t */\n\t$schema?: JsonSchemaVersion | string;\n\t$comment?: string;\n\n\t$defs?: { [key: string]: JsonSchemaDef };\n\n\ttype?: JsonSchemaTypeName | JsonSchemaTypeName[];\n\tenum?: JsonValue;\n\tconst?: JsonValue;\n\n\t//region Numeric Validation\n\n\tmultipleOf?: number;\n\tmaximum?: number;\n\texclusiveMaximum?: number;\n\tminimum?: number;\n\texclusiveMinimum?: number;\n\n\t//endregion\n\n\t//region String Validation\n\n\tmaxLength?: number;\n\tminLength?: number;\n\tpattern?: string;\n\n\t//endregion\n\n\t//region Array Validation\n\n\t/**\n\t * schema for array items\n\t * @see https://json-schema.org/understanding-json-schema/reference/array.html#items\n\t */\n\titems?: JsonSchemaDef | JsonSchemaDef[];\n\tadditionalItems?: JsonSchemaDef | boolean;\n\tmaxItems?: number;\n\tminItems?: number;\n\tuniqueItems?: boolean;\n\tcontains?: JsonSchemaDef;\n\n\t//region Draft 2022-12\n\tminContains?: number;\n\tmaxContains?: number;\n\tprefixItems?: JsonSchemaDef[];\n\t//endregion\n\n\t//endregion\n\n\t//region Object Validation\n\n\tmaxProperties?: number;\n\tminProperties?: number;\n\trequired?: string[];\n\tproperties?: { [key: string]: JsonSchemaDef };\n\tpatternProperties?: { [key: string]: JsonSchemaDef };\n\t/**\n\t * Replaced by {@link unevaluatedProperties} in Draft 2019-09+\n\t */\n\tadditionalProperties?: JsonSchemaDef | boolean; // true = {}\n\t/**\n\t * Superseded by {@link dependentSchemas}, {@link dependentRequired} in Draft 2019-09+\n\t */\n\tdependencies?: { [key: string]: undefined | JsonSchemaDef | string[] };\n\tpropertyNames?: JsonSchemaDef;\n\n\t//region Draft 2019-09+\n\n\tdependentSchemas?: { [key: string]: JsonSchemaDef };\n\tdependentRequired?: { [key: string]: string[] };\n\tunevaluatedProperties?: JsonSchemaDef | boolean;\n\tunevaluatedItems?: JsonSchemaDef | boolean;\n\n\t//endregion\n\n\t//endregion\n\n\t//region Conditional\n\n\tif?: JsonSchemaDef;\n\tthen?: JsonSchemaDef;\n\telse?: JsonSchemaDef;\n\n\t//endregion\n\n\t//region Boolean Logic\n\n\tallOf?: JsonSchemaDef[]; // extends, merge\n\tanyOf?: JsonSchemaDef[];\n\toneOf?: JsonSchemaDef[]; // polymorphism, enum\n\tnot?: JsonSchemaDef;\n\t//endregion\n\n\t//region Semantic\n\n\tformat?: JsonSchemaFormatName | string;\n\n\t//endregion\n\n\t//region String-Encoding Non-JSON Data\n\n\tcontentMediaType?: string;\n\tcontentEncoding?: string;\n\tcontentSchema?: JsonSchemaDef;\n\t//endregion\n\n\t/**\n\t * use {@link $defs} instead\n\t */\n\tdefinitions?: Record<string, JsonSchemaDef>;\n\n\t//region Meta-Data Annotations\n\t/**\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10\n\t */\n\n\ttitle?: string;\n\tdescription?: string;\n\tdefault?: JsonValue;\n\treadOnly?: boolean;\n\twriteOnly?: boolean;\n\texamples?: JsonValue;\n\tdeprecated?: boolean;\n\n\t//endregion\n\n\t//region OpenAPI Spec\n\n\tnullable?: boolean;\n\n\tdiscriminator?: {\n\t\tpropertyName: string;\n\t\tmapping?: { [key: string]: string };\n\t};\n\n\t//endregion\n\n\t// [key: `x-${string}`]: JsonValue;\n\t[key: string]: JsonValue;\n};\n"],"names":[],"mappings":"AAwDA;;;;CAIC,GACD,WAwJE"}
1
+ {"version":3,"sources":["../../src/jsonschema/types.d.ts"],"sourcesContent":["type JsonSchemaTypeName =\n\t| 'string' //\n\t| 'number'\n\t| 'integer'\n\t| 'boolean'\n\t| 'object'\n\t| 'array'\n\t| 'null'\n\t| undefined;\n\ntype JsonValue =\n\t| string //\n\t| number\n\t| boolean\n\t| { [key: string]: JsonValue }\n\t| JsonValue[]\n\t| null\n\t| undefined; //\n\ntype JsonSchemaVersion =\n\t| 'http://json-schema.org/schema' // latest\n\t//\n\t| 'https://json-schema.org/draft/2020-12/schema'\n\t| 'https://json-schema.org/draft/2019-09/schema'\n\t// draft-07\n\t| 'https://json-schema.org/draft-07/schema'\n\t| 'http://json-schema.org/draft-07/schema'\n\t| 'https://json-schema.org/draft-07/hyper-schema'\n\t| 'http://json-schema.org/draft-07/hyper-schema'\n\t//\n\t| 'https://json-schema.org/draft-04/schema';\ntype JsonSchemaFormatName =\n\t//\n\t| 'date-time'\n\t| 'date'\n\t| 'time'\n\t| 'duration'\n\t//\n\t| 'email'\n\t| 'idn-email'\n\t//\n\t| 'hostname'\n\t| 'idn-hostname'\n\t| 'ipv4'\n\t| 'ipv6'\n\t//\n\t| 'uri'\n\t| 'uri-reference'\n\t| 'iri'\n\t| 'iri-reference'\n\t| 'uuid'\n\t| 'uri-template'\n\t| 'regex'\n\t| 'json-pointer'\n\t| 'relative-json-pointer';\n\n/**\n * JSON Schema Definition\n *\n * @see https://json-schema.org/specification-links.html\n */\nexport type JsonSchemaDef<I = any, _O = I> = {\n\t$id?: string;\n\t$ref?: string;\n\t/**\n\t * Meta schema\n\t *\n\t * Recommended values:\n\t * - 'http://json-schema.org/schema#'\n\t * - 'http://json-schema.org/hyper-schema#'\n\t * - 'http://json-schema.org/draft-07/schema#'\n\t * - 'http://json-schema.org/draft-07/hyper-schema#'\n\t *\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5\n\t */\n\t$schema?: JsonSchemaVersion | string;\n\t$comment?: string;\n\n\t$defs?: { [key: string]: JsonSchemaDef };\n\n\ttype?: JsonSchemaTypeName | JsonSchemaTypeName[];\n\tenum?: JsonValue;\n\tconst?: JsonValue;\n\n\t//region Numeric Validation\n\n\tmultipleOf?: number;\n\tmaximum?: number;\n\texclusiveMaximum?: number;\n\tminimum?: number;\n\texclusiveMinimum?: number;\n\n\t//endregion\n\n\t//region String Validation\n\n\tmaxLength?: number;\n\tminLength?: number;\n\tpattern?: string;\n\n\t//endregion\n\n\t//region Array Validation\n\n\t/**\n\t * schema for array items\n\t * @see https://json-schema.org/understanding-json-schema/reference/array.html#items\n\t */\n\titems?: JsonSchemaDef | JsonSchemaDef[];\n\tadditionalItems?: JsonSchemaDef | boolean;\n\tmaxItems?: number;\n\tminItems?: number;\n\tuniqueItems?: boolean;\n\tcontains?: JsonSchemaDef;\n\n\t//region Draft 2022-12\n\tminContains?: number;\n\tmaxContains?: number;\n\tprefixItems?: JsonSchemaDef[];\n\t//endregion\n\n\t//endregion\n\n\t//region Object Validation\n\n\tmaxProperties?: number;\n\tminProperties?: number;\n\trequired?: string[];\n\tproperties?: { [key: string]: JsonSchemaDef };\n\tpatternProperties?: { [key: string]: JsonSchemaDef };\n\t/**\n\t * Replaced by {@link unevaluatedProperties} in Draft 2019-09+\n\t */\n\tadditionalProperties?: JsonSchemaDef | boolean; // true = {}\n\t/**\n\t * Superseded by {@link dependentSchemas}, {@link dependentRequired} in Draft 2019-09+\n\t */\n\tdependencies?: { [key: string]: undefined | JsonSchemaDef | string[] };\n\tpropertyNames?: JsonSchemaDef;\n\n\t//region Draft 2019-09+\n\n\tdependentSchemas?: { [key: string]: JsonSchemaDef };\n\tdependentRequired?: { [key: string]: string[] };\n\tunevaluatedProperties?: JsonSchemaDef | boolean;\n\tunevaluatedItems?: JsonSchemaDef | boolean;\n\n\t//endregion\n\n\t//endregion\n\n\t//region Conditional\n\n\tif?: JsonSchemaDef;\n\tthen?: JsonSchemaDef;\n\telse?: JsonSchemaDef;\n\n\t//endregion\n\n\t//region Boolean Logic\n\n\tallOf?: JsonSchemaDef[]; // extends, merge\n\tanyOf?: JsonSchemaDef[];\n\toneOf?: JsonSchemaDef[]; // polymorphism, enum\n\tnot?: JsonSchemaDef;\n\t//endregion\n\n\t//region Semantic\n\n\tformat?: JsonSchemaFormatName | string;\n\n\t//endregion\n\n\t//region String-Encoding Non-JSON Data\n\n\tcontentMediaType?: string;\n\tcontentEncoding?: string;\n\tcontentSchema?: JsonSchemaDef;\n\t//endregion\n\n\t/**\n\t * use {@link $defs} instead\n\t */\n\tdefinitions?: Record<string, JsonSchemaDef>;\n\n\t//region Meta-Data Annotations\n\t/**\n\t * @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10\n\t */\n\n\ttitle?: string;\n\tdescription?: string;\n\tdefault?: JsonValue;\n\treadOnly?: boolean;\n\twriteOnly?: boolean;\n\texamples?: JsonValue;\n\tdeprecated?: boolean;\n\n\t//endregion\n\n\t//region OpenAPI Spec\n\n\tnullable?: boolean;\n\n\tdiscriminator?: {\n\t\tpropertyName: string;\n\t\tmapping?: { [key: string]: string };\n\t};\n\n\t//endregion\n\n\t// [key: `x-${string}`]: JsonValue;\n\t[key: string]: JsonValue;\n};\n"],"names":[],"mappings":"AAwDA;;;;CAIC,GACD,WAwJE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/meta/defineMetadata.ts"],"sourcesContent":["import { startCase } from 'es-toolkit';\nimport { get, set } from 'es-toolkit/compat';\n\ntype HasMetadata = { metadata?: Record<string, any> };\n\ntype MetadataKey<T> = { key: string; type: T; title: string; description?: string };\n\ninterface CreateMetadataKeyOptions {\n\tkey: string;\n\ttitle?: string;\n\tdescription?: string;\n}\n\nexport function createMetadataKey<T = never>(key: string, opts?: Omit<CreateMetadataKeyOptions, 'key'>): MetadataKey<T>;\nexport function createMetadataKey<T = never>(opts: CreateMetadataKeyOptions): MetadataKey<T>;\nexport function createMetadataKey<T = never>(a: any, b?: any): MetadataKey<T> {\n\tconst opts: CreateMetadataKeyOptions = typeof a === 'string' ? { key: a, ...b } : a;\n\n\tconst { key } = opts;\n\topts.title ||= startCase(key);\n\n\tconst k: MetadataKey<T> = { ...opts, type: null as any } as MetadataKey<T>;\n\n\tif ('toStringTag' in Symbol && typeof Symbol.toStringTag === 'symbol') {\n\t\tObject.defineProperty(k, Symbol.toStringTag, { value: key });\n\t}\n\n\treturn k;\n}\n\nexport function defineMetadata<T>(res: HasMetadata, key: MetadataKey<T>, opts: T): void;\nexport function defineMetadata<T>(key: MetadataKey<T>, items: Array<[HasMetadata, T]>): void;\nexport function defineMetadata<T>(a: any, b: any, c?: any) {\n\tif (Array.isArray(b)) {\n\t\tconst key = a;\n\t\tconst items = b;\n\t\tfor (const [res, opts] of items) {\n\t\t\tdefineMetadata(res, key, opts);\n\t\t}\n\t} else {\n\t\tconst res = a;\n\t\tconst key = b;\n\t\tconst opts = c;\n\t\tres.metadata = res.metadata || {};\n\t\tset(res.metadata, key.key, opts);\n\t}\n}\n\nexport function getMetadata<T>(res: HasMetadata | undefined | null, key: MetadataKey<T>): T | undefined {\n\tif (!res?.metadata) return undefined;\n\treturn get(res.metadata, key.key);\n}\n"],"names":["startCase","get","set","createMetadataKey","a","b","opts","key","title","k","type","Symbol","toStringTag","Object","defineProperty","value","defineMetadata","c","Array","isArray","items","res","metadata","getMetadata","undefined"],"mappings":"AAAA,SAASA,SAAS,QAAQ,aAAa;AACvC,SAASC,GAAG,EAAEC,GAAG,QAAQ,oBAAoB;AAc7C,OAAO,SAASC,kBAA6BC,CAAM,EAAEC,CAAO;IAC3D,MAAMC,OAAiC,OAAOF,MAAM,WAAW;QAAEG,KAAKH;QAAG,GAAGC,CAAC;IAAC,IAAID;IAElF,MAAM,EAAEG,GAAG,EAAE,GAAGD;IAChBA,KAAKE,KAAK,KAAKR,UAAUO;IAEzB,MAAME,IAAoB;QAAE,GAAGH,IAAI;QAAEI,MAAM;IAAY;IAEvD,IAAI,iBAAiBC,UAAU,OAAOA,OAAOC,WAAW,KAAK,UAAU;QACtEC,OAAOC,cAAc,CAACL,GAAGE,OAAOC,WAAW,EAAE;YAAEG,OAAOR;QAAI;IAC3D;IAEA,OAAOE;AACR;AAIA,OAAO,SAASO,eAAkBZ,CAAM,EAAEC,CAAM,EAAEY,CAAO;IACxD,IAAIC,MAAMC,OAAO,CAACd,IAAI;QACrB,MAAME,MAAMH;QACZ,MAAMgB,QAAQf;QACd,KAAK,MAAM,CAACgB,KAAKf,KAAK,IAAIc,MAAO;YAChCJ,eAAeK,KAAKd,KAAKD;QAC1B;IACD,OAAO;QACN,MAAMe,MAAMjB;QACZ,MAAMG,MAAMF;QACZ,MAAMC,OAAOW;QACbI,IAAIC,QAAQ,GAAGD,IAAIC,QAAQ,IAAI,CAAC;QAChCpB,IAAImB,IAAIC,QAAQ,EAAEf,IAAIA,GAAG,EAAED;IAC5B;AACD;AAEA,OAAO,SAASiB,YAAeF,GAAmC,EAAEd,GAAmB;IACtF,IAAI,CAACc,KAAKC,UAAU,OAAOE;IAC3B,OAAOvB,IAAIoB,IAAIC,QAAQ,EAAEf,IAAIA,GAAG;AACjC"}
1
+ {"version":3,"sources":["../../src/meta/defineMetadata.ts"],"sourcesContent":["import { startCase } from 'es-toolkit';\nimport { get, set } from 'es-toolkit/compat';\n\ntype HasMetadata = { metadata?: Record<string, any> };\n\ntype MetadataKey<T> = { key: string; type: T; title: string; description?: string };\n\ninterface CreateMetadataKeyOptions {\n\tkey: string;\n\ttitle?: string;\n\tdescription?: string;\n}\n\nexport function createMetadataKey<T = never>(key: string, opts?: Omit<CreateMetadataKeyOptions, 'key'>): MetadataKey<T>;\nexport function createMetadataKey<T = never>(opts: CreateMetadataKeyOptions): MetadataKey<T>;\nexport function createMetadataKey<T = never>(a: any, b?: any): MetadataKey<T> {\n\tconst opts: CreateMetadataKeyOptions = typeof a === 'string' ? { key: a, ...b } : a;\n\n\tconst { key } = opts;\n\topts.title ||= startCase(key);\n\n\tconst k: MetadataKey<T> = { ...opts, type: null as any } as MetadataKey<T>;\n\n\tif ('toStringTag' in Symbol && typeof Symbol.toStringTag === 'symbol') {\n\t\tObject.defineProperty(k, Symbol.toStringTag, { value: key });\n\t}\n\n\treturn k;\n}\n\nexport function defineMetadata<T>(res: HasMetadata, key: MetadataKey<T>, opts: T): void;\nexport function defineMetadata<T>(key: MetadataKey<T>, items: Array<[HasMetadata, T]>): void;\nexport function defineMetadata<_T>(a: any, b: any, c?: any) {\n\tif (Array.isArray(b)) {\n\t\tconst key = a;\n\t\tconst items = b;\n\t\tfor (const [res, opts] of items) {\n\t\t\tdefineMetadata(res, key, opts);\n\t\t}\n\t} else {\n\t\tconst res = a;\n\t\tconst key = b;\n\t\tconst opts = c;\n\t\tres.metadata = res.metadata || {};\n\t\tset(res.metadata, key.key, opts);\n\t}\n}\n\nexport function getMetadata<T>(res: HasMetadata | undefined | null, key: MetadataKey<T>): T | undefined {\n\tif (!res?.metadata) return undefined;\n\treturn get(res.metadata, key.key);\n}\n"],"names":["startCase","get","set","createMetadataKey","a","b","opts","key","title","k","type","Symbol","toStringTag","Object","defineProperty","value","defineMetadata","c","Array","isArray","items","res","metadata","getMetadata","undefined"],"mappings":"AAAA,SAASA,SAAS,QAAQ,aAAa;AACvC,SAASC,GAAG,EAAEC,GAAG,QAAQ,oBAAoB;AAc7C,OAAO,SAASC,kBAA6BC,CAAM,EAAEC,CAAO;IAC3D,MAAMC,OAAiC,OAAOF,MAAM,WAAW;QAAEG,KAAKH;QAAG,GAAGC,CAAC;IAAC,IAAID;IAElF,MAAM,EAAEG,GAAG,EAAE,GAAGD;IAChBA,KAAKE,KAAK,KAAKR,UAAUO;IAEzB,MAAME,IAAoB;QAAE,GAAGH,IAAI;QAAEI,MAAM;IAAY;IAEvD,IAAI,iBAAiBC,UAAU,OAAOA,OAAOC,WAAW,KAAK,UAAU;QACtEC,OAAOC,cAAc,CAACL,GAAGE,OAAOC,WAAW,EAAE;YAAEG,OAAOR;QAAI;IAC3D;IAEA,OAAOE;AACR;AAIA,OAAO,SAASO,eAAmBZ,CAAM,EAAEC,CAAM,EAAEY,CAAO;IACzD,IAAIC,MAAMC,OAAO,CAACd,IAAI;QACrB,MAAME,MAAMH;QACZ,MAAMgB,QAAQf;QACd,KAAK,MAAM,CAACgB,KAAKf,KAAK,IAAIc,MAAO;YAChCJ,eAAeK,KAAKd,KAAKD;QAC1B;IACD,OAAO;QACN,MAAMe,MAAMjB;QACZ,MAAMG,MAAMF;QACZ,MAAMC,OAAOW;QACbI,IAAIC,QAAQ,GAAGD,IAAIC,QAAQ,IAAI,CAAC;QAChCpB,IAAImB,IAAIC,QAAQ,EAAEf,IAAIA,GAAG,EAAED;IAC5B;AACD;AAEA,OAAO,SAASiB,YAAeF,GAAmC,EAAEd,GAAmB;IACtF,IAAI,CAACc,KAAKC,UAAU,OAAOE;IAC3B,OAAOvB,IAAIoB,IAAIC,QAAQ,EAAEf,IAAIA,GAAG;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/orpc/createOpenApiContractClient.ts"],"sourcesContent":["import { createORPCClient, type ClientContext } from '@orpc/client';\nimport type { LinkFetchClientOptions } from '@orpc/client/fetch';\nimport type { BatchLinkPluginOptions, DedupeRequestsPluginOptions } from '@orpc/client/plugins';\nimport type { StandardLinkPlugin } from '@orpc/client/standard';\nimport type { AnyContractRouter, ContractRouterClient } from '@orpc/contract';\nimport type { JsonifiedClient } from '@orpc/openapi-client';\nimport { OpenAPILink } from '@orpc/openapi-client/fetch';\nimport type { PartialRequired } from '@wener/utils';\nimport { buildBaseUrl } from '../utils/buildBaseUrl';\nimport { resolveLinkPlugins } from './resolveLinkPlugins';\n\nexport function createOpenApiContractClient<TContract extends AnyContractRouter>(\n\tcontract: TContract,\n\toptions: PartialRequired<CreateContractClientOptions, 'url'>,\n): JsonifiedClient<ContractRouterClient<TContract, ClientContext>> {\n\tlet { url, baseUrl, apiKey, getApiKey, getHeaders } = options;\n\tconst baseHeaders = new Headers(options.headers);\n\tif (apiKey) {\n\t\tbaseHeaders.set('Authorization', `Bearer ${apiKey}`);\n\t}\n\turl = buildBaseUrl(url, baseUrl);\n\treturn createORPCClient(\n\t\tnew OpenAPILink(contract, {\n\t\t\turl,\n\t\t\theaders: () => {\n\t\t\t\tlet headers = new Headers(baseHeaders);\n\n\t\t\t\tlet accessToken = getApiKey?.();\n\t\t\t\tif (accessToken) {\n\t\t\t\t\theaders.set('Authorization', `Bearer ${accessToken}`);\n\t\t\t\t}\n\t\t\t\theaders = getHeaders?.(headers) ?? headers;\n\t\t\t\treturn headers;\n\t\t\t},\n\t\t\tplugins: resolveLinkPlugins(options),\n\t\t\tfetch: options.fetch,\n\t\t}),\n\t) as JsonifiedClient<ContractRouterClient<TContract, ClientContext>>;\n}\n\nexport type CreateContractClientOptions = {\n\turl?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\theaders?: Record<string, string> | Headers;\n\tgetApiKey?: () => string | void;\n\tgetHeaders?: (headers: Headers) => Headers | void;\n\tplugins?: StandardLinkPlugin<any>[];\n\tfetch?: LinkFetchClientOptions<any>['fetch'];\n\tbatch?: BatchLinkPluginOptions<any> | boolean;\n\tdedup?: DedupeRequestsPluginOptions<any> | boolean;\n};\n"],"names":["createORPCClient","OpenAPILink","buildBaseUrl","resolveLinkPlugins","createOpenApiContractClient","contract","options","url","baseUrl","apiKey","getApiKey","getHeaders","baseHeaders","Headers","headers","set","accessToken","plugins","fetch"],"mappings":"AAAA,SAASA,gBAAgB,QAA4B,eAAe;AAMpE,SAASC,WAAW,QAAQ,6BAA6B;AAEzD,SAASC,YAAY,QAAQ,wBAAwB;AACrD,SAASC,kBAAkB,QAAQ,uBAAuB;AAE1D,OAAO,SAASC,4BACfC,QAAmB,EACnBC,OAA4D;IAE5D,IAAI,EAAEC,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGL;IACtD,MAAMM,cAAc,IAAIC,QAAQP,QAAQQ,OAAO;IAC/C,IAAIL,QAAQ;QACXG,YAAYG,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAEN,QAAQ;IACpD;IACAF,MAAML,aAAaK,KAAKC;IACxB,OAAOR,iBACN,IAAIC,YAAYI,UAAU;QACzBE;QACAO,SAAS;YACR,IAAIA,UAAU,IAAID,QAAQD;YAE1B,IAAII,cAAcN;YAClB,IAAIM,aAAa;gBAChBF,QAAQC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAEC,aAAa;YACrD;YACAF,UAAUH,aAAaG,YAAYA;YACnC,OAAOA;QACR;QACAG,SAASd,mBAAmBG;QAC5BY,OAAOZ,QAAQY,KAAK;IACrB;AAEF"}
1
+ {"version":3,"sources":["../../src/orpc/createOpenApiContractClient.ts"],"sourcesContent":["import { createORPCClient, type ClientContext } from '@orpc/client';\nimport type { LinkFetchClientOptions } from '@orpc/client/fetch';\nimport type { BatchLinkPluginOptions, DedupeRequestsPluginOptions } from '@orpc/client/plugins';\nimport type { StandardLinkPlugin } from '@orpc/client/standard';\nimport type { AnyContractRouter, ContractRouterClient } from '@orpc/contract';\nimport type { JsonifiedClient } from '@orpc/openapi-client';\nimport { OpenAPILink } from '@orpc/openapi-client/fetch';\nimport type { PartialRequired } from '@wener/utils';\nimport { buildBaseUrl } from '../utils/buildBaseUrl';\nimport { resolveLinkPlugins } from './resolveLinkPlugins';\n\nexport function createOpenApiContractClient<TContract extends AnyContractRouter>(\n\tcontract: TContract,\n\toptions: PartialRequired<CreateContractClientOptions, 'url'>,\n): JsonifiedClient<ContractRouterClient<TContract, ClientContext>> {\n\tlet { url, baseUrl, apiKey, getApiKey, getHeaders } = options;\n\tconst baseHeaders = new Headers(options.headers);\n\tif (apiKey) {\n\t\tbaseHeaders.set('Authorization', `Bearer ${apiKey}`);\n\t}\n\turl = buildBaseUrl(url, baseUrl);\n\treturn createORPCClient(\n\t\tnew OpenAPILink(contract, {\n\t\t\turl,\n\t\t\theaders: () => {\n\t\t\t\tlet headers = new Headers(baseHeaders);\n\n\t\t\t\tlet accessToken = getApiKey?.();\n\t\t\t\tif (accessToken) {\n\t\t\t\t\theaders.set('Authorization', `Bearer ${accessToken}`);\n\t\t\t\t}\n\t\t\t\theaders = getHeaders?.(headers) ?? headers;\n\t\t\t\treturn headers;\n\t\t\t},\n\t\t\tplugins: resolveLinkPlugins(options),\n\t\t\tfetch: options.fetch,\n\t\t}),\n\t) as JsonifiedClient<ContractRouterClient<TContract, ClientContext>>;\n}\n\nexport type CreateContractClientOptions = {\n\turl?: string;\n\tbaseUrl?: string;\n\tapiKey?: string;\n\theaders?: Record<string, string> | Headers;\n\tgetApiKey?: () => string | undefined;\n\tgetHeaders?: (headers: Headers) => Headers | undefined;\n\tplugins?: StandardLinkPlugin<any>[];\n\tfetch?: LinkFetchClientOptions<any>['fetch'];\n\tbatch?: BatchLinkPluginOptions<any> | boolean;\n\tdedup?: DedupeRequestsPluginOptions<any> | boolean;\n};\n"],"names":["createORPCClient","OpenAPILink","buildBaseUrl","resolveLinkPlugins","createOpenApiContractClient","contract","options","url","baseUrl","apiKey","getApiKey","getHeaders","baseHeaders","Headers","headers","set","accessToken","plugins","fetch"],"mappings":"AAAA,SAASA,gBAAgB,QAA4B,eAAe;AAMpE,SAASC,WAAW,QAAQ,6BAA6B;AAEzD,SAASC,YAAY,QAAQ,wBAAwB;AACrD,SAASC,kBAAkB,QAAQ,uBAAuB;AAE1D,OAAO,SAASC,4BACfC,QAAmB,EACnBC,OAA4D;IAE5D,IAAI,EAAEC,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGL;IACtD,MAAMM,cAAc,IAAIC,QAAQP,QAAQQ,OAAO;IAC/C,IAAIL,QAAQ;QACXG,YAAYG,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAEN,QAAQ;IACpD;IACAF,MAAML,aAAaK,KAAKC;IACxB,OAAOR,iBACN,IAAIC,YAAYI,UAAU;QACzBE;QACAO,SAAS;YACR,IAAIA,UAAU,IAAID,QAAQD;YAE1B,IAAII,cAAcN;YAClB,IAAIM,aAAa;gBAChBF,QAAQC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAEC,aAAa;YACrD;YACAF,UAAUH,aAAaG,YAAYA;YACnC,OAAOA;QACR;QACAG,SAASd,mBAAmBG;QAC5BY,OAAOZ,QAAQY,KAAK;IACrB;AAEF"}