feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

67
frontend/node_modules/happy-dom/lib/file/Blob.d.ts generated vendored Normal file
View File

@@ -0,0 +1,67 @@
import { Buffer } from 'buffer';
import { ReadableStream } from 'stream/web';
import * as PropertySymbol from '../PropertySymbol.js';
/**
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Blob.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/Blob-impl.js (MIT licensed).
*/
export default class Blob {
readonly type: string;
[PropertySymbol.buffer]: Buffer;
/**
* Constructor.
*
* @param [bits] Bits.
* @param [options] Options.
* @param [options.type] MIME type.
*/
constructor(bits?: (ArrayBuffer | ArrayBufferView | Blob | Buffer | string)[], options?: {
type?: string;
});
/**
* Returns size.
*
* @returns Size.
*/
get size(): number;
/**
* Slices the blob.
*
* @param start Start.
* @param end End.
* @param contentType Content type.
* @returns New Blob.
*/
slice(start?: number, end?: number, contentType?: string): Blob;
/**
* Returns a Promise that resolves to a ArrayBuffer.
*
* @returns ArrayBuffer.
*/
/**
*
*/
arrayBuffer(): Promise<ArrayBuffer>;
/**
* Returns a Promise that resolves to a text.
*
* @returns Text.
*/
text(): Promise<string>;
/**
* Returns returns a ReadableStream which upon reading returns the data contained within the Blob.
*
* @returns ReadableStream
*/
stream(): ReadableStream;
/**
* Returns the object converted to string.
*
* @returns String.
*/
toString(): string;
}
//# sourceMappingURL=Blob.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"Blob.d.ts","sourceRoot":"","sources":["../../src/file/Blob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,IAAI;IACxB,SAAgB,IAAI,EAAE,MAAM,CAAM;IAC3B,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,CAAQ;IAE9C;;;;;;OAMG;gBAEF,IAAI,CAAC,EAAE,CAAC,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,EACjE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;IA+B5B;;;;OAIG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,GAAE,MAAa,EAAE,WAAW,SAAK,GAAG,IAAI;IA0CnE;;;;OAIG;IAKH;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAIhD;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAIpC;;;;OAIG;IACI,MAAM,IAAI,cAAc;IAU/B;;;;OAIG;IACI,QAAQ,IAAI,MAAM;CAGzB"}

148
frontend/node_modules/happy-dom/lib/file/Blob.js generated vendored Normal file
View File

@@ -0,0 +1,148 @@
import { Buffer } from 'buffer';
import { ReadableStream } from 'stream/web';
import * as PropertySymbol from '../PropertySymbol.js';
/**
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Blob.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/Blob-impl.js (MIT licensed).
*/
export default class Blob {
type = '';
[PropertySymbol.buffer] = null;
/**
* Constructor.
*
* @param [bits] Bits.
* @param [options] Options.
* @param [options.type] MIME type.
*/
constructor(bits, options) {
const buffers = [];
if (bits) {
for (const bit of bits) {
let buffer;
if (bit instanceof ArrayBuffer) {
buffer = Buffer.from(new Uint8Array(bit));
}
else if (bit instanceof Blob) {
buffer = bit[PropertySymbol.buffer];
}
else if (bit instanceof Buffer) {
buffer = bit;
}
else if (ArrayBuffer.isView(bit)) {
buffer = Buffer.from(new Uint8Array(bit.buffer, bit.byteOffset, bit.byteLength));
}
else {
buffer = Buffer.from(typeof bit === 'string' ? bit : String(bit));
}
buffers.push(buffer);
}
}
this[PropertySymbol.buffer] = Buffer.concat(buffers);
if (options && options.type && options.type.match(/^[\u0020-\u007E]*$/)) {
this.type = String(options.type).toLowerCase();
}
}
/**
* Returns size.
*
* @returns Size.
*/
get size() {
return this[PropertySymbol.buffer].length;
}
/**
* Slices the blob.
*
* @param start Start.
* @param end End.
* @param contentType Content type.
* @returns New Blob.
*/
slice(start = 0, end = null, contentType = '') {
const size = this.size;
let relativeStart;
let relativeEnd;
let relativeContentType;
if (start === undefined) {
relativeStart = 0;
}
else if (start < 0) {
relativeStart = Math.max(size + start, 0);
}
else {
relativeStart = Math.min(start, size);
}
if (end === null) {
relativeEnd = size;
}
else if (end < 0) {
relativeEnd = Math.max(size + end, 0);
}
else {
relativeEnd = Math.min(end, size);
}
if (contentType === undefined) {
relativeContentType = '';
}
else {
// Sanitization (lower case and invalid char check) is done in the
// Constructor
relativeContentType = contentType;
}
const span = Math.max(relativeEnd - relativeStart, 0);
const buffer = this[PropertySymbol.buffer];
const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
const blob = new Blob([], { type: relativeContentType });
blob[PropertySymbol.buffer] = slicedBuffer;
return blob;
}
/**
* Returns a Promise that resolves to a ArrayBuffer.
*
* @returns ArrayBuffer.
*/
// Reference:
// https://github.com/web-std/io/blob/c88170bf24f064adfbb3586a21fb76650ca5a9ab/packages/blob/src/blob.js#L139-L148
// https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer
/**
*
*/
async arrayBuffer() {
return new Uint8Array(this[PropertySymbol.buffer]).buffer;
}
/**
* Returns a Promise that resolves to a text.
*
* @returns Text.
*/
async text() {
return this[PropertySymbol.buffer].toString();
}
/**
* Returns returns a ReadableStream which upon reading returns the data contained within the Blob.
*
* @returns ReadableStream
*/
stream() {
const buffer = this[PropertySymbol.buffer];
return new ReadableStream({
start(controller) {
controller.enqueue(buffer);
controller.close();
}
});
}
/**
* Returns the object converted to string.
*
* @returns String.
*/
toString() {
return '[object Blob]';
}
}
//# sourceMappingURL=Blob.js.map

