@dani-builder/strapi-plugin-builder 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/AGENTS.md +18 -21
  2. package/LICENSE +21 -0
  3. package/README.md +61 -0
  4. package/dist/server/src/bootstrap.d.ts +1 -1
  5. package/dist/server/src/bootstrap.d.ts.map +1 -1
  6. package/dist/server/src/bootstrap.js +12 -1
  7. package/dist/server/src/bootstrap.js.map +1 -1
  8. package/dist/server/src/bootstrap.test.d.ts +2 -0
  9. package/dist/server/src/bootstrap.test.d.ts.map +1 -0
  10. package/dist/server/src/bootstrap.test.js +60 -0
  11. package/dist/server/src/bootstrap.test.js.map +1 -0
  12. package/dist/server/src/components/blocks/cta.json +13 -5
  13. package/dist/server/src/components/blocks/faq.json +1 -1
  14. package/dist/server/src/components/blocks/features.json +10 -5
  15. package/dist/server/src/components/blocks/hero.json +15 -6
  16. package/dist/server/src/components/blocks/highlights.json +9 -5
  17. package/dist/server/src/components/blocks/inquiry-form.json +3 -0
  18. package/dist/server/src/components/blocks/logo-cloud.json +6 -1
  19. package/dist/server/src/components/blocks/stats.json +9 -5
  20. package/dist/server/src/components/blocks/testimonials.json +10 -5
  21. package/dist/server/src/components/shared/bento-item.json +4 -4
  22. package/dist/server/src/components/shared/highlight-item.json +5 -5
  23. package/dist/server/src/components/shared/image.json +24 -0
  24. package/dist/server/src/components/shared/slider-item.json +5 -5
  25. package/dist/server/src/config/index.d.ts +15 -0
  26. package/dist/server/src/config/index.d.ts.map +1 -0
  27. package/dist/server/src/config/index.js +164 -0
  28. package/dist/server/src/config/index.js.map +1 -0
  29. package/dist/server/src/config/index.test.d.ts +2 -0
  30. package/dist/server/src/config/index.test.d.ts.map +1 -0
  31. package/dist/server/src/config/index.test.js +87 -0
  32. package/dist/server/src/config/index.test.js.map +1 -0
  33. package/dist/server/src/content-types/article/index.d.ts +146 -0
  34. package/dist/server/src/content-types/article/index.d.ts.map +1 -0
  35. package/dist/server/src/content-types/article/index.js +8 -0
  36. package/dist/server/src/content-types/article/index.js.map +1 -0
  37. package/dist/server/src/content-types/article/schema.json +104 -0
  38. package/dist/server/src/content-types/author/index.d.ts +56 -0
  39. package/dist/server/src/content-types/author/index.d.ts.map +1 -0
  40. package/dist/server/src/content-types/author/index.js +8 -0
  41. package/dist/server/src/content-types/author/index.js.map +1 -0
  42. package/dist/server/src/content-types/author/schema.json +48 -0
  43. package/dist/server/src/content-types/category/index.d.ts +71 -0
  44. package/dist/server/src/content-types/category/index.d.ts.map +1 -0
  45. package/dist/server/src/content-types/category/index.js +8 -0
  46. package/dist/server/src/content-types/category/index.js.map +1 -0
  47. package/dist/server/src/content-types/category/schema.json +45 -0
  48. package/dist/server/src/content-types/faq/index.d.ts +60 -0
  49. package/dist/server/src/content-types/faq/index.d.ts.map +1 -0
  50. package/dist/server/src/content-types/faq/index.js +8 -0
  51. package/dist/server/src/content-types/faq/index.js.map +1 -0
  52. package/dist/server/src/content-types/faq/schema.json +38 -0
  53. package/dist/server/src/content-types/global/index.d.ts +91 -0
  54. package/dist/server/src/content-types/global/index.d.ts.map +1 -0
  55. package/dist/server/src/content-types/global/index.js +8 -0
  56. package/dist/server/src/content-types/global/index.js.map +1 -0
  57. package/dist/server/src/content-types/global/schema.json +66 -0
  58. package/dist/server/src/content-types/index.d.ts +795 -0
  59. package/dist/server/src/content-types/index.d.ts.map +1 -0
  60. package/dist/server/src/content-types/index.js +30 -0
  61. package/dist/server/src/content-types/index.js.map +1 -0
  62. package/dist/server/src/content-types/inquiry/index.d.ts +48 -0
  63. package/dist/server/src/content-types/inquiry/index.d.ts.map +1 -0
  64. package/dist/server/src/content-types/inquiry/index.js +8 -0
  65. package/dist/server/src/content-types/inquiry/index.js.map +1 -0
  66. package/dist/server/src/content-types/inquiry/schema.json +40 -0
  67. package/dist/server/src/content-types/navigation/index.d.ts +80 -0
  68. package/dist/server/src/content-types/navigation/index.d.ts.map +1 -0
  69. package/dist/server/src/content-types/navigation/index.js +8 -0
  70. package/dist/server/src/content-types/navigation/index.js.map +1 -0
  71. package/dist/server/src/content-types/navigation/schema.json +54 -0
  72. package/dist/server/src/content-types/page/index.d.ts +78 -0
  73. package/dist/server/src/content-types/page/index.d.ts.map +1 -0
  74. package/dist/server/src/content-types/page/index.js +8 -0
  75. package/dist/server/src/content-types/page/index.js.map +1 -0
  76. package/dist/server/src/content-types/page/schema.json +64 -0
  77. package/dist/server/src/content-types/series/index.d.ts +68 -0
  78. package/dist/server/src/content-types/series/index.d.ts.map +1 -0
  79. package/dist/server/src/content-types/series/index.js +8 -0
  80. package/dist/server/src/content-types/series/index.js.map +1 -0
  81. package/dist/server/src/content-types/series/schema.json +46 -0
  82. package/dist/server/src/content-types/site-setting/index.d.ts +47 -0
  83. package/dist/server/src/content-types/site-setting/index.d.ts.map +1 -0
  84. package/dist/server/src/content-types/site-setting/index.js +8 -0
  85. package/dist/server/src/content-types/site-setting/index.js.map +1 -0
  86. package/dist/server/src/content-types/site-setting/schema.json +39 -0
  87. package/dist/server/src/content-types/tag/index.d.ts +68 -0
  88. package/dist/server/src/content-types/tag/index.d.ts.map +1 -0
  89. package/dist/server/src/content-types/tag/index.js +8 -0
  90. package/dist/server/src/content-types/tag/index.js.map +1 -0
  91. package/dist/server/src/content-types/tag/schema.json +46 -0
  92. package/dist/server/src/controllers/global.d.ts +1 -10
  93. package/dist/server/src/controllers/global.d.ts.map +1 -1
  94. package/dist/server/src/controllers/global.js +11 -4
  95. package/dist/server/src/controllers/global.js.map +1 -1
  96. package/dist/server/src/controllers/index.d.ts.map +1 -1
  97. package/dist/server/src/controllers/index.js +10 -0
  98. package/dist/server/src/controllers/index.js.map +1 -1
  99. package/dist/server/src/controllers/page.d.ts +11 -14
  100. package/dist/server/src/controllers/page.d.ts.map +1 -1
  101. package/dist/server/src/controllers/page.js +78 -9
  102. package/dist/server/src/controllers/page.js.map +1 -1
  103. package/dist/server/src/index.d.ts +1 -0
  104. package/dist/server/src/index.d.ts.map +1 -1
  105. package/dist/server/src/index.js +6 -0
  106. package/dist/server/src/index.js.map +1 -1
  107. package/dist/server/src/policies/index.d.ts +3 -0
  108. package/dist/server/src/policies/index.d.ts.map +1 -0
  109. package/dist/server/src/policies/index.js +13 -0
  110. package/dist/server/src/policies/index.js.map +1 -0
  111. package/dist/server/src/policies/rate-limit.d.ts +15 -0
  112. package/dist/server/src/policies/rate-limit.d.ts.map +1 -0
  113. package/dist/server/src/policies/rate-limit.js +39 -0
  114. package/dist/server/src/policies/rate-limit.js.map +1 -0
  115. package/dist/server/src/register.d.ts.map +1 -1
  116. package/dist/server/src/register.js +55 -2
  117. package/dist/server/src/register.js.map +1 -1
  118. package/dist/server/src/routes/content-api.d.ts +10 -13
  119. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  120. package/dist/server/src/routes/content-api.js +34 -30
  121. package/dist/server/src/routes/content-api.js.map +1 -1
  122. package/dist/server/src/routes/index.d.ts +10 -15
  123. package/dist/server/src/routes/index.d.ts.map +1 -1
  124. package/dist/server/src/routes/index.js +2 -1
  125. package/dist/server/src/routes/index.js.map +1 -1
  126. package/dist/server/src/services/index.d.ts.map +1 -1
  127. package/dist/server/src/services/index.js +12 -0
  128. package/dist/server/src/services/index.js.map +1 -1
  129. package/dist/server/src/services/populate.d.ts +1 -1
  130. package/dist/server/src/services/populate.d.ts.map +1 -1
  131. package/dist/server/src/services/populate.js +24 -11
  132. package/dist/server/src/services/populate.js.map +1 -1
  133. package/dist/server/src/utils/query.d.ts +11 -0
  134. package/dist/server/src/utils/query.d.ts.map +1 -0
  135. package/dist/server/src/utils/query.js +112 -0
  136. package/dist/server/src/utils/query.js.map +1 -0
  137. package/package.json +26 -15
  138. package/bin/sync.js +0 -320
  139. package/schemas/api/article/content-types/article/schema.json +0 -102
  140. package/schemas/api/author/content-types/author/schema.json +0 -44
  141. package/schemas/api/category/content-types/category/schema.json +0 -43
  142. package/schemas/api/faq/content-types/faq/schema.json +0 -36
  143. package/schemas/api/global/content-types/global/schema.json +0 -64
  144. package/schemas/api/inquiry/content-types/inquiry/schema.json +0 -31
  145. package/schemas/api/navigation/content-types/navigation/schema.json +0 -52
  146. package/schemas/api/page/content-types/page/schema.json +0 -62
  147. package/schemas/api/series/content-types/series/schema.json +0 -44
  148. package/schemas/api/site-setting/content-types/site-setting/schema.json +0 -35
  149. package/schemas/api/tag/content-types/tag/schema.json +0 -44
  150. package/schemas/manifest.json +0 -16
