-
Notifications
You must be signed in to change notification settings - Fork 310
Expand file tree
/
Copy pathClient.ts
More file actions
90 lines (85 loc) · 3.21 KB
/
Copy pathClient.ts
File metadata and controls
90 lines (85 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { Syn } from '@wollybeard/kit'
import { $ } from '../helpers/identifiers.js'
import { createModuleGenerator, importModuleGenerator } from '../helpers/moduleGenerator.js'
import { ModuleGeneratorData } from './Data.js'
import { ModuleGeneratorScalar } from './Scalar.js'
import { ModuleGeneratorSchemaDrivenDataMap } from './SchemaDrivenDataMap.js'
export const ModuleGeneratorClient = createModuleGenerator(
`client`,
({ config, code }) => {
code(importModuleGenerator(config, ModuleGeneratorSchemaDrivenDataMap))
code(importModuleGenerator(config, ModuleGeneratorData))
code(importModuleGenerator(config, ModuleGeneratorScalar))
// Import domains only if there are actual rules configured
const hasDomains = config.methodsOrganization.domains && config.methodsOrganization.domains.rules?.length > 0
if (hasDomains) {
code(Syn.TS.importAll({ as: '$$Domains', from: './domains/__.js' }))
}
code(Syn.TS.importAll({ as: $.$$Utilities, from: config.paths.imports.grafflePackage.utilitiesForGenerated }))
code(
Syn.TS.importNamed({
names: 'TransportHttp',
from: config.paths.imports.grafflePackage.extensionTransportHttp,
}),
)
code(
Syn.TS.importNamed({
names: 'DocumentBuilder',
from: config.paths.imports.grafflePackage.extensionDocumentBuilder,
}),
)
code(
Syn.TS.importNamed({
names: 'Create',
from: config.paths.imports.grafflePackage.client,
type: true,
}),
)
code`
const context = ${$.$$Utilities}.pipe(
${$.$$Utilities}.contextEmpty,
ctx => ${$.$$Utilities}.Extensions.addAndApplyMany(ctx, [TransportHttp, ${
hasDomains ? 'DocumentBuilder({ domains: $$Domains })' : 'DocumentBuilder()'
}]),
ctx => ${$.$$Utilities}.Transports.configureCurrentOrThrow(ctx, { url: $$Data.defaultSchemaUrl }),
ctx => ${$.$$Utilities}.Configuration.add(ctx, {
schema: {
name: $$Data.Name,
map: $$SchemaDrivenDataMap.schemaDrivenDataMap,
},
}),
ctx => ${$.$$Utilities}.Scalars.set(ctx, {
scalars: {
typesEncoded: null as any,
typesDecoded: null as any,
map: {
...$$SchemaDrivenDataMap.schemaDrivenDataMap.scalarTypes,
...$$Scalar.$registry.map
}
}
}),
)
/**
* Create a Graffle client for the ${config.name} GraphQL schema.
*
* Pre-configured with:
* - HTTP transport to {@link $$Data.defaultSchemaUrl}
* - Document builder for type-safe queries
* - Schema-driven data mapping
* - Custom scalar codecs
* - GraphQL string parsing via integrated type system
*
* @param input - Optional client configuration to override defaults
*
* @example
* \`\`\`ts
* import { create } from './graffle/client${config.importFormat === 'jsExtension' ? '.js' : ''}'
*
* const client = create()
* const result = await client.query.pokemon({ name: true })
* \`\`\`
*/
export const create: Create<typeof context> = ${$.$$Utilities}.createConstructorWithContext(context)
`
},
)