@funnelsgrove/runtime 0.1.6 → 0.1.8

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.
@@ -2,7 +2,7 @@ export declare const readRuntimeEnv: (reader: () => string | undefined) => strin
2
2
  export declare const isDevelopmentRuntime: () => boolean;
3
3
  export declare const RUNTIME_ENV_KEYS: {
4
4
  readonly appDealsApiBaseUrl: readonly ["NEXT_PUBLIC_APP_DEALS_API_BASE_URL", "APP_DEALS_API_BASE_URL"];
5
- readonly funnelSdkPublishableKey: readonly ["NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY", "NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY", "FUNNEL_SDK_PUBLISHABLE_KEY"];
5
+ readonly funnelSdkPublishableKey: readonly ["NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY", "NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY", "FUNNEL_SDK_PUBLISHABLE_KEY"];
6
6
  readonly funnelId: readonly ["NEXT_PUBLIC_FUNNEL_ID", "FUNNEL_ID", "NEXT_PUBLIC_RAG_FUNNEL_ID", "RAG_FUNNEL_ID", "NEXT_PUBLIC_PREVIEW_TEST_FUNNEL_ID", "PREVIEW_TEST_FUNNEL_ID"];
7
7
  readonly projectId: readonly ["NEXT_PUBLIC_PROJECT_ID", "PROJECT_ID"];
8
8
  readonly funnelVersionId: readonly ["NEXT_PUBLIC_FUNNEL_VERSION_ID", "FUNNEL_VERSION_ID"];
@@ -14,8 +14,8 @@ export const isDevelopmentRuntime = () => {
14
14
  export const RUNTIME_ENV_KEYS = {
15
15
  appDealsApiBaseUrl: ['NEXT_PUBLIC_APP_DEALS_API_BASE_URL', 'APP_DEALS_API_BASE_URL'],
16
16
  funnelSdkPublishableKey: [
17
- 'NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY',
18
17
  'NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY',
18
+ 'NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY',
19
19
  'FUNNEL_SDK_PUBLISHABLE_KEY',
20
20
  ],
21
21
  funnelId: [
package/dist/index.d.ts CHANGED
@@ -22,6 +22,7 @@ export * from './services/api.service.js';
22
22
  export * from './services/funnel-state.service.js';
23
23
  export * from './services/logger.js';
24
24
  export * from './services/preview-frame.service.js';
25
+ export * from './services/project-env.js';
25
26
  export * from './services/public-env.js';
26
27
  export * from './services/runtime-api.config.js';
27
28
  export * from './services/runtime-mode.service.js';
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ export * from './services/api.service.js';
22
22
  export * from './services/funnel-state.service.js';
23
23
  export * from './services/logger.js';
24
24
  export * from './services/preview-frame.service.js';
25
+ export * from './services/project-env.js';
25
26
  export * from './services/public-env.js';
26
27
  export * from './services/runtime-api.config.js';
27
28
  export * from './services/runtime-mode.service.js';
@@ -194,7 +194,7 @@ export const collectCurrentFunnelAttribution = (input = {}) => {
194
194
  language,
195
195
  platform,
196
196
  vendor,
197
- timeZone, deviceType: resolveDeviceType(userAgent), osFamily: resolveOsFamily(userAgent) }, posthogContext)),
197
+ timeZone, capturedAt: new Date().toISOString(), deviceType: resolveDeviceType(userAgent), osFamily: resolveOsFamily(userAgent) }, posthogContext)),
198
198
  };
199
199
  };
