@strapi/plugin-documentation 5.0.0-beta.0 → 5.0.0-beta.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 (184) hide show
  1. package/README.md +0 -1
  2. package/dist/_chunks/{index-7xstUX8_.mjs → App-ig-uE4do.mjs} +48 -14
  3. package/dist/_chunks/App-ig-uE4do.mjs.map +1 -0
  4. package/dist/_chunks/{index-D1KkfApT.js → App-o4uH8gaQ.js} +73 -20
  5. package/dist/_chunks/App-o4uH8gaQ.js.map +1 -0
  6. package/dist/_chunks/{index-VpLAJXMs.mjs → Settings-3hsPOP_b.mjs} +64 -33
  7. package/dist/_chunks/Settings-3hsPOP_b.mjs.map +1 -0
  8. package/dist/_chunks/{index-NbPCucJl.js → Settings-XmOzLTUn.js} +69 -37
  9. package/dist/_chunks/Settings-XmOzLTUn.js.map +1 -0
  10. package/dist/_chunks/getTrad-bnElvR8_.js +5 -0
  11. package/dist/_chunks/getTrad-bnElvR8_.js.map +1 -0
  12. package/dist/_chunks/getTrad-md7Tjpcv.mjs +6 -0
  13. package/dist/_chunks/getTrad-md7Tjpcv.mjs.map +1 -0
  14. package/{server/public/index.html → dist/_chunks/index-MKWIGajW.mjs} +9 -4
  15. package/dist/_chunks/index-MKWIGajW.mjs.map +1 -0
  16. package/dist/_chunks/index-WbbYm9_u.js +75 -0
  17. package/dist/_chunks/index-WbbYm9_u.js.map +1 -0
  18. package/dist/_chunks/{index-NvJ4m2q5.mjs → index-jpDwTC-Q.mjs} +121 -117
  19. package/dist/_chunks/index-jpDwTC-Q.mjs.map +1 -0
  20. package/dist/_chunks/{index-r7HsQTou.js → index-vNbIS1u2.js} +119 -115
  21. package/dist/_chunks/index-vNbIS1u2.js.map +1 -0
  22. package/dist/_chunks/login-HAajOKpu.js +150 -0
  23. package/dist/_chunks/login-HAajOKpu.js.map +1 -0
  24. package/{server/public/login.html → dist/_chunks/login-slUa679p.mjs} +6 -1
  25. package/dist/_chunks/login-slUa679p.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -1
  27. package/dist/admin/index.mjs +2 -2
  28. package/dist/admin/src/components/SettingsForm.d.ts +8 -0
  29. package/dist/admin/src/constants.d.ts +18 -0
  30. package/dist/admin/src/index.d.ts +14 -0
  31. package/dist/admin/src/pages/App.d.ts +2 -0
  32. package/dist/admin/src/pages/Settings.d.ts +2 -0
  33. package/dist/admin/src/pluginId.d.ts +1 -0
  34. package/dist/admin/src/services/api.d.ts +25 -0
  35. package/dist/admin/src/types.d.ts +16 -0
  36. package/dist/admin/src/utils/baseQuery.d.ts +20 -0
  37. package/dist/admin/src/utils/getTrad.d.ts +1 -0
  38. package/dist/admin/src/utils/index.d.ts +2 -0
  39. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +2 -0
  40. package/dist/server/index.js +1263 -0
  41. package/dist/server/index.js.map +1 -0
  42. package/dist/server/index.mjs +1238 -0
  43. package/dist/server/index.mjs.map +1 -0
  44. package/dist/server/src/bootstrap.d.ts +5 -0
  45. package/dist/server/src/bootstrap.d.ts.map +1 -0
  46. package/dist/server/src/config/default-plugin-config.d.ts +3 -0
  47. package/dist/server/src/config/default-plugin-config.d.ts.map +1 -0
  48. package/dist/server/src/config/index.d.ts +4 -0
  49. package/dist/server/src/config/index.d.ts.map +1 -0
  50. package/dist/server/src/controllers/documentation.d.ts +12 -0
  51. package/dist/server/src/controllers/documentation.d.ts.map +1 -0
  52. package/dist/server/src/controllers/index.d.ts +14 -0
  53. package/dist/server/src/controllers/index.d.ts.map +1 -0
  54. package/dist/server/src/index.d.ts +91 -0
  55. package/dist/server/src/index.d.ts.map +1 -0
  56. package/dist/server/src/middlewares/documentation.d.ts +5 -0
  57. package/dist/server/src/middlewares/documentation.d.ts.map +1 -0
  58. package/dist/server/src/middlewares/restrict-access.d.ts +4 -0
  59. package/dist/server/src/middlewares/restrict-access.d.ts.map +1 -0
  60. package/dist/server/src/register.d.ts +5 -0
  61. package/dist/server/src/register.d.ts.map +1 -0
  62. package/dist/server/src/routes/index.d.ts +36 -0
  63. package/dist/server/src/routes/index.d.ts.map +1 -0
  64. package/dist/server/src/services/__mocks__/mock-content-types.d.ts +449 -0
  65. package/dist/server/src/services/__mocks__/mock-content-types.d.ts.map +1 -0
  66. package/dist/server/src/services/__mocks__/mock-strapi-data.d.ts +592 -0
  67. package/dist/server/src/services/__mocks__/mock-strapi-data.d.ts.map +1 -0
  68. package/dist/server/src/services/documentation.d.ts +36 -0
  69. package/dist/server/src/services/documentation.d.ts.map +1 -0
  70. package/dist/server/src/services/helpers/build-api-endpoint-path.d.ts +7 -0
  71. package/dist/server/src/services/helpers/build-api-endpoint-path.d.ts.map +1 -0
  72. package/dist/server/src/services/helpers/build-component-schema.d.ts +4 -0
  73. package/dist/server/src/services/helpers/build-component-schema.d.ts.map +1 -0
  74. package/dist/server/src/services/helpers/index.d.ts +4 -0
  75. package/dist/server/src/services/helpers/index.d.ts.map +1 -0
  76. package/dist/server/src/services/helpers/utils/clean-schema-attributes.d.ts +15 -0
  77. package/dist/server/src/services/helpers/utils/clean-schema-attributes.d.ts.map +1 -0
  78. package/dist/server/src/services/helpers/utils/get-api-responses.d.ts +15 -0
  79. package/dist/server/src/services/helpers/utils/get-api-responses.d.ts.map +1 -0
  80. package/dist/server/src/services/helpers/utils/get-schema-data.d.ts +12 -0
  81. package/dist/server/src/services/helpers/utils/get-schema-data.d.ts.map +1 -0
  82. package/dist/server/src/services/helpers/utils/loop-content-type-names.d.ts +7 -0
  83. package/dist/server/src/services/helpers/utils/loop-content-type-names.d.ts.map +1 -0
  84. package/dist/server/src/services/helpers/utils/pascal-case.d.ts +3 -0
  85. package/dist/server/src/services/helpers/utils/pascal-case.d.ts.map +1 -0
  86. package/dist/server/src/services/helpers/utils/query-params.d.ts +4 -0
  87. package/dist/server/src/services/helpers/utils/query-params.d.ts.map +1 -0
  88. package/dist/server/src/services/helpers/utils/routes.d.ts +3 -0
  89. package/dist/server/src/services/helpers/utils/routes.d.ts.map +1 -0
  90. package/dist/server/src/services/index.d.ts +43 -0
  91. package/dist/server/src/services/index.d.ts.map +1 -0
  92. package/dist/server/src/services/override.d.ts +21 -0
  93. package/dist/server/src/services/override.d.ts.map +1 -0
  94. package/dist/server/src/services/utils/get-plugins-that-need-documentation.d.ts +4 -0
  95. package/dist/server/src/services/utils/get-plugins-that-need-documentation.d.ts.map +1 -0
  96. package/dist/server/src/types.d.ts +28 -0
  97. package/dist/server/src/types.d.ts.map +1 -0
  98. package/dist/server/src/utils.d.ts +12 -0
  99. package/dist/server/src/utils.d.ts.map +1 -0
  100. package/package.json +33 -15
  101. package/strapi-server.js +1 -1
  102. package/.eslintignore +0 -1
  103. package/.eslintrc +0 -17
  104. package/admin/src/constants.js +0 -17
  105. package/admin/src/hooks/useDocumentation.js +0 -81
  106. package/admin/src/index.js +0 -62
  107. package/admin/src/pages/PluginPage/index.jsx +0 -212
  108. package/admin/src/pages/PluginPage/tests/index.test.jsx +0 -160
  109. package/admin/src/pages/SettingsPage/index.jsx +0 -202
  110. package/admin/src/pages/SettingsPage/tests/index.test.jsx +0 -72
  111. package/admin/src/pluginId.js +0 -5
  112. package/admin/src/translations/ar.json +0 -20
  113. package/admin/src/translations/cs.json +0 -21
  114. package/admin/src/translations/de.json +0 -26
  115. package/admin/src/translations/dk.json +0 -39
  116. package/admin/src/translations/en.json +0 -39
  117. package/admin/src/translations/es.json +0 -39
  118. package/admin/src/translations/fr.json +0 -26
  119. package/admin/src/translations/id.json +0 -24
  120. package/admin/src/translations/it.json +0 -26
  121. package/admin/src/translations/ko.json +0 -39
  122. package/admin/src/translations/ms.json +0 -23
  123. package/admin/src/translations/nl.json +0 -21
  124. package/admin/src/translations/pl.json +0 -39
  125. package/admin/src/translations/pt-BR.json +0 -21
  126. package/admin/src/translations/pt.json +0 -21
  127. package/admin/src/translations/ru.json +0 -39
  128. package/admin/src/translations/sk.json +0 -24
  129. package/admin/src/translations/sv.json +0 -39
  130. package/admin/src/translations/th.json +0 -24
  131. package/admin/src/translations/tr.json +0 -39
  132. package/admin/src/translations/uk.json +0 -23
  133. package/admin/src/translations/vi.json +0 -24
  134. package/admin/src/translations/zh-Hans.json +0 -28
  135. package/admin/src/translations/zh.json +0 -39
  136. package/admin/src/utils/getTrad.js +0 -5
  137. package/admin/src/utils/index.js +0 -2
  138. package/admin/src/utils/prefixPluginTranslations.js +0 -13
  139. package/dist/_chunks/index-7xstUX8_.mjs.map +0 -1
  140. package/dist/_chunks/index-D1KkfApT.js.map +0 -1
  141. package/dist/_chunks/index-NbPCucJl.js.map +0 -1
  142. package/dist/_chunks/index-NvJ4m2q5.mjs.map +0 -1
  143. package/dist/_chunks/index-VpLAJXMs.mjs.map +0 -1
  144. package/dist/_chunks/index-r7HsQTou.js.map +0 -1
  145. package/dist/_chunks/useDocumentation-6Ks-_Ms6.mjs +0 -68
  146. package/dist/_chunks/useDocumentation-6Ks-_Ms6.mjs.map +0 -1
  147. package/dist/_chunks/useDocumentation-S0e4mU-U.js +0 -67
  148. package/dist/_chunks/useDocumentation-S0e4mU-U.js.map +0 -1
  149. package/jest.config.front.js +0 -7
  150. package/jest.config.js +0 -6
  151. package/packup.config.ts +0 -22
  152. package/server/bootstrap.js +0 -54
  153. package/server/config/default-plugin-config.js +0 -35
  154. package/server/config/index.js +0 -7
  155. package/server/controllers/documentation.js +0 -241
  156. package/server/controllers/index.js +0 -7
  157. package/server/index.js +0 -17
  158. package/server/middlewares/documentation.js +0 -25
  159. package/server/middlewares/index.js +0 -7
  160. package/server/middlewares/restrict-access.js +0 -24
  161. package/server/register.js +0 -11
  162. package/server/routes/index.js +0 -84
  163. package/server/services/__mocks__/mock-content-types.js +0 -264
  164. package/server/services/__mocks__/mock-strapi-data.js +0 -183
  165. package/server/services/__tests__/build-component-schema.test.js +0 -761
  166. package/server/services/__tests__/documentation.test.js +0 -481
  167. package/server/services/__tests__/override.test.js +0 -85
  168. package/server/services/documentation.js +0 -246
  169. package/server/services/helpers/build-api-endpoint-path.js +0 -186
  170. package/server/services/helpers/build-component-schema.js +0 -254
  171. package/server/services/helpers/index.js +0 -9
  172. package/server/services/helpers/utils/clean-schema-attributes.js +0 -246
  173. package/server/services/helpers/utils/get-api-responses.js +0 -105
  174. package/server/services/helpers/utils/get-schema-data.js +0 -32
  175. package/server/services/helpers/utils/loop-content-type-names.js +0 -55
  176. package/server/services/helpers/utils/pascal-case.js +0 -9
  177. package/server/services/helpers/utils/query-params.js +0 -105
  178. package/server/services/helpers/utils/routes.js +0 -10
  179. package/server/services/index.js +0 -9
  180. package/server/services/override.js +0 -52
  181. package/server/services/utils/default-openapi-components.js +0 -40
  182. package/server/services/utils/get-plugins-that-need-documentation.js +0 -24
  183. package/tests/server.js +0 -37
  184. package/tests/setup.js +0 -15