1
frontend/node_modules/happy-dom/lib/file/Blob.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"Blob.js","sourceRoot":"","sources":["../../src/file/Blob.ts"],"names":[],"mappings":"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"}

28
frontend/node_modules/happy-dom/lib/file/File.d.ts generated vendored Normal file
View File

@@ -0,0 +1,28 @@
import Blob from './Blob.js';
import { Buffer } from 'buffer';
/**
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/File.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/File-impl.js (MIT licensed).
*/
export default class File extends Blob {
readonly lastModified: number;
readonly name: string;
/**
* Constructor.
*
* @param bits File bits.
* @param name File name.
* @param [options] Options.
* @param [options.type] MIME type.
* @param [options.lastModifier] Last modified. Defaults to Date.now().
* @param options.lastModified
*/
constructor(bits: (ArrayBuffer | ArrayBufferView | Blob | Buffer | string)[], name: string, options?: {
type?: string;
lastModified?: number;
});
}
//# sourceMappingURL=File.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"File.d.ts","sourceRoot":"","sources":["../../src/file/File.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,IAAI;IACrC,SAAgB,YAAY,EAAE,MAAM,CAAQ;IAC5C,SAAgB,IAAI,EAAE,MAAM,CAAQ;IAEpC;;;;;;;;;OASG;gBAEF,IAAI,EAAE,CAAC,WAAW,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,EAChE,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;CAenD"}

33
frontend/node_modules/happy-dom/lib/file/File.js generated vendored Normal file
View File

@@ -0,0 +1,33 @@
import Blob from './Blob.js';
/**
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/File.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/File-impl.js (MIT licensed).
*/
export default class File extends Blob {
lastModified = null;
name = null;
/**
* Constructor.
*
* @param bits File bits.
* @param name File name.
* @param [options] Options.
* @param [options.type] MIME type.
* @param [options.lastModifier] Last modified. Defaults to Date.now().
* @param options.lastModified
*/
constructor(bits, name, options) {
if (arguments.length < 2) {
throw new TypeError("Failed to construct 'File': 2 arguments required, but only " +
arguments.length +
' present.');
}
super(bits, options);
this.name = name;
this.lastModified = options && options.lastModified ? options.lastModified : Date.now();
}
}
//# sourceMappingURL=File.js.map

1
frontend/node_modules/happy-dom/lib/file/File.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"File.js","sourceRoot":"","sources":["../../src/file/File.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,IAAI;IACrB,YAAY,GAAW,IAAI,CAAC;IAC5B,IAAI,GAAW,IAAI,CAAC;IAEpC;;;;;;;;;OASG;IACH,YACC,IAAgE,EAChE,IAAY,EACZ,OAAkD;QAElD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAClB,6DAA6D;gBAC5D,SAAS,CAAC,MAAM;gBAChB,WAAW,CACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAErB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACzF,CAAC;CACD"}

View File