200
200
  export const mergeFunnelUserAttribution = (current, incoming) => {
@@ -0,0 +1,94 @@
1
+ export declare const PROJECT_ENV_STANDARD_KEYS: {
2
+ readonly funnelSdkPublishableKey: "NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY";
3
+ readonly funnelId: "NEXT_PUBLIC_FUNNEL_ID";
4
+ readonly funnelVersionId: "NEXT_PUBLIC_FUNNEL_VERSION_ID";
5
+ readonly projectId: "NEXT_PUBLIC_PROJECT_ID";
6
+ readonly posthogProjectApiKey: "NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY";
7
+ readonly stripeEnabled: "STRIPE_ENABLED";
8
+ readonly stripeActiveMode: "NEXT_PUBLIC_STRIPE_ACTIVE_MODE";
9
+ readonly stripeTestPublishableKey: "NEXT_PUBLIC_STRIPE_TEST_PUBLISHABLE_KEY";
10
+ readonly stripeTestSecretKey: "STRIPE_TEST_SECRET_KEY";
11
+ readonly stripeTestWebhookSecret: "STRIPE_TEST_WEBHOOK_SECRET";
12
+ readonly stripeLivePublishableKey: "NEXT_PUBLIC_STRIPE_LIVE_PUBLISHABLE_KEY";
13
+ readonly stripeLiveSecretKey: "STRIPE_LIVE_SECRET_KEY";
14
+ readonly stripeLiveWebhookSecret: "STRIPE_LIVE_WEBHOOK_SECRET";
15
+ readonly funnelIosDeepLink: "NEXT_PUBLIC_FUNNEL_IOS_DEEP_LINK";
16
+ readonly funnelAndroidPlayStoreUrl: "NEXT_PUBLIC_ANDROID_PLAY_STORE_URL";
17
+ readonly funnelUniversalLink: "NEXT_PUBLIC_FUNNEL_UNIVERSAL_LINK";
18
+ readonly funnelAppStoreId: "NEXT_PUBLIC_FUNNEL_APP_STORE_ID";
19
+ readonly funnelGoogleStoreId: "NEXT_PUBLIC_FUNNEL_GOOGLE_STORE_ID";
20
+ readonly funnelTimezone: "NEXT_PUBLIC_FUNNEL_TIMEZONE";
21
+ readonly funnelFaviconUrl: "NEXT_PUBLIC_FUNNEL_FAVICON_URL";
22
+ readonly funnelPageTitle: "NEXT_PUBLIC_FUNNEL_PAGE_TITLE";
23
+ readonly funnelPageDescription: "NEXT_PUBLIC_FUNNEL_PAGE_DESCRIPTION";
24
+ readonly funnelPagePreviewImageUrl: "NEXT_PUBLIC_FUNNEL_PAGE_PREVIEW_IMAGE_URL";
25
+ readonly funnelCompanyName: "NEXT_PUBLIC_FUNNEL_COMPANY_NAME";
26
+ readonly funnelCompanyAddress: "NEXT_PUBLIC_FUNNEL_COMPANY_ADDRESS";
27
+ readonly funnelCompanyCountry: "NEXT_PUBLIC_FUNNEL_COMPANY_COUNTRY";
28
+ readonly funnelPrivacyUrl: "NEXT_PUBLIC_FUNNEL_PRIVACY_URL";
29
+ readonly funnelTermsUrl: "NEXT_PUBLIC_FUNNEL_TERMS_URL";
30
+ readonly funnelCustomDomain: "FUNNEL_CUSTOM_DOMAIN";
31
+ readonly funnelSupportEmail: "NEXT_PUBLIC_FUNNEL_SUPPORT_EMAIL";
32
+ readonly metaPixelEnabled: "NEXT_PUBLIC_META_PIXEL_ENABLED";
33
+ readonly metaPixelId: "NEXT_PUBLIC_META_PIXEL_ID";
34
+ readonly metaConversionsAccessToken: "META_CONVERSIONS_ACCESS_TOKEN";
35
+ readonly metaTestEventCode: "META_TEST_EVENT_CODE";
36
+ };
37
+ export type ProjectEnvStandardKey = keyof typeof PROJECT_ENV_STANDARD_KEYS;
38
+ export type ProjectEnvStandardValues = Record<ProjectEnvStandardKey, string>;
39
+ export declare const PROJECT_ENV_STANDARD_KEY_ALIASES: {
40
+ readonly funnelSdkPublishableKey: readonly ["NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY", "NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY"];
41
+ readonly funnelId: readonly ["NEXT_PUBLIC_FUNNEL_ID"];
42
+ readonly funnelVersionId: readonly ["NEXT_PUBLIC_FUNNEL_VERSION_ID"];
43
+ readonly projectId: readonly ["NEXT_PUBLIC_PROJECT_ID"];
44
+ readonly posthogProjectApiKey: readonly ["NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY"];
45
+ readonly stripeEnabled: readonly ["STRIPE_ENABLED"];
46
+ readonly stripeActiveMode: readonly ["NEXT_PUBLIC_STRIPE_ACTIVE_MODE", "STRIPE_ACTIVE_MODE"];
47
+ readonly stripeTestPublishableKey: readonly ["NEXT_PUBLIC_STRIPE_TEST_PUBLISHABLE_KEY", "STRIPE_TEST_PUBLISHABLE_KEY"];
48
+ readonly stripeTestSecretKey: readonly ["STRIPE_TEST_SECRET_KEY"];
49
+ readonly stripeTestWebhookSecret: readonly ["STRIPE_TEST_WEBHOOK_SECRET"];
50
+ readonly stripeLivePublishableKey: readonly ["NEXT_PUBLIC_STRIPE_LIVE_PUBLISHABLE_KEY", "STRIPE_LIVE_PUBLISHABLE_KEY"];
51
+ readonly stripeLiveSecretKey: readonly ["STRIPE_LIVE_SECRET_KEY"];
52
+ readonly stripeLiveWebhookSecret: readonly ["STRIPE_LIVE_WEBHOOK_SECRET"];
53
+ readonly funnelIosDeepLink: readonly ["NEXT_PUBLIC_FUNNEL_IOS_DEEP_LINK", "APPSTORE_DEEPLINK_URL"];
54
+ readonly funnelAndroidPlayStoreUrl: readonly ["NEXT_PUBLIC_ANDROID_PLAY_STORE_URL", "GOOGLE_PLAY_URL"];
55
+ readonly funnelUniversalLink: readonly ["NEXT_PUBLIC_FUNNEL_UNIVERSAL_LINK", "WEB_LANDING_URL"];
56
+ readonly funnelAppStoreId: readonly ["NEXT_PUBLIC_FUNNEL_APP_STORE_ID"];
57
+ readonly funnelGoogleStoreId: readonly ["NEXT_PUBLIC_FUNNEL_GOOGLE_STORE_ID"];
58
+ readonly funnelTimezone: readonly ["NEXT_PUBLIC_FUNNEL_TIMEZONE"];
59
+ readonly funnelFaviconUrl: readonly ["NEXT_PUBLIC_FUNNEL_FAVICON_URL"];
60
+ readonly funnelPageTitle: readonly ["NEXT_PUBLIC_FUNNEL_PAGE_TITLE"];
61
+ readonly funnelPageDescription: readonly ["NEXT_PUBLIC_FUNNEL_PAGE_DESCRIPTION"];
62
+ readonly funnelPagePreviewImageUrl: readonly ["NEXT_PUBLIC_FUNNEL_PAGE_PREVIEW_IMAGE_URL"];
63
+ readonly funnelCompanyName: readonly ["NEXT_PUBLIC_FUNNEL_COMPANY_NAME"];
64
+ readonly funnelCompanyAddress: readonly ["NEXT_PUBLIC_FUNNEL_COMPANY_ADDRESS"];
65
+ readonly funnelCompanyCountry: readonly ["NEXT_PUBLIC_FUNNEL_COMPANY_COUNTRY"];
66
+ readonly funnelPrivacyUrl: readonly ["NEXT_PUBLIC_FUNNEL_PRIVACY_URL"];
67
+ readonly funnelTermsUrl: readonly ["NEXT_PUBLIC_FUNNEL_TERMS_URL"];
68
+ readonly funnelCustomDomain: readonly ["FUNNEL_CUSTOM_DOMAIN"];
69
+ readonly funnelSupportEmail: readonly ["NEXT_PUBLIC_FUNNEL_SUPPORT_EMAIL", "FUNNEL_SUPPORT_EMAIL"];
70
+ readonly metaPixelEnabled: readonly ["NEXT_PUBLIC_META_PIXEL_ENABLED", "META_PIXEL_ENABLED"];
71
+ readonly metaPixelId: readonly ["NEXT_PUBLIC_META_PIXEL_ID", "META_PIXEL_ID"];
72
+ readonly metaConversionsAccessToken: readonly ["META_CONVERSIONS_ACCESS_TOKEN"];
73
+ readonly metaTestEventCode: readonly ["META_TEST_EVENT_CODE"];
74
+ };
75
+ export type ProjectEnvVariableLike = {
76
+ key: string;
77
+ value: string | null | undefined;
78
+ };
79
+ export type ProjectEnvVariableInputLike = {
80
+ key: string;
81
+ value: string;
82
+ };
83
+ export interface ParsedProjectEnvVariables {
84
+ envMap: Map<string, string>;
85
+ standard: ProjectEnvStandardValues;
86
+ }
87
+ export declare const canonicalizeProjectEnvKey: (key: string) => string;
88
+ export declare const normalizeProjectEnvValue: (value: string | null | undefined) => string;
89
+ export declare const buildProjectEnvMap: (variables: readonly ProjectEnvVariableLike[]) => Map<string, string>;
90
+ export declare const getProjectEnvValue: (envMap: ReadonlyMap<string, string>, keys: readonly string[], options?: {
91
+ requireNonEmpty?: boolean;
92
+ }) => string;
93
+ export declare const parseProjectEnvVariables: (variables: readonly ProjectEnvVariableLike[]) => ParsedProjectEnvVariables;
94
+ export declare const normalizeProjectEnvVariables: (variables: readonly ProjectEnvVariableInputLike[]) => ProjectEnvVariableInputLike[];
@@ -0,0 +1,184 @@
1
+ export const PROJECT_ENV_STANDARD_KEYS = {
2
+ funnelSdkPublishableKey: 'NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY',
3
+ funnelId: 'NEXT_PUBLIC_FUNNEL_ID',
4
+ funnelVersionId: 'NEXT_PUBLIC_FUNNEL_VERSION_ID',
5
+ projectId: 'NEXT_PUBLIC_PROJECT_ID',
6
+ posthogProjectApiKey: 'NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY',
7
+ stripeEnabled: 'STRIPE_ENABLED',
8
+ stripeActiveMode: 'NEXT_PUBLIC_STRIPE_ACTIVE_MODE',
9
+ stripeTestPublishableKey: 'NEXT_PUBLIC_STRIPE_TEST_PUBLISHABLE_KEY',
10
+ stripeTestSecretKey: 'STRIPE_TEST_SECRET_KEY',
11
+ stripeTestWebhookSecret: 'STRIPE_TEST_WEBHOOK_SECRET',
12
+ stripeLivePublishableKey: 'NEXT_PUBLIC_STRIPE_LIVE_PUBLISHABLE_KEY',
13
+ stripeLiveSecretKey: 'STRIPE_LIVE_SECRET_KEY',
14
+ stripeLiveWebhookSecret: 'STRIPE_LIVE_WEBHOOK_SECRET',
15
+ funnelIosDeepLink: 'NEXT_PUBLIC_FUNNEL_IOS_DEEP_LINK',
16
+ funnelAndroidPlayStoreUrl: 'NEXT_PUBLIC_ANDROID_PLAY_STORE_URL',
17
+ funnelUniversalLink: 'NEXT_PUBLIC_FUNNEL_UNIVERSAL_LINK',
18
+ funnelAppStoreId: 'NEXT_PUBLIC_FUNNEL_APP_STORE_ID',
19
+ funnelGoogleStoreId: 'NEXT_PUBLIC_FUNNEL_GOOGLE_STORE_ID',
20
+ funnelTimezone: 'NEXT_PUBLIC_FUNNEL_TIMEZONE',
21
+ funnelFaviconUrl: 'NEXT_PUBLIC_FUNNEL_FAVICON_URL',
22
+ funnelPageTitle: 'NEXT_PUBLIC_FUNNEL_PAGE_TITLE',
23
+ funnelPageDescription: 'NEXT_PUBLIC_FUNNEL_PAGE_DESCRIPTION',
24
+ funnelPagePreviewImageUrl: 'NEXT_PUBLIC_FUNNEL_PAGE_PREVIEW_IMAGE_URL',
25
+ funnelCompanyName: 'NEXT_PUBLIC_FUNNEL_COMPANY_NAME',
26
+ funnelCompanyAddress: 'NEXT_PUBLIC_FUNNEL_COMPANY_ADDRESS',
27
+ funnelCompanyCountry: 'NEXT_PUBLIC_FUNNEL_COMPANY_COUNTRY',
28
+ funnelPrivacyUrl: 'NEXT_PUBLIC_FUNNEL_PRIVACY_URL',
29
+ funnelTermsUrl: 'NEXT_PUBLIC_FUNNEL_TERMS_URL',
30
+ funnelCustomDomain: 'FUNNEL_CUSTOM_DOMAIN',
31
+ funnelSupportEmail: 'NEXT_PUBLIC_FUNNEL_SUPPORT_EMAIL',
32
+ metaPixelEnabled: 'NEXT_PUBLIC_META_PIXEL_ENABLED',
33
+ metaPixelId: 'NEXT_PUBLIC_META_PIXEL_ID',
34
+ metaConversionsAccessToken: 'META_CONVERSIONS_ACCESS_TOKEN',
35
+ metaTestEventCode: 'META_TEST_EVENT_CODE',
36
+ };
37
+ export const PROJECT_ENV_STANDARD_KEY_ALIASES = {
38
+ funnelSdkPublishableKey: [
39
+ PROJECT_ENV_STANDARD_KEYS.funnelSdkPublishableKey,
40
+ 'NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY',
41
+ ],
42
+ funnelId: [PROJECT_ENV_STANDARD_KEYS.funnelId],
43
+ funnelVersionId: [PROJECT_ENV_STANDARD_KEYS.funnelVersionId],
44
+ projectId: [PROJECT_ENV_STANDARD_KEYS.projectId],
45
+ posthogProjectApiKey: [PROJECT_ENV_STANDARD_KEYS.posthogProjectApiKey],
46
+ stripeEnabled: [PROJECT_ENV_STANDARD_KEYS.stripeEnabled],
47
+ stripeActiveMode: [PROJECT_ENV_STANDARD_KEYS.stripeActiveMode, 'STRIPE_ACTIVE_MODE'],
48
+ stripeTestPublishableKey: [PROJECT_ENV_STANDARD_KEYS.stripeTestPublishableKey, 'STRIPE_TEST_PUBLISHABLE_KEY'],
49
+ stripeTestSecretKey: [PROJECT_ENV_STANDARD_KEYS.stripeTestSecretKey],
50
+ stripeTestWebhookSecret: [PROJECT_ENV_STANDARD_KEYS.stripeTestWebhookSecret],
51
+ stripeLivePublishableKey: [PROJECT_ENV_STANDARD_KEYS.stripeLivePublishableKey, 'STRIPE_LIVE_PUBLISHABLE_KEY'],
52
+ stripeLiveSecretKey: [PROJECT_ENV_STANDARD_KEYS.stripeLiveSecretKey],
53
+ stripeLiveWebhookSecret: [PROJECT_ENV_STANDARD_KEYS.stripeLiveWebhookSecret],
54
+ funnelIosDeepLink: [PROJECT_ENV_STANDARD_KEYS.funnelIosDeepLink, 'APPSTORE_DEEPLINK_URL'],
55
+ funnelAndroidPlayStoreUrl: [PROJECT_ENV_STANDARD_KEYS.funnelAndroidPlayStoreUrl, 'GOOGLE_PLAY_URL'],
56
+ funnelUniversalLink: [PROJECT_ENV_STANDARD_KEYS.funnelUniversalLink, 'WEB_LANDING_URL'],
57
+ funnelAppStoreId: [PROJECT_ENV_STANDARD_KEYS.funnelAppStoreId],
58
+ funnelGoogleStoreId: [PROJECT_ENV_STANDARD_KEYS.funnelGoogleStoreId],
59
+ funnelTimezone: [PROJECT_ENV_STANDARD_KEYS.funnelTimezone],
60
+ funnelFaviconUrl: [PROJECT_ENV_STANDARD_KEYS.funnelFaviconUrl],
61
+ funnelPageTitle: [PROJECT_ENV_STANDARD_KEYS.funnelPageTitle],
62
+ funnelPageDescription: [PROJECT_ENV_STANDARD_KEYS.funnelPageDescription],
63
+ funnelPagePreviewImageUrl: [PROJECT_ENV_STANDARD_KEYS.funnelPagePreviewImageUrl],
64
+ funnelCompanyName: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyName],
65
+ funnelCompanyAddress: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyAddress],
66
+ funnelCompanyCountry: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyCountry],
67
+ funnelPrivacyUrl: [PROJECT_ENV_STANDARD_KEYS.funnelPrivacyUrl],
68
+ funnelTermsUrl: [PROJECT_ENV_STANDARD_KEYS.funnelTermsUrl],
69
+ funnelCustomDomain: [PROJECT_ENV_STANDARD_KEYS.funnelCustomDomain],
70
+ funnelSupportEmail: [PROJECT_ENV_STANDARD_KEYS.funnelSupportEmail, 'FUNNEL_SUPPORT_EMAIL'],
71
+ metaPixelEnabled: [PROJECT_ENV_STANDARD_KEYS.metaPixelEnabled, 'META_PIXEL_ENABLED'],
72
+ metaPixelId: [PROJECT_ENV_STANDARD_KEYS.metaPixelId, 'META_PIXEL_ID'],
73
+ metaConversionsAccessToken: [PROJECT_ENV_STANDARD_KEYS.metaConversionsAccessToken],
74
+ metaTestEventCode: [PROJECT_ENV_STANDARD_KEYS.metaTestEventCode],
75
+ };
76
+ const LEGACY_TO_CANONICAL_KEY = new Map([
77
+ ['NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY', PROJECT_ENV_STANDARD_KEYS.funnelSdkPublishableKey],
78
+ ['STRIPE_ACTIVE_MODE', PROJECT_ENV_STANDARD_KEYS.stripeActiveMode],
79
+ ['STRIPE_TEST_PUBLISHABLE_KEY', PROJECT_ENV_STANDARD_KEYS.stripeTestPublishableKey],
80
+ ['STRIPE_LIVE_PUBLISHABLE_KEY', PROJECT_ENV_STANDARD_KEYS.stripeLivePublishableKey],
81
+ ['APPSTORE_DEEPLINK_URL', PROJECT_ENV_STANDARD_KEYS.funnelIosDeepLink],
82
+ ['GOOGLE_PLAY_URL', PROJECT_ENV_STANDARD_KEYS.funnelAndroidPlayStoreUrl],
83
+ ['WEB_LANDING_URL', PROJECT_ENV_STANDARD_KEYS.funnelUniversalLink],
84
+ ['FUNNEL_SUPPORT_EMAIL', PROJECT_ENV_STANDARD_KEYS.funnelSupportEmail],
85
+ ['META_PIXEL_ENABLED', PROJECT_ENV_STANDARD_KEYS.metaPixelEnabled],
86
+ ['META_PIXEL_ID', PROJECT_ENV_STANDARD_KEYS.metaPixelId],
87
+ ['NEXT_PUBLIC_PROJECT_ID', PROJECT_ENV_STANDARD_KEYS.projectId],
88
+ ['NEXT_PUBLIC_POSTHOG_PROJECT_API_KEY', PROJECT_ENV_STANDARD_KEYS.posthogProjectApiKey],
89
+ ]);
90
+ export const canonicalizeProjectEnvKey = (key) => {
91
+ return LEGACY_TO_CANONICAL_KEY.get(key) || key;
92
+ };
93
+ export const normalizeProjectEnvValue = (value) => {
94
+ return (value === null || value === void 0 ? void 0 : value.trim()) || '';
95
+ };
96
+ export const buildProjectEnvMap = (variables) => {
97
+ const envMap = new Map();
98
+ for (const variable of variables) {
99
+ const key = canonicalizeProjectEnvKey(variable.key.trim());
100
+ if (!key) {
101
+ continue;
102
+ }
103
+ const nextValue = normalizeProjectEnvValue(variable.value);
104
+ const existingValue = envMap.get(key);
105
+ if (existingValue === undefined || (!existingValue && nextValue)) {
106
+ envMap.set(key, nextValue);
107
+ }
108
+ }
109
+ return envMap;
110
+ };
111
+ export const getProjectEnvValue = (envMap, keys, options) => {
112
+ const requireNonEmpty = Boolean(options === null || options === void 0 ? void 0 : options.requireNonEmpty);
113
+ for (const key of keys) {
114
+ const canonicalKey = canonicalizeProjectEnvKey(key.trim());
115
+ if (!canonicalKey || !envMap.has(canonicalKey)) {
116
+ continue;
117
+ }
118
+ const value = normalizeProjectEnvValue(envMap.get(canonicalKey));
119
+ if (requireNonEmpty && !value) {
120
+ continue;
121
+ }
122
+ return value;
123
+ }
124
+ return '';
125
+ };
126
+ const buildProjectStandardValues = (envMap) => {
127
+ return {
128
+ funnelSdkPublishableKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelSdkPublishableKey),
129
+ funnelId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelId),
130
+ funnelVersionId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelVersionId),
131
+ projectId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.projectId),
132
+ posthogProjectApiKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.posthogProjectApiKey),
133
+ stripeEnabled: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeEnabled),
134
+ stripeActiveMode: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeActiveMode),
135
+ stripeTestPublishableKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeTestPublishableKey),
136
+ stripeTestSecretKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeTestSecretKey),
137
+ stripeTestWebhookSecret: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeTestWebhookSecret),
138
+ stripeLivePublishableKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeLivePublishableKey),
139
+ stripeLiveSecretKey: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeLiveSecretKey),
140
+ stripeLiveWebhookSecret: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.stripeLiveWebhookSecret),
141
+ funnelIosDeepLink: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelIosDeepLink),
142
+ funnelAndroidPlayStoreUrl: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelAndroidPlayStoreUrl),
143
+ funnelUniversalLink: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelUniversalLink),
144
+ funnelAppStoreId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelAppStoreId),
145
+ funnelGoogleStoreId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelGoogleStoreId),
146
+ funnelTimezone: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelTimezone),
147
+ funnelFaviconUrl: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelFaviconUrl),
148
+ funnelPageTitle: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelPageTitle),
149
+ funnelPageDescription: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelPageDescription),
150
+ funnelPagePreviewImageUrl: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelPagePreviewImageUrl),
151
+ funnelCompanyName: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelCompanyName),
152
+ funnelCompanyAddress: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelCompanyAddress),
153
+ funnelCompanyCountry: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelCompanyCountry),
154
+ funnelPrivacyUrl: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelPrivacyUrl),
155
+ funnelTermsUrl: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelTermsUrl),
156
+ funnelCustomDomain: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelCustomDomain),
157
+ funnelSupportEmail: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.funnelSupportEmail),
158
+ metaPixelEnabled: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.metaPixelEnabled),
159
+ metaPixelId: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.metaPixelId),
160
+ metaConversionsAccessToken: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.metaConversionsAccessToken),
161
+ metaTestEventCode: getProjectEnvValue(envMap, PROJECT_ENV_STANDARD_KEY_ALIASES.metaTestEventCode),
162
+ };
163
+ };
164
+ export const parseProjectEnvVariables = (variables) => {
165
+ const envMap = buildProjectEnvMap(variables);
166
+ return {
167
+ envMap,
168
+ standard: buildProjectStandardValues(envMap),
169
+ };
170
+ };
171
+ export const normalizeProjectEnvVariables = (variables) => {
172
+ const deduped = new Map();
173
+ for (const variable of variables) {
174
+ const key = canonicalizeProjectEnvKey(variable.key.trim());
175
+ if (!key) {
176
+ continue;
177
+ }
178
+ deduped.set(key, variable.value);
179
+ }
180
+ return Array.from(deduped.entries()).map(([key, value]) => ({
181
+ key,
182
+ value,
183
+ }));
184
+ };
@@ -2,7 +2,7 @@ import { isDevelopmentRuntime, readRuntimeEnv } from '../config/env.config.js';
2
2
  export { isDevelopmentRuntime, readRuntimeEnv };
