{"version":3,"sources":["../build/index.ts","../build/asset.ts","../build/_assets.ts"],"sourcesContent":["import { SampleFileAsset } from './asset';\nimport { assets } from './_assets'\n\nexport const sampleFiles = Object.assign(assets, {\n    /** Filter assets by the specified search */\n    filter: SampleFileAsset.filter,\n});\n\n// sampleFiles.filter({ type: 'video' })\n// sampleFiles.filter(o => o.bytes > 1000);\n// sampleFiles.filter({ name: 'bbb_short', extension: 'mp4' }).pop()\n","import { createWriteStream } from 'fs';\nimport { access, mkdir, readFile, stat, unlink, writeFile } from 'fs/promises';\nimport { pipeline } from 'stream/promises';\nimport { get, request } from 'https';\nimport { fileURLToPath } from 'url';\nimport { dirname, resolve } from 'path';\nimport type { SampleInfos } from './_infos';\n\n\nconst ___filename = import.meta.url ? fileURLToPath(import.meta.url) : __filename;\nconst __dirname = dirname(___filename);\n\n\nconst allAssets: SampleFileAsset<SampleInfos>[] = [];\n\nexport type AssetInfo = {\n    readonly mime: string;\n    readonly name: string;\n    readonly type: string;\n    readonly bytes: number;\n    readonly extension: string;\n    readonly cdn: string;\n}\n\nexport class SampleFileAsset<const I extends AssetInfo> {\n    /** The MIME type of the file */\n    readonly mime: I['mime'];\n    /** The name of the file (without its extension) */\n    readonly name: I['name'];\n    /** The type of media (image, video, etc) */\n    readonly type: I['type'];\n    /** Filesize */\n    readonly bytes: I['bytes'];\n    /** File extension */\n    readonly extension: I['extension'];\n    /** Github Raw link (used to download the file) */\n    readonly cdn: I['cdn'];\n\n    constructor(info: I) {\n        Object.assign(this, info);\n        // @ts-ignore\n        allAssets.push(this);\n    }\n\n\n    /** Retrieves the absolute path to the assets' parent directory */\n    get __dirname() {\n        return resolve(__dirname + `/../local-assets/${this.type}/${this.extension}`);\n    }\n\n    /** Retrieves the absolute path to the asset\n     * **WARNING**: The file will not be present if not yet downloaded. Utilize `path` instead of `__path`\n     */\n    get __path() {\n        return `${this.__dirname}/${this.name}.${this.extension}`;\n    }\n\n    /** Checks if the file is downloaded */\n    async isDownloaded() {\n        const __path = this.__path;\n        if (await access(__path, 0).then(o => true).catch(o => false)) {\n            const stats = await stat(__path);\n            if (stats.size == this.bytes) {\n                return true;\n            } else {\n                await unlink(__path);\n            }\n        }\n        \n        return false;\n    }\n\n    /** Downloads the file from the CDN\n     * - Returns the path to the file\n     */\n    async download() {\n        const __path = this.__path;\n        if (await this.isDownloaded()) {\n            return __path;\n        }\n        await mkdir(this.__dirname, { recursive: true });\n        const output = createWriteStream(__path);\n        const label = `- Downloading Sample File (${this.cdn})`;\n        console.time(label);\n        await new Promise(async resolve => {\n            const url = new URL(this.cdn);\n            const req = get({\n                port: 443,\n                host: url.hostname,\n                path: url.pathname,\n                rejectUnauthorized: false,\n                headers: {\n                    'Accept': '*/*',\n                    'Range': `bytes=0-`,\n                }\n            }, async res => {\n                res.pipe(output);\n                res.on('end', () => {\n                    resolve(true);\n                })\n            })\n            req.on('error', o => console.log(o));\n            req.end();\n        })\n        output.close();\n        if (await this.isDownloaded()) {\n            console.timeEnd(label);\n            return __path\n        }\n        throw new Error(`Failed to download asset from \"${this.cdn}\"`)\n    }\n\n    /** Retrieves the path to the file\n     * - Automatically downloads the file if it is not yet downloaded\n     */\n    get path() {\n        return new Promise<string>(async (resolve, reject) => {\n            resolve(await this.download())\n        })\n    }\n\n    static filter(info?: ((asset: SampleFileAsset<SampleInfos>) => boolean) | Partial<SampleInfos>) {\n        if (!info) {\n            return [...allAssets]\n        }\n        return allAssets.filter(typeof info === 'function' ? info : o => {\n            for (const key in info) {\n                if (o[key] !== info[key]) {\n                    return false\n                }\n            }\n            return true\n        })\n    }\n\n}\n\n","\nimport { SampleFileAsset } from './asset'\n\nexport const assets = {\n    \"video\": {\n        \"mp4\": {\n            \"bbb_short\": new SampleFileAsset({\"mime\":\"video/mp4\",\"name\":\"bbb_short\",\"type\":\"video\",\"bytes\":788493,\"extension\":\"mp4\",\"cdn\":\"https://raw.githubusercontent.com/cseitz/sample-files/main/assets/video/mp4/bbb_short.mp4\"})\n        }\n    }\n} as const;"],"mappings":"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","names":["resolve"]}