diff --git a/file/src/file.js b/file/src/file.js new file mode 100644 index 0000000..3903f36 --- /dev/null +++ b/file/src/file.js @@ -0,0 +1,66 @@ +import { Blob } from "./package.js" + +/** + * @implements {globalThis.File} + */ +export const WebFile = class File extends Blob { + /** + * + * @param {BlobPart[]} init + * @param {string} name - A USVString representing the file name or the path + * to the file. + * @param {FilePropertyBag} [options] + */ + constructor( + init, + name = panic(new TypeError("File constructor requires name argument")), + options = {} + ) { + super(init, options) + // Per File API spec https://w3c.github.io/FileAPI/#file-constructor + // Every "/" character of file name must be replaced with a ":". + /** @private */ + this._name = name + // It appears that browser do not follow the spec here. + // String(name).replace(/\//g, ":") + /** @private */ + this._lastModified = options.lastModified || Date.now() + } + + /** + * The name of the file referenced by the File object. + * @type {string} + */ + get name() { + return this._name + } + + /** + * The path the URL of the File is relative to. + * @type {string} + */ + get webkitRelativePath() { + return "" + } + + /** + * Returns the last modified time of the file, in millisecond since the UNIX + * epoch (January 1st, 1970 at Midnight). + * @returns {number} + */ + get lastModified() { + return this._lastModified + } + + get [Symbol.toStringTag]() { + return "File" + } +} + +/** + * @param {*} error + * @returns {never} + */ +const panic = error => { + throw error +} \ No newline at end of file diff --git a/file/src/lib.node.js b/file/src/lib.node.js index 4935501..9417d9c 100644 --- a/file/src/lib.node.js +++ b/file/src/lib.node.js @@ -2,74 +2,13 @@ "use strict" import { Blob } from "./package.js" +import { WebFile } from "./file.js" -/** - * @implements {globalThis.File} - */ -const WebFile = class File extends Blob { - /** - * - * @param {BlobPart[]} init - * @param {string} name - A USVString representing the file name or the path - * to the file. - * @param {FilePropertyBag} [options] - */ - constructor( - init, - name = panic(new TypeError("File constructor requires name argument")), - options = {} - ) { - super(init, options) - // Per File API spec https://w3c.github.io/FileAPI/#file-constructor - // Every "/" character of file name must be replaced with a ":". - /** @private */ - this._name = name - // It appears that browser do not follow the spec here. - // String(name).replace(/\//g, ":") - /** @private */ - this._lastModified = options.lastModified || Date.now() - } - - /** - * The name of the file referenced by the File object. - * @type {string} - */ - get name() { - return this._name - } - - /** - * The path the URL of the File is relative to. - * @type {string} - */ - get webkitRelativePath() { - return "" - } - - /** - * Returns the last modified time of the file, in millisecond since the UNIX - * epoch (January 1st, 1970 at Midnight). - * @returns {number} - */ - get lastModified() { - return this._lastModified - } - - get [Symbol.toStringTag]() { - return "File" - } -} - -/** - * @param {*} error - * @returns {never} - */ -const panic = error => { - throw error -} +// Electron-renderer should get the browser implementation instead of node +// Browser configuration is not enough // Marking export as a DOM File object instead of custom class. /** @type {typeof globalThis.File} */ -const File = WebFile +const File = typeof globalThis.File === 'function' ? globalThis.File : WebFile export { File, Blob }