@@ -5,6 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const path_1 = __importDefault(require("path"));
7
7
  const fs_1 = __importDefault(require("fs"));
8
+ const PROXY_RATE_LIMIT_WARNING = 'Rate limiting uses request.ip, but server.proxy.koa is not enabled. ' +
9
+ 'When running behind a proxy or CDN, set server: { proxy: { koa: true } } ' +
10
+ 'to prevent all clients from sharing one rate-limit bucket.';
8
11
  function upperFirst(str) {
9
12
  return str.charAt(0).toUpperCase() + str.slice(1);
10
13
  }
@@ -19,18 +22,32 @@ function camelCase(str) {
19
22
  * and Content-Type Builder without manual schema creation.
20
23
  */
21
24
  const register = ({ strapi }) => {
25
+ if (!strapi.config.get('server.proxy.koa')) {
26
+ strapi.log.warn(PROXY_RATE_LIMIT_WARNING);
27
+ }
22
28
  const componentsDir = path_1.default.join(__dirname, 'components');
23
29
  const categories = ['blocks', 'elements', 'shared'];
24
30
  const componentsMap = {};
31
+ const componentRegistry = strapi.get('components');
25
32
  for (const category of categories) {
26
33
  const categoryDir = path_1.default.join(componentsDir, category);
27
34
  if (!fs_1.default.existsSync(categoryDir))
28
35
  continue;
29
- const files = fs_1.default.readdirSync(categoryDir).filter((f) => f.endsWith('.json'));
36
+ const files = fs_1.default
37
+ .readdirSync(categoryDir)
38
+ .filter((f) => f.endsWith('.json'));
30
39
  for (const file of files) {
31
40
  const schema = JSON.parse(fs_1.default.readFileSync(path_1.default.join(categoryDir, file), 'utf-8'));
32
41
  const componentName = file.replace('.json', '');
33
42
  const uid = `${category}.${componentName}`;
43
+ if (componentRegistry.get(uid)) {
44
+ const appComponentPath = `src/components/${category}/${file}`;
45
+ throw new Error(`Builder component UID conflict: "${uid}" is already registered by "${appComponentPath}". ` +
46
+ '플러그인 컴포넌트는 앱 파일로 덮어쓸 수 없습니다. ' +
47
+ `Remove "${appComponentPath}" and extend Builder through ` +
48
+ '"src/extensions/builder/strapi-server.ts" instead. ' +
49
+ 'Guide: https://github.com/HJ-company/daniworks-builder-v2/blob/main/docs/guides/extending-builder.md');
50
+ }
34
51
  componentsMap[uid] = {
35
52
  ...schema,
36
53
  __schema__: JSON.parse(JSON.stringify(schema)),
@@ -42,7 +59,43 @@ const register = ({ strapi }) => {
42
59
  };
43
60
  }
44
61
  }
45
- strapi.get('components').add(componentsMap);
62
+ componentRegistry.add(componentsMap);
63
+ const pluginConfig = strapi.config.get('plugin::builder');
64
+ const extraBlocks = Object.entries(pluginConfig.blocks.extra);
65
+ const page = strapi.contentTypes['plugin::builder.page'];
66
+ const global = strapi.contentTypes['plugin::builder.global'];
67
+ const pageBlocks = page.attributes.blocks;
68
+ const globalBlocks = global.attributes.siteWideBlocks;
69
+ const pageSchemaBlocks = page.__schema__.attributes
70
+ .blocks;
71
+ const globalSchemaBlocks = global.__schema__.attributes
72
+ .siteWideBlocks;
73
+ const populateService = strapi.plugin('builder').service('populate');
74
+ for (const [uid, populate] of extraBlocks) {
75
+ if (!componentRegistry.get(uid)) {
76
+ throw new Error(`[builder] config.blocks.extra references unknown component UID: "${uid}"`);
77
+ }
78
+ if (!pageBlocks.components.includes(uid)) {
79
+ pageBlocks.components.push(uid);
80
+ }
81
+ if (!pageSchemaBlocks.components.includes(uid)) {
82
+ pageSchemaBlocks.components.push(uid);
83
+ }
84
+ if (pluginConfig.blocks.includeInGlobal &&
85
+ !globalBlocks.components.includes(uid)) {
86
+ globalBlocks.components.push(uid);
87
+ }
88
+ if (pluginConfig.blocks.includeInGlobal &&
89
+ !globalSchemaBlocks.components.includes(uid)) {
90
+ globalSchemaBlocks.components.push(uid);
91
+ }
92
+ populateService.registerBlock(uid, populate, pluginConfig.blocks.includeInGlobal);
93
+ }
94
+ for (const [uid, extension] of Object.entries(pluginConfig.components)) {
95
+ const component = componentRegistry.get(uid);
96
+ Object.assign(component.attributes, extension.attributes);
97
+ Object.assign(component.__schema__.attributes, extension.attributes);
98
+ }
46
99
  };
47
100
  exports.default = register;
48
101
  //# sourceMappingURL=register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":";;;;;AACA,gDAAwB;AACxB,4CAAoB;AAEpB,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC/D,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAA2B,EAAE,EAAE;IACvD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,SAAS;QAE1C,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAE7E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAClF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,aAAa,EAAE,CAAC;YAE3C,aAAa,CAAC,GAAG,CAAC,GAAG;gBACnB,GAAG,MAAM;gBACT,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC9C,GAAG;gBACH,QAAQ;gBACR,SAAS,EAAE,WAAW;gBACtB,SAAS,EAAE,aAAa;gBACxB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;aACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../server/src/register.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,11 @@
1
- declare const _default: {
2
- type: string;
3
- routes: {
4
- method: string;
5
- path: string;
6
- handler: string;
7
- config: {
8
- policies: never[];
9
- description: string;
10
- };
11
- }[];
12
- };
13
- export default _default;
1
+ interface ContentApiRoute {
2
+ method: string;
3
+ path: string;
4
+ }
5
+ interface ContentApiRouter {
6
+ type: 'content-api';
7
+ routes: ContentApiRoute[] | (() => ContentApiRoute[]);
8
+ }
9
+ declare const contentApi: ContentApiRouter;
10
+ export default contentApi;
14
11
  //# sourceMappingURL=content-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wBA+BE"}
1
+ {"version":3,"file":"content-api.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":"AAEA,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;CACvD;AAyBD,QAAA,MAAM,UAAU,EAAE,gBAkBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,35 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = {
3
+ const strapi_1 = require("@strapi/strapi");
4
+ const contentTypes = [
5
+ 'plugin::builder.article',
6
+ 'plugin::builder.author',
7
+ 'plugin::builder.category',
8
+ 'plugin::builder.faq',
9
+ 'plugin::builder.global',
10
+ 'plugin::builder.navigation',
11
+ 'plugin::builder.page',
12
+ 'plugin::builder.series',
13
+ 'plugin::builder.site-setting',
14
+ 'plugin::builder.tag',
15
+ ];
16
+ let cachedRoutes;
17
+ function getCoreRoutes(uid, config) {
18
+ const router = strapi_1.factories.createCoreRouter(uid, config);
19
+ return typeof router.routes === 'function' ? router.routes() : router.routes;
20
+ }
21
+ const contentApi = {
4
22
  type: 'content-api',
5
- routes: [
6
- {
7
- method: 'GET',
8
- path: '/pages',
9
- handler: 'page.find',
10
- config: {
11
- policies: [],
12
- description: 'List pages with minimal populate',
13
- },
14
- },
15
- {
16
- method: 'GET',
17
- path: '/pages/:documentId',
18
- handler: 'page.findOne',
19
- config: {
20
- policies: [],
21
- description: 'Get single page with deep block populate',
22
- },
23
- },
24
- {
25
- method: 'GET',
26
- path: '/global',
27
- handler: 'global.find',
28
- config: {
29
- policies: [],
30
- description: 'Get global settings with deep populate',
31
- },
32
- },
33
- ],
23
+ get routes() {
24
+ // Strapi reads `.routes` several times while registering a plugin and
25
+ // annotates the first result with auth scopes. Keep the same route objects
26
+ // for every read so those annotations reach the registered router.
27
+ if (!cachedRoutes) {
28
+ const coreRoutes = contentTypes.flatMap((uid) => getCoreRoutes(uid));
29
+ const inquiryRoutes = getCoreRoutes('plugin::builder.inquiry', {
30
+ only: ['create'],
31
+ config: { create: { policies: ['plugin::builder.rate-limit'] } },
32
+ });
33
+ cachedRoutes = [...coreRoutes, ...inquiryRoutes];
34
+ }
35
+ return cachedRoutes;
36
+ },
34
37
  };
38
+ exports.default = contentApi;
35
39
  //# sourceMappingURL=content-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-api.js","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE;QACN;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,kCAAkC;aAChD;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,0CAA0C;aACxD;SACF;QACD;YACE,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,aAAa;YACtB,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,wCAAwC;aACtD;SACF;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"content-api.js","sourceRoot":"","sources":["../../../../server/src/routes/content-api.ts"],"names":[],"mappings":";;AAAA,2CAA2C;AAY3C,MAAM,YAAY,GAAG;IACnB,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;IAC1B,qBAAqB;IACrB,wBAAwB;IACxB,4BAA4B;IAC5B,sBAAsB;IACtB,wBAAwB;IACxB,8BAA8B;IAC9B,qBAAqB;CACb,CAAC;AAEX,IAAI,YAA2C,CAAC;AAEhD,SAAS,aAAa,CACpB,GAAqD,EACrD,MAAyE;IAEzE,MAAM,MAAM,GAAG,kBAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,GAAqB;IACnC,IAAI,EAAE,aAAa;IACnB,IAAI,MAAM;QACR,sEAAsE;QACtE,2EAA2E;QAC3E,mEAAmE;QACnE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;YACrE,MAAM,aAAa,GAAG,aAAa,CAAC,yBAAyB,EAAE;gBAC7D,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,4BAA4B,CAAC,EAAE,EAAE;aACjE,CAAC,CAAC;YAEH,YAAY,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,aAAa,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF,CAAC;AAEF,kBAAe,UAAU,CAAC"}
@@ -1,16 +1,11 @@
1
- declare const _default: {
2
- 'content-api': {
3
- type: string;
4
- routes: {
5
- method: string;
6
- path: string;
7
- handler: string;
8
- config: {
9
- policies: never[];
10
- description: string;
11
- };
12
- }[];
13
- };
14
- };
15
- export default _default;
1
+ interface ContentApiRoute {
2
+ method: string;
3
+ path: string;
4
+ }
5
+ interface ContentApiRouter {
6
+ type: 'content-api';
7
+ routes: ContentApiRoute[] | (() => ContentApiRoute[]);
8
+ }
9
+ declare const routes: Record<string, ContentApiRouter>;
10
+ export default routes;
16
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,wBAEE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":"AAEA,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;CACvD;AAED,QAAA,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAE5C,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -4,7 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const content_api_1 = __importDefault(require("./content-api"));
7
- exports.default = {
7
+ const routes = {
8
8
  'content-api': content_api_1.default,
9
9
  };
10
+ exports.default = routes;
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AAEvC,kBAAe;IACb,aAAa,EAAE,qBAAU;CAC1B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/routes/index.ts"],"names":[],"mappings":";;;;;AAAA,gEAAuC;AAYvC,MAAM,MAAM,GAAqC;IAC/C,aAAa,EAAE,qBAAU;CAC1B,CAAC;AAEF,kBAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAErC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAarC,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -3,9 +3,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strapi_1 = require("@strapi/strapi");
6
7
  const populate_1 = __importDefault(require("./populate"));
7
8
  const services = {
9
+ article: strapi_1.factories.createCoreService('plugin::builder.article'),
10
+ author: strapi_1.factories.createCoreService('plugin::builder.author'),
11
+ category: strapi_1.factories.createCoreService('plugin::builder.category'),
12
+ faq: strapi_1.factories.createCoreService('plugin::builder.faq'),
13
+ global: strapi_1.factories.createCoreService('plugin::builder.global'),
14
+ inquiry: strapi_1.factories.createCoreService('plugin::builder.inquiry'),
15
+ navigation: strapi_1.factories.createCoreService('plugin::builder.navigation'),
16
+ page: strapi_1.factories.createCoreService('plugin::builder.page'),
8
17
  populate: populate_1.default,
18
+ series: strapi_1.factories.createCoreService('plugin::builder.series'),
19
+ 'site-setting': strapi_1.factories.createCoreService('plugin::builder.site-setting'),
20
+ tag: strapi_1.factories.createCoreService('plugin::builder.tag'),
9
21
  };
10
22
  exports.default = services;
11
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAElC,MAAM,QAAQ,GAA4B;IACxC,QAAQ,EAAR,kBAAQ;CACT,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";;;;;AAAA,2CAA2C;AAC3C,0DAAkC;AAElC,MAAM,QAAQ,GAA4B;IACxC,OAAO,EAAE,kBAAS,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;IAC/D,MAAM,EAAE,kBAAS,CAAC,iBAAiB,CAAC,wBAAwB,CAAC;IAC7D,QAAQ,EAAE,kBAAS,CAAC,iBAAiB,CAAC,0BAA0B,CAAC;IACjE,GAAG,EAAE,kBAAS,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;IACvD,MAAM,EAAE,kBAAS,CAAC,iBAAiB,CAAC,wBAAwB,CAAC;IAC7D,OAAO,EAAE,kBAAS,CAAC,iBAAiB,CAAC,yBAAyB,CAAC;IAC/D,UAAU,EAAE,kBAAS,CAAC,iBAAiB,CAAC,4BAA4B,CAAC;IACrE,IAAI,EAAE,kBAAS,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;IACzD,QAAQ,EAAR,kBAAQ;IACR,MAAM,EAAE,kBAAS,CAAC,iBAAiB,CAAC,wBAAwB,CAAC;IAC7D,cAAc,EAAE,kBAAS,CAAC,iBAAiB,CAAC,8BAA8B,CAAC;IAC3E,GAAG,EAAE,kBAAS,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;CACxD,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
@@ -13,7 +13,7 @@ declare const populate: ({ strapi }: {
13
13
  * Register a custom block's populate configuration.
14
14
  * Called by client projects in their register() lifecycle.
15
15
  */
16
- registerBlock(componentId: string, populateConfig: object): void;
16
+ registerBlock(componentId: string, populateConfig: object, includeInGlobal?: boolean): void;
17
17
  /**
18
18
  * Get the full Dynamic Zone populate for Page.blocks
19
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../server/src/services/populate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,QAAA,MAAM,QAAQ,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;IAyJjD;;;OAGG;;;;IAKH;;;OAGG;+BACwB,MAAM,kBAAkB,MAAM;IAIzD;;OAEG;;;;IAUH;;OAEG;;;;;;;;;;;IAYH;;OAEG;;;;;;;;IAWH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;CA+CN,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../server/src/services/populate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,QAAA,MAAM,QAAQ,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;IAiKjD;;;OAGG;;;;IAKH;;;OAGG;+BAEY,MAAM,kBACH,MAAM;IAWxB;;OAEG;;;;IAUH;;OAEG;;;;;;;;;;;IAYH;;OAEG;;;;;;;;IAWH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;CA+CN,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const populate = ({ strapi }) => {
4
4
  const customBlocks = new Map();
5
+ const globalCustomBlocks = new Set();
5
6
  // Section populate — reused by nearly every block
6
7
  const sectionPopulate = {
7
8
  populate: {
@@ -10,13 +11,19 @@ const populate = ({ strapi }) => {
10
11
  };
11
12
  // Link populate — flat component, no nested relations
12
13
  const linkPopulate = true;
14
+ // shared.image — media + scalar fit/alt; one extra level (ADR 0003)
15
+ const imagePopulate = {
16
+ populate: {
17
+ media: true,
18
+ },
19
+ };
13
20
  // Core block populate definitions (Plugin owns these components,
14
21
  // so it knows the exact nesting structure)
15
22
  const coreBlocks = {
16
23
  'blocks.hero': {
17
24
  populate: {
18
25
  section: sectionPopulate,
19
- heroMedia: true,
26
+ image: imagePopulate,
20
27
  ctaLink: linkPopulate,
21
28
  secondaryLink: linkPopulate,
22
29
  },
@@ -24,7 +31,7 @@ const populate = ({ strapi }) => {
24
31
  'blocks.features': {
25
32
  populate: {
26
33
  section: sectionPopulate,
27
- media: true,
34
+ image: imagePopulate,
28
35
  items: {
29
36
  populate: {
30
37
  link: linkPopulate,
@@ -35,7 +42,7 @@ const populate = ({ strapi }) => {
35
42
  'blocks.cta': {
36
43
  populate: {
37
44
  section: sectionPopulate,
38
- ctaMedia: true,
45
+ image: imagePopulate,
39
46
  ctaLink: linkPopulate,
40
47
  secondaryLink: linkPopulate,
41
48
  },
@@ -46,7 +53,7 @@ const populate = ({ strapi }) => {
46
53
  items: {
47
54
  populate: {
48
55
  link: linkPopulate,
49
- media: true,
56
+ image: imagePopulate,
50
57
  },
51
58
  },
52
59
  },
@@ -69,10 +76,10 @@ const populate = ({ strapi }) => {
69
76
  'blocks.highlights': {
70
77
  populate: {
71
78
  section: sectionPopulate,
72
- media: true,
79
+ image: imagePopulate,
73
80
  items: {
74
81
  populate: {
75
- media: true,
82
+ image: imagePopulate,
76
83
  link: linkPopulate,
77
84
  },
78
85
  },
@@ -83,7 +90,7 @@ const populate = ({ strapi }) => {
83
90
  section: sectionPopulate,
84
91
  items: {
85
92
  populate: {
86
- media: true,
93
+ image: imagePopulate,
87
94
  link: linkPopulate,
88
95
  },
89
96
  },
@@ -92,7 +99,7 @@ const populate = ({ strapi }) => {
92
99
  'blocks.testimonials': {
93
100
  populate: {
94
101
  section: sectionPopulate,
95
- media: true,
102
+ image: imagePopulate,
96
103
  items: {
97
104
  populate: {
98
105
  avatar: true,
@@ -115,7 +122,7 @@ const populate = ({ strapi }) => {
115
122
  'blocks.stats': {
116
123
  populate: {
117
124
  section: sectionPopulate,
118
- media: true,
125
+ image: imagePopulate,
119
126
  items: true,
120
127
  },
121
128
  },
@@ -160,8 +167,14 @@ const populate = ({ strapi }) => {
160
167
  * Register a custom block's populate configuration.
161
168
  * Called by client projects in their register() lifecycle.
162
169
  */
163
- registerBlock(componentId, populateConfig) {
170
+ registerBlock(componentId, populateConfig, includeInGlobal = true) {
164
171
  customBlocks.set(componentId, populateConfig);
172
+ if (includeInGlobal) {
173
+ globalCustomBlocks.add(componentId);
174
+ }
175
+ else {
176
+ globalCustomBlocks.delete(componentId);
177
+ }
165
178
  },
166
179
  /**
167
180
  * Get the full Dynamic Zone populate for Page.blocks
@@ -219,7 +232,7 @@ const populate = ({ strapi }) => {
219
232
  }
220
233
  // Also include any custom blocks registered for siteWideBlocks
221
234
  for (const [key, value] of customBlocks) {
222
- if (!siteWideOn[key]) {
235
+ if (globalCustomBlocks.has(key) && !siteWideOn[key]) {
223
236
  siteWideOn[key] = value;
224
237
  }
225
238
  }
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../../../server/src/services/populate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"populate.js","sourceRoot":"","sources":["../../../../server/src/services/populate.ts"],"names":[],"mappings":";;AAEA,MAAM,QAAQ,GAAG,CAAC,EAAE,MAAM,EAA2B,EAAE,EAAE;IACvD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE7C,kDAAkD;IAClD,MAAM,eAAe,GAAG;QACtB,QAAQ,EAAE;YACR,eAAe,EAAE,IAAI;SACtB;KACF,CAAC;IAEF,sDAAsD;IACtD,MAAM,YAAY,GAAG,IAAI,CAAC;IAE1B,oEAAoE;IACpE,MAAM,aAAa,GAAG;QACpB,QAAQ,EAAE;YACR,KAAK,EAAE,IAAI;SACZ;KACF,CAAC;IAEF,iEAAiE;IACjE,2CAA2C;IAC3C,MAAM,UAAU,GAA2B;QACzC,aAAa,EAAE;YACb,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,YAAY;gBACrB,aAAa,EAAE,YAAY;aAC5B;SACF;QACD,iBAAiB,EAAE;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF;SACF;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,OAAO,EAAE,YAAY;gBACrB,aAAa,EAAE,YAAY;aAC5B;SACF;QACD,eAAe,EAAE;YACf,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,IAAI,EAAE,YAAY;wBAClB,KAAK,EAAE,aAAa;qBACrB;iBACF;aACF;SACF;QACD,qBAAqB,EAAE;YACrB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;aACzB;SACF;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF;SACF;QACD,mBAAmB,EAAE;YACnB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,KAAK,EAAE,aAAa;wBACpB,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF;SACF;QACD,mBAAmB,EAAE;YACnB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,KAAK,EAAE,aAAa;wBACpB,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF;SACF;QACD,qBAAqB,EAAE;YACrB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,MAAM,EAAE,IAAI;wBACZ,IAAI,EAAE,IAAI;qBACX;iBACF;aACF;SACF;QACD,mBAAmB,EAAE;YACnB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF;SACF;QACD,cAAc,EAAE;YACd,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,aAAa;gBACpB,KAAK,EAAE,IAAI;aACZ;SACF;QACD,gBAAgB,EAAE;YAChB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,OAAO,EAAE,YAAY;qBACtB;iBACF;aACF;SACF;QACD,gBAAgB,EAAE;YAChB,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;aACzB;SACF;QACD,aAAa,EAAE;YACb,QAAQ,EAAE;gBACR,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE;oBACL,QAAQ,EAAE;wBACR,KAAK,EAAE,IAAI;wBACX,WAAW,EAAE,YAAY;qBAC1B;iBACF;aACF;SACF;QACD,8EAA8E;QAC9E,kBAAkB,EAAE,eAAe;KACpC,CAAC;IAEF,OAAO;QACL;;;WAGG;QACH,mBAAmB;YACjB,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,CAAC;QAED;;;WAGG;QACH,aAAa,CACX,WAAmB,EACnB,cAAsB,EACtB,eAAe,GAAG,IAAI;YAEtB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC9C,IAAI,eAAe,EAAE,CAAC;gBACpB,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED;;WAEG;QACH,qBAAqB;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrD,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QAC5B,CAAC;QAED;;WAEG;QACH,eAAe;YACb,OAAO;gBACL,GAAG,EAAE;oBACH,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI;qBACd;iBACF;gBACD,MAAM,EAAE,IAAI,CAAC,qBAAqB,EAAE;aACrC,CAAC;QACJ,CAAC;QAED;;WAEG;QACH,mBAAmB;YACjB,OAAO;gBACL,GAAG,EAAE;oBACH,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI;qBACd;iBACF;aACF,CAAC;QACJ,CAAC;QAED;;WAEG;QACH,iBAAiB;YACf,yCAAyC;YACzC,MAAM,iBAAiB,GAAG;gBACxB,eAAe;gBACf,qBAAqB;gBACrB,aAAa;gBACb,iBAAiB;aAClB,CAAC;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7C,MAAM,UAAU,GAA2B,EAAE,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;gBACpC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YACD,+DAA+D;YAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;gBACxC,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpD,UAAU,CAAC,GAAG,CAAC,GAAG,KAAe,CAAC;gBACpC,CAAC;YACH,CAAC;YAED,OAAO;gBACL,GAAG,EAAE;oBACH,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI;qBACd;iBACF;gBACD,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE;oBACN,QAAQ,EAAE;wBACR,WAAW,EAAE,YAAY;wBACzB,UAAU,EAAE,YAAY;wBACxB,OAAO,EAAE;4BACP,QAAQ,EAAE;gCACR,KAAK,EAAE,YAAY;6BACpB;yBACF;wBACD,IAAI,EAAE,IAAI;qBACX;iBACF;gBACD,cAAc,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;gBAClC,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,QAAQ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface PublicQueryOptions {
2
+ /**
3
+ * Top-level field names a caller may filter/sort on (exact key match, not
4
+ * nested relation paths). Omit to drop filters/sort entirely.
5
+ */
6
+ filterFields?: string[];
7
+ }
8
+ export declare function pickPublicQuery(query?: Record<string, unknown>, opts?: PublicQueryOptions): Record<string, unknown>;
9
+ /** Public, non-PII scalar fields a caller may filter/sort pages by. */
10
+ export declare const PAGE_PUBLIC_FIELDS: string[];
11
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/query.ts"],"names":[],"mappings":"AA+EA,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,eAAe,CAC7B,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACnC,IAAI,GAAE,kBAAuB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgBzB;AAED,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,UAO9B,CAAC"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PAGE_PUBLIC_FIELDS = void 0;
4
+ exports.pickPublicQuery = pickPublicQuery;
5
+ /**
6
+ * Whitelist the query params a public smart-API request may forward to the
7
+ * Document Service.
8
+ *
9
+ * The smart-API controllers pin `populate` and `status` server-side, but they
10
+ * previously spread the *entire* `ctx.query` into the Document Service call.
11
+ * Crucially, the Document Service bypasses the Content API sanitize/validate
12
+ * layer, so any params reach the DB raw. That let a caller pass arbitrary keys
13
+ * (e.g. `publicationState`, unexpected `populate` shapes) and — via
14
+ * `filters`/`sort` on internal relations such as `createdBy` — probe admin PII
15
+ * as an oracle (existence/ordering leaks).
16
+ *
17
+ * Only the keys below are forwarded for anonymous read traffic, and `filters`
18
+ * / `sort` are additionally constrained to an allowlist of public top-level
19
+ * field names (see `filterFields`). `fields` is intentionally NOT forwarded —
20
+ * the smart API returns a fixed server-shaped payload, so callers have no need
21
+ * to project, and dropping it removes an arbitrary projection surface.
22
+ * `populate`/`status` are set by the controller after the whitelisted spread,
23
+ * so they cannot be overridden or smuggled through.
24
+ */
25
+ const ALLOWED_QUERY_KEYS = ['locale', 'sort', 'pagination', 'filters'];
26
+ const LOGICAL_OPERATORS = new Set(['$and', '$or', '$not']);
27
+ /**
28
+ * Recursively strip filter field paths that are not in `allowed`. Logical
29
+ * operators ($and/$or/$not) are preserved and their operands recursed. A field
30
+ * key that survives keeps its operator object (e.g. `{ $eq: 'home' }`) intact.
31
+ *
32
+ * `allowed` matches TOP-LEVEL field names only. Nested relation paths such as
33
+ * `category.slug` are not supported here (a `{ category: { slug } }` filter
34
+ * would be dropped) — the page/global smart APIs only need flat scalar filters
35
+ * (slug/title/locale/timestamps), and relations stay closed by design.
36
+ */
37
+ function sanitizeFilters(filters, allowed) {
38
+ if (!filters || typeof filters !== 'object')
39
+ return undefined;
40
+ if (Array.isArray(filters)) {
41
+ const arr = filters
42
+ .map((f) => sanitizeFilters(f, allowed))
43
+ .filter((f) => f !== undefined);
44
+ return arr.length ? arr : undefined;
45
+ }
46
+ const out = {};
47
+ for (const [key, val] of Object.entries(filters)) {
48
+ if (LOGICAL_OPERATORS.has(key)) {
49
+ const nested = sanitizeFilters(val, allowed);
50
+ if (nested !== undefined)
51
+ out[key] = nested;
52
+ }
53
+ else if (allowed.includes(key)) {
54
+ out[key] = val;
55
+ }
56
+ // disallowed field keys (e.g. createdBy, updatedBy, private fields) dropped
57
+ }
58
+ return Object.keys(out).length ? out : undefined;
59
+ }
60
+ /** Keep only sort clauses whose field is in `allowed`. Supports the string,
61
+ * array-of-strings, and object forms Strapi accepts. */
62
+ function sanitizeSort(sort, allowed) {
63
+ const fieldOf = (s) => s.split(':')[0];
64
+ const okStr = (s) => typeof s === 'string' && allowed.includes(fieldOf(s));
65
+ if (typeof sort === 'string')
66
+ return okStr(sort) ? sort : undefined;
67
+ if (Array.isArray(sort)) {
68
+ const arr = sort.filter(okStr);
69
+ return arr.length ? arr : undefined;
70
+ }
71
+ if (sort && typeof sort === 'object') {
72
+ const out = {};
73
+ for (const [k, v] of Object.entries(sort)) {
74
+ if (allowed.includes(k))
75
+ out[k] = v;
76
+ }
77
+ return Object.keys(out).length ? out : undefined;
78
+ }
79
+ return undefined;
80
+ }
81
+ function pickPublicQuery(query = {}, opts = {}) {
82
+ const allowed = opts.filterFields ?? [];
83
+ const out = {};
84
+ for (const key of ALLOWED_QUERY_KEYS) {
85
+ if (query[key] === undefined)
86
+ continue;
87
+ if (key === 'filters') {
88
+ const scoped = sanitizeFilters(query.filters, allowed);
89
+ if (scoped !== undefined)
90
+ out.filters = scoped;
91
+ }
92
+ else if (key === 'sort') {
93
+ const scoped = sanitizeSort(query.sort, allowed);
94
+ if (scoped !== undefined)
95
+ out.sort = scoped;
96
+ }
97
+ else {
98
+ out[key] = query[key];
99
+ }
100
+ }
101
+ return out;
102
+ }
103
+ /** Public, non-PII scalar fields a caller may filter/sort pages by. */
104
+ exports.PAGE_PUBLIC_FIELDS = [
105
+ 'slug',
106
+ 'title',
107
+ 'locale',
108
+ 'createdAt',
109
+ 'updatedAt',
110
+ 'publishedAt',
111
+ ];
112
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../server/src/utils/query.ts"],"names":[],"mappings":"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"}