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,97 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const VirtualConsoleLogTypeEnum_js_1 = __importDefault(require("../enums/VirtualConsoleLogTypeEnum.cjs"));
/**
* Virtual console utility.
*/
class VirtualConsoleLogEntryStringifier {
/**
* Stringifies a log entry.
*
* @param logEntry Log entry.
* @returns Stringified message.
*/
static toString(logEntry) {
if (this.isLogEntryCollapsed(logEntry)) {
return '';
}
const tabbing = this.getLogEntryGroupTabbing(logEntry);
let output = tabbing;
for (const part of logEntry.message) {
output += output !== '' && output !== tabbing ? ' ' : '';
if (typeof part === 'object' &&
(part === null || part.constructor.name === 'Object' || Array.isArray(part))) {
try {
output += JSON.stringify(part);
}
catch (error) {
output += new Error('Failed to JSON stringify object in log entry.').stack.replace(/\n at/gm, '\n ' + tabbing + 'at');
}
}
else if (typeof part === 'object' && part['message'] && part['stack']) {
output += part['stack'].replace(/\n at/gm, '\n ' + tabbing + 'at');
}
else {
output += this.getLogEntryIcon(logEntry) + String(part);
}
}
return output + '\n';
}
/**
* Gets the log entry icon.
*
* @param logEntry Log entry.
* @returns Icon.
*/
static getLogEntryIcon(logEntry) {
switch (logEntry.type) {
case VirtualConsoleLogTypeEnum_js_1.default.group:
return '▼ ';
case VirtualConsoleLogTypeEnum_js_1.default.groupCollapsed:
return '▶ ';
}
return '';
}
/**
* Gets the log entry group tabbing.
*
* @param logEntry Log entry.
* @returns Tabbing.
*/
static getLogEntryGroupTabbing(logEntry) {
let tabs = '';
let group = logEntry.type === VirtualConsoleLogTypeEnum_js_1.default.group ||
logEntry.type === VirtualConsoleLogTypeEnum_js_1.default.groupCollapsed
? logEntry.group?.parent
: logEntry.group;
while (group) {
tabs += ' ';
group = group.parent;
}
return tabs;
}
/**
* Checks if the log entry content is collapsed.
*
* @param logEntry Log entry.
* @returns True if collapsed.
*/
static isLogEntryCollapsed(logEntry) {
let group = logEntry.type === VirtualConsoleLogTypeEnum_js_1.default.group ||
logEntry.type === VirtualConsoleLogTypeEnum_js_1.default.groupCollapsed
? logEntry.group?.parent
: logEntry.group;
while (group) {
if (group.collapsed) {
return true;
}
group = group.parent;
}
return false;
}
}
exports.default = VirtualConsoleLogEntryStringifier;
//# sourceMappingURL=VirtualConsoleLogEntryStringifier.cjs.map

View File

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

View File

@@ -0,0 +1,35 @@
import IVirtualConsoleLogEntry from '../IVirtualConsoleLogEntry.cjs';
/**
* Virtual console utility.
*/
export default class VirtualConsoleLogEntryStringifier {
/**
* Stringifies a log entry.
*
* @param logEntry Log entry.
* @returns Stringified message.
*/
static toString(logEntry: IVirtualConsoleLogEntry): string;
/**
* Gets the log entry icon.
*
* @param logEntry Log entry.
* @returns Icon.
*/
private static getLogEntryIcon;
/**
* Gets the log entry group tabbing.
*
* @param logEntry Log entry.
* @returns Tabbing.
*/
private static getLogEntryGroupTabbing;
/**
* Checks if the log entry content is collapsed.
*
* @param logEntry Log entry.
* @returns True if collapsed.
*/
private static isLogEntryCollapsed;
}
//# sourceMappingURL=VirtualConsoleLogEntryStringifier.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VirtualConsoleLogEntryStringifier.d.ts","sourceRoot":"","sources":["../../../src/console/utilities/VirtualConsoleLogEntryStringifier.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,MAAM,+BAA+B,CAAC;AAGpE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iCAAiC;IACrD;;;;;OAKG;WACW,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM;IA8BjE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IActC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAclC"}