@strapi/plugin-documentation 5.30.0 → 5.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/admin/index.js.map +1 -1
  2. package/dist/admin/index.mjs.map +1 -1
  3. package/dist/admin/pages/App.js.map +1 -1
  4. package/dist/admin/pages/App.mjs.map +1 -1
  5. package/dist/admin/services/api.js.map +1 -1
  6. package/dist/admin/services/api.mjs.map +1 -1
  7. package/dist/admin/src/services/api.d.ts +4 -4
  8. package/dist/admin/utils/getTrad.js.map +1 -1
  9. package/dist/admin/utils/getTrad.mjs.map +1 -1
  10. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
  11. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
  12. package/dist/server/controllers/documentation.js.map +1 -1
  13. package/dist/server/controllers/documentation.mjs.map +1 -1
  14. package/dist/server/middlewares/restrict-access.js.map +1 -1
  15. package/dist/server/middlewares/restrict-access.mjs.map +1 -1
  16. package/dist/server/services/documentation.js.map +1 -1
  17. package/dist/server/services/documentation.mjs.map +1 -1
  18. package/dist/server/services/helpers/build-api-endpoint-path.js.map +1 -1
  19. package/dist/server/services/helpers/build-api-endpoint-path.mjs.map +1 -1
  20. package/dist/server/services/helpers/build-component-schema.js.map +1 -1
  21. package/dist/server/services/helpers/build-component-schema.mjs.map +1 -1
  22. package/dist/server/services/helpers/utils/clean-schema-attributes.js.map +1 -1
  23. package/dist/server/services/helpers/utils/clean-schema-attributes.mjs.map +1 -1
  24. package/dist/server/services/helpers/utils/loop-content-type-names.js.map +1 -1
  25. package/dist/server/services/helpers/utils/loop-content-type-names.mjs.map +1 -1
  26. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Information } from '@strapi/icons';\n\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: async () => {\n const { App } = await import('./pages/App');\n return App;\n },\n position: 9,\n });\n\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: async () => {\n const { SettingsPage } = await import('./pages/Settings');\n return SettingsPage;\n },\n permissions: PERMISSIONS.main,\n });\n },\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":["register","app","addMenuLink","to","pluginId","icon","Information","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","App","position","registerPlugin","name","bootstrap","addSettingsLink","SettingsPage","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AACA,YAAe;AACbA,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;AACdC,YAAAA,EAAAA,EAAI,CAAC,QAAQ,EAAEC,iBAAAA,CAAS,CAAC;YACzBC,IAAMC,EAAAA,iBAAAA;YACNC,SAAW,EAAA;AACTC,gBAAAA,EAAAA,EAAI,CAAC,EAAEJ,iBAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,sBAAYC,IAAI;YAC7BC,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAM,oDAAO,gBAAA,KAAA;gBAC7B,OAAOA,GAAAA;AACT,aAAA;YACAC,QAAU,EAAA;AACZ,SAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAIe,cAAc,CAAC;YACjBR,EAAIJ,EAAAA,iBAAAA;YACJa,IAAMb,EAAAA;AACR,SAAA,CAAA;AACF,KAAA;AACAc,IAAAA,SAAAA,CAAAA,CAAUjB,GAAQ,EAAA;QAChBA,GAAIkB,CAAAA,eAAe,CAAC,QAAU,EAAA;YAC5BZ,SAAW,EAAA;AACTC,gBAAAA,EAAAA,EAAI,CAAC,EAAEJ,iBAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;YACAD,EAAI,EAAA,eAAA;YACJL,EAAIC,EAAAA,iBAAAA;YACJS,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEO,YAAY,EAAE,GAAG,MAAM,oDAAO,qBAAA,KAAA;gBACtC,OAAOA,YAAAA;AACT,aAAA;AACAV,YAAAA,WAAAA,EAAaC,sBAAYC;AAC3B,SAAA,CAAA;AACF,KAAA;IACA,MAAMS,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAQC,CAAAA,GAAG,CACrCH,OAAQI,CAAAA,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAO,CAAA,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,kDAAyBD,IAAM1B,EAAAA,iBAAAA,CAAAA;AACrCuB,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA;AACJ,SAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Information } from '@strapi/icons';\n\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: async () => {\n const { App } = await import('./pages/App');\n return App;\n },\n position: 9,\n });\n\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: async () => {\n const { SettingsPage } = await import('./pages/Settings');\n return SettingsPage;\n },\n permissions: PERMISSIONS.main,\n });\n },\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":["register","app","addMenuLink","to","pluginId","icon","Information","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","App","position","registerPlugin","name","bootstrap","addSettingsLink","SettingsPage","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AACA,YAAe;AACbA,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;YACdC,EAAI,EAAA,CAAC,QAAQ,EAAEC,iBAAU,CAAA,CAAA;YACzBC,IAAMC,EAAAA,iBAAAA;YACNC,SAAW,EAAA;gBACTC,EAAI,EAAA,CAAA,EAAGJ,iBAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,sBAAYC,IAAI;YAC7BC,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAM,oDAAO,gBAAA,KAAA;gBAC7B,OAAOA,GAAAA;AACT,aAAA;YACAC,QAAU,EAAA;AACZ,SAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAIe,cAAc,CAAC;YACjBR,EAAIJ,EAAAA,iBAAAA;YACJa,IAAMb,EAAAA;AACR,SAAA,CAAA;AACF,KAAA;AACAc,IAAAA,SAAAA,CAAAA,CAAUjB,GAAQ,EAAA;QAChBA,GAAIkB,CAAAA,eAAe,CAAC,QAAU,EAAA;YAC5BZ,SAAW,EAAA;gBACTC,EAAI,EAAA,CAAA,EAAGJ,iBAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;YACAD,EAAI,EAAA,eAAA;YACJL,EAAIC,EAAAA,iBAAAA;YACJS,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEO,YAAY,EAAE,GAAG,MAAM,oDAAO,qBAAA,KAAA;gBACtC,OAAOA,YAAAA;AACT,aAAA;AACAV,YAAAA,WAAAA,EAAaC,sBAAYC;AAC3B,SAAA,CAAA;AACF,KAAA;IACA,MAAMS,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAQC,CAAAA,GAAG,CACrCH,OAAQI,CAAAA,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAO,CAAA,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,kDAAyBD,IAAM1B,EAAAA,iBAAAA,CAAAA;AACrCuB,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA;AACJ,SAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Information } from '@strapi/icons';\n\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: async () => {\n const { App } = await import('./pages/App');\n return App;\n },\n position: 9,\n });\n\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: async () => {\n const { SettingsPage } = await import('./pages/Settings');\n return SettingsPage;\n },\n permissions: PERMISSIONS.main,\n });\n },\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":["register","app","addMenuLink","to","pluginId","icon","Information","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","App","position","registerPlugin","name","bootstrap","addSettingsLink","SettingsPage","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AACA,YAAe;AACbA,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;AACdC,YAAAA,EAAAA,EAAI,CAAC,QAAQ,EAAEC,QAAAA,CAAS,CAAC;YACzBC,IAAMC,EAAAA,WAAAA;YACNC,SAAW,EAAA;AACTC,gBAAAA,EAAAA,EAAI,CAAC,EAAEJ,QAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,YAAYC,IAAI;YAC7BC,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAM,OAAO,iBAAA,CAAA;gBAC7B,OAAOA,GAAAA;AACT,aAAA;YACAC,QAAU,EAAA;AACZ,SAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAIe,cAAc,CAAC;YACjBR,EAAIJ,EAAAA,QAAAA;YACJa,IAAMb,EAAAA;AACR,SAAA,CAAA;AACF,KAAA;AACAc,IAAAA,SAAAA,CAAAA,CAAUjB,GAAQ,EAAA;QAChBA,GAAIkB,CAAAA,eAAe,CAAC,QAAU,EAAA;YAC5BZ,SAAW,EAAA;AACTC,gBAAAA,EAAAA,EAAI,CAAC,EAAEJ,QAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;YACAD,EAAI,EAAA,eAAA;YACJL,EAAIC,EAAAA,QAAAA;YACJS,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEO,YAAY,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;gBACtC,OAAOA,YAAAA;AACT,aAAA;AACAV,YAAAA,WAAAA,EAAaC,YAAYC;AAC3B,SAAA,CAAA;AACF,KAAA;IACA,MAAMS,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAQC,CAAAA,GAAG,CACrCH,OAAQI,CAAAA,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAO,CAAA,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAM1B,EAAAA,QAAAA,CAAAA;AACrCuB,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA;AACJ,SAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB;AACF,CAAE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Information } from '@strapi/icons';\n\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n register(app: any) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: async () => {\n const { App } = await import('./pages/App');\n return App;\n },\n position: 9,\n });\n\n app.registerPlugin({\n id: pluginId,\n name: pluginId,\n });\n },\n bootstrap(app: any) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: async () => {\n const { SettingsPage } = await import('./pages/Settings');\n return SettingsPage;\n },\n permissions: PERMISSIONS.main,\n });\n },\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":["register","app","addMenuLink","to","pluginId","icon","Information","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","App","position","registerPlugin","name","bootstrap","addSettingsLink","SettingsPage","registerTrads","locales","importedTrads","Promise","all","map","locale","then","default","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AACA,YAAe;AACbA,IAAAA,QAAAA,CAAAA,CAASC,GAAQ,EAAA;AACfA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;YACdC,EAAI,EAAA,CAAC,QAAQ,EAAEC,QAAU,CAAA,CAAA;YACzBC,IAAMC,EAAAA,WAAAA;YACNC,SAAW,EAAA;gBACTC,EAAI,EAAA,CAAA,EAAGJ,QAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,YAAYC,IAAI;YAC7BC,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAM,OAAO,iBAAA,CAAA;gBAC7B,OAAOA,GAAAA;AACT,aAAA;YACAC,QAAU,EAAA;AACZ,SAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAIe,cAAc,CAAC;YACjBR,EAAIJ,EAAAA,QAAAA;YACJa,IAAMb,EAAAA;AACR,SAAA,CAAA;AACF,KAAA;AACAc,IAAAA,SAAAA,CAAAA,CAAUjB,GAAQ,EAAA;QAChBA,GAAIkB,CAAAA,eAAe,CAAC,QAAU,EAAA;YAC5BZ,SAAW,EAAA;gBACTC,EAAI,EAAA,CAAA,EAAGJ,QAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;YACAD,EAAI,EAAA,eAAA;YACJL,EAAIC,EAAAA,QAAAA;YACJS,SAAW,EAAA,UAAA;AACT,gBAAA,MAAM,EAAEO,YAAY,EAAE,GAAG,MAAM,OAAO,sBAAA,CAAA;gBACtC,OAAOA,YAAAA;AACT,aAAA;AACAV,YAAAA,WAAAA,EAAaC,YAAYC;AAC3B,SAAA,CAAA;AACF,KAAA;IACA,MAAMS,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAQC,CAAAA,GAAG,CACrCH,OAAQI,CAAAA,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAO,CAAA,KAAK,CAAC,CAAA,CAC1CC,IAAI,CAAC,CAAC,EAAEC,OAAAA,EAASC,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,yBAAyBD,IAAM1B,EAAAA,QAAAA,CAAAA;AACrCuB,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA,CACCK,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPH,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA;AACJ,SAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQS,OAAO,CAACV,aAAAA,CAAAA;AACzB;AACF,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"App.mjs","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":"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"}
