Skip to content

Commit

Permalink
fix(artifacts): better typings to satisfy TS compiler (#4502)
Browse files Browse the repository at this point in the history
* fix(artifacts): better typings to satisfy TS compiler

* chore(dependencies): updated changesets for modified dependencies

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
ardatan and github-actions[bot] committed Sep 15, 2022
1 parent b895162 commit 82f4b24
Show file tree
Hide file tree
Showing 8 changed files with 99 additions and 69 deletions.
7 changes: 7 additions & 0 deletions .changeset/@graphql-mesh_http-4502-dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@graphql-mesh/http": patch
---

dependencies updates:

- Added dependency [`@graphql-mesh/types@0.84.0` ↗︎](https://www.npmjs.com/package/@graphql-mesh/types/v/0.84.0) (to `dependencies`)
7 changes: 7 additions & 0 deletions .changeset/thick-spies-tan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@graphql-mesh/cli': patch
'@graphql-mesh/config': patch
'@graphql-mesh/http': patch
---

Fix TS issues on artifacts
2 changes: 0 additions & 2 deletions packages/cli/src/commands/serve/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,7 @@ export async function serveMesh(

const requestHandler = createMeshHTTPHandler({
baseDir,
argsPort,
getBuiltMesh,
logger,
rawServeConfig,
playgroundTitle,
});
Expand Down
103 changes: 45 additions & 58 deletions packages/cli/src/commands/ts-artifacts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ class CodegenHelpers extends tsBasePlugin.TsVisitor {

function buildSignatureBasedOnRootFields(
codegenHelpers: CodegenHelpers,
type: Maybe<GraphQLObjectType>,
namespace: string
type: Maybe<GraphQLObjectType>
): Record<string, string> {
if (!type) {
return {};
Expand All @@ -41,7 +40,7 @@ function buildSignatureBasedOnRootFields(
for (const fieldName in fields) {
const field = fields[fieldName];
const argsExists = field.args && field.args.length > 0;
const argsName = argsExists ? `${namespace}.${type.name}${field.name}Args` : '{}';
const argsName = argsExists ? `${type.name}${field.name}Args` : '{}';
const parentTypeNode: NamedTypeNode = {
kind: Kind.NAMED_TYPE,
name: {
Expand All @@ -52,7 +51,7 @@ function buildSignatureBasedOnRootFields(

operationMap[fieldName] = ` /** ${field.description} **/\n ${
field.name
}: InContextSdkMethod<${namespace}.${codegenHelpers.getTypeToUse(
}: InContextSdkMethod<${codegenHelpers.getTypeToUse(
parentTypeNode
)}['${fieldName}'], ${argsName}, ${unifiedContextIdentifier}>`;
}
Expand Down Expand Up @@ -88,60 +87,43 @@ async function generateTypesForApi(options: {
});
const codegenHelpers = new CodegenHelpers(options.schema, config, {});
const namespace = pascalCase(`${options.name}Types`);
const sdkIdentifier = pascalCase(`${options.name}Sdk`);
const contextIdentifier = pascalCase(`${options.name}Context`);
const queryOperationMap = buildSignatureBasedOnRootFields(codegenHelpers, options.schema.getQueryType(), namespace);
const mutationOperationMap = buildSignatureBasedOnRootFields(
codegenHelpers,
options.schema.getMutationType(),
namespace
);
const queryOperationMap = buildSignatureBasedOnRootFields(codegenHelpers, options.schema.getQueryType());
const mutationOperationMap = buildSignatureBasedOnRootFields(codegenHelpers, options.schema.getMutationType());
const subscriptionsOperationMap = buildSignatureBasedOnRootFields(
codegenHelpers,
options.schema.getSubscriptionType(),
namespace
options.schema.getSubscriptionType()
);

const sdk = {
identifier: sdkIdentifier,
codeAst: `
const codeAst = `
import { InContextSdkMethod } from '@graphql-mesh/types';
import { MeshContext } from '@graphql-mesh/runtime';
export namespace ${namespace} {
${baseTypes}
}
export type Query${sdkIdentifier} = {
${Object.values(queryOperationMap).join(',\n')}
};
export type QuerySdk = {
${Object.values(queryOperationMap).join(',\n')}
};
export type Mutation${sdkIdentifier} = {
${Object.values(mutationOperationMap).join(',\n')}
};
export type MutationSdk = {
${Object.values(mutationOperationMap).join(',\n')}
};
export type Subscription${sdkIdentifier} = {
${Object.values(subscriptionsOperationMap).join(',\n')}
};`,
export type SubscriptionSdk = {
${Object.values(subscriptionsOperationMap).join(',\n')}
};
const context = {
identifier: contextIdentifier,
codeAst: `export type ${contextIdentifier} = {
[${JSON.stringify(
options.name
)}]: { Query: Query${sdkIdentifier}, Mutation: Mutation${sdkIdentifier}, Subscription: Subscription${sdkIdentifier} },
export type Context = {
[${JSON.stringify(options.name)}]: { Query: QuerySdk, Mutation: MutationSdk, Subscription: SubscriptionSdk },
${Object.keys(options.contextVariables)
.map(key => `[${JSON.stringify(key)}]: ${options.contextVariables[key]}`)
.join(',\n')}
};`,
};

const imports = [contextIdentifier];
};
}
`;

return {
imports,
sdk,
context,
identifier: namespace,
codeAst,
};
}

Expand Down Expand Up @@ -254,38 +236,43 @@ export async function generateTsArtifacts(
`import { getMesh, ExecuteMeshFn, SubscribeMeshFn, MeshContext as BaseMeshContext, MeshInstance } from '@graphql-mesh/runtime';`,
`import { MeshStore, FsStoreStorageAdapter } from '@graphql-mesh/store';`,
`import { path as pathModule } from '@graphql-mesh/cross-helpers';`,
`import { ImportFn } from '@graphql-mesh/types';`,
]);
const results = await Promise.all(
rawSources.map(async source => {
const sourceMap = unifiedSchema.extensions.sourceMap as Map<RawSourceOutput, GraphQLSchema>;
const sourceSchema = sourceMap.get(source);
const item = await generateTypesForApi({
const { identifier, codeAst } = await generateTypesForApi({
schema: sourceSchema,
name: source.name,
contextVariables: source.contextVariables,
});
if (item) {
const content = item.sdk.codeAst + '\n' + item.context.codeAst;

if (codeAst) {
const content = '// @ts-nocheck\n' + codeAst;
await writeFile(pathModule.join(artifactsDir, `sources/${source.name}/types.ts`), content);
if (item.imports) {
importCodes.add(
`import type { ${item.imports.join(', ')} } from './sources/${source.name}/types';`
);
}
}
return item;

if (identifier) {
importCodes.add(`import type { ${identifier} } from './sources/${source.name}/types';`);
}

return {
identifier,
codeAst,
};
})
);

const contextType = `export type ${unifiedContextIdentifier} = ${results
.map(r => r?.context?.identifier)
.map(r => `${r?.identifier}.Context`)
.filter(Boolean)
.join(' & ')} & BaseMeshContext;`;

let meshMethods = `
${BASEDIR_ASSIGNMENT_COMMENT}
const importFn = (moduleId: string) => {
const importFn: ImportFn = <T>(moduleId: string) => {
const relativeModuleId = (pathModule.isAbsolute(moduleId) ? pathModule.relative(baseDir, moduleId) : moduleId).split('\\\\').join('/').replace(baseDir + '/', '');
switch(relativeModuleId) {${[...importedModulesSet]
.map(importedModuleName => {
Expand All @@ -300,7 +287,7 @@ const importFn = (moduleId: string) => {
}
return `
case ${JSON.stringify(moduleMapProp)}:
return import(${JSON.stringify(importPath)});
return import(${JSON.stringify(importPath)}) as T;
`;
})
.join('')}
Expand All @@ -320,14 +307,14 @@ const rootStore = new MeshStore('${cliParams.artifactsDir}', new FsStoreStorageA
${[...meshConfigCodes].join('\n')}
let meshInstance$: Promise<MeshInstance<MeshContext>>;
let meshInstance$: Promise<MeshInstance> | undefined;
export function ${cliParams.builtMeshFactoryName}(): Promise<MeshInstance<MeshContext>> {
export function ${cliParams.builtMeshFactoryName}(): Promise<MeshInstance> {
if (meshInstance$ == null) {
meshInstance$ = getMeshOptions().then(meshOptions => getMesh<MeshContext>(meshOptions)).then(mesh => {
const id$ = mesh.pubsub.subscribe('destroy', () => {
meshInstance$ = getMeshOptions().then(meshOptions => getMesh(meshOptions)).then(mesh => {
const id = mesh.pubsub.subscribe('destroy', () => {
meshInstance$ = undefined;
id$.then(id => mesh.pubsub.unsubscribe(id)).catch(err => console.error(err));
mesh.pubsub.unsubscribe(id);
});
return mesh;
});
Expand All @@ -347,7 +334,7 @@ export const subscribe: SubscribeMeshFn = (...args) => ${
meshMethods += `
export function ${cliParams.builtMeshSDKFactoryName}<TGlobalContext = any, TOperationContext = any>(globalContext?: TGlobalContext) {
const sdkRequester$ = ${cliParams.builtMeshFactoryName}().then(({ sdkRequesterFactory }) => sdkRequesterFactory(globalContext));
return getSdk<TOperationContext>((...args) => sdkRequester$.then(sdkRequester => sdkRequester(...args)));
return getSdk<TOperationContext, TGlobalContext>((...args) => sdkRequester$.then(sdkRequester => sdkRequester(...args)));
}`;
}

Expand Down
8 changes: 5 additions & 3 deletions packages/config/src/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,11 @@ export async function processConfig(
importCodes.add(fetchFnImportCode);
codes.add(fetchFnCode);

codes.add(`const sources = [];`);
codes.add(`const transforms = [];`);
codes.add(`const additionalEnvelopPlugins = [];`);
importCodes.add(`import { MeshResolvedSource } from '@graphql-mesh/runtime';`);
codes.add(`const sources: MeshResolvedSource[] = [];`);
importCodes.add(`import { MeshTransform, MeshPlugin } from '@graphql-mesh/types';`);
codes.add(`const transforms: MeshTransform[] = [];`);
codes.add(`const additionalEnvelopPlugins: MeshPlugin<any>[] = [];`);

const [sources, transforms, additionalEnvelopPlugins, additionalTypeDefs, additionalResolvers, documents] =
await Promise.all([
Expand Down
1 change: 1 addition & 0 deletions packages/http/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
"@graphql-mesh/cross-helpers": "0.2.6",
"@graphql-mesh/runtime": "0.44.9",
"@graphql-mesh/utils": "0.41.11",
"@graphql-mesh/types": "0.84.0",
"graphql-yoga": "3.0.0-alpha-20220905163021-e923bb34",
"itty-router": "2.6.1",
"itty-router-extras": "0.4.2",
Expand Down
15 changes: 11 additions & 4 deletions packages/http/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { fs, path, process } from '@graphql-mesh/cross-helpers';
import { ServeMeshOptions } from '@graphql-mesh/runtime';
import { pathExists } from '@graphql-mesh/utils';
import { MeshInstance } from '@graphql-mesh/runtime';
import { Logger, YamlConfig } from '@graphql-mesh/types';
import { DefaultLogger, pathExists } from '@graphql-mesh/utils';
import { createServerAdapter, ServerAdapter } from '@whatwg-node/server';
import { Router } from 'itty-router';
import { withCookies } from 'itty-router-extras';
Expand All @@ -10,13 +11,19 @@ import { Response } from '@whatwg-node/fetch';
export function createMeshHTTPHandler<TServerContext>({
baseDir,
getBuiltMesh,
logger,
rawServeConfig = {},
playgroundTitle,
}: ServeMeshOptions): ServerAdapter<TServerContext, Router<Request>> {
}: {
baseDir: string;
getBuiltMesh: () => Promise<MeshInstance>;
rawServeConfig?: YamlConfig.Config['serve'];
playgroundTitle?: string;
}): ServerAdapter<TServerContext, Router<Request>> {
let readyFlag = false;
let logger: Logger = new DefaultLogger('Mesh HTTP');
const mesh$ = getBuiltMesh().then(mesh => {
readyFlag = true;
logger = mesh.logger.child('HTTP');
return mesh;
});

Expand Down
25 changes: 23 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2329,7 +2329,7 @@
tslib "^2.4.0"
value-or-promise "1.0.11"

"@graphql-tools/code-file-loader@7.3.6", "@graphql-tools/code-file-loader@^7.3.0":
"@graphql-tools/code-file-loader@7.3.6":
version "7.3.6"
resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.3.6.tgz#3e6bdd4dc93c592be3d6fbcc2c2bad1228ca0f8d"
integrity sha512-PNWWSwSuQAqANerDwS0zdQ5FPipirv75TjjzBHnY+6AF/WvKq5sQiUQheA2P7B+MZc/KdQ7h/JAGMQOhKNVA+Q==
Expand All @@ -2340,6 +2340,17 @@
tslib "^2.4.0"
unixify "^1.0.0"

"@graphql-tools/code-file-loader@^7.3.0":
version "7.3.5"
resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-7.3.5.tgz#d4abd86ce884b932b16828057170471f91a3110c"
integrity sha512-pLvMraoDKo/bvkAajvrOwLzmV0rnTvKlk23fH3JBtgzTj55M3MwiS12d60ZPMkTV97hWTq/ZH5AxgoDaXZm0xg==
dependencies:
"@graphql-tools/graphql-tag-pluck" "7.3.5"
"@graphql-tools/utils" "8.11.0"
globby "^11.0.3"
tslib "^2.4.0"
unixify "^1.0.0"

"@graphql-tools/delegate@6.1.0":
version "6.1.0"
resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-6.1.0.tgz#ceda597f091d5aed8065df3cea8d59858e35782e"
Expand Down Expand Up @@ -2473,7 +2484,7 @@
"@graphql-tools/utils" "8.12.0"
tslib "^2.4.0"

"@graphql-tools/mock@8.7.6", "@graphql-tools/mock@^8.7.0":
"@graphql-tools/mock@8.7.6":
version "8.7.6"
resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.6.tgz#701d898f7fe6c22e40d6d80e25874e464359ce11"
integrity sha512-cQGPyY6dF4x28552zjAg9En2WWVury62u1/xzipCNUSCdKRVOsAupTNBcAGdMjsKPLcGzzk1cPA8dP0DUfNqzg==
Expand All @@ -2483,6 +2494,16 @@
fast-json-stable-stringify "^2.1.0"
tslib "^2.4.0"

"@graphql-tools/mock@^8.7.0":
version "8.7.5"
resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.5.tgz#545bf825eba59d982d7c632705d06ca5c785a35d"
integrity sha512-bmXXRoQE/v+zXjLdcpW4zF5ufKZG9uLlDH0qsYpasEDbgGS35DIrhqgOx3T23AynlsWzrWyMgiAiTz3/s0GAKw==
dependencies:
"@graphql-tools/schema" "9.0.3"
"@graphql-tools/utils" "8.11.0"
fast-json-stable-stringify "^2.1.0"
tslib "^2.4.0"

"@graphql-tools/optimize@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-1.3.0.tgz#11ea27ac73e857d882ccfd7a3a981d8d6fb521e2"
Expand Down

0 comments on commit 82f4b24

Please sign in to comment.