@strapi/plugin-graphql 5.46.0 → 5.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/admin/index.js +1 -0
  2. package/dist/admin/index.js.map +1 -1
  3. package/dist/admin/index.mjs +1 -0
  4. package/dist/admin/index.mjs.map +1 -1
  5. package/dist/admin/translations/sk.json.js +10 -0
  6. package/dist/admin/translations/sk.json.js.map +1 -0
  7. package/dist/admin/translations/sk.json.mjs +8 -0
  8. package/dist/admin/translations/sk.json.mjs.map +1 -0
  9. package/dist/server/services/builders/resolvers/association.js +28 -23
  10. package/dist/server/services/builders/resolvers/association.js.map +1 -1
  11. package/dist/server/services/builders/resolvers/association.mjs +29 -24
  12. package/dist/server/services/builders/resolvers/association.mjs.map +1 -1
  13. package/dist/server/services/builders/resolvers/merge-publication-args.js +23 -0
  14. package/dist/server/services/builders/resolvers/merge-publication-args.js.map +1 -0
  15. package/dist/server/services/builders/resolvers/merge-publication-args.mjs +21 -0
  16. package/dist/server/services/builders/resolvers/merge-publication-args.mjs.map +1 -0
  17. package/dist/server/services/builders/resolvers/pagination.js +12 -1
  18. package/dist/server/services/builders/resolvers/pagination.js.map +1 -1
  19. package/dist/server/services/builders/resolvers/pagination.mjs +12 -1
  20. package/dist/server/services/builders/resolvers/pagination.mjs.map +1 -1
  21. package/dist/server/services/builders/resolvers/query.js +20 -13
  22. package/dist/server/services/builders/resolvers/query.js.map +1 -1
  23. package/dist/server/services/builders/resolvers/query.mjs +20 -13
  24. package/dist/server/services/builders/resolvers/query.mjs.map +1 -1
  25. package/dist/server/services/builders/utils.js +5 -3
  26. package/dist/server/services/builders/utils.js.map +1 -1
  27. package/dist/server/services/builders/utils.mjs +5 -3
  28. package/dist/server/services/builders/utils.mjs.map +1 -1
  29. package/dist/server/services/constants.js +2 -0
  30. package/dist/server/services/constants.js.map +1 -1
  31. package/dist/server/services/constants.mjs +2 -0
  32. package/dist/server/services/constants.mjs.map +1 -1
  33. package/dist/server/services/internals/args/has-published-version.js +4 -1
  34. package/dist/server/services/internals/args/has-published-version.js.map +1 -1
  35. package/dist/server/services/internals/args/has-published-version.mjs +4 -1
  36. package/dist/server/services/internals/args/has-published-version.mjs.map +1 -1
  37. package/dist/server/services/internals/args/index.js +3 -1
  38. package/dist/server/services/internals/args/index.js.map +1 -1
  39. package/dist/server/services/internals/args/index.mjs +3 -1
  40. package/dist/server/services/internals/args/index.mjs.map +1 -1
  41. package/dist/server/services/internals/args/publication-filter.js +13 -0
  42. package/dist/server/services/internals/args/publication-filter.js.map +1 -0
  43. package/dist/server/services/internals/args/publication-filter.mjs +11 -0
  44. package/dist/server/services/internals/args/publication-filter.mjs.map +1 -0
  45. package/dist/server/services/internals/types/index.js +3 -1
  46. package/dist/server/services/internals/types/index.js.map +1 -1
  47. package/dist/server/services/internals/types/index.mjs +3 -1
  48. package/dist/server/services/internals/types/index.mjs.map +1 -1
  49. package/dist/server/services/internals/types/publication-filter.js +25 -0
  50. package/dist/server/services/internals/types/publication-filter.js.map +1 -0
  51. package/dist/server/services/internals/types/publication-filter.mjs +23 -0
  52. package/dist/server/services/internals/types/publication-filter.mjs.map +1 -0
  53. package/dist/server/src/index.d.ts +8 -0
  54. package/dist/server/src/index.d.ts.map +1 -1
  55. package/dist/server/src/services/builders/index.d.ts +1 -0
  56. package/dist/server/src/services/builders/index.d.ts.map +1 -1
  57. package/dist/server/src/services/builders/resolvers/association.d.ts.map +1 -1
  58. package/dist/server/src/services/builders/resolvers/merge-publication-args.d.ts +9 -0
  59. package/dist/server/src/services/builders/resolvers/merge-publication-args.d.ts.map +1 -0
  60. package/dist/server/src/services/builders/resolvers/pagination.d.ts.map +1 -1
  61. package/dist/server/src/services/builders/resolvers/query.d.ts.map +1 -1
  62. package/dist/server/src/services/builders/utils.d.ts +1 -0
  63. package/dist/server/src/services/builders/utils.d.ts.map +1 -1
  64. package/dist/server/src/services/constants.d.ts +1 -0
  65. package/dist/server/src/services/constants.d.ts.map +1 -1
  66. package/dist/server/src/services/index.d.ts +8 -0
  67. package/dist/server/src/services/index.d.ts.map +1 -1
  68. package/dist/server/src/services/internals/args/has-published-version.d.ts +4 -0
  69. package/dist/server/src/services/internals/args/has-published-version.d.ts.map +1 -1
  70. package/dist/server/src/services/internals/args/index.d.ts +2 -0
  71. package/dist/server/src/services/internals/args/index.d.ts.map +1 -1
  72. package/dist/server/src/services/internals/args/publication-filter.d.ts +4 -0
  73. package/dist/server/src/services/internals/args/publication-filter.d.ts.map +1 -0
  74. package/dist/server/src/services/internals/index.d.ts +6 -0
  75. package/dist/server/src/services/internals/index.d.ts.map +1 -1
  76. package/dist/server/src/services/internals/types/index.d.ts +5 -0
  77. package/dist/server/src/services/internals/types/index.d.ts.map +1 -1
  78. package/dist/server/src/services/internals/types/publication-filter.d.ts +6 -0
  79. package/dist/server/src/services/internals/types/publication-filter.d.ts.map +1 -0
  80. package/package.json +7 -7
