Skip to content

Commit

Permalink
feat(code-gen): support TypeScript target for router and database gen…
Browse files Browse the repository at this point in the history
…erators
  • Loading branch information
dirkdev98 committed Oct 9, 2024
1 parent b1d0982 commit c1739c1
Show file tree
Hide file tree
Showing 27 changed files with 1,778 additions and 765 deletions.
3 changes: 3 additions & 0 deletions gen/code-gen.js
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,11 @@ export function extendWithCodeGen(generator) {
"js",
"ts",
"jsKoaReceive",
"tsKoaReceive",
"jsKoaSend",
"tsKoaSend",
"jsPostgres",
"tsPostgres",
"jsAxios",
"tsAxios",
"jsAxiosNode",
Expand Down
51 changes: 13 additions & 38 deletions packages/cli/src/generated/cli/validators.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 18 additions & 12 deletions packages/code-gen/src/api-client/react-query.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,18 @@ export function reactQueryGetApiClientFile(generateContext, route) {
`${route.group}/reactQueries.tsx`,
{
importCollector: new JavascriptImportCollector(),
typeImportCollector: new JavascriptImportCollector(true),
},
);

const distilledTargetInfo = apiClientDistilledTargetInfo(generateContext);
const importCollector = JavascriptImportCollector.getImportCollector(file);
const typeImportCollector = JavascriptImportCollector.getImportCollector(
file,
true,
);

importCollector.destructure("../common/api-client-wrapper", "Pretty");
typeImportCollector.destructure("../common/api-client-wrapper", "Pretty");

if (distilledTargetInfo.useGlobalClients) {
// Import the global clients, this has affect on a bunch of the generated api's where we don't
Expand All @@ -146,27 +151,28 @@ export function reactQueryGetApiClientFile(generateContext, route) {
importCollector.destructure("@tanstack/react-query", "useQueryClient");

if (distilledTargetInfo.isAxios) {
importCollector.destructure("axios", "AxiosInstance");
typeImportCollector.destructure("axios", "AxiosInstance");
} else {
importCollector.destructure("../common/api-client", "FetchFn");
typeImportCollector.destructure("../common/api-client", "FetchFn");
}
}

// Error handling
importCollector.destructure("../common/api-client", "AppErrorResponse");
typeImportCollector.destructure("../common/api-client", "AppErrorResponse");

if (distilledTargetInfo.isAxios) {
importCollector.destructure("axios", "AxiosError");
importCollector.destructure("axios", "AxiosRequestConfig");
typeImportCollector.destructure("axios", "AxiosRequestConfig");
}

// @tanstack/react-query imports
importCollector.destructure("@tanstack/react-query", "QueryKey");
importCollector.destructure("@tanstack/react-query", "Updater");
importCollector.destructure("@tanstack/react-query", "UseMutationOptions");
importCollector.destructure("@tanstack/react-query", "UseMutationResult");
importCollector.destructure("@tanstack/react-query", "UseQueryOptions");
importCollector.destructure("@tanstack/react-query", "UseQueryResult");
typeImportCollector.destructure("@tanstack/react-query", "QueryKey");
typeImportCollector.destructure("@tanstack/react-query", "Updater");
typeImportCollector.destructure(
"@tanstack/react-query",
"UseMutationOptions",
);
typeImportCollector.destructure("@tanstack/react-query", "UseMutationResult");
typeImportCollector.destructure("@tanstack/react-query", "UseQueryOptions");
importCollector.destructure("@tanstack/react-query", "useMutation");
importCollector.destructure("@tanstack/react-query", "useQuery");
importCollector.destructure("@tanstack/react-query", "QueryClient");
Expand Down
21 changes: 15 additions & 6 deletions packages/code-gen/src/api-client/ts-axios.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,19 @@ export function tsAxiosGenerateCommonFile(generateContext) {
`common/api-client.ts${includeWrapper ? "x" : ""}`,
{
importCollector: new JavascriptImportCollector(),
typeImportCollector: new JavascriptImportCollector(true),
},
);

const importCollector = JavascriptImportCollector.getImportCollector(file);
const typeImportCollector = JavascriptImportCollector.getImportCollector(
file,
true,
);

if (generateContext.options.generators.apiClient?.target.globalClient) {
importCollector.raw(`import axios from "axios"`);
importCollector.destructure("axios", "AxiosInstance");
typeImportCollector.destructure("axios", "AxiosInstance");

fileWrite(
file,
Expand Down Expand Up @@ -92,20 +97,24 @@ export function tsAxiosGetApiClientFile(generateContext, route) {
`${route.group}/apiClient.ts`,
{
importCollector: new JavascriptImportCollector(),
typeImportCollector: new JavascriptImportCollector(true),
},
);

const importCollector = JavascriptImportCollector.getImportCollector(file);
importCollector.destructure("axios", "AxiosRequestConfig");
const typeImportCollector = JavascriptImportCollector.getImportCollector(
file,
true,
);

typeImportCollector.destructure("axios", "AxiosRequestConfig");

if (generateContext.options.generators.apiClient?.target.globalClient) {
importCollector.destructure(`../common/api-client`, "axiosInstance");
importCollector.destructure(`../common/api-client.js`, "axiosInstance");
} else {
importCollector.destructure("axios", "AxiosInstance");
typeImportCollector.destructure("axios", "AxiosInstance");
}

importCollector.destructure("../common/api-client", "AppErrorResponse");

return file;
}

Expand Down
39 changes: 27 additions & 12 deletions packages/code-gen/src/database/generator.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AppError, noop } from "@compas/stdlib";
import { AppError } from "@compas/stdlib";
import { structureModels } from "../processors/models.js";
import { targetCustomSwitch } from "../target/switcher.js";
import { typesCacheGet } from "../types/cache.js";
Expand All @@ -22,6 +22,18 @@ import {
jsPostgresGenerateWhere,
} from "./js-postgres.js";
import { databasePostgresWriteDDL } from "./postgres.js";
import {
tsPostgresCreateFile,
tsPostgresGenerateCount,
tsPostgresGenerateDelete,
tsPostgresGenerateInsert,
tsPostgresGenerateOrderBy,
tsPostgresGenerateQueryBuilder,
tsPostgresGenerateUpdate,
tsPostgresGenerateUpsertOnPrimaryKey,
tsPostgresGenerateUtils,
tsPostgresGenerateWhere,
} from "./ts-postgres.js";

/**
* @typedef {{
Expand Down Expand Up @@ -96,12 +108,15 @@ export function databaseGenerator(generateContext) {

const target = databaseFormatTarget(generateContext);
/** @type {Array<import("../generated/common/types.js").StructureAnyDefinitionTarget>} */
const typeTargets = ["js", "jsPostgres"];
const typeTargets =
generateContext.options.targetLanguage === "js" ?
["js", "jsPostgres"]
: ["ts", "tsPostgres"];

targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateUtils,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateUtils,
},
target,
[generateContext],
Expand All @@ -112,7 +127,7 @@ export function databaseGenerator(generateContext) {
const file = targetCustomSwitch(
{
jsPostgres: jsPostgresCreateFile,
tsPostgres: noop,
tsPostgres: tsPostgresCreateFile,
},
target,
[generateContext, model],
Expand Down Expand Up @@ -229,7 +244,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateWhere,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateWhere,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -238,7 +253,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateOrderBy,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateOrderBy,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -247,7 +262,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateCount,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateCount,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -257,7 +272,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateInsert,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateInsert,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -266,7 +281,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateUpsertOnPrimaryKey,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateUpsertOnPrimaryKey,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -275,7 +290,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateUpdate,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateUpdate,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -284,7 +299,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateDelete,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateDelete,
},
target,
[generateContext, file, model, contextNames],
Expand All @@ -294,7 +309,7 @@ export function databaseGenerator(generateContext) {
targetCustomSwitch(
{
jsPostgres: jsPostgresGenerateQueryBuilder,
tsPostgres: noop,
tsPostgres: tsPostgresGenerateQueryBuilder,
},
target,
[generateContext, file, model, contextNames],
Expand Down
Loading

0 comments on commit c1739c1

Please sign in to comment.