convex
Version:
Client for the Convex Cloud
184 lines (183 loc) • 4.99 kB
JavaScript
;
import path from "path";
import prettier from "prettier";
import { functionsDir } from "./utils.js";
import { reactCodegen } from "../codegen_templates/react.js";
import {
dataModel,
dataModelWithoutSchema
} from "../codegen_templates/dataModel.js";
import { server } from "../codegen_templates/server.js";
import {
processTypeCheckResult,
typeCheckFile,
typeCheckFunctions
} from "./typecheck.js";
import { tsconfigCodegen } from "../codegen_templates/tsconfig.js";
import { readmeCodegen } from "../codegen_templates/readme.js";
import {
devDeploymentConfig,
prodDeploymentConfig
} from "../codegen_templates/clientConfig.js";
import { entryPoints } from "../../bundler/index.js";
function format(source, filetype) {
return prettier.format(source, { parser: filetype });
}
function writeFile(ctx, filename, source, dir, dryRun, debug, quiet, filetype = "typescript") {
const formattedSource = format(source, filetype);
const dest = path.join(dir, filename);
if (debug) {
console.log(`# ${dest}`);
console.log(formattedSource);
return;
}
if (dryRun) {
if (ctx.fs.exists(dest)) {
const fileText = ctx.fs.readUtf8File(dest);
if (fileText !== formattedSource) {
console.log(`Command would replace file: ${dest}`);
}
} else {
console.log(`Command would create file: ${dest}`);
}
return;
}
if (!quiet) {
console.log(`writing ${dest}`);
}
ctx.fs.writeUtf8File(dest, formattedSource);
}
function writeJsWithTypes(ctx, name, content, dir, dryRun, debug, quiet) {
writeFile(ctx, `${name}.d.ts`, content.DTS, dir, dryRun, debug, quiet);
writeFile(ctx, `${name}.js`, content.JS, dir, dryRun, debug, quiet);
}
function doServerCodegen(ctx, codegenDir, dryRun, hasSchemaFile, debug, quiet = false) {
if (hasSchemaFile) {
writeJsWithTypes(
ctx,
"dataModel",
dataModel,
codegenDir,
dryRun,
debug,
quiet
);
} else {
writeJsWithTypes(
ctx,
"dataModel",
dataModelWithoutSchema,
codegenDir,
dryRun,
debug,
quiet
);
}
writeJsWithTypes(ctx, "server", server, codegenDir, dryRun, debug, quiet);
}
async function doReactCodegen(ctx, functionsDir2, codegenDir, dryRun, debug, quiet = false) {
const modulePaths = (await entryPoints(ctx.fs, functionsDir2, false)).map(
(entryPoint) => path.relative(functionsDir2, entryPoint)
);
writeJsWithTypes(
ctx,
"react",
reactCodegen(modulePaths),
codegenDir,
dryRun,
debug,
quiet
);
}
export async function doCodegen({
ctx,
projectConfig,
configPath,
typeCheckMode,
deploymentType,
dryRun = false,
debug = false,
quiet = false
}) {
const funcDir = functionsDir(configPath, projectConfig);
const legacyCodegenPath = path.join(funcDir, "_generated.ts");
if (ctx.fs.exists(legacyCodegenPath)) {
if (!dryRun) {
console.log(`Deleting legacy codegen file: ${legacyCodegenPath}}`);
ctx.fs.unlink(legacyCodegenPath);
} else {
console.log(
`Command would delete legacy codegen file: ${legacyCodegenPath}}`
);
}
}
ctx.fs.mkdir(funcDir, { allowExisting: true });
const codegenDir = path.join(funcDir, "_generated");
if (!dryRun && !debug) {
ctx.fs.rm(codegenDir, { force: true, recursive: true });
ctx.fs.mkdir(codegenDir);
}
const schemaPath = path.join(funcDir, "schema.ts");
const hasSchemaFile = ctx.fs.exists(schemaPath);
writeJsWithTypes(
ctx,
"clientConfig",
deploymentType === "dev" ? devDeploymentConfig : prodDeploymentConfig(projectConfig),
codegenDir,
dryRun,
debug,
quiet
);
if (hasSchemaFile) {
await processTypeCheckResult(
ctx,
typeCheckMode,
() => typeCheckFile(ctx, path.join(funcDir, "schema.ts"))
);
}
doServerCodegen(ctx, codegenDir, dryRun, hasSchemaFile, debug, quiet);
await processTypeCheckResult(
ctx,
typeCheckMode,
() => typeCheckFunctions(ctx, funcDir)
);
await doReactCodegen(ctx, funcDir, codegenDir, dryRun, debug, quiet);
}
export function doInitCodegen(ctx, functionsDir2, convexPackageFromFunctions, quiet = false) {
const dryRun = false;
const debug = false;
doReadmeCodegen(ctx, functionsDir2, dryRun, debug, quiet);
doTsconfigCodegen(
ctx,
functionsDir2,
convexPackageFromFunctions,
dryRun,
debug,
quiet
);
}
export function doReadmeCodegen(ctx, functionsDir2, dryRun = false, debug = false, quiet = false) {
writeFile(
ctx,
"README.md",
readmeCodegen(),
functionsDir2,
dryRun,
debug,
quiet,
"markdown"
);
}
export function doTsconfigCodegen(ctx, functionsDir2, convexPackageFromFunctions, dryRun = false, debug = false, quiet = false) {
writeFile(
ctx,
"tsconfig.json",
tsconfigCodegen(convexPackageFromFunctions),
functionsDir2,
dryRun,
debug,
quiet,
"json"
);
}
//# sourceMappingURL=codegen.js.map