# Introduction Important note: for the moment testing this locally will require some hack due to latest twenty-sdk not being published. You will need to build twenty-cli and `cd packages/twenty-cli && yarn link` To finally sync the app in your app folder as `cd app-folder && twenty app sync` close https://github.com/twentyhq/core-team-issues/issues/1863 In this PR is introduced the generate sdk programmatic call to [genql](https://genql.dev/) exposed in a `client` barrel of `twenty-sdk` located in this package as there's high chances that will add a codegen layer above it at some point ? The cli calls this method after a sync application and writes a client in a generated folder. It will make a graql introspection query on the whole workspace. We should later improve that and only filter by current applicationId and its dependencies ( when twenty-standard application is introduced ) Fully typesafe ( input, output, filters etc ) auto-completed client ## Hello-world app serverless refactor <img width="2480" height="1326" alt="image" src="https://github.com/user-attachments/assets/b18ea372-b21d-4560-8fbc-1dc348427a95" /> --------- Co-authored-by: martmull <martmull@hotmail.fr>
59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import ts from 'typescript';
|
|
import { join } from 'path';
|
|
import {
|
|
createProgram,
|
|
formatDiagnosticsWithColorAndContext,
|
|
parseJsonConfigFileContent,
|
|
readConfigFile,
|
|
sys,
|
|
} from 'typescript';
|
|
|
|
const getProgramFromTsconfig = ({
|
|
appPath,
|
|
tsconfigPath = 'tsconfig.json',
|
|
}: {
|
|
appPath: string;
|
|
tsconfigPath?: string;
|
|
}) => {
|
|
const configFile = readConfigFile(join(appPath, tsconfigPath), sys.readFile);
|
|
if (configFile.error)
|
|
throw new Error(
|
|
formatDiagnosticsWithColorAndContext([configFile.error], {
|
|
getCanonicalFileName: (f) => f,
|
|
getCurrentDirectory: sys.getCurrentDirectory,
|
|
getNewLine: () => sys.newLine,
|
|
}),
|
|
);
|
|
const parsed = parseJsonConfigFileContent(configFile.config, sys, appPath);
|
|
if (parsed.errors.length) {
|
|
throw new Error(
|
|
formatDiagnosticsWithColorAndContext(parsed.errors, {
|
|
getCanonicalFileName: (f) => f,
|
|
getCurrentDirectory: sys.getCurrentDirectory,
|
|
getNewLine: () => sys.newLine,
|
|
}),
|
|
);
|
|
}
|
|
return createProgram(parsed.fileNames, parsed.options);
|
|
};
|
|
|
|
export const getTsProgramAndDiagnostics = async ({
|
|
appPath,
|
|
}: {
|
|
appPath: string;
|
|
}): Promise<{ program: ts.Program; diagnostics: ts.Diagnostic[] }> => {
|
|
const program = getProgramFromTsconfig({
|
|
appPath,
|
|
tsconfigPath: 'tsconfig.json',
|
|
});
|
|
|
|
return {
|
|
diagnostics: [
|
|
...program.getSyntacticDiagnostics(),
|
|
...program.getSemanticDiagnostics(),
|
|
...program.getGlobalDiagnostics(),
|
|
],
|
|
program,
|
|
};
|
|
};
|