@@ -0,0 +1,57 @@
import ProgressEvent from '../event/events/ProgressEvent.js';
import Blob from './Blob.js';
import EventTarget from '../event/EventTarget.js';
import { Buffer } from 'buffer';
/**
* Reference:
* https://developer.mozilla.org/sv-SE/docs/Web/API/FileReader.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/FileReader-impl.js (MIT licensed).
*/
export default class FileReader extends EventTarget {
#private;
readonly error: Error;
readonly result: Buffer | ArrayBuffer | string;
readonly readyState: number;
readonly onabort: (event: ProgressEvent) => void;
readonly onerror: (event: ProgressEvent) => void;
readonly onload: (event: ProgressEvent) => void;
readonly onloadstart: (event: ProgressEvent) => void;
readonly onloadend: (event: ProgressEvent) => void;
readonly onprogress: (event: ProgressEvent) => void;
/**
* Constructor.
*/
constructor();
/**
* Reads as ArrayBuffer.
*
* @param blob Blob.
*/
readAsArrayBuffer(blob: Blob): void;
/**
* Reads as binary string.
*
* @param blob Blob.
*/
readAsBinaryString(blob: Blob): void;
/**
* Reads as data URL.
*
* @param blob Blob.
*/
readAsDataURL(blob: Blob): void;
/**
* Reads as text.
*
* @param blob Blob.
* @param [encoding] Encoding.
*/
readAsText(blob: Blob, encoding?: string | null): void;
/**
* Aborts the file reader.
*/
abort(): void;
}
//# sourceMappingURL=FileReader.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReader.d.ts","sourceRoot":"","sources":["../../src/file/FileReader.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,kCAAkC,CAAC;AAE7D,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;;IAClD,SAAgB,KAAK,EAAE,KAAK,CAAQ;IACpC,SAAgB,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAQ;IAC7D,SAAgB,UAAU,EAAE,MAAM,CAAkC;IACpE,SAAgB,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IAC/D,SAAgB,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IAC/D,SAAgB,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IAC9D,SAAgB,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IACnE,SAAgB,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IACjE,SAAgB,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAQ;IAKlE;;OAEG;;IAWH;;;;OAIG;IACI,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS1C;;;;OAIG;IACI,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAS3C;;;;OAIG;IACI,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAStC;;;;;OAKG;IACI,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IASnE;;OAEG;IACI,KAAK,IAAI,IAAI;CAoGpB"}

167
frontend/node_modules/happy-dom/lib/file/FileReader.js generated vendored Normal file
View File

