@sitecore-content-sdk/nextjs 2.3.0 → 2.4.0-canary.20260819212348

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 (36) hide show
  1. package/dist/cjs/editing/codegen/index.js +2 -2
  2. package/dist/cjs/editing/editing-endpoint-auth.js +61 -0
  3. package/dist/cjs/editing/experimental-features-middleware.js +55 -0
  4. package/dist/cjs/editing/index.js +7 -1
  5. package/dist/cjs/experimental-features/index.js +7 -0
  6. package/dist/cjs/experimental.json +14 -0
  7. package/dist/cjs/route-handler/experimental-features-route-handler.js +83 -0
  8. package/dist/cjs/route-handler/index.js +3 -1
  9. package/dist/esm/editing/codegen/index.js +1 -1
  10. package/dist/esm/editing/editing-endpoint-auth.js +53 -0
  11. package/dist/esm/editing/experimental-features-middleware.js +48 -0
  12. package/dist/esm/editing/index.js +2 -0
  13. package/dist/esm/experimental-features/index.js +1 -0
  14. package/dist/esm/experimental.json +14 -0
  15. package/dist/esm/route-handler/experimental-features-route-handler.js +76 -0
  16. package/dist/esm/route-handler/index.js +1 -0
  17. package/experimental.d.ts +1 -0
  18. package/package.json +8 -3
  19. package/types/editing/codegen/index.d.ts +1 -1
  20. package/types/editing/codegen/index.d.ts.map +1 -1
  21. package/types/editing/editing-endpoint-auth.d.ts +42 -0
  22. package/types/editing/editing-endpoint-auth.d.ts.map +1 -0
  23. package/types/editing/experimental-features-middleware.d.ts +18 -0
  24. package/types/editing/experimental-features-middleware.d.ts.map +1 -0
  25. package/types/editing/index.d.ts +3 -0
  26. package/types/editing/index.d.ts.map +1 -1
  27. package/types/experimental-features/index.d.ts +7 -0
  28. package/types/experimental-features/index.d.ts.map +1 -0
  29. package/types/route-handler/experimental-features-route-handler.d.ts +15 -0
  30. package/types/route-handler/experimental-features-route-handler.d.ts.map +1 -0
  31. package/types/route-handler/index.d.ts +1 -0
  32. package/types/route-handler/index.d.ts.map +1 -1
  33. package/dist/cjs/editing/codegen/import-map-utils.js +0 -38
  34. package/dist/esm/editing/codegen/import-map-utils.js +0 -34
  35. package/types/editing/codegen/import-map-utils.d.ts +0 -10
  36. package/types/editing/codegen/import-map-utils.d.ts.map +0 -1
@@ -5,5 +5,5 @@ var import_map_1 = require("./import-map");
5
5
  Object.defineProperty(exports, "defaultImportEntries", { enumerable: true, get: function () { return import_map_1.defaultImportEntries; } });
6
6
  var import_map_server_1 = require("./import-map-server");
7
7
  Object.defineProperty(exports, "defaultServerImportEntries", { enumerable: true, get: function () { return import_map_server_1.defaultServerImportEntries; } });
