summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/api/schema.d.ts1422
-rw-r--r--client/package-lock.json289
-rw-r--r--client/package.json4
-rw-r--r--client/tsconfig.json3
4 files changed, 1716 insertions, 2 deletions
diff --git a/client/api/schema.d.ts b/client/api/schema.d.ts
new file mode 100644
index 0000000..f69f227
--- /dev/null
+++ b/client/api/schema.d.ts
@@ -0,0 +1,1422 @@
+/**
+ * This file was auto-generated by openapi-typescript.
+ * Do not make direct changes to the file.
+ */
+
+export interface paths {
+ "/healthcheck": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["healthcheck"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/login": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["login"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/logout": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["logout"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["project"];
+ put?: never;
+ post: operations["project_update"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}/new": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["project_new"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}/reviews": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["reviews"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}/translations": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["translation_reviews"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}/user/{userid}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["project_user_update"];
+ delete: operations["project_user_del"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/project/{projectid}/user/{userid}/new": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["project_user_add"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/projects": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["projects"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/review/{projectid}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["review_id"];
+ put?: never;
+ post?: never;
+ delete: operations["review_id_del"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/review/{projectid}/{branch}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["review"];
+ put?: never;
+ post?: never;
+ delete: operations["review_del"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/status": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["status"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/translation/{projectid}/new": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["translation_review_new"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/translation/{translation_reviewid}/strings": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["translation_review_strings"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/user/keys": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["user_keys"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/user/keys/add": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post: operations["user_key_add"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/user/keys/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["user_key_get"];
+ put?: never;
+ post?: never;
+ delete: operations["user_key_del"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/users": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get: operations["users"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+}
+export type webhooks = Record<string, never>;
+export interface components {
+ schemas: {
+ LocalizationPlaceholder: {
+ /** @example %1$d */
+ content: string;
+ /** @example 42 */
+ example: string;
+ /** @example NAME */
+ id: string;
+ };
+ LocalizationString: {
+ /** @example Generic greating */
+ description: string;
+ /** @example strings/strings.grd */
+ file: string;
+ /** @example IDS_GENERIC_WELCOME */
+ id: string;
+ /** @example This should be a positive greating */
+ meaning: string;
+ placeholder_offset: number[];
+ placeholders: components["schemas"]["LocalizationPlaceholder"][];
+ /** @example Hello! */
+ source: string;
+ translations: components["schemas"]["TranslationString"][];
+ };
+ LocalizationStrings: {
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example true */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ strings: components["schemas"]["LocalizationString"][];
+ /**
+ * Format: int32
+ * @example 42
+ */
+ total_count: number;
+ };
+ Login: {
+ password: string;
+ username: string;
+ };
+ Project: {
+ /** @example Example project */
+ description: string;
+ /** @example fake */
+ id: string;
+ /** @example main */
+ main_branch: string;
+ /** @example ssh://git.example.org/srv/git/ */
+ remote: string;
+ /** @example b3BlbNNz...AQIDBA== */
+ remote_key_abbrev: string;
+ /** @example FAKE: Features All Kids Erase */
+ title: string;
+ users: components["schemas"]["ProjectUserEntry"][];
+ };
+ ProjectData: {
+ /** @example Example project */
+ description?: string | null;
+ /** @example main */
+ main_branch?: string | null;
+ /** @example ssh://git.example.org/srv/git/ */
+ remote?: string | null;
+ /** @example b3BlbNNz...AQIDBA== */
+ remote_key?: string | null;
+ /** @example FAKE: Features All Kids Erase */
+ title?: string | null;
+ };
+ ProjectEntry: {
+ /** @example fake */
+ id: string;
+ /** @example FAKE: Features All Kids Erase */
+ title: string;
+ };
+ ProjectUserEntry: {
+ default_role: components["schemas"]["UserReviewRole"];
+ /** @example false */
+ maintainer: boolean;
+ user: components["schemas"]["User"];
+ };
+ ProjectUserEntryData: {
+ default_role?: null | components["schemas"]["UserReviewRole"];
+ /** @example false */
+ maintainer?: boolean | null;
+ };
+ Projects: {
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example false */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ projects: components["schemas"]["ProjectEntry"][];
+ /**
+ * Format: int32
+ * @example 1
+ */
+ total_count: number;
+ };
+ Review: {
+ /** @example false */
+ archived: boolean;
+ /** @example r/user/TASK-123456 */
+ branch: string;
+ /** @example We're adding more features because features are what we want. */
+ description: string;
+ /**
+ * Format: int64
+ * @example 1000
+ */
+ id: number;
+ owner: components["schemas"]["User"];
+ /**
+ * Format: float
+ * @example 37.5
+ */
+ progress: number;
+ state: components["schemas"]["ReviewState"];
+ /** @example FAKE-512: Add more features */
+ title: string;
+ users: components["schemas"]["ReviewUserEntry"][];
+ };
+ ReviewEntry: {
+ /** @example r/user/TASK-123456 */
+ branch: string;
+ /**
+ * Format: int64
+ * @example 1000
+ */
+ id: number;
+ owner: components["schemas"]["User"];
+ /**
+ * Format: float
+ * @example 37.5
+ */
+ progress: number;
+ state: components["schemas"]["ReviewState"];
+ /** @example FAKE-512: Add more features */
+ title: string;
+ };
+ /** @enum {string} */
+ ReviewState: "Draft" | "Open" | "Dropped" | "Closed";
+ ReviewUserEntry: {
+ role: components["schemas"]["UserReviewRole"];
+ user: components["schemas"]["User"];
+ };
+ Reviews: {
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example true */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ reviews: components["schemas"]["ReviewEntry"][];
+ /**
+ * Format: int32
+ * @example 42
+ */
+ total_count: number;
+ };
+ StatusResponse: {
+ ok: boolean;
+ };
+ TranslationReview: {
+ /** @example false */
+ archived: boolean;
+ /** @example d7c502b9c6b833060576a0c4da0287933d603011 */
+ base: string;
+ /** @example New translations */
+ description: string;
+ /** @example 2cecdec660a30bf3964cee645d9cee03640ef8dc */
+ head: string;
+ /**
+ * Format: int64
+ * @example 1
+ */
+ id: number;
+ owner: components["schemas"]["User"];
+ /**
+ * Format: float
+ * @example 37.5
+ */
+ progress: number;
+ state: components["schemas"]["ReviewState"];
+ /** @example FAKE-512: Update translations */
+ title: string;
+ users: components["schemas"]["ReviewUserEntry"][];
+ };
+ TranslationReviewData: {
+ /** @example d7c502b9c6b833060576a0c4da0287933d603011 */
+ base?: string | null;
+ /** @example New translations */
+ description: string;
+ /** @example FAKE-512: Update translations */
+ title: string;
+ };
+ TranslationReviewEntry: {
+ /** @example d7c502b9c6b833060576a0c4da0287933d603011 */
+ base: string;
+ /** @example 2cecdec660a30bf3964cee645d9cee03640ef8dc */
+ head: string;
+ /**
+ * Format: int64
+ * @example 1
+ */
+ id: number;
+ owner: components["schemas"]["User"];
+ /**
+ * Format: float
+ * @example 37.5
+ */
+ progress: number;
+ state: components["schemas"]["ReviewState"];
+ /** @example FAKE-512: Update translations */
+ title: string;
+ };
+ TranslationReviews: {
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example true */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ reviews: components["schemas"]["TranslationReviewEntry"][];
+ /**
+ * Format: int32
+ * @example 42
+ */
+ total_count: number;
+ };
+ /** @enum {string} */
+ TranslationState: "Unreviewed" | "Unchanged" | "Approved" | "Revert" | "Fix";
+ TranslationString: {
+ comment: string;
+ /** @example sv */
+ language: string;
+ placeholder_offset: number[];
+ reviewer?: null | components["schemas"]["User"];
+ state: components["schemas"]["TranslationState"];
+ /** @example Hej! */
+ translation: string;
+ };
+ User: {
+ /** @example true */
+ active: boolean;
+ /** @example jsmith */
+ id: string;
+ /** @example John Smith */
+ name: string;
+ };
+ UserKey: {
+ /** @example user@host 1970-01-01 */
+ comment: string;
+ /** @example AAAAfoobar== */
+ data: string;
+ /**
+ * Format: int64
+ * @example 1
+ */
+ id: number;
+ /** @example ssh-rsa */
+ kind: string;
+ };
+ UserKeyData: {
+ /** @example user@host 1970-01-01 */
+ comment?: string | null;
+ /** @example AAAAfoobar== */
+ data: string;
+ /** @example ssh-rsa */
+ kind: string;
+ };
+ UserKeys: {
+ keys: components["schemas"]["UserKey"][];
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example false */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ /**
+ * Format: int32
+ * @example 2
+ */
+ total_count: number;
+ };
+ /** @enum {string} */
+ UserReviewRole: "Reviewer" | "Watcher" | "None";
+ Users: {
+ /**
+ * Format: int32
+ * @example 10
+ */
+ limit: number;
+ /** @example true */
+ more: boolean;
+ /**
+ * Format: int32
+ * @example 0
+ */
+ offset: number;
+ /**
+ * Format: int32
+ * @example 42
+ */
+ total_count: number;
+ users: components["schemas"]["User"][];
+ };
+ };
+ responses: never;
+ parameters: never;
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
+}
+export type $defs = Record<string, never>;
+export interface operations {
+ healthcheck: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description All good */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ login: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/x-www-form-urlencoded": components["schemas"]["Login"];
+ };
+ };
+ responses: {
+ /** @description Login successful */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /** @example {
+ * "ok": true
+ * } */
+ "application/json": components["schemas"]["StatusResponse"];
+ };
+ };
+ /** @description Login failed */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /** @example {
+ * "error": "Unauthorized",
+ * "ok": false
+ * } */
+ "application/json": components["schemas"]["StatusResponse"];
+ };
+ };
+ };
+ };
+ logout: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Logout successful */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /** @example {
+ * "ok": true
+ * } */
+ "application/json": components["schemas"]["StatusResponse"];
+ };
+ };
+ };
+ };
+ project: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Project"];
+ };
+ };
+ /** @description No such project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ project_update: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["ProjectData"];
+ };
+ };
+ responses: {
+ /** @description Project updated */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ project_new: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["ProjectData"];
+ };
+ };
+ responses: {
+ /** @description Project created */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Project"];
+ };
+ };
+ /** @description Project with id already exists */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ reviews: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all reviews for project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Reviews"];
+ };
+ };
+ /** @description No such project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ translation_reviews: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all translation reviews for project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TranslationReviews"];
+ };
+ };
+ /** @description No such project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ project_user_update: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ userid: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["ProjectUserEntryData"];
+ };
+ };
+ responses: {
+ /** @description User updated in project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such project, no such user or user not in project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ project_user_del: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ userid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description User removed from project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such project, no such user or user not in project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ project_user_add: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ userid: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["ProjectUserEntryData"];
+ };
+ };
+ responses: {
+ /** @description User added to project */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such project */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description User already in project */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ projects: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all projects */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Projects"];
+ };
+ };
+ };
+ };
+ review_id: {
+ parameters: {
+ query: {
+ reviewid: number;
+ };
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get review */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Review"];
+ };
+ };
+ /** @description No such review */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ review_id_del: {
+ parameters: {
+ query: {
+ reviewid: number;
+ };
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Remove deleted */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Review is open or closed */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not owner of review or maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such review */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ review: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ branch: string;
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get review */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Review"];
+ };
+ };
+ /** @description No such review */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ review_del: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ branch: string;
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Review deleted */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Review is open or closed */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description Not owner of review or maintainer of project */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such review */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ status: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Current status */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /** @example {
+ * "ok": true
+ * } */
+ "application/json": components["schemas"]["StatusResponse"];
+ };
+ };
+ /** @description Not authorized */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ /** @example {
+ * "error": "Unauthorized",
+ * "ok": false
+ * } */
+ "application/json": components["schemas"]["StatusResponse"];
+ };
+ };
+ };
+ };
+ translation_review_new: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ projectid: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["TranslationReviewData"];
+ };
+ };
+ responses: {
+ /** @description Translation review created */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["TranslationReview"];
+ };
+ };
+ };
+ };
+ translation_review_strings: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path: {
+ translation_reviewid: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all strings for a translation review */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["LocalizationStrings"];
+ };
+ };
+ /** @description No such translation review */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ user_keys: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all keys for user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["UserKeys"];
+ };
+ };
+ };
+ };
+ user_key_add: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["UserKeyData"];
+ };
+ };
+ responses: {
+ /** @description Key added to current user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["UserKey"];
+ };
+ };
+ /** @description Key too large or invalid */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ user_key_get: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description User key */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["UserKey"];
+ };
+ };
+ /** @description No such key */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ user_key_del: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ id: number;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Key removed from current user */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ /** @description No such key for current user */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content?: never;
+ };
+ };
+ };
+ users: {
+ parameters: {
+ query?: {
+ limit?: number;
+ offset?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description Get all users */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["Users"];
+ };
+ };
+ };
+ };
+}
diff --git a/client/package-lock.json b/client/package-lock.json
index 3acbff5..3acc5b3 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -17,6 +17,7 @@
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.10.1",
"globals": "^16.3.0",
+ "openapi-typescript": "^7.8.0",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.3.3",
"svelte": "^5.35.0",
@@ -41,6 +42,31 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.5",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
@@ -815,6 +841,82 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@redocly/ajv": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz",
+ "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js-replace": "^1.0.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@redocly/ajv/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@redocly/config": {
+ "version": "0.22.2",
+ "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz",
+ "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@redocly/openapi-core": {
+ "version": "1.34.3",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.3.tgz",
+ "integrity": "sha512-3arRdUp1fNx55itnjKiUhO6t4Mf91TsrTIYINDNLAZPS0TPd5YpiXRctwjel0qqWoOOhjA34cZ3m4dksLDFUYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/ajv": "^8.11.2",
+ "@redocly/config": "^0.22.0",
+ "colorette": "^1.2.0",
+ "https-proxy-agent": "^7.0.5",
+ "js-levenshtein": "^1.1.6",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^5.0.1",
+ "pluralize": "^8.0.0",
+ "yaml-ast-parser": "0.0.43"
+ },
+ "engines": {
+ "node": ">=18.17.0",
+ "npm": ">=9.5.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@redocly/openapi-core/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.44.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz",
@@ -1489,6 +1591,16 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -1506,6 +1618,16 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -1607,6 +1729,13 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/chokidar": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
@@ -1653,6 +1782,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/colorette": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2214,6 +2350,20 @@
"node": ">=8"
}
},
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -2251,6 +2401,19 @@
"node": ">=0.8.19"
}
},
+ "node_modules/index-to-position": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz",
+ "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -2301,6 +2464,23 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -2529,6 +2709,40 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/openapi-typescript": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.8.0.tgz",
+ "integrity": "sha512-1EeVWmDzi16A+siQlo/SwSGIT7HwaFAVjvMA7/jG5HMLSnrUOzPL7uSTRZZa4v/LCRxHTApHKtNY6glApEoiUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@redocly/openapi-core": "^1.34.3",
+ "ansi-colors": "^4.1.3",
+ "change-case": "^5.4.4",
+ "parse-json": "^8.3.0",
+ "supports-color": "^10.0.0",
+ "yargs-parser": "^21.1.1"
+ },
+ "bin": {
+ "openapi-typescript": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "typescript": "^5.x"
+ }
+ },
+ "node_modules/openapi-typescript/node_modules/supports-color": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz",
+ "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/optionator": {
"version": "0.9.4",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -2592,6 +2806,24 @@
"node": ">=6"
}
},
+ "node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -2632,6 +2864,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -2851,6 +3093,16 @@
"url": "https://paulmillr.com/funding/"
}
},
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -3188,6 +3440,19 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
@@ -3235,6 +3500,13 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/uri-js-replace": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz",
+ "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -3404,6 +3676,23 @@
"node": ">= 14.6"
}
},
+ "node_modules/yaml-ast-parser": {
+ "version": "0.0.43",
+ "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
+ "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/client/package.json b/client/package.json
index 086213c..a09dab4 100644
--- a/client/package.json
+++ b/client/package.json
@@ -11,7 +11,8 @@
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"format": "prettier --write .",
- "lint": "prettier --check . && eslint ."
+ "lint": "prettier --check . && eslint .",
+ "openapi": "openapi-typescript http://127.0.0.1:8000/openapi/openapi.json -o api/schema.d.ts"
},
"devDependencies": {
"@eslint/compat": "^1.3.1",
@@ -23,6 +24,7 @@
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-svelte": "^3.10.1",
"globals": "^16.3.0",
+ "openapi-typescript": "^7.8.0",
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.3.3",
"svelte": "^5.35.0",
diff --git a/client/tsconfig.json b/client/tsconfig.json
index 19034e0..e99bb7b 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -9,7 +9,8 @@
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
- "moduleResolution": "bundler"
+ "moduleResolution": "bundler",
+ "noUncheckedIndexedAccess": true
}
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files