1
+ {"version":3,"file":"App.mjs","sources":["../../../admin/src/pages/App.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport * as React from 'react';\n\nimport {\n LinkButton,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n Dialog,\n} from '@strapi/design-system';\nimport { Eye as Show, ArrowClockwise as Reload, Trash } from '@strapi/icons';\nimport {\n ConfirmDialog,\n useRBAC,\n Page,\n useAPIErrorHandler,\n useNotification,\n Layouts,\n} from '@strapi/strapi/admin';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetInfoQuery,\n useRegenerateDocMutation,\n useDeleteVersionMutation,\n} from '../services/api';\nimport { getTrad } from '../utils';\n\nconst App = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { data, isLoading: isLoadingInfo, isError } = useGetInfoQuery();\n const [regenerate] = useRegenerateDocMutation();\n const [deleteVersion] = useDeleteVersionMutation();\n const [showConfirmDelete, setShowConfirmDelete] = React.useState<boolean>(false);\n const [versionToDelete, setVersionToDelete] = React.useState<string>();\n const { allowedActions, isLoading: isLoadingRBAC } = useRBAC(PERMISSIONS);\n\n const isLoading = isLoadingInfo || isLoadingRBAC;\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version: string) => {\n regenerate({ version })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.generate.success'),\n defaultMessage: 'Successfully generated documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n if (!versionToDelete) {\n // nothing to delete\n return;\n }\n\n await deleteVersion({ version: versionToDelete })\n .unwrap()\n .then(() => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('notification.delete.success'),\n defaultMessage: 'Successfully deleted documentation',\n }),\n });\n })\n .catch((err) => {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(err),\n });\n });\n\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version: string) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{title}</Page.Title>\n <Page.Main>\n <Layouts.Header\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canRead || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <Layouts.Content>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .slice(0)\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n tag=\"a\"\n disabled={!allowedActions.canRead}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n variant=\"ghost\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Show />\n </IconButton>\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Reload />\n </IconButton>\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n variant=\"ghost\"\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n >\n <Trash />\n </IconButton>\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout content=\"\" icon={null} />\n )}\n </Layouts.Content>\n <Dialog.Root open={showConfirmDelete} onOpenChange={setShowConfirmDelete}>\n <ConfirmDialog onConfirm={handleConfirmDelete} />\n </Dialog.Root>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path: string) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport { App };\n"],"names":["App","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","data","isLoading","isLoadingInfo","isError","useGetInfoQuery","regenerate","useRegenerateDocMutation","deleteVersion","useDeleteVersionMutation","showConfirmDelete","setShowConfirmDelete","React","useState","versionToDelete","setVersionToDelete","allowedActions","isLoadingRBAC","useRBAC","PERMISSIONS","colCount","rowCount","docVersions","length","handleRegenerateDoc","version","unwrap","then","type","message","id","getTrad","defaultMessage","catch","err","handleConfirmDelete","handleClickDelete","title","_jsx","Page","Loading","Error","_jsxs","Layouts","Root","Title","Main","Header","subtitle","primaryAction","OpenDocLink","disabled","canRead","currentVersion","prefix","href","createDocumentationHref","startIcon","Show","Content","Table","Thead","Tr","Th","Typography","variant","textColor","Tbody","slice","sort","a","b","generatedDate","map","doc","Td","width","Flex","justifyContent","onClick","e","stopPropagation","IconButton","tag","target","rel","label","canRegenerate","Reload","canUpdate","Trash","EmptyStateLayout","content","icon","Dialog","open","onOpenChange","ConfirmDialog","onConfirm","styled","LinkButton","path","startsWith","window","strapi","backendURL"],"mappings":";;;;;;;;;;;AAqCA,MAAMA,GAAM,GAAA,IAAA;IACV,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,EAAAA;IAC3B,MAAM,EAAEC,IAAI,EAAEC,SAAAA,EAAWC,aAAa,EAAEC,OAAO,EAAE,GAAGC,eAAAA,EAAAA;IACpD,MAAM,CAACC,WAAW,GAAGC,wBAAAA,EAAAA;IACrB,MAAM,CAACC,cAAc,GAAGC,wBAAAA,EAAAA;AACxB,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAAU,KAAA,CAAA;AAC1E,IAAA,MAAM,CAACC,eAAAA,EAAiBC,kBAAmB,CAAA,GAAGH,MAAMC,QAAQ,EAAA;AAC5D,IAAA,MAAM,EAAEG,cAAc,EAAEd,WAAWe,aAAa,EAAE,GAAGC,OAAQC,CAAAA,WAAAA,CAAAA;AAE7D,IAAA,MAAMjB,YAAYC,aAAiBc,IAAAA,aAAAA;AAEnC,IAAA,MAAMG,QAAW,GAAA,CAAA;AACjB,IAAA,MAAMC,WAAW,CAACpB,MAAMqB,WAAaC,EAAAA,MAAAA,IAAU,CAAA,IAAK,CAAA;AAEpD,IAAA,MAAMC,sBAAsB,CAACC,OAAAA,GAAAA;QAC3BnB,UAAW,CAAA;AAAEmB,YAAAA;SACVC,CAAAA,CAAAA,MAAM,EACNC,CAAAA,IAAI,CAAC,IAAA;YACJ9B,kBAAmB,CAAA;gBACjB+B,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASlC,aAAc,CAAA;AACrBmC,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,+BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;SAEDC,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;YACNrC,kBAAmB,CAAA;gBACjB+B,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAAS9B,cAAemC,CAAAA,GAAAA;AAC1B,aAAA,CAAA;AACF,SAAA,CAAA;AACJ,KAAA;AAMA,IAAA,MAAMC,mBAAsB,GAAA,UAAA;AAC1B,QAAA,IAAI,CAACrB,eAAiB,EAAA;;AAEpB,YAAA;AACF;AAEA,QAAA,MAAMN,aAAc,CAAA;YAAEiB,OAASX,EAAAA;SAC5BY,CAAAA,CAAAA,MAAM,EACNC,CAAAA,IAAI,CAAC,IAAA;YACJ9B,kBAAmB,CAAA;gBACjB+B,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASlC,aAAc,CAAA;AACrBmC,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,6BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;SAEDC,CAAAA,CAAAA,KAAK,CAAC,CAACC,GAAAA,GAAAA;YACNrC,kBAAmB,CAAA;gBACjB+B,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAAS9B,cAAemC,CAAAA,GAAAA;AAC1B,aAAA,CAAA;AACF,SAAA,CAAA;AAEFvB,QAAAA,oBAAAA,CAAqB,CAACD,iBAAAA,CAAAA;AACxB,KAAA;AAEA,IAAA,MAAM0B,oBAAoB,CAACX,OAAAA,GAAAA;QACzBV,kBAAmBU,CAAAA,OAAAA,CAAAA;AACnBd,QAAAA,oBAAAA,CAAqB,CAACD,iBAAAA,CAAAA;AACxB,KAAA;AAEA,IAAA,MAAM2B,QAAQ1C,aAAc,CAAA;AAC1BmC,QAAAA,EAAAA,EAAIC,OAAQ,CAAA,aAAA,CAAA;QACZC,cAAgB,EAAA;AAClB,KAAA,CAAA;AAEA,IAAA,IAAI9B,SAAW,EAAA;QACb,qBAAOoC,GAAA,CAACC,KAAKC,OAAO,EAAA,EAAA,CAAA;AACtB;AAEA,IAAA,IAAIpC,OAAS,EAAA;QACX,qBAAOkC,GAAA,CAACC,KAAKE,KAAK,EAAA,EAAA,CAAA;AACpB;IAEA,qBACEC,IAAA,CAACC,QAAQC,IAAI,EAAA;;AACX,0BAAAN,GAAA,CAACC,KAAKM,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;AACb,0BAAAK,IAAA,CAACH,KAAKO,IAAI,EAAA;;AACR,kCAAAR,GAAA,CAACK,QAAQI,MAAM,EAAA;wBACbV,KAAOA,EAAAA,KAAAA;AACPW,wBAAAA,QAAAA,EAAUrD,aAAc,CAAA;AACtBmC,4BAAAA,EAAAA,EAAIC,OAAQ,CAAA,qCAAA,CAAA;4BACZC,cAAgB,EAAA;AAClB,yBAAA,CAAA;AACAiB,wBAAAA,aAAAA,gBACEX,GAACY,CAAAA,WAAAA,EAAAA;4BACCC,QAAU,EAAA,CAACnC,eAAeoC,OAAO,IAAI,CAACnD,IAAMoD,EAAAA,cAAAA,IAAkB,CAACpD,IAAMqD,EAAAA,MAAAA;AACrEC,4BAAAA,IAAAA,EAAMC,wBAAwB,CAAGvD,EAAAA,IAAAA,EAAMqD,OAAO,EAAE,EAAErD,MAAMoD,cAAgB,CAAA,CAAA,CAAA;AACxEI,4BAAAA,SAAAA,gBAAWnB,GAACoB,CAAAA,GAAAA,EAAAA,EAAAA,CAAAA;sCAEX/D,aAAc,CAAA;AACbmC,gCAAAA,EAAAA,EAAIC,OAAQ,CAAA,8BAAA,CAAA;gCACZC,cAAgB,EAAA;AAClB,6BAAA;;;AAIN,kCAAAM,GAAA,CAACK,QAAQgB,OAAO,EAAA;kCACb1D,IAAMqB,EAAAA,WAAAA,CAAYC,uBACjBmB,IAACkB,CAAAA,KAAAA,EAAAA;4BAAMxC,QAAUA,EAAAA,QAAAA;4BAAUC,QAAUA,EAAAA,QAAAA;;8CACnCiB,GAACuB,CAAAA,KAAAA,EAAAA;AACC,oCAAA,QAAA,gBAAAnB,IAACoB,CAAAA,EAAAA,EAAAA;;0DACCxB,GAACyB,CAAAA,EAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAzB,GAAC0B,CAAAA,UAAAA,EAAAA;oDAAWC,OAAQ,EAAA,OAAA;oDAAQC,SAAU,EAAA,YAAA;8DACnCvE,aAAc,CAAA;AACbmC,wDAAAA,EAAAA,EAAIC,OAAQ,CAAA,gCAAA,CAAA;wDACZC,cAAgB,EAAA;AAClB,qDAAA;;;0DAGJM,GAACyB,CAAAA,EAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAzB,GAAC0B,CAAAA,UAAAA,EAAAA;oDAAWC,OAAQ,EAAA,OAAA;oDAAQC,SAAU,EAAA,YAAA;8DACnCvE,aAAc,CAAA;AACbmC,wDAAAA,EAAAA,EAAIC,OAAQ,CAAA,kCAAA,CAAA;wDACZC,cAAgB,EAAA;AAClB,qDAAA;;;;;;8CAKRM,GAAC6B,CAAAA,KAAAA,EAAAA;8CACElE,IAAKqB,CAAAA,WAAW,CACd8C,KAAK,CAAC,GACNC,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAOD,GAAAA,CAAAA,CAAEE,aAAa,GAAGD,CAAAA,CAAEC,aAAa,GAAG,CAAI,GAAA,CAAC,GACzDC,GAAG,CAAC,CAACC,GAAAA,iBACJhC,IAACoB,CAAAA,EAAAA,EAAAA;;8DACCxB,GAACqC,CAAAA,EAAAA,EAAAA;oDAAGC,KAAM,EAAA,KAAA;AACR,oDAAA,QAAA,gBAAAtC,GAAC0B,CAAAA,UAAAA,EAAAA;AAAYU,wDAAAA,QAAAA,EAAAA,GAAAA,CAAIjD;;;8DAEnBa,GAACqC,CAAAA,EAAAA,EAAAA;oDAAGC,KAAM,EAAA,KAAA;AACR,oDAAA,QAAA,gBAAAtC,GAAC0B,CAAAA,UAAAA,EAAAA;AAAYU,wDAAAA,QAAAA,EAAAA,GAAAA,CAAIF;;;8DAEnBlC,GAACqC,CAAAA,EAAAA,EAAAA;AACC,oDAAA,QAAA,gBAAAjC,IAACmC,CAAAA,IAAAA,EAAAA;wDAAKC,cAAe,EAAA,KAAA;wDAAMC,OAAS,EAAA,CAACC,CAAMA,GAAAA,CAAAA,CAAEC,eAAe,EAAA;;0EAC1D3C,GAAC4C,CAAAA,UAAAA,EAAAA;gEACCC,GAAI,EAAA,GAAA;gEACJhC,QAAU,EAAA,CAACnC,eAAeoC,OAAO;gEACjCG,IAAMC,EAAAA,uBAAAA,CAAwB,GAAGvD,IAAKqD,CAAAA,MAAM,CAAC,EAAE,EAAEoB,GAAIjD,CAAAA,OAAO,CAAE,CAAA,CAAA;gEAC9DwC,OAAQ,EAAA,OAAA;gEACRmB,MAAO,EAAA,QAAA;gEACPC,GAAI,EAAA,qBAAA;AACJC,gEAAAA,KAAAA,EAAO3F,aACL,CAAA;AACEmC,oEAAAA,EAAAA,EAAIC,OAAQ,CAAA,kCAAA,CAAA;oEACZC,cAAgB,EAAA;iEAElB,EAAA;oEAAEoD,MAAQ,EAAA,CAAA,EAAGV,GAAIjD,CAAAA,OAAO,CAAE;AAAC,iEAAA,CAAA;AAG7B,gEAAA,QAAA,gBAAAa,GAACoB,CAAAA,GAAAA,EAAAA,EAAAA;;4DAEF1C,cAAeuE,CAAAA,aAAa,iBAC3BjD,GAAC4C,CAAAA,UAAAA,EAAAA;gEACCH,OAAS,EAAA,IAAMvD,mBAAoBkD,CAAAA,GAAAA,CAAIjD,OAAO,CAAA;gEAC9CwC,OAAQ,EAAA,OAAA;AACRqB,gEAAAA,KAAAA,EAAO3F,aACL,CAAA;AACEmC,oEAAAA,EAAAA,EAAIC,OAAQ,CAAA,wCAAA,CAAA;oEACZC,cAAgB,EAAA;iEAElB,EAAA;oEAAEoD,MAAQ,EAAA,CAAA,EAAGV,GAAIjD,CAAAA,OAAO,CAAE;AAAC,iEAAA,CAAA;AAG7B,gEAAA,QAAA,gBAAAa,GAACkD,CAAAA,cAAAA,EAAAA,EAAAA;AAED,6DAAA,CAAA,GAAA,IAAA;4DACHxE,cAAeyE,CAAAA,SAAS,IAAIf,GAAIjD,CAAAA,OAAO,KAAKxB,IAAKoD,CAAAA,cAAc,iBAC9Df,GAAC4C,CAAAA,UAAAA,EAAAA;gEACCH,OAAS,EAAA,IAAM3C,iBAAkBsC,CAAAA,GAAAA,CAAIjD,OAAO,CAAA;gEAC5CwC,OAAQ,EAAA,OAAA;AACRqB,gEAAAA,KAAAA,EAAO3F,aACL,CAAA;oEACEmC,EAAI,EAAA,sBAAA;oEACJE,cAAgB,EAAA;iEAElB,EAAA;oEAAEoD,MAAQ,EAAA,CAAA,EAAGV,GAAIjD,CAAAA,OAAO,CAAE;AAAC,iEAAA,CAAA;AAG7B,gEAAA,QAAA,gBAAAa,GAACoD,CAAAA,KAAAA,EAAAA,EAAAA;AAED,6DAAA,CAAA,GAAA;;;;;AAvDDhB,yCAAAA,EAAAA,GAAAA,CAAIjD,OAAO,CAAA;;;2CA+D5Ba,GAACqD,CAAAA,gBAAAA,EAAAA;4BAAiBC,OAAQ,EAAA,EAAA;4BAAGC,IAAM,EAAA;;;AAGvC,kCAAAvD,GAAA,CAACwD,OAAOlD,IAAI,EAAA;wBAACmD,IAAMrF,EAAAA,iBAAAA;wBAAmBsF,YAAcrF,EAAAA,oBAAAA;AAClD,wBAAA,QAAA,gBAAA2B,GAAC2D,CAAAA,aAAAA,EAAAA;4BAAcC,SAAW/D,EAAAA;;;;;;;AAKpC;AAEA;;AAEC,IACD,MAAMe,WAAAA,GAAciD,MAAOC,CAAAA,UAAAA,CAAW;;AAEtC,CAAC;AAED,MAAM5C,0BAA0B,CAAC6C,IAAAA,GAAAA;IAC/B,IAAIA,IAAAA,CAAKC,UAAU,CAAC,MAAS,CAAA,EAAA;QAC3B,OAAOD,IAAAA;AACT;IAEA,IAAIA,IAAAA,CAAKC,UAAU,CAAC,GAAM,CAAA,EAAA;AACxB,QAAA,OAAO,GAAGC,MAAOC,CAAAA,MAAM,CAACC,UAAU,GAAGJ,IAAM,CAAA,CAAA;AAC7C;IAEA,OAAO,CAAA,EAAGE,OAAOC,MAAM,CAACC,UAAU,CAAC,CAAC,EAAEJ,IAAM,CAAA,CAAA;AAC9C,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport { DocumentInfos } from '../types';\n\ntype SettingsInput = {\n restrictedAccess: boolean;\n password: string;\n};\n\nconst api = adminApi\n .enhanceEndpoints({\n addTagTypes: ['DocumentInfo'],\n })\n .injectEndpoints({\n endpoints: (builder) => {\n return {\n getInfo: builder.query<DocumentInfos, void>({\n query: () => '/documentation/getInfos',\n providesTags: ['DocumentInfo'],\n }),\n\n deleteVersion: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/deleteDoc/${version}`,\n method: 'DELETE',\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n updateSettings: builder.mutation<void, { body: SettingsInput }>({\n query: ({ body }) => ({\n url: `/documentation/updateSettings`,\n method: 'PUT',\n data: body,\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n regenerateDoc: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/regenerateDoc`,\n method: 'POST',\n data: { version },\n }),\n }),\n };\n },\n });\n\nexport const {\n useGetInfoQuery,\n useDeleteVersionMutation,\n useUpdateSettingsMutation,\n useRegenerateDocMutation,\n} = api;\n"],"names":["api","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","getInfo","query","providesTags","deleteVersion","mutation","version","url","method","invalidatesTags","updateSettings","body","data","regenerateDoc","useGetInfoQuery","useDeleteVersionMutation","useUpdateSettingsMutation","useRegenerateDocMutation"],"mappings":";;;;AASA,MAAMA,GAAAA,GAAMC,oBACTC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA;AAAe;AAC/B,CAAA,CAAA,CACCC,eAAe,CAAC;AACfC,IAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;QACV,OAAO;YACLC,OAASD,EAAAA,OAAAA,CAAQE,KAAK,CAAsB;AAC1CA,gBAAAA,KAAAA,EAAO,IAAM,yBAAA;gBACbC,YAAc,EAAA;AAAC,oBAAA;AAAe;AAChC,aAAA,CAAA;YAEAC,aAAeJ,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;AACvBC,wBAAAA,GAAAA,EAAK,CAAC,yBAAyB,EAAED,OAAAA,CAAQ,CAAC;wBAC1CE,MAAQ,EAAA;qBACV,CAAA;gBACAC,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAC,cAAgBV,EAAAA,OAAAA,CAAQK,QAAQ,CAAgC;AAC9DH,gBAAAA,KAAAA,EAAO,CAAC,EAAES,IAAI,EAAE,IAAM;wBACpBJ,GAAK,EAAA,CAAC,6BAA6B,CAAC;wBACpCC,MAAQ,EAAA,KAAA;wBACRI,IAAMD,EAAAA;qBACR,CAAA;gBACAF,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAI,aAAeb,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,4BAA4B,CAAC;wBACnCC,MAAQ,EAAA,MAAA;wBACRI,IAAM,EAAA;AAAEN,4BAAAA;AAAQ;qBAClB;AACF,aAAA;AACF,SAAA;AACF;AACF,CAAA,CAAA;AAEK,MAAM,EACXQ,eAAe,EACfC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACzB,GAAGvB;;;;;;;"}
1
+ {"version":3,"file":"api.js","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport { DocumentInfos } from '../types';\n\ntype SettingsInput = {\n restrictedAccess: boolean;\n password: string;\n};\n\nconst api = adminApi\n .enhanceEndpoints({\n addTagTypes: ['DocumentInfo'],\n })\n .injectEndpoints({\n endpoints: (builder) => {\n return {\n getInfo: builder.query<DocumentInfos, void>({\n query: () => '/documentation/getInfos',\n providesTags: ['DocumentInfo'],\n }),\n\n deleteVersion: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/deleteDoc/${version}`,\n method: 'DELETE',\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n updateSettings: builder.mutation<void, { body: SettingsInput }>({\n query: ({ body }) => ({\n url: `/documentation/updateSettings`,\n method: 'PUT',\n data: body,\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n regenerateDoc: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/regenerateDoc`,\n method: 'POST',\n data: { version },\n }),\n }),\n };\n },\n });\n\nexport const {\n useGetInfoQuery,\n useDeleteVersionMutation,\n useUpdateSettingsMutation,\n useRegenerateDocMutation,\n} = api;\n"],"names":["api","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","getInfo","query","providesTags","deleteVersion","mutation","version","url","method","invalidatesTags","updateSettings","body","data","regenerateDoc","useGetInfoQuery","useDeleteVersionMutation","useUpdateSettingsMutation","useRegenerateDocMutation"],"mappings":";;;;AASA,MAAMA,GAAAA,GAAMC,oBACTC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA;AAAe;AAC/B,CAAA,CAAA,CACCC,eAAe,CAAC;AACfC,IAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;QACV,OAAO;YACLC,OAASD,EAAAA,OAAAA,CAAQE,KAAK,CAAsB;AAC1CA,gBAAAA,KAAAA,EAAO,IAAM,yBAAA;gBACbC,YAAc,EAAA;AAAC,oBAAA;AAAe;AAChC,aAAA,CAAA;YAEAC,aAAeJ,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,yBAAyB,EAAED,OAAS,CAAA,CAAA;wBAC1CE,MAAQ,EAAA;qBACV,CAAA;gBACAC,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAC,cAAgBV,EAAAA,OAAAA,CAAQK,QAAQ,CAAgC;AAC9DH,gBAAAA,KAAAA,EAAO,CAAC,EAAES,IAAI,EAAE,IAAM;wBACpBJ,GAAK,EAAA,CAAC,6BAA6B,CAAC;wBACpCC,MAAQ,EAAA,KAAA;wBACRI,IAAMD,EAAAA;qBACR,CAAA;gBACAF,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAI,aAAeb,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,4BAA4B,CAAC;wBACnCC,MAAQ,EAAA,MAAA;wBACRI,IAAM,EAAA;AAAEN,4BAAAA;AAAQ;qBAClB;AACF,aAAA;AACF,SAAA;AACF;AACF,CAAA,CAAA;AAEK,MAAM,EACXQ,eAAe,EACfC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACzB,GAAGvB;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport { DocumentInfos } from '../types';\n\ntype SettingsInput = {\n restrictedAccess: boolean;\n password: string;\n};\n\nconst api = adminApi\n .enhanceEndpoints({\n addTagTypes: ['DocumentInfo'],\n })\n .injectEndpoints({\n endpoints: (builder) => {\n return {\n getInfo: builder.query<DocumentInfos, void>({\n query: () => '/documentation/getInfos',\n providesTags: ['DocumentInfo'],\n }),\n\n deleteVersion: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/deleteDoc/${version}`,\n method: 'DELETE',\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n updateSettings: builder.mutation<void, { body: SettingsInput }>({\n query: ({ body }) => ({\n url: `/documentation/updateSettings`,\n method: 'PUT',\n data: body,\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n regenerateDoc: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/regenerateDoc`,\n method: 'POST',\n data: { version },\n }),\n }),\n };\n },\n });\n\nexport const {\n useGetInfoQuery,\n useDeleteVersionMutation,\n useUpdateSettingsMutation,\n useRegenerateDocMutation,\n} = api;\n"],"names":["api","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","getInfo","query","providesTags","deleteVersion","mutation","version","url","method","invalidatesTags","updateSettings","body","data","regenerateDoc","useGetInfoQuery","useDeleteVersionMutation","useUpdateSettingsMutation","useRegenerateDocMutation"],"mappings":";;AASA,MAAMA,GAAAA,GAAMC,QACTC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA;AAAe;AAC/B,CAAA,CAAA,CACCC,eAAe,CAAC;AACfC,IAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;QACV,OAAO;YACLC,OAASD,EAAAA,OAAAA,CAAQE,KAAK,CAAsB;AAC1CA,gBAAAA,KAAAA,EAAO,IAAM,yBAAA;gBACbC,YAAc,EAAA;AAAC,oBAAA;AAAe;AAChC,aAAA,CAAA;YAEAC,aAAeJ,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;AACvBC,wBAAAA,GAAAA,EAAK,CAAC,yBAAyB,EAAED,OAAAA,CAAQ,CAAC;wBAC1CE,MAAQ,EAAA;qBACV,CAAA;gBACAC,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAC,cAAgBV,EAAAA,OAAAA,CAAQK,QAAQ,CAAgC;AAC9DH,gBAAAA,KAAAA,EAAO,CAAC,EAAES,IAAI,EAAE,IAAM;wBACpBJ,GAAK,EAAA,CAAC,6BAA6B,CAAC;wBACpCC,MAAQ,EAAA,KAAA;wBACRI,IAAMD,EAAAA;qBACR,CAAA;gBACAF,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAI,aAAeb,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,4BAA4B,CAAC;wBACnCC,MAAQ,EAAA,MAAA;wBACRI,IAAM,EAAA;AAAEN,4BAAAA;AAAQ;qBAClB;AACF,aAAA;AACF,SAAA;AACF;AACF,CAAA,CAAA;AAEK,MAAM,EACXQ,eAAe,EACfC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACzB,GAAGvB;;;;"}
1
+ {"version":3,"file":"api.mjs","sources":["../../../admin/src/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport { DocumentInfos } from '../types';\n\ntype SettingsInput = {\n restrictedAccess: boolean;\n password: string;\n};\n\nconst api = adminApi\n .enhanceEndpoints({\n addTagTypes: ['DocumentInfo'],\n })\n .injectEndpoints({\n endpoints: (builder) => {\n return {\n getInfo: builder.query<DocumentInfos, void>({\n query: () => '/documentation/getInfos',\n providesTags: ['DocumentInfo'],\n }),\n\n deleteVersion: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/deleteDoc/${version}`,\n method: 'DELETE',\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n updateSettings: builder.mutation<void, { body: SettingsInput }>({\n query: ({ body }) => ({\n url: `/documentation/updateSettings`,\n method: 'PUT',\n data: body,\n }),\n invalidatesTags: ['DocumentInfo'],\n }),\n\n regenerateDoc: builder.mutation<void, { version: string }>({\n query: ({ version }) => ({\n url: `/documentation/regenerateDoc`,\n method: 'POST',\n data: { version },\n }),\n }),\n };\n },\n });\n\nexport const {\n useGetInfoQuery,\n useDeleteVersionMutation,\n useUpdateSettingsMutation,\n useRegenerateDocMutation,\n} = api;\n"],"names":["api","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","getInfo","query","providesTags","deleteVersion","mutation","version","url","method","invalidatesTags","updateSettings","body","data","regenerateDoc","useGetInfoQuery","useDeleteVersionMutation","useUpdateSettingsMutation","useRegenerateDocMutation"],"mappings":";;AASA,MAAMA,GAAAA,GAAMC,QACTC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA;AAAe;AAC/B,CAAA,CAAA,CACCC,eAAe,CAAC;AACfC,IAAAA,SAAAA,EAAW,CAACC,OAAAA,GAAAA;QACV,OAAO;YACLC,OAASD,EAAAA,OAAAA,CAAQE,KAAK,CAAsB;AAC1CA,gBAAAA,KAAAA,EAAO,IAAM,yBAAA;gBACbC,YAAc,EAAA;AAAC,oBAAA;AAAe;AAChC,aAAA,CAAA;YAEAC,aAAeJ,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,yBAAyB,EAAED,OAAS,CAAA,CAAA;wBAC1CE,MAAQ,EAAA;qBACV,CAAA;gBACAC,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAC,cAAgBV,EAAAA,OAAAA,CAAQK,QAAQ,CAAgC;AAC9DH,gBAAAA,KAAAA,EAAO,CAAC,EAAES,IAAI,EAAE,IAAM;wBACpBJ,GAAK,EAAA,CAAC,6BAA6B,CAAC;wBACpCC,MAAQ,EAAA,KAAA;wBACRI,IAAMD,EAAAA;qBACR,CAAA;gBACAF,eAAiB,EAAA;AAAC,oBAAA;AAAe;AACnC,aAAA,CAAA;YAEAI,aAAeb,EAAAA,OAAAA,CAAQK,QAAQ,CAA4B;AACzDH,gBAAAA,KAAAA,EAAO,CAAC,EAAEI,OAAO,EAAE,IAAM;wBACvBC,GAAK,EAAA,CAAC,4BAA4B,CAAC;wBACnCC,MAAQ,EAAA,MAAA;wBACRI,IAAM,EAAA;AAAEN,4BAAAA;AAAQ;qBAClB;AACF,aAAA;AACF,SAAA;AACF;AACF,CAAA,CAAA;AAEK,MAAM,EACXQ,eAAe,EACfC,wBAAwB,EACxBC,yBAAyB,EACzBC,wBAAwB,EACzB,GAAGvB;;;;"}
@@ -3,11 +3,11 @@ type SettingsInput = {
3
3
  restrictedAccess: boolean;
4
4
  password: string;
5
5
  };
6
- export declare const useGetInfoQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "DocumentInfo", DocumentInfos, "adminApi">>, useDeleteVersionMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
6
+ export declare const useGetInfoQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "AIFeatureConfig" | "DocumentInfo", DocumentInfos, "adminApi">>, useDeleteVersionMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
7
7
  version: string;
8
- }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "DocumentInfo", void, "adminApi">>, useUpdateSettingsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
8
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "AIFeatureConfig" | "DocumentInfo", void, "adminApi">>, useUpdateSettingsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
9
9
  body: SettingsInput;
10
- }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "DocumentInfo", void, "adminApi">>, useRegenerateDocMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
10
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "AIFeatureConfig" | "DocumentInfo", void, "adminApi">>, useRegenerateDocMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
11
11
  version: string;