8
- var import_map_utils_1 = require("./import-map-utils");
9
- Object.defineProperty(exports, "combineImportEntries", { enumerable: true, get: function () { return import_map_utils_1.combineImportEntries; } });
8
+ var tools_1 = require("@sitecore-content-sdk/content/tools");
9
+ Object.defineProperty(exports, "combineImportEntries", { enumerable: true, get: function () { return tools_1.combineImportEntries; } });
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getEditingSecretQueryParamName = exports.authorizeEditingEndpointRequest = void 0;
7
+ const editing_1 = require("@sitecore-content-sdk/content/editing");
8
+ const tools_1 = require("@sitecore-content-sdk/core/tools");
9
+ const debug_1 = __importDefault(require("../debug"));
10
+ const utils_1 = require("../utils/utils");
11
+ /**
12
+ * Shared CORS + editing-secret authorization used by Pages Router middleware and
13
+ * App Router route handlers for editing endpoints.
14
+ * @param {object} params - Request authorization inputs.
15
+ * @param {string | undefined} params.method - HTTP method.
16
+ * @param {HeaderBag} params.headers - Request headers.
17
+ * @param {string | string[] | null | undefined} params.secret - Editing secret from query/search params.
18
+ * @param {string | undefined} [params.presetCorsHeader] - Existing Access-Control-Allow-Origin header if any.
19
+ * @param {boolean} [params.requireSecret=true] - When false, only CORS is validated (e.g. OPTIONS may still check secret depending on caller).
20
+ * @returns {EditingEndpointAuthResult} Authorization result.
21
+ * @internal
22
+ */
23
+ const authorizeEditingEndpointRequest = (params) => {
24
+ const { method, headers, secret, presetCorsHeader, requireSecret = true } = params;
25
+ const corsHeaders = (0, tools_1.getEnforcedCorsHeaders)({
26
+ requestMethod: method,
27
+ headers: headers,
28
+ presetCorsHeader,
29
+ allowedOrigins: editing_1.EDITING_ALLOWED_ORIGINS,
30
+ });
31
+ if (!corsHeaders) {
32
+ debug_1.default.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
33
+ return {
34
+ ok: false,
35
+ status: 401,
36
+ body: { message: 'Invalid origin' },
37
+ };
38
+ }
39
+ if (requireSecret) {
40
+ const secretValue = Array.isArray(secret) ? secret[0] : secret !== null && secret !== void 0 ? secret : undefined;
41
+ const expectedSecret = (0, utils_1.getEditingSecret)();
42
+ if (secretValue !== expectedSecret) {
43
+ debug_1.default.editing('invalid editing secret - sent "%s" expected "%s"', secretValue, expectedSecret);
44
+ return {
45
+ ok: false,
46
+ status: 401,
47
+ body: { message: 'Missing or invalid editing secret' },
48
+ corsHeaders,
49
+ };
50
+ }
51
+ }
52
+ return { ok: true, corsHeaders };
53
+ };
54
+ exports.authorizeEditingEndpointRequest = authorizeEditingEndpointRequest;
55
+ /**
56
+ * Reads the editing secret query param name used by editing endpoints.
57
+ * @returns {string} Query parameter name for the editing secret.
58
+ * @internal
59
+ */
60
+ const getEditingSecretQueryParamName = () => editing_1.QUERY_PARAM_EDITING_SECRET;
61
+ exports.getEditingSecretQueryParamName = getEditingSecretQueryParamName;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ExperimentalFeaturesMiddleware = void 0;
7
+ const experimental_1 = require("@sitecore-content-sdk/content/experimental");
8
+ const debug_1 = __importDefault(require("../debug"));
9
+ const editing_endpoint_auth_1 = require("./editing-endpoint-auth");
10
+ const experimental_json_1 = __importDefault(require("../experimental.json"));
11
+ const experimentalFeaturesCatalog = experimental_json_1.default;
12
+ /**
13
+ * Middleware / handler used in the experimental features API route
14
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
15
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
16
+ *
17
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
18
+ * @public
19
+ */
20
+ class ExperimentalFeaturesMiddleware {
21
+ constructor() {
22
+ this.handler = async (_req, res) => {
23
+ const auth = (0, editing_endpoint_auth_1.authorizeEditingEndpointRequest)({
24
+ method: _req.method,
25
+ headers: _req.headers,
26
+ secret: _req.query[(0, editing_endpoint_auth_1.getEditingSecretQueryParamName)()],
27
+ presetCorsHeader: res === null || res === void 0 ? void 0 : res.getHeader('Access-Control-Allow-Origin'),
28
+ });
29
+ if (!auth.ok) {
30
+ if (auth.corsHeaders) {
31
+ Object.keys(auth.corsHeaders).forEach((key) => {
32
+ res.setHeader(key, auth.corsHeaders[key]);
33
+ });
34
+ }
35
+ return res.status(auth.status).json(auth.body);
36
+ }
37
+ Object.keys(auth.corsHeaders).forEach((key) => {
38
+ res.setHeader(key, auth.corsHeaders[key]);
39
+ });
40
+ if (_req.method === 'OPTIONS') {
41
+ debug_1.default.editing('preflight request');
42
+ return res.status(204).send(null);
43
+ }
44
+ return res.status(200).json((0, experimental_1.buildExperimentalFeaturesResponse)(experimentalFeaturesCatalog));
45
+ };
46
+ }
47
+ /**
48
+ * Gets the Next.js API route handler
49
+ * @returns middleware handler
50
+ */
51
+ getHandler() {
52
+ return this.handler;
53
+ }
54
+ }
55
+ exports.ExperimentalFeaturesMiddleware = ExperimentalFeaturesMiddleware;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.EditingConfigMiddleware = exports.FEAASRenderMiddleware = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.isDesignLibraryPreviewData = exports.PREVIEW_COOKIES = exports.EditingRenderMiddleware = exports.EditingService = void 0;
3
+ exports.resolveExperimentalFeatureStatuses = exports.isExperimentalEnvFlagEnabled = exports.buildExperimentalFeaturesResponse = exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.ExperimentalFeaturesMiddleware = exports.EditingConfigMiddleware = exports.FEAASRenderMiddleware = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.isDesignLibraryPreviewData = exports.PREVIEW_COOKIES = exports.EditingRenderMiddleware = exports.EditingService = void 0;
4
4
  var editing_1 = require("@sitecore-content-sdk/content/editing");
5
5
  Object.defineProperty(exports, "EditingService", { enumerable: true, get: function () { return editing_1.EditingService; } });
6
6
  var editing_render_middleware_1 = require("./editing-render-middleware");
@@ -14,7 +14,13 @@ var feaas_render_middleware_1 = require("./feaas-render-middleware");
14
14
  Object.defineProperty(exports, "FEAASRenderMiddleware", { enumerable: true, get: function () { return feaas_render_middleware_1.FEAASRenderMiddleware; } });
15
15
  var editing_config_middleware_1 = require("./editing-config-middleware");
16
16
  Object.defineProperty(exports, "EditingConfigMiddleware", { enumerable: true, get: function () { return editing_config_middleware_1.EditingConfigMiddleware; } });
17
+ var experimental_features_middleware_1 = require("./experimental-features-middleware");
18
+ Object.defineProperty(exports, "ExperimentalFeaturesMiddleware", { enumerable: true, get: function () { return experimental_features_middleware_1.ExperimentalFeaturesMiddleware; } });
17
19
  var layout_1 = require("@sitecore-content-sdk/content/layout");