@@ -15,6 +15,7 @@ function __variableDynamicImportRuntime0__(path) {
15
15
  case './translations/fr.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/fr.json.js')); });
16
16
  case './translations/pl.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/pl.json.js')); });
17
17
  case './translations/ru.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/ru.json.js')); });
18
+ case './translations/sk.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/sk.json.js')); });
18
19
  case './translations/sv.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/sv.json.js')); });
19
20
  case './translations/tr.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/tr.json.js')); });
20
21
  case './translations/uk.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/uk.json.js')); });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n // TODO: we need to have the type for StrapiApp done from `@strapi/admin` package.\n register(app: any) {\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap() {},\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["name","pluginPkg","strapi","register","app","registerPlugin","id","pluginId","bootstrap","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,IAAAA,GAAOC,gBAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC;AACA,YAAe;;AAEbG,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,iBAAAA;AACJP,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACAQ,SAAAA,CAAAA,GAAAA,CAAa,CAAA;IACb,MAAMC,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,kDAAyBD,IAAAA,EAAMX,iBAAAA,CAAAA;AACrCQ,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n // TODO: we need to have the type for StrapiApp done from `@strapi/admin` package.\n register(app: any) {\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap() {},\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["name","pluginPkg","strapi","register","app","registerPlugin","id","pluginId","bootstrap","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,IAAAA,GAAOC,gBAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC;AACA,YAAe;;AAEbG,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,iBAAAA;AACJP,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACAQ,SAAAA,CAAAA,GAAAA,CAAa,CAAA;IACb,MAAMC,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,kDAAyBD,IAAAA,EAAMX,iBAAAA,CAAAA;AACrCQ,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB,IAAA;AACF,CAAA;;;;"}
@@ -11,6 +11,7 @@ function __variableDynamicImportRuntime0__(path) {
11
11
  case './translations/fr.json': return import('./translations/fr.json.mjs');
12
12
  case './translations/pl.json': return import('./translations/pl.json.mjs');
13
13
  case './translations/ru.json': return import('./translations/ru.json.mjs');
14
+ case './translations/sk.json': return import('./translations/sk.json.mjs');
14
15
  case './translations/sv.json': return import('./translations/sv.json.mjs');
15
16
  case './translations/tr.json': return import('./translations/tr.json.mjs');
16
17
  case './translations/uk.json': return import('./translations/uk.json.mjs');
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n // TODO: we need to have the type for StrapiApp done from `@strapi/admin` package.\n register(app: any) {\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap() {},\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["name","pluginPkg","strapi","register","app","registerPlugin","id","pluginId","bootstrap","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,IAAAA,GAAOC,SAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC;AACA,YAAe;;AAEbG,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,QAAAA;AACJP,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACAQ,SAAAA,CAAAA,GAAAA,CAAa,CAAA;IACb,MAAMC,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAAA,EAAMX,QAAAA,CAAAA;AACrCQ,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import pluginPkg from '../../package.json';\n\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n // TODO: we need to have the type for StrapiApp done from `@strapi/admin` package.\n register(app: any) {\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap() {},\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["name","pluginPkg","strapi","register","app","registerPlugin","id","pluginId","bootstrap","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,IAAAA,GAAOC,SAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC;AACA,YAAe;;AAEbG,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,cAAc,CAAC;YACjBC,EAAAA,EAAIC,QAAAA;AACJP,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA;IACAQ,SAAAA,CAAAA,GAAAA,CAAa,CAAA;IACb,MAAMC,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAAA,CAAQC,GAAG,CACrCH,OAAAA,CAAQI,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAAA,CAAO,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAAA,EAAMX,QAAAA,CAAAA;AACrCQ,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACJ,QAAA,CAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB,IAAA;AACF,CAAA;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var sk = {
4
+ "plugin.description.long": "Pridáva GraphQL endpoint s predvolenými API metódami.",
5
+ "plugin.description.short": "Pridáva GraphQL endpoint s predvolenými API metódami.",
6
+ "plugin.name": "GraphQL"
7
+ };
8
+
9
+ module.exports = sk;
10
+ //# sourceMappingURL=sk.json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sk.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,8 @@
1
+ var sk = {
2
+ "plugin.description.long": "Pridáva GraphQL endpoint s predvolenými API metódami.",
3
+ "plugin.description.short": "Pridáva GraphQL endpoint s predvolenými API metódami.",
4
+ "plugin.name": "GraphQL"
5
+ };
6
+
7
+ export { sk as default };
8
+ //# sourceMappingURL=sk.json.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sk.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -47,8 +47,11 @@ var associationResolvers = (({ strapi })=>{
47
47
  rootPath = rootPath.prev;
48
48
  }
49
49
  const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;
50
- // Only inherit status from built-in queries to avoid conflicts with custom resolvers
51
- const inheritedStatus = rootQueryArgs?.status && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.status : null;
50
+ const shouldInheritRootQueryStatus = rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);
51
+ // Only inherit status from built-in queries to avoid conflicts with custom resolvers.
52
+ // Built-in root queries default to published results; draft/preview queries pass `status`.
53
+ // Nested relations should match that parent query.
54
+ const inheritedStatus = shouldInheritRootQueryStatus ? rootQueryArgs.status || 'published' : null;
52
55
  const statusToApply = args.status || inheritedStatus;
