@shockpkg/dir-projector
Version:
Package for creating Shockwave Director projectors
1 lines • 20.3 kB
Source Map (JSON)
{"version":3,"file":"otto.mjs","names":["mkdir","readFile","writeFile","join","pathJoin","dirname","fsLstatExists","Projector","pathRelativeBase","trimExtension","ProjectorOtto","shockwave","splashImageData","splashImageFile","lingoData","lingoFile","includeXtras","nestXtrasConfiguration","skeleton","configData","configFile","constructor","path","configExtension","lingoName","xtrasName","configurationName","name","extension","configPath","base","splashImagePath","splashImageExtension","lingoPath","xtrasPath","cn","getConfigData","d","TextEncoder","encode","Array","isArray","configNewline","Uint8Array","buffer","byteOffset","byteLength","getSplashImageData","getLingoData","lingoNewline","getIncludeXtrasMappings","r","src","Object","keys","dest","push","findIncludeXtrasMappingsBestMatch","mappings","best","bestScore","map","relative","length","includeXtrasMappingsDest","write","Error","_checkOutput","_writeSkeleton","_writeConfig","_writeSplashImage","_writeLingo","Promise","all","p","data","recursive"],"sources":["../../src/projector/otto.ts"],"sourcesContent":["import {mkdir, readFile, writeFile} from 'node:fs/promises';\nimport {join as pathJoin, dirname} from 'node:path';\n\nimport {fsLstatExists} from '@shockpkg/archive-files';\n\nimport {Projector} from '../projector.ts';\nimport {pathRelativeBase, trimExtension} from '../util.ts';\n\n/**\n * Include Xtra mapping.\n */\nexport interface IIncludeXtraMapping {\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\n/**\n * Include Xtra mapping, best match.\n */\nexport interface IIncludeXtraMappingBest {\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\n/**\n * Include Xtras.\n */\nexport interface IIncludeXtras {\n\t[key: string]: string | null;\n}\n\n/**\n * File patch.\n */\nexport interface IFilePatch {\n\t/**\n\t * Check if skeleton file path matches.\n\t *\n\t * @param file File path.\n\t * @returns If matched.\n\t */\n\tmatch: (file: string) => boolean;\n\n\t/**\n\t * Modify data, possibly inplace.\n\t *\n\t * @param data The data to modify.\n\t * @returns Modified data.\n\t */\n\tmodify: (data: Uint8Array) => Promise<Uint8Array> | Uint8Array;\n\n\t/**\n\t * Run after all patches.\n\t */\n\tafter: () => Promise<void> | void;\n}\n\n/**\n * ProjectorOtto object.\n */\nexport abstract class ProjectorOtto extends Projector {\n\t/**\n\t * Make a Shockwave projector.\n\t */\n\tpublic shockwave = false;\n\n\t/**\n\t * Splash image data.\n\t */\n\tpublic splashImageData:\n\t\t| Readonly<Uint8Array>\n\t\t| (() => Readonly<Uint8Array>)\n\t\t| null = null;\n\n\t/**\n\t * Splash image file.\n\t */\n\tpublic splashImageFile: string | null = null;\n\n\t/**\n\t * Lingo data.\n\t */\n\tpublic lingoData:\n\t\t| readonly string[]\n\t\t| string\n\t\t| Readonly<Uint8Array>\n\t\t| (() => readonly string[] | string | Readonly<Uint8Array>)\n\t\t| (() => Promise<readonly string[] | string | Readonly<Uint8Array>>)\n\t\t| null = null;\n\n\t/**\n\t * Lingo file.\n\t */\n\tpublic lingoFile: string | null = null;\n\n\t/**\n\t * Xtras include map.\n\t */\n\tpublic includeXtras: Readonly<IIncludeXtras> | null = null;\n\n\t/**\n\t * Nest xtras in a Configuration directory.\n\t */\n\tpublic nestXtrasConfiguration = false;\n\n\t/**\n\t * Skeleton path.\n\t */\n\tpublic skeleton: string | null = null;\n\n\t/**\n\t * Config data.\n\t */\n\tpublic configData:\n\t\t| readonly string[]\n\t\t| string\n\t\t| Readonly<Uint8Array>\n\t\t| (() => readonly string[] | string | Readonly<Uint8Array>)\n\t\t| (() => Promise<readonly string[] | string | Readonly<Uint8Array>>)\n\t\t| null = null;\n\n\t/**\n\t * Config file.\n\t */\n\tpublic configFile: string | null = null;\n\n\t/**\n\t * ProjectorOtto constructor.\n\t *\n\t * @param path Output path.\n\t */\n\tconstructor(path: string) {\n\t\tsuper(path);\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 * 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 * Xtras directory name.\n\t *\n\t * @returns Directory encoding.\n\t */\n\tpublic get xtrasName() {\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 configurationName() {\n\t\treturn 'Configuration';\n\t}\n\n\t/**\n\t * Name of a projector trimming the extension, case insensitive.\n\t *\n\t * @returns Projector name without extension.\n\t */\n\tpublic get name() {\n\t\treturn trimExtension(dirname(this.path), this.extension, true);\n\t}\n\n\t/**\n\t * Config file path.\n\t *\n\t * @returns Config path.\n\t */\n\tpublic get configPath() {\n\t\tconst base = trimExtension(this.path, this.extension, true);\n\t\treturn `${base}${this.configExtension}`;\n\t}\n\n\t/**\n\t * Splash image file path.\n\t *\n\t * @returns Splash image path.\n\t */\n\tpublic get splashImagePath() {\n\t\tconst base = trimExtension(this.path, this.extension, true);\n\t\treturn `${base}${this.splashImageExtension}`;\n\t}\n\n\t/**\n\t * Lingo file path.\n\t *\n\t * @returns Lingo file path.\n\t */\n\tpublic get lingoPath() {\n\t\treturn pathJoin(dirname(this.path), this.lingoName);\n\t}\n\n\t/**\n\t * Get outout Xtras path.\n\t *\n\t * @returns Output path.\n\t */\n\tpublic get xtrasPath() {\n\t\tconst cn = this.configurationName;\n\t\treturn this.nestXtrasConfiguration && cn\n\t\t\t? pathJoin(dirname(this.path), cn, this.xtrasName)\n\t\t\t: pathJoin(dirname(this.path), this.xtrasName);\n\t}\n\n\t/**\n\t * Get config file data.\n\t *\n\t * @returns Config data or null.\n\t */\n\tpublic async getConfigData() {\n\t\tconst {configData, configFile} = this;\n\t\tif (configData) {\n\t\t\tswitch (typeof configData) {\n\t\t\t\tcase 'function': {\n\t\t\t\t\tconst d = await configData();\n\t\t\t\t\tif (typeof d === 'string') {\n\t\t\t\t\t\treturn new TextEncoder().encode(d);\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(d)) {\n\t\t\t\t\t\treturn new TextEncoder().encode(\n\t\t\t\t\t\t\td.join(this.configNewline)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn d as Readonly<Uint8Array>;\n\t\t\t\t}\n\t\t\t\tcase 'string': {\n\t\t\t\t\treturn new TextEncoder().encode(configData);\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\t// Fall through.\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Array.isArray(configData)) {\n\t\t\t\treturn new TextEncoder().encode(\n\t\t\t\t\tconfigData.join(this.configNewline)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn configData as Readonly<Uint8Array>;\n\t\t}\n\t\tif (configFile) {\n\t\t\tconst d = await readFile(configFile);\n\t\t\treturn new Uint8Array(d.buffer, d.byteOffset, d.byteLength);\n\t\t}\n\t\treturn null;\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\tconst {splashImageData, splashImageFile} = this;\n\t\tif (splashImageData) {\n\t\t\treturn typeof splashImageData === 'function'\n\t\t\t\t? splashImageData()\n\t\t\t\t: splashImageData;\n\t\t}\n\t\tif (splashImageFile) {\n\t\t\tconst d = await readFile(splashImageFile);\n\t\t\treturn new Uint8Array(d.buffer, d.byteOffset, d.byteLength);\n\t\t}\n\t\treturn null;\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\tconst {lingoData, lingoFile} = this;\n\t\tif (lingoData) {\n\t\t\tswitch (typeof lingoData) {\n\t\t\t\tcase 'function': {\n\t\t\t\t\tconst d = await lingoData();\n\t\t\t\t\tif (typeof d === 'string') {\n\t\t\t\t\t\treturn new TextEncoder().encode(d);\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(d)) {\n\t\t\t\t\t\treturn new TextEncoder().encode(\n\t\t\t\t\t\t\td.join(this.lingoNewline)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn d as Readonly<Uint8Array>;\n\t\t\t\t}\n\t\t\t\tcase 'string': {\n\t\t\t\t\treturn new TextEncoder().encode(lingoData);\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\t// Fall through.\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Array.isArray(lingoData)) {\n\t\t\t\treturn new TextEncoder().encode(\n\t\t\t\t\tlingoData.join(this.lingoNewline)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn lingoData as Readonly<Uint8Array>;\n\t\t}\n\t\tif (lingoFile) {\n\t\t\tconst d = await readFile(lingoFile);\n\t\t\treturn new Uint8Array(d.buffer, d.byteOffset, d.byteLength);\n\t\t}\n\t\treturn null;\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: readonly 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 =\n\t\t\t\tsrc === '' ? path : pathRelativeBase(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: readonly 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 * @inheritdoc\n\t */\n\tpublic async write() {\n\t\tconst {skeleton} = this;\n\t\tif (!skeleton) {\n\t\t\tthrow new Error('No projector skeleton configured');\n\t\t}\n\n\t\tawait this._checkOutput();\n\t\tawait this._writeSkeleton(skeleton);\n\t\tawait this._writeConfig();\n\t\tawait this._writeSplashImage();\n\t\tawait this._writeLingo();\n\t}\n\n\t/**\n\t * Check that output path is valid, else throws.\n\t */\n\tprotected async _checkOutput() {\n\t\tawait Promise.all(\n\t\t\t[\n\t\t\t\tthis.path,\n\t\t\t\tthis.configPath,\n\t\t\t\tthis.splashImagePath,\n\t\t\t\tthis.lingoPath\n\t\t\t].map(async p => {\n\t\t\t\tif (await fsLstatExists(p)) {\n\t\t\t\t\tthrow new Error(`Output path already exists: ${p}`);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n\n\t/**\n\t * Write out the projector config file.\n\t */\n\tprotected async _writeConfig() {\n\t\tconst data = await this.getConfigData();\n\t\tif (data) {\n\t\t\tconst {configPath} = this;\n\t\t\tawait mkdir(dirname(configPath), {recursive: true});\n\t\t\tawait writeFile(configPath, data);\n\t\t}\n\t}\n\n\t/**\n\t * Write out the projector splash image file.\n\t */\n\tprotected async _writeSplashImage() {\n\t\tconst data = await this.getSplashImageData();\n\t\tif (data) {\n\t\t\tconst {splashImagePath} = this;\n\t\t\tawait mkdir(dirname(splashImagePath), {recursive: true});\n\t\t\tawait writeFile(splashImagePath, data);\n\t\t}\n\t}\n\n\t/**\n\t * Write out the projector lingo file.\n\t */\n\tprotected async _writeLingo() {\n\t\tconst data = await this.getLingoData();\n\t\tif (data) {\n\t\t\tconst {lingoPath} = this;\n\t\t\tawait mkdir(dirname(lingoPath), {recursive: true});\n\t\t\tawait writeFile(lingoPath, data);\n\t\t}\n\t}\n\n\t/**\n\t * Projector file extension.\n\t *\n\t * @returns File extension.\n\t */\n\tpublic abstract get extension(): string;\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 * Config file newline characters.\n\t *\n\t * @returns Newline characters.\n\t */\n\tpublic abstract get configNewline(): string;\n\n\t/**\n\t * Lingo 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.\n\t *\n\t * @param skeleton Skeleton path.\n\t */\n\tprotected abstract _writeSkeleton(skeleton: string): Promise<void>;\n}\n"],"mappings":"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","ignoreList":[]}