@@ -1,481 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash/fp');
4
- const fse = require('fs-extra');
5
- const SwaggerParser = require('@apidevtools/swagger-parser');
6
- const { api, plugins, components, contentTypes } = require('../__mocks__/mock-strapi-data');
7
- const documentation = require('../documentation');
8
- const override = require('../override');
9
- const defaultConfig = require('../../config/default-plugin-config');
10
-
11
- const mockStrapiInstance = {
12
- dirs: {
13
- app: {
14
- api: './',
15
- extensions: './',
16
- },
17
- },
18
- contentTypes,
19
- components,
20
- api,
21
- plugins,
22
- config: {
23
- get: () => defaultConfig,
24
- },
25
- log: {
26
- info: jest.fn(),
27
- warn: jest.fn(),
28
- },
29
- };
30
-
31
- jest.mock('fs-extra', () => ({
32
- ...jest.requireActual('fs-extra'),
33
- writeJson: jest.fn(),
34
- ensureFile: jest.fn(),
35
- }));
36
-
37
- describe('Documentation plugin | Documentation service', () => {
38
- beforeAll(() => {
39
- global.strapi = mockStrapiInstance;
40
- global.strapi.contentType = jest.fn((uid) => {
41
- // Only deal with mocked data, return empty attributes for unmocked relations
42
- if (!global.strapi.contentTypes[uid]) return { attributes: {} };
43
-
44
- return global.strapi.contentTypes[uid];
45
- });
46
- global.strapi.plugin = jest.fn((name) => global.strapi.plugins[name]);
47
-
48
- global.strapi.plugins.documentation = {
49
- service: jest.fn((name) => {
50
- const mockServices = {
51
- override: override({ strapi: global.strapi }),
52
- };
53
-
54
- return mockServices[name];
55
- }),
56
- };
57
- });
58
-
59
- afterAll(() => {
60
- // Teardown the mocked strapi instance
61
- global.strapi = {};
62
- });
63
-
64
- afterEach(() => {
65
- // Reset the mocked strapi config
66
- global.strapi.config.get = () => defaultConfig;
67
- });
68
-
69
- it('generates a valid openapi schema', async () => {
70
- const docService = documentation({ strapi: global.strapi });
71
- await docService.generateFullDoc();
72
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
73
- const mockFinalDoc = lastMockCall[1];
74
-
75
- // The final documenation is read only, clone deep for this test
76
- const validatePromise = SwaggerParser.validate(_.cloneDeep(mockFinalDoc));
77
-
78
- await expect(validatePromise).resolves.not.toThrow();
79
- });
80
-
81
- it('generates the correct response component schema for a single type', async () => {
82
- const docService = documentation({ strapi: global.strapi });
83
- await docService.generateFullDoc();
84
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
85
- const mockFinalDoc = lastMockCall[1];
86
- const expected = {
87
- description: 'OK',
88
- content: {
89
- 'application/json': {
90
- schema: {
91
- $ref: '#/components/schemas/HomepageResponse',
92
- },
93
- },
94
- },
95
- };
96
- expect(mockFinalDoc.paths['/homepage'].get.responses['200']).toEqual(expected);
97
- expect(mockFinalDoc.paths['/homepage'].put.responses['200']).toEqual(expected);
98
- expect(mockFinalDoc.paths['/homepage'].post.responses['200']).toEqual(expected);
99
- });
100
-
101
- it('generates the correct response component schema for a collection type', async () => {
102
- const docService = documentation({ strapi: global.strapi });
103
- await docService.generateFullDoc();
104
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
105
- const mockFinalDoc = lastMockCall[1];
106
- const expectedList = {
107
- description: 'OK',
108
- content: {
109
- 'application/json': {
110
- schema: {
111
- $ref: '#/components/schemas/KitchensinkListResponse',
112
- },
113
- },
114
- },
115
- };
116
- const expectedOne = {
117
- description: 'OK',
118
- content: {
119
- 'application/json': {
120
- schema: {
121
- $ref: '#/components/schemas/KitchensinkResponse',
122
- },
123
- },
124
- },
125
- };
126
- expect(mockFinalDoc.paths['/kitchensinks'].get.responses['200']).toEqual(expectedList);
127
- expect(mockFinalDoc.paths['/kitchensinks'].post.responses['200']).toEqual(expectedOne);
128
- expect(mockFinalDoc.paths['/kitchensinks/{id}'].get.responses['200']).toEqual(expectedOne);
129
- expect(mockFinalDoc.paths['/kitchensinks/{id}'].put.responses['200']).toEqual(expectedOne);
130
- });
131
-
132
- describe('Determines the plugins that need documentation', () => {
133
- it('generates documentation for the default plugins if the user provided nothing in the config', async () => {
134
- const docService = documentation({ strapi: global.strapi });
135
-
136
- await docService.generateFullDoc();
137
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
138
- const mockFinalDoc = lastMockCall[1];
139
-
140
- expect(mockFinalDoc['x-strapi-config'].plugins).toEqual(['upload', 'users-permissions']);
141
- });
142
-
143
- it("generates documentation only for plugins in the user's config", async () => {
144
- global.strapi.config.get = () => ({
145
- ...defaultConfig,
146
- 'x-strapi-config': { ...defaultConfig['x-strapi-config'], plugins: ['upload'] },
147
- });
148
-
149
- const docService = documentation({ strapi: global.strapi });
150
-
151
- await docService.generateFullDoc();
152
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
153
- const mockFinalDoc = lastMockCall[1];
154
- expect(mockFinalDoc['x-strapi-config'].plugins).toEqual(['upload']);
155
- });
156
-
157
- it('does not generate documentation for any plugins', async () => {
158
- global.strapi.config.get = () => ({
159
- ...defaultConfig,
160
- 'x-strapi-config': { ...defaultConfig['x-strapi-config'], plugins: [] },
161
- });
162
-
163
- const docService = documentation({ strapi: global.strapi });
164
-
165
- await docService.generateFullDoc();
166
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
167
- const mockFinalDoc = lastMockCall[1];
168
- expect(mockFinalDoc['x-strapi-config'].plugins).toEqual([]);
169
- });
170
- });
171
-
172
- describe('Handles user config and overrides', () => {
173
- it('replaces default config with the user config', async () => {
174
- const userConfig = {
175
- info: {
176
- version: '4.0.0',
177
- title: 'custom-documentation',
178
- description: 'custom description',
179
- termsOfService: 'custom terms of service',
180
- contact: {
181
- name: 'custom-team',
182
- email: 'custom-contact-email@something.io',
183
- url: 'custom-mywebsite.io',
184
- },
185
- license: {
186
- name: 'custom Apache 2.0',
187
- url: 'custom https://www.apache.org/licenses/LICENSE-2.0.html',
188
- },
189
- },
190
- 'x-strapi-config': {
191
- path: 'custom-documentation',
192
- plugins: [],
193
- },
194
- servers: [{ server: 'custom-server' }],
195
- externalDocs: {
196
- description: 'custom Find out more',
197
- url: 'custom-doc-url',
198
- },
199
- webhooks: {
200
- test: {},
201
- },
202
- security: [
203
- {
204
- bearerAuth: ['custom'],
205
- },
206
- ],
207
- };
208
-
209
- global.strapi.config.get = () => ({ ...userConfig });
210
- const docService = documentation({ strapi: global.strapi });
211
- await docService.generateFullDoc();
212
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
213
- const mockFinalDoc = lastMockCall[1];
214
- // The generation data is dynamically added, it cannot be modified by the user
215
- const { 'x-generation-date': generationConfig, ...mockFinalDocInfo } = mockFinalDoc.info;
216
- expect(mockFinalDocInfo).toEqual(userConfig.info);
217
- expect(mockFinalDoc['x-strapi-config']).toEqual(userConfig['x-strapi-config']);
218
- expect(mockFinalDoc.externalDocs).toEqual(userConfig.externalDocs);
219
- expect(mockFinalDoc.security).toEqual(userConfig.security);
220
- expect(mockFinalDoc.webhooks).toEqual(userConfig.webhooks);
221
- expect(mockFinalDoc.servers).toEqual(userConfig.servers);
222
- });
223
-
224
- it("does not apply an override if the plugin providing the override isn't specified in the x-strapi-config.plugins", async () => {
225
- global.strapi.config.get = () => ({
226
- ...defaultConfig,
227
- 'x-strapi-config': { ...defaultConfig['x-strapi-config'], plugins: [] },
228
- });
229
- const docService = documentation({ strapi: global.strapi });
230
- const overrideService = override({ strapi: global.strapi });
231
-
232
- overrideService.registerOverride(
233
- {
234
- paths: {
235
- '/test': {
236
- get: {
237
- tags: ['Users-Permissions - Users & Roles'],
238
- summary: 'Get list of users',
239
- responses: {},
240
- },
241
- },
242
- },
243
- },
244
- { pluginOrigin: 'users-permissions' }
245
- );
246
-
247
- await docService.generateFullDoc();
248
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
249
- const mockFinalDoc = lastMockCall[1];
250
- expect(mockFinalDoc.paths['/test']).toBeUndefined();
251
- });
252
-
253
- it('overrides (extends) Tags', async () => {
254
- const overrideService = override({ strapi: global.strapi });
255
- // Simulate override from users-permissions plugin
256
- overrideService.registerOverride(
257
- {
258
- tags: ['users-permissions-tag'],
259
- },
260
- { pluginOrigin: 'users-permissions' }
261
- );
262
- // Simulate override from upload plugin
263
- overrideService.registerOverride(
264
- {
265
- tags: ['upload-tag'],
266
- },
267
- { pluginOrigin: 'upload' }
268
- );
269
- // Use the override service in the documentation service
270
- global.strapi.plugins.documentation = {
271
- service: jest.fn((name) => {
272
- const mockServices = {
273
- override: overrideService,
274
- };
275
-
276
- return mockServices[name];
277
- }),
278
- };
279
- const docService = documentation({ strapi: global.strapi });
280
- await docService.generateFullDoc();
281
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
282
- const mockFinalDoc = lastMockCall[1];
283
-
284
- expect(mockFinalDoc.tags).toEqual(['users-permissions-tag', 'upload-tag']);
285
- });
286
-
287
- it('overrides (replaces existing or adds new) Paths', async () => {
288
- const overrideService = override({ strapi: global.strapi });
289
- // Simulate override from upload plugin
290
- overrideService.registerOverride(
291
- {
292
- paths: {
293
- // This path exists after generating with mock data, replace it
294
- '/upload/files': {
295
- get: {
296
- responses: ['existing-path-test'],
297
- },
298
- },
299
- // This path does not exist after generating with mock data, add it
300
- '/upload/new-path': {
301
- get: {
302
- responses: ['new-path-test'],
303
- },
304
- },
305
- },
306
- },
307
- { pluginOrigin: 'upload' }
308
- );
309
- global.strapi.plugins.documentation = {
310
- service: jest.fn((name) => {
311
- const mockServices = {
312
- override: overrideService,
313
- };
314
-
315
- return mockServices[name];
316
- }),
317
- };
318
- const docService = documentation({ strapi: global.strapi });
319
- await docService.generateFullDoc();
320
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
321
- const mockFinalDoc = lastMockCall[1];
322
-
323
- expect(mockFinalDoc.paths['/upload/files'].get.responses).toEqual(['existing-path-test']);
324
- expect(Object.keys(mockFinalDoc.paths['/upload/files'].get)).toEqual(['responses']);
325
- expect(mockFinalDoc.paths['/upload/new-path'].get.responses).toEqual(['new-path-test']);
326
- });
327
-
328
- it('overrides (replaces existing or adds new) Components', async () => {
329
- const overrideService = override({ strapi: global.strapi });
330
- // Simulate override from upload plugin
331
- overrideService.registerOverride(
332
- {
333
- components: {
334
- schemas: {
335
- // This component schema exists after generating with mock data, replace it
336
- UploadFileResponse: {
337
- properties: {
338
- data: { $ref: 'test-existing-component' },
339
- meta: { type: 'object' },
340
- },
341
- },
342
- // This component schema does not exist after generating with mock data, add it
343
- UploadFileMockCompo: {
344
- properties: {
345
- data: { $ref: 'test-new-component' },
346
- meta: { type: 'object' },
347
- },
348
- },
349
- },
350
- },
351
- },
352
- { pluginOrigin: 'upload' }
353
- );
354
- global.strapi.plugins.documentation = {
355
- service: jest.fn((name) => {
356
- const mockServices = {
357
- override: overrideService,
358
- };
359
-
360
- return mockServices[name];
361
- }),
362
- };
363
- const docService = documentation({ strapi: global.strapi });
364
- await docService.generateFullDoc();
365
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
366
- const mockFinalDoc = lastMockCall[1];
367
-
368
- expect(mockFinalDoc.components.schemas.UploadFileResponse.properties.data.$ref).toEqual(
369
- 'test-existing-component'
370
- );
371
- expect(mockFinalDoc.components.schemas.UploadFileMockCompo.properties.data.$ref).toEqual(
372
- 'test-new-component'
373
- );
374
- });
375
- it('overrides only the specified version', async () => {
376
- const overrideService = override({ strapi: global.strapi });
377
- // Simulate override from upload plugin
378
- overrideService.registerOverride(
379
- {
380
- // Only override for version 1.0.0
381
- info: { version: '1.0.0' },
382
- components: {
383
- schemas: {
384
- // This component schema exists after generating with mock data, replace it
385
- ShouldNotBeAdded: {},
386
- },
387
- },
388
- },
389
- { pluginOrigin: 'upload' }
390
- );
391
- // Simulate override from upload plugin
392
- overrideService.registerOverride(
393
- {
394
- // Only override for version 2.0.0
395
- info: { version: '2.0.0' },
396
- components: {
397
- schemas: {
398
- // This component schema exists after generating with mock data, replace it
399
- ShouldBeAdded: {},
400
- },
401
- },
402
- },
403
- { pluginOrigin: 'upload' }
404
- );
405
- // Simulate override from upload plugin
406
- overrideService.registerOverride(
407
- {
408
- components: {
409
- schemas: {
410
- // This component schema exists after generating with mock data, replace it
411
- ShouldAlsoBeAdded: {},
412
- },
413
- },
414
- },
415
- { pluginOrigin: 'upload' }
416
- );
417
- global.strapi.plugins.documentation = {
418
- service: jest.fn((name) => {
419
- const mockServices = {
420
- override: overrideService,
421
- };
422
-
423
- return mockServices[name];
424
- }),
425
- };
426
- const docService = documentation({ strapi: global.strapi });
427
- await docService.generateFullDoc('2.0.0');
428
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
429
- const mockFinalDoc = lastMockCall[1];
430
-
431
- expect(mockFinalDoc.components.schemas.ShouldNotBeAdded).toBeUndefined();
432
- expect(mockFinalDoc.components.schemas.ShouldBeAdded).toBeDefined();
433
- expect(mockFinalDoc.components.schemas.ShouldAlsoBeAdded).toBeDefined();
434
- });
435
- it('excludes apis and plugins from generation', async () => {
436
- const overrideService = override({ strapi: global.strapi });
437
-
438
- overrideService.excludeFromGeneration('kitchensink');
439
-
440
- global.strapi.plugins.documentation = {
441
- service: jest.fn((name) => {
442
- const mockServices = {
443
- override: overrideService,
444
- };
445
-
446
- return mockServices[name];
447
- }),
448
- };
449
-
450
- const docService = documentation({ strapi: global.strapi });
451
- await docService.generateFullDoc();
452
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
453
- const mockFinalDoc = lastMockCall[1];
454
-
455
- expect(
456
- Object.keys(mockFinalDoc.paths).find((path) => path.includes('kitchensink'))
457
- ).toBeUndefined();
458
- expect(
459
- Object.keys(mockFinalDoc.components.schemas).find((compo) => compo.includes('Kitchensink'))
460
- ).toBeUndefined();
461
- });
462
- it("applies a user's mutateDocumentation function", async () => {
463
- global.strapi.config.get = () => ({
464
- ...defaultConfig,
465
- 'x-strapi-config': {
466
- ...defaultConfig['x-strapi-config'],
467
- mutateDocumentation(draft) {
468
- draft.paths['/kitchensinks'] = { get: { responses: { 200: { description: 'test' } } } };
469
- },
470
- },
471
- });
472
- const docService = documentation({ strapi: global.strapi });
473
- await docService.generateFullDoc();
474
- const lastMockCall = fse.writeJson.mock.calls[fse.writeJson.mock.calls.length - 1];
475
- const mockFinalDoc = lastMockCall[1];
476
- expect(mockFinalDoc.paths['/kitchensinks']).toEqual({
477
- get: { responses: { 200: { description: 'test' } } },
478
- });
479
- });
480
- });
481
- });
@@ -1,85 +0,0 @@
1
- 'use strict';
2
-
3
- const override = require('../override');
4
-
5
- const strapiMock = {
6
- config: {
7
- get: () => ({
8
- 'x-strapi-config': {
9
- plugins: null,
10
- },
11
- }),
12
- },
13
- };
14
-
15
- let strapi = strapiMock;
16
- describe('Documentation plugin | Override service', () => {
17
- afterEach(() => {
18
- // Reset strapi after each test
19
- strapi = strapiMock;
20
- });
21
-
22
- it('should register an override', () => {
23
- const mockOverride = {
24
- openapi: '3.0.0',
25
- info: {
26
- title: 'My API',
27
- version: '1.0.0',
28
- },
29
- };
30
- const overrideService = override({ strapi });
31
- overrideService.registerOverride(mockOverride);
32
-
33
- expect(overrideService.registeredOverrides).toEqual([mockOverride]);
34
- });
35
-
36
- it('should not register an override from a plugin that is not in the config', () => {
37
- const mockOverride = {
38
- openapi: '3.0.0',
39
- info: {
40
- title: 'My API',
41
- version: '1.0.0',
42
- },
43
- };
44
- const overrideService = override({ strapi });
45
- overrideService.registerOverride(mockOverride, { pluginOrigin: 'test' });
46
-
47
- expect(overrideService.registeredOverrides).toEqual([]);
48
- });
49
-
50
- it('should register an override from a plugin that is in the config and exclude it from generation', () => {
51
- const mockOverride = {
52
- openapi: '3.0.0',
53
- info: {
54
- title: 'My API',
55
- version: '1.0.0',
56
- },
57
- };
58
- strapi.config.get = () => ({
59
- 'x-strapi-config': {
60
- plugins: ['test'],
61
- },
62
- });
63
- const overrideService = override({ strapi });
64
- overrideService.registerOverride(mockOverride, {
65
- pluginOrigin: 'test',
66
- excludeFromGeneration: ['test', 'some-other-api-to-exclude'],
67
- });
68
-
69
- expect(overrideService.registeredOverrides).toEqual([mockOverride]);
70
- expect(overrideService.excludedFromGeneration).toEqual(['test', 'some-other-api-to-exclude']);
71
- });
72
-
73
- it('should register an api or plugin to exclude from generation', () => {
74
- const overrideService = override({ strapi });
75
- overrideService.excludeFromGeneration('my-api');
76
- overrideService.excludeFromGeneration(['my-other-api', 'my-plugin', 'my-other-plugin']);
77
-
78
- expect(overrideService.excludedFromGeneration).toEqual([
79
- 'my-api',
80
- 'my-other-api',
81
- 'my-plugin',
82
- 'my-other-plugin',
83
- ]);
84
- });
85
- });