@hubspot/ui-extensions-dev-server 1.2.0 → 2.0.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 (184) hide show
  1. package/dist/lib/DevModeParentInterface.js +5 -6
  2. package/dist/lib/DevModeUnifiedInterface.js +2 -2
  3. package/dist/lib/DevServerState.d.ts +14 -4
  4. package/dist/lib/DevServerState.js +34 -1
  5. package/dist/lib/__tests__/DevModeParentInterface.spec.js +42 -1
  6. package/dist/lib/__tests__/DevModeUnifiedInterface.spec.js +34 -0
  7. package/dist/lib/__tests__/DevServerState.spec.js +180 -0
  8. package/dist/lib/__tests__/{app-functions/errorReporter.spec.js → errorReporter.spec.js} +5 -5
  9. package/dist/lib/__tests__/extensionsService.spec.js +57 -9
  10. package/dist/lib/__tests__/factories.d.ts +1 -1
  11. package/dist/lib/__tests__/factories.js +1 -1
  12. package/dist/lib/__tests__/fixtures/extensionConfig.js +3 -0
  13. package/dist/lib/__tests__/plugins/devBuildPlugin.spec.js +1 -1
  14. package/dist/lib/__tests__/{app-functions/services → proxy}/AppProxyService.spec.js +73 -3
  15. package/dist/lib/__tests__/{app-functions → proxy}/signing.spec.js +1 -1
  16. package/dist/lib/__tests__/server.spec.js +14 -11
  17. package/dist/lib/__tests__/serverless/config.spec.js +61 -0
  18. package/dist/lib/__tests__/{app-functions → serverless}/context.spec.js +2 -2
  19. package/dist/lib/__tests__/serverless/executor_unsupported.spec.js +37 -0
  20. package/dist/lib/__tests__/{app-functions/executor_v20232.spec.js → serverless/executor_v20251.spec.js} +6 -13
  21. package/dist/lib/__tests__/{app-functions/executor_v20231.spec.js → serverless/executor_v202603.spec.js} +26 -11
  22. package/dist/lib/__tests__/{app-functions → serverless}/fixtures/constants.d.ts +4 -3
  23. package/dist/lib/__tests__/{app-functions → serverless}/fixtures/constants.js +9 -3
  24. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-async-fails.cjs +5 -0
  25. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-async-fails.d.cts +1 -0
  26. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-async-succeeds.cjs +5 -0
  27. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-async-succeeds.d.cts +3 -0
  28. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-does-not-export-main.cjs +4 -0
  29. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-does-not-export-main.d.cts +1 -0
  30. package/dist/lib/__tests__/{app-functions/fixtures/v2023.1/app.functions → serverless/fixtures/v2026.03/functions}/func-echos-input.cjs +3 -3
  31. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-echos-input.d.cts +5 -0
  32. package/dist/lib/__tests__/{app-functions/fixtures/v2023.1/app.functions → serverless/fixtures/v2026.03/functions}/func-logs.cjs +2 -2
  33. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-logs.d.cts +3 -0
  34. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-function.cjs +4 -0
  35. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-function.d.cts +1 -0
  36. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-implicitly.cjs +7 -0
  37. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-implicitly.d.cts +1 -0
  38. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-promise-rejected.cjs +4 -0
  39. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-promise-rejected.d.cts +1 -0
  40. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-promise-resolved.cjs +4 -0
  41. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-promise-resolved.d.cts +3 -0
  42. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-text.cjs +4 -0
  43. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-text.d.cts +1 -0
  44. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-undefined.cjs +4 -0
  45. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-returns-undefined.d.cts +1 -0
  46. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-times-out.cjs +12 -0
  47. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-times-out.d.cts +1 -0
  48. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-undeclared.cjs +4 -0
  49. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-undeclared.d.cts +1 -0
  50. package/dist/lib/__tests__/{app-functions/fixtures/v2023.1/app.functions → serverless/fixtures/v2026.03/functions}/func-uses-secret.cjs +3 -3
  51. package/dist/lib/__tests__/serverless/fixtures/v2026.03/functions/func-uses-secret.d.cts +4 -0
  52. package/dist/lib/__tests__/{app-functions → serverless}/secrets.spec.js +4 -4
  53. package/dist/lib/__tests__/{app-functions → serverless}/services/PrivateAppUserTokenManager.spec.js +4 -4
  54. package/dist/lib/__tests__/serverless/services/services_v20251.spec.d.ts +1 -0
  55. package/dist/lib/__tests__/{app-functions/services/services_v20232.spec.js → serverless/services/services_v20251.spec.js} +9 -63
  56. package/dist/lib/__tests__/serverless/services/services_v202603.spec.d.ts +1 -0
  57. package/dist/lib/__tests__/{app-functions/services/services_v20231.spec.js → serverless/services/services_v202603.spec.js} +18 -91
  58. package/dist/lib/__tests__/serverless/setup.d.ts +1 -0
  59. package/dist/lib/__tests__/utils.spec.js +26 -1
  60. package/dist/lib/constants.d.ts +2 -2
  61. package/dist/lib/constants.js +2 -2
  62. package/dist/lib/{app-functions/errorReporter.js → errorReporter.js} +2 -2
  63. package/dist/lib/extensionsService.js +6 -0
  64. package/dist/lib/{app-functions/services → proxy}/AppProxyService.d.ts +1 -1
  65. package/dist/lib/{app-functions/services → proxy}/AppProxyService.js +15 -4
  66. package/dist/lib/proxy/constants.d.ts +13 -0
  67. package/dist/lib/{app-functions → proxy}/constants.js +0 -18
  68. package/dist/lib/proxy/types.d.ts +44 -0
  69. package/dist/lib/proxy/types.js +1 -0
  70. package/dist/lib/server.js +2 -1
  71. package/dist/lib/serverless/config.js +100 -0
  72. package/dist/lib/serverless/constants.d.ts +7 -0
  73. package/dist/lib/serverless/constants.js +12 -0
  74. package/dist/lib/{app-functions → serverless}/errors.d.ts +1 -0
  75. package/dist/lib/{app-functions → serverless}/errors.js +6 -0
  76. package/dist/lib/{app-functions → serverless}/executor.js +19 -13
  77. package/dist/lib/serverless/secrets.d.ts +5 -0
  78. package/dist/lib/{app-functions → serverless}/services/AppFunctionExecutionService.js +1 -1
  79. package/dist/lib/{app-functions → serverless}/services/PrivateAppUserTokenManager.js +1 -1
  80. package/dist/lib/{app-functions → serverless}/types.d.ts +1 -44
  81. package/dist/lib/types.d.ts +12 -3
  82. package/dist/lib/types.js +7 -2
  83. package/dist/lib/utils.d.ts +2 -1
  84. package/dist/lib/utils.js +3 -0
  85. package/package.json +1 -1
  86. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-async-fails.cjs +0 -8
  87. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-async-fails.d.cts +0 -1
  88. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-async-succeeds.cjs +0 -8
  89. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-async-succeeds.d.cts +0 -1
  90. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-callback-on-promise-rejected.cjs +0 -8
  91. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-callback-on-promise-resolved.cjs +0 -8
  92. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-callback-on-promise-resolved.d.cts +0 -1
  93. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-does-not-export-main.cjs +0 -4
  94. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-does-not-export-main.d.cts +0 -1
  95. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-echos-input.d.cts +0 -1
  96. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-logs.d.cts +0 -1
  97. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-function.cjs +0 -4
  98. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-function.d.cts +0 -1
  99. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-promise-rejected.cjs +0 -7
  100. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-promise-rejected.d.cts +0 -1
  101. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-promise-resolved.cjs +0 -7
  102. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-promise-resolved.d.cts +0 -1
  103. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-text.d.cts +0 -1
  104. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-undefined.cjs +0 -4
  105. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-returns-undefined.d.cts +0 -1
  106. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-times-out.cjs +0 -10
  107. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-times-out.d.cts +0 -1
  108. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-undeclared.cjs +0 -4
  109. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-undeclared.d.cts +0 -1
  110. package/dist/lib/__tests__/app-functions/fixtures/v2023.1/app.functions/func-uses-secret.d.cts +0 -1
  111. package/dist/lib/app-functions/config.js +0 -48
  112. package/dist/lib/app-functions/constants.d.ts +0 -26
  113. package/dist/lib/app-functions/index.d.ts +0 -4
  114. package/dist/lib/app-functions/index.js +0 -4
  115. package/dist/lib/app-functions/secrets.d.ts +0 -5
  116. package/dist/lib/app-functions/services/index.d.ts +0 -3
  117. package/dist/lib/app-functions/services/index.js +0 -3
  118. /package/dist/lib/__tests__/{app-functions/context.spec.d.ts → DevServerState.spec.d.ts} +0 -0
  119. /package/dist/lib/__tests__/{app-functions/errorReporter.spec.d.ts → errorReporter.spec.d.ts} +0 -0
  120. /package/dist/lib/__tests__/{app-functions/services → proxy}/AppProxyService.spec.d.ts +0 -0
  121. /package/dist/lib/__tests__/{app-functions → proxy}/signing.spec.d.ts +0 -0
  122. /package/dist/lib/__tests__/{app-functions/executor_v20231.spec.d.ts → serverless/config.spec.d.ts} +0 -0
  123. /package/dist/lib/__tests__/{app-functions/executor_v20232.spec.d.ts → serverless/context.spec.d.ts} +0 -0
  124. /package/dist/lib/__tests__/{app-functions/secrets.spec.d.ts → serverless/executor_unsupported.spec.d.ts} +0 -0
  125. /package/dist/lib/__tests__/{app-functions/services/PrivateAppUserTokenManager.spec.d.ts → serverless/executor_v20251.spec.d.ts} +0 -0
  126. /package/dist/lib/__tests__/{app-functions/services/services_v20231.spec.d.ts → serverless/executor_v202603.spec.d.ts} +0 -0
  127. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-async-fails.cjs +0 -0
  128. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-async-fails.d.cts +0 -0
  129. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-async-succeeds.cjs +0 -0
  130. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-async-succeeds.d.cts +0 -0
  131. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-calls-callback.cjs +0 -0
  132. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-calls-callback.d.cts +0 -0
  133. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-does-not-export-main.cjs +0 -0
  134. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-does-not-export-main.d.cts +0 -0
  135. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-echos-input.cjs +0 -0
  136. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-echos-input.d.cts +0 -0
  137. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-logs.cjs +0 -0
  138. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-logs.d.cts +0 -0
  139. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-function.cjs +0 -0
  140. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-function.d.cts +0 -0
  141. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-implicitly.cjs +0 -0
  142. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-implicitly.d.cts +0 -0
  143. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-promise-rejected.cjs +0 -0
  144. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-promise-rejected.d.cts +0 -0
  145. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-promise-resolved.cjs +0 -0
  146. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-promise-resolved.d.cts +0 -0
  147. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-text.cjs +0 -0
  148. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-text.d.cts +0 -0
  149. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-undefined.cjs +0 -0
  150. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-returns-undefined.d.cts +0 -0
  151. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.1 → serverless/fixtures/v2025.1}/app.functions/func-throws-error.cjs +0 -0
  152. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.1 → serverless/fixtures/v2025.1}/app.functions/func-throws-error.d.cts +0 -0
  153. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-times-out.cjs +0 -0
  154. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-times-out.d.cts +0 -0
  155. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-undeclared.cjs +0 -0
  156. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-undeclared.d.cts +0 -0
  157. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-uses-secret.cjs +0 -0
  158. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2 → serverless/fixtures/v2025.1}/app.functions/func-uses-secret.d.cts +0 -0
  159. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.1/app.functions/func-returns-text.cjs → serverless/fixtures/v2026.03/functions/func-calls-callback.cjs} +0 -0
  160. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.1/app.functions/func-callback-on-promise-rejected.d.cts → serverless/fixtures/v2026.03/functions/func-calls-callback.d.cts} +0 -0
  161. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2/app.functions → serverless/fixtures/v2026.03/functions}/func-throws-error.cjs +0 -0
  162. /package/dist/lib/__tests__/{app-functions/fixtures/v2023.2/app.functions → serverless/fixtures/v2026.03/functions}/func-throws-error.d.cts +0 -0
  163. /package/dist/lib/__tests__/{app-functions/services/services_v20232.spec.d.ts → serverless/secrets.spec.d.ts} +0 -0
  164. /package/dist/lib/__tests__/{app-functions/setup.d.ts → serverless/services/PrivateAppUserTokenManager.spec.d.ts} +0 -0
  165. /package/dist/lib/__tests__/{app-functions → serverless}/setup.js +0 -0
  166. /package/dist/lib/{app-functions/errorReporter.d.ts → errorReporter.d.ts} +0 -0
  167. /package/dist/lib/{app-functions → proxy}/signing.d.ts +0 -0
  168. /package/dist/lib/{app-functions → proxy}/signing.js +0 -0
  169. /package/dist/lib/{app-functions → serverless}/api/privateAppUserToken.d.ts +0 -0
  170. /package/dist/lib/{app-functions → serverless}/api/privateAppUserToken.js +0 -0
  171. /package/dist/lib/{app-functions → serverless}/config.d.ts +0 -0
  172. /package/dist/lib/{app-functions → serverless}/context.d.ts +0 -0
  173. /package/dist/lib/{app-functions → serverless}/context.js +0 -0
  174. /package/dist/lib/{app-functions → serverless}/executor.d.ts +0 -0
  175. /package/dist/lib/{app-functions → serverless}/secrets.js +0 -0
  176. /package/dist/lib/{app-functions → serverless}/services/AppFunctionExecutionService.d.ts +0 -0
  177. /package/dist/lib/{app-functions → serverless}/services/PrivateAppUserTokenManager.d.ts +0 -0
  178. /package/dist/lib/{app-functions → serverless}/services/constants.d.ts +0 -0
  179. /package/dist/lib/{app-functions → serverless}/services/constants.js +0 -0
  180. /package/dist/lib/{app-functions → serverless}/services/messages.d.ts +0 -0
  181. /package/dist/lib/{app-functions → serverless}/services/messages.js +0 -0
  182. /package/dist/lib/{app-functions → serverless}/types.js +0 -0
  183. /package/dist/lib/{app-functions → serverless}/utils.d.ts +0 -0
  184. /package/dist/lib/{app-functions → serverless}/utils.js +0 -0
