@admin-layout/client 11.0.4-alpha.4 → 11.2.1-alpha.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 (200) hide show
  1. package/lib/__tests__/ApplicationErrorHandlerCommon.test.d.ts.map +1 -0
  2. package/lib/__tests__/ConfigurationModelWrapper.test.d.ts +2 -0
  3. package/lib/__tests__/ConfigurationModelWrapper.test.d.ts.map +1 -0
  4. package/lib/__tests__/SettingsConfigurationModel.test.d.ts +2 -0
  5. package/lib/__tests__/SettingsConfigurationModel.test.d.ts.map +1 -0
  6. package/lib/__tests__/__fixtures__/defaultSettingsExample.d.ts +3 -0
  7. package/lib/__tests__/__fixtures__/defaultSettingsExample.d.ts.map +1 -0
  8. package/lib/{antd-themes/colors.d.ts → colors/colorsList.d.ts} +1 -1
  9. package/lib/colors/colorsList.d.ts.map +1 -0
  10. package/lib/{antd-themes/colors.js → colors/colorsList.js} +1 -1
  11. package/lib/colors/colorsList.js.map +1 -0
  12. package/lib/colors/index.d.ts +1 -0
  13. package/lib/colors/index.d.ts.map +1 -1
  14. package/lib/colors/presets/black.js.map +1 -1
  15. package/lib/colors/presets/brinkPink.js +11 -0
  16. package/lib/colors/presets/brinkPink.js.map +1 -0
  17. package/lib/colors/presets/cyan.js +11 -0
  18. package/lib/colors/presets/cyan.js.map +1 -0
  19. package/lib/colors/presets/lime.js +11 -0
  20. package/lib/colors/presets/lime.js.map +1 -0
  21. package/lib/colors/presets/pink.js +11 -0
  22. package/lib/colors/presets/pink.js.map +1 -0
  23. package/lib/colors/presets/purple.js +11 -0
  24. package/lib/colors/presets/purple.js.map +1 -0
  25. package/lib/colors/presets/skyBlue.js +11 -0
  26. package/lib/colors/presets/skyBlue.js.map +1 -0
  27. package/lib/colors/presets/turquoise.js +11 -0
  28. package/lib/colors/presets/turquoise.js.map +1 -0
  29. package/lib/colors/presets/white.js.map +1 -1
  30. package/lib/components/ApplicationErrorFillWrapper.d.ts +2 -1
  31. package/lib/components/ApplicationErrorFillWrapper.d.ts.map +1 -1
  32. package/lib/components/ApplicationErrorFillWrapper.js +2 -2
  33. package/lib/components/ApplicationErrorHandlerCommon.d.ts.map +1 -1
  34. package/lib/components/ApplicationErrorHandlerCommon.js +8 -6
  35. package/lib/components/ApplicationErrorHandlerCommon.js.map +1 -1
  36. package/lib/components/ErrorBoundaryCommon.d.ts +1 -1
  37. package/lib/components/ErrorBoundaryCommon.js +2 -2
  38. package/lib/components/ErrorBoundaryCommon.js.map +1 -1
  39. package/lib/components/LayoutCookieProvider.d.ts.map +1 -1
  40. package/lib/components/LayoutCookieProvider.js +16 -10
  41. package/lib/components/LayoutCookieProvider.js.map +1 -1
  42. package/lib/components/UpdateSettings/UpdateSettings.server.d.ts +69 -0
  43. package/lib/components/UpdateSettings/UpdateSettings.server.d.ts.map +1 -0
  44. package/lib/components/UpdateSettings/UpdateSettings.server.js +218 -30
  45. package/lib/components/UpdateSettings/UpdateSettings.server.js.map +1 -1
  46. package/lib/components/UpdateSettings/UpdateSettings.server.test.d.ts +2 -0
  47. package/lib/components/UpdateSettings/UpdateSettings.server.test.d.ts.map +1 -0
  48. package/lib/config/defaultSettings.d.ts +184 -2
  49. package/lib/config/defaultSettings.d.ts.map +1 -1
  50. package/lib/config/defaultSettings.js +67 -32
  51. package/lib/config/defaultSettings.js.map +1 -1
  52. package/lib/config/env-config.d.ts +3 -5
  53. package/lib/config/env-config.d.ts.map +1 -1
  54. package/lib/config/env-config.js +13 -13
  55. package/lib/config/env-config.js.map +1 -1
  56. package/lib/constants/constants.js.map +1 -1
  57. package/lib/constants/error.js.map +1 -1
  58. package/lib/constants/languages.js.map +1 -1
  59. package/lib/constants/layout.js.map +1 -1
  60. package/lib/graphql/link/error-link.d.ts.map +1 -1
  61. package/lib/graphql/link/error-link.js.map +1 -1
  62. package/lib/hooks/Client-only.d.ts +28 -0
  63. package/lib/hooks/Client-only.d.ts.map +1 -0
  64. package/lib/hooks/Client-only.js +18 -0
  65. package/lib/hooks/Client-only.js.map +1 -0
  66. package/lib/hooks/hooks.d.ts +4 -0
  67. package/lib/hooks/hooks.d.ts.map +1 -0
  68. package/lib/hooks/index.d.ts +1 -0
  69. package/lib/hooks/index.d.ts.map +1 -1
  70. package/lib/hooks/use-hydrated.d.ts +19 -0
  71. package/lib/hooks/use-hydrated.d.ts.map +1 -0
  72. package/lib/hooks/use-hydrated.js +24 -0
  73. package/lib/hooks/use-hydrated.js.map +1 -0
  74. package/lib/hooks/useLayoutSettings.d.ts +3 -2
  75. package/lib/hooks/useLayoutSettings.d.ts.map +1 -1
  76. package/lib/hooks/useLayoutSettings.js +70 -44
  77. package/lib/hooks/useLayoutSettings.js.map +1 -1
  78. package/lib/hooks/useLayoutSettings.test.d.ts +2 -0
  79. package/lib/hooks/useLayoutSettings.test.d.ts.map +1 -0
  80. package/lib/index.d.ts +1 -1
  81. package/lib/index.d.ts.map +1 -1
  82. package/lib/index.js +1 -1
  83. package/lib/index.native.js +1 -1
  84. package/lib/interfaces/default-settings.d.ts +1 -0
  85. package/lib/interfaces/default-settings.d.ts.map +1 -1
  86. package/lib/interfaces/index.d.ts +2 -0
  87. package/lib/interfaces/index.d.ts.map +1 -1
  88. package/lib/interfaces/pure-settings.d.ts +17 -1
  89. package/lib/interfaces/pure-settings.d.ts.map +1 -1
  90. package/lib/interfaces/searchbar-settings.d.ts +61 -0
  91. package/lib/interfaces/searchbar-settings.d.ts.map +1 -0
  92. package/lib/interfaces/settings.d.ts +167 -0
  93. package/lib/interfaces/settings.d.ts.map +1 -0
  94. package/lib/interfaces/settings.js +5 -0
  95. package/lib/interfaces/settings.js.map +1 -0
  96. package/lib/interfaces/typings.d.ts +1 -1
  97. package/lib/interfaces/typings.d.ts.map +1 -1
  98. package/lib/redux/actions/error-actions.d.ts.map +1 -1
  99. package/lib/redux/actions/error-actions.js.map +1 -1
  100. package/lib/redux/reducers/error.js.map +1 -1
  101. package/lib/redux/reducers/settings.d.ts.map +1 -1
  102. package/lib/redux/reducers/settings.js +3 -10
  103. package/lib/redux/reducers/settings.js.map +1 -1
  104. package/lib/redux/selectors/index.js.map +1 -1
  105. package/lib/redux/store.js +1 -1
  106. package/lib/redux/store.js.map +1 -1
  107. package/lib/themes/systemFont/index.js.map +1 -1
  108. package/lib/themes/templates/createLayoutTheme.js.map +1 -1
  109. package/lib/themes/templates/darkLayoutTheme.js.map +1 -1
  110. package/lib/themes/templates/lightLayoutTheme.js.map +1 -1
  111. package/lib/utils/assignDefaults.d.ts +10 -0
  112. package/lib/utils/assignDefaults.d.ts.map +1 -0
  113. package/lib/utils/assignDefaults.test.d.ts +1 -0
  114. package/lib/utils/assignDefaults.test.d.ts.map +1 -0
  115. package/lib/utils/generateMenuLink.d.ts.map +1 -1
  116. package/lib/utils/generateMenuLink.js +13 -1
  117. package/lib/utils/generateMenuLink.js.map +1 -1
  118. package/lib/utils/generateMenuLink.test.d.ts +2 -0
  119. package/lib/utils/generateMenuLink.test.d.ts.map +1 -0
  120. package/lib/utils/index.d.ts +1 -1
  121. package/lib/utils/index.d.ts.map +1 -1
  122. package/lib/utils/matchMenuKeys.d.ts.map +1 -1
  123. package/lib/utils/matchMenuKeys.js.map +1 -1
  124. package/lib/utils/menuUtils.d.ts.map +1 -1
  125. package/lib/utils/menuUtils.js.map +1 -1
  126. package/lib/utils/parentRoute.d.ts.map +1 -1
  127. package/lib/utils/parseEnvUiLayoutSettings.d.ts +6 -0
  128. package/lib/utils/parseEnvUiLayoutSettings.d.ts.map +1 -0
  129. package/lib/utils/parseEnvUiLayoutSettings.js +27 -0
  130. package/lib/utils/parseEnvUiLayoutSettings.js.map +1 -0
  131. package/lib/utils/parseEnvUiLayoutSettings.test.d.ts +2 -0
  132. package/lib/utils/parseEnvUiLayoutSettings.test.d.ts.map +1 -0
  133. package/lib/utils/seperatedMenus.js.map +1 -1
  134. package/lib/utils/settingsDiff.test.d.ts +2 -0
  135. package/lib/utils/settingsDiff.test.d.ts.map +1 -0
  136. package/lib/utils/settingsDifference.d.ts +6 -0
  137. package/lib/utils/settingsDifference.d.ts.map +1 -0
  138. package/lib/utils/settingsDifference.js +148 -0
  139. package/lib/utils/settingsDifference.js.map +1 -0
  140. package/lib/utils/settingsDifference.test.d.ts +2 -0
  141. package/lib/utils/settingsDifference.test.d.ts.map +1 -0
  142. package/package.json +9 -4
  143. package/lib/antd-themes/ThemeProvider.d.ts +0 -10
  144. package/lib/antd-themes/ThemeProvider.d.ts.map +0 -1
  145. package/lib/antd-themes/ThemeProvider.js +0 -34
  146. package/lib/antd-themes/ThemeProvider.js.map +0 -1
  147. package/lib/antd-themes/airbnb-dark-theme.d.ts +0 -2
  148. package/lib/antd-themes/airbnb-dark-theme.d.ts.map +0 -1
  149. package/lib/antd-themes/airbnb-dark-theme.js +0 -168
  150. package/lib/antd-themes/airbnb-dark-theme.js.map +0 -1
  151. package/lib/antd-themes/airbnb-light-theme.d.ts +0 -230
  152. package/lib/antd-themes/airbnb-light-theme.d.ts.map +0 -1
  153. package/lib/antd-themes/airbnb-light-theme.js +0 -168
  154. package/lib/antd-themes/airbnb-light-theme.js.map +0 -1
  155. package/lib/antd-themes/colors.d.ts.map +0 -1
  156. package/lib/antd-themes/colors.js.map +0 -1
  157. package/lib/antd-themes/default-dark-theme.d.ts +0 -2
  158. package/lib/antd-themes/default-dark-theme.d.ts.map +0 -1
  159. package/lib/antd-themes/default-dark-theme.js +0 -136
  160. package/lib/antd-themes/default-dark-theme.js.map +0 -1
  161. package/lib/antd-themes/default-light-theme.d.ts +0 -199
  162. package/lib/antd-themes/default-light-theme.d.ts.map +0 -1
  163. package/lib/antd-themes/default-light-theme.js +0 -136
  164. package/lib/antd-themes/default-light-theme.js.map +0 -1
  165. package/lib/antd-themes/github-dark-theme.d.ts +0 -2
  166. package/lib/antd-themes/github-dark-theme.d.ts.map +0 -1
  167. package/lib/antd-themes/github-dark-theme.js +0 -168
  168. package/lib/antd-themes/github-dark-theme.js.map +0 -1
  169. package/lib/antd-themes/github-light-theme.d.ts +0 -230
  170. package/lib/antd-themes/github-light-theme.d.ts.map +0 -1
  171. package/lib/antd-themes/github-light-theme.js +0 -168
  172. package/lib/antd-themes/github-light-theme.js.map +0 -1
  173. package/lib/antd-themes/index.d.ts +0 -14
  174. package/lib/antd-themes/index.d.ts.map +0 -1
  175. package/lib/antd-themes/slack-dark-theme.d.ts +0 -2
  176. package/lib/antd-themes/slack-dark-theme.d.ts.map +0 -1
  177. package/lib/antd-themes/slack-dark-theme.js +0 -167
  178. package/lib/antd-themes/slack-dark-theme.js.map +0 -1
  179. package/lib/antd-themes/slack-light-theme.d.ts +0 -229
  180. package/lib/antd-themes/slack-light-theme.d.ts.map +0 -1
  181. package/lib/antd-themes/slack-light-theme.js +0 -167
  182. package/lib/antd-themes/slack-light-theme.js.map +0 -1
  183. package/lib/antd-themes/spotify-dark-theme.d.ts +0 -2
  184. package/lib/antd-themes/spotify-dark-theme.d.ts.map +0 -1
  185. package/lib/antd-themes/spotify-dark-theme.js +0 -168
  186. package/lib/antd-themes/spotify-dark-theme.js.map +0 -1
  187. package/lib/antd-themes/spotify-light-theme.d.ts +0 -230
  188. package/lib/antd-themes/spotify-light-theme.d.ts.map +0 -1
  189. package/lib/antd-themes/spotify-light-theme.js +0 -168
  190. package/lib/antd-themes/spotify-light-theme.js.map +0 -1
  191. package/lib/antd-themes/themeRegistry.d.ts +0 -2
  192. package/lib/antd-themes/themeRegistry.d.ts.map +0 -1
  193. package/lib/antd-themes/themeRegistry.js +0 -12
  194. package/lib/antd-themes/themeRegistry.js.map +0 -1
  195. package/lib/components/__tests__/ApplicationErrorHandlerCommon.test.d.ts.map +0 -1
  196. package/lib/utils/getAntdLocale.d.ts +0 -3
  197. package/lib/utils/getAntdLocale.d.ts.map +0 -1
  198. package/lib/utils/getAntdLocale.js +0 -18
  199. package/lib/utils/getAntdLocale.js.map +0 -1
  200. /package/lib/{components/__tests__ → __tests__}/ApplicationErrorHandlerCommon.test.d.ts +0 -0
