{"version":3,"sources":["../src/inputFile.ts"],"names":[],"mappings":"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","file":"inputFile.mjs","sourcesContent":["import { File } from 'undici';\n\ntype FsPromises = {\n    stat: (path: string) => Promise<{ size: number }>;\n    open: (\n        path: string,\n        flags: string,\n    ) => Promise<{\n        read: (\n            buffer: Uint8Array,\n            offset: number,\n            length: number,\n            position: number,\n        ) => Promise<{ bytesRead: number }>;\n        close: () => Promise<void>;\n    }>;\n    readFile: (path: string) => Promise<Uint8Array>;\n};\n\nfunction isEdgeRuntime(): boolean {\n    return (\n        typeof globalThis !== 'undefined' &&\n        typeof (globalThis as { EdgeRuntime?: unknown }).EdgeRuntime !==\n            'undefined'\n    );\n}\n\nfunction assertFileSystemAvailable(): void {\n    if (isEdgeRuntime()) {\n        throw new Error(\n            'File system operations are not supported in edge runtimes. Please use InputFile.fromBuffer instead.',\n        );\n    }\n}\n\nasync function getFs(): Promise<FsPromises> {\n    assertFileSystemAvailable();\n\n    try {\n        const fs = await import('fs');\n        return fs.promises;\n    } catch {\n        throw new Error(\n            'File system operations are not available in this runtime. Please use InputFile.fromBuffer instead.',\n        );\n    }\n}\n\nfunction getFilename(path: string): string {\n    const segments = path.replace(/\\\\/g, '/').split('/').filter(Boolean);\n    return segments.pop() ?? 'file';\n}\n\ntype BlobLike = {\n    size: number;\n    slice: (start: number, end: number) => BlobLike;\n    arrayBuffer: () => Promise<ArrayBuffer>;\n};\n\ntype InputFileSource =\n    | { type: 'path'; path: string }\n    | { type: 'buffer'; data: Uint8Array }\n    | { type: 'blob'; data: BlobLike };\n\nexport class InputFile {\n    private source: InputFileSource;\n    filename: string;\n\n    private constructor(source: InputFileSource, filename: string) {\n        this.source = source;\n        this.filename = filename;\n    }\n\n    static fromBuffer(\n        parts: BlobLike | Uint8Array | ArrayBuffer | string,\n        name: string,\n    ): InputFile {\n        if (\n            parts &&\n            !ArrayBuffer.isView(parts) &&\n            typeof (parts as BlobLike).arrayBuffer === 'function'\n        ) {\n            return new InputFile(\n                { type: 'blob', data: parts as BlobLike },\n                name,\n            );\n        }\n\n        if (typeof parts === 'string') {\n            return new InputFile(\n                { type: 'buffer', data: new TextEncoder().encode(parts) },\n                name,\n            );\n        }\n\n        if (parts instanceof ArrayBuffer) {\n            return new InputFile(\n                { type: 'buffer', data: new Uint8Array(parts) },\n                name,\n            );\n        }\n\n        if (ArrayBuffer.isView(parts)) {\n            return new InputFile(\n                {\n                    type: 'buffer',\n                    data: new Uint8Array(\n                        parts.buffer,\n                        parts.byteOffset,\n                        parts.byteLength,\n                    ),\n                },\n                name,\n            );\n        }\n\n        throw new Error('Unsupported input type for InputFile.fromBuffer');\n    }\n\n    static fromPath(path: string, name?: string): InputFile {\n        assertFileSystemAvailable();\n        return new InputFile({ type: 'path', path }, name ?? getFilename(path));\n    }\n\n    static fromPlainText(content: string, name: string): InputFile {\n        return new InputFile(\n            { type: 'buffer', data: new TextEncoder().encode(content) },\n            name,\n        );\n    }\n\n    async size(): Promise<number> {\n        switch (this.source.type) {\n            case 'path': {\n                const fs = await getFs();\n                return (await fs.stat(this.source.path)).size;\n            }\n            case 'buffer':\n                return this.source.data.length;\n            case 'blob':\n                return this.source.data.size;\n        }\n    }\n\n    async slice(start: number, end: number): Promise<Uint8Array> {\n        const length = end - start;\n\n        switch (this.source.type) {\n            case 'path': {\n                const fs = await getFs();\n                const handle = await fs.open(this.source.path, 'r');\n                try {\n                    const buffer = new Uint8Array(length);\n                    const result = await handle.read(buffer, 0, length, start);\n                    return result.bytesRead === buffer.length\n                        ? buffer\n                        : buffer.subarray(0, result.bytesRead);\n                } finally {\n                    await handle.close();\n                }\n            }\n            case 'buffer':\n                return this.source.data.subarray(start, end);\n            case 'blob': {\n                const arrayBuffer = await this.source.data\n                    .slice(start, end)\n                    .arrayBuffer();\n                return new Uint8Array(arrayBuffer);\n            }\n        }\n    }\n\n    async toFile(): Promise<File> {\n        const data = await this.toUint8Array();\n        return new File([data], this.filename);\n    }\n\n    private async toUint8Array(): Promise<Uint8Array> {\n        switch (this.source.type) {\n            case 'path': {\n                const fs = await getFs();\n                return await fs.readFile(this.source.path);\n            }\n            case 'buffer':\n                return this.source.data;\n            case 'blob':\n                return new Uint8Array(await this.source.data.arrayBuffer());\n        }\n    }\n}\n"]}