@@ -31,18 +31,17 @@ export class DevModeParentInterface {
31
31
  _getPlatformVersion(projectConfig) {
32
32
  const { platformVersion } = projectConfig ?? {};
33
33
  if (!platformVersion) {
34
- return PLATFORM_VERSION.V20231;
34
+ return PLATFORM_VERSION.V20251;
35
35
  }
36
36
  switch (platformVersion) {
37
- case PLATFORM_VERSION.V20231:
38
- return PLATFORM_VERSION.V20231;
39
- case PLATFORM_VERSION.V20232:
40
- return PLATFORM_VERSION.V20232;
41
37
  case PLATFORM_VERSION.V20251:
42
38
  return PLATFORM_VERSION.V20251;
43
39
  case PLATFORM_VERSION.V20252:
44
- case PLATFORM_VERSION.UNSTABLE:
45
40
  return PLATFORM_VERSION.V20252;
41
+ case PLATFORM_VERSION.V202603:
42
+ case PLATFORM_VERSION.V202603BETA:
43
+ case PLATFORM_VERSION.UNSTABLE:
44
+ return PLATFORM_VERSION.V202603;
46
45
  default:
47
46
  return throwUnhandledPlatformVersionError(platformVersion);
48
47
  }
@@ -30,6 +30,7 @@ class DevModeUnifiedInterface extends DevModeParentInterface {
30
30
  const appData = components[appUid];
31
31
  // Use the app data to generate the app config in the expected shape, to match old projects.
32
32
  const appConfig = {
33
+ unified: true,
33
34
  name: appData.config.name,
34
35
  description: appData.config?.description,
35
36
  uid: appData.uid,
@@ -39,9 +40,8 @@ class DevModeUnifiedInterface extends DevModeParentInterface {
39
40
  },
40
41
  },
41
42
  auth: appData.config?.auth,
43
+ distribution: appData.config?.distribution,
42
44
  support: appData.config?.support,
43
- // All unified apps are currently "public" meaning they don't support serverless and do support a proxy.
44
- // The determination of what is "public" and "private" as it relates to our usage is still up in the air.
45
45
  isPublicApp: true,
46
46
  allowedUrls: appData.config?.permittedUrls
47
47
  ? Object.values(appData.config.permittedUrls).flat()
@@ -1,5 +1,6 @@
1
- import { AppConfig, ExtensionOutputConfig, ExtensionMetadata, Logger, PlatformVersion } from './types.ts';
2
- import { ServiceConfiguration, ProxyServiceConfig } from './app-functions/types.ts';
1
+ import { AppConfig, UnifiedAppConfig, UnifiedAppDistribution, ExtensionOutputConfig, ExtensionMetadata, Logger, PlatformVersion } from './types.ts';
2
+ import { ServiceConfiguration } from './serverless/types.ts';
3
+ import { ProxyServiceConfig } from './proxy/types.ts';
3
4
  import { ExtensionsWebSocket } from './ExtensionsWebSocket.ts';
4
5
  type DevServerStateLocalDevUrlMapping = ProxyServiceConfig['localDevUrlMapping'] | undefined;
5
6
  interface DevServerStateArgs {
@@ -13,7 +14,7 @@ interface DevServerStateArgs {
13
14
  api: string;
14
15
  web: string;
15
16
  };
16
- appConfig?: AppConfig;
17
+ appConfig?: AppConfig | UnifiedAppConfig;
17
18
  }
18
19
  export declare class DevServerState {
19
20
  private _expressPort;
@@ -25,7 +26,7 @@ export declare class DevServerState {
25
26
  private _portalId?;
26
27
  private _mutableState;
27
28
  logger: Logger;
28
- appConfig?: AppConfig;
29
+ appConfig?: AppConfig | UnifiedAppConfig;
29
30
  constructor({ localDevUrlMapping, extensionConfigs, accountId, expressPort, platformVersion, logger, urls, appConfig, }: DevServerStateArgs);
30
31
  get portalId(): number | undefined;
31
32
  get expressPort(): number;
@@ -37,7 +38,16 @@ export declare class DevServerState {
37
38
  get extensionsWebSocket(): ExtensionsWebSocket | undefined;
38
39
  set extensionsWebSocket(ws: ExtensionsWebSocket);
39
40
  getExtensionsWebSocket(): ExtensionsWebSocket;
41
+ /**
42
+ * In legacy apps, there was a difference between public and private apps at the project level.
43
+ * In unified apps, this is no longer applied and all apps are considered "public".
44
+ * However, to support serverless for some 2026.03 apps we need to consider an app to be private if it has static auth and private distribution.
45
+ * For other unified apps we continue to mark them public (despite auth/dist settings) to maintain current behavior.
46
+ * @returns
47
+ */
40
48
  isPublicApp(): boolean;
49
+ get authType(): string | undefined;
50
+ get distribution(): UnifiedAppDistribution | undefined;
41
51
  setWebSocketSetupCallback(callback: () => void): void;
42
52
  triggerWebSocketSetup(): void;
43
53
  }
@@ -1,4 +1,6 @@
1
- import { OUTPUT_DIR } from "./constants.js";
1
+ import { OUTPUT_DIR, PLATFORM_VERSION } from "./constants.js";
2
+ import { UnifiedAppAuthTypes, UnifiedAppDistributionTypes, } from "./types.js";
3
+ import { isUnifiedAppConfig } from "./utils.js";
2
4
  import path from 'path';
3
5
  export class DevServerState {
4
6
  _expressPort;
@@ -80,9 +82,40 @@ export class DevServerState {
80
82
  }
81
83
  return this._mutableState.extensionsWebSocket;
82
84
  }
85
+ /**
86
+ * In legacy apps, there was a difference between public and private apps at the project level.
87
+ * In unified apps, this is no longer applied and all apps are considered "public".
88
+ * However, to support serverless for some 2026.03 apps we need to consider an app to be private if it has static auth and private distribution.
89
+ * For other unified apps we continue to mark them public (despite auth/dist settings) to maintain current behavior.
90
+ * @returns
91
+ */
83
92
  isPublicApp() {
93
+ if (this.appConfig && isUnifiedAppConfig(this.appConfig)) {
94
+ const platformVersion = this._functionsConfig.platformVersion;
95
+ const is2026Version = platformVersion === PLATFORM_VERSION.V202603 ||
96
+ platformVersion === PLATFORM_VERSION.V202603BETA ||
97
+ platformVersion === PLATFORM_VERSION.UNSTABLE;
98
+ if (is2026Version &&
99
+ this.appConfig.distribution === UnifiedAppDistributionTypes.PRIVATE &&
100
+ this.appConfig.auth?.type === UnifiedAppAuthTypes.STATIC) {
101
+ return false;
102
+ }
103
+ return true;
104
+ }
84
105
  return !!this.appConfig?.isPublicApp;
85
106
  }
107
+ get authType() {
108
+ if (this.appConfig && isUnifiedAppConfig(this.appConfig)) {
109
+ return this.appConfig.auth.type;
110
+ }
111
+ return undefined;
112
+ }
113
+ get distribution() {
114
+ if (this.appConfig && isUnifiedAppConfig(this.appConfig)) {
115
+ return this.appConfig.distribution;
116
+ }
117
+ return undefined;
118
+ }
86
119
  setWebSocketSetupCallback(callback) {
87
120
  this._mutableState.webSocketSetupCallback = callback;
88
121
  }
@@ -104,7 +104,7 @@ describe('DevModeUnifiedInterface', () => {
104
104
  localDevUrlMapping: localConfig.proxy,
105
105
  extensionConfigs: [cardConfig],
106
106
  accountId,
107
- platformVersion: PLATFORM_VERSION.V20231,
107
+ platformVersion: PLATFORM_VERSION.V20251,
108
108
  expressPort: EXPRESS_DEFAULT_PORT,
109
109
  logger,
110
110
  urls,
@@ -150,6 +150,47 @@ describe('DevModeUnifiedInterface', () => {
150
150
  expect(DevModeInterface.onUploadRequired).not.toHaveBeenCalled();
151
151
  });
152
152
  });
153
+ describe('_getPlatformVersion', () => {
154
+ it('should default to V20251 when projectConfig is undefined', () => {
155
+ expect(DevModeInterface._getPlatformVersion(undefined)).toBe(PLATFORM_VERSION.V20251);
156
+ });
157
+ it('should default to V20251 when platformVersion is not set', () => {
158
+ expect(DevModeInterface._getPlatformVersion({ name: 'test', srcDir: '/tmp' })).toBe(PLATFORM_VERSION.V20251);
159
+ });
160
+ it.each([
161
+ [PLATFORM_VERSION.V20251, PLATFORM_VERSION.V20251],
162
+ [PLATFORM_VERSION.V20252, PLATFORM_VERSION.V20252],
163
+ [PLATFORM_VERSION.V202603, PLATFORM_VERSION.V202603],
164
+ ])('should return %s as-is', (input, expected) => {
165
+ expect(DevModeInterface._getPlatformVersion({
166
+ name: 'test',
167
+ srcDir: '/tmp',
168
+ platformVersion: input,
169
+ })).toBe(expected);
170
+ });
171
+ it('should map V202603BETA to V202603', () => {
172
+ expect(DevModeInterface._getPlatformVersion({
173
+ name: 'test',
174
+ srcDir: '/tmp',
175
+ platformVersion: PLATFORM_VERSION.V202603BETA,
176
+ })).toBe(PLATFORM_VERSION.V202603);
177
+ });
178
+ it('should map UNSTABLE to V202603', () => {
179
+ expect(DevModeInterface._getPlatformVersion({
180
+ name: 'test',
181
+ srcDir: '/tmp',
182
+ platformVersion: PLATFORM_VERSION.UNSTABLE,
183
+ })).toBe(PLATFORM_VERSION.V202603);
184
+ });
185
+ it('should throw for an unrecognized platform version', () => {
186
+ expect(() => DevModeInterface._getPlatformVersion({
187
+ name: 'test',
188
+ srcDir: '/tmp',
189
+ // @ts-expect-error - testing unrecognized version
190
+ platformVersion: '9999.99',
191
+ })).toThrow();
192
+ });
193
+ });
153
194
  describe('cleanup', () => {
154
195
  it('should call shutdown when cleanup is invoked', async () => {
155
196
  const shutdown = vi
@@ -221,6 +221,27 @@ describe('DevModeUnifiedInterface', () => {
221
221
  ?.appConfig;
222
222
  expect(appConfig?.variables).toStrictEqual(profileData);
223
223
  });
224
+ it('should pass distribution from app config when provided', async () => {
225
+ const componentsWithDistribution = {
226
+ application_name: {
227
+ ...unifiedAppConfig,
228
+ config: {
229
+ ...unifiedAppConfig.config,
230
+ distribution: 'private',
231
+ },
232
+ },
233
+ card_one: unifiedCardOneConfig,
234
+ };
235
+ await DevModeUnifiedInterface.setup({
236
+ components: componentsWithDistribution,
237
+ logger,
238
+ setActiveApp,
239
+ urls,
240
+ });
241
+ const appConfig = DevModeUnifiedInterface.configs?.[0]
242
+ ?.appConfig;
243
+ expect(appConfig?.distribution).toBe('private');
244
+ });
224
245
  it('should use empty object for variables when no profileData provided', async () => {
225
246
  await DevModeUnifiedInterface.setup({
226
247
  components,
@@ -232,5 +253,18 @@ describe('DevModeUnifiedInterface', () => {
232
253
  ?.appConfig;
233
254
  expect(appConfig?.variables).toStrictEqual({});
234
255
  });
256
+ describe('isPublicApp on appConfig', () => {
257
+ it('should always default isPublicApp to true for unified apps', async () => {
258
+ await DevModeUnifiedInterface.setup({
259
+ components,
260
+ logger,
261
+ setActiveApp,
262
+ urls,
263
+ });
264
+ const appConfig = DevModeUnifiedInterface.configs?.[0]
265
+ ?.appConfig;
266
+ expect(appConfig?.isPublicApp).toBe(true);
267
+ });
268
+ });
235
269
  });
236
270
  });
@@ -0,0 +1,180 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { DevServerState } from "../DevServerState.js";
3
+ import { PLATFORM_VERSION } from "../constants.js";
4
+ import { UnifiedAppAuthTypes } from "../types.js";
5
+ import { createMockLogger, createDevServerConfig } from "./factories.js";
6
+ import { transformedUnifiedAppConfig } from "./fixtures/extensionConfig.js";
7
+ describe('DevServerState', () => {
8
+ let logger;
9
+ beforeEach(() => {
10
+ logger = createMockLogger();
11
+ });
12
+ describe('isPublicApp', () => {
13
+ describe('legacy apps', () => {
14
+ it('should return true when appConfig.isPublicApp is true', () => {
15
+ const state = new DevServerState(createDevServerConfig(logger, {
16
+ appConfig: {
17
+ name: 'Legacy App',
18
+ scopes: [],
19
+ public: false,
20
+ description: '',
21
+ extensions: { crm: { cards: [] } },
22
+ isPublicApp: true,
23
+ },
24
+ }));
25
+ expect(state.isPublicApp()).toBe(true);
26
+ });
27
+ it('should return false when appConfig.isPublicApp is false', () => {
28
+ const state = new DevServerState(createDevServerConfig(logger, {
29
+ appConfig: {
30
+ name: 'Legacy App',
31
+ scopes: [],
32
+ public: false,
33
+ description: '',
34
+ extensions: { crm: { cards: [] } },
35
+ isPublicApp: false,
36
+ },
37
+ }));
38
+ expect(state.isPublicApp()).toBe(false);
39
+ });
40
+ it('should return false when appConfig is undefined', () => {
41
+ const state = new DevServerState(createDevServerConfig(logger, {
42
+ appConfig: undefined,
43
+ }));
44
+ expect(state.isPublicApp()).toBe(false);
45
+ });
46
+ });
47
+ describe('unified apps', () => {
48
+ it('should return true for unified apps on V20251', () => {
49
+ const state = new DevServerState(createDevServerConfig(logger, {
50
+ platformVersion: PLATFORM_VERSION.V20251,
51
+ appConfig: transformedUnifiedAppConfig,
52
+ }));
53
+ expect(state.isPublicApp()).toBe(true);
54
+ });
55
+ it('should return true for unified apps on V20251 even with private + static auth', () => {
56
+ const state = new DevServerState(createDevServerConfig(logger, {
57
+ platformVersion: PLATFORM_VERSION.V20251,
58
+ appConfig: {
59
+ ...transformedUnifiedAppConfig,
60
+ distribution: 'private',
61
+ auth: {
62
+ type: UnifiedAppAuthTypes.STATIC,
63
+ requiredScopes: [],
64
+ },
65
+ },
66
+ }));
67
+ expect(state.isPublicApp()).toBe(true);
68
+ });
69
+ describe('V202603', () => {
70
+ it('should return false when distribution is private and auth is static', () => {
71
+ const state = new DevServerState(createDevServerConfig(logger, {
72
+ platformVersion: PLATFORM_VERSION.V202603,
73
+ appConfig: {
74
+ ...transformedUnifiedAppConfig,
75
+ distribution: 'private',
76
+ auth: {
77
+ type: UnifiedAppAuthTypes.STATIC,
78
+ requiredScopes: [],
79
+ },
80
+ },
81
+ }));
82
+ expect(state.isPublicApp()).toBe(false);
83
+ });
84
+ it('should return true when distribution is marketplace', () => {
85
+ const state = new DevServerState(createDevServerConfig(logger, {
86
+ platformVersion: PLATFORM_VERSION.V202603,
87
+ appConfig: {
88
+ ...transformedUnifiedAppConfig,
89
+ distribution: 'marketplace',
90
+ },
91
+ }));
92
+ expect(state.isPublicApp()).toBe(true);
93
+ });
94
+ it('should return true when distribution is private but auth is OAUTH', () => {
95
+ const state = new DevServerState(createDevServerConfig(logger, {
96
+ platformVersion: PLATFORM_VERSION.V202603,
97
+ appConfig: {
98
+ ...transformedUnifiedAppConfig,
99
+ distribution: 'private',
100
+ auth: {
101
+ type: UnifiedAppAuthTypes.OAUTH,
102
+ requiredScopes: [],
103
+ },
104
+ },
105
+ }));
106
+ expect(state.isPublicApp()).toBe(true);
107
+ });
108
+ });
109
+ describe('V202603BETA', () => {
110
+ it('should return false when distribution is private and auth is static', () => {
111
+ const state = new DevServerState(createDevServerConfig(logger, {
112
+ platformVersion: PLATFORM_VERSION.V202603BETA,
113
+ appConfig: {
114
+ ...transformedUnifiedAppConfig,
115
+ distribution: 'private',
116
+ auth: {
117
+ type: UnifiedAppAuthTypes.STATIC,
118
+ requiredScopes: [],
119
+ },
120
+ },
121
+ }));
122
+ expect(state.isPublicApp()).toBe(false);
123
+ });
124
+ });
125
+ describe('UNSTABLE', () => {
126
+ it('should return false when distribution is private and auth is static', () => {
127
+ const state = new DevServerState(createDevServerConfig(logger, {
128
+ platformVersion: PLATFORM_VERSION.UNSTABLE,
129
+ appConfig: {
130
+ ...transformedUnifiedAppConfig,
131
+ distribution: 'private',
132
+ auth: {
133
+ type: UnifiedAppAuthTypes.STATIC,
134
+ requiredScopes: [],
135
+ },
136
+ },
137
+ }));
138
+ expect(state.isPublicApp()).toBe(false);
139
+ });
140
+ it('should return true when distribution is marketplace', () => {
141
+ const state = new DevServerState(createDevServerConfig(logger, {
142
+ platformVersion: PLATFORM_VERSION.UNSTABLE,
143
+ appConfig: {
144
+ ...transformedUnifiedAppConfig,
145
+ distribution: 'marketplace',
146
+ },
147
+ }));
148
+ expect(state.isPublicApp()).toBe(true);
149
+ });
150
+ });
151
+ });
152
+ });
153
+ describe('authType', () => {
154
+ it('should return auth type for unified apps', () => {
155
+ const state = new DevServerState(createDevServerConfig(logger, {
156
+ appConfig: transformedUnifiedAppConfig,
157
+ }));
158
+ expect(state.authType).toBe(UnifiedAppAuthTypes.OAUTH);
159
+ });
160
+ it('should return undefined for legacy apps', () => {
161
+ const state = new DevServerState(createDevServerConfig(logger));
162
+ expect(state.authType).toBeUndefined();
163
+ });
164
+ });
165
+ describe('distribution', () => {
166
+ it('should return distribution for unified apps', () => {
167
+ const state = new DevServerState(createDevServerConfig(logger, {
168
+ appConfig: {
169
+ ...transformedUnifiedAppConfig,
170
+ distribution: 'private',
171
+ },
172
+ }));
173
+ expect(state.distribution).toBe('private');
174
+ });
175
+ it('should return undefined for legacy apps', () => {
176
+ const state = new DevServerState(createDevServerConfig(logger));
177
+ expect(state.distribution).toBeUndefined();
178
+ });
179
+ });
180
+ });
@@ -17,15 +17,15 @@ describe('errorReporter', () => {
17
17
  });
18
18
  describe('module initialization', () => {
19
19
  it('initializes Sentry with correct DSN on import', async () => {
20
- await import('../../app-functions/errorReporter.js');
20
+ await import('../errorReporter.js');
21
21
  expect(mockInit).toHaveBeenCalledWith(expect.objectContaining({
22
22
  dsn: expect.stringContaining('exceptions.hubspot.com/v2/1'),
23
23
  }));
24
24
  });
25
25
  it('includes version information in initialization', async () => {
26
- await import('../../app-functions/errorReporter.js');
26
+ await import('../errorReporter.js');
27
27
  expect(mockInit).toHaveBeenCalledWith(expect.objectContaining({
28
- release: expect.stringMatching(/@hubspot\/app-functions-dev-server@\d+\.\d+\.\d+/),
28
+ release: expect.stringMatching(/@hubspot\/ui-extensions-dev-server@\d+\.\d+\.\d+/),
29
29
  initialScope: expect.objectContaining({
30
30
  tags: expect.objectContaining({
31
31
  devServerVersion: expect.any(String),
@@ -36,7 +36,7 @@ describe('errorReporter', () => {
36
36
  });
37
37
  describe('reportError', () => {
38
38
  beforeEach(async () => {
39
- const errorReporter = await import('../../app-functions/errorReporter.js');
39
+ const errorReporter = await import('../errorReporter.js');
40
40
  reportError = errorReporter.reportError;
41
41
  });
42
42
  it('reports error with tags and extras', () => {
@@ -70,7 +70,7 @@ describe('errorReporter', () => {
70
70
  mockExit = vi
71
71
  .spyOn(process, 'exit')
72
72
  .mockImplementation(() => undefined);
73
- await import('../../app-functions/errorReporter.js');
73
+ await import('../errorReporter.js');
74
74
  });
75
75
  afterEach(() => {
76
76
  mockExit.mockRestore();
@@ -1,17 +1,23 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest';
2
2
  import path from 'path';
3
- vi.mock('../utils', () => ({
4
- loadManifest: vi.fn(() => {
5
- return {
6
- name: 'fake manifest file',
7
- };
8
- }),
9
- }));
3
+ vi.mock('../utils', async () => {
4
+ const actual = await vi.importActual('../utils');
5
+ return {
6
+ ...actual,
7
+ loadManifest: vi.fn(() => {
8
+ return {
9
+ name: 'fake manifest file',
10
+ };
11
+ }),
12
+ };
13
+ });
10
14
  import { EXTENSIONS_MESSAGE_VERSION, PLATFORM_VERSION } from "../constants.js";
11
15
  import extensionsService from "../extensionsService.js";
12
16
  import { loadManifest } from "../utils.js";
13
17
  import { DevServerState } from "../DevServerState.js";
18
+ import { UnifiedAppAuthTypes } from "../types.js";
14
19
  import { createMockLogger, createDevServerConfig } from "./factories.js";
20
+ import { transformedUnifiedAppConfig } from "./fixtures/extensionConfig.js";
15
21
  describe('extensionsService', () => {
16
22
  let devServerState;
17
23
  let logger;
@@ -68,7 +74,7 @@ describe('extensionsService', () => {
68
74
  version: EXTENSIONS_MESSAGE_VERSION,
69
75
  websocket: `ws://localhost:${expressPort}`,
70
76
  capabilities,
71
- platformVersion: PLATFORM_VERSION.V20231,
77
+ platformVersion: PLATFORM_VERSION.V20251,
72
78
  });
73
79
  });
74
80
  it('should return a handler that includes platform version in response', () => {
@@ -84,7 +90,7 @@ describe('extensionsService', () => {
84
90
  };
85
91
  handler({}, response);
86
92
  expect(jsonMethod).toHaveBeenCalledWith(expect.objectContaining({
87
- platformVersion: PLATFORM_VERSION.V20231,
93
+ platformVersion: PLATFORM_VERSION.V20251,
88
94
  }));
89
95
  });
90
96
  it('should work when platform version is undefined', () => {
@@ -121,6 +127,48 @@ describe('extensionsService', () => {
121
127
  const callArgs = jsonMethod.mock.calls[0][0];
122
128
  expect(callArgs).not.toHaveProperty('platformVersion');
123
129
  });
130
+ it('should include authType in response for unified app configs', () => {
131
+ const unifiedState = new DevServerState(createDevServerConfig(logger, {
132
+ appConfig: transformedUnifiedAppConfig,
133
+ }));
134
+ const handler = extensionsService.generateExtensionsHandler(unifiedState);
135
+ const jsonMethod = vi.fn();
136
+ const response = {
137
+ status: vi.fn(() => ({ json: jsonMethod })),
138
+ };
139
+ handler({}, response);
140
+ expect(jsonMethod).toHaveBeenCalledWith(expect.objectContaining({
141
+ authType: UnifiedAppAuthTypes.OAUTH,
142
+ }));
143
+ });
144
+ it('should include distribution in response when present in unified app config', () => {
145
+ const unifiedState = new DevServerState(createDevServerConfig(logger, {
146
+ appConfig: {
147
+ ...transformedUnifiedAppConfig,
148
+ distribution: 'private',
149
+ },
150
+ }));
151
+ const handler = extensionsService.generateExtensionsHandler(unifiedState);
152
+ const jsonMethod = vi.fn();
153
+ const response = {
154
+ status: vi.fn(() => ({ json: jsonMethod })),
155
+ };
156
+ handler({}, response);
157
+ expect(jsonMethod).toHaveBeenCalledWith(expect.objectContaining({
158
+ distribution: 'private',
159
+ }));
160
+ });
161
+ it('should not include authType or distribution for legacy app configs', () => {
162
+ const handler = extensionsService.generateExtensionsHandler(devServerState);
163
+ const jsonMethod = vi.fn();
164
+ const response = {
165
+ status: vi.fn(() => ({ json: jsonMethod })),
166
+ };
167
+ handler({}, response);
168
+ const callArgs = jsonMethod.mock.calls[0][0];
169
+ expect(callArgs).not.toHaveProperty('authType');
170
+ expect(callArgs).not.toHaveProperty('distribution');
171
+ });
124
172
  it('should return a handler that sends error responses when something goes wrong', () => {
125
173
  const handler = extensionsService.generateExtensionsHandler(devServerState);
126
174
  const jsonMethod = vi.fn();
@@ -9,7 +9,7 @@ export declare function createDevServerConfig(logger: Logger, overrides?: {}): {
9
9
  };
10
10
  logger: Logger;
11
11
  accountId: number;
12
- platformVersion: "2023.1";
12
+ platformVersion: "2025.1";
13
13
  expressPort: number;
14
14
  extensionConfigs: {
15
15
  type: string;
@@ -24,7 +24,7 @@ export function createDevServerConfig(logger, overrides = {}) {
24
24
  urls,
25
25
  logger,
26
26
  accountId: 12345,
27
- platformVersion: PLATFORM_VERSION.V20231,
27
+ platformVersion: PLATFORM_VERSION.V20251,
28
28
  expressPort: 1234,
29
29
  extensionConfigs: [cardConfig],
30
30
  ...overrides,
@@ -63,6 +63,7 @@ export const unifiedAppConfig = {
63
63
  config: {
64
64
  description: 'Generate dope memes',
65
65
  name: 'Meme generator',
66
+ distribution: 'marketplace',
66
67
  auth: {
67
68
  type: UnifiedAppAuthTypes.OAUTH,
68
69
  redirectUrls: ['http://localhost:3000/oauth-callback'],
@@ -91,6 +92,7 @@ export const unifiedAppConfig = {
91
92
  },
92
93
  };
93
94
  export const transformedUnifiedAppConfig = {
95
+ unified: true,
94
96
  name: unifiedAppConfig.config.name,
95
97
  description: unifiedAppConfig.config.description,
96
98
  uid: unifiedAppConfig.uid,
@@ -104,6 +106,7 @@ export const transformedUnifiedAppConfig = {
104
106
  },
105
107
  },
106
108
  auth: unifiedAppConfig.config.auth,
109
+ distribution: 'marketplace',
107
110
  support: undefined,
108
111
  isPublicApp: true,
109
112
  allowedUrls: ['https://api.hubapi.com'],
@@ -44,7 +44,7 @@ describe('devBuildPlugin', () => {
44
44
  devServerState: new DevServerState({
45
45
  extensionConfigs: [transformedUnifiedCardOneConfig],
46
46
  accountId: 88888,
47
- platformVersion: PLATFORM_VERSION.V20232,
47
+ platformVersion: PLATFORM_VERSION.V20251,
48
48
  expressPort: 1234,
49
49
  logger,
50
50
  urls,