diff --git a/packages/cli/src/generated/common/types.d.ts b/packages/cli/src/generated/common/types.d.ts index d30f54f517..209c9698b1 100644 --- a/packages/cli/src/generated/common/types.d.ts +++ b/packages/cli/src/generated/common/types.d.ts @@ -95,3 +95,5 @@ export type CliCompletion = "specification": "boolean"|"number"|"string"|"booleanOrString"; "description"?: string|undefined; }; + + diff --git a/packages/code-gen/package.json b/packages/code-gen/package.json index 91708aae42..0dbe9a5d5c 100644 --- a/packages/code-gen/package.json +++ b/packages/code-gen/package.json @@ -10,13 +10,7 @@ "./package.json": "./package.json" }, "type": "module", - "keywords": [ - "compas", - "generate", - "router", - "validation", - "code-gen" - ], + "keywords": ["compas", "generate", "router", "validation", "code-gen"], "license": "MIT", "dependencies": { "@compas/stdlib": "0.15.4" diff --git a/packages/code-gen/src/api-client/ts-axios.js b/packages/code-gen/src/api-client/ts-axios.js index fddb0e8200..328e91563f 100644 --- a/packages/code-gen/src/api-client/ts-axios.js +++ b/packages/code-gen/src/api-client/ts-axios.js @@ -29,6 +29,10 @@ export function tsAxiosGenerateCommonFile(generateContext) { { importCollector: new JavascriptImportCollector(), typeImportCollector: new JavascriptImportCollector(true), + contents: + generateContext.options.generators.router ? + `// @ts-nocheck\n\n` + : undefined, }, ); @@ -73,6 +77,61 @@ export function tsAxiosGenerateCommonFile(generateContext) { }>; `, ); + + if (generateContext.options.generators.router) { + importCollector.destructure("@compas/stdlib", "AppError"); + importCollector.destructure("@compas/stdlib", "streamToBuffer"); + + fileWrite( + file, + `/** + * Adds an interceptor to the provided Axios instance, wrapping any error in an AppError. + * This allows directly testing against an error key or property. + */ +export function axiosInterceptErrorAndWrapWithAppError(axiosInstance: AxiosInstance) { + axiosInstance.interceptors.response.use(undefined, async (error) => { + // Validator error + if (AppError.instanceOf(error)) { + // If it is an AppError already, it most likely is thrown by the response + // validators. So we rethrow it as is. + throw error; + } + + if (typeof error?.response?.data?.pipe === "function") { + const buffer = await streamToBuffer(error.response.data); + try { + error.response.data = JSON.parse(buffer.toString("utf-8")); + } catch { + // Unknown error + throw new AppError( + \`response.error\`, + error.response?.status ?? 500, + { + message: + "Could not decode the response body for further information.", + }, + error, + ); + } + } + + // Server AppError + const { key, info } = error.response?.data ?? {}; + if (typeof key === "string" && !!info && typeof info === "object") { + throw new AppError(key, error.response.status, info, error); + } + + // Unknown error + throw new AppError( + \`response.error\`, + error.response?.status ?? 500, + AppError.format(error), + ); + }); +} +`, + ); + } } /** diff --git a/packages/code-gen/src/crud/events.js b/packages/code-gen/src/crud/events.js index 46abc8631b..bb78c46531 100644 --- a/packages/code-gen/src/crud/events.js +++ b/packages/code-gen/src/crud/events.js @@ -30,10 +30,6 @@ import { * @param {import("../generate.js").GenerateContext} generateContext */ export function crudEventsGenerate(generateContext) { - if (generateContext.options.targetLanguage !== "js") { - return; - } - if (isNil(generateContext.options.generators.router?.target?.library)) { return; } @@ -96,9 +92,14 @@ function crudEventsGenerateForType(generateContext, file, crud) { * @param {import("../../types/advanced-types.d.ts").NamedType} crud */ function crudEventsFile(generateContext, crud) { - return fileContextCreateGeneric(generateContext, `${crud.group}/events.js`, { - importCollector: new JavascriptImportCollector(), - }); + return fileContextCreateGeneric( + generateContext, + `${crud.group}/events.${generateContext.options.targetLanguage}`, + { + importCollector: new JavascriptImportCollector(), + contents: "// @ts-nocheck\n\n", + }, + ); } /** diff --git a/packages/code-gen/src/crud/handlers.js b/packages/code-gen/src/crud/handlers.js index 9c0525e028..38fd4b2bfe 100644 --- a/packages/code-gen/src/crud/handlers.js +++ b/packages/code-gen/src/crud/handlers.js @@ -36,10 +36,6 @@ import { crudQueryBuilderGet } from "./query-builder.js"; * @param {import("../generate.js").GenerateContext} generateContext */ export function crudHandlersGenerate(generateContext) { - if (generateContext.options.targetLanguage !== "js") { - return; - } - if (isNil(generateContext.options.generators.router?.target?.library)) { return; } @@ -60,9 +56,14 @@ export function crudHandlersGenerate(generateContext) { * @param {import("../../types/advanced-types.d.ts").NamedType} crud */ function crudHandlersFile(generateContext, crud) { - return fileContextCreateGeneric(generateContext, `${crud.group}/crud.js`, { - importCollector: new JavascriptImportCollector(), - }); + return fileContextCreateGeneric( + generateContext, + `${crud.group}/crud.${generateContext.options.targetLanguage}`, + { + importCollector: new JavascriptImportCollector(), + contents: "// @ts-nocheck\n\n", + }, + ); } /** diff --git a/packages/code-gen/src/database/ts-postgres.js b/packages/code-gen/src/database/ts-postgres.js index b1bc10c345..d347016187 100644 --- a/packages/code-gen/src/database/ts-postgres.js +++ b/packages/code-gen/src/database/ts-postgres.js @@ -38,7 +38,7 @@ export function tsPostgresGenerateUtils(generateContext) { const indexFile = fileContextCreateGeneric( generateContext, - "common/database.js", + "common/database.ts", { importCollector: new JavascriptImportCollector(), typeImportCollector: new JavascriptImportCollector(true), diff --git a/packages/code-gen/src/generated/common/types.d.ts b/packages/code-gen/src/generated/common/types.d.ts index 52c8f7d8a1..0717431f47 100644 --- a/packages/code-gen/src/generated/common/types.d.ts +++ b/packages/code-gen/src/generated/common/types.d.ts @@ -1389,3 +1389,5 @@ export type StructureTypeDefinitionInput = |StructureReferenceDefinitionInput |StructureRelationDefinitionInput |StructureRouteInvalidationDefinitionInput; + + diff --git a/packages/create-compas/package.json b/packages/create-compas/package.json index ffaf41ee58..e17a84cc2a 100644 --- a/packages/create-compas/package.json +++ b/packages/create-compas/package.json @@ -9,10 +9,7 @@ "bin": { "create-compas": "src/create-compas.js" }, - "keywords": [ - "compas", - "create" - ], + "keywords": ["compas", "create"], "license": "MIT", "dependencies": { "@compas/stdlib": "0.15.4", diff --git a/packages/server/package.json b/packages/server/package.json index a5e08bca9d..a166dd4913 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -10,13 +10,7 @@ "./package.json": "./package.json" }, "type": "module", - "keywords": [ - "compas", - "koa", - "api", - "http", - "backend" - ], + "keywords": ["compas", "koa", "api", "http", "backend"], "license": "MIT", "dependencies": { "@compas/stdlib": "0.15.4", diff --git a/packages/stdlib/package.json b/packages/stdlib/package.json index f46d526884..4dcfd42ccb 100644 --- a/packages/stdlib/package.json +++ b/packages/stdlib/package.json @@ -10,12 +10,7 @@ "./package.json": "./package.json" }, "type": "module", - "keywords": [ - "compas", - "stdlib", - "standard", - "logger" - ], + "keywords": ["compas", "stdlib", "standard", "logger"], "license": "MIT", "dependencies": { "@types/node": "22.9.0", diff --git a/packages/store/package.json b/packages/store/package.json index d774580428..b69e3f7ab1 100644 --- a/packages/store/package.json +++ b/packages/store/package.json @@ -10,12 +10,7 @@ "./package.json": "./package.json" }, "type": "module", - "keywords": [ - "compas", - "s3", - "postgres", - "persistence" - ], + "keywords": ["compas", "s3", "postgres", "persistence"], "license": "MIT", "dependencies": { "@aws-sdk/client-s3": "3.689.0", diff --git a/packages/store/src/generated/common/types.d.ts b/packages/store/src/generated/common/types.d.ts index 94ba9b3a3b..2e4b538ea7 100644 --- a/packages/store/src/generated/common/types.d.ts +++ b/packages/store/src/generated/common/types.d.ts @@ -2505,3 +2505,5 @@ export type QueryExpansionStoreSessionStoreToken = { "session": QueryDefinitionStoreSessionStore; "accessToken"?: QueryDefinitionStoreSessionStoreToken|undefined; }; + +