18
20
  Object.defineProperty(exports, "RenderingType", { enumerable: true, get: function () { return layout_1.RenderingType; } });
19
21
  Object.defineProperty(exports, "EDITING_COMPONENT_PLACEHOLDER", { enumerable: true, get: function () { return layout_1.EDITING_COMPONENT_PLACEHOLDER; } });
20
22
  Object.defineProperty(exports, "EDITING_COMPONENT_ID", { enumerable: true, get: function () { return layout_1.EDITING_COMPONENT_ID; } });
23
+ var experimental_1 = require("@sitecore-content-sdk/content/experimental");
24
+ Object.defineProperty(exports, "buildExperimentalFeaturesResponse", { enumerable: true, get: function () { return experimental_1.buildExperimentalFeaturesResponse; } });
25
+ Object.defineProperty(exports, "isExperimentalEnvFlagEnabled", { enumerable: true, get: function () { return experimental_1.isExperimentalEnvFlagEnabled; } });
26
+ Object.defineProperty(exports, "resolveExperimentalFeatureStatuses", { enumerable: true, get: function () { return experimental_1.resolveExperimentalFeatureStatuses; } });
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveExperimentalFeatureStatuses = exports.isExperimentalEnvFlagEnabled = exports.buildExperimentalFeaturesResponse = void 0;
4
+ var experimental_1 = require("@sitecore-content-sdk/content/experimental");
5
+ Object.defineProperty(exports, "buildExperimentalFeaturesResponse", { enumerable: true, get: function () { return experimental_1.buildExperimentalFeaturesResponse; } });
6
+ Object.defineProperty(exports, "isExperimentalEnvFlagEnabled", { enumerable: true, get: function () { return experimental_1.isExperimentalEnvFlagEnabled; } });
7
+ Object.defineProperty(exports, "resolveExperimentalFeatureStatuses", { enumerable: true, get: function () { return experimental_1.resolveExperimentalFeatureStatuses; } });
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "idName": "dummy-feature",
4
+ "displayName": "Dummy Feature",
5
+ "envVarName": "CSDK_EXPERIMENTAL_DUMMY_FEATURE",
6
+ "description": "Sample experimental feature used to verify the visibility API."
7
+ },
8
+ {
9
+ "idName": "dummy-feature-two",
10
+ "displayName": "Dummy Feature Two",
11
+ "envVarName": "CSDK_EXPERIMENTAL_DUMMY_FEATURE_TWO",
12
+ "description": "Second sample experimental feature for API testing."
13
+ }
14
+ ]
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createExperimentalFeaturesRouteHandler = void 0;
7
+ const experimental_1 = require("@sitecore-content-sdk/content/experimental");
8
+ const debug_1 = __importDefault(require("../debug"));
9
+ const editing_endpoint_auth_1 = require("../editing/editing-endpoint-auth");
10
+ const experimental_json_1 = __importDefault(require("../experimental.json"));
11
+ const experimentalFeaturesCatalog = experimental_json_1.default;
12
+ /**
13
+ * Creates a route handler for the experimental features API route
14
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
15
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
16
+ *
17
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
18
+ * @returns The route handler with GET and OPTIONS methods.
19
+ * @public
20
+ */
21
+ const createExperimentalFeaturesRouteHandler = () => {
22
+ const authorize = (req, requireSecret) => (0, editing_endpoint_auth_1.authorizeEditingEndpointRequest)({
23
+ method: req.method,
24
+ headers: req.headers,
25
+ secret: req.nextUrl.searchParams.get((0, editing_endpoint_auth_1.getEditingSecretQueryParamName)()),
26
+ requireSecret,
27
+ });
28
+ const GET = async (req) => {
29
+ var _a;
30
+ try {
31
+ const startTimestamp = Date.now();
32
+ debug_1.default.editing('experimental features route handler start');
33
+ const auth = authorize(req, true);
34
+ if (!auth.ok) {
35
+ return new Response(JSON.stringify(auth.body), {
36
+ status: auth.status,
37
+ headers: Object.assign({ 'Content-Type': 'application/json' }, ((_a = auth.corsHeaders) !== null && _a !== void 0 ? _a : {})),
38
+ });
39
+ }
40
+ const responseData = (0, experimental_1.buildExperimentalFeaturesResponse)(experimentalFeaturesCatalog);
41
+ debug_1.default.editing('experimental features route handler end in %dms', Date.now() - startTimestamp);
42
+ return new Response(JSON.stringify(responseData), {
43
+ status: 200,
44
+ headers: Object.assign({ 'Content-Type': 'application/json' }, auth.corsHeaders),
45
+ });
46
+ }
47
+ catch (error) {
48
+ console.log('Experimental features route handler failed:');
49
+ console.log(error);
50
+ return new Response('Internal Server Error', {
51
+ status: 500,
52
+ });
53
+ }
54
+ };
55
+ const OPTIONS = async (req) => {
56
+ try {
57
+ debug_1.default.editing('preflight request');
58
+ // Match previous behavior: OPTIONS validates CORS only (secret not required).
59
+ const auth = authorize(req, false);
60
+ if (!auth.ok) {
61
+ return new Response(JSON.stringify(auth.body), {
62
+ status: auth.status,
63
+ headers: {
64
+ 'Content-Type': 'application/json',
65
+ },
66
+ });
67
+ }
68
+ return new Response(null, {
69
+ status: 204,
70
+ headers: auth.corsHeaders,
71
+ });
72
+ }
73
+ catch (error) {
74
+ console.log('Experimental features OPTIONS route handler failed:');
75
+ console.log(error);
76
+ return new Response('Internal Server Error', {
77
+ status: 500,
78
+ });
79
+ }
80
+ };
81
+ return { GET, OPTIONS };
82
+ };
83
+ exports.createExperimentalFeaturesRouteHandler = createExperimentalFeaturesRouteHandler;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSitecoreRevalidateRouteHandler = exports.createEditingRenderRouteHandlers = exports.createEditingConfigRouteHandler = exports.createRobotsRouteHandler = exports.createSitemapRouteHandler = void 0;
3
+ exports.createSitecoreRevalidateRouteHandler = exports.createExperimentalFeaturesRouteHandler = exports.createEditingRenderRouteHandlers = exports.createEditingConfigRouteHandler = exports.createRobotsRouteHandler = exports.createSitemapRouteHandler = void 0;
4
4
  var sitemap_route_handler_1 = require("./sitemap-route-handler");