@@ -1,38 +1,226 @@
1
- import {createCookie}from'@remix-run/node';import {data}from'@remix-run/react';import {pick,keys}from'lodash-es';import {config}from'../../config/env-config.js';import {defaultSettings}from'../../config/defaultSettings.js';const settingsCookie = createCookie('settings', {
1
+ import {createCookie}from'@remix-run/node';import {ConfigCollectionName,ConfigFragmentName,ConfigurationSchemaId}from'common';import {GetPageSettingsDocument}from'common/graphql';import {merge}from'lodash-es';import {print}from'graphql';import {parseEnvLayoutSettings}from'../../utils/parseEnvUiLayoutSettings.js';import {config}from'../../config/env-config.js';import'../../config/defaultSettings.js';import {generateCdecodeUri,DEFAULT_CONTRIBUTION_TENANT_ID}from'@adminide-stack/core';/**
2
+ * Cookie configuration for storing user settings
3
+ * - Max age: 30 days
4
+ * - Client-side accessible for dynamic UI updates
5
+ * - Domain-scoped in production for subdomain sharing
6
+ */
7
+ const settingsCookie = createCookie('settings', {
2
8
  maxAge: 60 * 60 * 24 * 30, // 1 month
3
- httpOnly: true,
9
+ httpOnly: false, // Allow client-side access
4
10
  sameSite: 'lax',
11
+ path: '/', // Ensure cookie is available for all paths
5
12
  domain: config.isProd ? config.APP_DOMAIN : undefined,
6
13
  });
7
- const action = async ({ request }) => {
8
- // const jsonData = await request.json();
9
- const clonedRequest = request.clone();
10
- const jsonData = await clonedRequest.json();
11
- const payload = jsonData?.config;
12
- const cookieHeader = request.headers.get('Cookie');
13
- const settings = await settingsCookie.parse(cookieHeader);
14
- const updatedSettings = {
15
- ...settings,
16
- ...pick(payload, keys(config.LAYOUT_SETTINGS)),
14
+ /**
15
+ * Fetches page settings from GraphQL backend with device/route-specific overrides
16
+ *
17
+ * @param request - The incoming HTTP request (used for forwarding cookies and headers)
18
+ * @param overrideIdentifier - Optional override identifier (e.g., "[mobile]", "[desktop]", "[/dashboard][mobile]")
19
+ * @returns GraphQL query result containing merged settings with overrides applied
20
+ *
21
+ * @remarks
22
+ * - The GraphQL backend implements Redis caching for performance
23
+ * - Settings are returned in a flat structure with bracket notation for overrides
24
+ * - Example structure: { logo: '...', theme: '...', '[mobile]': { ... }, '[/dashboard][mobile]': { ... } }
25
+ */
26
+ async function fetchPageSettingsWithFetch(request, overrideIdentifier) {
27
+ console.log(`🔍 Fetching settings from GraphQL (Redis-cached backend)...`);
28
+ // Generate resource URI for the application settings
29
+ const resource = generateCdecodeUri(DEFAULT_CONTRIBUTION_TENANT_ID, {
30
+ resourceType: ConfigCollectionName.Applications,
31
+ resourceId: config.APPLICATION_ID,
32
+ idField: 'appId',
33
+ }, {}, ConfigFragmentName.UiSettings);
34
+ const url = process.env.GRAPHQL_URL || 'http://localhost:8080/graphql';
35
+ // Convert GraphQL DocumentNode to string
36
+ const query = print(GetPageSettingsDocument);
37
+ // Prepare GraphQL query options
38
+ const options = {
39
+ schemaId: ConfigurationSchemaId.UiLayout,
40
+ target: 2 /* ConfigurationTarget.APPLICATION */,
41
+ configKey: 'uilayout',
17
42
  };
18
- return data(updatedSettings, {
19
- headers: {
20
- 'Set-Cookie': await settingsCookie.serialize(updatedSettings),
21
- },
22
- });
23
- };
24
- const loader = async ({ request }) => {
25
- const cookieHeader = request.headers.get('Cookie');
26
- const settings = await settingsCookie.parse(cookieHeader);
27
- if (!settings) {
28
- const updatedSettings = {
29
- ...defaultSettings,
43
+ // Add device/route overrides if provided
44
+ if (overrideIdentifier) {
45
+ options.overrides = {
46
+ strict: true,
47
+ overrideIdentifier,
30
48
  };
31
- return data(updatedSettings, {
32
- headers: {
33
- 'Set-Cookie': await settingsCookie.serialize(updatedSettings),
34
- },
49
+ }
50
+ const variables = {
51
+ resourceUri: resource,
52
+ options,
53
+ };
54
+ console.log('🔍 Fetching settings with direct fetch to:', url);
55
+ // console.log('🔍 Query variables:', JSON.stringify(variables, null, 2));
56
+ // Forward cookies and headers from the incoming request
57
+ const headers = {
58
+ 'Content-Type': 'application/json',
59
+ 'Cache-Control': 'no-cache, no-store, must-revalidate',
60
+ Pragma: 'no-cache',
61
+ Expires: '0',
62
+ };
63
+ const cookieHeader = request.headers.get('Cookie');
64
+ if (cookieHeader) {
65
+ headers['Cookie'] = cookieHeader;
66
+ console.log('🍪 Forwarding cookies to GraphQL backend');
67
+ }
68
+ else {
69
+ console.log('⚠️ No cookies found in request');
70
+ }
71
+ try {
72
+ const response = await fetch(url, {
73
+ method: 'POST',
74
+ headers,
75
+ body: JSON.stringify({
76
+ query,
77
+ variables,
78
+ }),
79
+ });
80
+ if (!response.ok) {
81
+ console.error('❌ GraphQL fetch failed with status:', response.status);
82
+ throw new Error(`GraphQL request failed: ${response.status} ${response.statusText}`);
83
+ }
84
+ const result = await response.json();
85
+ if (result.errors) {
86
+ console.error('❌ GraphQL errors:', JSON.stringify(result.errors, null, 2));
87
+ throw new Error(`GraphQL errors: ${JSON.stringify(result.errors)}`);
88
+ }
89
+ console.log('✅ Settings fetched successfully (from Redis-cached backend)');
90
+ return { data: result.data };
91
+ }
92
+ catch (error) {
93
+ console.error('❌ Failed to fetch settings with fetch:', error);
94
+ throw error;
95
+ }
96
+ }
97
+ /**
98
+ * Universal settings loader utility for both Remix loaders and actions
99
+ *
100
+ * @param params - Object containing request, context, and params
101
+ * @param params.request - The incoming HTTP request
102
+ * @param params.context - Optional Remix load context
103
+ * @param params.params - Optional route parameters
104
+ *
105
+ * @returns Object containing merged settings and cookie string
106
+ * @returns settings - Fully merged settings (GraphQL + env + cookies + request payload)
107
+ * @returns setCookie - Cookie string to set in response headers
108
+ *
109
+ * @remarks
110
+ * This utility handles both loader (GET) and action (POST/PUT/DELETE) requests:
111
+ * - **Loaders (GET)**: Fetches and merges settings from GraphQL, env, and cookies
112
+ * - **Actions (POST/PUT)**: Additionally processes request payload and updates cookies
113
+ *
114
+ * Settings merge order (later sources override earlier ones):
115
+ * 1. GraphQL backend settings (with device overrides)
116
+ * 2. Environment variable settings
117
+ * 3. Cookie settings (user preferences)
118
+ * 4. Request payload (only for actions)
119
+ *
120
+ * @example
121
+ * // In a Remix loader
122
+ * export const loader = async ({ request }) => {
123
+ * const { settings, setCookie } = await settingsLoaderUtil({ request });
124
+ * return json({ settings }, { headers: { 'Set-Cookie': setCookie } });
125
+ * };
126
+ *
127
+ * @example
128
+ * // In a Remix action
129
+ * export const action = async ({ request }) => {
130
+ * const { settings, setCookie } = await settingsLoaderUtil({ request });
131
+ * return json(settings, { headers: { 'Set-Cookie': setCookie } });
132
+ * };
133
+ */
134
+ async function settingsLoaderUtil({ request, context, params }) {
135
+ // 1. Detect device type from User-Agent header
136
+ const userAgent = request.headers.get('User-Agent') || '';
137
+ const deviceType = getDeviceType(userAgent);
138
+ // 2. Fetch settings from GraphQL backend with device-specific overrides
139
+ // Override identifier format: "[desktop]" or "[mobile]"
140
+ const overrideIdentifier = `[${deviceType}]`;
141
+ const result = await fetchPageSettingsWithFetch(request, overrideIdentifier);
142
+ // console.log('ddRESULT=========>', JSON.stringify(result));
143
+ const pageBackendSettings = result?.data?.pageSettings?.settings
144
+ ? JSON.parse(JSON.stringify(result?.data?.pageSettings?.settings))
145
+ : null;
146
+ // 3. Parse request payload (only available for POST/PUT requests in actions)
147
+ let requestPayload = {};
148
+ try {
149
+ // Clone request to avoid "body already read" errors
150
+ const clonedRequest = request.clone();
151
+ const contentType = request.headers.get('content-type');
152
+ // Only parse JSON for non-GET requests with JSON content-type
153
+ if (request.method !== 'GET' && contentType?.includes('application/json')) {
154
+ const jsonData = await clonedRequest.json();
155
+ requestPayload = jsonData?.config || {};
156
+ }
157
+ }
158
+ catch (error) {
159
+ // Expected for GET requests (loaders) - no payload to parse
160
+ console.log('ℹ️ No request payload (likely a loader call)');
161
+ requestPayload = {};
162
+ }
163
+ // console.log('🔍 DEBUG - pageBackendSettings:', JSON.stringify(pageBackendSettings, null, 2));
164
+ // 4. Parse environment-based layout settings (fallback/default values)
165
+ const envLayoutSettings = parseEnvLayoutSettings();
166
+ // 5. Parse and validate existing cookie settings
167
+ const cookieHeader = request.headers.get('Cookie');
168
+ let existingCookieSettings;
169
+ let cookieUpdatedSettings;
170
+ try {
171
+ existingCookieSettings = await settingsCookie.parse(cookieHeader);
172
+ // DEFENSIVE: Remove invalid numeric string keys (data corruption prevention)
173
+ if (existingCookieSettings && typeof existingCookieSettings === 'object') {
174
+ Object.keys(existingCookieSettings).forEach((key) => {
175
+ // Remove keys that are numeric strings (like "0", "1", etc.)
176
+ if (/^\d+$/.test(key)) {
177
+ console.warn(`⚠️ Removing invalid numeric key from cookie settings: "${key}" = ${JSON.stringify(existingCookieSettings[key])}`);
178
+ delete existingCookieSettings[key];
179
+ }
180
+ });
181
+ }
182
+ // 6. Merge existing cookie settings with new request payload
183
+ cookieUpdatedSettings = merge({}, existingCookieSettings, requestPayload);
184
+ // Validate merge result - check for numeric key corruption
185
+ const numericKeysAfterMerge = Object.keys(cookieUpdatedSettings).filter((k) => /^\d+$/.test(k));
186
+ if (numericKeysAfterMerge.length > 0) {
187
+ console.error('❌ NUMERIC KEYS APPEARED AFTER MERGE!', numericKeysAfterMerge);
188
+ console.error('❌ Values:', numericKeysAfterMerge.map((k) => `${k}: ${JSON.stringify(cookieUpdatedSettings[k])}`));
189
+ }
190
+ }
191
+ catch (error) {
192
+ // If cookie parsing fails, use only the request payload
193
+ console.error('Error parsing settings cookie:', error);
194
+ existingCookieSettings = null;
195
+ cookieUpdatedSettings = requestPayload;
196
+ }
197
+ // 7. Merge all settings sources in priority order (later sources override earlier)
198
+ // Priority: GraphQL backend → Environment → Cookie + Request payload
199
+ const fullSettings = merge({}, pageBackendSettings, envLayoutSettings, cookieUpdatedSettings);
200
+ // 8. Validate final merged settings - detect and remove numeric key corruption
201
+ const numericKeysAfterFinalMerge = Object.keys(fullSettings).filter((k) => /^\d+$/.test(k));
202
+ if (numericKeysAfterFinalMerge.length > 0) {
203
+ console.error('❌ NUMERIC KEYS APPEARED AFTER FINAL MERGE!', numericKeysAfterFinalMerge);
204
+ console.error('❌ Values:', numericKeysAfterFinalMerge.map((k) => `${k}: ${JSON.stringify(fullSettings[k])}`));
205
+ }
206
+ // 9. Final cleanup - remove any invalid numeric string keys before returning
207
+ if (fullSettings && typeof fullSettings === 'object') {
208
+ Object.keys(fullSettings).forEach((key) => {
209
+ if (/^\d+$/.test(key)) {
210
+ console.warn(`⚠️ Removing invalid numeric key from fullSettings: "${key}"`);
211
+ delete fullSettings[key];
212
+ }
35
213
  });
36
214
  }
37
- return settings;
38
- };export{action,loader};//# sourceMappingURL=UpdateSettings.server.js.map
215
+ // 10. Serialize cookie settings for response headers
216
+ const cookie = await settingsCookie.serialize(cookieUpdatedSettings);
217
+ console.log('✅ FULL_SETTINGS prepared:', Object.keys(fullSettings).length, 'keys');
218
+ return { settings: fullSettings, setCookie: cookie };
219
+ }
220
+ function getDeviceType(userAgent) {
221
+ if (!userAgent)
222
+ return 'desktop';
223
+ // Enhanced regex that catches more mobile devices
224
+ const mobileRegex = /mobile|android|iphone|ipad|ipod|blackberry|windows phone|opera mini|iemobile|webos|palm|playbook|kindle|silk|psp|symbian|nokia|nexus|htc|samsung|sony|ericsson|lg|motorola|sgh|sec|sharp|vodafone|benq|sanyo|kyocera|nec|alcatel|denso|jarviss|docomo|emacs|minimo|maemo|blazer|dolfin|dolphin|netfront|openwave|teleca|elaine|bolt|iris|maui|packet|pie|portalmmm|w3c|wig|zte|audiovox|ericsson|kyocera|panasonic|qwerty|sendo|sharp|sie-|sonyericsson|t-mobile|up\.browser|up\.link|verizon|vodafone|wap|winwap|xda|zte/i;
225
+ return mobileRegex.test(userAgent) ? 'mobile' : 'desktop';
226
+ }export{fetchPageSettingsWithFetch,getDeviceType,settingsCookie,settingsLoaderUtil};//# sourceMappingURL=UpdateSettings.server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpdateSettings.server.js","sources":["../../../src/components/UpdateSettings/UpdateSettings.server.ts"],"sourcesContent":["import { createCookie } from '@remix-run/node';\nimport { data } from '@remix-run/react';\nimport { keys, pick } from 'lodash-es';\nimport { config, defaultSettings } from '../../config';\nconst settingsCookie = createCookie('settings', {\n maxAge: 60 * 60 * 24 * 30, // 1 month\n httpOnly: true,\n sameSite: 'lax',\n domain: config.isProd ? config.APP_DOMAIN : undefined,\n});\nexport const action = async ({ request }) => {\n // const jsonData = await request.json();\n const clonedRequest = request.clone();\n const jsonData = await clonedRequest.json();\n const payload = jsonData?.config;\n const cookieHeader = request.headers.get('Cookie');\n const settings = await settingsCookie.parse(cookieHeader);\n const updatedSettings = {\n ...settings,\n ...pick(payload, keys(config.LAYOUT_SETTINGS)),\n };\n return data(updatedSettings, {\n headers: {\n 'Set-Cookie': await settingsCookie.serialize(updatedSettings),\n },\n });\n};\nexport const loader = async ({ request }) => {\n const cookieHeader = request.headers.get('Cookie');\n const settings = await settingsCookie.parse(cookieHeader);\n if (!settings) {\n const updatedSettings = {\n ...defaultSettings,\n };\n return data(updatedSettings, {\n headers: {\n 'Set-Cookie': await settingsCookie.serialize(updatedSettings),\n },\n });\n }\n return settings;\n};\n"],"names":[],"mappings":"+NAIA,MAAM,cAAc,GAAG,YAAY,CAAC,UAAU,EAAE;AAChD,IAAI,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC7B,IAAI,QAAQ,EAAE,IAAI;AAClB,IAAI,QAAQ,EAAE,KAAK;AACnB,IAAI,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,SAAS;AACzD,CAAC,CAAC;AACU,MAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK;AAC7C;AACA,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE;AACzC,IAAI,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE;AAC/C,IAAI,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM;AACpC,IAAI,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACtD,IAAI,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;AAC7D,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,GAAG,QAAQ;AACnB,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACtD,KAAK;AACL,IAAI,OAAO,IAAI,CAAC,eAAe,EAAE;AACjC,QAAQ,OAAO,EAAE;AACjB,YAAY,YAAY,EAAE,MAAM,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC;AACzE,SAAS;AACT,KAAK,CAAC;AACN;AACY,MAAC,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK;AAC7C,IAAI,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACtD,IAAI,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC;AAC7D,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,QAAQ,MAAM,eAAe,GAAG;AAChC,YAAY,GAAG,eAAe;AAC9B,SAAS;AACT,QAAQ,OAAO,IAAI,CAAC,eAAe,EAAE;AACrC,YAAY,OAAO,EAAE;AACrB,gBAAgB,YAAY,EAAE,MAAM,cAAc,CAAC,SAAS,CAAC,eAAe,CAAC;AAC7E,aAAa;AACb,SAAS,CAAC;AACV;AACA,IAAI,OAAO,QAAQ;AACnB"}
1
+ {"version":3,"file":"UpdateSettings.server.js","sources":["../../../src/components/UpdateSettings/UpdateSettings.server.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;AAyCG,IAAA,IAAA,EAAA,GAAA;AACH,IAAA,MAAA,EAAA,MAAA,CAAA,MAAsB,GAAA,MAAA,CAAA,UAAA,GAAA,SAA2B;;AAuFhD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCG,QAAA,WAAA,EAAA,QAAA;AACH,QAAA,OAAA;;;;AAAqE;;;AA8GpE,QAAA,eAAA,EAAA,qCAAA;AAED,QAAA,MAAA,EAAA,UAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=UpdateSettings.server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateSettings.server.test.d.ts","sourceRoot":"","sources":["../../../src/components/UpdateSettings/UpdateSettings.server.test.ts"],"names":[],"mappings":""}
@@ -1,7 +1,85 @@
1
- import { ProSettings } from '../interfaces';
1
+ import { ProSettings, SearchbarSettings } from '../interfaces';
2
+ import { NavigationMode, SideMenuType, SearchBarBehavior } from '../interfaces/settings';
3
+ import { ContentWidth } from '../interfaces/pure-settings';
4
+ export declare const DEFAULT_LAYOUT: {
5
+ contentWidth: ContentWidth;
6
+ fixedHeader: boolean;
7
+ fixedSidebar: boolean;
8
+ splitMenus: boolean;
9
+ };
10
+ export declare const DEFAULT_HEADER: {
11
+ showLogo: boolean;
12
+ showRightContent: boolean;
13
+ showMenuToggle: boolean;
14
+ showBackButton: boolean;
15
+ showPageTitle: boolean;
16
+ showActionButtons: boolean;
17
+ position: "fixed";
18
+ backgroundColor: string;
19
+ elevation: number;
20
+ showHeader: boolean;
21
+ showMenu: boolean;
22
+ menuHeaderRender: boolean;
23
+ searchBarRender: boolean;
24
+ searchBarBehavior: SearchBarBehavior;
25
+ searchBarOverlay: boolean;
26
+ scrollThreshold: number;
27
+ };
28
+ export declare const SEARCH_TYPES: {
29
+ readonly HOTELS: "HOTELS";
30
+ readonly FLIGHTS: "FLIGHTS";
31
+ readonly CARS: "CARS";
32
+ };
33
+ export declare const AMENITIES: readonly ["WiFi", "Pool", "Parking", "Air Conditioning", "Kitchen", "Washer", "Dryer", "TV", "Gym", "Elevator", "Hot Tub", "Breakfast"];
34
+ export declare const SHARED_VIEW_CONFIG: {
35
+ layout: {
36
+ navigationMode: NavigationMode;
37
+ sideMenuType: SideMenuType;
38
+ upperMenuDividerName: string;
39
+ middleMenuDividerName: string;
40
+ lowerMenuDividerName: string;
41
+ contentWidth: ContentWidth;
42
+ fixedHeader: boolean;
43
+ fixedSidebar: boolean;
44
+ splitMenus: boolean;
45
+ };
46
+ regions: {
47
+ header: {
48
+ showSearchSlot: boolean;
49
+ height: string;
50
+ showLogo: boolean;
51
+ showRightContent: boolean;
52
+ showMenuToggle: boolean;
53
+ showBackButton: boolean;
54
+ showPageTitle: boolean;
55
+ showActionButtons: boolean;
56
+ position: "fixed";
57
+ backgroundColor: string;
58
+ elevation: number;
59
+ showHeader: boolean;
60
+ showMenu: boolean;
61
+ menuHeaderRender: boolean;
62
+ searchBarRender: boolean;
63
+ searchBarBehavior: SearchBarBehavior;
64
+ searchBarOverlay: boolean;
65
+ scrollThreshold: number;
66
+ };
67
+ background: {
68
+ type: string;
69
+ color: string;
70
+ image: string;
71
+ video: string;
72
+ videoThumbnail: string;
73
+ };
74
+ footer: {
75
+ showFooter: boolean;
76
+ };
77
+ };
78
+ };
2
79
  export type ISettings = ProSettings & {
3
80
  logo: string;
4
81
  showSettingPanel: boolean;
82
+ secondaryColor: string;
5
83
  titleColor: string;
6
84
  language: string;
7
85
  fontFamily: string;
@@ -14,6 +92,110 @@ export type ISettings = ProSettings & {
14
92
  textColor: string;
15
93
  theme: string;
16
94
  themeType: string;
95
+ loginThemeColor: string;
96
+ loginFormPosition: string;
97
+ loginSocials: string;
98
+ loginBackgroundImage: string;
99
+ verifyFormLayout: string;
100
+ verifyFormImageUrl: string;
101
+ verifyFormBackgroundStyle: string;
102
+ verifyFormVisibleFields: string;
103
+ verifyFormShowSkipButton: boolean;
104
+ searchbarSettings: SearchbarSettings;
105
+ currentRoute: string;
106
+ sideMenuType: SideMenuType;
107
+ routeSettings: Record<string, {
108
+ layout: {
109
+ desktop: {
110
+ navigationMode: NavigationMode;
111
+ sideMenuType: SideMenuType;
112
+ contentWidth: ContentWidth;
113
+ fixedHeader: boolean;
114
+ fixedSidebar: boolean;
115
+ splitMenus: boolean;
116
+ upperMenuDividerName: string;
117
+ middleMenuDividerName: string;
118
+ lowerMenuDividerName: string;
119
+ };
120
+ mobile: {
121
+ navigationMode: NavigationMode;
122
+ sideMenuType: SideMenuType;
123
+ contentWidth: ContentWidth;
124
+ fixedHeader: boolean;
125
+ fixedSidebar: boolean;
126
+ splitMenus: boolean;
127
+ upperMenuDividerName: string;
128
+ middleMenuDividerName: string;
129
+ lowerMenuDividerName: string;
130
+ };
131
+ };
132
+ regions: {
133
+ desktop: {
134
+ header: {
135
+ showLogo: boolean;
136
+ showSearchSlot: boolean;
137
+ showRightContent: boolean;
138
+ showMenuToggle: boolean;
139
+ showBackButton: boolean;
140
+ showPageTitle: boolean;
141
+ showActionButtons: boolean;
142
+ position: string;
143
+ height: string;
144
+ backgroundColor: string;
145
+ elevation: number;
146
+ showHeader: boolean;
147
+ showMenu: boolean;
148
+ menuHeaderRender: boolean;
149
+ searchBarRender: boolean;
150
+ searchBarBehavior: SearchBarBehavior;
151
+ searchBarOverlay: boolean;
152
+ scrollThreshold: number;
153
+ };
154
+ background: {
155
+ type: string;
156
+ color: string;
157
+ image: string;
158
+ video: string;
159
+ videoThumbnail: string;
160
+ };
161
+ footer: {
162
+ showFooter: boolean;
163
+ };
164
+ };
165
+ mobile: {
166
+ header: {
167
+ showLogo: boolean;
168
+ showSearchSlot: boolean;
169
+ showRightContent: boolean;
170
+ showMenuToggle: boolean;
171
+ showBackButton: boolean;
172
+ showPageTitle: boolean;
173
+ showActionButtons: boolean;
174
+ position: string;
175
+ height: string;
176
+ backgroundColor: string;
177
+ elevation: number;
178
+ showHeader: boolean;
179
+ showMenu: boolean;
180
+ menuHeaderRender: boolean;
181
+ searchBarRender: boolean;
182
+ searchBarBehavior: SearchBarBehavior;
183
+ searchBarOverlay: boolean;
184
+ scrollThreshold: number;
185
+ };
186
+ background: {
187
+ type: string;
188
+ color: string;
189
+ image: string;
190
+ video: string;
191
+ };
192
+ footer: {
193
+ showFooter: boolean;
194
+ };
195
+ };
196
+ };
197
+ }>;
198
+ components: any[];
199
+ activeComponent: string | null;
17
200
  };
18
- export declare const defaultSettings: ISettings;
19
201
  //# sourceMappingURL=defaultSettings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultSettings.d.ts","sourceRoot":"","sources":["../../src/config/defaultSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,SAkC7B,CAAC"}
1
+ {"version":3,"file":"defaultSettings.d.ts","sourceRoot":"","sources":["../../src/config/defaultSettings.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,70 @@
1
- const defaultSettings = {
2
- logo: 'https://cdmbase.s3.ca-central-1.amazonaws.com/favicon-new-128.svg',
3
- themeType: 'light', // 'dark'
4
- theme: 'default',
5
- primaryColor: '#1890ff', // '#1890ff'
6
- colorPrimary: '#1677FF', // '#1890ff'
7
- layout: 'mix',
1
+ import {SearchBarBehavior}from'../interfaces/settings.js';// Constants for common values
2
+ const DEFAULT_LAYOUT = {
8
3
  contentWidth: 'Fluid',
9
4
  fixedHeader: true,
10
- fixSiderbar: true,
11
- searchBarRender: true,
12
- colorWeak: false,
13
- title: 'CDMBase LLC',
14
- iconfontUrl: '',
15
- showSettingPanel: true,
16
- titleColor: '#2869E0',
17
- language: 'en-US',
18
- fontFamily: 'Poppins, sans-serif',
19
- titleFontWeight: '700',
20
- titleHeight: '30px',
21
- titleFontSize: '1.8rem',
22
- letterSpacings: '1px',
23
- showHeader: true,
24
- showFooter: true,
25
- showMenu: false,
26
- // menuRender: true,
27
- headerTheme: undefined,
28
- headerHeight: undefined,
29
- menu: undefined,
5
+ fixedSidebar: true,
30
6
  splitMenus: false,
31
- siderMenuType: 'sub',
32
- siderBgColor: '#000000',
33
- headerBgColor: '#000000',
34
- textColor: '#a19c9c',
35
- };export{defaultSettings};//# sourceMappingURL=defaultSettings.js.map
7
+ };
8
+ const DEFAULT_HEADER = {
9
+ showLogo: true,
10
+ showRightContent: true,
11
+ showMenuToggle: true,
12
+ showBackButton: true,
13
+ showPageTitle: true,
14
+ showActionButtons: true,
15
+ position: 'fixed',
16
+ backgroundColor: 'inherit',
17
+ elevation: 2,
18
+ showHeader: true,
19
+ showMenu: true,
20
+ menuHeaderRender: true,
21
+ searchBarRender: true,
22
+ searchBarBehavior: SearchBarBehavior.PERMANENT,
23
+ searchBarOverlay: true,
24
+ scrollThreshold: 50,
25
+ };
26
+ const SEARCH_TYPES = {
27
+ HOTELS: 'HOTELS',
28
+ FLIGHTS: 'FLIGHTS',
29
+ CARS: 'CARS',
30
+ };
31
+ const AMENITIES = [
32
+ 'WiFi',
33
+ 'Pool',
34
+ 'Parking',
35
+ 'Air Conditioning',
36
+ 'Kitchen',
37
+ 'Washer',
38
+ 'Dryer',
39
+ 'TV',
40
+ 'Gym',
41
+ 'Elevator',
42
+ 'Hot Tub',
43
+ 'Breakfast',
44
+ ];
45
+ // Shared view configuration
46
+ const SHARED_VIEW_CONFIG = {
47
+ layout: {
48
+ ...DEFAULT_LAYOUT,
49
+ navigationMode: 'mixed',
50
+ sideMenuType: 'expanded',
51
+ upperMenuDividerName: 'Navigation',
52
+ middleMenuDividerName: 'Dashboard',
53
+ lowerMenuDividerName: 'Admin',
54
+ },
55
+ regions: {
56
+ header: {
57
+ ...DEFAULT_HEADER,
58
+ showSearchSlot: true,
59
+ height: '64px',
60
+ },
61
+ background: {
62
+ type: 'color',
63
+ color: 'inherit',
64
+ image: '',
65
+ video: '',
66
+ videoThumbnail: '',
67
+ },
68
+ footer: { showFooter: true },
69
+ },
70
+ };export{AMENITIES,DEFAULT_HEADER,DEFAULT_LAYOUT,SEARCH_TYPES,SHARED_VIEW_CONFIG};//# sourceMappingURL=defaultSettings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultSettings.js","sources":["../../src/config/defaultSettings.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAoB,MAAA,eAAmB;AAEvC,IAAA,IAAY,EAAA,mEAA0B;IAClC,kBAAa;IACb,KAAgB,EAAA,SAAA;IAChB,YAAY,WAAO;IACnB,uBAAiB;IACjB,MAAU,EAAA;IACV,YAAe,EAAA;IACf,WAAW,EAAE;IACb,WAAa,EAAA;IACb,eAAc;IACd,SAAY,EAAA;IACZ,KAAa,EAAA;IACb,WAAW;IACX,gBAAc,EAAA,IAAA;IACd,UAAS,WAAS;IACrB,QAAA,EAAA,OAAA;AAED,IAAA,UAAA,EAAa,qBAAiB;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"defaultSettings.js","sources":["../../src/config/defaultSettings.ts"],"sourcesContent":[null],"names":[],"mappings":"0DACA;AACS,MAAA,cAAc;AAGvB,IAAA,qBAAa;qBACgB;;;;AAI3B,MAAA,cAAA,GAAA;AAEF,IAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;AAiBE,MAAA,YAAA,GAAA;AAEF,IAAA,MAAA,EAAA;;;;AAIW,MAAA,SAAA,GAAA;AAEX,IAAA,MAAA;AAgBA,IAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,9 +1,7 @@
1
- import * as envalid from 'envalid';
2
1
  import { DefaultSettings } from '../interfaces';
3
- declare const preConfig: Readonly<{
2
+ export declare const config: Readonly<{
4
3
  LAYOUT_SETTINGS: DefaultSettings;
5
4
  APP_DOMAIN: string;
6
- } & envalid.CleanedEnvAccessors>;
7
- declare let config: typeof preConfig;
8
- export { config };
5
+ APPLICATION_ID: string;
6
+ } & import("envalid").CleanedEnvAccessors>;
9
7
  //# sourceMappingURL=env-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/config/env-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAMhD,QAAA,MAAM,SAAS;;;gCAKb,CAAC;AACH,QAAA,IAAI,MAAM,EAAS,OAAO,SAAS,CAAC;AAQpC,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/config/env-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAoBhD,eAAO,MAAM,MAAM;;;;0CAAY,CAAC"}
@@ -1,16 +1,16 @@
1
- import*as envalid from'envalid';import {getEnvironment}from'@common-stack/core';import {defaultSettings}from'./defaultSettings.js';const { json } = envalid;
2
- const env = getEnvironment();
3
- const preConfig = envalid.cleanEnv(env, {
1
+ import {cleanEnv,str,json}from'envalid';import {getEnvironment}from'@common-stack/core';const env = getEnvironment();
2
+ const preConfig = cleanEnv(env, {
4
3
  LAYOUT_SETTINGS: json({
5
- default: JSON.stringify(defaultSettings),
4
+ default: JSON.stringify({
5
+ // Empty defaults - all settings come from backend GraphQL query
6
+ // hiddenMenuKeys: [],
7
+ // hiddenMenuCategories: [],
8
+ }),
9
+ }),
10
+ APP_DOMAIN: str({ default: 'cdebase.dev' }),
11
+ APPLICATION_ID: str({
12
+ default: '660e8400-e29b-41d4-a716-446655440001',
13
+ desc: 'Matches the Application ID exist already',
6
14
  }),
7
- APP_DOMAIN: envalid.str({ default: 'cdebase.dev' }),
8
15
  });
9
- let config = {};
10
- // overwrite the layout settings with environment
11
- if (env.LAYOUT_SETTINGS) {
12
- config = { ...preConfig, LAYOUT_SETTINGS: { ...defaultSettings, ...preConfig.LAYOUT_SETTINGS } };
13
- }
14
- else {
15
- config = preConfig;
16
- }export{config};//# sourceMappingURL=env-config.js.map
16
+ const config = preConfig;export{config};//# sourceMappingURL=env-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-config.js","sources":["../../src/config/env-config.ts"],"sourcesContent":[null],"names":[],"mappings":";;kCAaG,CAAA,GAAA,EAAA;AACH,IAAA,eAAmB,EAAA,IAAA,CAAA;AAQnB,QAAO,OAAQ,EAAE,IAAC,CAAA,SAAA,CAAA,eAAA,CAAA;;;;;;;;;;;"}
1
+ {"version":3,"file":"env-config.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../../src/constants/constants.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAO,MAAA,sBAA4B,GAAA;AAC5B,MAAA,eAAqB,GAAA;AACrB,MAAA,2BAAiC,GAAA"}
1
+ {"version":3,"file":"constants.js","sources":["../../src/constants/constants.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA,MAAA,sBAAa,GAAA;AACb,MAAA,eAAa,GAAA;AACb,MAAA,2BAAa,GAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sources":["../../src/constants/error.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAY,MAAA,aAAgB,GAAA;AAC5B,MAAA,yBAA4B,GAAA;AAEhB,MAAA,wBAAyB,GAAG;AACxC,MAAA,0BAAa,GAAA;AAED,MAAA,qBAAA,GAA2B"}
1
+ {"version":3,"file":"error.js","sources":["../../src/constants/error.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAY,MAAA,aAAa,GAAG;AAC5B,MAAA,yBAA4B,GAAA;AAEhB,MAAA,wBAAyB,GAAG;AACxC,MAAA,0BAAa,GAAA;AAED,MAAA,qBAAA,GAAwB"}