12
- }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "DocumentInfo", void, "adminApi">>;
12
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AIUsage" | "AIFeatureConfig" | "DocumentInfo", void, "adminApi">>;
13
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"getTrad.js","sources":["../../../admin/src/utils/getTrad.ts"],"sourcesContent":["import { pluginId } from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTrad","id","pluginId"],"mappings":";;;;AAEO,MAAMA,OAAU,GAAA,CAACC,EAAe,GAAA,CAAC,EAAEC,iBAAAA,CAAS,CAAC,EAAED,EAAG,CAAA;;;;"}
1
+ {"version":3,"file":"getTrad.js","sources":["../../../admin/src/utils/getTrad.ts"],"sourcesContent":["import { pluginId } from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTrad","id","pluginId"],"mappings":";;;;AAEO,MAAMA,UAAU,CAACC,EAAAA,GAAe,GAAGC,iBAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTrad.mjs","sources":["../../../admin/src/utils/getTrad.ts"],"sourcesContent":["import { pluginId } from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTrad","id","pluginId"],"mappings":";;AAEO,MAAMA,OAAU,GAAA,CAACC,EAAe,GAAA,CAAC,EAAEC,QAAAA,CAAS,CAAC,EAAED,EAAG,CAAA;;;;"}
1
+ {"version":3,"file":"getTrad.mjs","sources":["../../../admin/src/utils/getTrad.ts"],"sourcesContent":["import { pluginId } from '../pluginId';\n\nexport const getTrad = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTrad","id","pluginId"],"mappings":";;AAEO,MAAMA,UAAU,CAACC,EAAAA,GAAe,GAAGC,QAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"prefixPluginTranslations.js","sources":["../../../admin/src/utils/prefixPluginTranslations.ts"],"sourcesContent":["const prefixPluginTranslations = (trad: Record<string, string>, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce(\n (acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n },\n {} as Record<string, string>\n );\n};\n\nexport { prefixPluginTranslations };\n"],"names":["prefixPluginTranslations","trad","pluginId","Object","keys","reduce","acc","current"],"mappings":";;AAAMA,MAAAA,wBAAAA,GAA2B,CAACC,IAA8BC,EAAAA,QAAAA,GAAAA;AAK9D,IAAA,OAAOC,OAAOC,IAAI,CAACH,MAAMI,MAAM,CAC7B,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;AACJD,QAAAA,GAAG,CAAC,CAAC,EAAEJ,QAAAA,CAAS,CAAC,EAAEK,OAAQ,CAAA,CAAC,CAAC,GAAGN,IAAI,CAACM,OAAQ,CAAA;QAE7C,OAAOD,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;AAEL;;;;"}
1
+ {"version":3,"file":"prefixPluginTranslations.js","sources":["../../../admin/src/utils/prefixPluginTranslations.ts"],"sourcesContent":["const prefixPluginTranslations = (trad: Record<string, string>, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce(\n (acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n },\n {} as Record<string, string>\n );\n};\n\nexport { prefixPluginTranslations };\n"],"names":["prefixPluginTranslations","trad","pluginId","Object","keys","reduce","acc","current"],"mappings":";;AAAMA,MAAAA,wBAAAA,GAA2B,CAACC,IAA8BC,EAAAA,QAAAA,GAAAA;AAK9D,IAAA,OAAOC,OAAOC,IAAI,CAACH,MAAMI,MAAM,CAC7B,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;QACJD,GAAG,CAAC,CAAGJ,EAAAA,QAAAA,CAAS,CAAC,EAAEK,SAAS,CAAC,GAAGN,IAAI,CAACM,OAAQ,CAAA;QAE7C,OAAOD,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;AAEL;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"prefixPluginTranslations.mjs","sources":["../../../admin/src/utils/prefixPluginTranslations.ts"],"sourcesContent":["const prefixPluginTranslations = (trad: Record<string, string>, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce(\n (acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n },\n {} as Record<string, string>\n );\n};\n\nexport { prefixPluginTranslations };\n"],"names":["prefixPluginTranslations","trad","pluginId","Object","keys","reduce","acc","current"],"mappings":"AAAMA,MAAAA,wBAAAA,GAA2B,CAACC,IAA8BC,EAAAA,QAAAA,GAAAA;AAK9D,IAAA,OAAOC,OAAOC,IAAI,CAACH,MAAMI,MAAM,CAC7B,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;AACJD,QAAAA,GAAG,CAAC,CAAC,EAAEJ,QAAAA,CAAS,CAAC,EAAEK,OAAQ,CAAA,CAAC,CAAC,GAAGN,IAAI,CAACM,OAAQ,CAAA;QAE7C,OAAOD,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;AAEL;;;;"}
1
+ {"version":3,"file":"prefixPluginTranslations.mjs","sources":["../../../admin/src/utils/prefixPluginTranslations.ts"],"sourcesContent":["const prefixPluginTranslations = (trad: Record<string, string>, pluginId?: string) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce(\n (acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n },\n {} as Record<string, string>\n );\n};\n\nexport { prefixPluginTranslations };\n"],"names":["prefixPluginTranslations","trad","pluginId","Object","keys","reduce","acc","current"],"mappings":"AAAMA,MAAAA,wBAAAA,GAA2B,CAACC,IAA8BC,EAAAA,QAAAA,GAAAA;AAK9D,IAAA,OAAOC,OAAOC,IAAI,CAACH,MAAMI,MAAM,CAC7B,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;QACJD,GAAG,CAAC,CAAGJ,EAAAA,QAAAA,CAAS,CAAC,EAAEK,SAAS,CAAC,GAAGN,IAAI,CAACM,OAAQ,CAAA;QAE7C,OAAOD,GAAAA;AACT,KAAA,EACA,EAAC,CAAA;AAEL;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.js","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const openAPISpecsPath = path.join(\n strapi.dirs.app.extensions,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'index.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public'\n );\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","openAPISpecsPath","path","join","dirs","app","extensions","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","config","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
1
+ {"version":3,"file":"documentation.js","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const openAPISpecsPath = path.join(\n strapi.dirs.app.extensions,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'index.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public'\n );\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","openAPISpecsPath","path","join","dirs","app","extensions","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","config","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.mjs","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const openAPISpecsPath = path.join(\n strapi.dirs.app.extensions,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'index.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public'\n );\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","openAPISpecsPath","path","join","dirs","app","extensions","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","config","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
1
+ {"version":3,"file":"documentation.mjs","sources":["../../../server/src/controllers/documentation.ts"],"sourcesContent":["import path from 'path';\nimport bcrypt from 'bcryptjs';\nimport fs from 'fs-extra';\nimport _ from 'lodash';\nimport koaStatic from 'koa-static';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type Koa from 'koa';\nimport type {} from 'koa-body';\n\nimport { getService } from '../utils';\nimport type { Config } from '../types';\n\nconst validation = {\n validateSettings: validateYupSchema(\n yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup\n .string()\n .min(8)\n .matches(/[a-z]/, '${path} must contain at least one lowercase character')\n .matches(/[A-Z]/, '${path} must contain at least one uppercase character')\n .matches(/\\d/, '${path} must contain at least one number')\n .when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required('password is required') : initSchema;\n }),\n })\n ),\n};\n\nexport default {\n async getInfos(ctx: Koa.Context) {\n try {\n const docService = getService('documentation');\n const docVersions = docService.getDocumentationVersions();\n const documentationAccess = await docService.getDocumentationAccess();\n\n ctx.send({\n docVersions,\n currentVersion: docService.getDocumentationVersion(),\n prefix: '/documentation',\n documentationAccess,\n });\n } catch (err) {\n strapi.log.error(err);\n ctx.badRequest();\n }\n },\n\n async index(ctx: Koa.Context, next: Koa.Next) {\n try {\n /**\n * We don't expose the specs using koa-static or something else due to security reasons.\n * That's why, we need to read the file localy and send the specs through it when we serve the Swagger UI.\n */\n const { major, minor, patch } = ctx.params;\n const version =\n major && minor && patch\n ? `${major}.${minor}.${patch}`\n : getService('documentation').getDocumentationVersion();\n\n const openAPISpecsPath = path.join(\n strapi.dirs.app.extensions,\n 'documentation',\n 'documentation',\n version,\n 'full_documentation.json'\n );\n\n try {\n const documentation = fs.readFileSync(openAPISpecsPath, 'utf8');\n\n const layout = (await import('../public/index.html')).default;\n\n const filledLayout = _.template(layout)({\n backendUrl: strapi.config.server.url,\n spec: JSON.stringify(JSON.parse(documentation)),\n });\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'index.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, filledLayout);\n\n // Serve the file.\n ctx.url = path.basename(`${ctx.url}/index.html`);\n\n try {\n const staticFolder = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public'\n );\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async loginView(ctx: Koa.Context, next: Koa.Next) {\n // lazy require cheerio\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cheerio = require('cheerio');\n\n const { error } = ctx.query;\n\n try {\n const layout = (await import('../public/login.html')).default;\n\n const filledLayout = _.template(layout.toString())({\n actionUrl: `${strapi.config.server.url}/documentation/login`,\n });\n\n const $ = cheerio.load(filledLayout);\n\n $('.error').text(_.isEmpty(error) ? '' : 'Wrong password...');\n\n try {\n const layoutPath = path.resolve(\n strapi.dirs.app.extensions,\n 'documentation',\n 'public',\n 'login.html'\n );\n await fs.ensureFile(layoutPath);\n await fs.writeFile(layoutPath, $.html());\n\n ctx.url = path.basename(`${ctx.url}/login.html`);\n\n try {\n const staticFolder = path.resolve(strapi.dirs.app.extensions, 'documentation', 'public');\n return koaStatic(staticFolder)(ctx, next);\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n } catch (e) {\n strapi.log.error(e);\n }\n },\n\n async login(ctx: Koa.Context) {\n const {\n body: { password },\n } = ctx.request;\n\n const { password: hash } = (await strapi\n .store({ type: 'plugin', name: 'documentation', key: 'config' })\n .get()) as { password: string };\n\n const isValid = await bcrypt.compare(password, hash);\n\n let querystring = '?error=password';\n\n if (isValid && ctx.session) {\n ctx.session.documentation = {\n logged: true,\n };\n\n querystring = '';\n }\n\n ctx.redirect(`${strapi.config.server.url}/documentation${querystring}`);\n },\n\n async regenerateDoc(ctx: Koa.Context) {\n const { version } = ctx.request.body;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to generate does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.generateFullDoc(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async deleteDoc(ctx: Koa.Context) {\n const { version } = ctx.params;\n\n const service = getService('documentation');\n\n const documentationVersions = service.getDocumentationVersions().map((el) => el.version);\n\n if (_.isEmpty(version)) {\n return ctx.badRequest('Please provide a version.');\n }\n\n if (!documentationVersions.includes(version)) {\n return ctx.badRequest('The version you are trying to delete does not exist.');\n }\n\n try {\n strapi.reload.isWatching = false;\n await service.deleteDocumentation(version);\n ctx.send({ ok: true });\n } finally {\n strapi.reload.isWatching = true;\n }\n },\n\n async updateSettings(ctx: Koa.Context) {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const data = await validation.validateSettings(ctx.request.body);\n\n const config: Config = {\n restrictedAccess: Boolean(data.restrictedAccess),\n };\n\n if (data.password) {\n config.password = await bcrypt.hash(data.password, 10);\n }\n\n await pluginStore.set({ key: 'config', value: config });\n\n return ctx.send({ ok: true });\n },\n};\n"],"names":["validation","validateSettings","validateYupSchema","yup","object","shape","restrictedAccess","boolean","password","string","min","matches","when","value","initSchema","required","getInfos","ctx","docService","getService","docVersions","getDocumentationVersions","documentationAccess","getDocumentationAccess","send","currentVersion","getDocumentationVersion","prefix","err","strapi","log","error","badRequest","index","next","major","minor","patch","params","version","openAPISpecsPath","path","join","dirs","app","extensions","documentation","fs","readFileSync","layout","default","filledLayout","_","template","backendUrl","config","server","url","spec","JSON","stringify","parse","layoutPath","resolve","ensureFile","writeFile","basename","staticFolder","koaStatic","e","loginView","cheerio","require","query","toString","actionUrl","$","load","text","isEmpty","html","login","body","request","hash","store","type","name","key","get","isValid","bcrypt","compare","querystring","session","logged","redirect","regenerateDoc","service","documentationVersions","map","el","includes","reload","isWatching","generateFullDoc","ok","deleteDoc","deleteDocumentation","updateSettings","pluginStore","data","Boolean","set"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"restrict-access.js","sources":["../../../server/src/middlewares/restrict-access.ts"],"sourcesContent":["import type Koa from 'koa';\nimport type {} from 'koa-session';\n\nimport type { Config } from '../types';\n\nexport default async (ctx: Koa.Context, next: Koa.Next) => {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const config = (await pluginStore.get({ key: 'config' })) as Config;\n\n if (!config.restrictedAccess) {\n return next();\n }\n\n if (!ctx.session || !ctx.session.documentation || !ctx.session.documentation.logged) {\n const querystring = ctx.querystring ? `?${ctx.querystring}` : '';\n\n return ctx.redirect(`${strapi.config.server.url}/documentation/login${querystring}`);\n }\n\n // Execute the action.\n return next();\n};\n"],"names":["ctx","next","pluginStore","strapi","store","type","name","config","get","key","restrictedAccess","session","documentation","logged","querystring","redirect","server","url"],"mappings":";;AAKA,qBAAe,CAAA,OAAOA,GAAkBC,EAAAA,IAAAA,GAAAA;IACtC,MAAMC,WAAAA,GAAcC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA;AAAgB,KAAA,CAAA;AAEzE,IAAA,MAAMC,MAAU,GAAA,MAAML,WAAYM,CAAAA,GAAG,CAAC;QAAEC,GAAK,EAAA;AAAS,KAAA,CAAA;IAEtD,IAAI,CAACF,MAAOG,CAAAA,gBAAgB,EAAE;QAC5B,OAAOT,IAAAA,EAAAA;AACT;AAEA,IAAA,IAAI,CAACD,GAAIW,CAAAA,OAAO,IAAI,CAACX,IAAIW,OAAO,CAACC,aAAa,IAAI,CAACZ,GAAIW,CAAAA,OAAO,CAACC,aAAa,CAACC,MAAM,EAAE;QACnF,MAAMC,WAAAA,GAAcd,GAAIc,CAAAA,WAAW,GAAG,CAAC,CAAC,EAAEd,GAAIc,CAAAA,WAAW,CAAC,CAAC,GAAG,EAAA;AAE9D,QAAA,OAAOd,GAAIe,CAAAA,QAAQ,CAAC,CAAC,EAAEZ,MAAOI,CAAAA,MAAM,CAACS,MAAM,CAACC,GAAG,CAAC,oBAAoB,EAAEH,YAAY,CAAC,CAAA;AACrF;;IAGA,OAAOb,IAAAA,EAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"restrict-access.js","sources":["../../../server/src/middlewares/restrict-access.ts"],"sourcesContent":["import type Koa from 'koa';\nimport type {} from 'koa-session';\n\nimport type { Config } from '../types';\n\nexport default async (ctx: Koa.Context, next: Koa.Next) => {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const config = (await pluginStore.get({ key: 'config' })) as Config;\n\n if (!config.restrictedAccess) {\n return next();\n }\n\n if (!ctx.session || !ctx.session.documentation || !ctx.session.documentation.logged) {\n const querystring = ctx.querystring ? `?${ctx.querystring}` : '';\n\n return ctx.redirect(`${strapi.config.server.url}/documentation/login${querystring}`);\n }\n\n // Execute the action.\n return next();\n};\n"],"names":["ctx","next","pluginStore","strapi","store","type","name","config","get","key","restrictedAccess","session","documentation","logged","querystring","redirect","server","url"],"mappings":";;AAKA,qBAAe,CAAA,OAAOA,GAAkBC,EAAAA,IAAAA,GAAAA;IACtC,MAAMC,WAAAA,GAAcC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA;AAAgB,KAAA,CAAA;AAEzE,IAAA,MAAMC,MAAU,GAAA,MAAML,WAAYM,CAAAA,GAAG,CAAC;QAAEC,GAAK,EAAA;AAAS,KAAA,CAAA;IAEtD,IAAI,CAACF,MAAOG,CAAAA,gBAAgB,EAAE;QAC5B,OAAOT,IAAAA,EAAAA;AACT;AAEA,IAAA,IAAI,CAACD,GAAIW,CAAAA,OAAO,IAAI,CAACX,IAAIW,OAAO,CAACC,aAAa,IAAI,CAACZ,GAAIW,CAAAA,OAAO,CAACC,aAAa,CAACC,MAAM,EAAE;QACnF,MAAMC,WAAAA,GAAcd,GAAIc,CAAAA,WAAW,GAAG,CAAC,CAAC,EAAEd,GAAAA,CAAIc,WAAW,CAAA,CAAE,GAAG,EAAA;AAE9D,QAAA,OAAOd,GAAIe,CAAAA,QAAQ,CAAC,CAAA,EAAGZ,MAAOI,CAAAA,MAAM,CAACS,MAAM,CAACC,GAAG,CAAC,oBAAoB,EAAEH,WAAa,CAAA,CAAA,CAAA;AACrF;;IAGA,OAAOb,IAAAA,EAAAA;AACT,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"restrict-access.mjs","sources":["../../../server/src/middlewares/restrict-access.ts"],"sourcesContent":["import type Koa from 'koa';\nimport type {} from 'koa-session';\n\nimport type { Config } from '../types';\n\nexport default async (ctx: Koa.Context, next: Koa.Next) => {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const config = (await pluginStore.get({ key: 'config' })) as Config;\n\n if (!config.restrictedAccess) {\n return next();\n }\n\n if (!ctx.session || !ctx.session.documentation || !ctx.session.documentation.logged) {\n const querystring = ctx.querystring ? `?${ctx.querystring}` : '';\n\n return ctx.redirect(`${strapi.config.server.url}/documentation/login${querystring}`);\n }\n\n // Execute the action.\n return next();\n};\n"],"names":["ctx","next","pluginStore","strapi","store","type","name","config","get","key","restrictedAccess","session","documentation","logged","querystring","redirect","server","url"],"mappings":"AAKA,qBAAe,CAAA,OAAOA,GAAkBC,EAAAA,IAAAA,GAAAA;IACtC,MAAMC,WAAAA,GAAcC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA;AAAgB,KAAA,CAAA;AAEzE,IAAA,MAAMC,MAAU,GAAA,MAAML,WAAYM,CAAAA,GAAG,CAAC;QAAEC,GAAK,EAAA;AAAS,KAAA,CAAA;IAEtD,IAAI,CAACF,MAAOG,CAAAA,gBAAgB,EAAE;QAC5B,OAAOT,IAAAA,EAAAA;AACT;AAEA,IAAA,IAAI,CAACD,GAAIW,CAAAA,OAAO,IAAI,CAACX,IAAIW,OAAO,CAACC,aAAa,IAAI,CAACZ,GAAIW,CAAAA,OAAO,CAACC,aAAa,CAACC,MAAM,EAAE;QACnF,MAAMC,WAAAA,GAAcd,GAAIc,CAAAA,WAAW,GAAG,CAAC,CAAC,EAAEd,GAAIc,CAAAA,WAAW,CAAC,CAAC,GAAG,EAAA;AAE9D,QAAA,OAAOd,GAAIe,CAAAA,QAAQ,CAAC,CAAC,EAAEZ,MAAOI,CAAAA,MAAM,CAACS,MAAM,CAACC,GAAG,CAAC,oBAAoB,EAAEH,YAAY,CAAC,CAAA;AACrF;;IAGA,OAAOb,IAAAA,EAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"restrict-access.mjs","sources":["../../../server/src/middlewares/restrict-access.ts"],"sourcesContent":["import type Koa from 'koa';\nimport type {} from 'koa-session';\n\nimport type { Config } from '../types';\n\nexport default async (ctx: Koa.Context, next: Koa.Next) => {\n const pluginStore = strapi.store({ type: 'plugin', name: 'documentation' });\n\n const config = (await pluginStore.get({ key: 'config' })) as Config;\n\n if (!config.restrictedAccess) {\n return next();\n }\n\n if (!ctx.session || !ctx.session.documentation || !ctx.session.documentation.logged) {\n const querystring = ctx.querystring ? `?${ctx.querystring}` : '';\n\n return ctx.redirect(`${strapi.config.server.url}/documentation/login${querystring}`);\n }\n\n // Execute the action.\n return next();\n};\n"],"names":["ctx","next","pluginStore","strapi","store","type","name","config","get","key","restrictedAccess","session","documentation","logged","querystring","redirect","server","url"],"mappings":"AAKA,qBAAe,CAAA,OAAOA,GAAkBC,EAAAA,IAAAA,GAAAA;IACtC,MAAMC,WAAAA,GAAcC,MAAOC,CAAAA,KAAK,CAAC;QAAEC,IAAM,EAAA,QAAA;QAAUC,IAAM,EAAA;AAAgB,KAAA,CAAA;AAEzE,IAAA,MAAMC,MAAU,GAAA,MAAML,WAAYM,CAAAA,GAAG,CAAC;QAAEC,GAAK,EAAA;AAAS,KAAA,CAAA;IAEtD,IAAI,CAACF,MAAOG,CAAAA,gBAAgB,EAAE;QAC5B,OAAOT,IAAAA,EAAAA;AACT;AAEA,IAAA,IAAI,CAACD,GAAIW,CAAAA,OAAO,IAAI,CAACX,IAAIW,OAAO,CAACC,aAAa,IAAI,CAACZ,GAAIW,CAAAA,OAAO,CAACC,aAAa,CAACC,MAAM,EAAE;QACnF,MAAMC,WAAAA,GAAcd,GAAIc,CAAAA,WAAW,GAAG,CAAC,CAAC,EAAEd,GAAAA,CAAIc,WAAW,CAAA,CAAE,GAAG,EAAA;AAE9D,QAAA,OAAOd,GAAIe,CAAAA,QAAQ,CAAC,CAAA,EAAGZ,MAAOI,CAAAA,MAAM,CAACS,MAAM,CAACC,GAAG,CAAC,oBAAoB,EAAEH,WAAa,CAAA,CAAA,CAAA;AACrF;;IAGA,OAAOb,IAAAA,EAAAA;AACT,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.js","sources":["../../../server/src/services/documentation.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport { produce } from 'immer';\nimport type { Core } from '@strapi/types';\n\nimport { builApiEndpointPath, buildComponentSchema } from './helpers';\nimport { getPluginsThatNeedDocumentation } from './utils/get-plugins-that-need-documentation';\nimport { getService } from '../utils';\n\nimport type { Config, PluginConfig } from '../types';\n\nexport type Version = {\n version: string;\n generatedDate: string;\n url: string;\n};\n\nexport type DocumentationService = ReturnType<typeof createService>;\n\nconst createService = ({ strapi }: { strapi: Core.Strapi }) => {\n const config = strapi.config.get('plugin::documentation') as PluginConfig;\n const pluginsThatNeedDocumentation = getPluginsThatNeedDocumentation(config);\n const overrideService = getService('override');\n\n return {\n getDocumentationVersion() {\n return config.info.version;\n },\n\n getFullDocumentationPath() {\n return path.join(strapi.dirs.app.extensions, 'documentation', 'documentation');\n },\n\n getDocumentationVersions(): Version[] {\n return fs\n .readdirSync(this.getFullDocumentationPath())\n .map((version) => {\n try {\n const filePath = path.resolve(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n\n const doc = JSON.parse(fs.readFileSync(filePath).toString());\n\n const generatedDate = doc.info['x-generation-date'];\n\n return { version, generatedDate, url: '' };\n } catch (err) {\n return null;\n }\n })\n .filter((x) => x) as Version[];\n },\n\n /**\n * Returns settings stored in core-store\n */\n async getDocumentationAccess() {\n const { restrictedAccess } = (await strapi.store!({\n environment: '',\n type: 'plugin',\n name: 'documentation',\n key: 'config',\n }).get()) as Config;\n\n return { restrictedAccess };\n },\n\n getApiDocumentationPath(api: { name: string; getter: string }) {\n if (api.getter === 'plugin') {\n return path.join(strapi.dirs.app.extensions, api.name, 'documentation');\n }\n\n return path.join(strapi.dirs.app.api, api.name, 'documentation');\n },\n\n async deleteDocumentation(version: string) {\n const apis = this.getPluginAndApiInfo();\n for (const api of apis) {\n await fs.remove(path.join(this.getApiDocumentationPath(api), version));\n }\n\n await fs.remove(path.join(this.getFullDocumentationPath(), version));\n },\n\n getPluginAndApiInfo() {\n const pluginsToDocument = pluginsThatNeedDocumentation.map((plugin) => {\n return {\n name: plugin,\n getter: 'plugin',\n ctNames: Object.keys(strapi.plugin(plugin).contentTypes),\n };\n });\n\n const apisToDocument = Object.keys(strapi.apis).map((api) => {\n return {\n name: api,\n getter: 'api',\n ctNames: Object.keys(strapi.api(api).contentTypes),\n };\n });\n\n return [...apisToDocument, ...pluginsToDocument];\n },\n\n /**\n * @description - Creates the Swagger json files\n */\n async generateFullDoc(versionOpt?: string) {\n const version = versionOpt ?? this.getDocumentationVersion();\n\n const apis = this.getPluginAndApiInfo();\n const apisThatNeedGeneratedDocumentation = apis.filter(\n ({ name }) => !overrideService.isEnabled(name)\n );\n\n // Initialize the generated documentation with defaults\n const generatedDocumentation = await produce(config, async (draft) => {\n if (draft.servers?.length === 0) {\n // When no servers found set the defaults\n const serverUrl = strapi.config.get('server.absoluteUrl');\n const apiPath = strapi.config.get('api.rest.prefix');\n draft.servers = [\n {\n url: `${serverUrl}${apiPath}`,\n description: 'Development server',\n },\n ];\n }\n\n if (!draft.components) {\n draft.components = {};\n }\n\n // Set the generated date\n draft.info['x-generation-date'] = new Date().toISOString();\n // Set the plugins that need documentation\n draft['x-strapi-config'].plugins = pluginsThatNeedDocumentation;\n\n // Delete the mutateDocumentation key from the config so it doesn't end up in the spec\n delete draft['x-strapi-config'].mutateDocumentation;\n\n // Generate the documentation for each api and update the generatedDocumentation\n for (const api of apisThatNeedGeneratedDocumentation) {\n const newApiPath = builApiEndpointPath(api);\n const generatedSchemas = buildComponentSchema(api);\n\n if (generatedSchemas) {\n draft.components.schemas = { ...draft.components.schemas, ...generatedSchemas };\n }\n\n if (newApiPath) {\n draft.paths = { ...draft.paths, ...newApiPath };\n }\n }\n\n // When overrides are present update the generatedDocumentation\n if (overrideService.registeredOverrides.length > 0) {\n overrideService.registeredOverrides.forEach((override: Partial<PluginConfig>) => {\n // Only run the overrrides when no override version is provided,\n // or when the generated documentation version matches the override version\n if (!override?.info?.version || override.info.version === version) {\n if (override.tags) {\n // Merge override tags with the generated tags\n draft.tags = draft.tags || [];\n draft.tags.push(...override.tags);\n }\n\n if (override.paths) {\n // Merge override paths with the generated paths\n // The override will add a new path or replace the value of an existing path\n draft.paths = { ...draft.paths, ...override.paths };\n }\n\n if (override.components) {\n const keys = Object.keys(override.components) as Array<\n keyof typeof override.components\n >;\n\n keys.forEach((overrideKey) => {\n draft.components = draft.components || {};\n\n const overrideValue = override.components?.[overrideKey];\n const originalValue = draft.components?.[overrideKey];\n\n Object.assign(draft.components, {\n [overrideKey]: {\n ...originalValue,\n ...overrideValue,\n },\n });\n });\n }\n }\n });\n }\n });\n\n // Escape hatch, allow the user to provide a mutateDocumentation function that can alter any part of\n // the generated documentation before it is written to the file system\n const userMutatesDocumentation = config['x-strapi-config'].mutateDocumentation;\n\n const finalDocumentation = userMutatesDocumentation\n ? produce(generatedDocumentation, userMutatesDocumentation)\n : generatedDocumentation;\n\n // Get the file path for the final documentation\n const fullDocJsonPath = path.join(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n // Write the documentation to the file system\n await fs.ensureFile(fullDocJsonPath);\n await fs.writeJson(fullDocJsonPath, finalDocumentation, { spaces: 2 });\n },\n };\n};\n\nexport default createService;\n"],"names":["createService","strapi","config","get","pluginsThatNeedDocumentation","getPluginsThatNeedDocumentation","overrideService","getService","getDocumentationVersion","info","version","getFullDocumentationPath","path","join","dirs","app","extensions","getDocumentationVersions","fs","readdirSync","map","filePath","resolve","doc","JSON","parse","readFileSync","toString","generatedDate","url","err","filter","x","getDocumentationAccess","restrictedAccess","store","environment","type","name","key","getApiDocumentationPath","api","getter","deleteDocumentation","apis","getPluginAndApiInfo","remove","pluginsToDocument","plugin","ctNames","Object","keys","contentTypes","apisToDocument","generateFullDoc","versionOpt","apisThatNeedGeneratedDocumentation","isEnabled","generatedDocumentation","produce","draft","servers","length","serverUrl","apiPath","description","components","Date","toISOString","plugins","mutateDocumentation","newApiPath","builApiEndpointPath","generatedSchemas","buildComponentSchema","schemas","paths","registeredOverrides","forEach","override","tags","push","overrideKey","overrideValue","originalValue","assign","userMutatesDocumentation","finalDocumentation","fullDocJsonPath","ensureFile","writeJson","spaces"],"mappings":"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"}
1
+ {"version":3,"file":"documentation.js","sources":["../../../server/src/services/documentation.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport { produce } from 'immer';\nimport type { Core } from '@strapi/types';\n\nimport { builApiEndpointPath, buildComponentSchema } from './helpers';\nimport { getPluginsThatNeedDocumentation } from './utils/get-plugins-that-need-documentation';\nimport { getService } from '../utils';\n\nimport type { Config, PluginConfig } from '../types';\n\nexport type Version = {\n version: string;\n generatedDate: string;\n url: string;\n};\n\nexport type DocumentationService = ReturnType<typeof createService>;\n\nconst createService = ({ strapi }: { strapi: Core.Strapi }) => {\n const config = strapi.config.get('plugin::documentation') as PluginConfig;\n const pluginsThatNeedDocumentation = getPluginsThatNeedDocumentation(config);\n const overrideService = getService('override');\n\n return {\n getDocumentationVersion() {\n return config.info.version;\n },\n\n getFullDocumentationPath() {\n return path.join(strapi.dirs.app.extensions, 'documentation', 'documentation');\n },\n\n getDocumentationVersions(): Version[] {\n return fs\n .readdirSync(this.getFullDocumentationPath())\n .map((version) => {\n try {\n const filePath = path.resolve(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n\n const doc = JSON.parse(fs.readFileSync(filePath).toString());\n\n const generatedDate = doc.info['x-generation-date'];\n\n return { version, generatedDate, url: '' };\n } catch (err) {\n return null;\n }\n })\n .filter((x) => x) as Version[];\n },\n\n /**\n * Returns settings stored in core-store\n */\n async getDocumentationAccess() {\n const { restrictedAccess } = (await strapi.store!({\n environment: '',\n type: 'plugin',\n name: 'documentation',\n key: 'config',\n }).get()) as Config;\n\n return { restrictedAccess };\n },\n\n getApiDocumentationPath(api: { name: string; getter: string }) {\n if (api.getter === 'plugin') {\n return path.join(strapi.dirs.app.extensions, api.name, 'documentation');\n }\n\n return path.join(strapi.dirs.app.api, api.name, 'documentation');\n },\n\n async deleteDocumentation(version: string) {\n const apis = this.getPluginAndApiInfo();\n for (const api of apis) {\n await fs.remove(path.join(this.getApiDocumentationPath(api), version));\n }\n\n await fs.remove(path.join(this.getFullDocumentationPath(), version));\n },\n\n getPluginAndApiInfo() {\n const pluginsToDocument = pluginsThatNeedDocumentation.map((plugin) => {\n return {\n name: plugin,\n getter: 'plugin',\n ctNames: Object.keys(strapi.plugin(plugin).contentTypes),\n };\n });\n\n const apisToDocument = Object.keys(strapi.apis).map((api) => {\n return {\n name: api,\n getter: 'api',\n ctNames: Object.keys(strapi.api(api).contentTypes),\n };\n });\n\n return [...apisToDocument, ...pluginsToDocument];\n },\n\n /**\n * @description - Creates the Swagger json files\n */\n async generateFullDoc(versionOpt?: string) {\n const version = versionOpt ?? this.getDocumentationVersion();\n\n const apis = this.getPluginAndApiInfo();\n const apisThatNeedGeneratedDocumentation = apis.filter(\n ({ name }) => !overrideService.isEnabled(name)\n );\n\n // Initialize the generated documentation with defaults\n const generatedDocumentation = await produce(config, async (draft) => {\n if (draft.servers?.length === 0) {\n // When no servers found set the defaults\n const serverUrl = strapi.config.get('server.absoluteUrl');\n const apiPath = strapi.config.get('api.rest.prefix');\n draft.servers = [\n {\n url: `${serverUrl}${apiPath}`,\n description: 'Development server',\n },\n ];\n }\n\n if (!draft.components) {\n draft.components = {};\n }\n\n // Set the generated date\n draft.info['x-generation-date'] = new Date().toISOString();\n // Set the plugins that need documentation\n draft['x-strapi-config'].plugins = pluginsThatNeedDocumentation;\n\n // Delete the mutateDocumentation key from the config so it doesn't end up in the spec\n delete draft['x-strapi-config'].mutateDocumentation;\n\n // Generate the documentation for each api and update the generatedDocumentation\n for (const api of apisThatNeedGeneratedDocumentation) {\n const newApiPath = builApiEndpointPath(api);\n const generatedSchemas = buildComponentSchema(api);\n\n if (generatedSchemas) {\n draft.components.schemas = { ...draft.components.schemas, ...generatedSchemas };\n }\n\n if (newApiPath) {\n draft.paths = { ...draft.paths, ...newApiPath };\n }\n }\n\n // When overrides are present update the generatedDocumentation\n if (overrideService.registeredOverrides.length > 0) {\n overrideService.registeredOverrides.forEach((override: Partial<PluginConfig>) => {\n // Only run the overrrides when no override version is provided,\n // or when the generated documentation version matches the override version\n if (!override?.info?.version || override.info.version === version) {\n if (override.tags) {\n // Merge override tags with the generated tags\n draft.tags = draft.tags || [];\n draft.tags.push(...override.tags);\n }\n\n if (override.paths) {\n // Merge override paths with the generated paths\n // The override will add a new path or replace the value of an existing path\n draft.paths = { ...draft.paths, ...override.paths };\n }\n\n if (override.components) {\n const keys = Object.keys(override.components) as Array<\n keyof typeof override.components\n >;\n\n keys.forEach((overrideKey) => {\n draft.components = draft.components || {};\n\n const overrideValue = override.components?.[overrideKey];\n const originalValue = draft.components?.[overrideKey];\n\n Object.assign(draft.components, {\n [overrideKey]: {\n ...originalValue,\n ...overrideValue,\n },\n });\n });\n }\n }\n });\n }\n });\n\n // Escape hatch, allow the user to provide a mutateDocumentation function that can alter any part of\n // the generated documentation before it is written to the file system\n const userMutatesDocumentation = config['x-strapi-config'].mutateDocumentation;\n\n const finalDocumentation = userMutatesDocumentation\n ? produce(generatedDocumentation, userMutatesDocumentation)\n : generatedDocumentation;\n\n // Get the file path for the final documentation\n const fullDocJsonPath = path.join(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n // Write the documentation to the file system\n await fs.ensureFile(fullDocJsonPath);\n await fs.writeJson(fullDocJsonPath, finalDocumentation, { spaces: 2 });\n },\n };\n};\n\nexport default createService;\n"],"names":["createService","strapi","config","get","pluginsThatNeedDocumentation","getPluginsThatNeedDocumentation","overrideService","getService","getDocumentationVersion","info","version","getFullDocumentationPath","path","join","dirs","app","extensions","getDocumentationVersions","fs","readdirSync","map","filePath","resolve","doc","JSON","parse","readFileSync","toString","generatedDate","url","err","filter","x","getDocumentationAccess","restrictedAccess","store","environment","type","name","key","getApiDocumentationPath","api","getter","deleteDocumentation","apis","getPluginAndApiInfo","remove","pluginsToDocument","plugin","ctNames","Object","keys","contentTypes","apisToDocument","generateFullDoc","versionOpt","apisThatNeedGeneratedDocumentation","isEnabled","generatedDocumentation","produce","draft","servers","length","serverUrl","apiPath","description","components","Date","toISOString","plugins","mutateDocumentation","newApiPath","builApiEndpointPath","generatedSchemas","buildComponentSchema","schemas","paths","registeredOverrides","forEach","override","tags","push","overrideKey","overrideValue","originalValue","assign","userMutatesDocumentation","finalDocumentation","fullDocJsonPath","ensureFile","writeJson","spaces"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.mjs","sources":["../../../server/src/services/documentation.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport { produce } from 'immer';\nimport type { Core } from '@strapi/types';\n\nimport { builApiEndpointPath, buildComponentSchema } from './helpers';\nimport { getPluginsThatNeedDocumentation } from './utils/get-plugins-that-need-documentation';\nimport { getService } from '../utils';\n\nimport type { Config, PluginConfig } from '../types';\n\nexport type Version = {\n version: string;\n generatedDate: string;\n url: string;\n};\n\nexport type DocumentationService = ReturnType<typeof createService>;\n\nconst createService = ({ strapi }: { strapi: Core.Strapi }) => {\n const config = strapi.config.get('plugin::documentation') as PluginConfig;\n const pluginsThatNeedDocumentation = getPluginsThatNeedDocumentation(config);\n const overrideService = getService('override');\n\n return {\n getDocumentationVersion() {\n return config.info.version;\n },\n\n getFullDocumentationPath() {\n return path.join(strapi.dirs.app.extensions, 'documentation', 'documentation');\n },\n\n getDocumentationVersions(): Version[] {\n return fs\n .readdirSync(this.getFullDocumentationPath())\n .map((version) => {\n try {\n const filePath = path.resolve(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n\n const doc = JSON.parse(fs.readFileSync(filePath).toString());\n\n const generatedDate = doc.info['x-generation-date'];\n\n return { version, generatedDate, url: '' };\n } catch (err) {\n return null;\n }\n })\n .filter((x) => x) as Version[];\n },\n\n /**\n * Returns settings stored in core-store\n */\n async getDocumentationAccess() {\n const { restrictedAccess } = (await strapi.store!({\n environment: '',\n type: 'plugin',\n name: 'documentation',\n key: 'config',\n }).get()) as Config;\n\n return { restrictedAccess };\n },\n\n getApiDocumentationPath(api: { name: string; getter: string }) {\n if (api.getter === 'plugin') {\n return path.join(strapi.dirs.app.extensions, api.name, 'documentation');\n }\n\n return path.join(strapi.dirs.app.api, api.name, 'documentation');\n },\n\n async deleteDocumentation(version: string) {\n const apis = this.getPluginAndApiInfo();\n for (const api of apis) {\n await fs.remove(path.join(this.getApiDocumentationPath(api), version));\n }\n\n await fs.remove(path.join(this.getFullDocumentationPath(), version));\n },\n\n getPluginAndApiInfo() {\n const pluginsToDocument = pluginsThatNeedDocumentation.map((plugin) => {\n return {\n name: plugin,\n getter: 'plugin',\n ctNames: Object.keys(strapi.plugin(plugin).contentTypes),\n };\n });\n\n const apisToDocument = Object.keys(strapi.apis).map((api) => {\n return {\n name: api,\n getter: 'api',\n ctNames: Object.keys(strapi.api(api).contentTypes),\n };\n });\n\n return [...apisToDocument, ...pluginsToDocument];\n },\n\n /**\n * @description - Creates the Swagger json files\n */\n async generateFullDoc(versionOpt?: string) {\n const version = versionOpt ?? this.getDocumentationVersion();\n\n const apis = this.getPluginAndApiInfo();\n const apisThatNeedGeneratedDocumentation = apis.filter(\n ({ name }) => !overrideService.isEnabled(name)\n );\n\n // Initialize the generated documentation with defaults\n const generatedDocumentation = await produce(config, async (draft) => {\n if (draft.servers?.length === 0) {\n // When no servers found set the defaults\n const serverUrl = strapi.config.get('server.absoluteUrl');\n const apiPath = strapi.config.get('api.rest.prefix');\n draft.servers = [\n {\n url: `${serverUrl}${apiPath}`,\n description: 'Development server',\n },\n ];\n }\n\n if (!draft.components) {\n draft.components = {};\n }\n\n // Set the generated date\n draft.info['x-generation-date'] = new Date().toISOString();\n // Set the plugins that need documentation\n draft['x-strapi-config'].plugins = pluginsThatNeedDocumentation;\n\n // Delete the mutateDocumentation key from the config so it doesn't end up in the spec\n delete draft['x-strapi-config'].mutateDocumentation;\n\n // Generate the documentation for each api and update the generatedDocumentation\n for (const api of apisThatNeedGeneratedDocumentation) {\n const newApiPath = builApiEndpointPath(api);\n const generatedSchemas = buildComponentSchema(api);\n\n if (generatedSchemas) {\n draft.components.schemas = { ...draft.components.schemas, ...generatedSchemas };\n }\n\n if (newApiPath) {\n draft.paths = { ...draft.paths, ...newApiPath };\n }\n }\n\n // When overrides are present update the generatedDocumentation\n if (overrideService.registeredOverrides.length > 0) {\n overrideService.registeredOverrides.forEach((override: Partial<PluginConfig>) => {\n // Only run the overrrides when no override version is provided,\n // or when the generated documentation version matches the override version\n if (!override?.info?.version || override.info.version === version) {\n if (override.tags) {\n // Merge override tags with the generated tags\n draft.tags = draft.tags || [];\n draft.tags.push(...override.tags);\n }\n\n if (override.paths) {\n // Merge override paths with the generated paths\n // The override will add a new path or replace the value of an existing path\n draft.paths = { ...draft.paths, ...override.paths };\n }\n\n if (override.components) {\n const keys = Object.keys(override.components) as Array<\n keyof typeof override.components\n >;\n\n keys.forEach((overrideKey) => {\n draft.components = draft.components || {};\n\n const overrideValue = override.components?.[overrideKey];\n const originalValue = draft.components?.[overrideKey];\n\n Object.assign(draft.components, {\n [overrideKey]: {\n ...originalValue,\n ...overrideValue,\n },\n });\n });\n }\n }\n });\n }\n });\n\n // Escape hatch, allow the user to provide a mutateDocumentation function that can alter any part of\n // the generated documentation before it is written to the file system\n const userMutatesDocumentation = config['x-strapi-config'].mutateDocumentation;\n\n const finalDocumentation = userMutatesDocumentation\n ? produce(generatedDocumentation, userMutatesDocumentation)\n : generatedDocumentation;\n\n // Get the file path for the final documentation\n const fullDocJsonPath = path.join(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n // Write the documentation to the file system\n await fs.ensureFile(fullDocJsonPath);\n await fs.writeJson(fullDocJsonPath, finalDocumentation, { spaces: 2 });\n },\n };\n};\n\nexport default createService;\n"],"names":["createService","strapi","config","get","pluginsThatNeedDocumentation","getPluginsThatNeedDocumentation","overrideService","getService","getDocumentationVersion","info","version","getFullDocumentationPath","path","join","dirs","app","extensions","getDocumentationVersions","fs","readdirSync","map","filePath","resolve","doc","JSON","parse","readFileSync","toString","generatedDate","url","err","filter","x","getDocumentationAccess","restrictedAccess","store","environment","type","name","key","getApiDocumentationPath","api","getter","deleteDocumentation","apis","getPluginAndApiInfo","remove","pluginsToDocument","plugin","ctNames","Object","keys","contentTypes","apisToDocument","generateFullDoc","versionOpt","apisThatNeedGeneratedDocumentation","isEnabled","generatedDocumentation","produce","draft","servers","length","serverUrl","apiPath","description","components","Date","toISOString","plugins","mutateDocumentation","newApiPath","builApiEndpointPath","generatedSchemas","buildComponentSchema","schemas","paths","registeredOverrides","forEach","override","tags","push","overrideKey","overrideValue","originalValue","assign","userMutatesDocumentation","finalDocumentation","fullDocJsonPath","ensureFile","writeJson","spaces"],"mappings":"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"}
1
+ {"version":3,"file":"documentation.mjs","sources":["../../../server/src/services/documentation.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs-extra';\nimport { produce } from 'immer';\nimport type { Core } from '@strapi/types';\n\nimport { builApiEndpointPath, buildComponentSchema } from './helpers';\nimport { getPluginsThatNeedDocumentation } from './utils/get-plugins-that-need-documentation';\nimport { getService } from '../utils';\n\nimport type { Config, PluginConfig } from '../types';\n\nexport type Version = {\n version: string;\n generatedDate: string;\n url: string;\n};\n\nexport type DocumentationService = ReturnType<typeof createService>;\n\nconst createService = ({ strapi }: { strapi: Core.Strapi }) => {\n const config = strapi.config.get('plugin::documentation') as PluginConfig;\n const pluginsThatNeedDocumentation = getPluginsThatNeedDocumentation(config);\n const overrideService = getService('override');\n\n return {\n getDocumentationVersion() {\n return config.info.version;\n },\n\n getFullDocumentationPath() {\n return path.join(strapi.dirs.app.extensions, 'documentation', 'documentation');\n },\n\n getDocumentationVersions(): Version[] {\n return fs\n .readdirSync(this.getFullDocumentationPath())\n .map((version) => {\n try {\n const filePath = path.resolve(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n\n const doc = JSON.parse(fs.readFileSync(filePath).toString());\n\n const generatedDate = doc.info['x-generation-date'];\n\n return { version, generatedDate, url: '' };\n } catch (err) {\n return null;\n }\n })\n .filter((x) => x) as Version[];\n },\n\n /**\n * Returns settings stored in core-store\n */\n async getDocumentationAccess() {\n const { restrictedAccess } = (await strapi.store!({\n environment: '',\n type: 'plugin',\n name: 'documentation',\n key: 'config',\n }).get()) as Config;\n\n return { restrictedAccess };\n },\n\n getApiDocumentationPath(api: { name: string; getter: string }) {\n if (api.getter === 'plugin') {\n return path.join(strapi.dirs.app.extensions, api.name, 'documentation');\n }\n\n return path.join(strapi.dirs.app.api, api.name, 'documentation');\n },\n\n async deleteDocumentation(version: string) {\n const apis = this.getPluginAndApiInfo();\n for (const api of apis) {\n await fs.remove(path.join(this.getApiDocumentationPath(api), version));\n }\n\n await fs.remove(path.join(this.getFullDocumentationPath(), version));\n },\n\n getPluginAndApiInfo() {\n const pluginsToDocument = pluginsThatNeedDocumentation.map((plugin) => {\n return {\n name: plugin,\n getter: 'plugin',\n ctNames: Object.keys(strapi.plugin(plugin).contentTypes),\n };\n });\n\n const apisToDocument = Object.keys(strapi.apis).map((api) => {\n return {\n name: api,\n getter: 'api',\n ctNames: Object.keys(strapi.api(api).contentTypes),\n };\n });\n\n return [...apisToDocument, ...pluginsToDocument];\n },\n\n /**\n * @description - Creates the Swagger json files\n */\n async generateFullDoc(versionOpt?: string) {\n const version = versionOpt ?? this.getDocumentationVersion();\n\n const apis = this.getPluginAndApiInfo();\n const apisThatNeedGeneratedDocumentation = apis.filter(\n ({ name }) => !overrideService.isEnabled(name)\n );\n\n // Initialize the generated documentation with defaults\n const generatedDocumentation = await produce(config, async (draft) => {\n if (draft.servers?.length === 0) {\n // When no servers found set the defaults\n const serverUrl = strapi.config.get('server.absoluteUrl');\n const apiPath = strapi.config.get('api.rest.prefix');\n draft.servers = [\n {\n url: `${serverUrl}${apiPath}`,\n description: 'Development server',\n },\n ];\n }\n\n if (!draft.components) {\n draft.components = {};\n }\n\n // Set the generated date\n draft.info['x-generation-date'] = new Date().toISOString();\n // Set the plugins that need documentation\n draft['x-strapi-config'].plugins = pluginsThatNeedDocumentation;\n\n // Delete the mutateDocumentation key from the config so it doesn't end up in the spec\n delete draft['x-strapi-config'].mutateDocumentation;\n\n // Generate the documentation for each api and update the generatedDocumentation\n for (const api of apisThatNeedGeneratedDocumentation) {\n const newApiPath = builApiEndpointPath(api);\n const generatedSchemas = buildComponentSchema(api);\n\n if (generatedSchemas) {\n draft.components.schemas = { ...draft.components.schemas, ...generatedSchemas };\n }\n\n if (newApiPath) {\n draft.paths = { ...draft.paths, ...newApiPath };\n }\n }\n\n // When overrides are present update the generatedDocumentation\n if (overrideService.registeredOverrides.length > 0) {\n overrideService.registeredOverrides.forEach((override: Partial<PluginConfig>) => {\n // Only run the overrrides when no override version is provided,\n // or when the generated documentation version matches the override version\n if (!override?.info?.version || override.info.version === version) {\n if (override.tags) {\n // Merge override tags with the generated tags\n draft.tags = draft.tags || [];\n draft.tags.push(...override.tags);\n }\n\n if (override.paths) {\n // Merge override paths with the generated paths\n // The override will add a new path or replace the value of an existing path\n draft.paths = { ...draft.paths, ...override.paths };\n }\n\n if (override.components) {\n const keys = Object.keys(override.components) as Array<\n keyof typeof override.components\n >;\n\n keys.forEach((overrideKey) => {\n draft.components = draft.components || {};\n\n const overrideValue = override.components?.[overrideKey];\n const originalValue = draft.components?.[overrideKey];\n\n Object.assign(draft.components, {\n [overrideKey]: {\n ...originalValue,\n ...overrideValue,\n },\n });\n });\n }\n }\n });\n }\n });\n\n // Escape hatch, allow the user to provide a mutateDocumentation function that can alter any part of\n // the generated documentation before it is written to the file system\n const userMutatesDocumentation = config['x-strapi-config'].mutateDocumentation;\n\n const finalDocumentation = userMutatesDocumentation\n ? produce(generatedDocumentation, userMutatesDocumentation)\n : generatedDocumentation;\n\n // Get the file path for the final documentation\n const fullDocJsonPath = path.join(\n this.getFullDocumentationPath(),\n version,\n 'full_documentation.json'\n );\n // Write the documentation to the file system\n await fs.ensureFile(fullDocJsonPath);\n await fs.writeJson(fullDocJsonPath, finalDocumentation, { spaces: 2 });\n },\n };\n};\n\nexport default createService;\n"],"names":["createService","strapi","config","get","pluginsThatNeedDocumentation","getPluginsThatNeedDocumentation","overrideService","getService","getDocumentationVersion","info","version","getFullDocumentationPath","path","join","dirs","app","extensions","getDocumentationVersions","fs","readdirSync","map","filePath","resolve","doc","JSON","parse","readFileSync","toString","generatedDate","url","err","filter","x","getDocumentationAccess","restrictedAccess","store","environment","type","name","key","getApiDocumentationPath","api","getter","deleteDocumentation","apis","getPluginAndApiInfo","remove","pluginsToDocument","plugin","ctNames","Object","keys","contentTypes","apisToDocument","generateFullDoc","versionOpt","apisThatNeedGeneratedDocumentation","isEnabled","generatedDocumentation","produce","draft","servers","length","serverUrl","apiPath","description","components","Date","toISOString","plugins","mutateDocumentation","newApiPath","builApiEndpointPath","generatedSchemas","buildComponentSchema","schemas","paths","registeredOverrides","forEach","override","tags","push","overrideKey","overrideValue","originalValue","assign","userMutatesDocumentation","finalDocumentation","fullDocJsonPath","ensureFile","writeJson","spaces"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-api-endpoint-path.js","sources":["../../../../server/src/services/helpers/build-api-endpoint-path.ts"],"sourcesContent":["import _ from 'lodash';\nimport * as pathToRegexp from 'path-to-regexp';\n\nimport type { Core } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport pascalCase from './utils/pascal-case';\nimport queryParams from './utils/query-params';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport getApiResponses from './utils/get-api-responses';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\n/**\n * @description Parses a route with ':variable'\n *\n * @param {string} routePath - The route's path property\n * @returns {string}\n */\nconst parsePathWithVariables = (routePath: string): string => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens\n .map((token) => {\n switch (token.type) {\n case 'text':\n return token.value;\n case 'param':\n return `{${token.name}}`;\n case 'wildcard':\n return `{${token.name}}`;\n case 'group':\n // Handle group tokens by mapping them within the same function context\n return `(${parsePathWithVariables(token.tokens.map((t) => t satisfies pathToRegexp.Token).join(''))})`;\n default:\n throw new Error(`Unknown token type: ${(token as any).type}`);\n }\n })\n .join('');\n};\n\n/**\n * @description Builds the required object for a path parameter\n *\n * @param {string} routePath - The route's path property\n *\n * @returns {object } Swagger path params object\n */\nconst getPathParams = (routePath: string): OpenAPIV3.ParameterObject[] => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens.reduce((acc, param) => {\n // Skip non-parameter tokens\n if (param.type !== 'param') {\n return acc;\n }\n\n acc.push({\n name: `${param.name}`,\n in: 'path',\n description: '',\n deprecated: false,\n required: true,\n schema: { type: 'number' },\n });\n\n return acc;\n }, [] as OpenAPIV3.ParameterObject[]);\n};\n\nconst getPathWithPrefix = (prefix: string | undefined, route: Core.Route) => {\n // When the prefix is set on the routes and\n // the current route is not trying to remove it\n if (prefix && !_.has(route.config, 'prefix')) {\n // Add the prefix to the path\n return prefix.concat(route.path);\n }\n\n // Otherwise just return path\n return route.path;\n};\n\n/**\n * @description Gets all paths based on routes\n *\n * @param {object} apiInfo\n * @property {object} apiInfo.routeInfo - The api routes object\n * @property {string} apiInfo.uniqueName - Content type name | Api name + Content type name\n * @property {object} apiInfo.contentTypeInfo - The info object found on content type schemas\n *\n * @returns {object}\n */\nconst getPaths = ({ routeInfo, uniqueName, contentTypeInfo, kind }: ApiInfo) => {\n // Get the routes for the current content type\n const contentTypeRoutes = routeInfo.routes.filter((route) => {\n return (\n route.path.includes(contentTypeInfo.pluralName) ||\n route.path.includes(contentTypeInfo.singularName)\n );\n });\n\n const paths = contentTypeRoutes.reduce((acc: any, route: Core.Route) => {\n // TODO: Find a more reliable way to determine list of entities vs a single entity\n const isListOfEntities = hasFindMethod(route.handler);\n const methodVerb = route.method.toLowerCase();\n const hasPathParams = route.path.includes('/:');\n const pathWithPrefix = getPathWithPrefix(routeInfo.prefix, route);\n const routePath = hasPathParams ? parsePathWithVariables(pathWithPrefix) : pathWithPrefix;\n\n const responses = getApiResponses({\n uniqueName,\n route,\n isListOfEntities: kind !== 'singleType' && isListOfEntities,\n });\n\n const swaggerConfig: OpenAPIV3.OperationObject = {\n responses,\n tags: [_.upperFirst(uniqueName)],\n parameters: [],\n operationId: `${methodVerb}${routePath}`,\n };\n\n if (isListOfEntities) {\n swaggerConfig.parameters?.push(...queryParams);\n }\n\n if (hasPathParams) {\n const pathParams = getPathParams(route.path);\n swaggerConfig.parameters?.push(...pathParams);\n }\n\n if (['post', 'put'].includes(methodVerb)) {\n const refName = 'Request';\n const requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: `#/components/schemas/${pascalCase(uniqueName)}${refName}`,\n },\n },\n },\n };\n\n swaggerConfig.requestBody = requestBody;\n }\n\n _.set(acc, `${routePath}.${methodVerb}`, swaggerConfig);\n\n return acc;\n }, {});\n\n return paths;\n};\n\n/**\n * @description - Builds the Swagger paths object for each api\n */\nconst buildApiEndpointPath = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getPaths);\n};\n\nexport default buildApiEndpointPath;\n"],"names":["parsePathWithVariables","routePath","tokens","pathToRegexp","parse","map","token","type","value","name","t","join","Error","getPathParams","reduce","acc","param","push","in","description","deprecated","required","schema","getPathWithPrefix","prefix","route","_","has","config","concat","path","getPaths","routeInfo","uniqueName","contentTypeInfo","kind","contentTypeRoutes","routes","filter","includes","pluralName","singularName","paths","isListOfEntities","hasFindMethod","handler","methodVerb","method","toLowerCase","hasPathParams","pathWithPrefix","responses","getApiResponses","swaggerConfig","tags","upperFirst","parameters","operationId","queryParams","pathParams","refName","requestBody","content","$ref","pascalCase","set","buildApiEndpointPath","api","loopContentTypeNames"],"mappings":"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"}
1
+ {"version":3,"file":"build-api-endpoint-path.js","sources":["../../../../server/src/services/helpers/build-api-endpoint-path.ts"],"sourcesContent":["import _ from 'lodash';\nimport * as pathToRegexp from 'path-to-regexp';\n\nimport type { Core } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport pascalCase from './utils/pascal-case';\nimport queryParams from './utils/query-params';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport getApiResponses from './utils/get-api-responses';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\n/**\n * @description Parses a route with ':variable'\n *\n * @param {string} routePath - The route's path property\n * @returns {string}\n */\nconst parsePathWithVariables = (routePath: string): string => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens\n .map((token) => {\n switch (token.type) {\n case 'text':\n return token.value;\n case 'param':\n return `{${token.name}}`;\n case 'wildcard':\n return `{${token.name}}`;\n case 'group':\n // Handle group tokens by mapping them within the same function context\n return `(${parsePathWithVariables(token.tokens.map((t) => t satisfies pathToRegexp.Token).join(''))})`;\n default:\n throw new Error(`Unknown token type: ${(token as any).type}`);\n }\n })\n .join('');\n};\n\n/**\n * @description Builds the required object for a path parameter\n *\n * @param {string} routePath - The route's path property\n *\n * @returns {object } Swagger path params object\n */\nconst getPathParams = (routePath: string): OpenAPIV3.ParameterObject[] => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens.reduce((acc, param) => {\n // Skip non-parameter tokens\n if (param.type !== 'param') {\n return acc;\n }\n\n acc.push({\n name: `${param.name}`,\n in: 'path',\n description: '',\n deprecated: false,\n required: true,\n schema: { type: 'number' },\n });\n\n return acc;\n }, [] as OpenAPIV3.ParameterObject[]);\n};\n\nconst getPathWithPrefix = (prefix: string | undefined, route: Core.Route) => {\n // When the prefix is set on the routes and\n // the current route is not trying to remove it\n if (prefix && !_.has(route.config, 'prefix')) {\n // Add the prefix to the path\n return prefix.concat(route.path);\n }\n\n // Otherwise just return path\n return route.path;\n};\n\n/**\n * @description Gets all paths based on routes\n *\n * @param {object} apiInfo\n * @property {object} apiInfo.routeInfo - The api routes object\n * @property {string} apiInfo.uniqueName - Content type name | Api name + Content type name\n * @property {object} apiInfo.contentTypeInfo - The info object found on content type schemas\n *\n * @returns {object}\n */\nconst getPaths = ({ routeInfo, uniqueName, contentTypeInfo, kind }: ApiInfo) => {\n // Get the routes for the current content type\n const contentTypeRoutes = routeInfo.routes.filter((route) => {\n return (\n route.path.includes(contentTypeInfo.pluralName) ||\n route.path.includes(contentTypeInfo.singularName)\n );\n });\n\n const paths = contentTypeRoutes.reduce((acc: any, route: Core.Route) => {\n // TODO: Find a more reliable way to determine list of entities vs a single entity\n const isListOfEntities = hasFindMethod(route.handler);\n const methodVerb = route.method.toLowerCase();\n const hasPathParams = route.path.includes('/:');\n const pathWithPrefix = getPathWithPrefix(routeInfo.prefix, route);\n const routePath = hasPathParams ? parsePathWithVariables(pathWithPrefix) : pathWithPrefix;\n\n const responses = getApiResponses({\n uniqueName,\n route,\n isListOfEntities: kind !== 'singleType' && isListOfEntities,\n });\n\n const swaggerConfig: OpenAPIV3.OperationObject = {\n responses,\n tags: [_.upperFirst(uniqueName)],\n parameters: [],\n operationId: `${methodVerb}${routePath}`,\n };\n\n if (isListOfEntities) {\n swaggerConfig.parameters?.push(...queryParams);\n }\n\n if (hasPathParams) {\n const pathParams = getPathParams(route.path);\n swaggerConfig.parameters?.push(...pathParams);\n }\n\n if (['post', 'put'].includes(methodVerb)) {\n const refName = 'Request';\n const requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: `#/components/schemas/${pascalCase(uniqueName)}${refName}`,\n },\n },\n },\n };\n\n swaggerConfig.requestBody = requestBody;\n }\n\n _.set(acc, `${routePath}.${methodVerb}`, swaggerConfig);\n\n return acc;\n }, {});\n\n return paths;\n};\n\n/**\n * @description - Builds the Swagger paths object for each api\n */\nconst buildApiEndpointPath = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getPaths);\n};\n\nexport default buildApiEndpointPath;\n"],"names":["parsePathWithVariables","routePath","tokens","pathToRegexp","parse","map","token","type","value","name","t","join","Error","getPathParams","reduce","acc","param","push","in","description","deprecated","required","schema","getPathWithPrefix","prefix","route","_","has","config","concat","path","getPaths","routeInfo","uniqueName","contentTypeInfo","kind","contentTypeRoutes","routes","filter","includes","pluralName","singularName","paths","isListOfEntities","hasFindMethod","handler","methodVerb","method","toLowerCase","hasPathParams","pathWithPrefix","responses","getApiResponses","swaggerConfig","tags","upperFirst","parameters","operationId","queryParams","pathParams","refName","requestBody","content","$ref","pascalCase","set","buildApiEndpointPath","api","loopContentTypeNames"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA;;;;;IAMA,MAAMA,yBAAyB,CAACC,SAAAA,GAAAA;AAC9B,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,uBAAAA,CAAaC,KAAK,CAACH,SAAAA,CAAAA;IAEtC,OAAOC,MAAAA,CACJG,GAAG,CAAC,CAACC,KAAAA,GAAAA;AACJ,QAAA,OAAQA,MAAMC,IAAI;YAChB,KAAK,MAAA;AACH,gBAAA,OAAOD,MAAME,KAAK;YACpB,KAAK,OAAA;AACH,gBAAA,OAAO,CAAC,CAAC,EAAEF,MAAMG,IAAI,CAAC,CAAC,CAAC;YAC1B,KAAK,UAAA;AACH,gBAAA,OAAO,CAAC,CAAC,EAAEH,MAAMG,IAAI,CAAC,CAAC,CAAC;YAC1B,KAAK,OAAA;;AAEH,gBAAA,OAAO,CAAC,CAAC,EAAET,sBAAuBM,CAAAA,KAAAA,CAAMJ,MAAM,CAACG,GAAG,CAAC,CAACK,IAAMA,CAAgCC,CAAAA,CAAAA,IAAI,CAAC,EAAA,CAAA,CAAA,CAAK,CAAC,CAAC;AACxG,YAAA;gBACE,MAAM,IAAIC,MAAM,CAAC,oBAAoB,EAAE,KAACN,CAAcC,IAAI,CAAE,CAAA,CAAA;AAChE;AACF,KAAA,CAAA,CACCI,IAAI,CAAC,EAAA,CAAA;AACV,CAAA;AAEA;;;;;;IAOA,MAAME,gBAAgB,CAACZ,SAAAA,GAAAA;AACrB,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,uBAAAA,CAAaC,KAAK,CAACH,SAAAA,CAAAA;AAEtC,IAAA,OAAOC,MAAOY,CAAAA,MAAM,CAAC,CAACC,GAAKC,EAAAA,KAAAA,GAAAA;;QAEzB,IAAIA,KAAAA,CAAMT,IAAI,KAAK,OAAS,EAAA;YAC1B,OAAOQ,GAAAA;AACT;AAEAA,QAAAA,GAAAA,CAAIE,IAAI,CAAC;YACPR,IAAM,EAAA,CAAA,EAAGO,KAAMP,CAAAA,IAAI,CAAE,CAAA;YACrBS,EAAI,EAAA,MAAA;YACJC,WAAa,EAAA,EAAA;YACbC,UAAY,EAAA,KAAA;YACZC,QAAU,EAAA,IAAA;YACVC,MAAQ,EAAA;gBAAEf,IAAM,EAAA;AAAS;AAC3B,SAAA,CAAA;QAEA,OAAOQ,GAAAA;AACT,KAAA,EAAG,EAAE,CAAA;AACP,CAAA;AAEA,MAAMQ,iBAAAA,GAAoB,CAACC,MAA4BC,EAAAA,KAAAA,GAAAA;;;IAGrD,IAAID,MAAAA,IAAU,CAACE,CAAEC,CAAAA,GAAG,CAACF,KAAMG,CAAAA,MAAM,EAAE,QAAW,CAAA,EAAA;;AAE5C,QAAA,OAAOJ,MAAOK,CAAAA,MAAM,CAACJ,KAAAA,CAAMK,IAAI,CAAA;AACjC;;AAGA,IAAA,OAAOL,MAAMK,IAAI;AACnB,CAAA;AAEA;;;;;;;;;IAUA,MAAMC,QAAW,GAAA,CAAC,EAAEC,SAAS,EAAEC,UAAU,EAAEC,eAAe,EAAEC,IAAI,EAAW,GAAA;;AAEzE,IAAA,MAAMC,oBAAoBJ,SAAUK,CAAAA,MAAM,CAACC,MAAM,CAAC,CAACb,KAAAA,GAAAA;AACjD,QAAA,OACEA,KAAMK,CAAAA,IAAI,CAACS,QAAQ,CAACL,eAAgBM,CAAAA,UAAU,CAC9Cf,IAAAA,KAAAA,CAAMK,IAAI,CAACS,QAAQ,CAACL,gBAAgBO,YAAY,CAAA;AAEpD,KAAA,CAAA;AAEA,IAAA,MAAMC,KAAQN,GAAAA,iBAAAA,CAAkBtB,MAAM,CAAC,CAACC,GAAUU,EAAAA,KAAAA,GAAAA;;QAEhD,MAAMkB,gBAAAA,GAAmBC,oBAAcnB,CAAAA,KAAAA,CAAMoB,OAAO,CAAA;AACpD,QAAA,MAAMC,UAAarB,GAAAA,KAAAA,CAAMsB,MAAM,CAACC,WAAW,EAAA;AAC3C,QAAA,MAAMC,aAAgBxB,GAAAA,KAAAA,CAAMK,IAAI,CAACS,QAAQ,CAAC,IAAA,CAAA;AAC1C,QAAA,MAAMW,cAAiB3B,GAAAA,iBAAAA,CAAkBS,SAAUR,CAAAA,MAAM,EAAEC,KAAAA,CAAAA;QAC3D,MAAMxB,SAAAA,GAAYgD,aAAgBjD,GAAAA,sBAAAA,CAAuBkD,cAAkBA,CAAAA,GAAAA,cAAAA;AAE3E,QAAA,MAAMC,YAAYC,eAAgB,CAAA;AAChCnB,YAAAA,UAAAA;AACAR,YAAAA,KAAAA;AACAkB,YAAAA,gBAAAA,EAAkBR,SAAS,YAAgBQ,IAAAA;AAC7C,SAAA,CAAA;AAEA,QAAA,MAAMU,aAA2C,GAAA;AAC/CF,YAAAA,SAAAA;YACAG,IAAM,EAAA;AAAC5B,gBAAAA,CAAAA,CAAE6B,UAAU,CAACtB,UAAAA;AAAY,aAAA;AAChCuB,YAAAA,UAAAA,EAAY,EAAE;YACdC,WAAa,EAAA,CAAA,EAAGX,aAAa7C,SAAW,CAAA;AAC1C,SAAA;AAEA,QAAA,IAAI0C,gBAAkB,EAAA;YACpBU,aAAcG,CAAAA,UAAU,EAAEvC,IAAQyC,CAAAA,GAAAA,WAAAA,CAAAA;AACpC;AAEA,QAAA,IAAIT,aAAe,EAAA;YACjB,MAAMU,UAAAA,GAAa9C,aAAcY,CAAAA,KAAAA,CAAMK,IAAI,CAAA;YAC3CuB,aAAcG,CAAAA,UAAU,EAAEvC,IAAQ0C,CAAAA,GAAAA,UAAAA,CAAAA;AACpC;QAEA,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA;SAAM,CAACpB,QAAQ,CAACO,UAAa,CAAA,EAAA;AACxC,YAAA,MAAMc,OAAU,GAAA,SAAA;AAChB,YAAA,MAAMC,WAAc,GAAA;gBAClBxC,QAAU,EAAA,IAAA;gBACVyC,OAAS,EAAA;oBACP,kBAAoB,EAAA;wBAClBxC,MAAQ,EAAA;AACNyC,4BAAAA,IAAAA,EAAM,CAAC,qBAAqB,EAAEC,UAAAA,CAAW/B,cAAc2B,OAAS,CAAA;AAClE;AACF;AACF;AACF,aAAA;AAEAP,YAAAA,aAAAA,CAAcQ,WAAW,GAAGA,WAAAA;AAC9B;QAEAnC,CAAEuC,CAAAA,GAAG,CAAClD,GAAK,EAAA,CAAA,EAAGd,UAAU,CAAC,EAAE6C,YAAY,EAAEO,aAAAA,CAAAA;QAEzC,OAAOtC,GAAAA;AACT,KAAA,EAAG,EAAC,CAAA;IAEJ,OAAO2B,KAAAA;AACT,CAAA;AAEA;;IAGA,MAAMwB,uBAAuB,CAACC,GAAAA,GAAAA;;;;AAI5B,IAAA,OAAOC,qBAAqBD,GAAKpC,EAAAA,QAAAA,CAAAA;AACnC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-api-endpoint-path.mjs","sources":["../../../../server/src/services/helpers/build-api-endpoint-path.ts"],"sourcesContent":["import _ from 'lodash';\nimport * as pathToRegexp from 'path-to-regexp';\n\nimport type { Core } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport pascalCase from './utils/pascal-case';\nimport queryParams from './utils/query-params';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport getApiResponses from './utils/get-api-responses';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\n/**\n * @description Parses a route with ':variable'\n *\n * @param {string} routePath - The route's path property\n * @returns {string}\n */\nconst parsePathWithVariables = (routePath: string): string => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens\n .map((token) => {\n switch (token.type) {\n case 'text':\n return token.value;\n case 'param':\n return `{${token.name}}`;\n case 'wildcard':\n return `{${token.name}}`;\n case 'group':\n // Handle group tokens by mapping them within the same function context\n return `(${parsePathWithVariables(token.tokens.map((t) => t satisfies pathToRegexp.Token).join(''))})`;\n default:\n throw new Error(`Unknown token type: ${(token as any).type}`);\n }\n })\n .join('');\n};\n\n/**\n * @description Builds the required object for a path parameter\n *\n * @param {string} routePath - The route's path property\n *\n * @returns {object } Swagger path params object\n */\nconst getPathParams = (routePath: string): OpenAPIV3.ParameterObject[] => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens.reduce((acc, param) => {\n // Skip non-parameter tokens\n if (param.type !== 'param') {\n return acc;\n }\n\n acc.push({\n name: `${param.name}`,\n in: 'path',\n description: '',\n deprecated: false,\n required: true,\n schema: { type: 'number' },\n });\n\n return acc;\n }, [] as OpenAPIV3.ParameterObject[]);\n};\n\nconst getPathWithPrefix = (prefix: string | undefined, route: Core.Route) => {\n // When the prefix is set on the routes and\n // the current route is not trying to remove it\n if (prefix && !_.has(route.config, 'prefix')) {\n // Add the prefix to the path\n return prefix.concat(route.path);\n }\n\n // Otherwise just return path\n return route.path;\n};\n\n/**\n * @description Gets all paths based on routes\n *\n * @param {object} apiInfo\n * @property {object} apiInfo.routeInfo - The api routes object\n * @property {string} apiInfo.uniqueName - Content type name | Api name + Content type name\n * @property {object} apiInfo.contentTypeInfo - The info object found on content type schemas\n *\n * @returns {object}\n */\nconst getPaths = ({ routeInfo, uniqueName, contentTypeInfo, kind }: ApiInfo) => {\n // Get the routes for the current content type\n const contentTypeRoutes = routeInfo.routes.filter((route) => {\n return (\n route.path.includes(contentTypeInfo.pluralName) ||\n route.path.includes(contentTypeInfo.singularName)\n );\n });\n\n const paths = contentTypeRoutes.reduce((acc: any, route: Core.Route) => {\n // TODO: Find a more reliable way to determine list of entities vs a single entity\n const isListOfEntities = hasFindMethod(route.handler);\n const methodVerb = route.method.toLowerCase();\n const hasPathParams = route.path.includes('/:');\n const pathWithPrefix = getPathWithPrefix(routeInfo.prefix, route);\n const routePath = hasPathParams ? parsePathWithVariables(pathWithPrefix) : pathWithPrefix;\n\n const responses = getApiResponses({\n uniqueName,\n route,\n isListOfEntities: kind !== 'singleType' && isListOfEntities,\n });\n\n const swaggerConfig: OpenAPIV3.OperationObject = {\n responses,\n tags: [_.upperFirst(uniqueName)],\n parameters: [],\n operationId: `${methodVerb}${routePath}`,\n };\n\n if (isListOfEntities) {\n swaggerConfig.parameters?.push(...queryParams);\n }\n\n if (hasPathParams) {\n const pathParams = getPathParams(route.path);\n swaggerConfig.parameters?.push(...pathParams);\n }\n\n if (['post', 'put'].includes(methodVerb)) {\n const refName = 'Request';\n const requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: `#/components/schemas/${pascalCase(uniqueName)}${refName}`,\n },\n },\n },\n };\n\n swaggerConfig.requestBody = requestBody;\n }\n\n _.set(acc, `${routePath}.${methodVerb}`, swaggerConfig);\n\n return acc;\n }, {});\n\n return paths;\n};\n\n/**\n * @description - Builds the Swagger paths object for each api\n */\nconst buildApiEndpointPath = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getPaths);\n};\n\nexport default buildApiEndpointPath;\n"],"names":["parsePathWithVariables","routePath","tokens","pathToRegexp","parse","map","token","type","value","name","t","join","Error","getPathParams","reduce","acc","param","push","in","description","deprecated","required","schema","getPathWithPrefix","prefix","route","_","has","config","concat","path","getPaths","routeInfo","uniqueName","contentTypeInfo","kind","contentTypeRoutes","routes","filter","includes","pluralName","singularName","paths","isListOfEntities","hasFindMethod","handler","methodVerb","method","toLowerCase","hasPathParams","pathWithPrefix","responses","getApiResponses","swaggerConfig","tags","upperFirst","parameters","operationId","queryParams","pathParams","refName","requestBody","content","$ref","pascalCase","set","buildApiEndpointPath","api","loopContentTypeNames"],"mappings":"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"}
1
+ {"version":3,"file":"build-api-endpoint-path.mjs","sources":["../../../../server/src/services/helpers/build-api-endpoint-path.ts"],"sourcesContent":["import _ from 'lodash';\nimport * as pathToRegexp from 'path-to-regexp';\n\nimport type { Core } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport pascalCase from './utils/pascal-case';\nimport queryParams from './utils/query-params';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport getApiResponses from './utils/get-api-responses';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\n/**\n * @description Parses a route with ':variable'\n *\n * @param {string} routePath - The route's path property\n * @returns {string}\n */\nconst parsePathWithVariables = (routePath: string): string => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens\n .map((token) => {\n switch (token.type) {\n case 'text':\n return token.value;\n case 'param':\n return `{${token.name}}`;\n case 'wildcard':\n return `{${token.name}}`;\n case 'group':\n // Handle group tokens by mapping them within the same function context\n return `(${parsePathWithVariables(token.tokens.map((t) => t satisfies pathToRegexp.Token).join(''))})`;\n default:\n throw new Error(`Unknown token type: ${(token as any).type}`);\n }\n })\n .join('');\n};\n\n/**\n * @description Builds the required object for a path parameter\n *\n * @param {string} routePath - The route's path property\n *\n * @returns {object } Swagger path params object\n */\nconst getPathParams = (routePath: string): OpenAPIV3.ParameterObject[] => {\n const { tokens } = pathToRegexp.parse(routePath);\n\n return tokens.reduce((acc, param) => {\n // Skip non-parameter tokens\n if (param.type !== 'param') {\n return acc;\n }\n\n acc.push({\n name: `${param.name}`,\n in: 'path',\n description: '',\n deprecated: false,\n required: true,\n schema: { type: 'number' },\n });\n\n return acc;\n }, [] as OpenAPIV3.ParameterObject[]);\n};\n\nconst getPathWithPrefix = (prefix: string | undefined, route: Core.Route) => {\n // When the prefix is set on the routes and\n // the current route is not trying to remove it\n if (prefix && !_.has(route.config, 'prefix')) {\n // Add the prefix to the path\n return prefix.concat(route.path);\n }\n\n // Otherwise just return path\n return route.path;\n};\n\n/**\n * @description Gets all paths based on routes\n *\n * @param {object} apiInfo\n * @property {object} apiInfo.routeInfo - The api routes object\n * @property {string} apiInfo.uniqueName - Content type name | Api name + Content type name\n * @property {object} apiInfo.contentTypeInfo - The info object found on content type schemas\n *\n * @returns {object}\n */\nconst getPaths = ({ routeInfo, uniqueName, contentTypeInfo, kind }: ApiInfo) => {\n // Get the routes for the current content type\n const contentTypeRoutes = routeInfo.routes.filter((route) => {\n return (\n route.path.includes(contentTypeInfo.pluralName) ||\n route.path.includes(contentTypeInfo.singularName)\n );\n });\n\n const paths = contentTypeRoutes.reduce((acc: any, route: Core.Route) => {\n // TODO: Find a more reliable way to determine list of entities vs a single entity\n const isListOfEntities = hasFindMethod(route.handler);\n const methodVerb = route.method.toLowerCase();\n const hasPathParams = route.path.includes('/:');\n const pathWithPrefix = getPathWithPrefix(routeInfo.prefix, route);\n const routePath = hasPathParams ? parsePathWithVariables(pathWithPrefix) : pathWithPrefix;\n\n const responses = getApiResponses({\n uniqueName,\n route,\n isListOfEntities: kind !== 'singleType' && isListOfEntities,\n });\n\n const swaggerConfig: OpenAPIV3.OperationObject = {\n responses,\n tags: [_.upperFirst(uniqueName)],\n parameters: [],\n operationId: `${methodVerb}${routePath}`,\n };\n\n if (isListOfEntities) {\n swaggerConfig.parameters?.push(...queryParams);\n }\n\n if (hasPathParams) {\n const pathParams = getPathParams(route.path);\n swaggerConfig.parameters?.push(...pathParams);\n }\n\n if (['post', 'put'].includes(methodVerb)) {\n const refName = 'Request';\n const requestBody = {\n required: true,\n content: {\n 'application/json': {\n schema: {\n $ref: `#/components/schemas/${pascalCase(uniqueName)}${refName}`,\n },\n },\n },\n };\n\n swaggerConfig.requestBody = requestBody;\n }\n\n _.set(acc, `${routePath}.${methodVerb}`, swaggerConfig);\n\n return acc;\n }, {});\n\n return paths;\n};\n\n/**\n * @description - Builds the Swagger paths object for each api\n */\nconst buildApiEndpointPath = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getPaths);\n};\n\nexport default buildApiEndpointPath;\n"],"names":["parsePathWithVariables","routePath","tokens","pathToRegexp","parse","map","token","type","value","name","t","join","Error","getPathParams","reduce","acc","param","push","in","description","deprecated","required","schema","getPathWithPrefix","prefix","route","_","has","config","concat","path","getPaths","routeInfo","uniqueName","contentTypeInfo","kind","contentTypeRoutes","routes","filter","includes","pluralName","singularName","paths","isListOfEntities","hasFindMethod","handler","methodVerb","method","toLowerCase","hasPathParams","pathWithPrefix","responses","getApiResponses","swaggerConfig","tags","upperFirst","parameters","operationId","queryParams","pathParams","refName","requestBody","content","$ref","pascalCase","set","buildApiEndpointPath","api","loopContentTypeNames"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-component-schema.js","sources":["../../../../server/src/services/helpers/build-component-schema.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Core, Struct } from '@strapi/types';\n\nimport cleanSchemaAttributes from './utils/clean-schema-attributes';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport pascalCase from './utils/pascal-case';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\nconst getRequiredAttributes = (allAttributes: Struct.SchemaAttributes) => {\n const requiredAttributes: string[] = [];\n\n for (const key in allAttributes) {\n if (allAttributes[key].required) {\n requiredAttributes.push(key);\n }\n }\n\n return requiredAttributes;\n};\n\n/**\n * @description Get all open api schema objects for a given content type\n *\n * @param {object} apiInfo\n * @property {string} apiInfo.uniqueName - Api name | Api name + Content type name\n * @property {object} apiInfo.attributes - Attributes on content type\n * @property {object} apiInfo.routeInfo - The routes for the api\n *\n * @returns {object} Open API schemas\n */\nconst getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }: ApiInfo) => {\n // Store response and request schemas in an object\n let strapiComponentSchemas = {};\n const schemas: OpenAPIV3.ComponentsObject = {};\n const typeName = pascalCase(uniqueName);\n\n // adds a ComponentSchema to the Schemas so it can be used as Ref\n const didAddStrapiComponentsToSchemas = (schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (!Object.keys(schema) || !Object.keys(schema.properties!)) return false;\n\n // Add the Strapi components to the schema\n strapiComponentSchemas = {\n ...strapiComponentSchemas,\n [schemaName]: schema,\n };\n\n return true;\n };\n\n // Get all the route methods\n const routeMethods = routeInfo.routes.map((route: Core.Route) => route.method);\n\n const attributesToOmit = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'publishedBy',\n 'updatedBy',\n 'createdBy',\n ];\n\n const attributesForRequest = _.omit(attributes, attributesToOmit);\n // Get a list of required attribute names\n const requiredRequestAttributes = getRequiredAttributes(attributesForRequest);\n // Build the request schemas when the route has POST or PUT methods\n if (routeMethods.includes('POST') || routeMethods.includes('PUT')) {\n // Build localization requests schemas\n\n // Build the request schema\n Object.assign(schemas, {\n [`${typeName}Request`]: {\n type: 'object',\n required: ['data'],\n properties: {\n data: {\n ...(requiredRequestAttributes.length && { required: requiredRequestAttributes }),\n type: 'object',\n properties: cleanSchemaAttributes(attributesForRequest, {\n isRequest: true,\n didAddStrapiComponentsToSchemas,\n }),\n },\n },\n },\n });\n }\n\n // Check for routes that need to return a list\n const hasListOfEntities = routeInfo.routes.filter((route: Core.Route) =>\n hasFindMethod(route.handler)\n ).length;\n\n if (hasListOfEntities) {\n // Build the list response schema\n Object.assign(schemas, {\n [`${typeName}ListResponse`]: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: `#/components/schemas/${typeName}`,\n },\n },\n meta: {\n type: 'object',\n properties: {\n pagination: {\n type: 'object',\n properties: {\n page: { type: 'integer' },\n pageSize: { type: 'integer', minimum: 25 },\n pageCount: { type: 'integer', maximum: 1 },\n total: { type: 'integer' },\n },\n },\n },\n },\n },\n },\n });\n }\n\n const requiredAttributes = getRequiredAttributes(attributes);\n // Build the response schema\n Object.assign(schemas, {\n [`${typeName}`]: {\n type: 'object',\n ...(requiredAttributes.length && { required: requiredAttributes }),\n properties: {\n id: { type: 'number' },\n documentId: { type: 'string' },\n ...cleanSchemaAttributes(attributes, { didAddStrapiComponentsToSchemas }),\n },\n },\n\n [`${typeName}Response`]: {\n type: 'object',\n properties: {\n data: {\n $ref: `#/components/schemas/${typeName}`,\n },\n meta: { type: 'object' },\n },\n },\n });\n\n return { ...schemas, ...strapiComponentSchemas };\n};\n\nconst buildComponentSchema = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getAllSchemasForContentType);\n};\n\nexport default buildComponentSchema;\n"],"names":["getRequiredAttributes","allAttributes","requiredAttributes","key","required","push","getAllSchemasForContentType","routeInfo","attributes","uniqueName","strapiComponentSchemas","schemas","typeName","pascalCase","didAddStrapiComponentsToSchemas","schemaName","schema","Object","keys","properties","routeMethods","routes","map","route","method","attributesToOmit","attributesForRequest","_","omit","requiredRequestAttributes","includes","assign","type","data","length","cleanSchemaAttributes","isRequest","hasListOfEntities","filter","hasFindMethod","handler","items","$ref","meta","pagination","page","pageSize","minimum","pageCount","maximum","total","id","documentId","buildComponentSchema","api","loopContentTypeNames"],"mappings":"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"}
1
+ {"version":3,"file":"build-component-schema.js","sources":["../../../../server/src/services/helpers/build-component-schema.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Core, Struct } from '@strapi/types';\n\nimport cleanSchemaAttributes from './utils/clean-schema-attributes';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport pascalCase from './utils/pascal-case';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\nconst getRequiredAttributes = (allAttributes: Struct.SchemaAttributes) => {\n const requiredAttributes: string[] = [];\n\n for (const key in allAttributes) {\n if (allAttributes[key].required) {\n requiredAttributes.push(key);\n }\n }\n\n return requiredAttributes;\n};\n\n/**\n * @description Get all open api schema objects for a given content type\n *\n * @param {object} apiInfo\n * @property {string} apiInfo.uniqueName - Api name | Api name + Content type name\n * @property {object} apiInfo.attributes - Attributes on content type\n * @property {object} apiInfo.routeInfo - The routes for the api\n *\n * @returns {object} Open API schemas\n */\nconst getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }: ApiInfo) => {\n // Store response and request schemas in an object\n let strapiComponentSchemas = {};\n const schemas: OpenAPIV3.ComponentsObject = {};\n const typeName = pascalCase(uniqueName);\n\n // adds a ComponentSchema to the Schemas so it can be used as Ref\n const didAddStrapiComponentsToSchemas = (schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (!Object.keys(schema) || !Object.keys(schema.properties!)) return false;\n\n // Add the Strapi components to the schema\n strapiComponentSchemas = {\n ...strapiComponentSchemas,\n [schemaName]: schema,\n };\n\n return true;\n };\n\n // Get all the route methods\n const routeMethods = routeInfo.routes.map((route: Core.Route) => route.method);\n\n const attributesToOmit = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'publishedBy',\n 'updatedBy',\n 'createdBy',\n ];\n\n const attributesForRequest = _.omit(attributes, attributesToOmit);\n // Get a list of required attribute names\n const requiredRequestAttributes = getRequiredAttributes(attributesForRequest);\n // Build the request schemas when the route has POST or PUT methods\n if (routeMethods.includes('POST') || routeMethods.includes('PUT')) {\n // Build localization requests schemas\n\n // Build the request schema\n Object.assign(schemas, {\n [`${typeName}Request`]: {\n type: 'object',\n required: ['data'],\n properties: {\n data: {\n ...(requiredRequestAttributes.length && { required: requiredRequestAttributes }),\n type: 'object',\n properties: cleanSchemaAttributes(attributesForRequest, {\n isRequest: true,\n didAddStrapiComponentsToSchemas,\n }),\n },\n },\n },\n });\n }\n\n // Check for routes that need to return a list\n const hasListOfEntities = routeInfo.routes.filter((route: Core.Route) =>\n hasFindMethod(route.handler)\n ).length;\n\n if (hasListOfEntities) {\n // Build the list response schema\n Object.assign(schemas, {\n [`${typeName}ListResponse`]: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: `#/components/schemas/${typeName}`,\n },\n },\n meta: {\n type: 'object',\n properties: {\n pagination: {\n type: 'object',\n properties: {\n page: { type: 'integer' },\n pageSize: { type: 'integer', minimum: 25 },\n pageCount: { type: 'integer', maximum: 1 },\n total: { type: 'integer' },\n },\n },\n },\n },\n },\n },\n });\n }\n\n const requiredAttributes = getRequiredAttributes(attributes);\n // Build the response schema\n Object.assign(schemas, {\n [`${typeName}`]: {\n type: 'object',\n ...(requiredAttributes.length && { required: requiredAttributes }),\n properties: {\n id: { type: 'number' },\n documentId: { type: 'string' },\n ...cleanSchemaAttributes(attributes, { didAddStrapiComponentsToSchemas }),\n },\n },\n\n [`${typeName}Response`]: {\n type: 'object',\n properties: {\n data: {\n $ref: `#/components/schemas/${typeName}`,\n },\n meta: { type: 'object' },\n },\n },\n });\n\n return { ...schemas, ...strapiComponentSchemas };\n};\n\nconst buildComponentSchema = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getAllSchemasForContentType);\n};\n\nexport default buildComponentSchema;\n"],"names":["getRequiredAttributes","allAttributes","requiredAttributes","key","required","push","getAllSchemasForContentType","routeInfo","attributes","uniqueName","strapiComponentSchemas","schemas","typeName","pascalCase","didAddStrapiComponentsToSchemas","schemaName","schema","Object","keys","properties","routeMethods","routes","map","route","method","attributesToOmit","attributesForRequest","_","omit","requiredRequestAttributes","includes","assign","type","data","length","cleanSchemaAttributes","isRequest","hasListOfEntities","filter","hasFindMethod","handler","items","$ref","meta","pagination","page","pageSize","minimum","pageCount","maximum","total","id","documentId","buildComponentSchema","api","loopContentTypeNames"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-component-schema.mjs","sources":["../../../../server/src/services/helpers/build-component-schema.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Core, Struct } from '@strapi/types';\n\nimport cleanSchemaAttributes from './utils/clean-schema-attributes';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport pascalCase from './utils/pascal-case';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\nconst getRequiredAttributes = (allAttributes: Struct.SchemaAttributes) => {\n const requiredAttributes: string[] = [];\n\n for (const key in allAttributes) {\n if (allAttributes[key].required) {\n requiredAttributes.push(key);\n }\n }\n\n return requiredAttributes;\n};\n\n/**\n * @description Get all open api schema objects for a given content type\n *\n * @param {object} apiInfo\n * @property {string} apiInfo.uniqueName - Api name | Api name + Content type name\n * @property {object} apiInfo.attributes - Attributes on content type\n * @property {object} apiInfo.routeInfo - The routes for the api\n *\n * @returns {object} Open API schemas\n */\nconst getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }: ApiInfo) => {\n // Store response and request schemas in an object\n let strapiComponentSchemas = {};\n const schemas: OpenAPIV3.ComponentsObject = {};\n const typeName = pascalCase(uniqueName);\n\n // adds a ComponentSchema to the Schemas so it can be used as Ref\n const didAddStrapiComponentsToSchemas = (schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (!Object.keys(schema) || !Object.keys(schema.properties!)) return false;\n\n // Add the Strapi components to the schema\n strapiComponentSchemas = {\n ...strapiComponentSchemas,\n [schemaName]: schema,\n };\n\n return true;\n };\n\n // Get all the route methods\n const routeMethods = routeInfo.routes.map((route: Core.Route) => route.method);\n\n const attributesToOmit = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'publishedBy',\n 'updatedBy',\n 'createdBy',\n ];\n\n const attributesForRequest = _.omit(attributes, attributesToOmit);\n // Get a list of required attribute names\n const requiredRequestAttributes = getRequiredAttributes(attributesForRequest);\n // Build the request schemas when the route has POST or PUT methods\n if (routeMethods.includes('POST') || routeMethods.includes('PUT')) {\n // Build localization requests schemas\n\n // Build the request schema\n Object.assign(schemas, {\n [`${typeName}Request`]: {\n type: 'object',\n required: ['data'],\n properties: {\n data: {\n ...(requiredRequestAttributes.length && { required: requiredRequestAttributes }),\n type: 'object',\n properties: cleanSchemaAttributes(attributesForRequest, {\n isRequest: true,\n didAddStrapiComponentsToSchemas,\n }),\n },\n },\n },\n });\n }\n\n // Check for routes that need to return a list\n const hasListOfEntities = routeInfo.routes.filter((route: Core.Route) =>\n hasFindMethod(route.handler)\n ).length;\n\n if (hasListOfEntities) {\n // Build the list response schema\n Object.assign(schemas, {\n [`${typeName}ListResponse`]: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: `#/components/schemas/${typeName}`,\n },\n },\n meta: {\n type: 'object',\n properties: {\n pagination: {\n type: 'object',\n properties: {\n page: { type: 'integer' },\n pageSize: { type: 'integer', minimum: 25 },\n pageCount: { type: 'integer', maximum: 1 },\n total: { type: 'integer' },\n },\n },\n },\n },\n },\n },\n });\n }\n\n const requiredAttributes = getRequiredAttributes(attributes);\n // Build the response schema\n Object.assign(schemas, {\n [`${typeName}`]: {\n type: 'object',\n ...(requiredAttributes.length && { required: requiredAttributes }),\n properties: {\n id: { type: 'number' },\n documentId: { type: 'string' },\n ...cleanSchemaAttributes(attributes, { didAddStrapiComponentsToSchemas }),\n },\n },\n\n [`${typeName}Response`]: {\n type: 'object',\n properties: {\n data: {\n $ref: `#/components/schemas/${typeName}`,\n },\n meta: { type: 'object' },\n },\n },\n });\n\n return { ...schemas, ...strapiComponentSchemas };\n};\n\nconst buildComponentSchema = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getAllSchemasForContentType);\n};\n\nexport default buildComponentSchema;\n"],"names":["getRequiredAttributes","allAttributes","requiredAttributes","key","required","push","getAllSchemasForContentType","routeInfo","attributes","uniqueName","strapiComponentSchemas","schemas","typeName","pascalCase","didAddStrapiComponentsToSchemas","schemaName","schema","Object","keys","properties","routeMethods","routes","map","route","method","attributesToOmit","attributesForRequest","_","omit","requiredRequestAttributes","includes","assign","type","data","length","cleanSchemaAttributes","isRequest","hasListOfEntities","filter","hasFindMethod","handler","items","$ref","meta","pagination","page","pageSize","minimum","pageCount","maximum","total","id","documentId","buildComponentSchema","api","loopContentTypeNames"],"mappings":"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"}
1
+ {"version":3,"file":"build-component-schema.mjs","sources":["../../../../server/src/services/helpers/build-component-schema.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { OpenAPIV3 } from 'openapi-types';\nimport type { Core, Struct } from '@strapi/types';\n\nimport cleanSchemaAttributes from './utils/clean-schema-attributes';\nimport loopContentTypeNames from './utils/loop-content-type-names';\nimport pascalCase from './utils/pascal-case';\nimport { hasFindMethod } from './utils/routes';\n\nimport type { Api, ApiInfo } from '../../types';\n\nconst getRequiredAttributes = (allAttributes: Struct.SchemaAttributes) => {\n const requiredAttributes: string[] = [];\n\n for (const key in allAttributes) {\n if (allAttributes[key].required) {\n requiredAttributes.push(key);\n }\n }\n\n return requiredAttributes;\n};\n\n/**\n * @description Get all open api schema objects for a given content type\n *\n * @param {object} apiInfo\n * @property {string} apiInfo.uniqueName - Api name | Api name + Content type name\n * @property {object} apiInfo.attributes - Attributes on content type\n * @property {object} apiInfo.routeInfo - The routes for the api\n *\n * @returns {object} Open API schemas\n */\nconst getAllSchemasForContentType = ({ routeInfo, attributes, uniqueName }: ApiInfo) => {\n // Store response and request schemas in an object\n let strapiComponentSchemas = {};\n const schemas: OpenAPIV3.ComponentsObject = {};\n const typeName = pascalCase(uniqueName);\n\n // adds a ComponentSchema to the Schemas so it can be used as Ref\n const didAddStrapiComponentsToSchemas = (schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (!Object.keys(schema) || !Object.keys(schema.properties!)) return false;\n\n // Add the Strapi components to the schema\n strapiComponentSchemas = {\n ...strapiComponentSchemas,\n [schemaName]: schema,\n };\n\n return true;\n };\n\n // Get all the route methods\n const routeMethods = routeInfo.routes.map((route: Core.Route) => route.method);\n\n const attributesToOmit = [\n 'createdAt',\n 'updatedAt',\n 'publishedAt',\n 'publishedBy',\n 'updatedBy',\n 'createdBy',\n ];\n\n const attributesForRequest = _.omit(attributes, attributesToOmit);\n // Get a list of required attribute names\n const requiredRequestAttributes = getRequiredAttributes(attributesForRequest);\n // Build the request schemas when the route has POST or PUT methods\n if (routeMethods.includes('POST') || routeMethods.includes('PUT')) {\n // Build localization requests schemas\n\n // Build the request schema\n Object.assign(schemas, {\n [`${typeName}Request`]: {\n type: 'object',\n required: ['data'],\n properties: {\n data: {\n ...(requiredRequestAttributes.length && { required: requiredRequestAttributes }),\n type: 'object',\n properties: cleanSchemaAttributes(attributesForRequest, {\n isRequest: true,\n didAddStrapiComponentsToSchemas,\n }),\n },\n },\n },\n });\n }\n\n // Check for routes that need to return a list\n const hasListOfEntities = routeInfo.routes.filter((route: Core.Route) =>\n hasFindMethod(route.handler)\n ).length;\n\n if (hasListOfEntities) {\n // Build the list response schema\n Object.assign(schemas, {\n [`${typeName}ListResponse`]: {\n type: 'object',\n properties: {\n data: {\n type: 'array',\n items: {\n $ref: `#/components/schemas/${typeName}`,\n },\n },\n meta: {\n type: 'object',\n properties: {\n pagination: {\n type: 'object',\n properties: {\n page: { type: 'integer' },\n pageSize: { type: 'integer', minimum: 25 },\n pageCount: { type: 'integer', maximum: 1 },\n total: { type: 'integer' },\n },\n },\n },\n },\n },\n },\n });\n }\n\n const requiredAttributes = getRequiredAttributes(attributes);\n // Build the response schema\n Object.assign(schemas, {\n [`${typeName}`]: {\n type: 'object',\n ...(requiredAttributes.length && { required: requiredAttributes }),\n properties: {\n id: { type: 'number' },\n documentId: { type: 'string' },\n ...cleanSchemaAttributes(attributes, { didAddStrapiComponentsToSchemas }),\n },\n },\n\n [`${typeName}Response`]: {\n type: 'object',\n properties: {\n data: {\n $ref: `#/components/schemas/${typeName}`,\n },\n meta: { type: 'object' },\n },\n },\n });\n\n return { ...schemas, ...strapiComponentSchemas };\n};\n\nconst buildComponentSchema = (api: Api) => {\n // A reusable loop for building paths and component schemas\n // Uses the api param to build a new set of params for each content type\n // Passes these new params to the function provided\n return loopContentTypeNames(api, getAllSchemasForContentType);\n};\n\nexport default buildComponentSchema;\n"],"names":["getRequiredAttributes","allAttributes","requiredAttributes","key","required","push","getAllSchemasForContentType","routeInfo","attributes","uniqueName","strapiComponentSchemas","schemas","typeName","pascalCase","didAddStrapiComponentsToSchemas","schemaName","schema","Object","keys","properties","routeMethods","routes","map","route","method","attributesToOmit","attributesForRequest","_","omit","requiredRequestAttributes","includes","assign","type","data","length","cleanSchemaAttributes","isRequest","hasListOfEntities","filter","hasFindMethod","handler","items","$ref","meta","pagination","page","pageSize","minimum","pageCount","maximum","total","id","documentId","buildComponentSchema","api","loopContentTypeNames"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"clean-schema-attributes.js","sources":["../../../../../server/src/services/helpers/utils/clean-schema-attributes.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport getSchemaData from './get-schema-data';\nimport pascalCase from './pascal-case';\n\ninterface Options {\n typeMap?: Map<string, boolean>;\n isRequest?: boolean;\n didAddStrapiComponentsToSchemas: (name: string, schema: object) => boolean;\n}\n\n/**\n * @description - Convert attribute component names to OpenAPI component names\n *\n * @returns OpenAPI component name\n */\nconst convertComponentName = (component: string, isRef = false): string => {\n const cleanComponentName = `${pascalCase(component)}Component`;\n\n if (isRef) {\n return `#/components/schemas/${cleanComponentName}`;\n }\n return cleanComponentName;\n};\n\n/**\n * @description - Converts types found on attributes to OpenAPI acceptable data types\n *\n * @returns Attributes using OpenAPI acceptable data types\n */\nconst cleanSchemaAttributes = (\n attributes: Struct.SchemaAttributes,\n { typeMap = new Map(), isRequest = false, didAddStrapiComponentsToSchemas }: Options\n) => {\n const schemaAttributes: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject> = {};\n\n for (const prop of Object.keys(attributes)) {\n const attribute = attributes[prop];\n\n switch (attribute.type) {\n case 'password': {\n if (!isRequest) {\n break;\n }\n\n schemaAttributes[prop] = { type: 'string', format: 'password', example: '*******' };\n break;\n }\n case 'email': {\n schemaAttributes[prop] = { type: 'string', format: 'email' };\n break;\n }\n case 'string':\n case 'text':\n case 'richtext': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'timestamp': {\n schemaAttributes[prop] = { type: 'string', format: 'timestamp', example: Date.now() };\n break;\n }\n case 'time': {\n schemaAttributes[prop] = { type: 'string', format: 'time', example: '12:54.000' };\n break;\n }\n case 'date': {\n schemaAttributes[prop] = { type: 'string', format: 'date' };\n break;\n }\n case 'datetime': {\n schemaAttributes[prop] = { type: 'string', format: 'date-time' };\n break;\n }\n case 'boolean': {\n schemaAttributes[prop] = { type: 'boolean' };\n break;\n }\n case 'enumeration': {\n schemaAttributes[prop] = { type: 'string', enum: [...attribute.enum] };\n break;\n }\n case 'decimal':\n case 'float': {\n schemaAttributes[prop] = { type: 'number', format: 'float' };\n break;\n }\n case 'integer': {\n schemaAttributes[prop] = { type: 'integer' };\n break;\n }\n case 'biginteger': {\n schemaAttributes[prop] = { type: 'string', pattern: '^\\\\d*$', example: '123456789' };\n break;\n }\n case 'json':\n case 'blocks': {\n schemaAttributes[prop] = {};\n break;\n }\n case 'uid': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'component': {\n const componentAttributes = strapi.components[attribute.component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(attribute.component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(attribute.component),\n rawComponentSchema\n );\n\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n if (attribute.repeatable) {\n schemaAttributes[prop] = {\n type: 'array',\n items: finalComponentSchema,\n };\n } else {\n schemaAttributes[prop] = finalComponentSchema;\n }\n break;\n }\n case 'dynamiczone': {\n const components = attribute.components.map((component) => {\n const componentAttributes = strapi.components[component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n __component: { type: 'string', enum: [component] },\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(component),\n rawComponentSchema\n );\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n return finalComponentSchema;\n });\n let discriminator: OpenAPIV3.DiscriminatorObject | undefined;\n if (components.every((component) => Object.hasOwn(component, '$ref'))) {\n discriminator = {\n propertyName: '__component',\n mapping: attribute.components.reduce(\n (acc, component) => {\n acc[component] = convertComponentName(component, true);\n return acc;\n },\n {} as {\n [value: string]: string;\n }\n ),\n };\n }\n\n schemaAttributes[prop] = {\n type: 'array',\n items: {\n anyOf: components,\n },\n discriminator,\n };\n break;\n }\n case 'media': {\n const imageAttributes = strapi.contentType('plugin::upload.file').attributes;\n const isListOfEntities = attribute.multiple ?? false;\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(imageAttributes, { typeMap, didAddStrapiComponentsToSchemas })\n );\n break;\n }\n\n case 'relation': {\n const isListOfEntities = attribute.relation.includes('ToMany');\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n if (!('target' in attribute) || !attribute.target || typeMap.has(attribute.target)) {\n schemaAttributes[prop] = getSchemaData(isListOfEntities, {});\n\n break;\n }\n\n typeMap.set(attribute.target, true);\n const targetAttributes = strapi.contentType(attribute.target).attributes;\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(targetAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n })\n );\n\n break;\n }\n default: {\n // @ts-expect-error - This is a catch all for any other types\n throw new Error(`Invalid type ${attribute.type} while generating open api schema.`);\n }\n }\n }\n\n return schemaAttributes;\n};\n\nexport default cleanSchemaAttributes;\n"],"names":["convertComponentName","component","isRef","cleanComponentName","pascalCase","cleanSchemaAttributes","attributes","typeMap","Map","isRequest","didAddStrapiComponentsToSchemas","schemaAttributes","prop","Object","keys","attribute","type","format","example","Date","now","enum","pattern","componentAttributes","strapi","components","rawComponentSchema","properties","id","refComponentSchema","$ref","componentExists","finalComponentSchema","repeatable","items","map","__component","discriminator","every","hasOwn","propertyName","mapping","reduce","acc","anyOf","imageAttributes","contentType","isListOfEntities","multiple","oneOfType","oneOf","getSchemaData","relation","includes","target","has","set","targetAttributes","Error"],"mappings":"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"}
1
+ {"version":3,"file":"clean-schema-attributes.js","sources":["../../../../../server/src/services/helpers/utils/clean-schema-attributes.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport getSchemaData from './get-schema-data';\nimport pascalCase from './pascal-case';\n\ninterface Options {\n typeMap?: Map<string, boolean>;\n isRequest?: boolean;\n didAddStrapiComponentsToSchemas: (name: string, schema: object) => boolean;\n}\n\n/**\n * @description - Convert attribute component names to OpenAPI component names\n *\n * @returns OpenAPI component name\n */\nconst convertComponentName = (component: string, isRef = false): string => {\n const cleanComponentName = `${pascalCase(component)}Component`;\n\n if (isRef) {\n return `#/components/schemas/${cleanComponentName}`;\n }\n return cleanComponentName;\n};\n\n/**\n * @description - Converts types found on attributes to OpenAPI acceptable data types\n *\n * @returns Attributes using OpenAPI acceptable data types\n */\nconst cleanSchemaAttributes = (\n attributes: Struct.SchemaAttributes,\n { typeMap = new Map(), isRequest = false, didAddStrapiComponentsToSchemas }: Options\n) => {\n const schemaAttributes: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject> = {};\n\n for (const prop of Object.keys(attributes)) {\n const attribute = attributes[prop];\n\n switch (attribute.type) {\n case 'password': {\n if (!isRequest) {\n break;\n }\n\n schemaAttributes[prop] = { type: 'string', format: 'password', example: '*******' };\n break;\n }\n case 'email': {\n schemaAttributes[prop] = { type: 'string', format: 'email' };\n break;\n }\n case 'string':\n case 'text':\n case 'richtext': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'timestamp': {\n schemaAttributes[prop] = { type: 'string', format: 'timestamp', example: Date.now() };\n break;\n }\n case 'time': {\n schemaAttributes[prop] = { type: 'string', format: 'time', example: '12:54.000' };\n break;\n }\n case 'date': {\n schemaAttributes[prop] = { type: 'string', format: 'date' };\n break;\n }\n case 'datetime': {\n schemaAttributes[prop] = { type: 'string', format: 'date-time' };\n break;\n }\n case 'boolean': {\n schemaAttributes[prop] = { type: 'boolean' };\n break;\n }\n case 'enumeration': {\n schemaAttributes[prop] = { type: 'string', enum: [...attribute.enum] };\n break;\n }\n case 'decimal':\n case 'float': {\n schemaAttributes[prop] = { type: 'number', format: 'float' };\n break;\n }\n case 'integer': {\n schemaAttributes[prop] = { type: 'integer' };\n break;\n }\n case 'biginteger': {\n schemaAttributes[prop] = { type: 'string', pattern: '^\\\\d*$', example: '123456789' };\n break;\n }\n case 'json':\n case 'blocks': {\n schemaAttributes[prop] = {};\n break;\n }\n case 'uid': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'component': {\n const componentAttributes = strapi.components[attribute.component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(attribute.component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(attribute.component),\n rawComponentSchema\n );\n\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n if (attribute.repeatable) {\n schemaAttributes[prop] = {\n type: 'array',\n items: finalComponentSchema,\n };\n } else {\n schemaAttributes[prop] = finalComponentSchema;\n }\n break;\n }\n case 'dynamiczone': {\n const components = attribute.components.map((component) => {\n const componentAttributes = strapi.components[component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n __component: { type: 'string', enum: [component] },\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(component),\n rawComponentSchema\n );\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n return finalComponentSchema;\n });\n let discriminator: OpenAPIV3.DiscriminatorObject | undefined;\n if (components.every((component) => Object.hasOwn(component, '$ref'))) {\n discriminator = {\n propertyName: '__component',\n mapping: attribute.components.reduce(\n (acc, component) => {\n acc[component] = convertComponentName(component, true);\n return acc;\n },\n {} as {\n [value: string]: string;\n }\n ),\n };\n }\n\n schemaAttributes[prop] = {\n type: 'array',\n items: {\n anyOf: components,\n },\n discriminator,\n };\n break;\n }\n case 'media': {\n const imageAttributes = strapi.contentType('plugin::upload.file').attributes;\n const isListOfEntities = attribute.multiple ?? false;\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(imageAttributes, { typeMap, didAddStrapiComponentsToSchemas })\n );\n break;\n }\n\n case 'relation': {\n const isListOfEntities = attribute.relation.includes('ToMany');\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n if (!('target' in attribute) || !attribute.target || typeMap.has(attribute.target)) {\n schemaAttributes[prop] = getSchemaData(isListOfEntities, {});\n\n break;\n }\n\n typeMap.set(attribute.target, true);\n const targetAttributes = strapi.contentType(attribute.target).attributes;\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(targetAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n })\n );\n\n break;\n }\n default: {\n // @ts-expect-error - This is a catch all for any other types\n throw new Error(`Invalid type ${attribute.type} while generating open api schema.`);\n }\n }\n }\n\n return schemaAttributes;\n};\n\nexport default cleanSchemaAttributes;\n"],"names":["convertComponentName","component","isRef","cleanComponentName","pascalCase","cleanSchemaAttributes","attributes","typeMap","Map","isRequest","didAddStrapiComponentsToSchemas","schemaAttributes","prop","Object","keys","attribute","type","format","example","Date","now","enum","pattern","componentAttributes","strapi","components","rawComponentSchema","properties","id","refComponentSchema","$ref","componentExists","finalComponentSchema","repeatable","items","map","__component","discriminator","every","hasOwn","propertyName","mapping","reduce","acc","anyOf","imageAttributes","contentType","isListOfEntities","multiple","oneOfType","oneOf","getSchemaData","relation","includes","target","has","set","targetAttributes","Error"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"clean-schema-attributes.mjs","sources":["../../../../../server/src/services/helpers/utils/clean-schema-attributes.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport getSchemaData from './get-schema-data';\nimport pascalCase from './pascal-case';\n\ninterface Options {\n typeMap?: Map<string, boolean>;\n isRequest?: boolean;\n didAddStrapiComponentsToSchemas: (name: string, schema: object) => boolean;\n}\n\n/**\n * @description - Convert attribute component names to OpenAPI component names\n *\n * @returns OpenAPI component name\n */\nconst convertComponentName = (component: string, isRef = false): string => {\n const cleanComponentName = `${pascalCase(component)}Component`;\n\n if (isRef) {\n return `#/components/schemas/${cleanComponentName}`;\n }\n return cleanComponentName;\n};\n\n/**\n * @description - Converts types found on attributes to OpenAPI acceptable data types\n *\n * @returns Attributes using OpenAPI acceptable data types\n */\nconst cleanSchemaAttributes = (\n attributes: Struct.SchemaAttributes,\n { typeMap = new Map(), isRequest = false, didAddStrapiComponentsToSchemas }: Options\n) => {\n const schemaAttributes: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject> = {};\n\n for (const prop of Object.keys(attributes)) {\n const attribute = attributes[prop];\n\n switch (attribute.type) {\n case 'password': {\n if (!isRequest) {\n break;\n }\n\n schemaAttributes[prop] = { type: 'string', format: 'password', example: '*******' };\n break;\n }\n case 'email': {\n schemaAttributes[prop] = { type: 'string', format: 'email' };\n break;\n }\n case 'string':\n case 'text':\n case 'richtext': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'timestamp': {\n schemaAttributes[prop] = { type: 'string', format: 'timestamp', example: Date.now() };\n break;\n }\n case 'time': {\n schemaAttributes[prop] = { type: 'string', format: 'time', example: '12:54.000' };\n break;\n }\n case 'date': {\n schemaAttributes[prop] = { type: 'string', format: 'date' };\n break;\n }\n case 'datetime': {\n schemaAttributes[prop] = { type: 'string', format: 'date-time' };\n break;\n }\n case 'boolean': {\n schemaAttributes[prop] = { type: 'boolean' };\n break;\n }\n case 'enumeration': {\n schemaAttributes[prop] = { type: 'string', enum: [...attribute.enum] };\n break;\n }\n case 'decimal':\n case 'float': {\n schemaAttributes[prop] = { type: 'number', format: 'float' };\n break;\n }\n case 'integer': {\n schemaAttributes[prop] = { type: 'integer' };\n break;\n }\n case 'biginteger': {\n schemaAttributes[prop] = { type: 'string', pattern: '^\\\\d*$', example: '123456789' };\n break;\n }\n case 'json':\n case 'blocks': {\n schemaAttributes[prop] = {};\n break;\n }\n case 'uid': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'component': {\n const componentAttributes = strapi.components[attribute.component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(attribute.component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(attribute.component),\n rawComponentSchema\n );\n\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n if (attribute.repeatable) {\n schemaAttributes[prop] = {\n type: 'array',\n items: finalComponentSchema,\n };\n } else {\n schemaAttributes[prop] = finalComponentSchema;\n }\n break;\n }\n case 'dynamiczone': {\n const components = attribute.components.map((component) => {\n const componentAttributes = strapi.components[component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n __component: { type: 'string', enum: [component] },\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(component),\n rawComponentSchema\n );\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n return finalComponentSchema;\n });\n let discriminator: OpenAPIV3.DiscriminatorObject | undefined;\n if (components.every((component) => Object.hasOwn(component, '$ref'))) {\n discriminator = {\n propertyName: '__component',\n mapping: attribute.components.reduce(\n (acc, component) => {\n acc[component] = convertComponentName(component, true);\n return acc;\n },\n {} as {\n [value: string]: string;\n }\n ),\n };\n }\n\n schemaAttributes[prop] = {\n type: 'array',\n items: {\n anyOf: components,\n },\n discriminator,\n };\n break;\n }\n case 'media': {\n const imageAttributes = strapi.contentType('plugin::upload.file').attributes;\n const isListOfEntities = attribute.multiple ?? false;\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(imageAttributes, { typeMap, didAddStrapiComponentsToSchemas })\n );\n break;\n }\n\n case 'relation': {\n const isListOfEntities = attribute.relation.includes('ToMany');\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n if (!('target' in attribute) || !attribute.target || typeMap.has(attribute.target)) {\n schemaAttributes[prop] = getSchemaData(isListOfEntities, {});\n\n break;\n }\n\n typeMap.set(attribute.target, true);\n const targetAttributes = strapi.contentType(attribute.target).attributes;\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(targetAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n })\n );\n\n break;\n }\n default: {\n // @ts-expect-error - This is a catch all for any other types\n throw new Error(`Invalid type ${attribute.type} while generating open api schema.`);\n }\n }\n }\n\n return schemaAttributes;\n};\n\nexport default cleanSchemaAttributes;\n"],"names":["convertComponentName","component","isRef","cleanComponentName","pascalCase","cleanSchemaAttributes","attributes","typeMap","Map","isRequest","didAddStrapiComponentsToSchemas","schemaAttributes","prop","Object","keys","attribute","type","format","example","Date","now","enum","pattern","componentAttributes","strapi","components","rawComponentSchema","properties","id","refComponentSchema","$ref","componentExists","finalComponentSchema","repeatable","items","map","__component","discriminator","every","hasOwn","propertyName","mapping","reduce","acc","anyOf","imageAttributes","contentType","isListOfEntities","multiple","oneOfType","oneOf","getSchemaData","relation","includes","target","has","set","targetAttributes","Error"],"mappings":"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"}
1
+ {"version":3,"file":"clean-schema-attributes.mjs","sources":["../../../../../server/src/services/helpers/utils/clean-schema-attributes.ts"],"sourcesContent":["import type { Struct } from '@strapi/types';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nimport getSchemaData from './get-schema-data';\nimport pascalCase from './pascal-case';\n\ninterface Options {\n typeMap?: Map<string, boolean>;\n isRequest?: boolean;\n didAddStrapiComponentsToSchemas: (name: string, schema: object) => boolean;\n}\n\n/**\n * @description - Convert attribute component names to OpenAPI component names\n *\n * @returns OpenAPI component name\n */\nconst convertComponentName = (component: string, isRef = false): string => {\n const cleanComponentName = `${pascalCase(component)}Component`;\n\n if (isRef) {\n return `#/components/schemas/${cleanComponentName}`;\n }\n return cleanComponentName;\n};\n\n/**\n * @description - Converts types found on attributes to OpenAPI acceptable data types\n *\n * @returns Attributes using OpenAPI acceptable data types\n */\nconst cleanSchemaAttributes = (\n attributes: Struct.SchemaAttributes,\n { typeMap = new Map(), isRequest = false, didAddStrapiComponentsToSchemas }: Options\n) => {\n const schemaAttributes: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject> = {};\n\n for (const prop of Object.keys(attributes)) {\n const attribute = attributes[prop];\n\n switch (attribute.type) {\n case 'password': {\n if (!isRequest) {\n break;\n }\n\n schemaAttributes[prop] = { type: 'string', format: 'password', example: '*******' };\n break;\n }\n case 'email': {\n schemaAttributes[prop] = { type: 'string', format: 'email' };\n break;\n }\n case 'string':\n case 'text':\n case 'richtext': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'timestamp': {\n schemaAttributes[prop] = { type: 'string', format: 'timestamp', example: Date.now() };\n break;\n }\n case 'time': {\n schemaAttributes[prop] = { type: 'string', format: 'time', example: '12:54.000' };\n break;\n }\n case 'date': {\n schemaAttributes[prop] = { type: 'string', format: 'date' };\n break;\n }\n case 'datetime': {\n schemaAttributes[prop] = { type: 'string', format: 'date-time' };\n break;\n }\n case 'boolean': {\n schemaAttributes[prop] = { type: 'boolean' };\n break;\n }\n case 'enumeration': {\n schemaAttributes[prop] = { type: 'string', enum: [...attribute.enum] };\n break;\n }\n case 'decimal':\n case 'float': {\n schemaAttributes[prop] = { type: 'number', format: 'float' };\n break;\n }\n case 'integer': {\n schemaAttributes[prop] = { type: 'integer' };\n break;\n }\n case 'biginteger': {\n schemaAttributes[prop] = { type: 'string', pattern: '^\\\\d*$', example: '123456789' };\n break;\n }\n case 'json':\n case 'blocks': {\n schemaAttributes[prop] = {};\n break;\n }\n case 'uid': {\n schemaAttributes[prop] = { type: 'string' };\n break;\n }\n case 'component': {\n const componentAttributes = strapi.components[attribute.component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(attribute.component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(attribute.component),\n rawComponentSchema\n );\n\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n if (attribute.repeatable) {\n schemaAttributes[prop] = {\n type: 'array',\n items: finalComponentSchema,\n };\n } else {\n schemaAttributes[prop] = finalComponentSchema;\n }\n break;\n }\n case 'dynamiczone': {\n const components = attribute.components.map((component) => {\n const componentAttributes = strapi.components[component].attributes;\n const rawComponentSchema: OpenAPIV3.SchemaObject = {\n type: 'object',\n properties: {\n ...(isRequest ? {} : { id: { type: 'number' } }),\n __component: { type: 'string', enum: [component] },\n ...cleanSchemaAttributes(componentAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n }),\n },\n };\n\n const refComponentSchema: OpenAPIV3.ReferenceObject = {\n $ref: convertComponentName(component, true),\n };\n\n const componentExists = didAddStrapiComponentsToSchemas(\n convertComponentName(component),\n rawComponentSchema\n );\n const finalComponentSchema = componentExists ? refComponentSchema : rawComponentSchema;\n return finalComponentSchema;\n });\n let discriminator: OpenAPIV3.DiscriminatorObject | undefined;\n if (components.every((component) => Object.hasOwn(component, '$ref'))) {\n discriminator = {\n propertyName: '__component',\n mapping: attribute.components.reduce(\n (acc, component) => {\n acc[component] = convertComponentName(component, true);\n return acc;\n },\n {} as {\n [value: string]: string;\n }\n ),\n };\n }\n\n schemaAttributes[prop] = {\n type: 'array',\n items: {\n anyOf: components,\n },\n discriminator,\n };\n break;\n }\n case 'media': {\n const imageAttributes = strapi.contentType('plugin::upload.file').attributes;\n const isListOfEntities = attribute.multiple ?? false;\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(imageAttributes, { typeMap, didAddStrapiComponentsToSchemas })\n );\n break;\n }\n\n case 'relation': {\n const isListOfEntities = attribute.relation.includes('ToMany');\n\n if (isRequest) {\n const oneOfType: OpenAPIV3.SchemaObject = {\n oneOf: [{ type: 'integer' }, { type: 'string' }],\n example: 'string or id',\n };\n\n schemaAttributes[prop] = isListOfEntities\n ? { type: 'array', items: oneOfType }\n : oneOfType;\n break;\n }\n\n if (!('target' in attribute) || !attribute.target || typeMap.has(attribute.target)) {\n schemaAttributes[prop] = getSchemaData(isListOfEntities, {});\n\n break;\n }\n\n typeMap.set(attribute.target, true);\n const targetAttributes = strapi.contentType(attribute.target).attributes;\n\n schemaAttributes[prop] = getSchemaData(\n isListOfEntities,\n cleanSchemaAttributes(targetAttributes, {\n typeMap,\n isRequest,\n didAddStrapiComponentsToSchemas,\n })\n );\n\n break;\n }\n default: {\n // @ts-expect-error - This is a catch all for any other types\n throw new Error(`Invalid type ${attribute.type} while generating open api schema.`);\n }\n }\n }\n\n return schemaAttributes;\n};\n\nexport default cleanSchemaAttributes;\n"],"names":["convertComponentName","component","isRef","cleanComponentName","pascalCase","cleanSchemaAttributes","attributes","typeMap","Map","isRequest","didAddStrapiComponentsToSchemas","schemaAttributes","prop","Object","keys","attribute","type","format","example","Date","now","enum","pattern","componentAttributes","strapi","components","rawComponentSchema","properties","id","refComponentSchema","$ref","componentExists","finalComponentSchema","repeatable","items","map","__component","discriminator","every","hasOwn","propertyName","mapping","reduce","acc","anyOf","imageAttributes","contentType","isListOfEntities","multiple","oneOfType","oneOf","getSchemaData","relation","includes","target","has","set","targetAttributes","Error"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"loop-content-type-names.js","sources":["../../../../../server/src/services/helpers/utils/loop-content-type-names.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Api, ApiInfo } from '../../../types';\n\n/**\n * @description A reusable loop for building api endpoint paths and component schemas\n */\nconst loopContentTypeNames = (api: Api, callback: (info: ApiInfo) => any) => {\n let result = {};\n for (const contentTypeName of api.ctNames) {\n // Get the attributes found on the api's contentType\n const uid = `${api.getter}::${api.name}.${contentTypeName}`;\n\n const { attributes, info: contentTypeInfo, kind } = strapi.contentType(uid as any);\n\n // Get the routes for the current api\n const routeInfo =\n api.getter === 'plugin'\n ? // @ts-expect-error – TODO: fix this\n strapi.plugin(api.name).routes['content-api']\n : strapi.api(api.name).routes[contentTypeName];\n\n // Continue to next iteration if routeInfo is undefined\n if (!routeInfo) {\n continue;\n }\n\n // Uppercase the first letter of the api name\n const apiName = _.upperFirst(api.name);\n\n // Create a unique name if the api name and contentType name don't match\n const uniqueName =\n api.name === contentTypeName ? apiName : `${apiName} - ${_.upperFirst(contentTypeName)}`;\n\n const apiInfo = {\n ...api,\n routeInfo,\n attributes,\n uniqueName,\n contentTypeInfo,\n kind,\n };\n\n result = {\n ...result,\n ...callback(apiInfo),\n };\n }\n\n return result;\n};\n\nexport default loopContentTypeNames;\n"],"names":["loopContentTypeNames","api","callback","result","contentTypeName","ctNames","uid","getter","name","attributes","info","contentTypeInfo","kind","strapi","contentType","routeInfo","plugin","routes","apiName","_","upperFirst","uniqueName","apiInfo"],"mappings":";;;;AAIA;;IAGA,MAAMA,oBAAuB,GAAA,CAACC,GAAUC,EAAAA,QAAAA,GAAAA;AACtC,IAAA,IAAIC,SAAS,EAAC;AACd,IAAA,KAAK,MAAMC,eAAAA,IAAmBH,GAAII,CAAAA,OAAO,CAAE;;AAEzC,QAAA,MAAMC,GAAM,GAAA,CAAC,EAAEL,GAAAA,CAAIM,MAAM,CAAC,EAAE,EAAEN,GAAAA,CAAIO,IAAI,CAAC,CAAC,EAAEJ,gBAAgB,CAAC;QAE3D,MAAM,EAAEK,UAAU,EAAEC,IAAMC,EAAAA,eAAe,EAAEC,IAAI,EAAE,GAAGC,MAAOC,CAAAA,WAAW,CAACR,GAAAA,CAAAA;;QAGvE,MAAMS,SAAAA,GACJd,IAAIM,MAAM,KAAK,WAEXM,MAAOG,CAAAA,MAAM,CAACf,GAAAA,CAAIO,IAAI,CAAA,CAAES,MAAM,CAAC,aAAA,CAAc,GAC7CJ,MAAAA,CAAOZ,GAAG,CAACA,IAAIO,IAAI,CAAA,CAAES,MAAM,CAACb,eAAgB,CAAA;;AAGlD,QAAA,IAAI,CAACW,SAAW,EAAA;AACd,YAAA;AACF;;AAGA,QAAA,MAAMG,OAAUC,GAAAA,CAAAA,CAAEC,UAAU,CAACnB,IAAIO,IAAI,CAAA;;AAGrC,QAAA,MAAMa,UACJpB,GAAAA,GAAAA,CAAIO,IAAI,KAAKJ,kBAAkBc,OAAU,GAAA,CAAC,EAAEA,OAAAA,CAAQ,GAAG,EAAEC,CAAAA,CAAEC,UAAU,CAAChB,iBAAiB,CAAC;AAE1F,QAAA,MAAMkB,OAAU,GAAA;AACd,YAAA,GAAGrB,GAAG;AACNc,YAAAA,SAAAA;AACAN,YAAAA,UAAAA;AACAY,YAAAA,UAAAA;AACAV,YAAAA,eAAAA;AACAC,YAAAA;AACF,SAAA;QAEAT,MAAS,GAAA;AACP,YAAA,GAAGA,MAAM;AACT,YAAA,GAAGD,SAASoB,OAAQ;AACtB,SAAA;AACF;IAEA,OAAOnB,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"loop-content-type-names.js","sources":["../../../../../server/src/services/helpers/utils/loop-content-type-names.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Api, ApiInfo } from '../../../types';\n\n/**\n * @description A reusable loop for building api endpoint paths and component schemas\n */\nconst loopContentTypeNames = (api: Api, callback: (info: ApiInfo) => any) => {\n let result = {};\n for (const contentTypeName of api.ctNames) {\n // Get the attributes found on the api's contentType\n const uid = `${api.getter}::${api.name}.${contentTypeName}`;\n\n const { attributes, info: contentTypeInfo, kind } = strapi.contentType(uid as any);\n\n // Get the routes for the current api\n const routeInfo =\n api.getter === 'plugin'\n ? // @ts-expect-error – TODO: fix this\n strapi.plugin(api.name).routes['content-api']\n : strapi.api(api.name).routes[contentTypeName];\n\n // Continue to next iteration if routeInfo is undefined\n if (!routeInfo) {\n continue;\n }\n\n // Uppercase the first letter of the api name\n const apiName = _.upperFirst(api.name);\n\n // Create a unique name if the api name and contentType name don't match\n const uniqueName =\n api.name === contentTypeName ? apiName : `${apiName} - ${_.upperFirst(contentTypeName)}`;\n\n const apiInfo = {\n ...api,\n routeInfo,\n attributes,\n uniqueName,\n contentTypeInfo,\n kind,\n };\n\n result = {\n ...result,\n ...callback(apiInfo),\n };\n }\n\n return result;\n};\n\nexport default loopContentTypeNames;\n"],"names":["loopContentTypeNames","api","callback","result","contentTypeName","ctNames","uid","getter","name","attributes","info","contentTypeInfo","kind","strapi","contentType","routeInfo","plugin","routes","apiName","_","upperFirst","uniqueName","apiInfo"],"mappings":";;;;AAIA;;IAGA,MAAMA,oBAAuB,GAAA,CAACC,GAAUC,EAAAA,QAAAA,GAAAA;AACtC,IAAA,IAAIC,SAAS,EAAC;AACd,IAAA,KAAK,MAAMC,eAAAA,IAAmBH,GAAII,CAAAA,OAAO,CAAE;;AAEzC,QAAA,MAAMC,GAAM,GAAA,CAAA,EAAGL,GAAIM,CAAAA,MAAM,CAAC,EAAE,EAAEN,GAAAA,CAAIO,IAAI,CAAC,CAAC,EAAEJ,eAAiB,CAAA,CAAA;QAE3D,MAAM,EAAEK,UAAU,EAAEC,IAAMC,EAAAA,eAAe,EAAEC,IAAI,EAAE,GAAGC,MAAOC,CAAAA,WAAW,CAACR,GAAAA,CAAAA;;QAGvE,MAAMS,SAAAA,GACJd,IAAIM,MAAM,KAAK,WAEXM,MAAOG,CAAAA,MAAM,CAACf,GAAAA,CAAIO,IAAI,CAAA,CAAES,MAAM,CAAC,aAAA,CAAc,GAC7CJ,MAAAA,CAAOZ,GAAG,CAACA,IAAIO,IAAI,CAAA,CAAES,MAAM,CAACb,eAAgB,CAAA;;AAGlD,QAAA,IAAI,CAACW,SAAW,EAAA;AACd,YAAA;AACF;;AAGA,QAAA,MAAMG,OAAUC,GAAAA,CAAAA,CAAEC,UAAU,CAACnB,IAAIO,IAAI,CAAA;;AAGrC,QAAA,MAAMa,UACJpB,GAAAA,GAAAA,CAAIO,IAAI,KAAKJ,eAAkBc,GAAAA,OAAAA,GAAU,CAAGA,EAAAA,OAAAA,CAAQ,GAAG,EAAEC,CAAEC,CAAAA,UAAU,CAAChB,eAAkB,CAAA,CAAA,CAAA;AAE1F,QAAA,MAAMkB,OAAU,GAAA;AACd,YAAA,GAAGrB,GAAG;AACNc,YAAAA,SAAAA;AACAN,YAAAA,UAAAA;AACAY,YAAAA,UAAAA;AACAV,YAAAA,eAAAA;AACAC,YAAAA;AACF,SAAA;QAEAT,MAAS,GAAA;AACP,YAAA,GAAGA,MAAM;AACT,YAAA,GAAGD,SAASoB,OAAQ;AACtB,SAAA;AACF;IAEA,OAAOnB,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"loop-content-type-names.mjs","sources":["../../../../../server/src/services/helpers/utils/loop-content-type-names.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Api, ApiInfo } from '../../../types';\n\n/**\n * @description A reusable loop for building api endpoint paths and component schemas\n */\nconst loopContentTypeNames = (api: Api, callback: (info: ApiInfo) => any) => {\n let result = {};\n for (const contentTypeName of api.ctNames) {\n // Get the attributes found on the api's contentType\n const uid = `${api.getter}::${api.name}.${contentTypeName}`;\n\n const { attributes, info: contentTypeInfo, kind } = strapi.contentType(uid as any);\n\n // Get the routes for the current api\n const routeInfo =\n api.getter === 'plugin'\n ? // @ts-expect-error – TODO: fix this\n strapi.plugin(api.name).routes['content-api']\n : strapi.api(api.name).routes[contentTypeName];\n\n // Continue to next iteration if routeInfo is undefined\n if (!routeInfo) {\n continue;\n }\n\n // Uppercase the first letter of the api name\n const apiName = _.upperFirst(api.name);\n\n // Create a unique name if the api name and contentType name don't match\n const uniqueName =\n api.name === contentTypeName ? apiName : `${apiName} - ${_.upperFirst(contentTypeName)}`;\n\n const apiInfo = {\n ...api,\n routeInfo,\n attributes,\n uniqueName,\n contentTypeInfo,\n kind,\n };\n\n result = {\n ...result,\n ...callback(apiInfo),\n };\n }\n\n return result;\n};\n\nexport default loopContentTypeNames;\n"],"names":["loopContentTypeNames","api","callback","result","contentTypeName","ctNames","uid","getter","name","attributes","info","contentTypeInfo","kind","strapi","contentType","routeInfo","plugin","routes","apiName","_","upperFirst","uniqueName","apiInfo"],"mappings":";;AAIA;;IAGA,MAAMA,oBAAuB,GAAA,CAACC,GAAUC,EAAAA,QAAAA,GAAAA;AACtC,IAAA,IAAIC,SAAS,EAAC;AACd,IAAA,KAAK,MAAMC,eAAAA,IAAmBH,GAAII,CAAAA,OAAO,CAAE;;AAEzC,QAAA,MAAMC,GAAM,GAAA,CAAC,EAAEL,GAAAA,CAAIM,MAAM,CAAC,EAAE,EAAEN,GAAAA,CAAIO,IAAI,CAAC,CAAC,EAAEJ,gBAAgB,CAAC;QAE3D,MAAM,EAAEK,UAAU,EAAEC,IAAMC,EAAAA,eAAe,EAAEC,IAAI,EAAE,GAAGC,MAAOC,CAAAA,WAAW,CAACR,GAAAA,CAAAA;;QAGvE,MAAMS,SAAAA,GACJd,IAAIM,MAAM,KAAK,WAEXM,MAAOG,CAAAA,MAAM,CAACf,GAAAA,CAAIO,IAAI,CAAA,CAAES,MAAM,CAAC,aAAA,CAAc,GAC7CJ,MAAAA,CAAOZ,GAAG,CAACA,IAAIO,IAAI,CAAA,CAAES,MAAM,CAACb,eAAgB,CAAA;;AAGlD,QAAA,IAAI,CAACW,SAAW,EAAA;AACd,YAAA;AACF;;AAGA,QAAA,MAAMG,OAAUC,GAAAA,CAAAA,CAAEC,UAAU,CAACnB,IAAIO,IAAI,CAAA;;AAGrC,QAAA,MAAMa,UACJpB,GAAAA,GAAAA,CAAIO,IAAI,KAAKJ,kBAAkBc,OAAU,GAAA,CAAC,EAAEA,OAAAA,CAAQ,GAAG,EAAEC,CAAAA,CAAEC,UAAU,CAAChB,iBAAiB,CAAC;AAE1F,QAAA,MAAMkB,OAAU,GAAA;AACd,YAAA,GAAGrB,GAAG;AACNc,YAAAA,SAAAA;AACAN,YAAAA,UAAAA;AACAY,YAAAA,UAAAA;AACAV,YAAAA,eAAAA;AACAC,YAAAA;AACF,SAAA;QAEAT,MAAS,GAAA;AACP,YAAA,GAAGA,MAAM;AACT,YAAA,GAAGD,SAASoB,OAAQ;AACtB,SAAA;AACF;IAEA,OAAOnB,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"loop-content-type-names.mjs","sources":["../../../../../server/src/services/helpers/utils/loop-content-type-names.ts"],"sourcesContent":["import _ from 'lodash';\n\nimport type { Api, ApiInfo } from '../../../types';\n\n/**\n * @description A reusable loop for building api endpoint paths and component schemas\n */\nconst loopContentTypeNames = (api: Api, callback: (info: ApiInfo) => any) => {\n let result = {};\n for (const contentTypeName of api.ctNames) {\n // Get the attributes found on the api's contentType\n const uid = `${api.getter}::${api.name}.${contentTypeName}`;\n\n const { attributes, info: contentTypeInfo, kind } = strapi.contentType(uid as any);\n\n // Get the routes for the current api\n const routeInfo =\n api.getter === 'plugin'\n ? // @ts-expect-error – TODO: fix this\n strapi.plugin(api.name).routes['content-api']\n : strapi.api(api.name).routes[contentTypeName];\n\n // Continue to next iteration if routeInfo is undefined\n if (!routeInfo) {\n continue;\n }\n\n // Uppercase the first letter of the api name\n const apiName = _.upperFirst(api.name);\n\n // Create a unique name if the api name and contentType name don't match\n const uniqueName =\n api.name === contentTypeName ? apiName : `${apiName} - ${_.upperFirst(contentTypeName)}`;\n\n const apiInfo = {\n ...api,\n routeInfo,\n attributes,\n uniqueName,\n contentTypeInfo,\n kind,\n };\n\n result = {\n ...result,\n ...callback(apiInfo),\n };\n }\n\n return result;\n};\n\nexport default loopContentTypeNames;\n"],"names":["loopContentTypeNames","api","callback","result","contentTypeName","ctNames","uid","getter","name","attributes","info","contentTypeInfo","kind","strapi","contentType","routeInfo","plugin","routes","apiName","_","upperFirst","uniqueName","apiInfo"],"mappings":";;AAIA;;IAGA,MAAMA,oBAAuB,GAAA,CAACC,GAAUC,EAAAA,QAAAA,GAAAA;AACtC,IAAA,IAAIC,SAAS,EAAC;AACd,IAAA,KAAK,MAAMC,eAAAA,IAAmBH,GAAII,CAAAA,OAAO,CAAE;;AAEzC,QAAA,MAAMC,GAAM,GAAA,CAAA,EAAGL,GAAIM,CAAAA,MAAM,CAAC,EAAE,EAAEN,GAAAA,CAAIO,IAAI,CAAC,CAAC,EAAEJ,eAAiB,CAAA,CAAA;QAE3D,MAAM,EAAEK,UAAU,EAAEC,IAAMC,EAAAA,eAAe,EAAEC,IAAI,EAAE,GAAGC,MAAOC,CAAAA,WAAW,CAACR,GAAAA,CAAAA;;QAGvE,MAAMS,SAAAA,GACJd,IAAIM,MAAM,KAAK,WAEXM,MAAOG,CAAAA,MAAM,CAACf,GAAAA,CAAIO,IAAI,CAAA,CAAES,MAAM,CAAC,aAAA,CAAc,GAC7CJ,MAAAA,CAAOZ,GAAG,CAACA,IAAIO,IAAI,CAAA,CAAES,MAAM,CAACb,eAAgB,CAAA;;AAGlD,QAAA,IAAI,CAACW,SAAW,EAAA;AACd,YAAA;AACF;;AAGA,QAAA,MAAMG,OAAUC,GAAAA,CAAAA,CAAEC,UAAU,CAACnB,IAAIO,IAAI,CAAA;;AAGrC,QAAA,MAAMa,UACJpB,GAAAA,GAAAA,CAAIO,IAAI,KAAKJ,eAAkBc,GAAAA,OAAAA,GAAU,CAAGA,EAAAA,OAAAA,CAAQ,GAAG,EAAEC,CAAEC,CAAAA,UAAU,CAAChB,eAAkB,CAAA,CAAA,CAAA;AAE1F,QAAA,MAAMkB,OAAU,GAAA;AACd,YAAA,GAAGrB,GAAG;AACNc,YAAAA,SAAAA;AACAN,YAAAA,UAAAA;AACAY,YAAAA,UAAAA;AACAV,YAAAA,eAAAA;AACAC,YAAAA;AACF,SAAA;QAEAT,MAAS,GAAA;AACP,YAAA,GAAGA,MAAM;AACT,YAAA,GAAGD,SAASoB,OAAQ;AACtB,SAAA;AACF;IAEA,OAAOnB,MAAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/plugin-documentation",
3
- "version": "5.30.0",
3
+ "version": "5.30.1",
4
4
  "description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -59,10 +59,10 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@reduxjs/toolkit": "1.9.7",
62
- "@strapi/admin": "5.30.0",
62
+ "@strapi/admin": "5.30.1",
63
63
  "@strapi/design-system": "2.0.0-rc.30",
64
64
  "@strapi/icons": "2.0.0-rc.30",
65
- "@strapi/utils": "5.30.0",
65
+ "@strapi/utils": "5.30.1",
66
66
  "bcryptjs": "2.4.3",
67
67
  "cheerio": "^1.0.0",
68
68
  "formik": "2.4.5",
@@ -78,9 +78,9 @@
78
78
  },
79
79
  "devDependencies": {
80
80
  "@apidevtools/swagger-parser": "^10.1.0",
81
- "@strapi/admin-test-utils": "5.30.0",
82
- "@strapi/strapi": "5.30.0",
83
- "@strapi/types": "5.30.0",
81
+ "@strapi/admin-test-utils": "5.30.1",
82
+ "@strapi/strapi": "5.30.1",
83
+ "@strapi/types": "5.30.1",
84
84
  "@testing-library/react": "15.0.7",
85
85
  "@testing-library/user-event": "14.5.2",
86
86
  "@types/fs-extra": "11.0.4",