5
5
  Object.defineProperty(exports, "createSitemapRouteHandler", { enumerable: true, get: function () { return sitemap_route_handler_1.createSitemapRouteHandler; } });
6
6
  var robots_route_handler_1 = require("./robots-route-handler");
@@ -9,5 +9,7 @@ var editing_config_route_handler_1 = require("./editing-config-route-handler");
9
9
  Object.defineProperty(exports, "createEditingConfigRouteHandler", { enumerable: true, get: function () { return editing_config_route_handler_1.createEditingConfigRouteHandler; } });
10
10
  var editing_render_route_handler_1 = require("./editing-render-route-handler");
11
11
  Object.defineProperty(exports, "createEditingRenderRouteHandlers", { enumerable: true, get: function () { return editing_render_route_handler_1.createEditingRenderRouteHandlers; } });
12
+ var experimental_features_route_handler_1 = require("./experimental-features-route-handler");
13
+ Object.defineProperty(exports, "createExperimentalFeaturesRouteHandler", { enumerable: true, get: function () { return experimental_features_route_handler_1.createExperimentalFeaturesRouteHandler; } });
12
14
  var sitecore_revalidate_route_handler_1 = require("./sitecore-revalidate-route-handler");
13
15
  Object.defineProperty(exports, "createSitecoreRevalidateRouteHandler", { enumerable: true, get: function () { return sitecore_revalidate_route_handler_1.createSitecoreRevalidateRouteHandler; } });
@@ -1,3 +1,3 @@
1
1
  export { defaultImportEntries } from './import-map';
2
2
  export { defaultServerImportEntries } from './import-map-server';