53
56
  const defaultFilters = isTargetDraftAndPublishContentType && statusToApply ? {
54
57
  where: {
@@ -59,30 +62,32 @@ var associationResolvers = (({ strapi })=>{
59
62
  }
60
63
  }
61
64
  } : {};
62
- // Inherit hasPublishedVersion from root query (same pattern as status)
65
+ const inheritedPublicationFilter = rootQueryArgs?.publicationFilter !== undefined && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.publicationFilter : undefined;
63
66
  const inheritedHasPublishedVersion = rootQueryArgs?.hasPublishedVersion !== undefined && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.hasPublishedVersion : undefined;
64
- // Build hasPublishedVersion condition for this relation's model
65
- let hasPublishedVersionFilters = {};
66
- if (isTargetDraftAndPublishContentType && inheritedHasPublishedVersion !== undefined) {
67
- const meta = strapi.db.metadata.get(targetUID);
68
- const tableName = meta.tableName;
69
- const documentIdAttr = meta.attributes.documentId;
70
- const publishedAtAttr = meta.attributes.publishedAt;
71
- const documentIdColumn = 'columnName' in documentIdAttr && documentIdAttr.columnName || 'document_id';
72
- const publishedAtColumn = 'columnName' in publishedAtAttr && publishedAtAttr.columnName || 'published_at';
73
- const knex = strapi.db.connection;
74
- const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);
75
- hasPublishedVersionFilters = {
76
- where: {
77
- documentId: inheritedHasPublishedVersion ? {
78
- $in: subquery
79
- } : {
80
- $notIn: subquery
81
- }
67
+ let effectivePublicationFilter = inheritedPublicationFilter;
68
+ if (effectivePublicationFilter === undefined && inheritedHasPublishedVersion !== undefined) {
69
+ effectivePublicationFilter = inheritedHasPublishedVersion ? 'has-published-version-document' : 'never-published-document';
70
+ }
71
+ let publicationFilterWhere = {};
72
+ if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {
73
+ let mode;
74
+ try {
75
+ mode = utils.parsePublicationFilter(effectivePublicationFilter);
76
+ } catch {
77
+ mode = undefined;
78
+ }
79
+ if (mode !== undefined) {
80
+ const meta = strapi.db.metadata.get(targetUID);
81
+ const st = statusToApply === 'published' ? 'published' : 'draft';
82
+ const cond = utils.buildPublicationFilterWhere(strapi.db.connection, meta, targetContentType, mode, st);
83
+ if (cond && Object.keys(cond).length > 0) {
84
+ publicationFilterWhere = {
85
+ where: cond
86
+ };
82
87
  }
83
- };
88
+ }
84
89
  }
85
- const dbQuery = fp.merge(fp.merge(defaultFilters, hasPublishedVersionFilters), transformedQuery);
90
+ const dbQuery = fp.merge(fp.merge(defaultFilters, publicationFilterWhere), transformedQuery);
86
91
  // Sign media URLs if upload plugin is available and using private provider
87
92
  const data = await (async ()=>{
88
93
  const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
@@ -1 +1 @@
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, info: 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\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers\n const inheritedStatus =\n rootQueryArgs?.status &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.status\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n // Inherit hasPublishedVersion from root query (same pattern as status)\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n // Build hasPublishedVersion condition for this relation's model\n let hasPublishedVersionFilters: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && inheritedHasPublishedVersion !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const tableName = meta.tableName;\n const documentIdAttr = meta.attributes.documentId;\n const publishedAtAttr = meta.attributes.publishedAt;\n const documentIdColumn =\n ('columnName' in documentIdAttr && documentIdAttr.columnName) || 'document_id';\n const publishedAtColumn =\n ('columnName' in publishedAtAttr && publishedAtAttr.columnName) || 'published_at';\n\n const knex = strapi.db.connection;\n const subquery = knex(tableName)\n .distinct(documentIdColumn)\n .whereNotNull(publishedAtColumn);\n\n hasPublishedVersionFilters = {\n where: {\n documentId: inheritedHasPublishedVersion ? { $in: subquery } : { $notIn: subquery },\n },\n };\n }\n\n const dbQuery = merge(merge(defaultFilters, hasPublishedVersionFilters), 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 sanitizeInfo = {\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, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\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","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","inheritedStatus","status","_originField","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedHasPublishedVersion","hasPublishedVersion","hasPublishedVersionFilters","meta","db","metadata","tableName","documentIdAttr","documentId","publishedAtAttr","documentIdColumn","columnName","publishedAtColumn","knex","connection","subquery","distinct","whereNotNull","$in","$notIn","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
1
+ {"version":3,"file":"association.js","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get, merge } from 'lodash/fp';\nimport {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} 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, info: 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\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge(merge(defaultFilters, publicationFilterWhere), 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 sanitizeInfo = {\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, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\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","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { merge, get } from 'lodash/fp';
2
- import { errors, contentTypes, async } from '@strapi/utils';
2
+ import { errors, contentTypes, parsePublicationFilter, buildPublicationFilterWhere, async } from '@strapi/utils';
3
3
 
4
4
  const { ApplicationError } = errors;
5
5
  var associationResolvers = (({ strapi })=>{
@@ -45,8 +45,11 @@ var associationResolvers = (({ strapi })=>{
45
45
  rootPath = rootPath.prev;
46
46
  }
47
47
  const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;
48
- // Only inherit status from built-in queries to avoid conflicts with custom resolvers
49
- const inheritedStatus = rootQueryArgs?.status && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.status : null;
48
+ const shouldInheritRootQueryStatus = rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);
49
+ // Only inherit status from built-in queries to avoid conflicts with custom resolvers.
50
+ // Built-in root queries default to published results; draft/preview queries pass `status`.
51
+ // Nested relations should match that parent query.
52
+ const inheritedStatus = shouldInheritRootQueryStatus ? rootQueryArgs.status || 'published' : null;
50
53
  const statusToApply = args.status || inheritedStatus;
51
54
  const defaultFilters = isTargetDraftAndPublishContentType && statusToApply ? {
52
55
  where: {
@@ -57,30 +60,32 @@ var associationResolvers = (({ strapi })=>{
57
60
  }
58
61
  }
59
62
  } : {};
60
- // Inherit hasPublishedVersion from root query (same pattern as status)
63
+ const inheritedPublicationFilter = rootQueryArgs?.publicationFilter !== undefined && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.publicationFilter : undefined;
61
64
  const inheritedHasPublishedVersion = rootQueryArgs?.hasPublishedVersion !== undefined && rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField) ? rootQueryArgs.hasPublishedVersion : undefined;
62
- // Build hasPublishedVersion condition for this relation's model
63
- let hasPublishedVersionFilters = {};
64
- if (isTargetDraftAndPublishContentType && inheritedHasPublishedVersion !== undefined) {
65
- const meta = strapi.db.metadata.get(targetUID);
66
- const tableName = meta.tableName;
67
- const documentIdAttr = meta.attributes.documentId;
68
- const publishedAtAttr = meta.attributes.publishedAt;
69
- const documentIdColumn = 'columnName' in documentIdAttr && documentIdAttr.columnName || 'document_id';
70
- const publishedAtColumn = 'columnName' in publishedAtAttr && publishedAtAttr.columnName || 'published_at';
71
- const knex = strapi.db.connection;
72
- const subquery = knex(tableName).distinct(documentIdColumn).whereNotNull(publishedAtColumn);
73
- hasPublishedVersionFilters = {
74
- where: {
75
- documentId: inheritedHasPublishedVersion ? {
76
- $in: subquery
77
- } : {
78
- $notIn: subquery
79
- }
65
+ let effectivePublicationFilter = inheritedPublicationFilter;
66
+ if (effectivePublicationFilter === undefined && inheritedHasPublishedVersion !== undefined) {
67
+ effectivePublicationFilter = inheritedHasPublishedVersion ? 'has-published-version-document' : 'never-published-document';
68
+ }
69
+ let publicationFilterWhere = {};
70
+ if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {
71
+ let mode;
72
+ try {
73
+ mode = parsePublicationFilter(effectivePublicationFilter);
74
+ } catch {
75
+ mode = undefined;
76
+ }
77
+ if (mode !== undefined) {
78
+ const meta = strapi.db.metadata.get(targetUID);
79
+ const st = statusToApply === 'published' ? 'published' : 'draft';
80
+ const cond = buildPublicationFilterWhere(strapi.db.connection, meta, targetContentType, mode, st);
81
+ if (cond && Object.keys(cond).length > 0) {
82
+ publicationFilterWhere = {
83
+ where: cond
84
+ };
80
85
  }
81
- };
86
+ }
82
87
  }
83
- const dbQuery = merge(merge(defaultFilters, hasPublishedVersionFilters), transformedQuery);
88
+ const dbQuery = merge(merge(defaultFilters, publicationFilterWhere), transformedQuery);
84
89
  // Sign media URLs if upload plugin is available and using private provider
85
90
  const data = await (async ()=>{
86
91
  const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
@@ -1 +1 @@
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, info: 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\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers\n const inheritedStatus =\n rootQueryArgs?.status &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.status\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n // Inherit hasPublishedVersion from root query (same pattern as status)\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n // Build hasPublishedVersion condition for this relation's model\n let hasPublishedVersionFilters: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && inheritedHasPublishedVersion !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const tableName = meta.tableName;\n const documentIdAttr = meta.attributes.documentId;\n const publishedAtAttr = meta.attributes.publishedAt;\n const documentIdColumn =\n ('columnName' in documentIdAttr && documentIdAttr.columnName) || 'document_id';\n const publishedAtColumn =\n ('columnName' in publishedAtAttr && publishedAtAttr.columnName) || 'published_at';\n\n const knex = strapi.db.connection;\n const subquery = knex(tableName)\n .distinct(documentIdColumn)\n .whereNotNull(publishedAtColumn);\n\n hasPublishedVersionFilters = {\n where: {\n documentId: inheritedHasPublishedVersion ? { $in: subquery } : { $notIn: subquery },\n },\n };\n }\n\n const dbQuery = merge(merge(defaultFilters, hasPublishedVersionFilters), 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 sanitizeInfo = {\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, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\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","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","inheritedStatus","status","_originField","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedHasPublishedVersion","hasPublishedVersion","hasPublishedVersionFilters","meta","db","metadata","tableName","documentIdAttr","documentId","publishedAtAttr","documentIdColumn","columnName","publishedAtColumn","knex","connection","subquery","distinct","whereNotNull","$in","$notIn","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","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 {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} 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, info: 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\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge(merge(defaultFilters, publicationFilterWhere), 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 sanitizeInfo = {\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, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\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","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@strapi/utils');
4
+
5
+ /**
6
+ * GraphQL still exposes deprecated `hasPublishedVersion`; normalize to `publicationFilter`
7
+ * document-scoped modes so the document service only applies one code path.
8
+ */ const mergePublicationFilterFromGraphQLArgs = (args)=>{
9
+ if (args.publicationFilter != null && args.publicationFilter !== undefined) {
10
+ return {
11
+ publicationFilter: utils.parsePublicationFilter(args.publicationFilter)
12
+ };
13
+ }
14
+ if (args.hasPublishedVersion != null && args.hasPublishedVersion !== undefined) {
15
+ return {
16
+ publicationFilter: args.hasPublishedVersion ? 'has-published-version-document' : 'never-published-document'
17
+ };
18
+ }
19
+ return {};
20
+ };
21
+
22
+ exports.mergePublicationFilterFromGraphQLArgs = mergePublicationFilterFromGraphQLArgs;
23
+ //# sourceMappingURL=merge-publication-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-publication-args.js","sources":["../../../../../server/src/services/builders/resolvers/merge-publication-args.ts"],"sourcesContent":["import { parsePublicationFilter, type PublicationFilterMode } from '@strapi/utils';\n\n/**\n * GraphQL still exposes deprecated `hasPublishedVersion`; normalize to `publicationFilter`\n * document-scoped modes so the document service only applies one code path.\n */\nexport const mergePublicationFilterFromGraphQLArgs = (\n args: Record<string, unknown>\n): { publicationFilter?: PublicationFilterMode } => {\n if (args.publicationFilter != null && args.publicationFilter !== undefined) {\n return { publicationFilter: parsePublicationFilter(args.publicationFilter) };\n }\n if (args.hasPublishedVersion != null && args.hasPublishedVersion !== undefined) {\n return {\n publicationFilter: args.hasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document',\n };\n }\n return {};\n};\n"],"names":["mergePublicationFilterFromGraphQLArgs","args","publicationFilter","undefined","parsePublicationFilter","hasPublishedVersion"],"mappings":";;;;AAEA;;;IAIO,MAAMA,qCAAAA,GAAwC,CACnDC,IAAAA,GAAAA;AAEA,IAAA,IAAIA,KAAKC,iBAAiB,IAAI,QAAQD,IAAAA,CAAKC,iBAAiB,KAAKC,SAAAA,EAAW;QAC1E,OAAO;YAAED,iBAAAA,EAAmBE,4BAAAA,CAAuBH,KAAKC,iBAAiB;AAAE,SAAA;AAC7E,IAAA;AACA,IAAA,IAAID,KAAKI,mBAAmB,IAAI,QAAQJ,IAAAA,CAAKI,mBAAmB,KAAKF,SAAAA,EAAW;QAC9E,OAAO;YACLD,iBAAAA,EAAmBD,IAAAA,CAAKI,mBAAmB,GACvC,gCAAA,GACA;AACN,SAAA;AACF,IAAA;AACA,IAAA,OAAO,EAAC;AACV;;;;"}
@@ -0,0 +1,21 @@
1
+ import { parsePublicationFilter } from '@strapi/utils';
2
+
3
+ /**
4
+ * GraphQL still exposes deprecated `hasPublishedVersion`; normalize to `publicationFilter`
5
+ * document-scoped modes so the document service only applies one code path.
6
+ */ const mergePublicationFilterFromGraphQLArgs = (args)=>{
7
+ if (args.publicationFilter != null && args.publicationFilter !== undefined) {
8
+ return {
9
+ publicationFilter: parsePublicationFilter(args.publicationFilter)
10
+ };
11
+ }
12
+ if (args.hasPublishedVersion != null && args.hasPublishedVersion !== undefined) {
13
+ return {
14
+ publicationFilter: args.hasPublishedVersion ? 'has-published-version-document' : 'never-published-document'
15
+ };
16
+ }
17
+ return {};
18
+ };
19
+
20
+ export { mergePublicationFilterFromGraphQLArgs };
21
+ //# sourceMappingURL=merge-publication-args.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-publication-args.mjs","sources":["../../../../../server/src/services/builders/resolvers/merge-publication-args.ts"],"sourcesContent":["import { parsePublicationFilter, type PublicationFilterMode } from '@strapi/utils';\n\n/**\n * GraphQL still exposes deprecated `hasPublishedVersion`; normalize to `publicationFilter`\n * document-scoped modes so the document service only applies one code path.\n */\nexport const mergePublicationFilterFromGraphQLArgs = (\n args: Record<string, unknown>\n): { publicationFilter?: PublicationFilterMode } => {\n if (args.publicationFilter != null && args.publicationFilter !== undefined) {\n return { publicationFilter: parsePublicationFilter(args.publicationFilter) };\n }\n if (args.hasPublishedVersion != null && args.hasPublishedVersion !== undefined) {\n return {\n publicationFilter: args.hasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document',\n };\n }\n return {};\n};\n"],"names":["mergePublicationFilterFromGraphQLArgs","args","publicationFilter","undefined","parsePublicationFilter","hasPublishedVersion"],"mappings":";;AAEA;;;IAIO,MAAMA,qCAAAA,GAAwC,CACnDC,IAAAA,GAAAA;AAEA,IAAA,IAAIA,KAAKC,iBAAiB,IAAI,QAAQD,IAAAA,CAAKC,iBAAiB,KAAKC,SAAAA,EAAW;QAC1E,OAAO;YAAED,iBAAAA,EAAmBE,sBAAAA,CAAuBH,KAAKC,iBAAiB;AAAE,SAAA;AAC7E,IAAA;AACA,IAAA,IAAID,KAAKI,mBAAmB,IAAI,QAAQJ,IAAAA,CAAKI,mBAAmB,KAAKF,SAAAA,EAAW;QAC9E,OAAO;YACLD,iBAAAA,EAAmBD,IAAAA,CAAKI,mBAAmB,GACvC,gCAAA,GACA;AACN,SAAA;AACF,IAAA;AACA,IAAA,OAAO,EAAC;AACV;;;;"}
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ var mergePublicationArgs = require('./merge-publication-args.js');
4
+
3
5
  var paginationResolvers = (({ strapi })=>({
4
6
  async resolvePagination (parent, _, ctx) {
5
7
  const { args, resourceUID } = parent.info;
@@ -12,7 +14,16 @@ var paginationResolvers = (({ strapi })=>({
12
14
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
13
15
  auth: ctx?.state?.auth
14
16
  });
15
- const total = await strapi.documents(resourceUID).count(sanitizedQuery);
17
+ const { publicationFilter } = mergePublicationArgs.mergePublicationFilterFromGraphQLArgs(args);
18
+ const sanitized = sanitizedQuery;
19
+ const { status, ...restSanitized } = sanitized;
20
+ const total = await strapi.documents(resourceUID).count({
21
+ ...restSanitized,
22
+ ...publicationFilter !== undefined ? {
23
+ publicationFilter
24
+ } : {},
25
+ status: status ?? 'published'
26
+ });
16
27
  const pageSize = limit === -1 ? total - start : safeLimit;
17
28
  const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);
18
29
  const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sources":["../../../../../server/src/services/builders/resolvers/pagination.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n async resolvePagination(parent: any, _: any, ctx: any) {\n const { args, resourceUID } = parent.info;\n const { start, limit } = args;\n const safeLimit = Math.max(limit, 1);\n const contentType = strapi.getModel(resourceUID);\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const total = await strapi.documents!(resourceUID).count(sanitizedQuery);\n\n const pageSize = limit === -1 ? total - start : safeLimit;\n const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);\n const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;\n\n return { total, page, pageSize, pageCount };\n },\n});\n"],"names":["strapi","resolvePagination","parent","_","ctx","args","resourceUID","info","start","limit","safeLimit","Math","max","contentType","getModel","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","total","documents","count","pageSize","pageCount","ceil","page","floor"],"mappings":";;AAEA,0BAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvC,QAAA,MAAMC,iBAAAA,CAAAA,CAAkBC,MAAW,EAAEC,CAAM,EAAEC,GAAQ,EAAA;AACnD,YAAA,MAAM,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGJ,OAAOK,IAAI;AACzC,YAAA,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGJ,IAAAA;AACzB,YAAA,MAAMK,SAAAA,GAAYC,IAAAA,CAAKC,GAAG,CAACH,KAAAA,EAAO,CAAA,CAAA;YAClC,MAAMI,WAAAA,GAAcb,MAAAA,CAAOc,QAAQ,CAACR,WAAAA,CAAAA;YAEpC,MAAMN,MAAAA,CAAOe,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACZ,MAAMQ,WAAAA,EAAa;AACxDK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;YAEA,MAAME,cAAAA,GAAiB,MAAMpB,MAAAA,CAAOe,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACZ,IAAAA,EAAMQ,WAAAA,EAAa;AAC/EK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;AAEA,YAAA,MAAMI,QAAQ,MAAMtB,MAAAA,CAAOuB,SAAS,CAAEjB,WAAAA,CAAAA,CAAakB,KAAK,CAACJ,cAAAA,CAAAA;AAEzD,YAAA,MAAMK,QAAAA,GAAWhB,KAAAA,KAAU,EAAC,GAAIa,QAAQd,KAAAA,GAAQE,SAAAA;YAChD,MAAMgB,SAAAA,GAAYjB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKgB,IAAI,CAACL,KAAAA,GAAQZ,SAAAA,CAAAA;YAC/D,MAAMkB,IAAAA,GAAOnB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKkB,KAAK,CAACrB,KAAAA,GAAQE,SAAAA,CAAAA,GAAa,CAAA;YAExE,OAAO;AAAEY,gBAAAA,KAAAA;AAAOM,gBAAAA,IAAAA;AAAMH,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAU,aAAA;AAC5C,QAAA;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"pagination.js","sources":["../../../../../server/src/services/builders/resolvers/pagination.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nimport { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args';\n\nexport default ({ strapi }: Context) => ({\n async resolvePagination(parent: any, _: any, ctx: any) {\n const { args, resourceUID } = parent.info;\n const { start, limit } = args;\n const safeLimit = Math.max(limit, 1);\n const contentType = strapi.getModel(resourceUID);\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const { publicationFilter } = mergePublicationFilterFromGraphQLArgs(\n args as Record<string, unknown>\n );\n const sanitized = sanitizedQuery as Record<string, unknown>;\n const { status, ...restSanitized } = sanitized;\n\n const total = await strapi.documents!(resourceUID).count({\n ...restSanitized,\n ...(publicationFilter !== undefined ? { publicationFilter } : {}),\n status: (status as 'draft' | 'published' | undefined) ?? 'published',\n });\n\n const pageSize = limit === -1 ? total - start : safeLimit;\n const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);\n const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;\n\n return { total, page, pageSize, pageCount };\n },\n});\n"],"names":["strapi","resolvePagination","parent","_","ctx","args","resourceUID","info","start","limit","safeLimit","Math","max","contentType","getModel","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","publicationFilter","mergePublicationFilterFromGraphQLArgs","sanitized","status","restSanitized","total","documents","count","undefined","pageSize","pageCount","ceil","page","floor"],"mappings":";;;;AAIA,0BAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvC,QAAA,MAAMC,iBAAAA,CAAAA,CAAkBC,MAAW,EAAEC,CAAM,EAAEC,GAAQ,EAAA;AACnD,YAAA,MAAM,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGJ,OAAOK,IAAI;AACzC,YAAA,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGJ,IAAAA;AACzB,YAAA,MAAMK,SAAAA,GAAYC,IAAAA,CAAKC,GAAG,CAACH,KAAAA,EAAO,CAAA,CAAA;YAClC,MAAMI,WAAAA,GAAcb,MAAAA,CAAOc,QAAQ,CAACR,WAAAA,CAAAA;YAEpC,MAAMN,MAAAA,CAAOe,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACZ,MAAMQ,WAAAA,EAAa;AACxDK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;YAEA,MAAME,cAAAA,GAAiB,MAAMpB,MAAAA,CAAOe,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACZ,IAAAA,EAAMQ,WAAAA,EAAa;AAC/EK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;AAEA,YAAA,MAAM,EAAEI,iBAAiB,EAAE,GAAGC,0DAAAA,CAC5BlB,IAAAA,CAAAA;AAEF,YAAA,MAAMmB,SAAAA,GAAYJ,cAAAA;AAClB,YAAA,MAAM,EAAEK,MAAM,EAAE,GAAGC,eAAe,GAAGF,SAAAA;AAErC,YAAA,MAAMG,QAAQ,MAAM3B,MAAAA,CAAO4B,SAAS,CAAEtB,WAAAA,CAAAA,CAAauB,KAAK,CAAC;AACvD,gBAAA,GAAGH,aAAa;AAChB,gBAAA,GAAIJ,sBAAsBQ,SAAAA,GAAY;AAAER,oBAAAA;AAAkB,iBAAA,GAAI,EAAE;AAChEG,gBAAAA,MAAAA,EAAQ,MAACA,IAAgD;AAC3D,aAAA,CAAA;AAEA,YAAA,MAAMM,QAAAA,GAAWtB,KAAAA,KAAU,EAAC,GAAIkB,QAAQnB,KAAAA,GAAQE,SAAAA;YAChD,MAAMsB,SAAAA,GAAYvB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKsB,IAAI,CAACN,KAAAA,GAAQjB,SAAAA,CAAAA;YAC/D,MAAMwB,IAAAA,GAAOzB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKwB,KAAK,CAAC3B,KAAAA,GAAQE,SAAAA,CAAAA,GAAa,CAAA;YAExE,OAAO;AAAEiB,gBAAAA,KAAAA;AAAOO,gBAAAA,IAAAA;AAAMH,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAU,aAAA;AAC5C,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -1,3 +1,5 @@
1
+ import { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args.mjs';
2
+
1
3
  var paginationResolvers = (({ strapi })=>({
2
4
  async resolvePagination (parent, _, ctx) {
3
5
  const { args, resourceUID } = parent.info;
@@ -10,7 +12,16 @@ var paginationResolvers = (({ strapi })=>({
10
12
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
11
13
  auth: ctx?.state?.auth
12
14
  });
13
- const total = await strapi.documents(resourceUID).count(sanitizedQuery);
15
+ const { publicationFilter } = mergePublicationFilterFromGraphQLArgs(args);
16
+ const sanitized = sanitizedQuery;
17
+ const { status, ...restSanitized } = sanitized;
18
+ const total = await strapi.documents(resourceUID).count({
19
+ ...restSanitized,
20
+ ...publicationFilter !== undefined ? {
21
+ publicationFilter
22
+ } : {},
23
+ status: status ?? 'published'
24
+ });
14
25
  const pageSize = limit === -1 ? total - start : safeLimit;
15
26
  const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);
16
27
  const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.mjs","sources":["../../../../../server/src/services/builders/resolvers/pagination.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n async resolvePagination(parent: any, _: any, ctx: any) {\n const { args, resourceUID } = parent.info;\n const { start, limit } = args;\n const safeLimit = Math.max(limit, 1);\n const contentType = strapi.getModel(resourceUID);\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const total = await strapi.documents!(resourceUID).count(sanitizedQuery);\n\n const pageSize = limit === -1 ? total - start : safeLimit;\n const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);\n const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;\n\n return { total, page, pageSize, pageCount };\n },\n});\n"],"names":["strapi","resolvePagination","parent","_","ctx","args","resourceUID","info","start","limit","safeLimit","Math","max","contentType","getModel","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","total","documents","count","pageSize","pageCount","ceil","page","floor"],"mappings":"AAEA,0BAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvC,QAAA,MAAMC,iBAAAA,CAAAA,CAAkBC,MAAW,EAAEC,CAAM,EAAEC,GAAQ,EAAA;AACnD,YAAA,MAAM,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGJ,OAAOK,IAAI;AACzC,YAAA,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGJ,IAAAA;AACzB,YAAA,MAAMK,SAAAA,GAAYC,IAAAA,CAAKC,GAAG,CAACH,KAAAA,EAAO,CAAA,CAAA;YAClC,MAAMI,WAAAA,GAAcb,MAAAA,CAAOc,QAAQ,CAACR,WAAAA,CAAAA;YAEpC,MAAMN,MAAAA,CAAOe,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACZ,MAAMQ,WAAAA,EAAa;AACxDK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;YAEA,MAAME,cAAAA,GAAiB,MAAMpB,MAAAA,CAAOe,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACZ,IAAAA,EAAMQ,WAAAA,EAAa;AAC/EK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;AAEA,YAAA,MAAMI,QAAQ,MAAMtB,MAAAA,CAAOuB,SAAS,CAAEjB,WAAAA,CAAAA,CAAakB,KAAK,CAACJ,cAAAA,CAAAA;AAEzD,YAAA,MAAMK,QAAAA,GAAWhB,KAAAA,KAAU,EAAC,GAAIa,QAAQd,KAAAA,GAAQE,SAAAA;YAChD,MAAMgB,SAAAA,GAAYjB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKgB,IAAI,CAACL,KAAAA,GAAQZ,SAAAA,CAAAA;YAC/D,MAAMkB,IAAAA,GAAOnB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKkB,KAAK,CAACrB,KAAAA,GAAQE,SAAAA,CAAAA,GAAa,CAAA;YAExE,OAAO;AAAEY,gBAAAA,KAAAA;AAAOM,gBAAAA,IAAAA;AAAMH,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAU,aAAA;AAC5C,QAAA;AACF,KAAA,CAAC;;;;"}
1
+ {"version":3,"file":"pagination.mjs","sources":["../../../../../server/src/services/builders/resolvers/pagination.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nimport { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args';\n\nexport default ({ strapi }: Context) => ({\n async resolvePagination(parent: any, _: any, ctx: any) {\n const { args, resourceUID } = parent.info;\n const { start, limit } = args;\n const safeLimit = Math.max(limit, 1);\n const contentType = strapi.getModel(resourceUID);\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const { publicationFilter } = mergePublicationFilterFromGraphQLArgs(\n args as Record<string, unknown>\n );\n const sanitized = sanitizedQuery as Record<string, unknown>;\n const { status, ...restSanitized } = sanitized;\n\n const total = await strapi.documents!(resourceUID).count({\n ...restSanitized,\n ...(publicationFilter !== undefined ? { publicationFilter } : {}),\n status: (status as 'draft' | 'published' | undefined) ?? 'published',\n });\n\n const pageSize = limit === -1 ? total - start : safeLimit;\n const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);\n const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;\n\n return { total, page, pageSize, pageCount };\n },\n});\n"],"names":["strapi","resolvePagination","parent","_","ctx","args","resourceUID","info","start","limit","safeLimit","Math","max","contentType","getModel","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","publicationFilter","mergePublicationFilterFromGraphQLArgs","sanitized","status","restSanitized","total","documents","count","undefined","pageSize","pageCount","ceil","page","floor"],"mappings":";;AAIA,0BAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvC,QAAA,MAAMC,iBAAAA,CAAAA,CAAkBC,MAAW,EAAEC,CAAM,EAAEC,GAAQ,EAAA;AACnD,YAAA,MAAM,EAAEC,IAAI,EAAEC,WAAW,EAAE,GAAGJ,OAAOK,IAAI;AACzC,YAAA,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGJ,IAAAA;AACzB,YAAA,MAAMK,SAAAA,GAAYC,IAAAA,CAAKC,GAAG,CAACH,KAAAA,EAAO,CAAA,CAAA;YAClC,MAAMI,WAAAA,GAAcb,MAAAA,CAAOc,QAAQ,CAACR,WAAAA,CAAAA;YAEpC,MAAMN,MAAAA,CAAOe,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACZ,MAAMQ,WAAAA,EAAa;AACxDK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;YAEA,MAAME,cAAAA,GAAiB,MAAMpB,MAAAA,CAAOe,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACZ,IAAAA,EAAMQ,WAAAA,EAAa;AAC/EK,gBAAAA,IAAAA,EAAMd,KAAKe,KAAAA,EAAOD;AACpB,aAAA,CAAA;AAEA,YAAA,MAAM,EAAEI,iBAAiB,EAAE,GAAGC,qCAAAA,CAC5BlB,IAAAA,CAAAA;AAEF,YAAA,MAAMmB,SAAAA,GAAYJ,cAAAA;AAClB,YAAA,MAAM,EAAEK,MAAM,EAAE,GAAGC,eAAe,GAAGF,SAAAA;AAErC,YAAA,MAAMG,QAAQ,MAAM3B,MAAAA,CAAO4B,SAAS,CAAEtB,WAAAA,CAAAA,CAAauB,KAAK,CAAC;AACvD,gBAAA,GAAGH,aAAa;AAChB,gBAAA,GAAIJ,sBAAsBQ,SAAAA,GAAY;AAAER,oBAAAA;AAAkB,iBAAA,GAAI,EAAE;AAChEG,gBAAAA,MAAAA,EAAQ,MAACA,IAAgD;AAC3D,aAAA,CAAA;AAEA,YAAA,MAAMM,QAAAA,GAAWtB,KAAAA,KAAU,EAAC,GAAIkB,QAAQnB,KAAAA,GAAQE,SAAAA;YAChD,MAAMsB,SAAAA,GAAYvB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKsB,IAAI,CAACN,KAAAA,GAAQjB,SAAAA,CAAAA;YAC/D,MAAMwB,IAAAA,GAAOzB,UAAU,EAAC,GAAIC,YAAYC,IAAAA,CAAKwB,KAAK,CAAC3B,KAAAA,GAAQE,SAAAA,CAAAA,GAAa,CAAA;YAExE,OAAO;AAAEiB,gBAAAA,KAAAA;AAAOO,gBAAAA,IAAAA;AAAMH,gBAAAA,QAAAA;AAAUC,gBAAAA;AAAU,aAAA;AAC5C,QAAA;AACF,KAAA,CAAC;;;;"}
@@ -1,7 +1,20 @@
1
1
  'use strict';
2
2
 
3
3
  var fp = require('lodash/fp');
4
+ var mergePublicationArgs = require('./merge-publication-args.js');
4
5
 
6
+ /** Merge sanitized query with resolver args so GraphQL-coerced publication args are not dropped. */ const mergeDocumentListParams = (sanitizedQuery, args)=>{
7
+ const { status, ...rest } = sanitizedQuery;
8
+ const merged = {
9
+ ...rest,
10
+ status: status ?? 'published'
11
+ };
12
+ const { publicationFilter } = mergePublicationArgs.mergePublicationFilterFromGraphQLArgs(args);
13
+ if (publicationFilter !== undefined) {
14
+ merged.publicationFilter = publicationFilter;
15
+ }
16
+ return merged;
17
+ };
5
18
  var queriesResolvers = (({ strapi })=>({
6
19
  buildQueriesResolvers ({ contentType }) {
7
20
  const { uid } = contentType;
@@ -13,10 +26,7 @@ var queriesResolvers = (({ strapi })=>({
13
26
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
14
27
  auth: ctx?.state?.auth
15
28
  });
16
- return strapi.documents(uid).findMany({
17
- status: 'published',
18
- ...sanitizedQuery
19
- });
29
+ return strapi.documents(uid).findMany(mergeDocumentListParams(sanitizedQuery, args));
20
30
  },
21
31
  async findFirst (parent, args, ctx) {
22
32
  await strapi.contentAPI.validate.query(args, contentType, {
@@ -25,10 +35,7 @@ var queriesResolvers = (({ strapi })=>({
25
35
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
26
36
  auth: ctx?.state?.auth
27
37
  });
28
- return strapi.documents(uid).findFirst({
29
- status: 'published',
30
- ...sanitizedQuery
31
- });
38
+ return strapi.documents(uid).findFirst(mergeDocumentListParams(sanitizedQuery, args));
32
39
  },
33
40
  async findOne (parent, args, ctx) {
34
41
  const { documentId } = args;
@@ -38,12 +45,12 @@ var queriesResolvers = (({ strapi })=>({
38
45
  const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
39
46
  auth: ctx?.state?.auth
40
47
  });
48
+ const merged = mergeDocumentListParams(fp.omit([
49
+ 'id',
50
+ 'documentId'
51
+ ], sanitizedQuery), args);
41
52
  return strapi.documents(uid).findOne({
42
- status: 'published',
43
- ...fp.omit([
44
- 'id',
45
- 'documentId'
46
- ], sanitizedQuery),
53
+ ...merged,
47
54
  documentId
48
55
  });
49
56
  }