@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.
- package/lib/ai/qwen3vl/utils.js.map +1 -1
- package/lib/cn/ChineseResidentIdNo.js +1 -1
- package/lib/cn/ChineseResidentIdNo.js.map +1 -1
- package/lib/cn/Mod11.js +1 -1
- package/lib/cn/Mod11.js.map +1 -1
- package/lib/consola/formatLogObject.js +5 -5
- package/lib/consola/formatLogObject.js.map +1 -1
- package/lib/data/maybeNumber.js +1 -1
- package/lib/data/maybeNumber.js.map +1 -1
- package/lib/data/types.d.js.map +1 -1
- package/lib/dayjs/formatDuration.js.map +1 -1
- package/lib/dayjs/resolveRelativeTime.js +9 -80
- package/lib/dayjs/resolveRelativeTime.js.map +1 -1
- package/lib/drain3/Drain.js +356 -0
- package/lib/drain3/Drain.js.map +1 -0
- package/lib/drain3/LogCluster.js +38 -0
- package/lib/drain3/LogCluster.js.map +1 -0
- package/lib/drain3/Node.js +39 -0
- package/lib/drain3/Node.js.map +1 -0
- package/lib/drain3/TemplateMiner.js +204 -0
- package/lib/drain3/TemplateMiner.js.map +1 -0
- package/lib/drain3/index.js +31 -0
- package/lib/drain3/index.js.map +1 -0
- package/lib/drain3/persistence/FilePersistence.js +24 -0
- package/lib/drain3/persistence/FilePersistence.js.map +1 -0
- package/lib/drain3/persistence/MemoryPersistence.js +18 -0
- package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
- package/lib/drain3/persistence/PersistenceHandler.js +5 -0
- package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
- package/lib/drain3/types.js +7 -0
- package/lib/drain3/types.js.map +1 -0
- package/lib/fs/IFileSystem.d.js.map +1 -1
- package/lib/fs/createBrowserFileSystem.js +4 -2
- package/lib/fs/createBrowserFileSystem.js.map +1 -1
- package/lib/fs/createMemoryFileSystem.js +7 -6
- package/lib/fs/createMemoryFileSystem.js.map +1 -1
- package/lib/fs/createSandboxFileSystem.js.map +1 -1
- package/lib/fs/createWebDavFileSystem.js +22 -5
- package/lib/fs/createWebDavFileSystem.js.map +1 -1
- package/lib/fs/createWebFileSystem.js +225 -0
- package/lib/fs/createWebFileSystem.js.map +1 -0
- package/lib/fs/findMimeType.js +1 -1
- package/lib/fs/findMimeType.js.map +1 -1
- package/lib/fs/index.js +1 -1
- package/lib/fs/index.js.map +1 -1
- package/lib/fs/minio/createMinioFileSystem.js +974 -0
- package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
- package/lib/fs/minio/index.js +2 -0
- package/lib/fs/minio/index.js.map +1 -0
- package/lib/fs/orpc/createContractClientFileSystem.js +3 -3
- package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -1
- package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -1
- package/lib/fs/s3/createS3MiniFileSystem.js +116 -68
- package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -1
- package/lib/fs/server/createDatabaseFileSystem.js +7 -7
- package/lib/fs/server/createDatabaseFileSystem.js.map +1 -1
- package/lib/fs/server/createNodeFileSystem.js +30 -5
- package/lib/fs/server/createNodeFileSystem.js.map +1 -1
- package/lib/fs/tests/runFileSystemTest.js +27 -26
- package/lib/fs/tests/runFileSystemTest.js.map +1 -1
- package/lib/fs/utils.js.map +1 -1
- package/lib/fs/webdav/index.js +2 -0
- package/lib/fs/webdav/index.js.map +1 -0
- package/lib/jsonschema/JsonSchema.js +5 -5
- package/lib/jsonschema/JsonSchema.js.map +1 -1
- package/lib/jsonschema/forEachJsonSchema.js +1 -1
- package/lib/jsonschema/forEachJsonSchema.js.map +1 -1
- package/lib/jsonschema/types.d.js.map +1 -1
- package/lib/meta/defineMetadata.js.map +1 -1
- package/lib/orpc/createOpenApiContractClient.js.map +1 -1
- package/lib/password/PHC.js +2 -2
- package/lib/password/PHC.js.map +1 -1
- package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
- package/lib/password/createBase64PasswordAlgorithm.js +1 -1
- package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
- package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
- package/lib/password/createPBKDF2PasswordAlgorithm.js +1 -1
- package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
- package/lib/password/createScryptPasswordAlgorithm.js +3 -3
- package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
- package/lib/resource/ListQuery.js.map +1 -1
- package/lib/resource/index.js.map +1 -1
- package/lib/s3/formatS3Url.js +2 -2
- package/lib/s3/formatS3Url.js.map +1 -1
- package/lib/s3/parseS3Url.js +1 -1
- package/lib/s3/parseS3Url.js.map +1 -1
- package/lib/schema/SchemaRegistry.js.map +1 -1
- package/lib/schema/TypeSchema.d.js.map +1 -1
- package/lib/schema/createSchemaData.js +4 -4
- package/lib/schema/createSchemaData.js.map +1 -1
- package/lib/schema/findJsonSchemaByPath.js.map +1 -1
- package/lib/schema/formatZodError.js +42 -44
- package/lib/schema/formatZodError.js.map +1 -1
- package/lib/schema/toJsonSchema.js +4 -4
- package/lib/schema/toJsonSchema.js.map +1 -1
- package/lib/schema/validate.js +1 -1
- package/lib/schema/validate.js.map +1 -1
- package/lib/utils/buildRedactorFormSchema.js +1 -1
- package/lib/utils/buildRedactorFormSchema.js.map +1 -1
- package/package.json +32 -13
- package/src/ai/qwen3vl/utils.ts +1 -1
- package/src/cn/ChineseResidentIdNo.ts +1 -1
- package/src/cn/Mod11.ts +1 -1
- package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
- package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +0 -23
- package/src/cn/parseChineseNumber.test.ts +4 -4
- package/src/consola/formatLogObject.ts +6 -6
- package/src/data/maybeNumber.ts +1 -1
- package/src/data/parseSort.test.ts +0 -1
- package/src/data/types.d.ts +2 -2
- package/src/dayjs/formatDuration.ts +2 -2
- package/src/dayjs/resolveRelativeTime.ts +11 -14
- package/src/drain3/Drain.test.ts +378 -0
- package/src/drain3/Drain.ts +394 -0
- package/src/drain3/LogCluster.ts +46 -0
- package/src/drain3/Node.ts +53 -0
- package/src/drain3/TemplateMiner.ts +246 -0
- package/src/drain3/index.ts +36 -0
- package/src/drain3/persistence/FilePersistence.ts +24 -0
- package/src/drain3/persistence/MemoryPersistence.ts +23 -0
- package/src/drain3/persistence/PersistenceHandler.ts +19 -0
- package/src/drain3/types.ts +75 -0
- package/src/fs/IFileSystem.d.ts +1 -2
- package/src/fs/createBrowserFileSystem.ts +7 -5
- package/src/fs/createMemoryFileSystem.ts +9 -13
- package/src/fs/createSandboxFileSystem.ts +1 -1
- package/src/fs/createWebDavFileSystem.ts +28 -10
- package/src/fs/createWebFileSystem.ts +242 -0
- package/src/fs/findMimeType.ts +1 -4
- package/src/fs/index.ts +1 -1
- package/src/fs/minio/createMinioFileSystem.ts +1148 -0
- package/src/fs/minio/index.ts +1 -0
- package/src/fs/orpc/createContractClientFileSystem.ts +5 -5
- package/src/fs/orpc/server/createFileSystemContractImpl.ts +1 -1
- package/src/fs/s3/createS3MiniFileSystem.ts +119 -78
- package/src/fs/s3/s3fs.test.ts +441 -0
- package/src/fs/s3/s3mini.test.ts +2 -2
- package/src/fs/server/createDatabaseFileSystem.ts +7 -7
- package/src/fs/server/createNodeFileSystem.ts +32 -13
- package/src/fs/server/dbfs.test.ts +2 -1
- package/src/fs/tests/runFileSystemTest.ts +29 -28
- package/src/fs/utils.ts +1 -1
- package/src/fs/webdav/index.ts +1 -0
- package/src/jsonschema/JsonSchema.ts +5 -5
- package/src/jsonschema/forEachJsonSchema.ts +1 -1
- package/src/jsonschema/types.d.ts +1 -1
- package/src/meta/defineMetadata.ts +1 -1
- package/src/orpc/createOpenApiContractClient.ts +2 -2
- package/src/password/PHC.ts +3 -3
- package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
- package/src/password/createBase64PasswordAlgorithm.ts +2 -2
- package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
- package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
- package/src/password/createScryptPasswordAlgorithm.ts +4 -4
- package/src/resource/ListQuery.ts +4 -1
- package/src/resource/index.ts +2 -2
- package/src/s3/formatS3Url.test.ts +1 -1
- package/src/s3/formatS3Url.ts +2 -2
- package/src/s3/parseS3Url.ts +1 -1
- package/src/schema/SchemaRegistry.ts +1 -1
- package/src/schema/TypeSchema.d.ts +6 -6
- package/src/schema/createSchemaData.ts +4 -4
- package/src/schema/findJsonSchemaByPath.ts +4 -4
- package/src/schema/formatZodError.test.ts +2 -1
- package/src/schema/formatZodError.ts +50 -62
- package/src/schema/toJsonSchema.ts +6 -6
- package/src/schema/validate.ts +1 -1
- 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
|
-
|
|
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
|
|
88
|
-
expect(
|
|
88
|
+
const readStreamObj = serverFs.createReadStream("/stream.txt");
|
|
89
|
+
expect(readStreamObj).toBeDefined();
|
|
89
90
|
const chunks = [];
|
|
90
|
-
for await (const chunk of
|
|
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 =
|
|
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
|
|
108
|
+
if (writeStream && "createWriteStream" in fs) {
|
|
108
109
|
// Test createWriteStream
|
|
109
|
-
const
|
|
110
|
-
expect(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
await new Promise((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
|
|
123
|
-
expect(
|
|
124
|
-
const reader =
|
|
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
|
|
131
|
-
expect(
|
|
132
|
-
const writer =
|
|
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
|
|
141
|
+
if (abort && readStream && "createReadStream" in fs) {
|
|
141
142
|
const controller2 = new AbortController();
|
|
142
143
|
// Test read stream with abort
|
|
143
|
-
const
|
|
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
|
-
|
|
149
|
+
readStreamObj.on("error", reject);
|
|
149
150
|
})).rejects.toThrow(Error);
|
|
150
151
|
}
|
|
151
|
-
if (abort && writeStream && fs
|
|
152
|
+
if (abort && writeStream && "createWriteStream" in fs) {
|
|
152
153
|
// Test write stream with abort
|
|
153
154
|
const controller3 = new AbortController();
|
|
154
|
-
const
|
|
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
|
-
|
|
160
|
-
|
|
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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"}
|
package/lib/fs/utils.js.map
CHANGED
|
@@ -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 @@
|
|
|
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 = (
|
|
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
|
-
}, (
|
|
116
|
+
}, (_schema)=>'').with({
|
|
117
117
|
type: P.union('number', 'integer')
|
|
118
|
-
}, (
|
|
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
|
-
}, (
|
|
150
|
+
}, (_schema)=>false).with({
|
|
151
151
|
type: 'array'
|
|
152
|
-
}, (
|
|
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 = (
|
|
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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"}
|
|
@@ -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\
|
|
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,
|
|
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<
|
|
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 |
|
|
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"}
|