UNPKG

16.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"mounter.js","names":["_nodeChild_process","require","_plistDom","Mounter","constructor","options","hdiutil","attach","file","devices","_runAttach","_argsAttach","eject","ejectSync","_createEjects","attachSync","_runAttachSync","_runEject","_argsEject","_runEjectSync","args","readonly","push","nobrowse","_fileArg","force","stdouts","proc","spawn","stdout","on","data","code","Promise","resolve","reject","once","Error","_parseDevices","Buffer","concat","toString","status","error","spawnSync","startsWith","xml","plist","Plist","fromXml","systemEntities","valueCastAs","ValueDict","getValue","castAs","ValueArray","r","value","dict","devEntry","ValueString","potentiallyMountable","ValueBoolean","contentHint","get","unmappedContentHint","volumeKind","mountPoint","device","_findRootDevice","length","exports"],"sources":["../src/mounter.ts"],"sourcesContent":["import {spawn, spawnSync} from 'node:child_process';\n\nimport {\n\tPlist,\n\tValueDict,\n\tValueArray,\n\tValueString,\n\tValueBoolean\n} from '@shockpkg/plist-dom';\n\nexport interface IMounterOptions {\n\t/**\n\t * The path for hdiutil.\n\t *\n\t * @default 'hdiutil'\n\t */\n\thdiutil?: string | null;\n}\n\nexport interface IMounterAttachOptions {\n\t/**\n\t * Force the devices to be read-only.\n\t */\n\treadonly?: boolean;\n\n\t/**\n\t * Hide any mounted volumes from applications like Finder.\n\t */\n\tnobrowse?: boolean;\n}\n\nexport interface IMounterEjectOptions {\n\t/**\n\t * Forcibly detach.\n\t */\n\tforce?: boolean;\n}\n\nexport interface IMounterDevice {\n\t/**\n\t * The dev-entry hdiutil info.\n\t */\n\tdevEntry: string;\n\n\t/**\n\t * The potentially-mountable hdiutil info.\n\t */\n\tpotentiallyMountable: boolean;\n\n\t/**\n\t * The content-hint hdiutil info.\n\t */\n\tcontentHint?: string;\n\n\t/**\n\t * The unmapped-content-hint hdiutil info.\n\t */\n\tunmappedContentHint?: string;\n\n\t/**\n\t * The volume-kind hdiutil info, if present.\n\t */\n\tvolumeKind?: string;\n\n\t/**\n\t * The mount-point hdiutil info, if present.\n\t */\n\tmountPoint?: string;\n}\n\nexport interface IMounterAttachInfo {\n\t/**\n\t * Device list.\n\t */\n\tdevices: IMounterDevice[];\n\n\t/**\n\t * Eject disk.\n\t */\n\teject(options?: Readonly<IMounterEjectOptions> | null): Promise<void>;\n\n\t/**\n\t * Eject disk.\n\t */\n\tejectSync(options?: Readonly<IMounterEjectOptions> | null): void;\n}\n\n/**\n * Mounter object.\n */\nexport class Mounter {\n\t/**\n\t * The path to hdiutil.\n\t */\n\tpublic hdiutil: string;\n\n\t/**\n\t * Mounter constructor.\n\t *\n\t * @param options Options object.\n\t */\n\tconstructor(options: Readonly<IMounterOptions> | null = null) {\n\t\tthis.hdiutil = (options ? options.hdiutil : null) || 'hdiutil';\n\t}\n\n\t/**\n\t * Attach a disk image.\n\t *\n\t * @param file Path to disk image.\n\t * @param options Options object.\n\t * @returns Info object.\n\t */\n\tpublic async attach(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterAttachOptions> | null = null\n\t): Promise<IMounterAttachInfo> {\n\t\tconst devices = await this._runAttach(this._argsAttach(file, options));\n\t\tconst {eject, ejectSync} = this._createEjects(devices);\n\t\treturn {\n\t\t\tdevices,\n\t\t\teject,\n\t\t\tejectSync\n\t\t};\n\t}\n\n\t/**\n\t * Attach a disk image.\n\t *\n\t * @param file Path to disk image.\n\t * @param options Options object.\n\t * @returns Info object.\n\t */\n\tpublic attachSync(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterAttachOptions> | null = null\n\t): IMounterAttachInfo {\n\t\t// eslint-disable-next-line no-sync\n\t\tconst devices = this._runAttachSync(this._argsAttach(file, options));\n\t\tconst {eject, ejectSync} = this._createEjects(devices);\n\t\treturn {\n\t\t\tdevices,\n\t\t\teject,\n\t\t\tejectSync\n\t\t};\n\t}\n\n\t/**\n\t * Eject a disk image.\n\t *\n\t * @param file Path to device file or volume mount point.\n\t * @param options Options object.\n\t */\n\tpublic async eject(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterEjectOptions> | null = null\n\t) {\n\t\tawait this._runEject(this._argsEject(file, options));\n\t}\n\n\t/**\n\t * Eject a disk image.\n\t *\n\t * @param file Path to device file or volume mount point.\n\t * @param options Options object.\n\t */\n\tpublic ejectSync(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterEjectOptions> | null = null\n\t) {\n\t\t// eslint-disable-next-line no-sync\n\t\tthis._runEjectSync(this._argsEject(file, options));\n\t}\n\n\t/**\n\t * Create args for attach.\n\t *\n\t * @param file Path to disk image.\n\t * @param options Options object.\n\t * @returns Argument list.\n\t */\n\tprotected _argsAttach(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterAttachOptions> | null = null\n\t) {\n\t\tconst args = ['attach', '-plist'];\n\t\tif (options) {\n\t\t\tif (options.readonly) {\n\t\t\t\targs.push('-readonly');\n\t\t\t}\n\t\t\tif (options.nobrowse) {\n\t\t\t\targs.push('-nobrowse');\n\t\t\t}\n\t\t}\n\t\targs.push(this._fileArg(file));\n\t\treturn args;\n\t}\n\n\t/**\n\t * Create args for eject.\n\t *\n\t * @param file Path to device file or volume mount point.\n\t * @param options Options object.\n\t * @returns Argument list.\n\t */\n\tprotected _argsEject(\n\t\tfile: string,\n\t\toptions: Readonly<IMounterEjectOptions> | null = null\n\t) {\n\t\tconst args = ['eject'];\n\t\tif (options && options.force) {\n\t\t\targs.push('-force');\n\t\t}\n\t\targs.push(this._fileArg(file));\n\t\treturn args;\n\t}\n\n\t/**\n\t * Run hdiutil attach command, returning the devices list on success.\n\t *\n\t * @param args CLI args.\n\t * @returns Devices list.\n\t */\n\tprotected async _runAttach(args: Readonly<string[]>) {\n\t\tconst stdouts: Buffer[] = [];\n\t\tconst proc = spawn(this.hdiutil, args);\n\t\tproc.stdout.on('data', (data: Buffer) => {\n\t\t\tstdouts.push(data);\n\t\t});\n\t\tconst code = await new Promise<number | null>((resolve, reject) => {\n\t\t\tproc.once('exit', resolve);\n\t\t\tproc.once('error', reject);\n\t\t});\n\t\tif (code) {\n\t\t\tthrow new Error(`Attach failed: hdiutil exit code: ${code}`);\n\t\t}\n\t\treturn this._parseDevices(Buffer.concat(stdouts).toString());\n\t}\n\n\t/**\n\t * Run hdiutil attach command, returning the devices list on success.\n\t *\n\t * @param args CLI args.\n\t * @returns Devices list.\n\t */\n\tprotected _runAttachSync(args: Readonly<string[]>) {\n\t\tconst {status, error, stdout} = spawnSync(this.hdiutil, args);\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\t\tif (status) {\n\t\t\tthrow new Error(`Attach failed: hdiutil exit code: ${status}`);\n\t\t}\n\t\treturn this._parseDevices(stdout.toString());\n\t}\n\n\t/**\n\t * Run hdiutil eject command.\n\t *\n\t * @param args CLI args.\n\t */\n\tprotected async _runEject(args: Readonly<string[]>) {\n\t\tconst proc = spawn(this.hdiutil, args);\n\t\tconst status = await new Promise<number | null>((resolve, reject) => {\n\t\t\tproc.once('exit', resolve);\n\t\t\tproc.once('error', reject);\n\t\t});\n\t\tif (status) {\n\t\t\tthrow new Error(`Eject failed: hdiutil exit code: ${status}`);\n\t\t}\n\t}\n\n\t/**\n\t * Run hdiutil eject command.\n\t *\n\t * @param args CLI args.\n\t */\n\tprotected _runEjectSync(args: Readonly<string[]>) {\n\t\tconst {status, error} = spawnSync(this.hdiutil, args);\n\t\tif (error) {\n\t\t\tthrow error;\n\t\t}\n\t\tif (status) {\n\t\t\tthrow new Error(`Eject failed: hdiutil exit code: ${status}`);\n\t\t}\n\t}\n\n\t/**\n\t * Create file argument from file path.\n\t *\n\t * @param file File path.\n\t * @returns A path for use as argument.\n\t */\n\tprotected _fileArg(file: string) {\n\t\t// Make sure it will not be recognized as option argument.\n\t\treturn file.startsWith('-') ? `./${file}` : file;\n\t}\n\n\t/**\n\t * Parse devices plist into devices list.\n\t *\n\t * @param xml XML plist.\n\t * @returns Devices list.\n\t */\n\tprotected _parseDevices(xml: string) {\n\t\tconst plist = new Plist();\n\t\tplist.fromXml(xml);\n\t\tconst systemEntities = plist\n\t\t\t.valueCastAs(ValueDict)\n\t\t\t.getValue('system-entities')\n\t\t\t.castAs(ValueArray);\n\n\t\tconst r: IMounterDevice[] = [];\n\t\tfor (const value of systemEntities.value) {\n\t\t\tconst dict = value.castAs(ValueDict);\n\t\t\tconst devEntry = dict\n\t\t\t\t.getValue('dev-entry')\n\t\t\t\t.castAs(ValueString).value;\n\t\t\tconst potentiallyMountable = dict\n\t\t\t\t.getValue('potentially-mountable')\n\t\t\t\t.castAs(ValueBoolean).value;\n\t\t\tconst contentHint = dict.get('content-hint');\n\t\t\tconst unmappedContentHint = dict.get('unmapped-content-hint');\n\t\t\tconst volumeKind = dict.get('volume-kind');\n\t\t\tconst mountPoint = dict.get('mount-point');\n\n\t\t\tconst device: IMounterDevice = {\n\t\t\t\tdevEntry,\n\t\t\t\tpotentiallyMountable\n\t\t\t};\n\t\t\tif (contentHint) {\n\t\t\t\tdevice.contentHint = contentHint.castAs(ValueString).value;\n\t\t\t}\n\t\t\tif (unmappedContentHint) {\n\t\t\t\tdevice.unmappedContentHint =\n\t\t\t\t\tunmappedContentHint.castAs(ValueString).value;\n\t\t\t}\n\t\t\tif (volumeKind) {\n\t\t\t\tdevice.volumeKind = volumeKind.castAs(ValueString).value;\n\t\t\t}\n\t\t\tif (mountPoint) {\n\t\t\t\tdevice.mountPoint = mountPoint.castAs(ValueString).value;\n\t\t\t}\n\t\t\tr.push(device);\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Find the root device, null on empty list.\n\t *\n\t * @param devices Device list.\n\t * @returns Root device or null if an empty list.\n\t */\n\tprotected _findRootDevice(devices: Readonly<Readonly<IMounterDevice>[]>) {\n\t\tlet r: IMounterDevice | null = null;\n\t\tfor (const device of devices) {\n\t\t\tif (r === null || r.devEntry.length > device.devEntry.length) {\n\t\t\t\tr = device;\n\t\t\t}\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Create ejects callback from a list of devices.\n\t *\n\t * @param devices Device list.\n\t * @returns Callback function.\n\t */\n\tprotected _createEjects(devices: Readonly<Readonly<IMounterDevice>[]>) {\n\t\t// Find the root device, to use to eject (none possible in theory).\n\t\tlet devEntry = this._findRootDevice(devices)?.devEntry;\n\t\treturn {\n\t\t\t/**\n\t\t\t * The eject callback function.\n\t\t\t *\n\t\t\t * @param options Eject options.\n\t\t\t */\n\t\t\teject: async (options: IMounterEjectOptions | null = null) => {\n\t\t\t\tif (devEntry) {\n\t\t\t\t\tawait this.eject(devEntry, options);\n\t\t\t\t\tdevEntry = '';\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * The eject callback function.\n\t\t\t *\n\t\t\t * @param options Eject options.\n\t\t\t */\n\t\t\tejectSync: (options: IMounterEjectOptions | null = null) => {\n\t\t\t\tif (devEntry) {\n\t\t\t\t\t// eslint-disable-next-line no-sync\n\t\t\t\t\tthis.ejectSync(devEntry, options);\n\t\t\t\t\tdevEntry = '';\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n}\n"],"mappings":"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"}
\No newline at end of file