@proofkit/typegen
Version:
`@proofkit/typegen` is a tool for generating TypeScript types from FileMaker database schemas, making it easier to work with FileMaker data in modern TypeScript projects.
134 lines (133 loc) • 4.97 kB
JavaScript
import { VariableDeclarationKind } from "ts-morph";
import { defaultEnvNames } from "./constants.js";
function buildLayoutClient(sourceFile, args) {
var _a, _b;
const {
schemaName,
portalSchema,
envNames,
type,
webviewerScriptName,
layoutName
} = args;
const fmdapiImport = sourceFile.addImportDeclaration({
moduleSpecifier: "@proofkit/fmdapi",
namedImports: ["DataApi"]
});
const hasPortals = (portalSchema ?? []).length > 0;
if (webviewerScriptName) {
sourceFile.addImportDeclaration({
moduleSpecifier: `@proofkit/webviewer/adapter`,
namedImports: ["WebViewerAdapter"]
});
} else if (typeof envNames.auth === "object" && "apiKey" in envNames.auth) {
fmdapiImport.addNamedImports([
{ name: "OttoAdapter" },
{ name: "OttoAPIKey", isTypeOnly: true }
]);
} else {
fmdapiImport.addNamedImport({ name: "FetchAdapter" });
}
if (type === "zod" || type === "zod/v4" || type === "zod/v3") {
const schemaImport = sourceFile.addImportDeclaration({
moduleSpecifier: `../${schemaName}`,
namedImports: [{ name: `Z${schemaName}` }]
});
if (hasPortals) {
schemaImport.addNamedImport(`Z${schemaName}Portals`);
}
} else if (type === "ts") {
const schemaImport = sourceFile.addImportDeclaration({
moduleSpecifier: `../${schemaName}`,
namedImports: [{ name: `T${schemaName}` }]
});
if (hasPortals) {
schemaImport.addNamedImport(`T${schemaName}Portals`);
}
}
if (!webviewerScriptName) {
addTypeGuardStatements(sourceFile, {
envVarName: envNames.db ?? defaultEnvNames.db
});
addTypeGuardStatements(sourceFile, {
envVarName: envNames.server ?? defaultEnvNames.server
});
if (typeof envNames.auth === "object" && "apiKey" in envNames.auth) {
addTypeGuardStatements(sourceFile, {
envVarName: envNames.auth.apiKey ?? defaultEnvNames.apiKey
});
} else if (typeof envNames.auth === "object" && "username" in envNames.auth) {
addTypeGuardStatements(sourceFile, {
envVarName: ((_a = envNames.auth) == null ? void 0 : _a.username) ?? defaultEnvNames.username
});
addTypeGuardStatements(sourceFile, {
envVarName: ((_b = envNames.auth) == null ? void 0 : _b.password) ?? defaultEnvNames.password
});
}
}
sourceFile.addVariableStatement({
declarationKind: VariableDeclarationKind.Const,
isExported: true,
declarations: [
{
name: "client",
initializer: (writer) => {
writer.write(
type === "ts" ? hasPortals ? `DataApi<T${schemaName}, T${schemaName}Portals>(` : `DataApi<T${schemaName}>(` : `DataApi(`
).inlineBlock(() => {
writer.write(`adapter: `);
buildAdapter(writer, args);
writer.write(",").newLine();
writer.write(`layout: `).quote(layoutName).write(`,`).newLine();
if (type === "zod" || type === "zod/v4" || type === "zod/v3") {
writer.writeLine(
`schema: { fieldData: Z${schemaName}${hasPortals ? `, portalData: Z${schemaName}Portals` : ""} },`
);
}
}).write(")");
}
}
]
});
}
function addTypeGuardStatements(sourceFile, { envVarName }) {
sourceFile.addStatements((writer) => {
writer.writeLine(
`if (!process.env.${envVarName}) throw new Error("Missing env var: ${envVarName}")`
);
});
}
function buildAdapter(writer, args) {
const { envNames, webviewerScriptName } = args;
if (webviewerScriptName) {
writer.write(`new WebViewerAdapter({scriptName: `);
writer.quote(webviewerScriptName);
writer.write("})");
} else if (typeof envNames.auth === "object" && "apiKey" in envNames.auth) {
writer.write(`new OttoAdapter(`).inlineBlock(() => {
if (typeof envNames.auth !== "object" || !("apiKey" in envNames.auth))
return;
writer.write(
`auth: { apiKey: process.env.${envNames.auth.apiKey} as OttoAPIKey }`
).write(",").newLine();
writer.write(`db: process.env.${envNames.db}`).write(",").newLine();
writer.write(`server: process.env.${envNames.server}`).write(",").newLine();
}).write(`)`);
} else {
writer.write(`new FetchAdapter(`).inlineBlock(() => {
if (typeof envNames.auth !== "object" || !("apiKey" in envNames.auth))
return;
writer.writeLine(`auth:`).inlineBlock(() => {
if (typeof envNames.auth !== "object" || !("username" in envNames.auth))
return;
writer.write(`username: process.env.${envNames.auth.username}`).write(",").newLine();
writer.write(`password: process.env.${envNames.auth.password}`);
}).write(",").writeLine(`db: process.env.${envNames.db},`).writeLine(`server: process.env.${envNames.server}`);
}).write(")");
}
return writer.toString();
}
export {
buildLayoutClient
};
//# sourceMappingURL=buildLayoutClient.js.map