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

View File

@@ -0,0 +1,16 @@
/**
* DOM Exception.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/DOMException/DOMException.
*/
export default class DOMException extends Error {
/**
* Constructor.
*
* @param message Message.
* @param name Name.
*/
constructor(message: string, name?: string);
}
//# sourceMappingURL=DOMException.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DOMException.d.ts","sourceRoot":"","sources":["../../src/exception/DOMException.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,KAAK;IAC9C;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa;CAKhD"}

View File

@@ -0,0 +1,20 @@
import DOMExceptionNameEnum from './DOMExceptionNameEnum.js';
/**
* DOM Exception.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/DOMException/DOMException.
*/
export default class DOMException extends Error {
/**
* Constructor.
*
* @param message Message.
* @param name Name.
*/
constructor(message, name = null) {
super(message);
this.name = name || DOMExceptionNameEnum.domException;
}
}
//# sourceMappingURL=DOMException.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DOMException.js","sourceRoot":"","sources":["../../src/exception/DOMException.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,KAAK;IAC9C;;;;;OAKG;IACH,YAAY,OAAe,EAAE,OAAe,IAAI;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,oBAAoB,CAAC,YAAY,CAAC;IACvD,CAAC;CACD"}

View File

@@ -0,0 +1,24 @@
declare enum DOMExceptionNameEnum {
invalidStateError = "InvalidStateError",
indexSizeError = "IndexSizeError",
syntaxError = "SyntaxError",
hierarchyRequestError = "HierarchyRequestError",
notSupportedError = "NotSupportedError",
wrongDocumentError = "WrongDocumentError",
invalidNodeTypeError = "InvalidNodeTypeError",
invalidCharacterError = "InvalidCharacterError",
notFoundError = "NotFoundError",
securityError = "SecurityError",
networkError = "NetworkError",
domException = "DOMException",
invalidAccessError = "InvalidAccessError",
unknownError = "UnknownError",
abortError = "AbortError",
timeoutError = "TimeoutError",
encodingError = "EncodingError",
uriMismatchError = "URIMismatchError",
inUseAttributeError = "InUseAttributeError",
namespaceError = "NamespaceError"
}
export default DOMExceptionNameEnum;
//# sourceMappingURL=DOMExceptionNameEnum.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DOMExceptionNameEnum.d.ts","sourceRoot":"","sources":["../../src/exception/DOMExceptionNameEnum.ts"],"names":[],"mappings":"AAAA,aAAK,oBAAoB;IACxB,iBAAiB,sBAAsB;IACvC,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,qBAAqB,0BAA0B;IAC/C,iBAAiB,sBAAsB;IACvC,kBAAkB,uBAAuB;IACzC,oBAAoB,yBAAyB;IAC7C,qBAAqB,0BAA0B;IAC/C,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,YAAY,iBAAiB;IAC7B,kBAAkB,uBAAuB;IACzC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,aAAa,kBAAkB;IAC/B,gBAAgB,qBAAqB;IACrC,mBAAmB,wBAAwB;IAC3C,cAAc,mBAAmB;CACjC;AACD,eAAe,oBAAoB,CAAC"}

View File

@@ -0,0 +1,25 @@
var DOMExceptionNameEnum;
(function (DOMExceptionNameEnum) {
DOMExceptionNameEnum["invalidStateError"] = "InvalidStateError";
DOMExceptionNameEnum["indexSizeError"] = "IndexSizeError";
DOMExceptionNameEnum["syntaxError"] = "SyntaxError";
DOMExceptionNameEnum["hierarchyRequestError"] = "HierarchyRequestError";
DOMExceptionNameEnum["notSupportedError"] = "NotSupportedError";
DOMExceptionNameEnum["wrongDocumentError"] = "WrongDocumentError";
DOMExceptionNameEnum["invalidNodeTypeError"] = "InvalidNodeTypeError";
DOMExceptionNameEnum["invalidCharacterError"] = "InvalidCharacterError";
DOMExceptionNameEnum["notFoundError"] = "NotFoundError";
DOMExceptionNameEnum["securityError"] = "SecurityError";
DOMExceptionNameEnum["networkError"] = "NetworkError";
DOMExceptionNameEnum["domException"] = "DOMException";
DOMExceptionNameEnum["invalidAccessError"] = "InvalidAccessError";
DOMExceptionNameEnum["unknownError"] = "UnknownError";
DOMExceptionNameEnum["abortError"] = "AbortError";
DOMExceptionNameEnum["timeoutError"] = "TimeoutError";
DOMExceptionNameEnum["encodingError"] = "EncodingError";
DOMExceptionNameEnum["uriMismatchError"] = "URIMismatchError";
DOMExceptionNameEnum["inUseAttributeError"] = "InUseAttributeError";
DOMExceptionNameEnum["namespaceError"] = "NamespaceError";
})(DOMExceptionNameEnum || (DOMExceptionNameEnum = {}));
export default DOMExceptionNameEnum;
//# sourceMappingURL=DOMExceptionNameEnum.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DOMExceptionNameEnum.js","sourceRoot":"","sources":["../../src/exception/DOMExceptionNameEnum.ts"],"names":[],"mappings":"AAAA,IAAK,oBAqBJ;AArBD,WAAK,oBAAoB;IACxB,+DAAuC,CAAA;IACvC,yDAAiC,CAAA;IACjC,mDAA2B,CAAA;IAC3B,uEAA+C,CAAA;IAC/C,+DAAuC,CAAA;IACvC,iEAAyC,CAAA;IACzC,qEAA6C,CAAA;IAC7C,uEAA+C,CAAA;IAC/C,uDAA+B,CAAA;IAC/B,uDAA+B,CAAA;IAC/B,qDAA6B,CAAA;IAC7B,qDAA6B,CAAA;IAC7B,iEAAyC,CAAA;IACzC,qDAA6B,CAAA;IAC7B,iDAAyB,CAAA;IACzB,qDAA6B,CAAA;IAC7B,uDAA+B,CAAA;IAC/B,6DAAqC,CAAA;IACrC,mEAA2C,CAAA;IAC3C,yDAAiC,CAAA;AAClC,CAAC,EArBI,oBAAoB,KAApB,oBAAoB,QAqBxB;AACD,eAAe,oBAAoB,CAAC"}