3
3
  export declare const RUNTIME_PUBLIC_ENV_KEYS: {
4
4
  readonly apiBaseUrl: readonly ["NEXT_PUBLIC_APP_DEALS_API_BASE_URL", "APP_DEALS_API_BASE_URL"];
5
- readonly funnelSdkPublishableKey: readonly ["NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY", "NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY", "FUNNEL_SDK_PUBLISHABLE_KEY"];
5
+ readonly funnelSdkPublishableKey: readonly ["NEXT_PUBLIC_FUNNEL_PUBLISHABLE_KEY", "NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY", "FUNNEL_SDK_PUBLISHABLE_KEY"];
6
6
  readonly funnelId: readonly ["NEXT_PUBLIC_FUNNEL_ID", "FUNNEL_ID", "NEXT_PUBLIC_RAG_FUNNEL_ID", "RAG_FUNNEL_ID", "NEXT_PUBLIC_PREVIEW_TEST_FUNNEL_ID", "PREVIEW_TEST_FUNNEL_ID"];
7
7
  readonly funnelVersionId: readonly ["NEXT_PUBLIC_FUNNEL_VERSION_ID", "FUNNEL_VERSION_ID"];
8
8
  readonly projectId: readonly ["NEXT_PUBLIC_PROJECT_ID", "PROJECT_ID"];
@@ -64,6 +64,8 @@ export declare const RUNTIME_PUBLIC_DEFAULTS: {
64
64
  export declare const RUNTIME_PREVIEW_PAYMENT_DEFAULTS: {
65
65
  readonly funnelSdkPublishableKey: "pk_test_51SopXWPEfkEVo5kh6foOs9zVyKsVSKLhlQw8YsAfMMymRlGH3Qp8U5I7j5bHivmOB232oJiQZi8cEv1wkmV80QGg00vPcI1DZI";
66
66
  };
67
+ export type RuntimeStaticExportEnv = Record<string, string | undefined>;
68
+ export declare const resolveNextStaticExportRuntimeEnv: (env: RuntimeStaticExportEnv) => Record<string, string>;
67
69
  export declare const isSeedFunnelSdkPublishableKey: (value: string | null | undefined) => boolean;
68
70
  export declare const isPreviewPaymentPublishableKey: (value: string | null | undefined) => boolean;
69
71
  export declare const resolvePreviewPaymentPublishableKey: (value: string | null | undefined) => string;
@@ -1,4 +1,5 @@
1
1
  import { RUNTIME_ENV_KEYS, isDevelopmentRuntime, readRuntimeEnv, runtimeEnvConfig, } from '../config/env.config.js';
2
+ import { PROJECT_ENV_STANDARD_KEYS } from './project-env.js';
2
3
  export { isDevelopmentRuntime, readRuntimeEnv };
3
4
  const DEFAULT_API_BASE_URL = 'https://sdk-api.funnelsgrove.com';
4
5
  const DEFAULT_FUNNEL_SDK_PUBLISHABLE_KEY = 'pk_test_app_deals_seed_public';
@@ -89,6 +90,91 @@ export const RUNTIME_PUBLIC_DEFAULTS = {
89
90
  export const RUNTIME_PREVIEW_PAYMENT_DEFAULTS = {
90
91
  funnelSdkPublishableKey: DEFAULT_PREVIEW_PAYMENT_PUBLISHABLE_KEY,
91
92
  };
93
+ const NEXT_STATIC_EXPORT_RUNTIME_PUBLIC_KEYS = [
94
+ {
95
+ outputKey: 'NEXT_PUBLIC_APP_DEALS_API_BASE_URL',
96
+ inputKeys: ['NEXT_PUBLIC_APP_DEALS_API_BASE_URL'],
97
+ },
98
+ {
99
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelSdkPublishableKey,
100
+ inputKeys: [
101
+ PROJECT_ENV_STANDARD_KEYS.funnelSdkPublishableKey,
102
+ 'NEXT_PUBLIC_FUNNEL_SDK_PUBLISHABLE_KEY',
103
+ ],
104
+ },
105
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelId] },
106
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelVersionId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelVersionId] },
107
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.projectId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.projectId] },
108
+ {
109
+ outputKey: PROJECT_ENV_STANDARD_KEYS.posthogProjectApiKey,
110
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.posthogProjectApiKey],
111
+ },
112
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelSupportEmail, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelSupportEmail] },
113
+ { outputKey: 'NEXT_PUBLIC_IOS_APP_STORE_URL', inputKeys: ['NEXT_PUBLIC_IOS_APP_STORE_URL'] },
114
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelAndroidPlayStoreUrl, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelAndroidPlayStoreUrl] },
115
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelAppStoreId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelAppStoreId] },
116
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelGoogleStoreId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelGoogleStoreId] },
117
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelTimezone, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelTimezone] },
118
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelFaviconUrl, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelFaviconUrl] },
119
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelPageTitle, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelPageTitle] },
120
+ {
121
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelPageDescription,
122
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelPageDescription],
123
+ },
124
+ {
125
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelPagePreviewImageUrl,
126
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelPagePreviewImageUrl],
127
+ },
128
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelCompanyName, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyName] },
129
+ {
130
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelCompanyAddress,
131
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyAddress],
132
+ },
133
+ {
134
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelCompanyCountry,
135
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelCompanyCountry],
136
+ },
137
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelPrivacyUrl, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelPrivacyUrl] },
138
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelTermsUrl, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelTermsUrl] },
139
+ {
140
+ outputKey: PROJECT_ENV_STANDARD_KEYS.funnelUniversalLink,
141
+ inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelUniversalLink],
142
+ },
143
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.funnelIosDeepLink, inputKeys: [PROJECT_ENV_STANDARD_KEYS.funnelIosDeepLink] },
144
+ {
145
+ outputKey: 'NEXT_PUBLIC_FUNNEL_ANDROID_DEEP_LINK',
146
+ inputKeys: ['NEXT_PUBLIC_FUNNEL_ANDROID_DEEP_LINK'],
147
+ },
148
+ { outputKey: 'NEXT_PUBLIC_FUNNEL_QR_TARGET', inputKeys: ['NEXT_PUBLIC_FUNNEL_QR_TARGET'] },
149
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.metaPixelEnabled, inputKeys: [PROJECT_ENV_STANDARD_KEYS.metaPixelEnabled] },
150
+ { outputKey: PROJECT_ENV_STANDARD_KEYS.metaPixelId, inputKeys: [PROJECT_ENV_STANDARD_KEYS.metaPixelId] },
151
+ ];
152
+ const readNonEmptyStaticExportEnv = (env, keys) => {
153
+ var _a;
154
+ for (const key of keys) {
155
+ const value = ((_a = env[key]) === null || _a === void 0 ? void 0 : _a.trim()) || '';
156
+ if (value) {
157
+ return value;
158
+ }
159
+ }
160
+ return null;
161
+ };
162
+ export const resolveNextStaticExportRuntimeEnv = (env) => {
163
+ var _a, _b;
164
+ if (env.NEXT_EXPORT !== '1') {
165
+ return {};
166
+ }
167
+ if ((_a = env.NEXT_PUBLIC_PROJECT_ID) === null || _a === void 0 ? void 0 : _a.trim()) {
168
+ return Object.fromEntries(NEXT_STATIC_EXPORT_RUNTIME_PUBLIC_KEYS.flatMap(({ outputKey, inputKeys }) => {
169
+ const value = readNonEmptyStaticExportEnv(env, inputKeys);
170
+ return value ? [[outputKey, value]] : [];
171
+ }));
172
+ }
173
+ return {
174
+ [PROJECT_ENV_STANDARD_KEYS.funnelSdkPublishableKey]: DEFAULT_PREVIEW_PAYMENT_PUBLISHABLE_KEY,
175
+ [PROJECT_ENV_STANDARD_KEYS.funnelId]: ((_b = env.NEXT_PUBLIC_RAG_FUNNEL_ID) === null || _b === void 0 ? void 0 : _b.trim()) || '',
176
+ };
177
+ };
92
178
  export const isSeedFunnelSdkPublishableKey = (value) => {
93
179
  const normalized = (value === null || value === void 0 ? void 0 : value.trim()) || '';
94
180
  return !normalized || normalized === DEFAULT_FUNNEL_SDK_PUBLISHABLE_KEY;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funnelsgrove/runtime",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "main": "./dist/index.js",
@@ -16,6 +16,11 @@
16
16
  "types": "./dist/config/env.config.d.ts",
17
17
  "import": "./dist/config/env.config.js",
18
18
  "default": "./dist/config/env.config.js"
19
+ },
20
+ "./services/project-env": {
21
+ "types": "./dist/services/project-env.d.ts",
22
+ "import": "./dist/services/project-env.js",
23
+ "default": "./dist/services/project-env.js"
19
24
  }
20
25
  },
21
26
  "files": [