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,26 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.asConst = void 0;
/**
* Returns the input parameter without muting it, but narrowing its inferred type. Similar to using the `as const` statement functionnally.
* @param input Input
* @returns Input, narrowly typed
*
* ```ts
* const object = { foo: "bar" }
* // { foo: string }
*
* const narrowedObject = asConst({ foo: "bar "})
* // => { foo: "bar" }
* ```
*/
var asConst = function asConst(input) {
return input;
};
exports.asConst = asConst;
//# sourceMappingURL=asConst.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/asConst.ts"],"names":["asConst","input"],"mappings":";;;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMA,OAAO,GAAG,SAAVA,OAAU,CAAQC,KAAR;AAAA,SAAgDA,KAAhD;AAAA,CAAhB","sourcesContent":["import type { Narrow } from \"~/type-utils\";\n\n/**\n * Returns the input parameter without muting it, but narrowing its inferred type. Similar to using the `as const` statement functionnally.\n * @param input Input\n * @returns Input, narrowly typed\n *\n * ```ts\n * const object = { foo: \"bar\" }\n * // { foo: string }\n *\n * const narrowedObject = asConst({ foo: \"bar \"})\n * // => { foo: \"bar\" }\n * ```\n */\nexport const asConst = <INPUT>(input: Narrow<INPUT>): Narrow<INPUT> => input;\n"],"file":"asConst.js"}

View File

@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "asConst", {
enumerable: true,
get: function get() {
return _asConst.asConst;
}
});
Object.defineProperty(exports, "wrapCompilerAsTypeGuard", {
enumerable: true,
get: function get() {
return _typeGuards.wrapCompilerAsTypeGuard;
}
});
Object.defineProperty(exports, "wrapValidatorAsTypeGuard", {
enumerable: true,
get: function get() {
return _typeGuards.wrapValidatorAsTypeGuard;
}
});
var _typeGuards = require("./type-guards");
var _asConst = require("./asConst");
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA;;AAIA","sourcesContent":["export type { $Compiler, Compiler, $Validator, Validator } from \"./type-guards\";\nexport {\n wrapCompilerAsTypeGuard,\n wrapValidatorAsTypeGuard,\n} from \"./type-guards\";\nexport { asConst } from \"./asConst\";\n"],"file":"index.js"}

View File

@@ -0,0 +1,52 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapCompilerAsTypeGuard = void 0;
/**
* Any compiler function type (non type-guarding)
*/
/**
* Adds type guarding to a validator function
*
* ```ts
* const compiler: Compiler = <S extends JSONSchema, T = FromSchema<S>>(
* schema: S,
* ) => (data: unknown): data is T => {
* const isDataValid: boolean = ... // Implement validation here
* return isDataValid;
* };
* ```
*/
/**
* Type definition for `wrapCompilerAsTypeGuard`
*/
/**
* Adds type guarding to any compiler function (doesn't modify it)
* @param compiler Compiler function
* @returns Compiler function with type guarding
*/
var wrapCompilerAsTypeGuard = function wrapCompilerAsTypeGuard(compiler) {
return function (schema) {
for (var _len = arguments.length, compilingOptions = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
compilingOptions[_key - 1] = arguments[_key];
}
var validator = compiler.apply(void 0, [schema].concat(compilingOptions));
return function (data) {
for (var _len2 = arguments.length, validationOptions = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
validationOptions[_key2 - 1] = arguments[_key2];
}
return validator.apply(void 0, [data].concat(validationOptions));
};
};
};
exports.wrapCompilerAsTypeGuard = wrapCompilerAsTypeGuard;
//# sourceMappingURL=compiler.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/type-guards/compiler.ts"],"names":["wrapCompilerAsTypeGuard","compiler","schema","compilingOptions","validator","data","validationOptions"],"mappings":";;;;;;;AAOA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACO,IAAMA,uBAAwC,GACnD,SADWA,uBACX,CAKEC,QALF;AAAA,SAOA,UACEC,MADF,EAGK;AAAA,sCADAC,gBACA;AADAA,MAAAA,gBACA;AAAA;;AACH,QAAMC,SAAS,GAAGH,QAAQ,MAAR,UAASC,MAAT,SAAoBC,gBAApB,EAAlB;AAEA,WAAO,UAACE,IAAD;AAAA,yCAAmBC,iBAAnB;AAAmBA,QAAAA,iBAAnB;AAAA;;AAAA,aACLF,SAAS,MAAT,UAAUC,IAAV,SAAmBC,iBAAnB,EADK;AAAA,KAAP;AAED,GAfD;AAAA,CADK","sourcesContent":["import type {\n FromSchema,\n FromSchemaDefaultOptions,\n FromSchemaOptions,\n JSONSchema,\n} from \"~/index\";\n\n/**\n * Any compiler function type (non type-guarding)\n */\nexport type $Compiler<C extends unknown[] = [], V extends unknown[] = []> = (\n schema: JSONSchema,\n ...compilingOptions: C\n) => (data: unknown, ...validationOptions: V) => boolean;\n\n/**\n * Adds type guarding to a validator function\n *\n * ```ts\n * const compiler: Compiler = <S extends JSONSchema, T = FromSchema<S>>(\n * schema: S,\n * ) => (data: unknown): data is T => {\n * const isDataValid: boolean = ... // Implement validation here\n * return isDataValid;\n * };\n * ```\n */\nexport type Compiler<\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n C extends unknown[] = [],\n V extends unknown[] = [],\n> = <S extends JSONSchema, T = FromSchema<S, O>>(\n schema: S,\n ...compilingOptions: C\n) => (data: unknown, ...validationOptions: V) => data is T;\n\n/**\n * Type definition for `wrapCompilerAsTypeGuard`\n */\ntype CompilerWrapper = <\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n C extends unknown[] = [],\n V extends unknown[] = [],\n>(\n compiler: $Compiler<C, V>,\n) => Compiler<O, C, V>;\n\n/**\n * Adds type guarding to any compiler function (doesn't modify it)\n * @param compiler Compiler function\n * @returns Compiler function with type guarding\n */\nexport const wrapCompilerAsTypeGuard: CompilerWrapper =\n <\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n C extends unknown[] = [],\n V extends unknown[] = [],\n >(\n compiler: $Compiler<C, V>,\n ) =>\n <S extends JSONSchema, T = FromSchema<S, O>>(\n schema: S,\n ...compilingOptions: C\n ) => {\n const validator = compiler(schema, ...compilingOptions);\n\n return (data: unknown, ...validationOptions: V): data is T =>\n validator(data, ...validationOptions);\n };\n"],"file":"compiler.js"}

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "wrapCompilerAsTypeGuard", {
enumerable: true,
get: function get() {
return _compiler.wrapCompilerAsTypeGuard;
}
});
Object.defineProperty(exports, "wrapValidatorAsTypeGuard", {
enumerable: true,
get: function get() {
return _validator.wrapValidatorAsTypeGuard;
}
});
var _compiler = require("./compiler");
var _validator = require("./validator");
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/type-guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA;;AAEA","sourcesContent":["export type { $Compiler, Compiler } from \"./compiler\";\nexport { wrapCompilerAsTypeGuard } from \"./compiler\";\nexport type { $Validator, Validator } from \"./validator\";\nexport { wrapValidatorAsTypeGuard } from \"./validator\";\n"],"file":"index.js"}