3
- export { combineImportEntries } from './import-map-utils';
3
+ export { combineImportEntries } from '@sitecore-content-sdk/content/tools';
@@ -0,0 +1,53 @@
1
+ import { EDITING_ALLOWED_ORIGINS, QUERY_PARAM_EDITING_SECRET, } from '@sitecore-content-sdk/content/editing';
2
+ import { getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/tools';
3
+ import debug from '../debug';
4
+ import { getEditingSecret } from '../utils/utils';
5
+ /**
6
+ * Shared CORS + editing-secret authorization used by Pages Router middleware and
7
+ * App Router route handlers for editing endpoints.
8
+ * @param {object} params - Request authorization inputs.
9
+ * @param {string | undefined} params.method - HTTP method.
10
+ * @param {HeaderBag} params.headers - Request headers.
11
+ * @param {string | string[] | null | undefined} params.secret - Editing secret from query/search params.
12
+ * @param {string | undefined} [params.presetCorsHeader] - Existing Access-Control-Allow-Origin header if any.
13
+ * @param {boolean} [params.requireSecret=true] - When false, only CORS is validated (e.g. OPTIONS may still check secret depending on caller).
14
+ * @returns {EditingEndpointAuthResult} Authorization result.
15
+ * @internal
16
+ */
17
+ export const authorizeEditingEndpointRequest = (params) => {
18
+ const { method, headers, secret, presetCorsHeader, requireSecret = true } = params;
19
+ const corsHeaders = getEnforcedCorsHeaders({
20
+ requestMethod: method,
21
+ headers: headers,
22
+ presetCorsHeader,
23
+ allowedOrigins: EDITING_ALLOWED_ORIGINS,
24
+ });
25
+ if (!corsHeaders) {
26
+ debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
27
+ return {
28
+ ok: false,
29
+ status: 401,
30
+ body: { message: 'Invalid origin' },
31
+ };
32
+ }
33
+ if (requireSecret) {
34
+ const secretValue = Array.isArray(secret) ? secret[0] : secret !== null && secret !== void 0 ? secret : undefined;
35
+ const expectedSecret = getEditingSecret();
36
+ if (secretValue !== expectedSecret) {
37
+ debug.editing('invalid editing secret - sent "%s" expected "%s"', secretValue, expectedSecret);
38
+ return {
39
+ ok: false,
40
+ status: 401,
41
+ body: { message: 'Missing or invalid editing secret' },
42
+ corsHeaders,
43
+ };
44
+ }
45
+ }
46
+ return { ok: true, corsHeaders };
47
+ };
48
+ /**
49
+ * Reads the editing secret query param name used by editing endpoints.
50
+ * @returns {string} Query parameter name for the editing secret.
51
+ * @internal
52
+ */
53
+ export const getEditingSecretQueryParamName = () => QUERY_PARAM_EDITING_SECRET;
@@ -0,0 +1,48 @@
1
+ import { buildExperimentalFeaturesResponse } from '@sitecore-content-sdk/content/experimental';
2
+ import debug from '../debug';
3
+ import { authorizeEditingEndpointRequest, getEditingSecretQueryParamName, } from './editing-endpoint-auth';
4
+ import experimentalFeaturesCatalogJson from '../experimental.json';
5
+ const experimentalFeaturesCatalog = experimentalFeaturesCatalogJson;
6
+ /**
7
+ * Middleware / handler used in the experimental features API route
8
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
9
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
10
+ *
11
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
12
+ * @public
13
+ */
14
+ export class ExperimentalFeaturesMiddleware {
15
+ constructor() {
16
+ this.handler = async (_req, res) => {
17
+ const auth = authorizeEditingEndpointRequest({
18
+ method: _req.method,
19
+ headers: _req.headers,
20
+ secret: _req.query[getEditingSecretQueryParamName()],
21
+ presetCorsHeader: res === null || res === void 0 ? void 0 : res.getHeader('Access-Control-Allow-Origin'),
22
+ });
23
+ if (!auth.ok) {
24
+ if (auth.corsHeaders) {
25
+ Object.keys(auth.corsHeaders).forEach((key) => {
26
+ res.setHeader(key, auth.corsHeaders[key]);
27
+ });
28
+ }
29
+ return res.status(auth.status).json(auth.body);
30
+ }
31
+ Object.keys(auth.corsHeaders).forEach((key) => {
32
+ res.setHeader(key, auth.corsHeaders[key]);
33
+ });
34
+ if (_req.method === 'OPTIONS') {
35
+ debug.editing('preflight request');
36
+ return res.status(204).send(null);
37
+ }
38
+ return res.status(200).json(buildExperimentalFeaturesResponse(experimentalFeaturesCatalog));
39
+ };
40
+ }
41
+ /**
42
+ * Gets the Next.js API route handler
43
+ * @returns middleware handler
44
+ */
45
+ getHandler() {
46
+ return this.handler;
47
+ }
48
+ }
@@ -3,4 +3,6 @@ export { EditingRenderMiddleware, } from './editing-render-middleware';
3
3
  export { PREVIEW_COOKIES, isDesignLibraryPreviewData, getQueryParamsForPropagation, getHeadersForPropagation, } from './utils';
4
4
  export { FEAASRenderMiddleware } from './feaas-render-middleware';
5
5
  export { EditingConfigMiddleware, } from './editing-config-middleware';
6
+ export { ExperimentalFeaturesMiddleware } from './experimental-features-middleware';
6
7
  export { RenderingType, EDITING_COMPONENT_PLACEHOLDER, EDITING_COMPONENT_ID, } from '@sitecore-content-sdk/content/layout';
8
+ export { buildExperimentalFeaturesResponse, isExperimentalEnvFlagEnabled, resolveExperimentalFeatureStatuses, } from '@sitecore-content-sdk/content/experimental';
@@ -0,0 +1 @@
1
+ export { buildExperimentalFeaturesResponse, isExperimentalEnvFlagEnabled, resolveExperimentalFeatureStatuses, } from '@sitecore-content-sdk/content/experimental';
@@ -0,0 +1,14 @@
1
+ [
2
+ {
3
+ "idName": "dummy-feature",
4
+ "displayName": "Dummy Feature",
5
+ "envVarName": "CSDK_EXPERIMENTAL_DUMMY_FEATURE",
6
+ "description": "Sample experimental feature used to verify the visibility API."
7
+ },
8
+ {
9
+ "idName": "dummy-feature-two",
10
+ "displayName": "Dummy Feature Two",
11
+ "envVarName": "CSDK_EXPERIMENTAL_DUMMY_FEATURE_TWO",
12
+ "description": "Second sample experimental feature for API testing."
13
+ }
14
+ ]
@@ -0,0 +1,76 @@
1
+ import { buildExperimentalFeaturesResponse } from '@sitecore-content-sdk/content/experimental';
2
+ import debug from '../debug';
3
+ import { authorizeEditingEndpointRequest, getEditingSecretQueryParamName, } from '../editing/editing-endpoint-auth';
4
+ import experimentalFeaturesCatalogJson from '../experimental.json';
5
+ const experimentalFeaturesCatalog = experimentalFeaturesCatalogJson;
6
+ /**
7
+ * Creates a route handler for the experimental features API route
8
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
9
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
10
+ *
11
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
12
+ * @returns The route handler with GET and OPTIONS methods.
13
+ * @public
14
+ */
15
+ export const createExperimentalFeaturesRouteHandler = () => {
16
+ const authorize = (req, requireSecret) => authorizeEditingEndpointRequest({
17
+ method: req.method,
18
+ headers: req.headers,
19
+ secret: req.nextUrl.searchParams.get(getEditingSecretQueryParamName()),
20
+ requireSecret,
21
+ });
22
+ const GET = async (req) => {
23
+ var _a;
24
+ try {
25
+ const startTimestamp = Date.now();
26
+ debug.editing('experimental features route handler start');
27
+ const auth = authorize(req, true);
28
+ if (!auth.ok) {
29
+ return new Response(JSON.stringify(auth.body), {
30
+ status: auth.status,
31
+ headers: Object.assign({ 'Content-Type': 'application/json' }, ((_a = auth.corsHeaders) !== null && _a !== void 0 ? _a : {})),
32
+ });
33
+ }
34
+ const responseData = buildExperimentalFeaturesResponse(experimentalFeaturesCatalog);
35
+ debug.editing('experimental features route handler end in %dms', Date.now() - startTimestamp);
36
+ return new Response(JSON.stringify(responseData), {
37
+ status: 200,
38
+ headers: Object.assign({ 'Content-Type': 'application/json' }, auth.corsHeaders),
39
+ });
40
+ }
41
+ catch (error) {
42
+ console.log('Experimental features route handler failed:');
43
+ console.log(error);
44
+ return new Response('Internal Server Error', {
45
+ status: 500,
46
+ });
47
+ }
48
+ };
49
+ const OPTIONS = async (req) => {
50
+ try {
51
+ debug.editing('preflight request');
52
+ // Match previous behavior: OPTIONS validates CORS only (secret not required).
53
+ const auth = authorize(req, false);
54
+ if (!auth.ok) {
55
+ return new Response(JSON.stringify(auth.body), {
56
+ status: auth.status,
57
+ headers: {
58
+ 'Content-Type': 'application/json',
59
+ },
60
+ });
61
+ }
62
+ return new Response(null, {
63
+ status: 204,
64
+ headers: auth.corsHeaders,
65
+ });
66
+ }
67
+ catch (error) {
68
+ console.log('Experimental features OPTIONS route handler failed:');
69
+ console.log(error);
70
+ return new Response('Internal Server Error', {
71
+ status: 500,
72
+ });
73
+ }
74
+ };
75
+ return { GET, OPTIONS };
76
+ };
@@ -2,4 +2,5 @@ export { createSitemapRouteHandler } from './sitemap-route-handler';
2
2
  export { createRobotsRouteHandler } from './robots-route-handler';
3
3
  export { createEditingConfigRouteHandler } from './editing-config-route-handler';
4
4
  export { createEditingRenderRouteHandlers } from './editing-render-route-handler';
5
+ export { createExperimentalFeaturesRouteHandler } from './experimental-features-route-handler';
5
6
  export { createSitecoreRevalidateRouteHandler, } from './sitecore-revalidate-route-handler';
@@ -0,0 +1 @@
1
+ export * from './types/experimental-features/index';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-content-sdk/nextjs",
3
- "version": "2.3.0",
3
+ "version": "2.4.0-canary.20260819212348",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -90,10 +90,10 @@
90
90
  },
