buro26-strapi-graphql 0.0.26 → 0.2.0
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/README.md +458 -439
- package/dist/server/index.d.ts +14 -8
- package/dist/server/index.js +1 -0
- package/dist/server/nexus/index.d.ts +1 -0
- package/dist/server/nexus/index.js +17 -0
- package/dist/server/nexus/plugins/field-authorize.plugin.d.ts +36 -0
- package/dist/server/nexus/plugins/field-authorize.plugin.js +122 -0
- package/dist/server/nexus/plugins/index.d.ts +2 -0
- package/dist/server/nexus/plugins/index.js +18 -0
- package/dist/server/nexus/plugins/middleware.plugin.d.ts +25 -0
- package/dist/server/nexus/plugins/middleware.plugin.js +63 -0
- package/dist/server/register.js +6 -7
- package/dist/server/services/file-service.d.ts +7 -6
- package/dist/server/services/file-service.js +36 -30
- package/dist/server/services/index.d.ts +1 -1
- package/dist/server/types.d.ts +28 -13
- package/dist/server/utils/collection-type.d.ts +13 -2
- package/dist/server/utils/collection-type.js +13 -2
- package/dist/server/utils/field-builder/builder.d.ts +33 -0
- package/dist/server/utils/field-builder/builder.js +552 -0
- package/dist/server/utils/field-builder/helpers.d.ts +34 -0
- package/dist/server/utils/field-builder/helpers.js +78 -0
- package/dist/server/utils/field-builder/index.d.ts +3 -0
- package/dist/server/utils/field-builder/index.js +19 -0
- package/dist/server/utils/field-builder/types.d.ts +371 -0
- package/dist/server/utils/field-builder/types.js +2 -0
- package/dist/server/utils/graphql-extension.d.ts +29 -3
- package/dist/server/utils/graphql-extension.js +94 -26
- package/dist/server/utils/index.d.ts +3 -1
- package/dist/server/utils/index.js +12 -1
- package/dist/server/utils/loaders.d.ts +94 -0
- package/dist/server/utils/loaders.js +166 -0
- package/dist/server/utils/misc.d.ts +6 -0
- package/dist/server/utils/misc.js +6 -0
- package/dist/server/utils/override.d.ts +34 -1
- package/dist/server/utils/override.js +54 -26
- package/dist/server/utils/registry/field-protection.d.ts +43 -0
- package/dist/server/utils/registry/field-protection.js +65 -0
- package/dist/server/utils/registry/global-registry.d.ts +63 -0
- package/dist/server/utils/registry/global-registry.js +56 -0
- package/dist/server/utils/registry/index.d.ts +3 -0
- package/dist/server/utils/registry/index.js +19 -0
- package/dist/server/utils/registry/resolve-field.d.ts +1 -0
- package/dist/server/utils/registry/resolve-field.js +67 -0
- package/dist/server/utils/shadow-crud.d.ts +28 -1
- package/dist/server/utils/shadow-crud.js +32 -1
- package/dist/server/utils/single-type.d.ts +30 -1
- package/dist/server/utils/single-type.js +25 -0
- package/dist/server/utils/strapi-compat.d.ts +85 -0
- package/dist/server/utils/strapi-compat.js +194 -0
- package/dist/server/utils/types.d.ts +25 -1
- package/dist/tsconfig.server.tsbuildinfo +1 -1
- package/package.json +7 -4
- package/dist/server/utils/field-builder.d.ts +0 -31
- package/dist/server/utils/field-builder.js +0 -113
- package/dist/server/utils/middleware.d.ts +0 -17
- package/dist/server/utils/middleware.js +0 -77
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "buro26-strapi-graphql",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"author": "Buro26 <info@buro26.digital>",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -20,13 +20,15 @@
|
|
|
20
20
|
"react-dom": "^18.2.0 || ^19.0.0",
|
|
21
21
|
"react-router-dom": "^5.3.4 || ^6.0.0",
|
|
22
22
|
"styled-components": "^5.3.6 || ^6.0.0",
|
|
23
|
-
"typescript": "5.0.4"
|
|
23
|
+
"typescript": "^5.0.4"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"react": "^18.0.0 || ^19.0.0",
|
|
27
27
|
"react-dom": "^18.0.0 || ^19.0.0",
|
|
28
28
|
"react-router-dom": "^5.2.0 || ^6.0.0",
|
|
29
|
-
"styled-components": "^5.2.1 || ^6.0.0"
|
|
29
|
+
"styled-components": "^5.2.1 || ^6.0.0",
|
|
30
|
+
"immer": "^10.1.1",
|
|
31
|
+
"zod": "^3.24.4"
|
|
30
32
|
},
|
|
31
33
|
"exports": {
|
|
32
34
|
".": "./dist/server/index.js",
|
|
@@ -48,7 +50,8 @@
|
|
|
48
50
|
"license": "MIT",
|
|
49
51
|
"scripts": {
|
|
50
52
|
"develop": "tsc -p tsconfig.server.json -w",
|
|
51
|
-
"build": "tsc -p tsconfig.server.json"
|
|
53
|
+
"build": "tsc -p tsconfig.server.json",
|
|
54
|
+
"test": "bun test"
|
|
52
55
|
},
|
|
53
56
|
"strapi": {
|
|
54
57
|
"kind": "plugin",
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { GraphQLExtension, ResolverConfigOption, ResolverFunction } from '../types';
|
|
2
|
-
export type FieldExtensionOptions = {
|
|
3
|
-
rootType: string;
|
|
4
|
-
fieldName?: string;
|
|
5
|
-
resolver: ResolverFunction;
|
|
6
|
-
resolverConfig?: ResolverConfigOption;
|
|
7
|
-
typeDefs?: string;
|
|
8
|
-
types?: () => any[];
|
|
9
|
-
plugins?: () => any[];
|
|
10
|
-
args?: Record<string, string | any>;
|
|
11
|
-
outputType?: string | any;
|
|
12
|
-
};
|
|
13
|
-
export interface FieldExtensionBuilder {
|
|
14
|
-
fieldName(name: string): FieldExtensionBuilder;
|
|
15
|
-
resolver(fn: ResolverFunction): FieldExtensionBuilder;
|
|
16
|
-
resolverConfig(config: ResolverConfigOption): FieldExtensionBuilder;
|
|
17
|
-
typeDefs(sdl: string): FieldExtensionBuilder;
|
|
18
|
-
types(typesFn: () => any[]): FieldExtensionBuilder;
|
|
19
|
-
plugins(pluginsFn: () => any[]): FieldExtensionBuilder;
|
|
20
|
-
args(a: Record<string, string | any>): FieldExtensionBuilder;
|
|
21
|
-
outputType(type: string | any): FieldExtensionBuilder;
|
|
22
|
-
build(): GraphQLExtension;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Creates a fluent builder to extend a root field in the GraphQL schema.
|
|
26
|
-
* The field is automatically registered using Nexus. The output type must be defined
|
|
27
|
-
* using the outputType callback.
|
|
28
|
-
*
|
|
29
|
-
* @param rootType - Either 'Query' or 'Mutation'
|
|
30
|
-
*/
|
|
31
|
-
export declare const createGraphQLFieldBuilder: (rootType: string) => FieldExtensionBuilder;
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createGraphQLFieldBuilder = void 0;
|
|
4
|
-
const nexus_1 = require("nexus");
|
|
5
|
-
const graphql_extension_1 = require("./graphql-extension");
|
|
6
|
-
/**
|
|
7
|
-
* Creates a fluent builder to extend a root field in the GraphQL schema.
|
|
8
|
-
* The field is automatically registered using Nexus. The output type must be defined
|
|
9
|
-
* using the outputType callback.
|
|
10
|
-
*
|
|
11
|
-
* @param rootType - Either 'Query' or 'Mutation'
|
|
12
|
-
*/
|
|
13
|
-
const createGraphQLFieldBuilder = (rootType) => {
|
|
14
|
-
const options = {
|
|
15
|
-
rootType,
|
|
16
|
-
fieldName: undefined,
|
|
17
|
-
resolver: () => {
|
|
18
|
-
throw new Error('Resolver function must be provided via .resolver()');
|
|
19
|
-
},
|
|
20
|
-
resolverConfig: {},
|
|
21
|
-
typeDefs: '',
|
|
22
|
-
types: () => [],
|
|
23
|
-
plugins: () => [],
|
|
24
|
-
args: {},
|
|
25
|
-
outputType: undefined
|
|
26
|
-
};
|
|
27
|
-
return {
|
|
28
|
-
fieldName(name) {
|
|
29
|
-
options.fieldName = name;
|
|
30
|
-
return this;
|
|
31
|
-
},
|
|
32
|
-
resolver(fn) {
|
|
33
|
-
options.resolver = fn;
|
|
34
|
-
return this;
|
|
35
|
-
},
|
|
36
|
-
resolverConfig(config) {
|
|
37
|
-
options.resolverConfig = config;
|
|
38
|
-
return this;
|
|
39
|
-
},
|
|
40
|
-
typeDefs(sdl) {
|
|
41
|
-
options.typeDefs = sdl;
|
|
42
|
-
return this;
|
|
43
|
-
},
|
|
44
|
-
types(typesFn) {
|
|
45
|
-
options.types = typesFn;
|
|
46
|
-
return this;
|
|
47
|
-
},
|
|
48
|
-
plugins(pluginsFn) {
|
|
49
|
-
options.plugins = pluginsFn;
|
|
50
|
-
return this;
|
|
51
|
-
},
|
|
52
|
-
args(a) {
|
|
53
|
-
options.args = a;
|
|
54
|
-
return this;
|
|
55
|
-
},
|
|
56
|
-
outputType(type) {
|
|
57
|
-
options.outputType = type;
|
|
58
|
-
return this;
|
|
59
|
-
},
|
|
60
|
-
build() {
|
|
61
|
-
if (!options.fieldName) {
|
|
62
|
-
throw new Error('Field name must be provided via fieldName()');
|
|
63
|
-
}
|
|
64
|
-
if (!options.outputType) {
|
|
65
|
-
throw new Error(`Output type must be provided for field "${options.fieldName}" via outputType()`);
|
|
66
|
-
}
|
|
67
|
-
const nexusExtension = (0, nexus_1.extendType)({
|
|
68
|
-
type: options.rootType,
|
|
69
|
-
definition(t) {
|
|
70
|
-
// Build Nexus arguments if provided
|
|
71
|
-
let nexusArgs = {};
|
|
72
|
-
if (options.args) {
|
|
73
|
-
for (const [argName, argType] of Object.entries(options.args)) {
|
|
74
|
-
if (typeof argType !== 'string') {
|
|
75
|
-
nexusArgs[argName] = argType;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
const isNonNull = argType.endsWith('!');
|
|
79
|
-
const baseType = isNonNull ? argType.slice(0, -1) : argType;
|
|
80
|
-
nexusArgs[argName] = isNonNull
|
|
81
|
-
? (0, nexus_1.nonNull)((0, nexus_1.arg)({ type: baseType }))
|
|
82
|
-
: (0, nexus_1.arg)({ type: baseType });
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
t.field(options.fieldName, {
|
|
86
|
-
type: options.outputType,
|
|
87
|
-
args: nexusArgs,
|
|
88
|
-
resolve: options.resolver
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
// Merge the auto-generated Nexus extension with any additional Nexus types
|
|
93
|
-
const autoTypes = [nexusExtension, ...(options.types ? options.types() : [])];
|
|
94
|
-
return (0, graphql_extension_1.createGraphQLExtension)((strapi) => ({
|
|
95
|
-
// Provided typeDefs are optional; Nexus types take precedence.
|
|
96
|
-
typeDefs: () => options.typeDefs || '',
|
|
97
|
-
types: () => autoTypes,
|
|
98
|
-
plugins: () => (options.plugins ? options.plugins() : []),
|
|
99
|
-
resolvers: () => ({
|
|
100
|
-
[options.rootType]: {
|
|
101
|
-
[options.fieldName]: options.resolver
|
|
102
|
-
}
|
|
103
|
-
}),
|
|
104
|
-
resolversConfig: () => ({
|
|
105
|
-
[options.rootType]: {
|
|
106
|
-
[options.fieldName]: options.resolverConfig || {}
|
|
107
|
-
}
|
|
108
|
-
})
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
};
|
|
113
|
-
exports.createGraphQLFieldBuilder = createGraphQLFieldBuilder;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import 'nexus';
|
|
2
|
-
import { GraphQLResolveInfo } from 'graphql';
|
|
3
|
-
import { ResolveContext } from './types';
|
|
4
|
-
/**
|
|
5
|
-
* The Resolver type represents a GraphQL resolver function.
|
|
6
|
-
*/
|
|
7
|
-
export type Resolver = <Parent extends Object, Args extends Object, Context = ResolveContext>(parent: Parent, args: Args, context: Context, info: GraphQLResolveInfo) => any | Promise<any>;
|
|
8
|
-
/**
|
|
9
|
-
* Middleware is a function that takes a resolver and returns a new resolver.
|
|
10
|
-
*/
|
|
11
|
-
export type Middleware = (resolver: Resolver) => Resolver;
|
|
12
|
-
export declare const nexusMiddlewarePlugin: () => import("nexus/dist/plugin").NexusPlugin;
|
|
13
|
-
/**
|
|
14
|
-
* Logging Middleware
|
|
15
|
-
* Logs the execution of the resolver.
|
|
16
|
-
*/
|
|
17
|
-
export declare const loggingMiddleware: Middleware;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loggingMiddleware = exports.nexusMiddlewarePlugin = void 0;
|
|
4
|
-
require("nexus");
|
|
5
|
-
const nexus_1 = require("nexus");
|
|
6
|
-
const utils_1 = require("nexus/dist/utils");
|
|
7
|
-
const fieldDefTypes = (0, utils_1.printedGenTyping)({
|
|
8
|
-
optional: true,
|
|
9
|
-
name: 'middlewares',
|
|
10
|
-
description: `
|
|
11
|
-
Authorization for an individual field. Returning "true"
|
|
12
|
-
or "Promise<true>" means the field can be accessed.
|
|
13
|
-
Returning "false" or "Promise<false>" will respond
|
|
14
|
-
with a "Not Authorized" error for the field.
|
|
15
|
-
Returning or throwing an error will also prevent the
|
|
16
|
-
resolver from executing.
|
|
17
|
-
`,
|
|
18
|
-
type: 'any',
|
|
19
|
-
});
|
|
20
|
-
const nexusMiddlewarePlugin = () => (0, nexus_1.plugin)({
|
|
21
|
-
name: 'NexusMiddlewarePlugin',
|
|
22
|
-
description: 'The middleware plugin allows attaching middleware functions to individual fields.',
|
|
23
|
-
/**
|
|
24
|
-
* Defines the field definition types for the plugin.
|
|
25
|
-
*/
|
|
26
|
-
fieldDefTypes: fieldDefTypes,
|
|
27
|
-
/**
|
|
28
|
-
* Hook into field resolver creation to apply middleware.
|
|
29
|
-
*/
|
|
30
|
-
onCreateFieldResolver(config) {
|
|
31
|
-
var _a;
|
|
32
|
-
const { fieldConfig } = config;
|
|
33
|
-
// @ts-ignore
|
|
34
|
-
const middlewares = ((_a = fieldConfig.extensions) === null || _a === void 0 ? void 0 : _a.middlewares) || [];
|
|
35
|
-
if (middlewares.length === 0) {
|
|
36
|
-
return undefined; // No middleware to apply
|
|
37
|
-
}
|
|
38
|
-
// Convert Middleware[] to MiddlewareFn[]
|
|
39
|
-
const middlewareFns = middlewares.map(middleware => {
|
|
40
|
-
return async (source, args, context, info, next) => {
|
|
41
|
-
const newResolver = middleware(next);
|
|
42
|
-
return newResolver(source, args, context, info);
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
// Compose the middleware functions into a single MiddlewareFn
|
|
46
|
-
return async (source, args, context, info, next) => {
|
|
47
|
-
let index = -1;
|
|
48
|
-
const dispatch = async (i) => {
|
|
49
|
-
if (i <= index)
|
|
50
|
-
throw new Error('next() called multiple times');
|
|
51
|
-
index = i;
|
|
52
|
-
const middlewareFn = middlewareFns[i];
|
|
53
|
-
if (middlewareFn) {
|
|
54
|
-
return middlewareFn(source, args, context, info, () => dispatch(i + 1));
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return next(source, args, context, info);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
return dispatch(0);
|
|
61
|
-
};
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
exports.nexusMiddlewarePlugin = nexusMiddlewarePlugin;
|
|
65
|
-
/**
|
|
66
|
-
* Logging Middleware
|
|
67
|
-
* Logs the execution of the resolver.
|
|
68
|
-
*/
|
|
69
|
-
const loggingMiddleware = (resolver) => {
|
|
70
|
-
return async (parent, args, context, info) => {
|
|
71
|
-
console.log(`Resolving field ${info.parentType.name}.${info.fieldName}`);
|
|
72
|
-
const result = await resolver(parent, args, context, info);
|
|
73
|
-
console.log(`Resolved field ${info.parentType.name}.${info.fieldName} with result:`, result);
|
|
74
|
-
return result;
|
|
75
|
-
};
|
|
76
|
-
};
|
|
77
|
-
exports.loggingMiddleware = loggingMiddleware;
|