View File

@@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.wrapValidatorAsTypeGuard = void 0;
/**
* Any validator function type (non type-guarding)
*/
/**
* Adds type guarding to a validator function
*
* ```ts
* const validate: Validator = <S extends JSONSchema, T = FromSchema<S>>(
* schema: S,
* data: unknown
* ): data is T => {
* const isDataValid: boolean = ... // Implement validation here
* return isDataValid;
* };
* ```
*/
/**
* Type definition for wrapValidatorAsTypeGuard
*/
/**
* Adds type guarding to any validator function (doesn't modify it)
* @param validator Validator function
* @returns Validator function with type guarding
*/
var wrapValidatorAsTypeGuard = function wrapValidatorAsTypeGuard(validator) {
return function (schema, data) {
for (var _len = arguments.length, validationOptions = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
validationOptions[_key - 2] = arguments[_key];
}
return validator.apply(void 0, [schema, data].concat(validationOptions));
};
};
exports.wrapValidatorAsTypeGuard = wrapValidatorAsTypeGuard;
//# sourceMappingURL=validator.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/utils/type-guards/validator.ts"],"names":["wrapValidatorAsTypeGuard","validator","schema","data","validationOptions"],"mappings":";;;;;;;AAOA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACO,IAAMA,wBAA0C,GACrD,SADWA,wBACX,CAIEC,SAJF;AAAA,SAMA,UACEC,MADF,EAEEC,IAFF;AAAA,sCAGKC,iBAHL;AAGKA,MAAAA,iBAHL;AAAA;;AAAA,WAKEH,SAAS,MAAT,UAAUC,MAAV,EAAkBC,IAAlB,SAA2BC,iBAA3B,EALF;AAAA,GANA;AAAA,CADK","sourcesContent":["import type {\n FromSchema,\n FromSchemaDefaultOptions,\n FromSchemaOptions,\n JSONSchema,\n} from \"~/index\";\n\n/**\n * Any validator function type (non type-guarding)\n */\nexport type $Validator<V extends unknown[] = []> = (\n schema: JSONSchema,\n data: unknown,\n ...validationOptions: V\n) => boolean;\n\n/**\n * Adds type guarding to a validator function\n *\n * ```ts\n * const validate: Validator = <S extends JSONSchema, T = FromSchema<S>>(\n * schema: S,\n * data: unknown\n * ): data is T => {\n * const isDataValid: boolean = ... // Implement validation here\n * return isDataValid;\n * };\n * ```\n */\nexport type Validator<\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n V extends unknown[] = [],\n> = <S extends JSONSchema, T = FromSchema<S, O>>(\n schema: S,\n data: unknown,\n ...validationOptions: V\n) => data is T;\n\n/**\n * Type definition for wrapValidatorAsTypeGuard\n */\ntype ValidatorWrapper = <\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n V extends unknown[] = [],\n>(\n validator: $Validator<V>,\n) => Validator<O, V>;\n\n/**\n * Adds type guarding to any validator function (doesn't modify it)\n * @param validator Validator function\n * @returns Validator function with type guarding\n */\nexport const wrapValidatorAsTypeGuard: ValidatorWrapper =\n <\n O extends FromSchemaOptions = FromSchemaDefaultOptions,\n V extends unknown[] = [],\n >(\n validator: $Validator<V>,\n ) =>\n <S extends JSONSchema, T = FromSchema<S, O>>(\n schema: S,\n data: unknown,\n ...validationOptions: V\n ): data is T =>\n validator(schema, data, ...validationOptions);\n"],"file":"validator.js"}