@@ -0,0 +1,167 @@
import WhatwgMIMEType from 'whatwg-mimetype';
import * as PropertySymbol from '../PropertySymbol.js';
import ProgressEvent from '../event/events/ProgressEvent.js';
import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js';
import Blob from './Blob.js';
import FileReaderReadyStateEnum from './FileReaderReadyStateEnum.js';
import FileReaderFormatEnum from './FileReaderFormatEnum.js';
import EventTarget from '../event/EventTarget.js';
import FileReaderEventTypeEnum from './FileReaderEventTypeEnum.js';
import { Buffer } from 'buffer';
/**
* Reference:
* https://developer.mozilla.org/sv-SE/docs/Web/API/FileReader.
*
* Based on:
* https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/FileReader-impl.js (MIT licensed).
*/
export default class FileReader extends EventTarget {
error = null;
result = null;
readyState = FileReaderReadyStateEnum.empty;
onabort = null;
onerror = null;
onload = null;
onloadstart = null;
onloadend = null;
onprogress = null;
#isTerminated = false;
#loadTimeout = null;
#parseTimeout = null;
/**
* Constructor.
*/
constructor() {
super();
if (!this[PropertySymbol.window]) {
throw new TypeError(`Failed to construct '${this.constructor.name}': '${this.constructor.name}' was constructed outside a Window context.`);
}
}
/**
* Reads as ArrayBuffer.
*
* @param blob Blob.
*/
readAsArrayBuffer(blob) {
if (!(blob instanceof Blob)) {
throw new this[PropertySymbol.window].TypeError(`Failed to execute 'readAsArrayBuffer' on 'FileReader': parameter 1 is not of type 'Blob'.`);
}
this.#readFile(blob, FileReaderFormatEnum.buffer);
}
/**
* Reads as binary string.
*
* @param blob Blob.
*/
readAsBinaryString(blob) {
if (!(blob instanceof Blob)) {
throw new this[PropertySymbol.window].TypeError(`Failed to execute 'readAsBinaryString' on 'FileReader': parameter 1 is not of type 'Blob'.`);
}
this.#readFile(blob, FileReaderFormatEnum.binaryString);
}
/**
* Reads as data URL.
*
* @param blob Blob.
*/
readAsDataURL(blob) {
if (!(blob instanceof Blob)) {
throw new this[PropertySymbol.window].TypeError(`Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.`);
}
this.#readFile(blob, FileReaderFormatEnum.dataURL);
}
/**
* Reads as text.
*
* @param blob Blob.
* @param [encoding] Encoding.
*/
readAsText(blob, encoding = null) {
if (!(blob instanceof Blob)) {
throw new this[PropertySymbol.window].TypeError(`Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'.`);
}
this.#readFile(blob, FileReaderFormatEnum.text, encoding || 'UTF-8');
}
/**
* Aborts the file reader.
*/
abort() {
const window = this[PropertySymbol.window];
window.clearTimeout(this.#loadTimeout);
window.clearTimeout(this.#parseTimeout);
if (this.readyState === FileReaderReadyStateEnum.empty ||
this.readyState === FileReaderReadyStateEnum.done) {
this.result = null;
return;
}
if (this.readyState === FileReaderReadyStateEnum.loading) {
this.readyState = FileReaderReadyStateEnum.done;
this.result = null;
}
this.#isTerminated = true;
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.abort));
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.loadend));
}
/**
* Reads a file.
*
* @param blob Blob.
* @param format Format.
* @param [encoding] Encoding.
*/
#readFile(blob, format, encoding = null) {
const window = this[PropertySymbol.window];
if (this.readyState === FileReaderReadyStateEnum.loading) {
throw new window.DOMException('The object is in an invalid state.', DOMExceptionNameEnum.invalidStateError);
}
this.readyState = FileReaderReadyStateEnum.loading;
this.#loadTimeout = window.setTimeout(() => {
if (this.#isTerminated) {
this.#isTerminated = false;
return;
}
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.loadstart));
let data = blob[PropertySymbol.buffer];
if (!data) {
data = Buffer.alloc(0);
}
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.loadstart, {
lengthComputable: !isNaN(blob.size),
total: blob.size,
loaded: data.length
}));
this.#parseTimeout = window.setTimeout(() => {
if (this.#isTerminated) {
this.#isTerminated = false;
return;
}
switch (format) {
default:
case FileReaderFormatEnum.buffer: {
this.result = new Uint8Array(data).buffer;
break;
}
case FileReaderFormatEnum.binaryString: {
this.result = data.toString('binary');
break;
}
case FileReaderFormatEnum.dataURL: {
// Spec seems very unclear here; see https://github.com/w3c/FileAPI/issues/104.
const contentType = WhatwgMIMEType.parse(blob.type) || 'application/octet-stream';
this.result =
`data:${contentType};base64,${data.toString('base64')}`;
break;
}
case FileReaderFormatEnum.text: {
this.result = new TextDecoder(encoding || 'UTF-8').decode(data);
break;
}
}
this.readyState = FileReaderReadyStateEnum.done;
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.load));
this.dispatchEvent(new ProgressEvent(FileReaderEventTypeEnum.loadend));
});
});
}
}
//# sourceMappingURL=FileReader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReader.js","sourceRoot":"","sources":["../../src/file/FileReader.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,10 @@
declare enum FileReaderEventTypeEnum {
abort = "abort",
error = "error",
load = "load",
loadstart = "loadstart",
loadend = "loadend",
progress = "progress"
}
export default FileReaderEventTypeEnum;
//# sourceMappingURL=FileReaderEventTypeEnum.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderEventTypeEnum.d.ts","sourceRoot":"","sources":["../../src/file/FileReaderEventTypeEnum.ts"],"names":[],"mappings":"AAAA,aAAK,uBAAuB;IAC3B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,QAAQ,aAAa;CACrB;AACD,eAAe,uBAAuB,CAAC"}

View File

