@valencets/graphql 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/handler.d.ts +6 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +68 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver-builder.d.ts +13 -0
- package/dist/resolver-builder.d.ts.map +1 -0
- package/dist/resolver-builder.js +81 -0
- package/dist/resolver-builder.js.map +1 -0
- package/dist/schema-generator.d.ts +6 -0
- package/dist/schema-generator.d.ts.map +1 -0
- package/dist/schema-generator.js +257 -0
- package/dist/schema-generator.js.map +1 -0
- package/dist/type-builder.d.ts +4 -0
- package/dist/type-builder.d.ts.map +1 -0
- package/dist/type-builder.js +68 -0
- package/dist/type-builder.js.map +1 -0
- package/package.json +33 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 valencets
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GraphQLSchema } from 'graphql';
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
+
import type { RestRouteEntry, CmsInstance } from '@valencets/cms';
|
|
4
|
+
export declare function createGraphQLHandler(schema: GraphQLSchema): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
5
|
+
export declare function createGraphQLRoutes(cms: CmsInstance): Map<string, RestRouteEntry>;
|
|
6
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,SAAS,CAAA;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAmCjE,wBAAgB,oBAAoB,CAAE,MAAM,EAAE,aAAa,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAwCzH;AAED,wBAAgB,mBAAmB,CAAE,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAalF"}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { fromThrowable } from '@valencets/resultkit';
|
|
2
|
+
import { graphql } from 'graphql';
|
|
3
|
+
import { generateGraphQLSchema } from './schema-generator.js';
|
|
4
|
+
function readBody(req) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const chunks = [];
|
|
7
|
+
req.on('data', (chunk) => { chunks.push(chunk); });
|
|
8
|
+
req.on('end', () => { resolve(Buffer.concat(chunks).toString('utf-8')); });
|
|
9
|
+
req.on('error', reject);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function isGraphQLRequestBody(value) {
|
|
13
|
+
const obj = value;
|
|
14
|
+
return typeof obj.query === 'string';
|
|
15
|
+
}
|
|
16
|
+
function sendJson(res, status, data) {
|
|
17
|
+
const body = JSON.stringify(data);
|
|
18
|
+
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
19
|
+
res.end(body);
|
|
20
|
+
}
|
|
21
|
+
export function createGraphQLHandler(schema) {
|
|
22
|
+
return async (req, res) => {
|
|
23
|
+
if (req.method !== 'POST') {
|
|
24
|
+
sendJson(res, 405, { errors: [{ message: 'Method not allowed. Use POST.' }] });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const rawBody = await readBody(req);
|
|
28
|
+
if (rawBody.trim() === '') {
|
|
29
|
+
sendJson(res, 400, { errors: [{ message: 'Request body is required.' }] });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const safeJsonParse = fromThrowable(JSON.parse, () => null);
|
|
33
|
+
const parseResult = safeJsonParse(rawBody);
|
|
34
|
+
if (parseResult.isErr() || parseResult.value === null) {
|
|
35
|
+
sendJson(res, 400, { errors: [{ message: 'Invalid JSON body.' }] });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (typeof parseResult.value !== 'object') {
|
|
39
|
+
sendJson(res, 400, { errors: [{ message: 'Request body must be a JSON object.' }] });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const parsed = parseResult.value;
|
|
43
|
+
if (!isGraphQLRequestBody(parsed)) {
|
|
44
|
+
sendJson(res, 400, { errors: [{ message: 'Missing required field: query.' }] });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const result = await graphql({
|
|
48
|
+
schema,
|
|
49
|
+
source: parsed.query,
|
|
50
|
+
variableValues: parsed.variables,
|
|
51
|
+
operationName: parsed.operationName
|
|
52
|
+
});
|
|
53
|
+
sendJson(res, 200, result);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createGraphQLRoutes(cms) {
|
|
57
|
+
const schema = generateGraphQLSchema(cms.collections.getAll(), cms.api);
|
|
58
|
+
const handler = createGraphQLHandler(schema);
|
|
59
|
+
const routeEntry = {
|
|
60
|
+
POST: async (req, res, _params) => {
|
|
61
|
+
await handler(req, res);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
const routes = new Map();
|
|
65
|
+
routes.set('/graphql', routeEntry);
|
|
66
|
+
return routes;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { fieldToGraphQLType } from './type-builder.js';
|
|
2
|
+
export { generateGraphQLSchema, singularize, capitalize } from './schema-generator.js';
|
|
3
|
+
export { buildCollectionResolvers } from './resolver-builder.js';
|
|
4
|
+
export type { CollectionResolvers, GraphQLContext } from './resolver-builder.js';
|
|
5
|
+
export { createGraphQLHandler, createGraphQLRoutes } from './handler.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAChF,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @valencets/graphql — GraphQL schema generation from CMS collection configs
|
|
2
|
+
export { fieldToGraphQLType } from './type-builder.js';
|
|
3
|
+
export { generateGraphQLSchema, singularize, capitalize } from './schema-generator.js';
|
|
4
|
+
export { buildCollectionResolvers } from './resolver-builder.js';
|
|
5
|
+
export { createGraphQLHandler, createGraphQLRoutes } from './handler.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GraphQLFieldResolver } from 'graphql';
|
|
2
|
+
import type { IncomingMessage } from 'node:http';
|
|
3
|
+
import type { LocalApi } from '@valencets/cms';
|
|
4
|
+
import type { CollectionConfig } from '@valencets/cms';
|
|
5
|
+
export interface GraphQLContext {
|
|
6
|
+
readonly req?: IncomingMessage | undefined;
|
|
7
|
+
}
|
|
8
|
+
export interface CollectionResolvers {
|
|
9
|
+
readonly queries: Record<string, GraphQLFieldResolver<unknown, unknown>>;
|
|
10
|
+
readonly mutations: Record<string, GraphQLFieldResolver<unknown, unknown>>;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildCollectionResolvers(api: LocalApi, collections: readonly CollectionConfig[]): Record<string, CollectionResolvers>;
|
|
13
|
+
//# sourceMappingURL=resolver-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver-builder.d.ts","sourceRoot":"","sources":["../src/resolver-builder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAItD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;CAC3C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;CAC3E;AA+HD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,QAAQ,EACb,WAAW,EAAE,SAAS,gBAAgB,EAAE,GACvC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAuBrC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax -- GraphQL resolvers must throw GraphQLError per the graphql-js
|
|
2
|
+
API contract. The graphql-js library catches thrown errors and converts them to GraphQL error
|
|
3
|
+
responses. This is the one legitimate project-wide exception to the no-throw rule. */
|
|
4
|
+
import { GraphQLError } from 'graphql';
|
|
5
|
+
import { singularize, capitalize } from './schema-generator.js';
|
|
6
|
+
function buildOrderBy(sort, dir) {
|
|
7
|
+
if (sort === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
return { field: sort, direction: dir === 'desc' ? 'desc' : 'asc' };
|
|
10
|
+
}
|
|
11
|
+
function extractDocs(data) {
|
|
12
|
+
if (Array.isArray(data))
|
|
13
|
+
return data;
|
|
14
|
+
return data.docs;
|
|
15
|
+
}
|
|
16
|
+
function buildListResolver(api, slug) {
|
|
17
|
+
return async (_source, args) => {
|
|
18
|
+
const findArgs = {
|
|
19
|
+
collection: slug,
|
|
20
|
+
page: args.page,
|
|
21
|
+
perPage: args.limit,
|
|
22
|
+
search: args.search,
|
|
23
|
+
locale: args.locale,
|
|
24
|
+
orderBy: buildOrderBy(args.sort, args.dir)
|
|
25
|
+
};
|
|
26
|
+
const result = await api.find(findArgs);
|
|
27
|
+
return result.match((data) => extractDocs(data), (error) => { throw new GraphQLError(error.message); });
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function buildSingleResolver(api, slug) {
|
|
31
|
+
return async (_source, args) => {
|
|
32
|
+
const result = await api.findByID({ collection: slug, id: args.id });
|
|
33
|
+
return result.match((doc) => doc, (error) => { throw new GraphQLError(error.message); });
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function buildCountResolver(api, slug) {
|
|
37
|
+
return async () => {
|
|
38
|
+
const result = await api.count({ collection: slug });
|
|
39
|
+
return result.match((count) => count, (error) => { throw new GraphQLError(error.message); });
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function buildCreateResolver(api, slug) {
|
|
43
|
+
return async (_source, args) => {
|
|
44
|
+
const result = await api.create({ collection: slug, data: args.data });
|
|
45
|
+
return result.match((doc) => doc, (error) => { throw new GraphQLError(error.message); });
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function buildUpdateResolver(api, slug) {
|
|
49
|
+
return async (_source, args) => {
|
|
50
|
+
const result = await api.update({ collection: slug, id: args.id, data: args.data });
|
|
51
|
+
return result.match((doc) => doc, (error) => { throw new GraphQLError(error.message); });
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function buildDeleteResolver(api, slug) {
|
|
55
|
+
return async (_source, args) => {
|
|
56
|
+
const result = await api.delete({ collection: slug, id: args.id });
|
|
57
|
+
return result.match((doc) => doc, (error) => { throw new GraphQLError(error.message); });
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function buildCollectionResolvers(api, collections) {
|
|
61
|
+
const result = {};
|
|
62
|
+
for (const collection of collections) {
|
|
63
|
+
const slug = collection.slug;
|
|
64
|
+
const singular = singularize(slug);
|
|
65
|
+
const typeName = capitalize(singular);
|
|
66
|
+
result[slug] = {
|
|
67
|
+
queries: {
|
|
68
|
+
[slug]: buildListResolver(api, slug),
|
|
69
|
+
[singular]: buildSingleResolver(api, slug),
|
|
70
|
+
[`${slug}Count`]: buildCountResolver(api, slug)
|
|
71
|
+
},
|
|
72
|
+
mutations: {
|
|
73
|
+
[`create${typeName}`]: buildCreateResolver(api, slug),
|
|
74
|
+
[`update${typeName}`]: buildUpdateResolver(api, slug),
|
|
75
|
+
[`delete${typeName}`]: buildDeleteResolver(api, slug)
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=resolver-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver-builder.js","sourceRoot":"","sources":["../src/resolver-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { GraphQLSchema } from 'graphql';
|
|
2
|
+
import type { CollectionConfig, LocalApi } from '@valencets/cms';
|
|
3
|
+
export declare function singularize(slug: string): string;
|
|
4
|
+
export declare function capitalize(str: string): string;
|
|
5
|
+
export declare function generateGraphQLSchema(collections: readonly CollectionConfig[], api?: LocalApi): GraphQLSchema;
|
|
6
|
+
//# sourceMappingURL=schema-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../src/schema-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAUd,MAAM,SAAS,CAAA;AAShB,OAAO,KAAK,EACV,gBAAgB,EAShB,QAAQ,EACT,MAAM,gBAAgB,CAAA;AAIvB,wBAAgB,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAsUD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,GAAG,CAAC,EAAE,QAAQ,GACb,aAAa,CA8Bf"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { GraphQLSchema, GraphQLObjectType, GraphQLInputObjectType, GraphQLEnumType, GraphQLList, GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLNonNull } from 'graphql';
|
|
2
|
+
import { flattenFields } from '@valencets/cms';
|
|
3
|
+
import { buildCollectionResolvers } from './resolver-builder.js';
|
|
4
|
+
export function singularize(slug) {
|
|
5
|
+
if (slug.endsWith('ies'))
|
|
6
|
+
return slug.slice(0, -3) + 'y';
|
|
7
|
+
if (slug.endsWith('s'))
|
|
8
|
+
return slug.slice(0, -1);
|
|
9
|
+
return slug;
|
|
10
|
+
}
|
|
11
|
+
export function capitalize(str) {
|
|
12
|
+
if (str.length === 0)
|
|
13
|
+
return str;
|
|
14
|
+
return str[0].toUpperCase() + str.slice(1);
|
|
15
|
+
}
|
|
16
|
+
function getTypeName(slug) {
|
|
17
|
+
return capitalize(singularize(slug));
|
|
18
|
+
}
|
|
19
|
+
class TypeRegistry {
|
|
20
|
+
cache = new Map();
|
|
21
|
+
getOrCreate(name, factory) {
|
|
22
|
+
const existing = this.cache.get(name);
|
|
23
|
+
if (existing !== undefined)
|
|
24
|
+
return existing;
|
|
25
|
+
const created = factory();
|
|
26
|
+
this.cache.set(name, created);
|
|
27
|
+
return created;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// --- Field-to-type resolvers using the registry ---
|
|
31
|
+
function buildSelectEnumType(field, registry) {
|
|
32
|
+
const enumName = `${field.name}_enum`;
|
|
33
|
+
return registry.getOrCreate(enumName, () => new GraphQLEnumType({
|
|
34
|
+
name: enumName,
|
|
35
|
+
values: Object.fromEntries(field.options.map(opt => [opt.value, { value: opt.value }]))
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
function buildGroupObjectType(field, registry) {
|
|
39
|
+
const typeName = `${field.name}_group`;
|
|
40
|
+
return registry.getOrCreate(typeName, () => new GraphQLObjectType({
|
|
41
|
+
name: typeName,
|
|
42
|
+
fields: () => Object.fromEntries(field.fields.map(child => [child.name, { type: resolveOutputType(child, registry) }]))
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
function buildArrayItemType(field, registry) {
|
|
46
|
+
const typeName = `${field.name}_item`;
|
|
47
|
+
return registry.getOrCreate(typeName, () => new GraphQLObjectType({
|
|
48
|
+
name: typeName,
|
|
49
|
+
fields: () => Object.fromEntries(field.fields.map(child => [child.name, { type: resolveOutputType(child, registry) }]))
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
const OUTPUT_TYPE_MAP = {
|
|
53
|
+
text: () => GraphQLString,
|
|
54
|
+
textarea: () => GraphQLString,
|
|
55
|
+
richtext: () => GraphQLString,
|
|
56
|
+
number: (field) => {
|
|
57
|
+
const f = field;
|
|
58
|
+
return f.hasDecimals === true ? GraphQLFloat : GraphQLInt;
|
|
59
|
+
},
|
|
60
|
+
boolean: () => GraphQLBoolean,
|
|
61
|
+
select: (field, registry) => buildSelectEnumType(field, registry),
|
|
62
|
+
multiselect: (field, registry) => {
|
|
63
|
+
const enumType = buildSelectEnumType({ ...field, type: 'select' }, registry);
|
|
64
|
+
return new GraphQLList(enumType);
|
|
65
|
+
},
|
|
66
|
+
date: () => GraphQLString,
|
|
67
|
+
slug: () => GraphQLString,
|
|
68
|
+
media: () => GraphQLString,
|
|
69
|
+
relation: () => GraphQLString,
|
|
70
|
+
group: (field, registry) => buildGroupObjectType(field, registry),
|
|
71
|
+
email: () => GraphQLString,
|
|
72
|
+
url: () => GraphQLString,
|
|
73
|
+
password: () => GraphQLString,
|
|
74
|
+
json: () => GraphQLString,
|
|
75
|
+
color: () => GraphQLString,
|
|
76
|
+
array: (field, registry) => {
|
|
77
|
+
const itemType = buildArrayItemType(field, registry);
|
|
78
|
+
return new GraphQLList(itemType);
|
|
79
|
+
},
|
|
80
|
+
blocks: (field) => {
|
|
81
|
+
const f = field;
|
|
82
|
+
const firstBlock = f.blocks[0];
|
|
83
|
+
if (firstBlock === undefined)
|
|
84
|
+
return new GraphQLList(GraphQLString);
|
|
85
|
+
// Inline block type — not cached since block types are per-field
|
|
86
|
+
const blockType = new GraphQLObjectType({
|
|
87
|
+
name: `${f.name}_${firstBlock.slug}_block`,
|
|
88
|
+
fields: () => Object.fromEntries(firstBlock.fields.map(child => [child.name, { type: GraphQLString }]))
|
|
89
|
+
});
|
|
90
|
+
return new GraphQLList(blockType);
|
|
91
|
+
},
|
|
92
|
+
// Layout fields are visual containers flattened before iteration.
|
|
93
|
+
// These entries are safety fallbacks — flattenFields() ensures they are
|
|
94
|
+
// never reached in practice.
|
|
95
|
+
tabs: () => GraphQLString,
|
|
96
|
+
row: () => GraphQLString,
|
|
97
|
+
collapsible: () => GraphQLString
|
|
98
|
+
};
|
|
99
|
+
function resolveOutputType(field, registry) {
|
|
100
|
+
const resolver = OUTPUT_TYPE_MAP[field.type];
|
|
101
|
+
return resolver(field, registry);
|
|
102
|
+
}
|
|
103
|
+
// --- Input type resolver ---
|
|
104
|
+
function resolveInputType(field, registry) {
|
|
105
|
+
// Complex output-only types fall back to GraphQLString for input
|
|
106
|
+
const stringInputTypes = new Set(['group', 'array', 'blocks']);
|
|
107
|
+
if (stringInputTypes.has(field.type))
|
|
108
|
+
return GraphQLString;
|
|
109
|
+
// select/multiselect enums are valid input types — reuse via registry
|
|
110
|
+
if (field.type === 'select') {
|
|
111
|
+
return buildSelectEnumType(field, registry);
|
|
112
|
+
}
|
|
113
|
+
if (field.type === 'multiselect') {
|
|
114
|
+
const enumType = buildSelectEnumType({ ...field, type: 'select' }, registry);
|
|
115
|
+
return new GraphQLList(enumType);
|
|
116
|
+
}
|
|
117
|
+
// All remaining types map to scalars
|
|
118
|
+
return resolveOutputType(field, registry);
|
|
119
|
+
}
|
|
120
|
+
function buildInputFields(fields, registry) {
|
|
121
|
+
const result = {};
|
|
122
|
+
for (const field of fields) {
|
|
123
|
+
const inputType = resolveInputType(field, registry);
|
|
124
|
+
const wrapped = field.required === true
|
|
125
|
+
? new GraphQLNonNull(inputType)
|
|
126
|
+
: inputType;
|
|
127
|
+
result[field.name] = { type: wrapped };
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
function buildObjectFields(config, typeMap, registry) {
|
|
132
|
+
const result = {
|
|
133
|
+
id: { type: GraphQLString }
|
|
134
|
+
};
|
|
135
|
+
for (const field of flattenFields(config.fields)) {
|
|
136
|
+
if (field.type === 'relation') {
|
|
137
|
+
const relationField = field;
|
|
138
|
+
const related = typeMap.get(relationField.relationTo);
|
|
139
|
+
const resolvedType = related !== undefined
|
|
140
|
+
? related.objectType
|
|
141
|
+
: GraphQLString;
|
|
142
|
+
result[field.name] = { type: resolvedType };
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
result[field.name] = { type: resolveOutputType(field, registry) };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (config.timestamps) {
|
|
149
|
+
result['created_at'] = { type: GraphQLString };
|
|
150
|
+
result['updated_at'] = { type: GraphQLString };
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
function buildCollectionTypes(collections) {
|
|
155
|
+
const typeMap = new Map();
|
|
156
|
+
const registry = new TypeRegistry();
|
|
157
|
+
for (const config of collections) {
|
|
158
|
+
const typeName = getTypeName(config.slug);
|
|
159
|
+
const objectType = new GraphQLObjectType({
|
|
160
|
+
name: typeName,
|
|
161
|
+
fields: () => buildObjectFields(config, typeMap, registry)
|
|
162
|
+
});
|
|
163
|
+
const inputType = new GraphQLInputObjectType({
|
|
164
|
+
name: `${typeName}Input`,
|
|
165
|
+
fields: () => buildInputFields(flattenFields(config.fields), registry)
|
|
166
|
+
});
|
|
167
|
+
typeMap.set(config.slug, { objectType, inputType, config });
|
|
168
|
+
}
|
|
169
|
+
return typeMap;
|
|
170
|
+
}
|
|
171
|
+
function withResolver(base, resolver) {
|
|
172
|
+
if (resolver === undefined)
|
|
173
|
+
return base;
|
|
174
|
+
return { ...base, resolve: resolver };
|
|
175
|
+
}
|
|
176
|
+
// --- Query and mutation builders ---
|
|
177
|
+
function buildQueryFields(typeMap, resolverMap) {
|
|
178
|
+
const fields = {};
|
|
179
|
+
for (const [slug, { objectType }] of typeMap) {
|
|
180
|
+
const singular = singularize(slug);
|
|
181
|
+
const collectionResolvers = resolverMap?.[slug];
|
|
182
|
+
fields[slug] = withResolver({
|
|
183
|
+
type: new GraphQLList(objectType),
|
|
184
|
+
args: {
|
|
185
|
+
page: { type: GraphQLInt },
|
|
186
|
+
limit: { type: GraphQLInt },
|
|
187
|
+
sort: { type: GraphQLString },
|
|
188
|
+
search: { type: GraphQLString },
|
|
189
|
+
locale: { type: GraphQLString }
|
|
190
|
+
}
|
|
191
|
+
}, collectionResolvers?.[slug]);
|
|
192
|
+
fields[singular] = withResolver({
|
|
193
|
+
type: objectType,
|
|
194
|
+
args: {
|
|
195
|
+
id: { type: new GraphQLNonNull(GraphQLString) }
|
|
196
|
+
}
|
|
197
|
+
}, collectionResolvers?.[singular]);
|
|
198
|
+
fields[`${slug}Count`] = withResolver({ type: GraphQLInt }, collectionResolvers?.[`${slug}Count`]);
|
|
199
|
+
}
|
|
200
|
+
return fields;
|
|
201
|
+
}
|
|
202
|
+
function buildMutationFields(typeMap, resolverMap) {
|
|
203
|
+
const fields = {};
|
|
204
|
+
for (const [slug, { objectType, inputType }] of typeMap) {
|
|
205
|
+
const singular = singularize(slug);
|
|
206
|
+
const typeName = capitalize(singular);
|
|
207
|
+
const collectionMutations = resolverMap?.[slug];
|
|
208
|
+
fields[`create${typeName}`] = withResolver({
|
|
209
|
+
type: objectType,
|
|
210
|
+
args: {
|
|
211
|
+
data: { type: new GraphQLNonNull(inputType) }
|
|
212
|
+
}
|
|
213
|
+
}, collectionMutations?.[`create${typeName}`]);
|
|
214
|
+
fields[`update${typeName}`] = withResolver({
|
|
215
|
+
type: objectType,
|
|
216
|
+
args: {
|
|
217
|
+
id: { type: new GraphQLNonNull(GraphQLString) },
|
|
218
|
+
data: { type: new GraphQLNonNull(inputType) }
|
|
219
|
+
}
|
|
220
|
+
}, collectionMutations?.[`update${typeName}`]);
|
|
221
|
+
fields[`delete${typeName}`] = withResolver({
|
|
222
|
+
type: objectType,
|
|
223
|
+
args: {
|
|
224
|
+
id: { type: new GraphQLNonNull(GraphQLString) }
|
|
225
|
+
}
|
|
226
|
+
}, collectionMutations?.[`delete${typeName}`]);
|
|
227
|
+
}
|
|
228
|
+
return fields;
|
|
229
|
+
}
|
|
230
|
+
// --- Main export ---
|
|
231
|
+
export function generateGraphQLSchema(collections, api) {
|
|
232
|
+
const typeMap = buildCollectionTypes(collections);
|
|
233
|
+
let queryResolverMap;
|
|
234
|
+
let mutationResolverMap;
|
|
235
|
+
if (api !== undefined) {
|
|
236
|
+
const collectionResolvers = buildCollectionResolvers(api, collections);
|
|
237
|
+
queryResolverMap = {};
|
|
238
|
+
mutationResolverMap = {};
|
|
239
|
+
for (const [slug, resolvers] of Object.entries(collectionResolvers)) {
|
|
240
|
+
queryResolverMap[slug] = resolvers.queries;
|
|
241
|
+
mutationResolverMap[slug] = resolvers.mutations;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const QueryType = new GraphQLObjectType({
|
|
245
|
+
name: 'Query',
|
|
246
|
+
fields: () => buildQueryFields(typeMap, queryResolverMap)
|
|
247
|
+
});
|
|
248
|
+
const MutationType = new GraphQLObjectType({
|
|
249
|
+
name: 'Mutation',
|
|
250
|
+
fields: () => buildMutationFields(typeMap, mutationResolverMap)
|
|
251
|
+
});
|
|
252
|
+
return new GraphQLSchema({
|
|
253
|
+
query: QueryType,
|
|
254
|
+
mutation: MutationType
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=schema-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../src/schema-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-builder.d.ts","sourceRoot":"","sources":["../src/type-builder.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EACV,WAAW,EAOZ,MAAM,gBAAgB,CAAA;AAqFvB,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAGzE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { GraphQLString, GraphQLInt, GraphQLFloat, GraphQLBoolean, GraphQLEnumType, GraphQLList, GraphQLObjectType } from 'graphql';
|
|
2
|
+
function buildNumberType(field) {
|
|
3
|
+
return field.hasDecimals === true ? GraphQLFloat : GraphQLInt;
|
|
4
|
+
}
|
|
5
|
+
function buildSelectType(field) {
|
|
6
|
+
return new GraphQLEnumType({
|
|
7
|
+
name: `${field.name}_enum`,
|
|
8
|
+
values: Object.fromEntries(field.options.map(opt => [opt.value, { value: opt.value }]))
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function buildMultiselectType(field) {
|
|
12
|
+
const enumType = new GraphQLEnumType({
|
|
13
|
+
name: `${field.name}_enum`,
|
|
14
|
+
values: Object.fromEntries(field.options.map(opt => [opt.value, { value: opt.value }]))
|
|
15
|
+
});
|
|
16
|
+
return new GraphQLList(enumType);
|
|
17
|
+
}
|
|
18
|
+
function buildGroupType(field) {
|
|
19
|
+
return new GraphQLObjectType({
|
|
20
|
+
name: `${field.name}_group`,
|
|
21
|
+
fields: () => Object.fromEntries(field.fields.map(child => [child.name, { type: fieldToGraphQLType(child) }]))
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function buildArrayType(field) {
|
|
25
|
+
const itemType = new GraphQLObjectType({
|
|
26
|
+
name: `${field.name}_item`,
|
|
27
|
+
fields: () => Object.fromEntries(field.fields.map(child => [child.name, { type: fieldToGraphQLType(child) }]))
|
|
28
|
+
});
|
|
29
|
+
return new GraphQLList(itemType);
|
|
30
|
+
}
|
|
31
|
+
function buildBlocksType(field) {
|
|
32
|
+
const blockTypes = field.blocks.map(block => new GraphQLObjectType({
|
|
33
|
+
name: `${field.name}_${block.slug}_block`,
|
|
34
|
+
fields: () => Object.fromEntries(block.fields.map(child => [child.name, { type: fieldToGraphQLType(child) }]))
|
|
35
|
+
}));
|
|
36
|
+
return new GraphQLList(blockTypes[0] ?? GraphQLString);
|
|
37
|
+
}
|
|
38
|
+
const FIELD_GRAPHQL_TYPE_MAP = {
|
|
39
|
+
text: () => GraphQLString,
|
|
40
|
+
textarea: () => GraphQLString,
|
|
41
|
+
richtext: () => GraphQLString,
|
|
42
|
+
number: buildNumberType,
|
|
43
|
+
boolean: () => GraphQLBoolean,
|
|
44
|
+
select: buildSelectType,
|
|
45
|
+
multiselect: buildMultiselectType,
|
|
46
|
+
date: () => GraphQLString,
|
|
47
|
+
slug: () => GraphQLString,
|
|
48
|
+
media: () => GraphQLString,
|
|
49
|
+
relation: () => GraphQLString,
|
|
50
|
+
group: buildGroupType,
|
|
51
|
+
email: () => GraphQLString,
|
|
52
|
+
url: () => GraphQLString,
|
|
53
|
+
password: () => GraphQLString,
|
|
54
|
+
json: () => GraphQLString,
|
|
55
|
+
color: () => GraphQLString,
|
|
56
|
+
array: buildArrayType,
|
|
57
|
+
blocks: buildBlocksType,
|
|
58
|
+
// Layout fields are visual containers — flattenFields() removes them before
|
|
59
|
+
// type resolution. These entries are safety fallbacks to satisfy the type map.
|
|
60
|
+
tabs: () => GraphQLString,
|
|
61
|
+
row: () => GraphQLString,
|
|
62
|
+
collapsible: () => GraphQLString
|
|
63
|
+
};
|
|
64
|
+
export function fieldToGraphQLType(field) {
|
|
65
|
+
const handler = FIELD_GRAPHQL_TYPE_MAP[field.type];
|
|
66
|
+
return handler(field);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=type-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-builder.js","sourceRoot":"","sources":["../src/type-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@valencets/graphql",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@valencets/resultkit": "^0.2.0",
|
|
15
|
+
"graphql": "^16.10.0",
|
|
16
|
+
"@valencets/cms": "0.12.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^25.4.0",
|
|
20
|
+
"typescript": "^5.9.3",
|
|
21
|
+
"vitest": "^4.0.18"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"test": "vitest run"
|
|
32
|
+
}
|
|
33
|
+
}
|