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.
Files changed (57) hide show
  1. package/README.md +458 -439
  2. package/dist/server/index.d.ts +14 -8
  3. package/dist/server/index.js +1 -0
  4. package/dist/server/nexus/index.d.ts +1 -0
  5. package/dist/server/nexus/index.js +17 -0
  6. package/dist/server/nexus/plugins/field-authorize.plugin.d.ts +36 -0
  7. package/dist/server/nexus/plugins/field-authorize.plugin.js +122 -0
  8. package/dist/server/nexus/plugins/index.d.ts +2 -0
  9. package/dist/server/nexus/plugins/index.js +18 -0
  10. package/dist/server/nexus/plugins/middleware.plugin.d.ts +25 -0
  11. package/dist/server/nexus/plugins/middleware.plugin.js +63 -0
  12. package/dist/server/register.js +6 -7
  13. package/dist/server/services/file-service.d.ts +7 -6
  14. package/dist/server/services/file-service.js +36 -30
  15. package/dist/server/services/index.d.ts +1 -1
  16. package/dist/server/types.d.ts +28 -13
  17. package/dist/server/utils/collection-type.d.ts +13 -2
  18. package/dist/server/utils/collection-type.js +13 -2
  19. package/dist/server/utils/field-builder/builder.d.ts +33 -0
  20. package/dist/server/utils/field-builder/builder.js +552 -0
  21. package/dist/server/utils/field-builder/helpers.d.ts +34 -0
  22. package/dist/server/utils/field-builder/helpers.js +78 -0
  23. package/dist/server/utils/field-builder/index.d.ts +3 -0
  24. package/dist/server/utils/field-builder/index.js +19 -0
  25. package/dist/server/utils/field-builder/types.d.ts +371 -0
  26. package/dist/server/utils/field-builder/types.js +2 -0
  27. package/dist/server/utils/graphql-extension.d.ts +29 -3
  28. package/dist/server/utils/graphql-extension.js +94 -26
  29. package/dist/server/utils/index.d.ts +3 -1
  30. package/dist/server/utils/index.js +12 -1
  31. package/dist/server/utils/loaders.d.ts +94 -0
  32. package/dist/server/utils/loaders.js +166 -0
  33. package/dist/server/utils/misc.d.ts +6 -0
  34. package/dist/server/utils/misc.js +6 -0
  35. package/dist/server/utils/override.d.ts +34 -1
  36. package/dist/server/utils/override.js +54 -26
  37. package/dist/server/utils/registry/field-protection.d.ts +43 -0
  38. package/dist/server/utils/registry/field-protection.js +65 -0
  39. package/dist/server/utils/registry/global-registry.d.ts +63 -0
  40. package/dist/server/utils/registry/global-registry.js +56 -0
  41. package/dist/server/utils/registry/index.d.ts +3 -0
  42. package/dist/server/utils/registry/index.js +19 -0
  43. package/dist/server/utils/registry/resolve-field.d.ts +1 -0
  44. package/dist/server/utils/registry/resolve-field.js +67 -0
  45. package/dist/server/utils/shadow-crud.d.ts +28 -1
  46. package/dist/server/utils/shadow-crud.js +32 -1
  47. package/dist/server/utils/single-type.d.ts +30 -1
  48. package/dist/server/utils/single-type.js +25 -0
  49. package/dist/server/utils/strapi-compat.d.ts +85 -0
  50. package/dist/server/utils/strapi-compat.js +194 -0
  51. package/dist/server/utils/types.d.ts +25 -1
  52. package/dist/tsconfig.server.tsbuildinfo +1 -1
  53. package/package.json +7 -4
  54. package/dist/server/utils/field-builder.d.ts +0 -31
  55. package/dist/server/utils/field-builder.js +0 -113
  56. package/dist/server/utils/middleware.d.ts +0 -17
  57. 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.26",
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;