@@ -0,0 +1,11 @@
var FileReaderEventTypeEnum;
(function (FileReaderEventTypeEnum) {
FileReaderEventTypeEnum["abort"] = "abort";
FileReaderEventTypeEnum["error"] = "error";
FileReaderEventTypeEnum["load"] = "load";
FileReaderEventTypeEnum["loadstart"] = "loadstart";
FileReaderEventTypeEnum["loadend"] = "loadend";
FileReaderEventTypeEnum["progress"] = "progress";
})(FileReaderEventTypeEnum || (FileReaderEventTypeEnum = {}));
export default FileReaderEventTypeEnum;
//# sourceMappingURL=FileReaderEventTypeEnum.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderEventTypeEnum.js","sourceRoot":"","sources":["../../src/file/FileReaderEventTypeEnum.ts"],"names":[],"mappings":"AAAA,IAAK,uBAOJ;AAPD,WAAK,uBAAuB;IAC3B,0CAAe,CAAA;IACf,0CAAe,CAAA;IACf,wCAAa,CAAA;IACb,kDAAuB,CAAA;IACvB,8CAAmB,CAAA;IACnB,gDAAqB,CAAA;AACtB,CAAC,EAPI,uBAAuB,KAAvB,uBAAuB,QAO3B;AACD,eAAe,uBAAuB,CAAC"}

View File

@@ -0,0 +1,8 @@
declare enum FileReaderFormatEnum {
buffer = "buffer",
binaryString = "binaryString",
dataURL = "dataURL",
text = "text"
}
export default FileReaderFormatEnum;
//# sourceMappingURL=FileReaderFormatEnum.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderFormatEnum.d.ts","sourceRoot":"","sources":["../../src/file/FileReaderFormatEnum.ts"],"names":[],"mappings":"AAAA,aAAK,oBAAoB;IACxB,MAAM,WAAW;IACjB,YAAY,iBAAiB;IAC7B,OAAO,YAAY;IACnB,IAAI,SAAS;CACb;AACD,eAAe,oBAAoB,CAAC"}

View File

@@ -0,0 +1,9 @@
var FileReaderFormatEnum;
(function (FileReaderFormatEnum) {
FileReaderFormatEnum["buffer"] = "buffer";
FileReaderFormatEnum["binaryString"] = "binaryString";
FileReaderFormatEnum["dataURL"] = "dataURL";
FileReaderFormatEnum["text"] = "text";
})(FileReaderFormatEnum || (FileReaderFormatEnum = {}));
export default FileReaderFormatEnum;
//# sourceMappingURL=FileReaderFormatEnum.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderFormatEnum.js","sourceRoot":"","sources":["../../src/file/FileReaderFormatEnum.ts"],"names":[],"mappings":"AAAA,IAAK,oBAKJ;AALD,WAAK,oBAAoB;IACxB,yCAAiB,CAAA;IACjB,qDAA6B,CAAA;IAC7B,2CAAmB,CAAA;IACnB,qCAAa,CAAA;AACd,CAAC,EALI,oBAAoB,KAApB,oBAAoB,QAKxB;AACD,eAAe,oBAAoB,CAAC"}

View File

@@ -0,0 +1,7 @@
declare enum FileReaderReadyStateEnum {
empty = 0,
loading = 1,
done = 2
}
export default FileReaderReadyStateEnum;
//# sourceMappingURL=FileReaderReadyStateEnum.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderReadyStateEnum.d.ts","sourceRoot":"","sources":["../../src/file/FileReaderReadyStateEnum.ts"],"names":[],"mappings":"AAAA,aAAK,wBAAwB;IAC5B,KAAK,IAAI;IACT,OAAO,IAAI;IACX,IAAI,IAAI;CACR;AACD,eAAe,wBAAwB,CAAC"}

View File

@@ -0,0 +1,8 @@
var FileReaderReadyStateEnum;
(function (FileReaderReadyStateEnum) {
FileReaderReadyStateEnum[FileReaderReadyStateEnum["empty"] = 0] = "empty";
FileReaderReadyStateEnum[FileReaderReadyStateEnum["loading"] = 1] = "loading";
FileReaderReadyStateEnum[FileReaderReadyStateEnum["done"] = 2] = "done";
})(FileReaderReadyStateEnum || (FileReaderReadyStateEnum = {}));
export default FileReaderReadyStateEnum;
//# sourceMappingURL=FileReaderReadyStateEnum.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileReaderReadyStateEnum.js","sourceRoot":"","sources":["../../src/file/FileReaderReadyStateEnum.ts"],"names":[],"mappings":"AAAA,IAAK,wBAIJ;AAJD,WAAK,wBAAwB;IAC5B,yEAAS,CAAA;IACT,6EAAW,CAAA;IACX,uEAAQ,CAAA;AACT,CAAC,EAJI,wBAAwB,KAAxB,wBAAwB,QAI5B;AACD,eAAe,wBAAwB,CAAC"}