UNPKG

@shockpkg/dir-projector

Version:

Package for creating Shockwave Director projectors

1 lines 23.3 kB
{"version":3,"sources":["projector.ts"],"names":["join","pathJoin","ArchiveDir","ArchiveHdi","createArchiveByFileExtension","fse","defaultFalse","defaultNull","pathRelativeBase","trimExtension","Projector","Object","constructor","options","skeleton","movieFile","movieData","movieName","shockwave","configFile","configData","lingoFile","lingoData","splashImageFile","splashImageData","includeXtras","nestXtrasConfiguration","pathToHdiutil","configExtension","configEncoding","lingoName","lingoEncoding","xtrasDirectoryName","configurationDirectoryName","getMovieData","_dataFromBufferOrFile","getConfigData","_dataFromValueOrFile","configNewline","getLingoData","lingoNewline","getSplashImageData","getProjectorNameNoExtension","name","projectorExtension","getXtrasPath","cdn","getConfigPath","n","getSplashImagePath","splashImageExtension","getSkeletonArchive","Error","stat","isDirectory","isFile","r","mounterMac","hdiutil","nobrowse","getIncludeXtrasMappings","src","keys","dest","push","findIncludeXtrasMappingsBestMatch","mappings","path","best","bestScore","map","relative","length","includeXtrasMappingsDest","base","write","_writeSkeleton","_writeMovie","_writeConfig","_writeSplashImage","_writeLingo","data","writeFile","_maybeWriteFile","file","readFile","newline","encoding","str","Array","isArray","Buffer","from"],"mappings":"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","sourcesContent":["import {\n\tjoin as pathJoin\n} from 'path';\n\nimport {\n\tArchive,\n\tArchiveDir,\n\tArchiveHdi,\n\tcreateArchiveByFileExtension\n} from '@shockpkg/archive-files';\nimport fse from 'fs-extra';\n\nimport {\n\tdefaultFalse,\n\tdefaultNull,\n\tpathRelativeBase,\n\ttrimExtension\n} from './util';\n\nexport interface IIncludeXtraMapping {\n\n\t/**\n\t * Source path, case insensitive.\n\t * Does not need to match the full path.\n\t */\n\tsrc: string;\n\n\t/**\n\t * Destination path, case sensitive.\n\t * Only matches same amount of the full path as src.\n\t */\n\tdest: string | null;\n}\n\nexport interface IIncludeXtraMappingBest {\n\n\t/**\n\t * Map instance.\n\t */\n\tmap: IIncludeXtraMapping;\n\n\t/**\n\t * Relative path.\n\t */\n\trelative: string;\n}\n\nexport interface IIncludeXtras {\n\t[key: string]: string | null;\n}\n\nexport interface IProjectorOptions {\n\n\t/**\n\t * Skeleton file or directory.\n\t *\n\t * @default null\n\t */\n\tskeleton?: string | null;\n\n\t/**\n\t * Movie file.\n\t *\n\t * @default null\n\t */\n\tmovieFile?: string | null;\n\n\t/**\n\t * Movie data.\n\t *\n\t * @default null\n\t */\n\tmovieData?: Buffer | null;\n\n\t/**\n\t * Movie name.\n\t *\n\t * @default null\n\t */\n\tmovieName?: string | null;\n\n\t/**\n\t * Movie data.\n\t *\n\t * @default false\n\t */\n\tshockwave?: boolean;\n\n\t/**\n\t * Config file.\n\t *\n\t * @default null\n\t */\n\tconfigFile?: string | null;\n\n\t/**\n\t * Config data.\n\t *\n\t * @default null\n\t */\n\tconfigData?: string[] | string | Buffer | null;\n\n\t/**\n\t * Lingo file.\n\t *\n\t * @default null\n\t */\n\tlingoFile?: string | null;\n\n\t/**\n\t * Lingo data.\n\t *\n\t * @default null\n\t */\n\tlingoData?: string[] | string | Buffer | null;\n\n\t/**\n\t * Splash image file.\n\t *\n\t * @default null\n\t */\n\tsplashImageFile?: string | null;\n\n\t/**\n\t * Splash image data.\n\t *\n\t * @default null\n\t */\n\tsplashImageData?: Buffer | null;\n\n\t/**\n\t * Xtras include map.\n\t *\n\t * @default null\n\t */\n\tincludeXtras?: IIncludeXtras | null;\n\n\t/**\n\t * Nest xtras in a Configuration directory.\n\t *\n\t * @default false\n\t */\n\tnestXtrasConfiguration?: boolean;\n\n\t/**\n\t * Path to hdiutil binary.\n\t *\n\t * @default null\n\t */\n\tpathToHdiutil?: string | null;\n}\n\n/**\n * Projector constructor.\n *\n * @param options Options object.\n */\nexport abstract class Projector extends Object {\n\t/**\n\t * Skeleton file or directory.\n\t *\n\t * @default null\n\t */\n\tpublic skeleton: string | null;\n\n\t/**\n\t * Movie file.\n\t *\n\t * @default null\n\t */\n\tpublic movieFile: string | null;\n\n\t/**\n\t * Movie data.\n\t *\n\t * @default null\n\t */\n\tpublic movieData: Buffer | null;\n\n\t/**\n\t * Movie name.\n\t *\n\t * @default null\n\t */\n\tpublic movieName: string | null;\n\n\t/**\n\t * Movie data.\n\t *\n\t * @default false\n\t */\n\tpublic shockwave: boolean;\n\n\t/**\n\t * Config file.\n\t *\n\t * @default null\n\t */\n\tpublic configFile: string | null;\n\n\t/**\n\t * Config data.\n\t *\n\t * @default null\n\t */\n\tpublic configData: string[] | string | Buffer | null;\n\n\t/**\n\t * Lingo file.\n\t *\n\t * @default null\n\t */\n\tpublic lingoFile: string | null;\n\n\t/**\n\t * Lingo data.\n\t *\n\t * @default null\n\t */\n\tpublic lingoData: string[] | string | Buffer | null;\n\n\t/**\n\t * Splash image file.\n\t *\n\t * @default null\n\t */\n\tpublic splashImageFile: string | null;\n\n\t/**\n\t * Splash image data.\n\t *\n\t * @default null\n\t */\n\tpublic splashImageData: Buffer | null;\n\n\t/**\n\t * Xtras include map.\n\t *\n\t * @default null\n\t */\n\tpublic includeXtras: IIncludeXtras | null;\n\n\t/**\n\t * Nest xtras in a Configuration directory.\n\t *\n\t * @default false\n\t */\n\tpublic nestXtrasConfiguration: boolean;\n\n\t/**\n\t * Path to hdiutil binary.\n\t *\n\t * @default null\n\t */\n\tpublic pathToHdiutil: string | null;\n\n\tconstructor(options: IProjectorOptions = {}) {\n\t\tsuper();\n\n\t\tthis.skeleton = defaultNull(options.skeleton);\n\t\tthis.movieFile = defaultNull(options.movieFile);\n\t\tthis.movieData = defaultNull(options.movieData);\n\t\tthis.movieName = defaultNull(options.movieName);\n\t\tthis.shockwave = defaultFalse(options.shockwave);\n\t\tthis.configFile = defaultNull(options.configFile);\n\t\tthis.configData = defaultNull(options.configData);\n\t\tthis.lingoFile = defaultNull(options.lingoFile);\n\t\tthis.lingoData = defaultNull(options.lingoData);\n\t\tthis.splashImageFile = defaultNull(options.splashImageFile);\n\t\tthis.splashImageData = defaultNull(options.splashImageData);\n\t\tthis.includeXtras = defaultNull(options.includeXtras);\n\t\tthis.nestXtrasConfiguration = defaultFalse(\n\t\t\toptions.nestXtrasConfiguration\n\t\t);\n\t\tthis.pathToHdiutil = defaultNull(options.pathToHdiutil);\n\t}\n\n\t/**\n\t * Config file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic get configExtension() {\n\t\treturn '.INI';\n\t}\n\n\t/**\n\t * Config file encoding.\n\t *\n\t * @returns File encoding.\n\t */\n\tpublic get configEncoding() {\n\t\treturn 'ascii' as BufferEncoding;\n\t}\n\n\t/**\n\t * Lingo file name.\n\t *\n\t * @returns File name.\n\t */\n\tpublic get lingoName() {\n\t\treturn 'LINGO.INI';\n\t}\n\n\t/**\n\t * Lingo file encoding.\n\t *\n\t * @returns File encoding.\n\t */\n\tpublic get lingoEncoding() {\n\t\treturn 'ascii' as BufferEncoding;\n\t}\n\n\t/**\n\t * Xtras directory name.\n\t *\n\t * @returns Directory encoding.\n\t */\n\tpublic get xtrasDirectoryName() {\n\t\treturn 'xtras';\n\t}\n\n\t/**\n\t * Configuration directory name.\n\t *\n\t * @returns Directory encoding.\n\t */\n\tpublic get configurationDirectoryName() {\n\t\treturn 'Configuration';\n\t}\n\n\t/**\n\t * Get movie data if any specified, from data or file.\n\t *\n\t * @returns Movie data or null.\n\t */\n\tpublic async getMovieData() {\n\t\treturn this._dataFromBufferOrFile(\n\t\t\tthis.movieData,\n\t\t\tthis.movieFile\n\t\t);\n\t}\n\n\t/**\n\t * Get config data if any specified, from data or file.\n\t *\n\t * @returns Config data or null.\n\t */\n\tpublic async getConfigData() {\n\t\treturn this._dataFromValueOrFile(\n\t\t\tthis.configData,\n\t\t\tthis.configFile,\n\t\t\tthis.configNewline,\n\t\t\tthis.configEncoding\n\t\t);\n\t}\n\n\t/**\n\t * Get lingo data if any specified, from data or file.\n\t *\n\t * @returns Lingo data or null.\n\t */\n\tpublic async getLingoData() {\n\t\treturn this._dataFromValueOrFile(\n\t\t\tthis.lingoData,\n\t\t\tthis.lingoFile,\n\t\t\tthis.lingoNewline,\n\t\t\tthis.lingoEncoding\n\t\t);\n\t}\n\n\t/**\n\t * Get splash image data if any specified, from data or file.\n\t *\n\t * @returns Splash image data or null.\n\t */\n\tpublic async getSplashImageData() {\n\t\treturn this._dataFromBufferOrFile(\n\t\t\tthis.splashImageData,\n\t\t\tthis.splashImageFile\n\t\t);\n\t}\n\n\t/**\n\t * Get the name of a projector trimming the extension, case insensitive.\n\t *\n\t * @param name Projector name.\n\t * @returns Projector name without extension.\n\t */\n\tpublic getProjectorNameNoExtension(name: string) {\n\t\treturn trimExtension(name, this.projectorExtension, true);\n\t}\n\n\t/**\n\t * Get the Xtras path.\n\t *\n\t * @param name Save name.\n\t * @returns Xtras path.\n\t */\n\tpublic getXtrasPath(name: string) {\n\t\tconst cdn = this.configurationDirectoryName;\n\t\treturn this.nestXtrasConfiguration && cdn ?\n\t\t\t`${cdn}/${this.xtrasDirectoryName}` :\n\t\t\tthis.xtrasDirectoryName;\n\t}\n\n\t/**\n\t * Get the config path.\n\t *\n\t * @param name Save name.\n\t * @returns Config path.\n\t */\n\tpublic getConfigPath(name: string) {\n\t\tconst n = this.getProjectorNameNoExtension(name);\n\t\treturn `${n}${this.configExtension}`;\n\t}\n\n\t/**\n\t * Get the splash image path.\n\t *\n\t * @param name Save name.\n\t * @returns Config path.\n\t */\n\tpublic getSplashImagePath(name: string) {\n\t\tconst n = this.getProjectorNameNoExtension(name);\n\t\treturn `${n}${this.splashImageExtension}`;\n\t}\n\n\t/**\n\t * Get the skeleton file or directory as an Archive instance.\n\t *\n\t * @returns Archive instance.\n\t */\n\tpublic async getSkeletonArchive(): Promise<Archive> {\n\t\tconst {skeleton} = this;\n\t\tif (!skeleton) {\n\t\t\tthrow new Error('Projector skeleton not specified');\n\t\t}\n\n\t\tconst stat = await fse.stat(skeleton);\n\t\tif (stat.isDirectory()) {\n\t\t\treturn new ArchiveDir(skeleton);\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\tthrow new Error('Projector skeleton not file or directory');\n\t\t}\n\n\t\tconst r = createArchiveByFileExtension(skeleton);\n\t\tif (!r) {\n\t\t\tthrow new Error('Projector skeleton archive file type unknown');\n\t\t}\n\n\t\tif (r instanceof ArchiveHdi) {\n\t\t\tconst {pathToHdiutil} = this;\n\t\t\tif (pathToHdiutil) {\n\t\t\t\tr.mounterMac.hdiutil = pathToHdiutil;\n\t\t\t}\n\t\t\tr.nobrowse = true;\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Get include Xtras as a list of mappings.\n\t *\n\t * @returns Mappings list.\n\t */\n\tpublic getIncludeXtrasMappings() {\n\t\tconst {includeXtras} = this;\n\t\tconst r: IIncludeXtraMapping[] = [];\n\t\tif (includeXtras) {\n\t\t\tfor (const src of Object.keys(includeXtras)) {\n\t\t\t\tconst dest = includeXtras[src];\n\t\t\t\tr.push({\n\t\t\t\t\tsrc,\n\t\t\t\t\tdest\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Find the best match for a path in a list of Xtras mappings.\n\t * Path search is case-insensitive.\n\t *\n\t * @param mappings Mappings list.\n\t * @param path Path to search for.\n\t * @returns Best match or null.\n\t */\n\tpublic findIncludeXtrasMappingsBestMatch(\n\t\tmappings: IIncludeXtraMapping[],\n\t\tpath: string\n\t) {\n\t\tlet best: IIncludeXtraMappingBest | null = null;\n\t\tlet bestScore = -1;\n\t\tfor (const map of mappings) {\n\t\t\tconst {src} = map;\n\t\t\tconst relative = src === '' ?\n\t\t\t\tpath :\n\t\t\t\tpathRelativeBase(path, src, true);\n\t\t\tif (relative === null || bestScore >= src.length) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbest = {\n\t\t\t\tmap,\n\t\t\t\trelative\n\t\t\t};\n\t\t\tbestScore = src.length;\n\t\t}\n\t\treturn best;\n\t}\n\n\t/**\n\t * Find output path for an Xtra.\n\t *\n\t * @param mappings Mappings list.\n\t * @param path Path to search for.\n\t * @returns Output path or null.\n\t */\n\tpublic includeXtrasMappingsDest(\n\t\tmappings: IIncludeXtraMapping[],\n\t\tpath: string\n\t) {\n\t\tconst best = this.findIncludeXtrasMappingsBestMatch(mappings, path);\n\t\tif (!best) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst {map, relative} = best;\n\t\tconst base = map.dest || map.src;\n\t\t// eslint-disable-next-line no-nested-ternary\n\t\treturn base ? (relative ? `${base}/${relative}` : base) : relative;\n\t}\n\n\t/**\n\t * Write out the projector.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tpublic async write(path: string, name: string) {\n\t\tawait this._writeSkeleton(path, name);\n\t\tawait this._writeMovie(path, name);\n\t\tawait this._writeConfig(path, name);\n\t\tawait this._writeSplashImage(path, name);\n\t\tawait this._writeLingo(path, name);\n\t}\n\n\t/**\n\t * Write out the projector movie file.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tprotected async _writeMovie(path: string, name: string) {\n\t\tconst data = await this.getMovieData();\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tconst {movieName} = this;\n\t\tif (!movieName) {\n\t\t\tthrow new Error('Cannot write movie data without a movie name');\n\t\t}\n\t\tawait fse.writeFile(pathJoin(path, movieName), data);\n\t}\n\n\t/**\n\t * Write out the projector config file.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tprotected async _writeConfig(path: string, name: string) {\n\t\tawait this._maybeWriteFile(\n\t\t\tawait this.getConfigData(),\n\t\t\tpathJoin(path, this.getConfigPath(name))\n\t\t);\n\t}\n\n\t/**\n\t * Write out the projector splash image file.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tprotected async _writeSplashImage(path: string, name: string) {\n\t\tawait this._maybeWriteFile(\n\t\t\tawait this.getSplashImageData(),\n\t\t\tpathJoin(path, this.getSplashImagePath(name))\n\t\t);\n\t}\n\n\t/**\n\t * Write out the projector lingo file.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tprotected async _writeLingo(path: string, name: string) {\n\t\tawait this._maybeWriteFile(\n\t\t\tawait this.getLingoData(),\n\t\t\tpathJoin(path, this.lingoName)\n\t\t);\n\t}\n\n\t/**\n\t * Get data from buffer or file.\n\t *\n\t * @param data Data buffer.\n\t * @param file File path.\n\t * @returns Data buffer.\n\t */\n\tprotected async _dataFromBufferOrFile(\n\t\tdata: Buffer | null,\n\t\tfile: string | null\n\t) {\n\t\tif (data) {\n\t\t\treturn data;\n\t\t}\n\t\tif (file) {\n\t\t\treturn fse.readFile(file);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get data from value or file.\n\t *\n\t * @param data Data value.\n\t * @param file File path.\n\t * @param newline Newline string.\n\t * @param encoding String encoding.\n\t * @returns Data buffer.\n\t */\n\tprotected async _dataFromValueOrFile(\n\t\tdata: string[] | string | Buffer | null,\n\t\tfile: string | null,\n\t\tnewline: string | null,\n\t\tencoding: BufferEncoding | null\n\t) {\n\t\tlet str: string | null = null;\n\t\tif (typeof data === 'string') {\n\t\t\tstr = data;\n\t\t}\n\t\telse if (Array.isArray(data)) {\n\t\t\tif (newline === null) {\n\t\t\t\tthrow new Error('New line delimiter required');\n\t\t\t}\n\t\t\tstr = data.join(newline);\n\t\t}\n\t\telse {\n\t\t\treturn this._dataFromBufferOrFile(data, file);\n\t\t}\n\t\tif (!encoding) {\n\t\t\tthrow new Error('String data encoding required');\n\t\t}\n\t\treturn Buffer.from(str, encoding);\n\t}\n\n\t/**\n\t * Maybe write file if data is not null.\n\t *\n\t * @param data Data to maybe write.\n\t * @param path Output path.\n\t */\n\tprotected async _maybeWriteFile(\n\t\tdata: Buffer | null,\n\t\tpath: string\n\t) {\n\t\tif (!data) {\n\t\t\treturn;\n\t\t}\n\t\tawait fse.writeFile(path, data);\n\t}\n\n\t/**\n\t * Splash image file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get splashImageExtension(): string;\n\n\t/**\n\t * Projector file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get projectorExtension(): string;\n\n\t/**\n\t * Config file newline characters.\n\t *\n\t * @returns Newline characters.\n\t */\n\tpublic abstract get configNewline(): string;\n\n\t/**\n\t * Config file newline characters.\n\t *\n\t * @returns Newline characters.\n\t */\n\tpublic abstract get lingoNewline(): string;\n\n\t/**\n\t * Write the projector skeleton from archive.\n\t *\n\t * @param path Save path.\n\t * @param name Save name.\n\t */\n\tprotected abstract async _writeSkeleton(\n\t\tpath: string,\n\t\tname: string\n\t): Promise<void>;\n}\n"],"file":"projector.mjs","sourceRoot":"../src"}