91
91
  "dependencies": {
92
92
  "@babel/parser": "^7.27.2",
93
- "@sitecore-content-sdk/content": "^2.2.2",
93
+ "@sitecore-content-sdk/content": "2.3.0-canary.20260819212348",
94
94
  "@sitecore-content-sdk/core": "^2.1.3",
95
95
  "@sitecore-content-sdk/events": "^2.1.2",
96
- "@sitecore-content-sdk/react": "^2.3.0",
96
+ "@sitecore-content-sdk/react": "2.4.0-canary.20260819212348",
97
97
  "recast": "^0.23.11",
98
98
  "regex-parser": "^2.3.1"
99
99
  },
@@ -133,6 +133,11 @@
133
133
  "import": "./dist/esm/editing/index.js",
134
134
  "require": "./dist/cjs/editing/index.js"
135
135
  },
136
+ "./experimental": {
137
+ "import": "./dist/esm/experimental-features/index.js",
138
+ "require": "./dist/cjs/experimental-features/index.js",
139
+ "types": "./types/experimental-features/index.d.ts"
140
+ },
136
141
  "./proxy": {
137
142
  "types": "./types/proxy/index.d.ts",
138
143
  "import": "./dist/esm/proxy/index.js",
@@ -1,5 +1,5 @@
1
1
  export { defaultImportEntries } from './import-map';
2
2
  export { defaultServerImportEntries } from './import-map-server';
3
- export { combineImportEntries } from './import-map-utils';
4
3
  export { ImportEntry } from '@sitecore-content-sdk/content/codegen';
4
+ export { combineImportEntries } from '@sitecore-content-sdk/content/tools';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/editing/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/editing/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { IncomingHttpHeaders } from 'http';
2
+ type HeaderBag = Headers | IncomingHttpHeaders | Record<string, string | string[] | undefined>;
3
+ export type EditingEndpointAuthSuccess = {
4
+ ok: true;
5
+ corsHeaders: Record<string, string>;
6
+ };
7
+ export type EditingEndpointAuthFailure = {
8
+ ok: false;
9
+ status: 401;
10
+ body: {
11
+ message: string;
12
+ };
13
+ corsHeaders?: Record<string, string>;
14
+ };
15
+ export type EditingEndpointAuthResult = EditingEndpointAuthSuccess | EditingEndpointAuthFailure;
16
+ /**
17
+ * Shared CORS + editing-secret authorization used by Pages Router middleware and
18
+ * App Router route handlers for editing endpoints.
19
+ * @param {object} params - Request authorization inputs.
20
+ * @param {string | undefined} params.method - HTTP method.
21
+ * @param {HeaderBag} params.headers - Request headers.
22
+ * @param {string | string[] | null | undefined} params.secret - Editing secret from query/search params.
23
+ * @param {string | undefined} [params.presetCorsHeader] - Existing Access-Control-Allow-Origin header if any.
24
+ * @param {boolean} [params.requireSecret=true] - When false, only CORS is validated (e.g. OPTIONS may still check secret depending on caller).
25
+ * @returns {EditingEndpointAuthResult} Authorization result.
26
+ * @internal
27
+ */
28
+ export declare const authorizeEditingEndpointRequest: (params: {
29
+ method?: string;
30
+ headers: HeaderBag;
31
+ secret?: string | string[] | null;
32
+ presetCorsHeader?: string;
33
+ requireSecret?: boolean;
34
+ }) => EditingEndpointAuthResult;
35
+ /**
36
+ * Reads the editing secret query param name used by editing endpoints.
37
+ * @returns {string} Query parameter name for the editing secret.
38
+ * @internal
39
+ */
40
+ export declare const getEditingSecretQueryParamName: () => string;
41
+ export {};
42
+ //# sourceMappingURL=editing-endpoint-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editing-endpoint-auth.d.ts","sourceRoot":"","sources":["../../src/editing/editing-endpoint-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAS3C,KAAK,SAAS,GACV,OAAO,GACP,mBAAmB,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAElD,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,IAAI,CAAC;IACT,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,0BAA0B,GAAG,0BAA0B,CAAC;AAEhG;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,GAAI,QAAQ;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,KAAG,yBAyCH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,QAAO,MAAoC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { NextApiRequest, NextApiResponse } from 'next';
2
+ /**
3
+ * Middleware / handler used in the experimental features API route
4
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
5
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
6
+ *
7
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
8
+ * @public
9
+ */
10
+ export declare class ExperimentalFeaturesMiddleware {
11
+ /**
12
+ * Gets the Next.js API route handler
13
+ * @returns middleware handler
14
+ */
15
+ getHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise<void>;
16
+ private handler;
17
+ }
18
+ //# sourceMappingURL=experimental-features-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experimental-features-middleware.d.ts","sourceRoot":"","sources":["../../src/editing/experimental-features-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAYvD;;;;;;;GAOG;AACH,qBAAa,8BAA8B;IACzC;;;OAGG;IACI,UAAU,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC;IAIjF,OAAO,CAAC,OAAO,CA2Bb;CACH"}
@@ -3,6 +3,9 @@ export { EditingRenderMiddleware, EditingRenderMiddlewareConfig, } from './editi
3
3
  export { PREVIEW_COOKIES, isDesignLibraryPreviewData, getQueryParamsForPropagation, getHeadersForPropagation, } from './utils';
4
4
  export { FEAASRenderMiddleware, FEAASRenderMiddlewareConfig } from './feaas-render-middleware';
5
5
  export { EditingConfigMiddleware, EditingConfigMiddlewareConfig, } from './editing-config-middleware';
6
+ export { ExperimentalFeaturesMiddleware } from './experimental-features-middleware';
6
7
  export { RenderingType, EDITING_COMPONENT_PLACEHOLDER, EDITING_COMPONENT_ID, } from '@sitecore-content-sdk/content/layout';
7
8
  export type { AllowedQueryParam, AllowedQueryParamsResolver, AllowedQueryParams } from './types';
9
+ export type { ExperimentalFeatureData, ExperimentalFeatureStatus, ExperimentalFeaturesResponse, } from '@sitecore-content-sdk/content/experimental';
10
+ export { buildExperimentalFeaturesResponse, isExperimentalEnvFlagEnabled, resolveExperimentalFeatureStatuses, } from '@sitecore-content-sdk/content/experimental';
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,aAAa,EACb,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/editing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,8BAA8B,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EACL,aAAa,EACb,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACjG,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,GACnC,MAAM,4CAA4C,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Re-exports shared experimental features helpers from `@sitecore-content-sdk/content/experimental`
3
+ * for convenience in Next.js apps. The Next.js catalog lives in `src/experimental.json`.
4
+ */
5
+ export type { ExperimentalFeatureData, ExperimentalFeatureStatus, ExperimentalFeaturesResponse, } from '@sitecore-content-sdk/content/experimental';
6
+ export { buildExperimentalFeaturesResponse, isExperimentalEnvFlagEnabled, resolveExperimentalFeatureStatuses, } from '@sitecore-content-sdk/content/experimental';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/experimental-features/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,iCAAiC,EACjC,4BAA4B,EAC5B,kCAAkC,GACnC,MAAM,4CAA4C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { NextRequest } from 'next/server';
2
+ /**
3
+ * Creates a route handler for the experimental features API route
4
+ * (e.g. '/api/editing/experimental'). Exposes available experimental features
5
+ * and whether each is currently enabled, for Sitecore AI / editing host consumers.
6
+ *
7
+ * Catalog is owned by this package (`src/experimental.json`) and is not app-configurable.
8
+ * @returns The route handler with GET and OPTIONS methods.
9
+ * @public
10
+ */
11
+ export declare const createExperimentalFeaturesRouteHandler: () => {
12
+ GET: (req: NextRequest) => Promise<Response>;
13
+ OPTIONS: (req: NextRequest) => Promise<Response>;
14
+ };
15
+ //# sourceMappingURL=experimental-features-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experimental-features-route-handler.d.ts","sourceRoot":"","sources":["../../src/route-handler/experimental-features-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C;;;;;;;;GAQG;AACH,eAAO,MAAM,sCAAsC;eASzB,WAAW;mBAyCP,WAAW;CA+BxC,CAAC"}
@@ -2,5 +2,6 @@ export { createSitemapRouteHandler } from './sitemap-route-handler';
2
2
  export { createRobotsRouteHandler } from './robots-route-handler';
3
3
  export { createEditingConfigRouteHandler } from './editing-config-route-handler';
4
4
  export { createEditingRenderRouteHandlers } from './editing-render-route-handler';
5
+ export { createExperimentalFeaturesRouteHandler } from './experimental-features-route-handler';
5
6
  export { createSitecoreRevalidateRouteHandler, type SitecoreRevalidateRouteHandlerOptions, type RevalidateTagCacheProfile, } from './sitecore-revalidate-route-handler';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route-handler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EACL,oCAAoC,EACpC,KAAK,qCAAqC,EAC1C,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/route-handler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,sCAAsC,EAAE,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EACL,oCAAoC,EACpC,KAAK,qCAAqC,EAC1C,KAAK,yBAAyB,GAC/B,MAAM,qCAAqC,CAAC"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.combineImportEntries = void 0;
4
- /**
5
- * Combines the default import entries with the generated import entries.
6
- * @param {ImportEntry[]} defaultImportEntries - The default import entries.
7
- * @param {ImportEntry[]} generatedImportEntries - The generated import entries.
8
- * @returns {ImportEntry[]} The combined import entries.
9
- * @public
10
- */
11
- const combineImportEntries = (defaultImportEntries, generatedImportEntries) => {
12
- const combinedEntries = [];
13
- const importMap = new Map();
14
- // add generated entries to the map, overwriting existing ones
15
- generatedImportEntries.forEach((entry) => {
16
- importMap.set(entry.module, entry);
17
- });
18
- // add default entries to the map, if not present
19
- defaultImportEntries.forEach((defaultEntry) => {
20
- const mapEntry = importMap.get(defaultEntry.module);
21
- if (mapEntry) {
22
- defaultEntry.exports.forEach((defaultExportsEntry) => {
23
- if (!mapEntry.exports.some((e) => e.name === defaultExportsEntry.name)) {
24
- mapEntry.exports.push(defaultExportsEntry);
25
- }
26
- });
27
- }
28
- else {
29
- importMap.set(defaultEntry.module, defaultEntry);
30
- }
31
- });
32
- // convert map back to array
33
- importMap.forEach((value) => {
34
- combinedEntries.push(value);
35
- });
36
- return combinedEntries;
37
- };
38
- exports.combineImportEntries = combineImportEntries;
@@ -1,34 +0,0 @@
1
- /**
2
- * Combines the default import entries with the generated import entries.
3
- * @param {ImportEntry[]} defaultImportEntries - The default import entries.
4
- * @param {ImportEntry[]} generatedImportEntries - The generated import entries.
5
- * @returns {ImportEntry[]} The combined import entries.
6
- * @public
7
- */
8
- export const combineImportEntries = (defaultImportEntries, generatedImportEntries) => {
9
- const combinedEntries = [];
10
- const importMap = new Map();
11
- // add generated entries to the map, overwriting existing ones
12
- generatedImportEntries.forEach((entry) => {
13
- importMap.set(entry.module, entry);
14
- });
15
- // add default entries to the map, if not present
16
- defaultImportEntries.forEach((defaultEntry) => {
17
- const mapEntry = importMap.get(defaultEntry.module);
18
- if (mapEntry) {
19
- defaultEntry.exports.forEach((defaultExportsEntry) => {
20
- if (!mapEntry.exports.some((e) => e.name === defaultExportsEntry.name)) {
21
- mapEntry.exports.push(defaultExportsEntry);
22
- }
23
- });
24
- }
25
- else {
26
- importMap.set(defaultEntry.module, defaultEntry);
27
- }
28
- });
29
- // convert map back to array
30
- importMap.forEach((value) => {
31
- combinedEntries.push(value);
32
- });
33
- return combinedEntries;
34
- };
@@ -1,10 +0,0 @@
1
- import { ImportEntry } from '@sitecore-content-sdk/content/codegen';
2
- /**
3
- * Combines the default import entries with the generated import entries.
4
- * @param {ImportEntry[]} defaultImportEntries - The default import entries.
5
- * @param {ImportEntry[]} generatedImportEntries - The generated import entries.
6
- * @returns {ImportEntry[]} The combined import entries.
7
- * @public
8
- */
9
- export declare const combineImportEntries: (defaultImportEntries: ImportEntry[], generatedImportEntries: ImportEntry[]) => ImportEntry[];
10
- //# sourceMappingURL=import-map-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"import-map-utils.d.ts","sourceRoot":"","sources":["../../../src/editing/codegen/import-map-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,sBAAsB,WAAW,EAAE,EACnC,wBAAwB,WAAW,EAAE,KACpC,WAAW,EA6Bb,CAAC"}