@strapi/plugin-graphql 0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05 → 0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d

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.
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/plugin-graphql";
6
- var version = "5.13.1";
6
+ var version = "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d";
7
7
  var description = "Adds GraphQL endpoint with default API methods.";
8
8
  var repository = {
9
9
  type: "git",
@@ -52,6 +52,8 @@ var scripts = {
52
52
  "build:types:admin": "run -T tsc -p admin/tsconfig.build.json --emitDeclarationOnly",
53
53
  clean: "run -T rimraf ./dist",
54
54
  lint: "run -T eslint .",
55
+ "test:unit": "run -T jest --passWithNoTests",
56
+ "test:unit:watch": "run -T jest --watch",
55
57
  watch: "run -T rollup -c -w"
56
58
  };
57
59
  var dependencies = {
@@ -60,9 +62,9 @@ var dependencies = {
60
62
  "@graphql-tools/schema": "10.0.3",
61
63
  "@graphql-tools/utils": "^10.1.3",
62
64
  "@koa/cors": "5.0.0",
63
- "@strapi/design-system": "2.0.0-rc.24",
64
- "@strapi/icons": "2.0.0-rc.24",
65
- "@strapi/utils": "5.13.1",
65
+ "@strapi/design-system": "2.0.0-rc.30",
66
+ "@strapi/icons": "2.0.0-rc.30",
67
+ "@strapi/utils": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
66
68
  graphql: "^16.8.1",
67
69
  "graphql-depth-limit": "^1.1.0",
68
70
  "graphql-playground-middleware-koa": "^1.6.21",
@@ -74,19 +76,19 @@ var dependencies = {
74
76
  pluralize: "8.0.0"
75
77
  };
76
78
  var devDependencies = {
77
- "@strapi/strapi": "5.13.1",
78
- "@strapi/types": "5.13.1",
79
+ "@strapi/strapi": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
80
+ "@strapi/types": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
79
81
  "@types/graphql-depth-limit": "1.1.5",
80
82
  "@types/koa-bodyparser": "4.3.12",
81
83
  "@types/koa__cors": "5.0.0",
82
84
  "cross-env": "^7.0.3",
83
- "eslint-config-custom": "5.13.1",
84
- koa: "2.15.4",
85
+ "eslint-config-custom": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
86
+ koa: "2.16.1",
85
87
  react: "18.3.1",
86
88
  "react-dom": "18.3.1",
87
89
  "react-router-dom": "6.22.3",
88
90
  "styled-components": "6.1.8",
89
- tsconfig: "5.13.1",
91
+ tsconfig: "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
90
92
  typescript: "5.4.4"
91
93
  };
92
94
  var peerDependencies = {
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/plugin-graphql";
2
- var version = "5.13.1";
2
+ var version = "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d";
3
3
  var description = "Adds GraphQL endpoint with default API methods.";
4
4
  var repository = {
5
5
  type: "git",
@@ -48,6 +48,8 @@ var scripts = {
48
48
  "build:types:admin": "run -T tsc -p admin/tsconfig.build.json --emitDeclarationOnly",
49
49
  clean: "run -T rimraf ./dist",
50
50
  lint: "run -T eslint .",
51
+ "test:unit": "run -T jest --passWithNoTests",
52
+ "test:unit:watch": "run -T jest --watch",
51
53
  watch: "run -T rollup -c -w"
52
54
  };
53
55
  var dependencies = {
@@ -56,9 +58,9 @@ var dependencies = {
56
58
  "@graphql-tools/schema": "10.0.3",
57
59
  "@graphql-tools/utils": "^10.1.3",
58
60
  "@koa/cors": "5.0.0",
59
- "@strapi/design-system": "2.0.0-rc.24",
60
- "@strapi/icons": "2.0.0-rc.24",
61
- "@strapi/utils": "5.13.1",
61
+ "@strapi/design-system": "2.0.0-rc.30",
62
+ "@strapi/icons": "2.0.0-rc.30",
63
+ "@strapi/utils": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
62
64
  graphql: "^16.8.1",
63
65
  "graphql-depth-limit": "^1.1.0",
64
66
  "graphql-playground-middleware-koa": "^1.6.21",
@@ -70,19 +72,19 @@ var dependencies = {
70
72
  pluralize: "8.0.0"
71
73
  };
72
74
  var devDependencies = {
73
- "@strapi/strapi": "5.13.1",
74
- "@strapi/types": "5.13.1",
75
+ "@strapi/strapi": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
76
+ "@strapi/types": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
75
77
  "@types/graphql-depth-limit": "1.1.5",
76
78
  "@types/koa-bodyparser": "4.3.12",
77
79
  "@types/koa__cors": "5.0.0",
78
80
  "cross-env": "^7.0.3",
79
- "eslint-config-custom": "5.13.1",
80
- koa: "2.15.4",
81
+ "eslint-config-custom": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
82
+ koa: "2.16.1",
81
83
  react: "18.3.1",
82
84
  "react-dom": "18.3.1",
83
85
  "react-router-dom": "6.22.3",
84
86
  "styled-components": "6.1.8",
85
- tsconfig: "5.13.1",
87
+ tsconfig: "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
86
88
  typescript: "5.4.4"
87
89
  };
88
90
  var peerDependencies = {
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -85,6 +85,30 @@ async function bootstrap({ strapi }) {
85
85
  const { config } = strapi.plugin('graphql');
86
86
  const path = config('endpoint');
87
87
  const landingPage = determineLandingPage(strapi);
88
+ /**
89
+ * We need the arguments passed to the root query to be available in the association resolver
90
+ * so we can forward those arguments along to any relations.
91
+ *
92
+ * In order to do that we are currently storing the arguments in context.
93
+ * There is likely a better solution, but for now this is the simplest fix we could find.
94
+ *
95
+ * @see https://github.com/strapi/strapi/issues/23524
96
+ */ const pluginAddRootQueryArgs = {
97
+ async requestDidStart () {
98
+ return {
99
+ async executionDidStart () {
100
+ return {
101
+ willResolveField ({ source, args, contextValue, info }) {
102
+ if (!source && info.operation.operation === 'query') {
103
+ // NOTE: context.rootQueryArgs is intended for internal use only
104
+ contextValue.rootQueryArgs = args;
105
+ }
106
+ }
107
+ };
108
+ }
109
+ };
110
+ }
111
+ };
88
112
  const defaultServerConfig = {
89
113
  // Schema
90
114
  schema,
@@ -101,7 +125,8 @@ async function bootstrap({ strapi }) {
101
125
  // send 400 http status instead of 200 for input validation errors
102
126
  status400ForVariableCoercionErrors: true,
103
127
  plugins: [
104
- landingPage
128
+ landingPage,
129
+ pluginAddRootQueryArgs
105
130
  ],
106
131
  cache: 'bounded'
107
132
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { isEmpty, mergeWith, isArray, isObject, isFunction } from 'lodash/fp';\nimport { ApolloServer, type ApolloServerPlugin, type ApolloServerOptions } from '@apollo/server';\nimport {\n ApolloServerPluginLandingPageLocalDefault,\n ApolloServerPluginLandingPageProductionDefault,\n} from '@apollo/server/plugin/landingPage/default';\nimport { koaMiddleware } from '@as-integrations/koa';\nimport depthLimit from 'graphql-depth-limit';\nimport bodyParser from 'koa-bodyparser';\nimport cors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\nimport type { BaseContext, DefaultContextExtends, DefaultStateExtends } from 'koa';\n\nimport { formatGraphqlError } from './format-graphql-error';\n\nconst merge = mergeWith((a, b) => {\n if (isArray(a) && isArray(b)) {\n return a.concat(b);\n }\n});\n\nexport const determineLandingPage = (strapi: Core.Strapi) => {\n const { config } = strapi.plugin('graphql');\n const utils = strapi.plugin('graphql').service('utils');\n\n /**\n * configLanding page may be one of the following:\n *\n * - true: always use \"playground\" even in production\n * - false: never show \"playground\" even in non-production\n * - undefined: default Apollo behavior (hide playground on production)\n * - a function that returns an Apollo plugin that implements renderLandingPage\n ** */\n const configLandingPage = config('landingPage');\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n const localLanding = () => {\n strapi.log.debug('Apollo landing page: local');\n utils.playground.setEnabled(true);\n return ApolloServerPluginLandingPageLocalDefault();\n };\n\n const prodLanding = () => {\n strapi.log.debug('Apollo landing page: production');\n utils.playground.setEnabled(false);\n return ApolloServerPluginLandingPageProductionDefault();\n };\n\n const userLanding = (userFunction: (strapi?: Core.Strapi) => ApolloServerPlugin | boolean) => {\n strapi.log.debug('Apollo landing page: from user-defined function...');\n const result = userFunction(strapi);\n if (result === true) {\n return localLanding();\n }\n if (result === false) {\n return prodLanding();\n }\n strapi.log.debug('Apollo landing page: user-defined');\n return result;\n };\n\n // DEPRECATED, remove in Strapi v6\n const playgroundAlways = config('playgroundAlways');\n if (playgroundAlways !== undefined) {\n strapi.log.warn(\n 'The graphql config playgroundAlways is deprecated. This will be removed in Strapi 6. Please use landingPage instead. '\n );\n }\n if (playgroundAlways === false) {\n strapi.log.warn(\n 'graphql config playgroundAlways:false has no effect, please use landingPage:false to disable Graphql Playground in all environments'\n );\n }\n\n if (playgroundAlways || configLandingPage === true) {\n return localLanding();\n }\n\n // if landing page has been disabled, use production\n if (configLandingPage === false) {\n return prodLanding();\n }\n\n // If user did not define any settings, use our defaults\n if (configLandingPage === undefined) {\n return isProduction ? prodLanding() : localLanding();\n }\n\n // if user provided a landing page function, return that\n if (isFunction(configLandingPage)) {\n return userLanding(configLandingPage);\n }\n\n // If no other setting could be found, default to production settings\n strapi.log.warn(\n 'Your Graphql landing page has been disabled because there is a problem with your Graphql settings'\n );\n return prodLanding();\n};\n\nexport async function bootstrap({ strapi }: { strapi: Core.Strapi }) {\n // Generate the GraphQL schema for the content API\n const schema = strapi.plugin('graphql').service('content-api').buildSchema();\n\n if (isEmpty(schema)) {\n strapi.log.warn('The GraphQL schema has not been generated because it is empty');\n\n return;\n }\n\n const { config } = strapi.plugin('graphql');\n\n const path: string = config('endpoint');\n\n const landingPage = determineLandingPage(strapi);\n\n type CustomOptions = {\n cors: boolean;\n uploads: boolean;\n bodyParserConfig: boolean;\n };\n\n const defaultServerConfig: ApolloServerOptions<BaseContext> & CustomOptions = {\n // Schema\n schema,\n\n // Validation\n validationRules: [depthLimit(config('depthLimit') as number) as any],\n\n // Errors\n formatError: formatGraphqlError,\n\n // Misc\n cors: false,\n uploads: false,\n bodyParserConfig: true,\n // send 400 http status instead of 200 for input validation errors\n status400ForVariableCoercionErrors: true,\n plugins: [landingPage],\n\n cache: 'bounded' as const,\n };\n\n const serverConfig = merge(\n defaultServerConfig,\n config('apolloServer')\n ) as ApolloServerOptions<BaseContext> & CustomOptions;\n\n // Create a new Apollo server\n const server = new ApolloServer(serverConfig);\n\n try {\n // server.start() must be called before using server.applyMiddleware()\n await server.start();\n } catch (error) {\n if (error instanceof Error) {\n strapi.log.error('Failed to start the Apollo server', error.message);\n }\n\n throw error;\n }\n\n // Create the route handlers for Strapi\n const handler: Core.MiddlewareHandler[] = [];\n\n // add cors middleware\n if (cors) {\n handler.push(cors());\n }\n\n // add koa bodyparser middleware\n if (isObject(serverConfig.bodyParserConfig)) {\n handler.push(bodyParser(serverConfig.bodyParserConfig));\n } else if (serverConfig.bodyParserConfig) {\n handler.push(bodyParser());\n } else {\n strapi.log.debug('Body parser has been disabled for Apollo server');\n }\n\n // add the Strapi auth middleware\n handler.push((ctx, next) => {\n ctx.state.route = {\n info: {\n // Indicate it's a content API route\n type: 'content-api',\n },\n };\n\n const isPlaygroundRequest =\n ctx.request.method === 'GET' &&\n ctx.request.url === path && // Matches the GraphQL endpoint\n strapi.plugin('graphql').service('utils').playground.isEnabled() && // Only allow if the Playground is enabled\n ctx.request.header.accept?.includes('text/html'); // Specific to Playground UI loading\n\n // Skip authentication for the GraphQL Playground UI\n if (isPlaygroundRequest) {\n return next();\n }\n\n return strapi.auth.authenticate(ctx, next);\n });\n\n // add the graphql server for koa\n handler.push(\n koaMiddleware<DefaultStateExtends, DefaultContextExtends>(server, {\n // Initialize loaders for this request.\n context: async ({ ctx }) => ({\n state: ctx.state,\n koaContext: ctx,\n }),\n })\n );\n\n // now that handlers are set up, add the graphql route to our apollo server\n strapi.server.routes([\n {\n method: 'ALL',\n path,\n handler,\n config: {\n auth: false,\n },\n },\n ]);\n\n // Register destroy behavior\n // We're doing it here instead of exposing a destroy method to the strapi-server.js\n // file since we need to have access to the ApolloServer instance\n strapi.plugin('graphql').destroy = async () => {\n await server.stop();\n };\n}\n"],"names":["merge","mergeWith","a","b","isArray","concat","determineLandingPage","strapi","config","plugin","utils","service","configLandingPage","isProduction","process","env","NODE_ENV","localLanding","log","debug","playground","setEnabled","ApolloServerPluginLandingPageLocalDefault","prodLanding","ApolloServerPluginLandingPageProductionDefault","userLanding","userFunction","result","playgroundAlways","undefined","warn","isFunction","bootstrap","schema","buildSchema","isEmpty","path","landingPage","defaultServerConfig","validationRules","depthLimit","formatError","formatGraphqlError","cors","uploads","bodyParserConfig","status400ForVariableCoercionErrors","plugins","cache","serverConfig","server","ApolloServer","start","error","Error","message","handler","push","isObject","bodyParser","ctx","next","state","route","info","type","isPlaygroundRequest","request","method","url","isEnabled","header","accept","includes","auth","authenticate","koaMiddleware","context","koaContext","routes","destroy","stop"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { isEmpty, mergeWith, isArray, isObject, isFunction } from 'lodash/fp';\nimport { ApolloServer, type ApolloServerPlugin, type ApolloServerOptions } from '@apollo/server';\nimport {\n ApolloServerPluginLandingPageLocalDefault,\n ApolloServerPluginLandingPageProductionDefault,\n} from '@apollo/server/plugin/landingPage/default';\nimport { koaMiddleware } from '@as-integrations/koa';\nimport depthLimit from 'graphql-depth-limit';\nimport bodyParser from 'koa-bodyparser';\nimport cors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\nimport type { BaseContext, DefaultContextExtends, DefaultStateExtends } from 'koa';\n\nimport { formatGraphqlError } from './format-graphql-error';\n\nconst merge = mergeWith((a, b) => {\n if (isArray(a) && isArray(b)) {\n return a.concat(b);\n }\n});\n\ntype StrapiGraphQLContext = BaseContext & {\n rootQueryArgs?: Record<string, unknown>;\n};\n\nexport const determineLandingPage = (\n strapi: Core.Strapi\n): ApolloServerPlugin<StrapiGraphQLContext> => {\n const { config } = strapi.plugin('graphql');\n const utils = strapi.plugin('graphql').service('utils');\n\n /**\n * configLanding page may be one of the following:\n *\n * - true: always use \"playground\" even in production\n * - false: never show \"playground\" even in non-production\n * - undefined: default Apollo behavior (hide playground on production)\n * - a function that returns an Apollo plugin that implements renderLandingPage\n ** */\n const configLandingPage = config('landingPage');\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n const localLanding = () => {\n strapi.log.debug('Apollo landing page: local');\n utils.playground.setEnabled(true);\n return ApolloServerPluginLandingPageLocalDefault();\n };\n\n const prodLanding = () => {\n strapi.log.debug('Apollo landing page: production');\n utils.playground.setEnabled(false);\n return ApolloServerPluginLandingPageProductionDefault();\n };\n\n const userLanding = (userFunction: (strapi?: Core.Strapi) => ApolloServerPlugin | boolean) => {\n strapi.log.debug('Apollo landing page: from user-defined function...');\n const result = userFunction(strapi);\n if (result === true) {\n return localLanding();\n }\n if (result === false) {\n return prodLanding();\n }\n strapi.log.debug('Apollo landing page: user-defined');\n return result;\n };\n\n // DEPRECATED, remove in Strapi v6\n const playgroundAlways = config('playgroundAlways');\n if (playgroundAlways !== undefined) {\n strapi.log.warn(\n 'The graphql config playgroundAlways is deprecated. This will be removed in Strapi 6. Please use landingPage instead. '\n );\n }\n if (playgroundAlways === false) {\n strapi.log.warn(\n 'graphql config playgroundAlways:false has no effect, please use landingPage:false to disable Graphql Playground in all environments'\n );\n }\n\n if (playgroundAlways || configLandingPage === true) {\n return localLanding();\n }\n\n // if landing page has been disabled, use production\n if (configLandingPage === false) {\n return prodLanding();\n }\n\n // If user did not define any settings, use our defaults\n if (configLandingPage === undefined) {\n return isProduction ? prodLanding() : localLanding();\n }\n\n // if user provided a landing page function, return that\n if (isFunction(configLandingPage)) {\n return userLanding(configLandingPage);\n }\n\n // If no other setting could be found, default to production settings\n strapi.log.warn(\n 'Your Graphql landing page has been disabled because there is a problem with your Graphql settings'\n );\n return prodLanding();\n};\n\nexport async function bootstrap({ strapi }: { strapi: Core.Strapi }) {\n // Generate the GraphQL schema for the content API\n const schema = strapi.plugin('graphql').service('content-api').buildSchema();\n\n if (isEmpty(schema)) {\n strapi.log.warn('The GraphQL schema has not been generated because it is empty');\n\n return;\n }\n\n const { config } = strapi.plugin('graphql');\n\n const path: string = config('endpoint');\n\n const landingPage = determineLandingPage(strapi);\n /**\n * We need the arguments passed to the root query to be available in the association resolver\n * so we can forward those arguments along to any relations.\n *\n * In order to do that we are currently storing the arguments in context.\n * There is likely a better solution, but for now this is the simplest fix we could find.\n *\n * @see https://github.com/strapi/strapi/issues/23524\n */\n const pluginAddRootQueryArgs: ApolloServerPlugin<StrapiGraphQLContext> = {\n async requestDidStart() {\n return {\n async executionDidStart() {\n return {\n willResolveField({ source, args, contextValue, info }) {\n if (!source && info.operation.operation === 'query') {\n // NOTE: context.rootQueryArgs is intended for internal use only\n contextValue.rootQueryArgs = args;\n }\n },\n };\n },\n };\n },\n };\n\n type CustomOptions = {\n cors: boolean;\n uploads: boolean;\n bodyParserConfig: boolean;\n };\n\n const defaultServerConfig: ApolloServerOptions<StrapiGraphQLContext> & CustomOptions = {\n // Schema\n schema,\n\n // Validation\n validationRules: [depthLimit(config('depthLimit') as number) as any],\n\n // Errors\n formatError: formatGraphqlError,\n\n // Misc\n cors: false,\n uploads: false,\n bodyParserConfig: true,\n // send 400 http status instead of 200 for input validation errors\n status400ForVariableCoercionErrors: true,\n plugins: [landingPage, pluginAddRootQueryArgs],\n\n cache: 'bounded' as const,\n };\n\n const serverConfig = merge(\n defaultServerConfig,\n config('apolloServer')\n ) as ApolloServerOptions<StrapiGraphQLContext> & CustomOptions;\n\n // Create a new Apollo server\n const server = new ApolloServer(serverConfig);\n\n try {\n // server.start() must be called before using server.applyMiddleware()\n await server.start();\n } catch (error) {\n if (error instanceof Error) {\n strapi.log.error('Failed to start the Apollo server', error.message);\n }\n\n throw error;\n }\n\n // Create the route handlers for Strapi\n const handler: Core.MiddlewareHandler[] = [];\n\n // add cors middleware\n if (cors) {\n handler.push(cors());\n }\n\n // add koa bodyparser middleware\n if (isObject(serverConfig.bodyParserConfig)) {\n handler.push(bodyParser(serverConfig.bodyParserConfig));\n } else if (serverConfig.bodyParserConfig) {\n handler.push(bodyParser());\n } else {\n strapi.log.debug('Body parser has been disabled for Apollo server');\n }\n\n // add the Strapi auth middleware\n handler.push((ctx, next) => {\n ctx.state.route = {\n info: {\n // Indicate it's a content API route\n type: 'content-api',\n },\n };\n\n const isPlaygroundRequest =\n ctx.request.method === 'GET' &&\n ctx.request.url === path && // Matches the GraphQL endpoint\n strapi.plugin('graphql').service('utils').playground.isEnabled() && // Only allow if the Playground is enabled\n ctx.request.header.accept?.includes('text/html'); // Specific to Playground UI loading\n\n // Skip authentication for the GraphQL Playground UI\n if (isPlaygroundRequest) {\n return next();\n }\n\n return strapi.auth.authenticate(ctx, next);\n });\n\n // add the graphql server for koa\n handler.push(\n koaMiddleware<DefaultStateExtends, DefaultContextExtends>(server, {\n // Initialize loaders for this request.\n context: async ({ ctx }) => ({\n state: ctx.state,\n koaContext: ctx,\n }),\n })\n );\n\n // now that handlers are set up, add the graphql route to our apollo server\n strapi.server.routes([\n {\n method: 'ALL',\n path,\n handler,\n config: {\n auth: false,\n },\n },\n ]);\n\n // Register destroy behavior\n // We're doing it here instead of exposing a destroy method to the strapi-server.js\n // file since we need to have access to the ApolloServer instance\n strapi.plugin('graphql').destroy = async () => {\n await server.stop();\n };\n}\n"],"names":["merge","mergeWith","a","b","isArray","concat","determineLandingPage","strapi","config","plugin","utils","service","configLandingPage","isProduction","process","env","NODE_ENV","localLanding","log","debug","playground","setEnabled","ApolloServerPluginLandingPageLocalDefault","prodLanding","ApolloServerPluginLandingPageProductionDefault","userLanding","userFunction","result","playgroundAlways","undefined","warn","isFunction","bootstrap","schema","buildSchema","isEmpty","path","landingPage","pluginAddRootQueryArgs","requestDidStart","executionDidStart","willResolveField","source","args","contextValue","info","operation","rootQueryArgs","defaultServerConfig","validationRules","depthLimit","formatError","formatGraphqlError","cors","uploads","bodyParserConfig","status400ForVariableCoercionErrors","plugins","cache","serverConfig","server","ApolloServer","start","error","Error","message","handler","push","isObject","bodyParser","ctx","next","state","route","type","isPlaygroundRequest","request","method","url","isEnabled","header","accept","includes","auth","authenticate","koaMiddleware","context","koaContext","routes","destroy","stop"],"mappings":";;;;;;;;;;;AAgBA,MAAMA,KAAAA,GAAQC,YAAU,CAAA,CAACC,CAAGC,EAAAA,CAAAA,GAAAA;IAC1B,IAAIC,UAAAA,CAAQF,CAAME,CAAAA,IAAAA,UAAAA,CAAQD,CAAI,CAAA,EAAA;QAC5B,OAAOD,CAAAA,CAAEG,MAAM,CAACF,CAAAA,CAAAA;AAClB;AACF,CAAA,CAAA;AAMO,MAAMG,uBAAuB,CAClCC,MAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGD,MAAAA,CAAOE,MAAM,CAAC,SAAA,CAAA;AACjC,IAAA,MAAMC,QAAQH,MAAOE,CAAAA,MAAM,CAAC,SAAA,CAAA,CAAWE,OAAO,CAAC,OAAA,CAAA;AAE/C;;;;;;;SAQA,MAAMC,oBAAoBJ,MAAO,CAAA,aAAA,CAAA;AAEjC,IAAA,MAAMK,YAAeC,GAAAA,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AAE9C,IAAA,MAAMC,YAAe,GAAA,IAAA;QACnBV,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,4BAAA,CAAA;QACjBT,KAAMU,CAAAA,UAAU,CAACC,UAAU,CAAC,IAAA,CAAA;QAC5B,OAAOC,kDAAAA,EAAAA;AACT,KAAA;AAEA,IAAA,MAAMC,WAAc,GAAA,IAAA;QAClBhB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,iCAAA,CAAA;QACjBT,KAAMU,CAAAA,UAAU,CAACC,UAAU,CAAC,KAAA,CAAA;QAC5B,OAAOG,uDAAAA,EAAAA;AACT,KAAA;AAEA,IAAA,MAAMC,cAAc,CAACC,YAAAA,GAAAA;QACnBnB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,oDAAA,CAAA;AACjB,QAAA,MAAMQ,SAASD,YAAanB,CAAAA,MAAAA,CAAAA;AAC5B,QAAA,IAAIoB,WAAW,IAAM,EAAA;YACnB,OAAOV,YAAAA,EAAAA;AACT;AACA,QAAA,IAAIU,WAAW,KAAO,EAAA;YACpB,OAAOJ,WAAAA,EAAAA;AACT;QACAhB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,mCAAA,CAAA;QACjB,OAAOQ,MAAAA;AACT,KAAA;;AAGA,IAAA,MAAMC,mBAAmBpB,MAAO,CAAA,kBAAA,CAAA;AAChC,IAAA,IAAIoB,qBAAqBC,SAAW,EAAA;QAClCtB,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,uHAAA,CAAA;AAEJ;AACA,IAAA,IAAIF,qBAAqB,KAAO,EAAA;QAC9BrB,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,qIAAA,CAAA;AAEJ;IAEA,IAAIF,gBAAAA,IAAoBhB,sBAAsB,IAAM,EAAA;QAClD,OAAOK,YAAAA,EAAAA;AACT;;AAGA,IAAA,IAAIL,sBAAsB,KAAO,EAAA;QAC/B,OAAOW,WAAAA,EAAAA;AACT;;AAGA,IAAA,IAAIX,sBAAsBiB,SAAW,EAAA;AACnC,QAAA,OAAOhB,eAAeU,WAAgBN,EAAAA,GAAAA,YAAAA,EAAAA;AACxC;;AAGA,IAAA,IAAIc,cAAWnB,iBAAoB,CAAA,EAAA;AACjC,QAAA,OAAOa,WAAYb,CAAAA,iBAAAA,CAAAA;AACrB;;IAGAL,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,mGAAA,CAAA;IAEF,OAAOP,WAAAA,EAAAA;AACT;AAEO,eAAeS,SAAAA,CAAU,EAAEzB,MAAM,EAA2B,EAAA;;IAEjE,MAAM0B,MAAAA,GAAS1B,OAAOE,MAAM,CAAC,WAAWE,OAAO,CAAC,eAAeuB,WAAW,EAAA;AAE1E,IAAA,IAAIC,WAAQF,MAAS,CAAA,EAAA;QACnB1B,MAAOW,CAAAA,GAAG,CAACY,IAAI,CAAC,+DAAA,CAAA;AAEhB,QAAA;AACF;AAEA,IAAA,MAAM,EAAEtB,MAAM,EAAE,GAAGD,MAAAA,CAAOE,MAAM,CAAC,SAAA,CAAA;AAEjC,IAAA,MAAM2B,OAAe5B,MAAO,CAAA,UAAA,CAAA;AAE5B,IAAA,MAAM6B,cAAc/B,oBAAqBC,CAAAA,MAAAA,CAAAA;AACzC;;;;;;;;AAQC,MACD,MAAM+B,sBAAmE,GAAA;QACvE,MAAMC,eAAAA,CAAAA,GAAAA;YACJ,OAAO;gBACL,MAAMC,iBAAAA,CAAAA,GAAAA;oBACJ,OAAO;wBACLC,gBAAiB,CAAA,CAAA,EAAEC,MAAM,EAAEC,IAAI,EAAEC,YAAY,EAAEC,IAAI,EAAE,EAAA;AACnD,4BAAA,IAAI,CAACH,MAAUG,IAAAA,IAAAA,CAAKC,SAAS,CAACA,SAAS,KAAK,OAAS,EAAA;;AAEnDF,gCAAAA,YAAAA,CAAaG,aAAa,GAAGJ,IAAAA;AAC/B;AACF;AACF,qBAAA;AACF;AACF,aAAA;AACF;AACF,KAAA;AAQA,IAAA,MAAMK,mBAAiF,GAAA;;AAErFf,QAAAA,MAAAA;;QAGAgB,eAAiB,EAAA;AAACC,YAAAA,UAAAA,CAAW1C,MAAO,CAAA,YAAA,CAAA;AAAgC,SAAA;;QAGpE2C,WAAaC,EAAAA,qCAAAA;;QAGbC,IAAM,EAAA,KAAA;QACNC,OAAS,EAAA,KAAA;QACTC,gBAAkB,EAAA,IAAA;;QAElBC,kCAAoC,EAAA,IAAA;QACpCC,OAAS,EAAA;AAACpB,YAAAA,WAAAA;AAAaC,YAAAA;AAAuB,SAAA;QAE9CoB,KAAO,EAAA;AACT,KAAA;IAEA,MAAMC,YAAAA,GAAe3D,KACnBgD,CAAAA,mBAAAA,EACAxC,MAAO,CAAA,cAAA,CAAA,CAAA;;IAIT,MAAMoD,QAAAA,GAAS,IAAIC,mBAAaF,CAAAA,YAAAA,CAAAA;IAEhC,IAAI;;AAEF,QAAA,MAAMC,SAAOE,KAAK,EAAA;AACpB,KAAA,CAAE,OAAOC,KAAO,EAAA;AACd,QAAA,IAAIA,iBAAiBC,KAAO,EAAA;AAC1BzD,YAAAA,MAAAA,CAAOW,GAAG,CAAC6C,KAAK,CAAC,mCAAA,EAAqCA,MAAME,OAAO,CAAA;AACrE;QAEA,MAAMF,KAAAA;AACR;;AAGA,IAAA,MAAMG,UAAoC,EAAE;;AAG5C,IAAA,IAAIb,IAAM,EAAA;AACRa,QAAAA,OAAAA,CAAQC,IAAI,CAACd,IAAAA,EAAAA,CAAAA;AACf;;IAGA,IAAIe,WAAAA,CAAST,YAAaJ,CAAAA,gBAAgB,CAAG,EAAA;AAC3CW,QAAAA,OAAAA,CAAQC,IAAI,CAACE,UAAWV,CAAAA,YAAAA,CAAaJ,gBAAgB,CAAA,CAAA;KAChD,MAAA,IAAII,YAAaJ,CAAAA,gBAAgB,EAAE;AACxCW,QAAAA,OAAAA,CAAQC,IAAI,CAACE,UAAAA,EAAAA,CAAAA;KACR,MAAA;QACL9D,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,iDAAA,CAAA;AACnB;;IAGA+C,OAAQC,CAAAA,IAAI,CAAC,CAACG,GAAKC,EAAAA,IAAAA,GAAAA;QACjBD,GAAIE,CAAAA,KAAK,CAACC,KAAK,GAAG;YAChB5B,IAAM,EAAA;;gBAEJ6B,IAAM,EAAA;AACR;AACF,SAAA;AAEA,QAAA,MAAMC,mBACJL,GAAAA,GAAAA,CAAIM,OAAO,CAACC,MAAM,KAAK,KACvBP,IAAAA,GAAAA,CAAIM,OAAO,CAACE,GAAG,KAAK1C;QACpB7B,MAAOE,CAAAA,MAAM,CAAC,SAAA,CAAA,CAAWE,OAAO,CAAC,SAASS,UAAU,CAAC2D,SAAS,EAAA;QAC9DT,GAAIM,CAAAA,OAAO,CAACI,MAAM,CAACC,MAAM,EAAEC,QAAAA,CAAS;;AAGtC,QAAA,IAAIP,mBAAqB,EAAA;YACvB,OAAOJ,IAAAA,EAAAA;AACT;AAEA,QAAA,OAAOhE,MAAO4E,CAAAA,IAAI,CAACC,YAAY,CAACd,GAAKC,EAAAA,IAAAA,CAAAA;AACvC,KAAA,CAAA;;IAGAL,OAAQC,CAAAA,IAAI,CACVkB,iBAAAA,CAA0DzB,QAAQ,EAAA;;AAEhE0B,QAAAA,OAAAA,EAAS,OAAO,EAAEhB,GAAG,EAAE,IAAM;AAC3BE,gBAAAA,KAAAA,EAAOF,IAAIE,KAAK;gBAChBe,UAAYjB,EAAAA;aACd;AACF,KAAA,CAAA,CAAA;;IAIF/D,MAAOqD,CAAAA,MAAM,CAAC4B,MAAM,CAAC;AACnB,QAAA;YACEX,MAAQ,EAAA,KAAA;AACRzC,YAAAA,IAAAA;AACA8B,YAAAA,OAAAA;YACA1D,MAAQ,EAAA;gBACN2E,IAAM,EAAA;AACR;AACF;AACD,KAAA,CAAA;;;;AAKD5E,IAAAA,MAAAA,CAAOE,MAAM,CAAC,SAAWgF,CAAAA,CAAAA,OAAO,GAAG,UAAA;AACjC,QAAA,MAAM7B,SAAO8B,IAAI,EAAA;AACnB,KAAA;AACF;;;;;"}
@@ -83,6 +83,30 @@ async function bootstrap({ strapi }) {
83
83
  const { config } = strapi.plugin('graphql');
84
84
  const path = config('endpoint');
85
85
  const landingPage = determineLandingPage(strapi);
86
+ /**
87
+ * We need the arguments passed to the root query to be available in the association resolver
88
+ * so we can forward those arguments along to any relations.
89
+ *
90
+ * In order to do that we are currently storing the arguments in context.
91
+ * There is likely a better solution, but for now this is the simplest fix we could find.
92
+ *
93
+ * @see https://github.com/strapi/strapi/issues/23524
94
+ */ const pluginAddRootQueryArgs = {
95
+ async requestDidStart () {
96
+ return {
97
+ async executionDidStart () {
98
+ return {
99
+ willResolveField ({ source, args, contextValue, info }) {
100
+ if (!source && info.operation.operation === 'query') {
101
+ // NOTE: context.rootQueryArgs is intended for internal use only
102
+ contextValue.rootQueryArgs = args;
103
+ }
104
+ }
105
+ };
106
+ }
107
+ };
108
+ }
109
+ };
86
110
  const defaultServerConfig = {
87
111
  // Schema
88
112
  schema,
@@ -99,7 +123,8 @@ async function bootstrap({ strapi }) {
99
123
  // send 400 http status instead of 200 for input validation errors
100
124
  status400ForVariableCoercionErrors: true,
101
125
  plugins: [
102
- landingPage
126
+ landingPage,
127
+ pluginAddRootQueryArgs
103
128
  ],
104
129
  cache: 'bounded'
105
130
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { isEmpty, mergeWith, isArray, isObject, isFunction } from 'lodash/fp';\nimport { ApolloServer, type ApolloServerPlugin, type ApolloServerOptions } from '@apollo/server';\nimport {\n ApolloServerPluginLandingPageLocalDefault,\n ApolloServerPluginLandingPageProductionDefault,\n} from '@apollo/server/plugin/landingPage/default';\nimport { koaMiddleware } from '@as-integrations/koa';\nimport depthLimit from 'graphql-depth-limit';\nimport bodyParser from 'koa-bodyparser';\nimport cors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\nimport type { BaseContext, DefaultContextExtends, DefaultStateExtends } from 'koa';\n\nimport { formatGraphqlError } from './format-graphql-error';\n\nconst merge = mergeWith((a, b) => {\n if (isArray(a) && isArray(b)) {\n return a.concat(b);\n }\n});\n\nexport const determineLandingPage = (strapi: Core.Strapi) => {\n const { config } = strapi.plugin('graphql');\n const utils = strapi.plugin('graphql').service('utils');\n\n /**\n * configLanding page may be one of the following:\n *\n * - true: always use \"playground\" even in production\n * - false: never show \"playground\" even in non-production\n * - undefined: default Apollo behavior (hide playground on production)\n * - a function that returns an Apollo plugin that implements renderLandingPage\n ** */\n const configLandingPage = config('landingPage');\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n const localLanding = () => {\n strapi.log.debug('Apollo landing page: local');\n utils.playground.setEnabled(true);\n return ApolloServerPluginLandingPageLocalDefault();\n };\n\n const prodLanding = () => {\n strapi.log.debug('Apollo landing page: production');\n utils.playground.setEnabled(false);\n return ApolloServerPluginLandingPageProductionDefault();\n };\n\n const userLanding = (userFunction: (strapi?: Core.Strapi) => ApolloServerPlugin | boolean) => {\n strapi.log.debug('Apollo landing page: from user-defined function...');\n const result = userFunction(strapi);\n if (result === true) {\n return localLanding();\n }\n if (result === false) {\n return prodLanding();\n }\n strapi.log.debug('Apollo landing page: user-defined');\n return result;\n };\n\n // DEPRECATED, remove in Strapi v6\n const playgroundAlways = config('playgroundAlways');\n if (playgroundAlways !== undefined) {\n strapi.log.warn(\n 'The graphql config playgroundAlways is deprecated. This will be removed in Strapi 6. Please use landingPage instead. '\n );\n }\n if (playgroundAlways === false) {\n strapi.log.warn(\n 'graphql config playgroundAlways:false has no effect, please use landingPage:false to disable Graphql Playground in all environments'\n );\n }\n\n if (playgroundAlways || configLandingPage === true) {\n return localLanding();\n }\n\n // if landing page has been disabled, use production\n if (configLandingPage === false) {\n return prodLanding();\n }\n\n // If user did not define any settings, use our defaults\n if (configLandingPage === undefined) {\n return isProduction ? prodLanding() : localLanding();\n }\n\n // if user provided a landing page function, return that\n if (isFunction(configLandingPage)) {\n return userLanding(configLandingPage);\n }\n\n // If no other setting could be found, default to production settings\n strapi.log.warn(\n 'Your Graphql landing page has been disabled because there is a problem with your Graphql settings'\n );\n return prodLanding();\n};\n\nexport async function bootstrap({ strapi }: { strapi: Core.Strapi }) {\n // Generate the GraphQL schema for the content API\n const schema = strapi.plugin('graphql').service('content-api').buildSchema();\n\n if (isEmpty(schema)) {\n strapi.log.warn('The GraphQL schema has not been generated because it is empty');\n\n return;\n }\n\n const { config } = strapi.plugin('graphql');\n\n const path: string = config('endpoint');\n\n const landingPage = determineLandingPage(strapi);\n\n type CustomOptions = {\n cors: boolean;\n uploads: boolean;\n bodyParserConfig: boolean;\n };\n\n const defaultServerConfig: ApolloServerOptions<BaseContext> & CustomOptions = {\n // Schema\n schema,\n\n // Validation\n validationRules: [depthLimit(config('depthLimit') as number) as any],\n\n // Errors\n formatError: formatGraphqlError,\n\n // Misc\n cors: false,\n uploads: false,\n bodyParserConfig: true,\n // send 400 http status instead of 200 for input validation errors\n status400ForVariableCoercionErrors: true,\n plugins: [landingPage],\n\n cache: 'bounded' as const,\n };\n\n const serverConfig = merge(\n defaultServerConfig,\n config('apolloServer')\n ) as ApolloServerOptions<BaseContext> & CustomOptions;\n\n // Create a new Apollo server\n const server = new ApolloServer(serverConfig);\n\n try {\n // server.start() must be called before using server.applyMiddleware()\n await server.start();\n } catch (error) {\n if (error instanceof Error) {\n strapi.log.error('Failed to start the Apollo server', error.message);\n }\n\n throw error;\n }\n\n // Create the route handlers for Strapi\n const handler: Core.MiddlewareHandler[] = [];\n\n // add cors middleware\n if (cors) {\n handler.push(cors());\n }\n\n // add koa bodyparser middleware\n if (isObject(serverConfig.bodyParserConfig)) {\n handler.push(bodyParser(serverConfig.bodyParserConfig));\n } else if (serverConfig.bodyParserConfig) {\n handler.push(bodyParser());\n } else {\n strapi.log.debug('Body parser has been disabled for Apollo server');\n }\n\n // add the Strapi auth middleware\n handler.push((ctx, next) => {\n ctx.state.route = {\n info: {\n // Indicate it's a content API route\n type: 'content-api',\n },\n };\n\n const isPlaygroundRequest =\n ctx.request.method === 'GET' &&\n ctx.request.url === path && // Matches the GraphQL endpoint\n strapi.plugin('graphql').service('utils').playground.isEnabled() && // Only allow if the Playground is enabled\n ctx.request.header.accept?.includes('text/html'); // Specific to Playground UI loading\n\n // Skip authentication for the GraphQL Playground UI\n if (isPlaygroundRequest) {\n return next();\n }\n\n return strapi.auth.authenticate(ctx, next);\n });\n\n // add the graphql server for koa\n handler.push(\n koaMiddleware<DefaultStateExtends, DefaultContextExtends>(server, {\n // Initialize loaders for this request.\n context: async ({ ctx }) => ({\n state: ctx.state,\n koaContext: ctx,\n }),\n })\n );\n\n // now that handlers are set up, add the graphql route to our apollo server\n strapi.server.routes([\n {\n method: 'ALL',\n path,\n handler,\n config: {\n auth: false,\n },\n },\n ]);\n\n // Register destroy behavior\n // We're doing it here instead of exposing a destroy method to the strapi-server.js\n // file since we need to have access to the ApolloServer instance\n strapi.plugin('graphql').destroy = async () => {\n await server.stop();\n };\n}\n"],"names":["merge","mergeWith","a","b","isArray","concat","determineLandingPage","strapi","config","plugin","utils","service","configLandingPage","isProduction","process","env","NODE_ENV","localLanding","log","debug","playground","setEnabled","ApolloServerPluginLandingPageLocalDefault","prodLanding","ApolloServerPluginLandingPageProductionDefault","userLanding","userFunction","result","playgroundAlways","undefined","warn","isFunction","bootstrap","schema","buildSchema","isEmpty","path","landingPage","defaultServerConfig","validationRules","depthLimit","formatError","formatGraphqlError","cors","uploads","bodyParserConfig","status400ForVariableCoercionErrors","plugins","cache","serverConfig","server","ApolloServer","start","error","Error","message","handler","push","isObject","bodyParser","ctx","next","state","route","info","type","isPlaygroundRequest","request","method","url","isEnabled","header","accept","includes","auth","authenticate","koaMiddleware","context","koaContext","routes","destroy","stop"],"mappings":";;;;;;;;;AAgBA,MAAMA,KAAAA,GAAQC,SAAU,CAAA,CAACC,CAAGC,EAAAA,CAAAA,GAAAA;IAC1B,IAAIC,OAAAA,CAAQF,CAAME,CAAAA,IAAAA,OAAAA,CAAQD,CAAI,CAAA,EAAA;QAC5B,OAAOD,CAAAA,CAAEG,MAAM,CAACF,CAAAA,CAAAA;AAClB;AACF,CAAA,CAAA;AAEO,MAAMG,uBAAuB,CAACC,MAAAA,GAAAA;AACnC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGD,MAAAA,CAAOE,MAAM,CAAC,SAAA,CAAA;AACjC,IAAA,MAAMC,QAAQH,MAAOE,CAAAA,MAAM,CAAC,SAAA,CAAA,CAAWE,OAAO,CAAC,OAAA,CAAA;AAE/C;;;;;;;SAQA,MAAMC,oBAAoBJ,MAAO,CAAA,aAAA,CAAA;AAEjC,IAAA,MAAMK,YAAeC,GAAAA,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AAE9C,IAAA,MAAMC,YAAe,GAAA,IAAA;QACnBV,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,4BAAA,CAAA;QACjBT,KAAMU,CAAAA,UAAU,CAACC,UAAU,CAAC,IAAA,CAAA;QAC5B,OAAOC,yCAAAA,EAAAA;AACT,KAAA;AAEA,IAAA,MAAMC,WAAc,GAAA,IAAA;QAClBhB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,iCAAA,CAAA;QACjBT,KAAMU,CAAAA,UAAU,CAACC,UAAU,CAAC,KAAA,CAAA;QAC5B,OAAOG,8CAAAA,EAAAA;AACT,KAAA;AAEA,IAAA,MAAMC,cAAc,CAACC,YAAAA,GAAAA;QACnBnB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,oDAAA,CAAA;AACjB,QAAA,MAAMQ,SAASD,YAAanB,CAAAA,MAAAA,CAAAA;AAC5B,QAAA,IAAIoB,WAAW,IAAM,EAAA;YACnB,OAAOV,YAAAA,EAAAA;AACT;AACA,QAAA,IAAIU,WAAW,KAAO,EAAA;YACpB,OAAOJ,WAAAA,EAAAA;AACT;QACAhB,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,mCAAA,CAAA;QACjB,OAAOQ,MAAAA;AACT,KAAA;;AAGA,IAAA,MAAMC,mBAAmBpB,MAAO,CAAA,kBAAA,CAAA;AAChC,IAAA,IAAIoB,qBAAqBC,SAAW,EAAA;QAClCtB,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,uHAAA,CAAA;AAEJ;AACA,IAAA,IAAIF,qBAAqB,KAAO,EAAA;QAC9BrB,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,qIAAA,CAAA;AAEJ;IAEA,IAAIF,gBAAAA,IAAoBhB,sBAAsB,IAAM,EAAA;QAClD,OAAOK,YAAAA,EAAAA;AACT;;AAGA,IAAA,IAAIL,sBAAsB,KAAO,EAAA;QAC/B,OAAOW,WAAAA,EAAAA;AACT;;AAGA,IAAA,IAAIX,sBAAsBiB,SAAW,EAAA;AACnC,QAAA,OAAOhB,eAAeU,WAAgBN,EAAAA,GAAAA,YAAAA,EAAAA;AACxC;;AAGA,IAAA,IAAIc,WAAWnB,iBAAoB,CAAA,EAAA;AACjC,QAAA,OAAOa,WAAYb,CAAAA,iBAAAA,CAAAA;AACrB;;IAGAL,MAAOW,CAAAA,GAAG,CAACY,IAAI,CACb,mGAAA,CAAA;IAEF,OAAOP,WAAAA,EAAAA;AACT;AAEO,eAAeS,SAAAA,CAAU,EAAEzB,MAAM,EAA2B,EAAA;;IAEjE,MAAM0B,MAAAA,GAAS1B,OAAOE,MAAM,CAAC,WAAWE,OAAO,CAAC,eAAeuB,WAAW,EAAA;AAE1E,IAAA,IAAIC,QAAQF,MAAS,CAAA,EAAA;QACnB1B,MAAOW,CAAAA,GAAG,CAACY,IAAI,CAAC,+DAAA,CAAA;AAEhB,QAAA;AACF;AAEA,IAAA,MAAM,EAAEtB,MAAM,EAAE,GAAGD,MAAAA,CAAOE,MAAM,CAAC,SAAA,CAAA;AAEjC,IAAA,MAAM2B,OAAe5B,MAAO,CAAA,UAAA,CAAA;AAE5B,IAAA,MAAM6B,cAAc/B,oBAAqBC,CAAAA,MAAAA,CAAAA;AAQzC,IAAA,MAAM+B,mBAAwE,GAAA;;AAE5EL,QAAAA,MAAAA;;QAGAM,eAAiB,EAAA;AAACC,YAAAA,UAAAA,CAAWhC,MAAO,CAAA,YAAA,CAAA;AAAgC,SAAA;;QAGpEiC,WAAaC,EAAAA,kBAAAA;;QAGbC,IAAM,EAAA,KAAA;QACNC,OAAS,EAAA,KAAA;QACTC,gBAAkB,EAAA,IAAA;;QAElBC,kCAAoC,EAAA,IAAA;QACpCC,OAAS,EAAA;AAACV,YAAAA;AAAY,SAAA;QAEtBW,KAAO,EAAA;AACT,KAAA;IAEA,MAAMC,YAAAA,GAAejD,KACnBsC,CAAAA,mBAAAA,EACA9B,MAAO,CAAA,cAAA,CAAA,CAAA;;IAIT,MAAM0C,MAAAA,GAAS,IAAIC,YAAaF,CAAAA,YAAAA,CAAAA;IAEhC,IAAI;;AAEF,QAAA,MAAMC,OAAOE,KAAK,EAAA;AACpB,KAAA,CAAE,OAAOC,KAAO,EAAA;AACd,QAAA,IAAIA,iBAAiBC,KAAO,EAAA;AAC1B/C,YAAAA,MAAAA,CAAOW,GAAG,CAACmC,KAAK,CAAC,mCAAA,EAAqCA,MAAME,OAAO,CAAA;AACrE;QAEA,MAAMF,KAAAA;AACR;;AAGA,IAAA,MAAMG,UAAoC,EAAE;;AAG5C,IAAA,IAAIb,IAAM,EAAA;AACRa,QAAAA,OAAAA,CAAQC,IAAI,CAACd,IAAAA,EAAAA,CAAAA;AACf;;IAGA,IAAIe,QAAAA,CAAST,YAAaJ,CAAAA,gBAAgB,CAAG,EAAA;AAC3CW,QAAAA,OAAAA,CAAQC,IAAI,CAACE,UAAWV,CAAAA,YAAAA,CAAaJ,gBAAgB,CAAA,CAAA;KAChD,MAAA,IAAII,YAAaJ,CAAAA,gBAAgB,EAAE;AACxCW,QAAAA,OAAAA,CAAQC,IAAI,CAACE,UAAAA,EAAAA,CAAAA;KACR,MAAA;QACLpD,MAAOW,CAAAA,GAAG,CAACC,KAAK,CAAC,iDAAA,CAAA;AACnB;;IAGAqC,OAAQC,CAAAA,IAAI,CAAC,CAACG,GAAKC,EAAAA,IAAAA,GAAAA;QACjBD,GAAIE,CAAAA,KAAK,CAACC,KAAK,GAAG;YAChBC,IAAM,EAAA;;gBAEJC,IAAM,EAAA;AACR;AACF,SAAA;AAEA,QAAA,MAAMC,mBACJN,GAAAA,GAAAA,CAAIO,OAAO,CAACC,MAAM,KAAK,KACvBR,IAAAA,GAAAA,CAAIO,OAAO,CAACE,GAAG,KAAKjC;QACpB7B,MAAOE,CAAAA,MAAM,CAAC,SAAA,CAAA,CAAWE,OAAO,CAAC,SAASS,UAAU,CAACkD,SAAS,EAAA;QAC9DV,GAAIO,CAAAA,OAAO,CAACI,MAAM,CAACC,MAAM,EAAEC,QAAAA,CAAS;;AAGtC,QAAA,IAAIP,mBAAqB,EAAA;YACvB,OAAOL,IAAAA,EAAAA;AACT;AAEA,QAAA,OAAOtD,MAAOmE,CAAAA,IAAI,CAACC,YAAY,CAACf,GAAKC,EAAAA,IAAAA,CAAAA;AACvC,KAAA,CAAA;;IAGAL,OAAQC,CAAAA,IAAI,CACVmB,aAAAA,CAA0D1B,MAAQ,EAAA;;AAEhE2B,QAAAA,OAAAA,EAAS,OAAO,EAAEjB,GAAG,EAAE,IAAM;AAC3BE,gBAAAA,KAAAA,EAAOF,IAAIE,KAAK;gBAChBgB,UAAYlB,EAAAA;aACd;AACF,KAAA,CAAA,CAAA;;IAIFrD,MAAO2C,CAAAA,MAAM,CAAC6B,MAAM,CAAC;AACnB,QAAA;YACEX,MAAQ,EAAA,KAAA;AACRhC,YAAAA,IAAAA;AACAoB,YAAAA,OAAAA;YACAhD,MAAQ,EAAA;gBACNkE,IAAM,EAAA;AACR;AACF;AACD,KAAA,CAAA;;;;AAKDnE,IAAAA,MAAAA,CAAOE,MAAM,CAAC,SAAWuE,CAAAA,CAAAA,OAAO,GAAG,UAAA;AACjC,QAAA,MAAM9B,OAAO+B,IAAI,EAAA;AACnB,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import { isEmpty, mergeWith, isArray, isObject, isFunction } from 'lodash/fp';\nimport { ApolloServer, type ApolloServerPlugin, type ApolloServerOptions } from '@apollo/server';\nimport {\n ApolloServerPluginLandingPageLocalDefault,\n ApolloServerPluginLandingPageProductionDefault,\n} from '@apollo/server/plugin/landingPage/default';\nimport { koaMiddleware } from '@as-integrations/koa';\nimport depthLimit from 'graphql-depth-limit';\nimport bodyParser from 'koa-bodyparser';\nimport cors from '@koa/cors';\n\nimport type { Core } from '@strapi/types';\nimport type { BaseContext, DefaultContextExtends, DefaultStateExtends } from 'koa';\n\nimport { formatGraphqlError } from './format-graphql-error';\n\nconst merge = mergeWith((a, b) => {\n if (isArray(a) && isArray(b)) {\n return a.concat(b);\n }\n});\n\ntype StrapiGraphQLContext = BaseContext & {\n rootQueryArgs?: Record<string, unknown>;\n};\n\nexport const determineLandingPage = (\n strapi: Core.Strapi\n): ApolloServerPlugin<StrapiGraphQLContext> => {\n const { config } = strapi.plugin('graphql');\n const utils = strapi.plugin('graphql').service('utils');\n\n /**\n * configLanding page may be one of the following:\n *\n * - true: always use \"playground\" even in production\n * - false: never show \"playground\" even in non-production\n * - undefined: default Apollo behavior (hide playground on production)\n * - a function that returns an Apollo plugin that implements renderLandingPage\n ** */\n const configLandingPage = config('landingPage');\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n const localLanding = () => {\n strapi.log.debug('Apollo landing page: local');\n utils.playground.setEnabled(true);\n return ApolloServerPluginLandingPageLocalDefault();\n };\n\n const prodLanding = () => {\n strapi.log.debug('Apollo landing page: production');\n utils.playground.setEnabled(false);\n return ApolloServerPluginLandingPageProductionDefault();\n };\n\n const userLanding = (userFunction: (strapi?: Core.Strapi) => ApolloServerPlugin | boolean) => {\n strapi.log.debug('Apollo landing page: from user-defined function...');\n const result = userFunction(strapi);\n if (result === true) {\n return localLanding();\n }\n if (result === false) {\n return prodLanding();\n }\n strapi.log.debug('Apollo landing page: user-defined');\n return result;\n };\n\n // DEPRECATED, remove in Strapi v6\n const playgroundAlways = config('playgroundAlways');\n if (playgroundAlways !== undefined) {\n strapi.log.warn(\n 'The graphql config playgroundAlways is deprecated. This will be removed in Strapi 6. Please use landingPage instead. '\n );\n }\n if (playgroundAlways === false) {\n strapi.log.warn(\n 'graphql config playgroundAlways:false has no effect, please use landingPage:false to disable Graphql Playground in all environments'\n );\n }\n\n if (playgroundAlways || configLandingPage === true) {\n return localLanding();\n }\n\n // if landing page has been disabled, use production\n if (configLandingPage === false) {\n return prodLanding();\n }\n\n // If user did not define any settings, use our defaults\n if (configLandingPage === undefined) {\n return isProduction ? prodLanding() : localLanding();\n }\n\n // if user provided a landing page function, return that\n if (isFunction(configLandingPage)) {\n return userLanding(configLandingPage);\n }\n\n // If no other setting could be found, default to production settings\n strapi.log.warn(\n 'Your Graphql landing page has been disabled because there is a problem with your Graphql settings'\n );\n return prodLanding();\n};\n\nexport async function bootstrap({ strapi }: { strapi: Core.Strapi }) {\n // Generate the GraphQL schema for the content API\n const schema = strapi.plugin('graphql').service('content-api').buildSchema();\n\n if (isEmpty(schema)) {\n strapi.log.warn('The GraphQL schema has not been generated because it is empty');\n\n return;\n }\n\n const { config } = strapi.plugin('graphql');\n\n const path: string = config('endpoint');\n\n const landingPage = determineLandingPage(strapi);\n /**\n * We need the arguments passed to the root query to be available in the association resolver\n * so we can forward those arguments along to any relations.\n *\n * In order to do that we are currently storing the arguments in context.\n * There is likely a better solution, but for now this is the simplest fix we could find.\n *\n * @see https://github.com/strapi/strapi/issues/23524\n */\n const pluginAddRootQueryArgs: ApolloServerPlugin<StrapiGraphQLContext> = {\n async requestDidStart() {\n return {\n async executionDidStart() {\n return {\n willResolveField({ source, args, contextValue, info }) {\n if (!source && info.operation.operation === 'query') {\n // NOTE: context.rootQueryArgs is intended for internal use only\n contextValue.rootQueryArgs = args;\n }\n },\n };\n },\n };\n },\n };\n\n type CustomOptions = {\n cors: boolean;\n uploads: boolean;\n bodyParserConfig: boolean;\n };\n\n const defaultServerConfig: ApolloServerOptions<StrapiGraphQLContext> & CustomOptions = {\n // Schema\n schema,\n\n // Validation\n validationRules: [depthLimit(config('depthLimit') as number) as any],\n\n // Errors\n formatError: formatGraphqlError,\n\n // Misc\n cors: false,\n uploads: false,\n bodyParserConfig: true,\n // send 400 http status instead of 200 for input validation errors\n status400ForVariableCoercionErrors: true,\n plugins: [landingPage, pluginAddRootQueryArgs],\n\n cache: 'bounded' as const,\n };\n\n const serverConfig = merge(\n defaultServerConfig,\n config('apolloServer')\n ) as ApolloServerOptions<StrapiGraphQLContext> & CustomOptions;\n\n // Create a new Apollo server\n const server = new ApolloServer(serverConfig);\n\n try {\n // server.start() must be called before using server.applyMiddleware()\n await server.start();\n } catch (error) {\n if (error instanceof Error) {\n strapi.log.error('Failed to start the Apollo server', error.message);\n }\n\n throw error;\n }\n\n // Create the route handlers for Strapi\n const handler: Core.MiddlewareHandler[] = [];\n\n // add cors middleware\n if (cors) {\n handler.push(cors());\n }\n\n // add koa bodyparser middleware\n if (isObject(serverConfig.bodyParserConfig)) {\n handler.push(bodyParser(serverConfig.bodyParserConfig));\n } else if (serverConfig.bodyParserConfig) {\n handler.push(bodyParser());\n } else {\n strapi.log.debug('Body parser has been disabled for Apollo server');\n }\n\n // add the Strapi auth middleware\n handler.push((ctx, next) => {\n ctx.state.route = {\n info: {\n // Indicate it's a content API route\n type: 'content-api',\n },\n };\n\n const isPlaygroundRequest =\n ctx.request.method === 'GET' &&\n ctx.request.url === path && // Matches the GraphQL endpoint\n strapi.plugin('graphql').service('utils').playground.isEnabled() && // Only allow if the Playground is enabled\n ctx.request.header.accept?.includes('text/html'); // Specific to Playground UI loading\n\n // Skip authentication for the GraphQL Playground UI\n if (isPlaygroundRequest) {\n return next();\n }\n\n return strapi.auth.authenticate(ctx, next);\n });\n\n // add the graphql server for koa\n handler.push(\n koaMiddleware<DefaultStateExtends, DefaultContextExtends>(server, {\n // Initialize loaders for this request.\n context: async ({ ctx }) => ({\n state: ctx.state,\n koaContext: ctx,\n }),\n })\n );\n\n // now that handlers are set up, add the graphql route to our apollo server\n strapi.server.routes([\n {\n method: 'ALL',\n path,\n handler,\n config: {\n auth: false,\n },\n },\n ]);\n\n // Register destroy behavior\n // We're doing it here instead of exposing a destroy method to the strapi-server.js\n // file since we need to have access to the ApolloServer instance\n strapi.plugin('graphql').destroy = async () => {\n await server.stop();\n };\n}\n"],"names":["merge","mergeWith","a","b","isArray","concat","determineLandingPage","strapi","config","plugin","utils","service","configLandingPage","isProduction","process","env","NODE_ENV","localLanding","log","debug","playground","setEnabled","ApolloServerPluginLandingPageLocalDefault","prodLanding","ApolloServerPluginLandingPageProductionDefault","userLanding","userFunction","result","playgroundAlways","undefined","warn","isFunction","bootstrap","schema","buildSchema","isEmpty","path","landingPage","pluginAddRootQueryArgs","requestDidStart","executionDidStart","willResolveField","source","args","contextValue","info","operation","rootQueryArgs","defaultServerConfig","validationRules","depthLimit","formatError","formatGraphqlError","cors","uploads","bodyParserConfig","status400ForVariableCoercionErrors","plugins","cache","serverConfig","server","ApolloServer","start","error","Error","message","handler","push","isObject","bodyParser","ctx","next","state","route","type","isPlaygroundRequest","request","method","url","isEnabled","header","accept","includes","auth","authenticate","koaMiddleware","context","koaContext","routes","destroy","stop"],"mappings":"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"}
@@ -33,8 +33,30 @@ var associationResolvers = (({ strapi })=>{
33
33
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, targetContentType, {
34
34
  auth
35
35
  });
36
- const dbQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);
37
- const data = await strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);
36
+ const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);
37
+ const isTargetDraftAndPublishContentType = utils.contentTypes.hasDraftAndPublish(targetContentType);
38
+ const defaultFilters = isTargetDraftAndPublishContentType ? {
39
+ where: {
40
+ publishedAt: {
41
+ $notNull: context.rootQueryArgs?.status ? context.rootQueryArgs?.status === 'published' : true
42
+ }
43
+ }
44
+ } : {};
45
+ const dbQuery = fp.merge(defaultFilters, transformedQuery);
46
+ // Sign media URLs if upload plugin is available and using private provider
47
+ const data = await (async ()=>{
48
+ const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
49
+ if (isMediaAttribute && strapi.plugin('upload')) {
50
+ const { signFileUrls } = strapi.plugin('upload').service('file');
51
+ if (Array.isArray(rawData)) {
52
+ return utils.async.map(rawData, (item)=>signFileUrls(item));
53
+ }
54
+ if (rawData) {
55
+ return signFileUrls(rawData);
56
+ }
57
+ }
58
+ return rawData;
59
+ })();
38
60
  const info = {
39
61
  args: sanitizedQuery,
40
62
  resourceUID: targetUID
@@ -1 +1 @@
1
- {"version":3,"file":"association.js","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any = {}, context: any = {}) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n\n const dbQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const data = await strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);\n\n const info = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, info);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, info);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","dbQuery","get","transform","data","db","load","info","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","async","pipe"],"mappings":";;;;;AAMA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAE7B,2BAAe,CAAA,CAAC,EAAEC,MAAM,EAAW,GAAA;AACjC,IAAA,MAAM,EAAEC,OAASC,EAAAA,iBAAiB,EAAE,GAAGF,MAAAA,CAAOG,MAAM,CAAC,SAAA,CAAA;IAErD,MAAM,EAAEC,eAAe,EAAEC,OAAO,EAAE,GAAGH,iBAAAA,CAAkB,SAASI,UAAU;AAC1E,IAAA,MAAM,EAAEC,aAAa,EAAE,GAAGL,iBAAAA,CAAkB,YAAYM,KAAK;IAC7D,MAAM,EAAEC,gBAAgB,EAAEC,0BAA0B,EAAE,GAAGR,iBAAAA,CAAkB,UAAUS,WAAW;IAEhG,OAAO;AACLC,QAAAA,wBAAAA,CAAAA,CAAyB,EACvBC,cAAc,EACdC,aAAa,EAId,EAAA;YACC,MAAMC,WAAAA,GAAcf,MAAOgB,CAAAA,QAAQ,CAACH,cAAAA,CAAAA;AACpC,YAAA,MAAMI,SAAiBF,GAAAA,WAAAA,CAAYT,UAAU,CAACQ,aAAc,CAAA;AAE5D,YAAA,IAAI,CAACG,SAAW,EAAA;gBACd,MAAM,IAAInB,iBACR,CAAC,4CAA4C,EAAEe,cAAe,CAAA,EAAE,EAAEC,aAAAA,CAAc,CAAC,CAAA;AAErF;AAEA,YAAA,MAAMI,mBAAmBb,OAAQY,CAAAA,SAAAA,CAAAA;AACjC,YAAA,MAAME,mBAAmBf,eAAgBa,CAAAA,SAAAA,CAAAA;AAEzC,YAAA,MAAMG,SAAYF,GAAAA,gBAAAA,GAAmB,qBAAwBD,GAAAA,SAAAA,CAAUI,MAAM;YAC7E,MAAMC,QAAAA,GAAWJ,mBAAmBD,SAAUM,CAAAA,QAAQ,GAAGN,SAAUO,CAAAA,QAAQ,CAACC,QAAQ,CAAC,MAAA,CAAA;YAErF,MAAMC,iBAAAA,GAAoB1B,MAAOgB,CAAAA,QAAQ,CAACI,SAAAA,CAAAA;YAE1C,OAAO,OAAOO,QAAaC,IAAY,GAAA,EAAE,EAAEC,OAAAA,GAAe,EAAE,GAAA;AAC1D,gBAAA,MAAM,EAAEC,IAAI,EAAE,GAAGD,QAAQE,KAAK;gBAE9B,MAAMC,eAAAA,GAAkBzB,cAAcqB,IAAM,EAAA;oBAC1Cb,WAAaW,EAAAA,iBAAAA;oBACbO,aAAe,EAAA;AACjB,iBAAA,CAAA;gBAEA,MAAMjC,MAAAA,CAAOkC,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACJ,iBAAiBN,iBAAmB,EAAA;AACzEI,oBAAAA;AACF,iBAAA,CAAA;gBAEA,MAAMO,cAAAA,GAAiB,MAAMrC,MAAAA,CAAOkC,UAAU,CAACI,QAAQ,CAACF,KAAK,CAC3DJ,eAAAA,EACAN,iBACA,EAAA;AACEI,oBAAAA;AACF,iBAAA,CAAA;AAGF,gBAAA,MAAMS,UAAUvC,MAAOwC,CAAAA,GAAG,CAAC,cAAgBC,CAAAA,CAAAA,SAAS,CAACrB,SAAWiB,EAAAA,cAAAA,CAAAA;gBAEhE,MAAMK,IAAAA,GAAO,MAAM1C,MAAO2C,CAAAA,EAAE,EAAEP,KAAMvB,CAAAA,cAAAA,CAAAA,CAAgB+B,IAAKjB,CAAAA,MAAAA,EAAQb,aAAeyB,EAAAA,OAAAA,CAAAA;AAEhF,gBAAA,MAAMM,IAAO,GAAA;oBACXjB,IAAMS,EAAAA,cAAAA;oBACNS,WAAa1B,EAAAA;AACf,iBAAA;;;;AAKA,gBAAA,IAAID,gBAAkB,EAAA;;oBAEpB,MAAM4B,QAAAA,GAAW,CAACC,UAAAA,IAAqB;AAAE,4BAAA,CAAClC,gBAAgBkC;yBAAW,CAAA;AACrE,oBAAA,MAAMC,eAAe,CAACC,cAAAA,GAAAA;wBACpB,OAAOlD,MAAAA,CAAOkC,UAAU,CAACI,QAAQ,CAACa,MAAM,CAACD,gBAAgBnC,WAAa,EAAA;AAAEe,4BAAAA;AAAK,yBAAA,CAAA;AAC/E,qBAAA;AACA,oBAAA,MAAMsB,aAAaZ,MAAI1B,CAAAA,aAAAA,CAAAA;;AAGvB,oBAAA,MAAMuC,sBAAyBC,GAAAA,WAAAA,CAAMC,IAAI,CAACR,UAAUE,YAAcG,EAAAA,UAAAA,CAAAA;AAElE,oBAAA,OAAOC,sBAAuBX,CAAAA,IAAAA,CAAAA;AAChC;;;AAIA,gBAAA,IAAIpB,QAAU,EAAA;AACZ,oBAAA,OAAOZ,2BAA2BgC,IAAMG,EAAAA,IAAAA,CAAAA;AAC1C;;;AAIA,gBAAA,OAAOpC,iBAAiBiC,IAAMG,EAAAA,IAAAA,CAAAA;AAChC,aAAA;AACF;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"association.js","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get, merge } from 'lodash/fp';\nimport { async, contentTypes, errors } from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any = {}, context: any = {}) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n const defaultFilters = isTargetDraftAndPublishContentType\n ? {\n where: {\n publishedAt: {\n $notNull: context.rootQueryArgs?.status\n ? // Filter by the same status as the root query if the argument is present\n context.rootQueryArgs?.status === 'published'\n : // Otherwise fallback to the published version\n true,\n },\n },\n }\n : {};\n\n const dbQuery = merge(defaultFilters, transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const info = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, info);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, info);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","defaultFilters","where","publishedAt","$notNull","rootQueryArgs","status","dbQuery","merge","data","rawData","db","load","signFileUrls","Array","isArray","async","map","item","info","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { get } from 'lodash/fp';
2
- import { async, errors } from '@strapi/utils';
1
+ import { merge, get } from 'lodash/fp';
2
+ import { contentTypes, async, errors } from '@strapi/utils';
3
3
 
4
4
  const { ApplicationError } = errors;
5
5
  var associationResolvers = (({ strapi })=>{
@@ -31,8 +31,30 @@ var associationResolvers = (({ strapi })=>{
31
31
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, targetContentType, {
32
32
  auth
33
33
  });
34
- const dbQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);
35
- const data = await strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);
34
+ const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);
35
+ const isTargetDraftAndPublishContentType = contentTypes.hasDraftAndPublish(targetContentType);
36
+ const defaultFilters = isTargetDraftAndPublishContentType ? {
37
+ where: {
38
+ publishedAt: {
39
+ $notNull: context.rootQueryArgs?.status ? context.rootQueryArgs?.status === 'published' : true
40
+ }
41
+ }
42
+ } : {};
43
+ const dbQuery = merge(defaultFilters, transformedQuery);
44
+ // Sign media URLs if upload plugin is available and using private provider
45
+ const data = await (async ()=>{
46
+ const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
47
+ if (isMediaAttribute && strapi.plugin('upload')) {
48
+ const { signFileUrls } = strapi.plugin('upload').service('file');
49
+ if (Array.isArray(rawData)) {
50
+ return async.map(rawData, (item)=>signFileUrls(item));
51
+ }
52
+ if (rawData) {
53
+ return signFileUrls(rawData);
54
+ }
55
+ }
56
+ return rawData;
57
+ })();
36
58
  const info = {
37
59
  args: sanitizedQuery,
38
60
  resourceUID: targetUID
@@ -1 +1 @@
1
- {"version":3,"file":"association.mjs","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get } from 'lodash/fp';\nimport { async, errors } from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any = {}, context: any = {}) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n\n const dbQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const data = await strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);\n\n const info = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, info);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, info);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","dbQuery","get","transform","data","db","load","info","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","async","pipe"],"mappings":"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"}
1
+ {"version":3,"file":"association.mjs","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get, merge } from 'lodash/fp';\nimport { async, contentTypes, errors } from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any = {}, context: any = {}) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n const defaultFilters = isTargetDraftAndPublishContentType\n ? {\n where: {\n publishedAt: {\n $notNull: context.rootQueryArgs?.status\n ? // Filter by the same status as the root query if the argument is present\n context.rootQueryArgs?.status === 'published'\n : // Otherwise fallback to the published version\n true,\n },\n },\n }\n : {};\n\n const dbQuery = merge(defaultFilters, transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const info = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, info);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, info);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","defaultFilters","where","publishedAt","$notNull","rootQueryArgs","status","dbQuery","merge","data","rawData","db","load","signFileUrls","Array","isArray","async","map","item","info","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
@@ -22,7 +22,7 @@ var naming = (({ strapi })=>{
22
22
  const plugin = fp.get('plugin', contentType);
23
23
  const modelName = fp.get('modelName', contentType);
24
24
  const name = plurality === 'singular' ? fp.get('info.singularName', contentType) : fp.get('info.pluralName', contentType);
25
- const transformedPlugin = fp.upperFirst(fp.camelCase(plugin));
25
+ const transformedPlugin = plugin ? fp.upperFirst(fp.camelCase(plugin)) : '';
26
26
  const transformedModelName = fp.upperFirst(fp.camelCase(name || pluralize.singular(modelName)));
27
27
  return `${transformedPlugin}${transformedModelName}`;
28
28
  };
@@ -1 +1 @@
1
- {"version":3,"file":"naming.js","sources":["../../../../server/src/services/utils/naming.ts"],"sourcesContent":["import { camelCase, upperFirst, lowerFirst, pipe, get } from 'lodash/fp';\nimport { singular } from 'pluralize';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n /**\n * Build a type name for a enum based on a content type & an attribute name\n */\n const getEnumName = (contentType: Struct.Schema, attributeName: string) => {\n const { attributes } = contentType;\n const { enumName } = attributes[attributeName] as Schema.Attribute.Enumeration;\n const { modelType } = contentType;\n\n const typeName =\n modelType === 'component' ? getComponentName(contentType) : getTypeName(contentType);\n\n const defaultEnumName = `ENUM_${typeName.toUpperCase()}_${attributeName.toUpperCase()}`;\n\n return enumName || defaultEnumName;\n };\n\n /**\n * Build the base type name for a given content type\n */\n const getTypeName = (\n contentType: Struct.Schema,\n {\n plurality = 'singular',\n }: {\n plurality?: 'singular' | 'plural';\n } = {}\n ) => {\n const plugin = get('plugin', contentType);\n const modelName = get('modelName', contentType);\n const name =\n plurality === 'singular'\n ? get('info.singularName', contentType)\n : get('info.pluralName', contentType);\n\n const transformedPlugin = upperFirst(camelCase(plugin));\n const transformedModelName = upperFirst(camelCase(name || singular(modelName)));\n\n return `${transformedPlugin}${transformedModelName}`;\n };\n\n /**\n * Build the entity's type name for a given content type\n */\n const getEntityName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}Entity`;\n };\n\n /**\n * Build the entity meta type name for a given content type\n */\n const getEntityMetaName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Meta`;\n };\n\n /**\n * Build the entity response's type name for a given content type\n */\n const getEntityResponseName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Response`;\n };\n\n /**\n * Build the entity response collection's type name for a given content type\n */\n const getEntityResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}ResponseCollection`;\n };\n\n /**\n * Build the relation response collection's type name for a given content type\n */\n const getRelationResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}RelationResponseCollection`;\n };\n\n /**\n * Build a component type name based on its definition\n */\n const getComponentName = (contentType: Struct.Schema) => {\n return contentType.globalId;\n };\n\n /**\n * Build a component type name based on a content type's attribute\n */\n const getComponentNameFromAttribute = (attribute: Schema.Attribute.Component) => {\n return strapi.components[attribute.component].globalId;\n };\n\n /**\n * Build a dynamic zone type name based on a content type and an attribute name\n */\n const getDynamicZoneName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const dzName = upperFirst(camelCase(attributeName));\n const suffix = 'DynamicZone';\n\n return `${typeName}${dzName}${suffix}`;\n };\n\n /**\n * Build a dynamic zone input type name based on a content type and an attribute name\n */\n const getDynamicZoneInputName = (contentType: Struct.Schema, attributeName: string) => {\n const dzName = getDynamicZoneName(contentType, attributeName);\n\n return `${dzName}Input`;\n };\n\n /**\n * Build a component input type name based on a content type and an attribute name\n */\n const getComponentInputName = (contentType: Struct.Schema) => {\n const componentName = getComponentName(contentType);\n\n return `${componentName}Input`;\n };\n\n /**\n * Build a content type input name based on a content type and an attribute name\n */\n const getContentTypeInputName = (contentType: Struct.Schema) => {\n const typeName = getTypeName(contentType);\n\n return `${typeName}Input`;\n };\n\n /**\n * Build the queries type name for a given content type\n */\n const getEntityQueriesTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Queries`;\n };\n\n /**\n * Build the mutations type name for a given content type\n */\n const getEntityMutationsTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Mutations`;\n };\n\n /**\n * Build the filters type name for a given content type\n */\n const getFiltersInputTypeName = (contentType: Struct.Schema) => {\n const isComponent = contentType.modelType === 'component';\n\n const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType);\n\n return `${baseName}FiltersInput`;\n };\n\n /**\n * Build a filters type name for a given GraphQL scalar type\n */\n const getScalarFilterInputTypeName = (scalarType: string) => {\n return `${scalarType}FilterInput`;\n };\n\n /**\n * Build a type name for a given content type & polymorphic attribute\n */\n const getMorphRelationTypeName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const formattedAttr = upperFirst(camelCase(attributeName));\n\n return `${typeName}${formattedAttr}Morph`;\n };\n\n /**\n * Build a custom type name generator with different customization options\n */\n const buildCustomTypeNameGenerator = (options: {\n prefix?: string;\n suffix?: string;\n firstLetterCase?: 'upper' | 'lower';\n plurality?: 'plural' | 'singular';\n }) => {\n // todo[v4]: use singularName & pluralName is available\n const { prefix = '', suffix = '', plurality = 'singular', firstLetterCase = 'upper' } = options;\n\n if (!['plural', 'singular'].includes(plurality)) {\n throw new ApplicationError(\n `\"plurality\" param must be either \"plural\" or \"singular\", but got: \"${plurality}\"`\n );\n }\n\n const getCustomTypeName = pipe(\n (ct) => getTypeName(ct, { plurality }),\n firstLetterCase === 'upper' ? upperFirst : lowerFirst\n );\n\n return (contentType: Struct.Schema) => `${prefix}${getCustomTypeName(contentType)}${suffix}`;\n };\n\n const getFindQueryName = buildCustomTypeNameGenerator({\n plurality: 'plural',\n firstLetterCase: 'lower',\n });\n\n const getFindConnectionQueryName = (contentType: Struct.Schema) => {\n return `${getFindQueryName(contentType)}_connection`;\n };\n\n const getFindOneQueryName = buildCustomTypeNameGenerator({ firstLetterCase: 'lower' });\n\n const getCreateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'create',\n firstLetterCase: 'upper',\n });\n\n const getUpdateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'update',\n firstLetterCase: 'upper',\n });\n\n const getDeleteMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'delete',\n firstLetterCase: 'upper',\n });\n\n return {\n getEnumName,\n getTypeName,\n getEntityName,\n getEntityMetaName,\n getEntityResponseName,\n getEntityResponseCollectionName,\n getRelationResponseCollectionName,\n getComponentName,\n getComponentNameFromAttribute,\n getDynamicZoneName,\n getDynamicZoneInputName,\n getComponentInputName,\n getContentTypeInputName,\n getEntityQueriesTypeName,\n getEntityMutationsTypeName,\n getFiltersInputTypeName,\n getScalarFilterInputTypeName,\n getMorphRelationTypeName,\n buildCustomTypeNameGenerator,\n getFindQueryName,\n getFindOneQueryName,\n getCreateMutationTypeName,\n getUpdateMutationTypeName,\n getDeleteMutationTypeName,\n getFindConnectionQueryName,\n };\n};\n"],"names":["ApplicationError","errors","strapi","getEnumName","contentType","attributeName","attributes","enumName","modelType","typeName","getComponentName","getTypeName","defaultEnumName","toUpperCase","plurality","plugin","get","modelName","name","transformedPlugin","upperFirst","camelCase","transformedModelName","singular","getEntityName","getEntityMetaName","getEntityResponseName","getEntityResponseCollectionName","getRelationResponseCollectionName","globalId","getComponentNameFromAttribute","attribute","components","component","getDynamicZoneName","dzName","suffix","getDynamicZoneInputName","getComponentInputName","componentName","getContentTypeInputName","getEntityQueriesTypeName","getEntityMutationsTypeName","getFiltersInputTypeName","isComponent","baseName","getScalarFilterInputTypeName","scalarType","getMorphRelationTypeName","formattedAttr","buildCustomTypeNameGenerator","options","prefix","firstLetterCase","includes","getCustomTypeName","pipe","ct","lowerFirst","getFindQueryName","getFindConnectionQueryName","getFindOneQueryName","getCreateMutationTypeName","getUpdateMutationTypeName","getDeleteMutationTypeName"],"mappings":"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"}
1
+ {"version":3,"file":"naming.js","sources":["../../../../server/src/services/utils/naming.ts"],"sourcesContent":["import { camelCase, upperFirst, lowerFirst, pipe, get } from 'lodash/fp';\nimport { singular } from 'pluralize';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n /**\n * Build a type name for a enum based on a content type & an attribute name\n */\n const getEnumName = (contentType: Struct.Schema, attributeName: string) => {\n const { attributes } = contentType;\n const { enumName } = attributes[attributeName] as Schema.Attribute.Enumeration;\n const { modelType } = contentType;\n\n const typeName =\n modelType === 'component' ? getComponentName(contentType) : getTypeName(contentType);\n\n const defaultEnumName = `ENUM_${typeName.toUpperCase()}_${attributeName.toUpperCase()}`;\n\n return enumName || defaultEnumName;\n };\n\n /**\n * Build the base type name for a given content type\n */\n const getTypeName = (\n contentType: Struct.Schema,\n {\n plurality = 'singular',\n }: {\n plurality?: 'singular' | 'plural';\n } = {}\n ) => {\n const plugin = get('plugin', contentType);\n const modelName = get('modelName', contentType);\n const name =\n plurality === 'singular'\n ? get('info.singularName', contentType)\n : get('info.pluralName', contentType);\n\n const transformedPlugin = plugin ? upperFirst(camelCase(plugin)) : '';\n const transformedModelName = upperFirst(camelCase(name || singular(modelName)));\n\n return `${transformedPlugin}${transformedModelName}`;\n };\n\n /**\n * Build the entity's type name for a given content type\n */\n const getEntityName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}Entity`;\n };\n\n /**\n * Build the entity meta type name for a given content type\n */\n const getEntityMetaName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Meta`;\n };\n\n /**\n * Build the entity response's type name for a given content type\n */\n const getEntityResponseName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Response`;\n };\n\n /**\n * Build the entity response collection's type name for a given content type\n */\n const getEntityResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}ResponseCollection`;\n };\n\n /**\n * Build the relation response collection's type name for a given content type\n */\n const getRelationResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}RelationResponseCollection`;\n };\n\n /**\n * Build a component type name based on its definition\n */\n const getComponentName = (contentType: Struct.Schema) => {\n return contentType.globalId;\n };\n\n /**\n * Build a component type name based on a content type's attribute\n */\n const getComponentNameFromAttribute = (attribute: Schema.Attribute.Component) => {\n return strapi.components[attribute.component].globalId;\n };\n\n /**\n * Build a dynamic zone type name based on a content type and an attribute name\n */\n const getDynamicZoneName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const dzName = upperFirst(camelCase(attributeName));\n const suffix = 'DynamicZone';\n\n return `${typeName}${dzName}${suffix}`;\n };\n\n /**\n * Build a dynamic zone input type name based on a content type and an attribute name\n */\n const getDynamicZoneInputName = (contentType: Struct.Schema, attributeName: string) => {\n const dzName = getDynamicZoneName(contentType, attributeName);\n\n return `${dzName}Input`;\n };\n\n /**\n * Build a component input type name based on a content type and an attribute name\n */\n const getComponentInputName = (contentType: Struct.Schema) => {\n const componentName = getComponentName(contentType);\n\n return `${componentName}Input`;\n };\n\n /**\n * Build a content type input name based on a content type and an attribute name\n */\n const getContentTypeInputName = (contentType: Struct.Schema) => {\n const typeName = getTypeName(contentType);\n\n return `${typeName}Input`;\n };\n\n /**\n * Build the queries type name for a given content type\n */\n const getEntityQueriesTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Queries`;\n };\n\n /**\n * Build the mutations type name for a given content type\n */\n const getEntityMutationsTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Mutations`;\n };\n\n /**\n * Build the filters type name for a given content type\n */\n const getFiltersInputTypeName = (contentType: Struct.Schema) => {\n const isComponent = contentType.modelType === 'component';\n\n const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType);\n\n return `${baseName}FiltersInput`;\n };\n\n /**\n * Build a filters type name for a given GraphQL scalar type\n */\n const getScalarFilterInputTypeName = (scalarType: string) => {\n return `${scalarType}FilterInput`;\n };\n\n /**\n * Build a type name for a given content type & polymorphic attribute\n */\n const getMorphRelationTypeName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const formattedAttr = upperFirst(camelCase(attributeName));\n\n return `${typeName}${formattedAttr}Morph`;\n };\n\n /**\n * Build a custom type name generator with different customization options\n */\n const buildCustomTypeNameGenerator = (options: {\n prefix?: string;\n suffix?: string;\n firstLetterCase?: 'upper' | 'lower';\n plurality?: 'plural' | 'singular';\n }) => {\n // todo[v4]: use singularName & pluralName is available\n const { prefix = '', suffix = '', plurality = 'singular', firstLetterCase = 'upper' } = options;\n\n if (!['plural', 'singular'].includes(plurality)) {\n throw new ApplicationError(\n `\"plurality\" param must be either \"plural\" or \"singular\", but got: \"${plurality}\"`\n );\n }\n\n const getCustomTypeName = pipe(\n (ct) => getTypeName(ct, { plurality }),\n firstLetterCase === 'upper' ? upperFirst : lowerFirst\n );\n\n return (contentType: Struct.Schema) => `${prefix}${getCustomTypeName(contentType)}${suffix}`;\n };\n\n const getFindQueryName = buildCustomTypeNameGenerator({\n plurality: 'plural',\n firstLetterCase: 'lower',\n });\n\n const getFindConnectionQueryName = (contentType: Struct.Schema) => {\n return `${getFindQueryName(contentType)}_connection`;\n };\n\n const getFindOneQueryName = buildCustomTypeNameGenerator({ firstLetterCase: 'lower' });\n\n const getCreateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'create',\n firstLetterCase: 'upper',\n });\n\n const getUpdateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'update',\n firstLetterCase: 'upper',\n });\n\n const getDeleteMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'delete',\n firstLetterCase: 'upper',\n });\n\n return {\n getEnumName,\n getTypeName,\n getEntityName,\n getEntityMetaName,\n getEntityResponseName,\n getEntityResponseCollectionName,\n getRelationResponseCollectionName,\n getComponentName,\n getComponentNameFromAttribute,\n getDynamicZoneName,\n getDynamicZoneInputName,\n getComponentInputName,\n getContentTypeInputName,\n getEntityQueriesTypeName,\n getEntityMutationsTypeName,\n getFiltersInputTypeName,\n getScalarFilterInputTypeName,\n getMorphRelationTypeName,\n buildCustomTypeNameGenerator,\n getFindQueryName,\n getFindOneQueryName,\n getCreateMutationTypeName,\n getUpdateMutationTypeName,\n getDeleteMutationTypeName,\n getFindConnectionQueryName,\n };\n};\n"],"names":["ApplicationError","errors","strapi","getEnumName","contentType","attributeName","attributes","enumName","modelType","typeName","getComponentName","getTypeName","defaultEnumName","toUpperCase","plurality","plugin","get","modelName","name","transformedPlugin","upperFirst","camelCase","transformedModelName","singular","getEntityName","getEntityMetaName","getEntityResponseName","getEntityResponseCollectionName","getRelationResponseCollectionName","globalId","getComponentNameFromAttribute","attribute","components","component","getDynamicZoneName","dzName","suffix","getDynamicZoneInputName","getComponentInputName","componentName","getContentTypeInputName","getEntityQueriesTypeName","getEntityMutationsTypeName","getFiltersInputTypeName","isComponent","baseName","getScalarFilterInputTypeName","scalarType","getMorphRelationTypeName","formattedAttr","buildCustomTypeNameGenerator","options","prefix","firstLetterCase","includes","getCustomTypeName","pipe","ct","lowerFirst","getFindQueryName","getFindConnectionQueryName","getFindOneQueryName","getCreateMutationTypeName","getUpdateMutationTypeName","getDeleteMutationTypeName"],"mappings":"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"}
@@ -20,7 +20,7 @@ var naming = (({ strapi })=>{
20
20
  const plugin = get('plugin', contentType);
21
21
  const modelName = get('modelName', contentType);
22
22
  const name = plurality === 'singular' ? get('info.singularName', contentType) : get('info.pluralName', contentType);
23
- const transformedPlugin = upperFirst(camelCase(plugin));
23
+ const transformedPlugin = plugin ? upperFirst(camelCase(plugin)) : '';
24
24
  const transformedModelName = upperFirst(camelCase(name || singular(modelName)));
25
25
  return `${transformedPlugin}${transformedModelName}`;
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"naming.mjs","sources":["../../../../server/src/services/utils/naming.ts"],"sourcesContent":["import { camelCase, upperFirst, lowerFirst, pipe, get } from 'lodash/fp';\nimport { singular } from 'pluralize';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n /**\n * Build a type name for a enum based on a content type & an attribute name\n */\n const getEnumName = (contentType: Struct.Schema, attributeName: string) => {\n const { attributes } = contentType;\n const { enumName } = attributes[attributeName] as Schema.Attribute.Enumeration;\n const { modelType } = contentType;\n\n const typeName =\n modelType === 'component' ? getComponentName(contentType) : getTypeName(contentType);\n\n const defaultEnumName = `ENUM_${typeName.toUpperCase()}_${attributeName.toUpperCase()}`;\n\n return enumName || defaultEnumName;\n };\n\n /**\n * Build the base type name for a given content type\n */\n const getTypeName = (\n contentType: Struct.Schema,\n {\n plurality = 'singular',\n }: {\n plurality?: 'singular' | 'plural';\n } = {}\n ) => {\n const plugin = get('plugin', contentType);\n const modelName = get('modelName', contentType);\n const name =\n plurality === 'singular'\n ? get('info.singularName', contentType)\n : get('info.pluralName', contentType);\n\n const transformedPlugin = upperFirst(camelCase(plugin));\n const transformedModelName = upperFirst(camelCase(name || singular(modelName)));\n\n return `${transformedPlugin}${transformedModelName}`;\n };\n\n /**\n * Build the entity's type name for a given content type\n */\n const getEntityName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}Entity`;\n };\n\n /**\n * Build the entity meta type name for a given content type\n */\n const getEntityMetaName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Meta`;\n };\n\n /**\n * Build the entity response's type name for a given content type\n */\n const getEntityResponseName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Response`;\n };\n\n /**\n * Build the entity response collection's type name for a given content type\n */\n const getEntityResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}ResponseCollection`;\n };\n\n /**\n * Build the relation response collection's type name for a given content type\n */\n const getRelationResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}RelationResponseCollection`;\n };\n\n /**\n * Build a component type name based on its definition\n */\n const getComponentName = (contentType: Struct.Schema) => {\n return contentType.globalId;\n };\n\n /**\n * Build a component type name based on a content type's attribute\n */\n const getComponentNameFromAttribute = (attribute: Schema.Attribute.Component) => {\n return strapi.components[attribute.component].globalId;\n };\n\n /**\n * Build a dynamic zone type name based on a content type and an attribute name\n */\n const getDynamicZoneName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const dzName = upperFirst(camelCase(attributeName));\n const suffix = 'DynamicZone';\n\n return `${typeName}${dzName}${suffix}`;\n };\n\n /**\n * Build a dynamic zone input type name based on a content type and an attribute name\n */\n const getDynamicZoneInputName = (contentType: Struct.Schema, attributeName: string) => {\n const dzName = getDynamicZoneName(contentType, attributeName);\n\n return `${dzName}Input`;\n };\n\n /**\n * Build a component input type name based on a content type and an attribute name\n */\n const getComponentInputName = (contentType: Struct.Schema) => {\n const componentName = getComponentName(contentType);\n\n return `${componentName}Input`;\n };\n\n /**\n * Build a content type input name based on a content type and an attribute name\n */\n const getContentTypeInputName = (contentType: Struct.Schema) => {\n const typeName = getTypeName(contentType);\n\n return `${typeName}Input`;\n };\n\n /**\n * Build the queries type name for a given content type\n */\n const getEntityQueriesTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Queries`;\n };\n\n /**\n * Build the mutations type name for a given content type\n */\n const getEntityMutationsTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Mutations`;\n };\n\n /**\n * Build the filters type name for a given content type\n */\n const getFiltersInputTypeName = (contentType: Struct.Schema) => {\n const isComponent = contentType.modelType === 'component';\n\n const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType);\n\n return `${baseName}FiltersInput`;\n };\n\n /**\n * Build a filters type name for a given GraphQL scalar type\n */\n const getScalarFilterInputTypeName = (scalarType: string) => {\n return `${scalarType}FilterInput`;\n };\n\n /**\n * Build a type name for a given content type & polymorphic attribute\n */\n const getMorphRelationTypeName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const formattedAttr = upperFirst(camelCase(attributeName));\n\n return `${typeName}${formattedAttr}Morph`;\n };\n\n /**\n * Build a custom type name generator with different customization options\n */\n const buildCustomTypeNameGenerator = (options: {\n prefix?: string;\n suffix?: string;\n firstLetterCase?: 'upper' | 'lower';\n plurality?: 'plural' | 'singular';\n }) => {\n // todo[v4]: use singularName & pluralName is available\n const { prefix = '', suffix = '', plurality = 'singular', firstLetterCase = 'upper' } = options;\n\n if (!['plural', 'singular'].includes(plurality)) {\n throw new ApplicationError(\n `\"plurality\" param must be either \"plural\" or \"singular\", but got: \"${plurality}\"`\n );\n }\n\n const getCustomTypeName = pipe(\n (ct) => getTypeName(ct, { plurality }),\n firstLetterCase === 'upper' ? upperFirst : lowerFirst\n );\n\n return (contentType: Struct.Schema) => `${prefix}${getCustomTypeName(contentType)}${suffix}`;\n };\n\n const getFindQueryName = buildCustomTypeNameGenerator({\n plurality: 'plural',\n firstLetterCase: 'lower',\n });\n\n const getFindConnectionQueryName = (contentType: Struct.Schema) => {\n return `${getFindQueryName(contentType)}_connection`;\n };\n\n const getFindOneQueryName = buildCustomTypeNameGenerator({ firstLetterCase: 'lower' });\n\n const getCreateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'create',\n firstLetterCase: 'upper',\n });\n\n const getUpdateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'update',\n firstLetterCase: 'upper',\n });\n\n const getDeleteMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'delete',\n firstLetterCase: 'upper',\n });\n\n return {\n getEnumName,\n getTypeName,\n getEntityName,\n getEntityMetaName,\n getEntityResponseName,\n getEntityResponseCollectionName,\n getRelationResponseCollectionName,\n getComponentName,\n getComponentNameFromAttribute,\n getDynamicZoneName,\n getDynamicZoneInputName,\n getComponentInputName,\n getContentTypeInputName,\n getEntityQueriesTypeName,\n getEntityMutationsTypeName,\n getFiltersInputTypeName,\n getScalarFilterInputTypeName,\n getMorphRelationTypeName,\n buildCustomTypeNameGenerator,\n getFindQueryName,\n getFindOneQueryName,\n getCreateMutationTypeName,\n getUpdateMutationTypeName,\n getDeleteMutationTypeName,\n getFindConnectionQueryName,\n };\n};\n"],"names":["ApplicationError","errors","strapi","getEnumName","contentType","attributeName","attributes","enumName","modelType","typeName","getComponentName","getTypeName","defaultEnumName","toUpperCase","plurality","plugin","get","modelName","name","transformedPlugin","upperFirst","camelCase","transformedModelName","singular","getEntityName","getEntityMetaName","getEntityResponseName","getEntityResponseCollectionName","getRelationResponseCollectionName","globalId","getComponentNameFromAttribute","attribute","components","component","getDynamicZoneName","dzName","suffix","getDynamicZoneInputName","getComponentInputName","componentName","getContentTypeInputName","getEntityQueriesTypeName","getEntityMutationsTypeName","getFiltersInputTypeName","isComponent","baseName","getScalarFilterInputTypeName","scalarType","getMorphRelationTypeName","formattedAttr","buildCustomTypeNameGenerator","options","prefix","firstLetterCase","includes","getCustomTypeName","pipe","ct","lowerFirst","getFindQueryName","getFindConnectionQueryName","getFindOneQueryName","getCreateMutationTypeName","getUpdateMutationTypeName","getDeleteMutationTypeName"],"mappings":";;;;AAMA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAE7B,aAAe,CAAA,CAAC,EAAEC,MAAM,EAAW,GAAA;AACjC;;MAGA,MAAMC,WAAc,GAAA,CAACC,WAA4BC,EAAAA,aAAAA,GAAAA;QAC/C,MAAM,EAAEC,UAAU,EAAE,GAAGF,WAAAA;AACvB,QAAA,MAAM,EAAEG,QAAQ,EAAE,GAAGD,UAAU,CAACD,aAAc,CAAA;QAC9C,MAAM,EAAEG,SAAS,EAAE,GAAGJ,WAAAA;AAEtB,QAAA,MAAMK,QACJD,GAAAA,SAAAA,KAAc,WAAcE,GAAAA,gBAAAA,CAAiBN,eAAeO,WAAYP,CAAAA,WAAAA,CAAAA;AAE1E,QAAA,MAAMQ,eAAkB,GAAA,CAAC,KAAK,EAAEH,QAASI,CAAAA,WAAW,EAAG,CAAA,CAAC,EAAER,aAAAA,CAAcQ,WAAW,EAAA,CAAG,CAAC;AAEvF,QAAA,OAAON,QAAYK,IAAAA,eAAAA;AACrB,KAAA;AAEA;;MAGA,MAAMD,WAAc,GAAA,CAClBP,WACA,EAAA,EACEU,YAAY,UAAU,EAGvB,GAAG,EAAE,GAAA;QAEN,MAAMC,MAAAA,GAASC,IAAI,QAAUZ,EAAAA,WAAAA,CAAAA;QAC7B,MAAMa,SAAAA,GAAYD,IAAI,WAAaZ,EAAAA,WAAAA,CAAAA;AACnC,QAAA,MAAMc,OACJJ,SAAc,KAAA,UAAA,GACVE,IAAI,mBAAqBZ,EAAAA,WAAAA,CAAAA,GACzBY,IAAI,iBAAmBZ,EAAAA,WAAAA,CAAAA;QAE7B,MAAMe,iBAAAA,GAAoBC,WAAWC,SAAUN,CAAAA,MAAAA,CAAAA,CAAAA;AAC/C,QAAA,MAAMO,oBAAuBF,GAAAA,UAAAA,CAAWC,SAAUH,CAAAA,IAAAA,IAAQK,QAASN,CAAAA,SAAAA,CAAAA,CAAAA,CAAAA;AAEnE,QAAA,OAAO,CAAC,EAAEE,iBAAkB,CAAA,EAAEG,qBAAqB,CAAC;AACtD,KAAA;AAEA;;MAGA,MAAME,gBAAgB,CAACpB,WAAAA,GAAAA;AACrB,QAAA,OAAO,CAAC,EAAEO,WAAYP,CAAAA,WAAAA,CAAAA,CAAa,MAAM,CAAC;AAC5C,KAAA;AAEA;;MAGA,MAAMqB,oBAAoB,CAACrB,WAAAA,GAAAA;AACzB,QAAA,OAAO,CAAC,EAAEoB,aAAcpB,CAAAA,WAAAA,CAAAA,CAAa,IAAI,CAAC;AAC5C,KAAA;AAEA;;MAGA,MAAMsB,wBAAwB,CAACtB,WAAAA,GAAAA;AAC7B,QAAA,OAAO,CAAC,EAAEoB,aAAcpB,CAAAA,WAAAA,CAAAA,CAAa,QAAQ,CAAC;AAChD,KAAA;AAEA;;MAGA,MAAMuB,kCAAkC,CAACvB,WAAAA,GAAAA;AACvC,QAAA,OAAO,CAAC,EAAEoB,aAAcpB,CAAAA,WAAAA,CAAAA,CAAa,kBAAkB,CAAC;AAC1D,KAAA;AAEA;;MAGA,MAAMwB,oCAAoC,CAACxB,WAAAA,GAAAA;AACzC,QAAA,OAAO,CAAC,EAAEO,WAAYP,CAAAA,WAAAA,CAAAA,CAAa,0BAA0B,CAAC;AAChE,KAAA;AAEA;;MAGA,MAAMM,mBAAmB,CAACN,WAAAA,GAAAA;AACxB,QAAA,OAAOA,YAAYyB,QAAQ;AAC7B,KAAA;AAEA;;MAGA,MAAMC,gCAAgC,CAACC,SAAAA,GAAAA;AACrC,QAAA,OAAO7B,OAAO8B,UAAU,CAACD,UAAUE,SAAS,CAAC,CAACJ,QAAQ;AACxD,KAAA;AAEA;;MAGA,MAAMK,kBAAqB,GAAA,CAAC9B,WAA4BC,EAAAA,aAAAA,GAAAA;AACtD,QAAA,MAAMI,WAAWE,WAAYP,CAAAA,WAAAA,CAAAA;QAC7B,MAAM+B,MAAAA,GAASf,WAAWC,SAAUhB,CAAAA,aAAAA,CAAAA,CAAAA;AACpC,QAAA,MAAM+B,MAAS,GAAA,aAAA;AAEf,QAAA,OAAO,CAAC,EAAE3B,QAAAA,CAAS,EAAE0B,MAAO,CAAA,EAAEC,OAAO,CAAC;AACxC,KAAA;AAEA;;MAGA,MAAMC,uBAA0B,GAAA,CAACjC,WAA4BC,EAAAA,aAAAA,GAAAA;QAC3D,MAAM8B,MAAAA,GAASD,mBAAmB9B,WAAaC,EAAAA,aAAAA,CAAAA;AAE/C,QAAA,OAAO,CAAC,EAAE8B,MAAO,CAAA,KAAK,CAAC;AACzB,KAAA;AAEA;;MAGA,MAAMG,wBAAwB,CAAClC,WAAAA,GAAAA;AAC7B,QAAA,MAAMmC,gBAAgB7B,gBAAiBN,CAAAA,WAAAA,CAAAA;AAEvC,QAAA,OAAO,CAAC,EAAEmC,aAAc,CAAA,KAAK,CAAC;AAChC,KAAA;AAEA;;MAGA,MAAMC,0BAA0B,CAACpC,WAAAA,GAAAA;AAC/B,QAAA,MAAMK,WAAWE,WAAYP,CAAAA,WAAAA,CAAAA;AAE7B,QAAA,OAAO,CAAC,EAAEK,QAAS,CAAA,KAAK,CAAC;AAC3B,KAAA;AAEA;;MAGA,MAAMgC,2BAA2B,CAACrC,WAAAA,GAAAA;AAChC,QAAA,OAAO,CAAC,EAAEoB,aAAcpB,CAAAA,WAAAA,CAAAA,CAAa,OAAO,CAAC;AAC/C,KAAA;AAEA;;MAGA,MAAMsC,6BAA6B,CAACtC,WAAAA,GAAAA;AAClC,QAAA,OAAO,CAAC,EAAEoB,aAAcpB,CAAAA,WAAAA,CAAAA,CAAa,SAAS,CAAC;AACjD,KAAA;AAEA;;MAGA,MAAMuC,0BAA0B,CAACvC,WAAAA,GAAAA;QAC/B,MAAMwC,WAAAA,GAAcxC,WAAYI,CAAAA,SAAS,KAAK,WAAA;AAE9C,QAAA,MAAMqC,QAAWD,GAAAA,WAAAA,GAAclC,gBAAiBN,CAAAA,WAAAA,CAAAA,GAAeO,WAAYP,CAAAA,WAAAA,CAAAA;AAE3E,QAAA,OAAO,CAAC,EAAEyC,QAAS,CAAA,YAAY,CAAC;AAClC,KAAA;AAEA;;MAGA,MAAMC,+BAA+B,CAACC,UAAAA,GAAAA;AACpC,QAAA,OAAO,CAAC,EAAEA,UAAW,CAAA,WAAW,CAAC;AACnC,KAAA;AAEA;;MAGA,MAAMC,wBAA2B,GAAA,CAAC5C,WAA4BC,EAAAA,aAAAA,GAAAA;AAC5D,QAAA,MAAMI,WAAWE,WAAYP,CAAAA,WAAAA,CAAAA;QAC7B,MAAM6C,aAAAA,GAAgB7B,WAAWC,SAAUhB,CAAAA,aAAAA,CAAAA,CAAAA;AAE3C,QAAA,OAAO,CAAC,EAAEI,QAAAA,CAAS,EAAEwC,aAAAA,CAAc,KAAK,CAAC;AAC3C,KAAA;AAEA;;MAGA,MAAMC,+BAA+B,CAACC,OAAAA,GAAAA;;AAOpC,QAAA,MAAM,EAAEC,MAAAA,GAAS,EAAE,EAAEhB,MAAS,GAAA,EAAE,EAAEtB,SAAAA,GAAY,UAAU,EAAEuC,eAAkB,GAAA,OAAO,EAAE,GAAGF,OAAAA;AAExF,QAAA,IAAI,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA;SAAW,CAACG,QAAQ,CAACxC,SAAY,CAAA,EAAA;AAC/C,YAAA,MAAM,IAAId,gBACR,CAAA,CAAC,mEAAmE,EAAEc,SAAAA,CAAU,CAAC,CAAC,CAAA;AAEtF;AAEA,QAAA,MAAMyC,iBAAoBC,GAAAA,IAAAA,CACxB,CAACC,EAAAA,GAAO9C,YAAY8C,EAAI,EAAA;AAAE3C,gBAAAA;aAC1BuC,CAAAA,EAAAA,eAAAA,KAAoB,UAAUjC,UAAasC,GAAAA,UAAAA,CAAAA;QAG7C,OAAO,CAACtD,WAA+B,GAAA,CAAC,EAAEgD,MAAAA,CAAO,EAAEG,iBAAkBnD,CAAAA,WAAAA,CAAAA,CAAa,EAAEgC,MAAAA,CAAO,CAAC;AAC9F,KAAA;AAEA,IAAA,MAAMuB,mBAAmBT,4BAA6B,CAAA;QACpDpC,SAAW,EAAA,QAAA;QACXuC,eAAiB,EAAA;AACnB,KAAA,CAAA;AAEA,IAAA,MAAMO,6BAA6B,CAACxD,WAAAA,GAAAA;AAClC,QAAA,OAAO,CAAC,EAAEuD,gBAAiBvD,CAAAA,WAAAA,CAAAA,CAAa,WAAW,CAAC;AACtD,KAAA;AAEA,IAAA,MAAMyD,sBAAsBX,4BAA6B,CAAA;QAAEG,eAAiB,EAAA;AAAQ,KAAA,CAAA;AAEpF,IAAA,MAAMS,4BAA4BZ,4BAA6B,CAAA;QAC7DE,MAAQ,EAAA,QAAA;QACRC,eAAiB,EAAA;AACnB,KAAA,CAAA;AAEA,IAAA,MAAMU,4BAA4Bb,4BAA6B,CAAA;QAC7DE,MAAQ,EAAA,QAAA;QACRC,eAAiB,EAAA;AACnB,KAAA,CAAA;AAEA,IAAA,MAAMW,4BAA4Bd,4BAA6B,CAAA;QAC7DE,MAAQ,EAAA,QAAA;QACRC,eAAiB,EAAA;AACnB,KAAA,CAAA;IAEA,OAAO;AACLlD,QAAAA,WAAAA;AACAQ,QAAAA,WAAAA;AACAa,QAAAA,aAAAA;AACAC,QAAAA,iBAAAA;AACAC,QAAAA,qBAAAA;AACAC,QAAAA,+BAAAA;AACAC,QAAAA,iCAAAA;AACAlB,QAAAA,gBAAAA;AACAoB,QAAAA,6BAAAA;AACAI,QAAAA,kBAAAA;AACAG,QAAAA,uBAAAA;AACAC,QAAAA,qBAAAA;AACAE,QAAAA,uBAAAA;AACAC,QAAAA,wBAAAA;AACAC,QAAAA,0BAAAA;AACAC,QAAAA,uBAAAA;AACAG,QAAAA,4BAAAA;AACAE,QAAAA,wBAAAA;AACAE,QAAAA,4BAAAA;AACAS,QAAAA,gBAAAA;AACAE,QAAAA,mBAAAA;AACAC,QAAAA,yBAAAA;AACAC,QAAAA,yBAAAA;AACAC,QAAAA,yBAAAA;AACAJ,QAAAA;AACF,KAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"naming.mjs","sources":["../../../../server/src/services/utils/naming.ts"],"sourcesContent":["import { camelCase, upperFirst, lowerFirst, pipe, get } from 'lodash/fp';\nimport { singular } from 'pluralize';\nimport { errors } from '@strapi/utils';\nimport type { Struct, Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n /**\n * Build a type name for a enum based on a content type & an attribute name\n */\n const getEnumName = (contentType: Struct.Schema, attributeName: string) => {\n const { attributes } = contentType;\n const { enumName } = attributes[attributeName] as Schema.Attribute.Enumeration;\n const { modelType } = contentType;\n\n const typeName =\n modelType === 'component' ? getComponentName(contentType) : getTypeName(contentType);\n\n const defaultEnumName = `ENUM_${typeName.toUpperCase()}_${attributeName.toUpperCase()}`;\n\n return enumName || defaultEnumName;\n };\n\n /**\n * Build the base type name for a given content type\n */\n const getTypeName = (\n contentType: Struct.Schema,\n {\n plurality = 'singular',\n }: {\n plurality?: 'singular' | 'plural';\n } = {}\n ) => {\n const plugin = get('plugin', contentType);\n const modelName = get('modelName', contentType);\n const name =\n plurality === 'singular'\n ? get('info.singularName', contentType)\n : get('info.pluralName', contentType);\n\n const transformedPlugin = plugin ? upperFirst(camelCase(plugin)) : '';\n const transformedModelName = upperFirst(camelCase(name || singular(modelName)));\n\n return `${transformedPlugin}${transformedModelName}`;\n };\n\n /**\n * Build the entity's type name for a given content type\n */\n const getEntityName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}Entity`;\n };\n\n /**\n * Build the entity meta type name for a given content type\n */\n const getEntityMetaName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Meta`;\n };\n\n /**\n * Build the entity response's type name for a given content type\n */\n const getEntityResponseName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Response`;\n };\n\n /**\n * Build the entity response collection's type name for a given content type\n */\n const getEntityResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}ResponseCollection`;\n };\n\n /**\n * Build the relation response collection's type name for a given content type\n */\n const getRelationResponseCollectionName = (contentType: Struct.Schema) => {\n return `${getTypeName(contentType)}RelationResponseCollection`;\n };\n\n /**\n * Build a component type name based on its definition\n */\n const getComponentName = (contentType: Struct.Schema) => {\n return contentType.globalId;\n };\n\n /**\n * Build a component type name based on a content type's attribute\n */\n const getComponentNameFromAttribute = (attribute: Schema.Attribute.Component) => {\n return strapi.components[attribute.component].globalId;\n };\n\n /**\n * Build a dynamic zone type name based on a content type and an attribute name\n */\n const getDynamicZoneName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const dzName = upperFirst(camelCase(attributeName));\n const suffix = 'DynamicZone';\n\n return `${typeName}${dzName}${suffix}`;\n };\n\n /**\n * Build a dynamic zone input type name based on a content type and an attribute name\n */\n const getDynamicZoneInputName = (contentType: Struct.Schema, attributeName: string) => {\n const dzName = getDynamicZoneName(contentType, attributeName);\n\n return `${dzName}Input`;\n };\n\n /**\n * Build a component input type name based on a content type and an attribute name\n */\n const getComponentInputName = (contentType: Struct.Schema) => {\n const componentName = getComponentName(contentType);\n\n return `${componentName}Input`;\n };\n\n /**\n * Build a content type input name based on a content type and an attribute name\n */\n const getContentTypeInputName = (contentType: Struct.Schema) => {\n const typeName = getTypeName(contentType);\n\n return `${typeName}Input`;\n };\n\n /**\n * Build the queries type name for a given content type\n */\n const getEntityQueriesTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Queries`;\n };\n\n /**\n * Build the mutations type name for a given content type\n */\n const getEntityMutationsTypeName = (contentType: Struct.Schema) => {\n return `${getEntityName(contentType)}Mutations`;\n };\n\n /**\n * Build the filters type name for a given content type\n */\n const getFiltersInputTypeName = (contentType: Struct.Schema) => {\n const isComponent = contentType.modelType === 'component';\n\n const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType);\n\n return `${baseName}FiltersInput`;\n };\n\n /**\n * Build a filters type name for a given GraphQL scalar type\n */\n const getScalarFilterInputTypeName = (scalarType: string) => {\n return `${scalarType}FilterInput`;\n };\n\n /**\n * Build a type name for a given content type & polymorphic attribute\n */\n const getMorphRelationTypeName = (contentType: Struct.Schema, attributeName: string) => {\n const typeName = getTypeName(contentType);\n const formattedAttr = upperFirst(camelCase(attributeName));\n\n return `${typeName}${formattedAttr}Morph`;\n };\n\n /**\n * Build a custom type name generator with different customization options\n */\n const buildCustomTypeNameGenerator = (options: {\n prefix?: string;\n suffix?: string;\n firstLetterCase?: 'upper' | 'lower';\n plurality?: 'plural' | 'singular';\n }) => {\n // todo[v4]: use singularName & pluralName is available\n const { prefix = '', suffix = '', plurality = 'singular', firstLetterCase = 'upper' } = options;\n\n if (!['plural', 'singular'].includes(plurality)) {\n throw new ApplicationError(\n `\"plurality\" param must be either \"plural\" or \"singular\", but got: \"${plurality}\"`\n );\n }\n\n const getCustomTypeName = pipe(\n (ct) => getTypeName(ct, { plurality }),\n firstLetterCase === 'upper' ? upperFirst : lowerFirst\n );\n\n return (contentType: Struct.Schema) => `${prefix}${getCustomTypeName(contentType)}${suffix}`;\n };\n\n const getFindQueryName = buildCustomTypeNameGenerator({\n plurality: 'plural',\n firstLetterCase: 'lower',\n });\n\n const getFindConnectionQueryName = (contentType: Struct.Schema) => {\n return `${getFindQueryName(contentType)}_connection`;\n };\n\n const getFindOneQueryName = buildCustomTypeNameGenerator({ firstLetterCase: 'lower' });\n\n const getCreateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'create',\n firstLetterCase: 'upper',\n });\n\n const getUpdateMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'update',\n firstLetterCase: 'upper',\n });\n\n const getDeleteMutationTypeName = buildCustomTypeNameGenerator({\n prefix: 'delete',\n firstLetterCase: 'upper',\n });\n\n return {\n getEnumName,\n getTypeName,\n getEntityName,\n getEntityMetaName,\n getEntityResponseName,\n getEntityResponseCollectionName,\n getRelationResponseCollectionName,\n getComponentName,\n getComponentNameFromAttribute,\n getDynamicZoneName,\n getDynamicZoneInputName,\n getComponentInputName,\n getContentTypeInputName,\n getEntityQueriesTypeName,\n getEntityMutationsTypeName,\n getFiltersInputTypeName,\n getScalarFilterInputTypeName,\n getMorphRelationTypeName,\n buildCustomTypeNameGenerator,\n getFindQueryName,\n getFindOneQueryName,\n getCreateMutationTypeName,\n getUpdateMutationTypeName,\n getDeleteMutationTypeName,\n getFindConnectionQueryName,\n };\n};\n"],"names":["ApplicationError","errors","strapi","getEnumName","contentType","attributeName","attributes","enumName","modelType","typeName","getComponentName","getTypeName","defaultEnumName","toUpperCase","plurality","plugin","get","modelName","name","transformedPlugin","upperFirst","camelCase","transformedModelName","singular","getEntityName","getEntityMetaName","getEntityResponseName","getEntityResponseCollectionName","getRelationResponseCollectionName","globalId","getComponentNameFromAttribute","attribute","components","component","getDynamicZoneName","dzName","suffix","getDynamicZoneInputName","getComponentInputName","componentName","getContentTypeInputName","getEntityQueriesTypeName","getEntityMutationsTypeName","getFiltersInputTypeName","isComponent","baseName","getScalarFilterInputTypeName","scalarType","getMorphRelationTypeName","formattedAttr","buildCustomTypeNameGenerator","options","prefix","firstLetterCase","includes","getCustomTypeName","pipe","ct","lowerFirst","getFindQueryName","getFindConnectionQueryName","getFindOneQueryName","getCreateMutationTypeName","getUpdateMutationTypeName","getDeleteMutationTypeName"],"mappings":"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"}
@@ -1,7 +1,13 @@
1
+ /// <reference types="koa-session" />
1
2
  import { type ApolloServerPlugin } from '@apollo/server';
2
3
  import type { Core } from '@strapi/types';
3
- export declare const determineLandingPage: (strapi: Core.Strapi) => ApolloServerPlugin<import("@apollo/server").BaseContext>;
4
+ import type { BaseContext } from 'koa';
5
+ type StrapiGraphQLContext = BaseContext & {
6
+ rootQueryArgs?: Record<string, unknown>;
7
+ };
8
+ export declare const determineLandingPage: (strapi: Core.Strapi) => ApolloServerPlugin<StrapiGraphQLContext>;
4
9
  export declare function bootstrap({ strapi }: {
5
10
  strapi: Core.Strapi;
6
11
  }): Promise<void>;
12
+ export {};
7
13
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,kBAAkB,EAA4B,MAAM,gBAAgB,CAAC;AAUjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAW1C,eAAO,MAAM,oBAAoB,WAAY,KAAK,MAAM,6DA8EvD,CAAC;AAEF,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,iBAmIlE"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":";AACA,OAAO,EAAgB,KAAK,kBAAkB,EAA4B,MAAM,gBAAgB,CAAC;AAUjG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAA8C,MAAM,KAAK,CAAC;AAUnF,KAAK,oBAAoB,GAAG,WAAW,GAAG;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,oBAAoB,WACvB,KAAK,MAAM,KAClB,mBAAmB,oBAAoB,CA8EzC,CAAC;AAEF,wBAAsB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,iBA4JlE"}
@@ -247,6 +247,13 @@ declare const _default: {
247
247
  type: "component";
248
248
  pluginOptions?: object | undefined;
249
249
  searchable?: boolean | undefined;
250
+ conditions?: {
251
+ visible: string | number | boolean | import("json-logic-js").JsonLogicIf | import("json-logic-js").JsonLogicEqual | import("json-logic-js").JsonLogicStrictEqual | import("json-logic-js").JsonLogicNotEqual | import("json-logic-js").JsonLogicStrictNotEqual | import("json-logic-js").JsonLogicNegation | import("json-logic-js").JsonLogicDoubleNegation | import("json-logic-js").AdditionalOperation | import("json-logic-js").JsonLogicVar<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissing<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissingSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicOr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAnd<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMax<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMin<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSum<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicDifference<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicProduct<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicQuotient<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicRemainder<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMap<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicFilter<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicReduce<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAll<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicNone<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMerge<import("json-logic-js").AdditionalOperation> | {
252
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>[]];
253
+ } | {
254
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>];
255
+ } | import("json-logic-js").JsonLogicCat<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSubstr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLog<import("json-logic-js").AdditionalOperation> | null;
256
+ } | undefined;
250
257
  column?: Partial<import("@strapi/types/dist/schema/attribute").Column> | undefined;
251
258
  component: `${string}.${string}`;
252
259
  repeatable?: false | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGxC,wBAIE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGxC,wBAIE"}
@@ -1 +1 @@
1
- {"version":3,"file":"association.d.ts","sourceRoot":"","sources":["../../../../../../server/src/services/builders/resolvers/association.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;qCAIf,OAAO;iEAW5B;QACD,cAAc,EAAE,SAAS,GAAG,CAAC,WAAW,CAAC;QACzC,aAAa,EAAE,MAAM,CAAC;KACvB,YAkBuB,GAAG,SAAQ,GAAG,YAAgB,GAAG;;AAhC7D,wBA0FE"}
1
+ {"version":3,"file":"association.d.ts","sourceRoot":"","sources":["../../../../../../server/src/services/builders/resolvers/association.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;qCAIf,OAAO;iEAW5B;QACD,cAAc,EAAE,SAAS,GAAG,CAAC,WAAW,CAAC;QACzC,aAAa,EAAE,MAAM,CAAC;KACvB,YAkBuB,GAAG,SAAQ,GAAG,YAAgB,GAAG;;AAhC7D,wBA6HE"}
@@ -234,6 +234,13 @@ export declare const services: {
234
234
  type: "component";
235
235
  pluginOptions?: object | undefined;
236
236
  searchable?: boolean | undefined;
237
+ conditions?: {
238
+ visible: string | number | boolean | import("json-logic-js").JsonLogicIf | import("json-logic-js").JsonLogicEqual | import("json-logic-js").JsonLogicStrictEqual | import("json-logic-js").JsonLogicNotEqual | import("json-logic-js").JsonLogicStrictNotEqual | import("json-logic-js").JsonLogicNegation | import("json-logic-js").JsonLogicDoubleNegation | import("json-logic-js").AdditionalOperation | import("json-logic-js").JsonLogicVar<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissing<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissingSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicOr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAnd<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMax<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMin<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSum<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicDifference<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicProduct<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicQuotient<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicRemainder<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMap<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicFilter<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicReduce<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAll<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicNone<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMerge<import("json-logic-js").AdditionalOperation> | {
239
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>[]];
240
+ } | {
241
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>];
242
+ } | import("json-logic-js").JsonLogicCat<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSubstr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLog<import("json-logic-js").AdditionalOperation> | null;
243
+ } | undefined;
237
244
  column?: Partial<import("@strapi/types/dist/schema/attribute").Column> | undefined;
238
245
  component: `${string}.${string}`;
239
246
  repeatable?: false | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";AASA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";AASA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CASpB,CAAC"}
@@ -19,6 +19,13 @@ declare const _default: (context: Context) => {
19
19
  type: "component";
20
20
  pluginOptions?: object | undefined;
21
21
  searchable?: boolean | undefined;
22
+ conditions?: {
23
+ visible: string | number | boolean | import("json-logic-js").JsonLogicIf | import("json-logic-js").JsonLogicEqual | import("json-logic-js").JsonLogicStrictEqual | import("json-logic-js").JsonLogicNotEqual | import("json-logic-js").JsonLogicStrictNotEqual | import("json-logic-js").JsonLogicNegation | import("json-logic-js").JsonLogicDoubleNegation | import("json-logic-js").AdditionalOperation | import("json-logic-js").JsonLogicVar<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissing<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMissingSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicOr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAnd<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicGreaterThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThan<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLessThanOrEqual<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMax<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMin<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSum<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicDifference<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicProduct<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicQuotient<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicRemainder<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMap<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicFilter<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicReduce<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicAll<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicNone<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSome<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicMerge<import("json-logic-js").AdditionalOperation> | {
24
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>[]];
25
+ } | {
26
+ in: [import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>, import("json-logic-js").RulesLogic<import("json-logic-js").AdditionalOperation>];
27
+ } | import("json-logic-js").JsonLogicCat<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicSubstr<import("json-logic-js").AdditionalOperation> | import("json-logic-js").JsonLogicLog<import("json-logic-js").AdditionalOperation> | null;
28
+ } | undefined;
22
29
  column?: Partial<import("@strapi/types/dist/schema/attribute").Column> | undefined;
23
30
  component: `${string}.${string}`;
24
31
  repeatable?: false | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/utils/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;kCAEf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAhC,wBAKG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/utils/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;kCAEf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAhC,wBAKG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/plugin-graphql",
3
- "version": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
3
+ "version": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
4
4
  "description": "Adds GraphQL endpoint with default API methods.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -49,6 +49,8 @@
49
49
  "build:types:admin": "run -T tsc -p admin/tsconfig.build.json --emitDeclarationOnly",
50
50
  "clean": "run -T rimraf ./dist",
51
51
  "lint": "run -T eslint .",
52
+ "test:unit": "run -T jest --passWithNoTests",
53
+ "test:unit:watch": "run -T jest --watch",
52
54
  "watch": "run -T rollup -c -w"
53
55
  },
54
56
  "dependencies": {
@@ -57,9 +59,9 @@
57
59
  "@graphql-tools/schema": "10.0.3",
58
60
  "@graphql-tools/utils": "^10.1.3",
59
61
  "@koa/cors": "5.0.0",
60
- "@strapi/design-system": "2.0.0-rc.24",
61
- "@strapi/icons": "2.0.0-rc.24",
62
- "@strapi/utils": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
62
+ "@strapi/design-system": "2.0.0-rc.30",
63
+ "@strapi/icons": "2.0.0-rc.30",
64
+ "@strapi/utils": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
63
65
  "graphql": "^16.8.1",
64
66
  "graphql-depth-limit": "^1.1.0",
65
67
  "graphql-playground-middleware-koa": "^1.6.21",
@@ -71,19 +73,19 @@
71
73
  "pluralize": "8.0.0"
72
74
  },
73
75
  "devDependencies": {
74
- "@strapi/strapi": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
75
- "@strapi/types": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
76
+ "@strapi/strapi": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
77
+ "@strapi/types": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
76
78
  "@types/graphql-depth-limit": "1.1.5",
77
79
  "@types/koa-bodyparser": "4.3.12",
78
80
  "@types/koa__cors": "5.0.0",
79
81
  "cross-env": "^7.0.3",
80
- "eslint-config-custom": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
81
- "koa": "2.15.4",
82
+ "eslint-config-custom": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
83
+ "koa": "2.16.1",
82
84
  "react": "18.3.1",
83
85
  "react-dom": "18.3.1",
84
86
  "react-router-dom": "6.22.3",
85
87
  "styled-components": "6.1.8",
86
- "tsconfig": "0.0.0-next.883f4fcabd28de02b78b7b00a70e33cd2d151d05",
88
+ "tsconfig": "0.0.0-next.88599e70ce0e4e804e2bad578aba4718c5a5304d",
87
89
  "typescript": "5.4.4"
88
90
  },
89
91
  "peerDependencies": {