UNPKG

25.8 kBSource Map (JSON)View Raw
1{"version":3,"sources":["bundle.ts"],"names":["pipelineP","pipeline","userExec","Bundle","Object","constructor","path","Queue","isOpen","_isOpen","isExcludedFile","name","exclude","excludes","test","openFile","player","movieFile","movieData","fse","readFile","openData","Error","_checkOutput","_closeQueue","clear","_openData","close","_assertIsOpen","_close","withFile","func","withData","call","resourcePath","destination","projector","resourceExists","copyResource","source","options","stat","lstat","isSymbolicLink","copyResourceSymlink","isFile","copyResourceFile","isDirectory","copyResourceDirectory","createResourceDirectory","_expandResourceOptionsCopy","noRecurse","opts","streamResourceFile","createReadStream","createResourceSymlink","readlink","dest","_assertNotResourceExists","merge","ensureDir","atime","mtime","abs","push","_setResourceAttributes","bind","length","createResourceFile","data","Readable","read","target","symlink","createWriteStream","p","pathExists","r","st","atimeCopy","mtimeCopy","executable","executableCopy","_getResourceModeExecutable","mode","chmod","_setResourceModeExecutable","fsLchmodSupported","utimes","fsLutimesSupported","_writeLauncher","run","ignoreDirectory"],"mappings":"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","sourcesContent":["import {\n\tReadable,\n\tpipeline\n} from 'stream';\nimport {\n\tjoin as pathJoin,\n\tdirname,\n\tbasename,\n\tresolve\n} from 'path';\nimport {\n\tpromisify\n} from 'util';\n\nimport fse from 'fs-extra';\nimport {\n\tfsLchmodSupported,\n\tfsLchmod,\n\tfsLutimesSupported,\n\tfsLutimes,\n\tfsWalk,\n\tfsLstatExists\n} from '@shockpkg/archive-files';\n\nimport {once} from './util';\nimport {Queue} from './queue';\nimport {Projector} from './projector';\n\nconst pipelineP = promisify(pipeline);\n\nconst userExec = 0b001000000;\n\n/**\n * Options for adding resources.\n */\nexport interface IBundleResourceOptions {\n\n\t/**\n\t * Access time.\n\t */\n\tatime?: null | Date;\n\n\t/**\n\t * Copy source atime if not set.\n\t */\n\tatimeCopy?: null | boolean;\n\n\t/**\n\t * Modification time.\n\t */\n\tmtime?: null | Date;\n\n\t/**\n\t * Copy source mtime if not set.\n\t */\n\tmtimeCopy?: null | boolean;\n\n\t/**\n\t * Mark files and symlinks as executable.\n\t */\n\texecutable?: null | boolean;\n\n\t/**\n\t * Copy source executable if not set.\n\t */\n\texecutableCopy?: null | boolean;\n\n\t/**\n\t * Optionally merge directory contents.\n\t */\n\tmerge?: null | boolean;\n\n\t/**\n\t * Skip recursive directory copy.\n\t */\n\tnoRecurse?: null | boolean;\n}\n\n/**\n * Bundle constructor.\n *\n * @param path Output path for the main executable.\n */\nexport abstract class Bundle extends Object {\n\t/**\n\t * File and directory names to exclude when adding a directory.\n\t */\n\tpublic excludes = [\n\t\t/^\\./,\n\t\t/^ehthumbs\\.db$/,\n\t\t/^Thumbs\\.db$/\n\t];\n\n\t/**\n\t * Bundle main executable path.\n\t */\n\tpublic readonly path: string;\n\n\t/**\n\t * Projector instance.\n\t */\n\tpublic abstract readonly projector: Projector;\n\n\t/**\n\t * Open flag.\n\t */\n\tprotected _isOpen = false;\n\n\t/**\n\t * Close callbacks priority queue.\n\t */\n\tprotected _closeQueue = new Queue();\n\n\tconstructor(path: string) {\n\t\tsuper();\n\n\t\tthis.path = path;\n\t}\n\n\t/**\n\t * Check if output open.\n\t *\n\t * @returns Returns true if open, else false.\n\t */\n\tpublic get isOpen() {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Check if name is excluded file.\n\t *\n\t * @param name File name.\n\t * @returns Returns true if excluded, else false.\n\t */\n\tpublic isExcludedFile(name: string) {\n\t\tfor (const exclude of this.excludes) {\n\t\t\tif (exclude.test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Open output with file.\n\t *\n\t * @param player Player path.\n\t * @param movieFile Movie file.\n\t */\n\tpublic async openFile(player: string, movieFile: string | null) {\n\t\tconst movieData = movieFile ? await fse.readFile(movieFile) : null;\n\t\tawait this.openData(player, movieData);\n\t}\n\n\t/**\n\t * Open output with data.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t */\n\tpublic async openData(player: string, movieData: Readonly<Buffer> | null) {\n\t\tif (this._isOpen) {\n\t\t\tthrow new Error('Already open');\n\t\t}\n\t\tawait this._checkOutput();\n\n\t\tthis._closeQueue.clear();\n\t\tawait this._openData(player, movieData);\n\n\t\tthis._isOpen = true;\n\t}\n\n\t/**\n\t * Close output.\n\t */\n\tpublic async close() {\n\t\tthis._assertIsOpen();\n\n\t\ttry {\n\t\t\tawait this._close();\n\t\t}\n\t\tfinally {\n\t\t\tthis._closeQueue.clear();\n\t\t}\n\n\t\tthis._isOpen = false;\n\t}\n\n\t/**\n\t * Write out projector with player and file.\n\t * Has a callback to write out the resources.\n\t *\n\t * @param player Player path.\n\t * @param movieFile Movie file.\n\t * @param func Async function.\n\t * @returns Return value of the async function.\n\t */\n\tpublic async withFile<T>(\n\t\tplayer: string,\n\t\tmovieFile: string | null,\n\t\tfunc: ((self: this) => Promise<T>) | null = null\n\t) {\n\t\tconst movieData = movieFile ? await fse.readFile(movieFile) : null;\n\t\treturn this.withData(player, movieData, func);\n\t}\n\n\t/**\n\t * Write out projector with player and data.\n\t * Has a callback to write out the resources.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t * @param func Async function.\n\t * @returns Return value of the async function.\n\t */\n\tpublic async withData<T>(\n\t\tplayer: string,\n\t\tmovieData: Readonly<Buffer> | null,\n\t\tfunc: ((self: this) => Promise<T>) | null = null\n\t) {\n\t\tawait this.openData(player, movieData);\n\t\ttry {\n\t\t\treturn func ? await func.call(this, this) : null;\n\t\t}\n\t\tfinally {\n\t\t\tawait this.close();\n\t\t}\n\t}\n\n\t/**\n\t * Get path for resource.\n\t *\n\t * @param destination Resource destination.\n\t * @returns Destination path.\n\t */\n\tpublic resourcePath(destination: string) {\n\t\treturn pathJoin(dirname(this.projector.path), destination);\n\t}\n\n\t/**\n\t * Check if path for resource exists.\n\t *\n\t * @param destination Resource destination.\n\t * @returns True if destination exists, else false.\n\t */\n\tpublic async resourceExists(destination: string) {\n\t\treturn !!fsLstatExists(this.resourcePath(destination));\n\t}\n\n\t/**\n\t * Copy resource, detecting source type automatically.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source directory.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResource(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst stat = await fse.lstat(source);\n\t\tswitch (true) {\n\t\t\tcase stat.isSymbolicLink(): {\n\t\t\t\tawait this.copyResourceSymlink(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase stat.isFile(): {\n\t\t\t\tawait this.copyResourceFile(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase stat.isDirectory(): {\n\t\t\t\tawait this.copyResourceDirectory(destination, source, options);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Unsupported resource type: ${source}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Copy directory as resource, recursive copy.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source directory.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceDirectory(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\t// Create directory.\n\t\tawait this.createResourceDirectory(\n\t\t\tdestination,\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.stat(source)\n\t\t\t) : options\n\t\t);\n\n\t\t// If not recursive do not walk contents.\n\t\tif (options && options.noRecurse) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Any directories we add should not be recursive.\n\t\tconst opts = {\n\t\t\t...(options || {}),\n\t\t\tnoRecurse: true\n\t\t};\n\t\tawait fsWalk(source, async (path, stat) => {\n\t\t\t// If this name is excluded, skip without descending.\n\t\t\tif (this.isExcludedFile(basename(path))) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tawait this.copyResource(\n\t\t\t\tpathJoin(destination, path),\n\t\t\t\tpathJoin(source, path),\n\t\t\t\topts\n\t\t\t);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Copy file as resource.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source file.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceFile(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.streamResourceFile(\n\t\t\tdestination,\n\t\t\tfse.createReadStream(source),\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.stat(source)\n\t\t\t) : options\n\t\t);\n\t}\n\n\t/**\n\t * Copy symlink as resource.\n\t *\n\t * @param destination Resource destination.\n\t * @param source Source symlink.\n\t * @param options Resource options.\n\t */\n\tpublic async copyResourceSymlink(\n\t\tdestination: string,\n\t\tsource: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.createResourceSymlink(\n\t\t\tdestination,\n\t\t\tawait fse.readlink(source),\n\t\t\toptions ? await this._expandResourceOptionsCopy(\n\t\t\t\toptions,\n\t\t\t\tasync () => fse.lstat(source)\n\t\t\t) : options\n\t\t);\n\t}\n\n\t/**\n\t * Create a resource directory.\n\t *\n\t * @param destination Resource destination.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceDirectory(\n\t\tdestination: string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(\n\t\t\tdestination,\n\t\t\t!!(options && options.merge)\n\t\t);\n\t\tawait fse.ensureDir(dest);\n\n\t\t// If either is set, queue up change times when closing.\n\t\tif (options && (options.atime || options.mtime)) {\n\t\t\t// Get absolute path, use length for the priority.\n\t\t\t// Also copy the options object which the owner could change.\n\t\t\tconst abs = resolve(dest);\n\t\t\tthis._closeQueue.push(\n\t\t\t\tthis._setResourceAttributes.bind(this, abs, {...options}),\n\t\t\t\tabs.length\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a resource file.\n\t *\n\t * @param destination Resource destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceFile(\n\t\tdestination: string,\n\t\tdata: Readonly<Buffer> | string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tawait this.streamResourceFile(destination, new Readable({\n\t\t\tread() {\n\t\t\t\tthis.push(data);\n\t\t\t\tthis.push(null);\n\t\t\t}\n\t\t}), options);\n\t}\n\n\t/**\n\t * Create a resource symlink.\n\t *\n\t * @param destination Resource destination.\n\t * @param target Symlink target.\n\t * @param options Resource options.\n\t */\n\tpublic async createResourceSymlink(\n\t\tdestination: string,\n\t\ttarget: Readonly<Buffer> | string,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(destination);\n\t\tawait fse.ensureDir(dirname(dest));\n\t\tawait fse.symlink(target as (string | Buffer), dest);\n\n\t\tif (options) {\n\t\t\tawait this._setResourceAttributes(dest, options);\n\t\t}\n\t}\n\n\t/**\n\t * Stream readable source to resource file.\n\t *\n\t * @param destination Resource destination.\n\t * @param data Resource stream.\n\t * @param options Resource options.\n\t */\n\tpublic async streamResourceFile(\n\t\tdestination: string,\n\t\tdata: Readable,\n\t\toptions: Readonly<IBundleResourceOptions> | null = null\n\t) {\n\t\tthis._assertIsOpen();\n\n\t\tconst dest = await this._assertNotResourceExists(destination);\n\t\tawait fse.ensureDir(dirname(dest));\n\t\tawait pipelineP(data, fse.createWriteStream(dest));\n\n\t\tif (options) {\n\t\t\tawait this._setResourceAttributes(dest, options);\n\t\t}\n\t}\n\n\t/**\n\t * Check that output path is valid, else throws.\n\t */\n\tprotected async _checkOutput() {\n\t\tfor (const p of [this.path, this.resourcePath('')]) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tif (await fse.pathExists(p)) {\n\t\t\t\tthrow new Error(`Output path already exists: ${p}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Expand resource options copy properties with stat object from source.\n\t *\n\t * @param options Options object.\n\t * @param stat Stat function.\n\t * @returns Options copy with any values populated.\n\t */\n\tprotected async _expandResourceOptionsCopy(\n\t\toptions: Readonly<IBundleResourceOptions>,\n\t\tstat: (() => Promise<{\n\t\t\tatime: Date;\n\t\t\tmtime: Date;\n\t\t\tmode: number;\n\t\t}>)\n\t) {\n\t\tconst r = {...options} as IBundleResourceOptions;\n\t\tconst st = once(stat);\n\t\tif (!r.atime && r.atimeCopy) {\n\t\t\tr.atime = (await st()).atime;\n\t\t}\n\t\tif (!r.mtime && r.mtimeCopy) {\n\t\t\tr.mtime = (await st()).mtime;\n\t\t}\n\t\tif (typeof r.executable !== 'boolean' && r.executableCopy) {\n\t\t\tr.executable = this._getResourceModeExecutable((await st()).mode);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Set resource attributes from options object.\n\t *\n\t * @param path File path.\n\t * @param options Options object.\n\t */\n\tprotected async _setResourceAttributes(\n\t\tpath: string,\n\t\toptions: Readonly<IBundleResourceOptions>\n\t) {\n\t\tconst {atime, mtime, executable} = options;\n\t\tconst st = await fse.lstat(path);\n\n\t\t// Maybe set executable if not a directory and supported.\n\t\tif (typeof executable === 'boolean' && !st.isDirectory()) {\n\t\t\tif (!st.isSymbolicLink()) {\n\t\t\t\tawait fse.chmod(path, this._setResourceModeExecutable(\n\t\t\t\t\tst.mode,\n\t\t\t\t\texecutable\n\t\t\t\t));\n\t\t\t}\n\t\t\telse if (fsLchmodSupported) {\n\t\t\t\tawait fsLchmod(path, this._setResourceModeExecutable(\n\t\t\t\t\t// Workaround for a legacy Node issue.\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\tst.mode & 0b111111111,\n\t\t\t\t\texecutable\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\n\t\t// Maybe change times if either is set and supported.\n\t\tif (atime || mtime) {\n\t\t\tif (!st.isSymbolicLink()) {\n\t\t\t\tawait fse.utimes(path, atime || st.atime, mtime || st.mtime);\n\t\t\t}\n\t\t\telse if (fsLutimesSupported) {\n\t\t\t\tawait fsLutimes(path, atime || st.atime, mtime || st.mtime);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get file mode executable.\n\t *\n\t * @param mode Current mode.\n\t * @returns Is executable.\n\t */\n\tprotected _getResourceModeExecutable(mode: number) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\treturn !!(mode & userExec);\n\t}\n\n\t/**\n\t * Set file mode executable.\n\t *\n\t * @param mode Current mode.\n\t * @param executable Is executable.\n\t * @returns File mode.\n\t */\n\tprotected _setResourceModeExecutable(mode: number, executable: boolean) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\treturn (executable ? (mode | userExec) : (mode & ~userExec)) >>> 0;\n\t}\n\n\t/**\n\t * Open output with data.\n\t *\n\t * @param player Player path.\n\t * @param movieData Movie data.\n\t */\n\tprotected async _openData(\n\t\tplayer: string,\n\t\tmovieData: Readonly<Buffer> | null\n\t) {\n\t\tawait this.projector.withData(player, movieData);\n\t}\n\n\t/**\n\t * Close output.\n\t */\n\tprotected async _close() {\n\t\tawait this._writeLauncher();\n\t\tawait this._closeQueue.run();\n\t}\n\n\t/**\n\t * Assert bundle is open.\n\t */\n\tprotected _assertIsOpen() {\n\t\tif (!this._isOpen) {\n\t\t\tthrow new Error('Not open');\n\t\t}\n\t}\n\n\t/**\n\t * Assert resource does not exist, returning destination path.\n\t *\n\t * @param destination Resource destination.\n\t * @param ignoreDirectory Ignore directories.\n\t * @returns Destination path.\n\t */\n\tprotected async _assertNotResourceExists(\n\t\tdestination: string,\n\t\tignoreDirectory = false\n\t) {\n\t\tconst dest = this.resourcePath(destination);\n\t\tconst st = await fsLstatExists(dest);\n\t\tif (st && (!ignoreDirectory || !st.isDirectory())) {\n\t\t\tthrow new Error(`Resource path exists: ${dest}`);\n\t\t}\n\t\treturn dest;\n\t}\n\n\t/**\n\t * Main application file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get extension(): string;\n\n\t/**\n\t * Create projector instance for the bundle.\n\t *\n\t * @returns Projector instance.\n\t */\n\tprotected abstract _createProjector(): Projector;\n\n\t/**\n\t * Write the launcher file.\n\t */\n\tprotected abstract _writeLauncher(): Promise<void>;\n}\n"],"file":"bundle.js","sourceRoot":"../src"}
\No newline at end of file