@salesforce/vite-plugin-lwc-ui-bundle 11.13.2 → 11.14.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 (35) hide show
  1. package/dist/index.d.ts +32 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +30 -5
  4. package/dist/index.js.map +1 -1
  5. package/dist/providers/access-check.d.ts.map +1 -1
  6. package/dist/providers/gate.d.ts.map +1 -1
  7. package/dist/providers/i18n.d.ts +16 -0
  8. package/dist/providers/i18n.d.ts.map +1 -1
  9. package/dist/providers/index.d.ts +2 -0
  10. package/dist/providers/index.d.ts.map +1 -1
  11. package/dist/providers/index.js +3 -178
  12. package/dist/providers/index.js.map +1 -1
  13. package/dist/providers/labels-graphql/index.d.ts.map +1 -1
  14. package/dist/providers/labels-graphql/index.js +12 -3
  15. package/dist/providers/labels-graphql/index.js.map +1 -1
  16. package/dist/providers/labels-graphql/runtime.d.ts +21 -14
  17. package/dist/providers/labels-graphql/runtime.d.ts.map +1 -1
  18. package/dist/providers/labels-graphql/runtime.js +39 -26
  19. package/dist/providers/labels-graphql/runtime.js.map +1 -1
  20. package/dist/providers/platform-graphql/constants.d.ts +15 -0
  21. package/dist/providers/platform-graphql/constants.d.ts.map +1 -0
  22. package/dist/providers/platform-graphql/i18n-static.d.ts +19 -0
  23. package/dist/providers/platform-graphql/i18n-static.d.ts.map +1 -0
  24. package/dist/providers/platform-graphql/index.d.ts +58 -0
  25. package/dist/providers/platform-graphql/index.d.ts.map +1 -0
  26. package/dist/providers/platform-graphql/index.js +312 -0
  27. package/dist/providers/platform-graphql/index.js.map +1 -0
  28. package/dist/providers/platform-graphql/runtime.d.ts +30 -0
  29. package/dist/providers/platform-graphql/runtime.d.ts.map +1 -0
  30. package/dist/providers/platform-graphql/runtime.js +189 -0
  31. package/dist/providers/platform-graphql/runtime.js.map +1 -0
  32. package/docs/consumer-guide.md +120 -4
  33. package/package.json +5 -5
  34. package/skills/setup-lwc-vite-plugin/SKILL.md +44 -1
  35. package/skills/setup-lwc-vite-plugin/references/known-pitfalls.md +57 -0
@@ -0,0 +1,312 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const BROWSER_DERIVED = /* @__PURE__ */ new Set([
5
+ "lang",
6
+ "dir",
7
+ "locale",
8
+ "currency",
9
+ "timeZone",
10
+ "firstDayOfWeek"
11
+ ]);
12
+ const CLDR_FORMAT_DEFAULTS = {
13
+ "dateTime.shortDateFormat": "M/d/yyyy",
14
+ "dateTime.mediumDateFormat": "MMM d, yyyy",
15
+ "dateTime.longDateFormat": "MMMM d, yyyy",
16
+ "dateTime.shortTimeFormat": "h:mm a",
17
+ "dateTime.mediumTimeFormat": "h:mm:ss a",
18
+ "dateTime.longTimeFormat": "h:mm:ss a z",
19
+ "dateTime.shortDateTimeFormat": "M/d/yyyy, h:mm a",
20
+ "number.numberFormat": "#,##0.##",
21
+ "number.currencyFormat": "¤#,##0.00",
22
+ "number.decimalSeparator": ".",
23
+ "number.groupingSeparator": ",",
24
+ "number.percentFormat": "#,##0%",
25
+ "number.percentSign": "%",
26
+ "number.plusSign": "+",
27
+ "number.minusSign": "-",
28
+ "number.exponentialSign": "E",
29
+ "number.superscriptingExponentSign": "×",
30
+ "number.perMilleSign": "‰",
31
+ "number.infinity": "∞",
32
+ "number.nan": "NaN",
33
+ "number.currencySymbol": "$"
34
+ };
35
+ const STATIC_DEFAULTS = {
36
+ ...CLDR_FORMAT_DEFAULTS,
37
+ defaultCalendar: "gregorian",
38
+ defaultNumberingSystem: "latn"
39
+ };
40
+ const MONTHS_WIDE = [
41
+ "January",
42
+ "February",
43
+ "March",
44
+ "April",
45
+ "May",
46
+ "June",
47
+ "July",
48
+ "August",
49
+ "September",
50
+ "October",
51
+ "November",
52
+ "December"
53
+ ];
54
+ const MONTHS_ABBR = [
55
+ "Jan",
56
+ "Feb",
57
+ "Mar",
58
+ "Apr",
59
+ "May",
60
+ "Jun",
61
+ "Jul",
62
+ "Aug",
63
+ "Sep",
64
+ "Oct",
65
+ "Nov",
66
+ "Dec"
67
+ ];
68
+ const DAYS_WIDE = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
69
+ const DAYS_ABBR = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
70
+ const CLDR_OBJECT_DEFAULTS = {
71
+ "common.digits": { latn: "0123456789" },
72
+ "common.calendarData": {
73
+ gregorian: { calendarSystem: "solar", eras: {} }
74
+ },
75
+ calendarData: {
76
+ gregorian: {
77
+ months: {
78
+ format: {
79
+ wide: MONTHS_WIDE,
80
+ abbreviated: MONTHS_ABBR,
81
+ narrow: MONTHS_ABBR
82
+ }
83
+ },
84
+ days: {
85
+ format: {
86
+ wide: DAYS_WIDE,
87
+ abbreviated: DAYS_ABBR,
88
+ narrow: DAYS_ABBR
89
+ }
90
+ },
91
+ dayPeriods: {
92
+ format: {
93
+ wide: ["AM", "PM"],
94
+ abbreviated: ["am", "pm"],
95
+ narrow: ["a", "p"]
96
+ }
97
+ },
98
+ eras: {
99
+ eraAbbr: ["AD"],
100
+ eraNames: ["Anno Domini"],
101
+ eraNarrow: ["A"]
102
+ }
103
+ }
104
+ }
105
+ };
106
+ const RUNTIME_SOURCE = `
107
+ const RTL_LANGS = new Set([
108
+ 'ar', 'arc', 'dv', 'fa', 'ha', 'he', 'khw', 'ks', 'ku', 'ps', 'ur', 'yi',
109
+ ]);
110
+
111
+ function getLocale() {
112
+ if (typeof navigator === 'undefined') return 'en-US';
113
+ return navigator.language || 'en-US';
114
+ }
115
+
116
+ function getLang() {
117
+ return getLocale().split('-')[0];
118
+ }
119
+
120
+ function getDir() {
121
+ return RTL_LANGS.has(getLang()) ? 'rtl' : 'ltr';
122
+ }
123
+
124
+ function getCurrency() {
125
+ try {
126
+ const parts = new Intl.NumberFormat(getLocale(), {
127
+ style: 'currency',
128
+ currency: 'USD',
129
+ currencyDisplay: 'code',
130
+ }).resolvedOptions();
131
+ return parts.currency || 'USD';
132
+ } catch {
133
+ return 'USD';
134
+ }
135
+ }
136
+
137
+ function getTimeZone() {
138
+ try {
139
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
140
+ } catch {
141
+ return 'UTC';
142
+ }
143
+ }
144
+
145
+ function getFirstDayOfWeek() {
146
+ // @salesforce/i18n/firstDayOfWeek is contractually a number (1=Mon … 7=Sun).
147
+ try {
148
+ const loc = new Intl.Locale(getLocale());
149
+ if (loc.weekInfo) return Number(loc.weekInfo.firstDay);
150
+ if (typeof loc.getWeekInfo === 'function') return Number(loc.getWeekInfo().firstDay);
151
+ } catch { /* unsupported in this browser */ }
152
+ return 7;
153
+ }
154
+
155
+ const values = {
156
+ lang: getLang(),
157
+ dir: getDir(),
158
+ locale: getLocale(),
159
+ currency: getCurrency(),
160
+ timeZone: getTimeZone(),
161
+ firstDayOfWeek: getFirstDayOfWeek(),
162
+ };
163
+
164
+ export default values['__KEY__'];
165
+ `;
166
+ function i18n(options = {}) {
167
+ const { staticOverrides = {}, objectOverrides = {} } = options;
168
+ const statics = { ...STATIC_DEFAULTS, ...staticOverrides };
169
+ const objects = { ...CLDR_OBJECT_DEFAULTS, ...objectOverrides };
170
+ return {
171
+ prefix: "@salesforce/i18n/",
172
+ resolve(specifier) {
173
+ if (!specifier.startsWith("@salesforce/i18n/")) return null;
174
+ const key = specifier.slice("@salesforce/i18n/".length);
175
+ if (BROWSER_DERIVED.has(key)) {
176
+ return RUNTIME_SOURCE.replace("__KEY__", key);
177
+ }
178
+ if (key in objects) {
179
+ return `export default ${JSON.stringify(objects[key])};`;
180
+ }
181
+ const value = statics[key] ?? key;
182
+ return `export default ${JSON.stringify(value)};`;
183
+ }
184
+ };
185
+ }
186
+ const USER_PERMISSION_PREFIX = "@salesforce/userPermission/";
187
+ const CUSTOM_PERMISSION_PREFIX = "@salesforce/customPermission/";
188
+ const ACCESS_CHECK_PREFIX = "@salesforce/accessCheck/";
189
+ const I18N_PREFIX = "@salesforce/i18n/";
190
+ const VIRTUAL_PLATFORM_PREFIX = "\0sf-platform-graphql:";
191
+ const RUNTIME_MODULE_ID = "\0sf-platform-graphql-runtime";
192
+ const I18N_GRAPHQL_KEYS = [
193
+ "lang",
194
+ "dir",
195
+ "locale",
196
+ "currency",
197
+ "timeZone",
198
+ "firstDayOfWeek",
199
+ "defaultCalendar",
200
+ "defaultNumberingSystem"
201
+ ];
202
+ const __dirname$1 = dirname(fileURLToPath(import.meta.url));
203
+ const I18N_RUNTIME_KEYS = new Set(I18N_GRAPHQL_KEYS);
204
+ function platformGraphql(options = {}) {
205
+ const userPermDefaults = options.userPermissionDefaults ?? {};
206
+ const customPermDefaults = options.customPermissionDefaults ?? {};
207
+ const accessCheckDefaults = options.accessCheckDefaults ?? {};
208
+ const i18nOverrides = { ...CLDR_FORMAT_DEFAULTS, ...options.i18nOverrides ?? {} };
209
+ const i18nObjects = { ...CLDR_OBJECT_DEFAULTS, ...options.i18nObjectOverrides ?? {} };
210
+ const PREFIXES = [
211
+ USER_PERMISSION_PREFIX,
212
+ CUSTOM_PERMISSION_PREFIX,
213
+ ACCESS_CHECK_PREFIX,
214
+ I18N_PREFIX
215
+ ];
216
+ return {
217
+ name: "vite-plugin-platform-graphql",
218
+ enforce: "pre",
219
+ resolveId(id) {
220
+ if (id === RUNTIME_MODULE_ID) return RUNTIME_MODULE_ID;
221
+ if (PREFIXES.some((p) => id.startsWith(p))) return VIRTUAL_PLATFORM_PREFIX + id;
222
+ return null;
223
+ },
224
+ load(id) {
225
+ if (id === RUNTIME_MODULE_ID) {
226
+ return readFileSync(join(__dirname$1, "runtime.js"), "utf-8");
227
+ }
228
+ if (!id.startsWith(VIRTUAL_PLATFORM_PREFIX)) return null;
229
+ const specifier = id.slice(VIRTUAL_PLATFORM_PREFIX.length);
230
+ if (specifier.startsWith(USER_PERMISSION_PREFIX)) {
231
+ const name = specifier.slice(USER_PERMISSION_PREFIX.length);
232
+ return permModule(
233
+ name,
234
+ requireDefault(userPermDefaults, name, "userPermission"),
235
+ "UserPermission"
236
+ );
237
+ }
238
+ if (specifier.startsWith(ACCESS_CHECK_PREFIX)) {
239
+ const name = specifier.slice(ACCESS_CHECK_PREFIX.length);
240
+ return permModule(name, accessCheckDefaults[name] ?? false, "UserPermission");
241
+ }
242
+ if (specifier.startsWith(CUSTOM_PERMISSION_PREFIX)) {
243
+ const name = specifier.slice(CUSTOM_PERMISSION_PREFIX.length);
244
+ return permModule(
245
+ name,
246
+ requireDefault(customPermDefaults, name, "customPermission"),
247
+ "CustomPermission"
248
+ );
249
+ }
250
+ if (specifier.startsWith(I18N_PREFIX)) {
251
+ const key = specifier.slice(I18N_PREFIX.length);
252
+ return i18nModule(key, i18nOverrides, i18nObjects);
253
+ }
254
+ return null;
255
+ }
256
+ };
257
+ }
258
+ function requireDefault(defaults, name, family) {
259
+ if (name in defaults) return defaults[name];
260
+ const optionKey = family === "userPermission" ? "userPermissionDefaults" : "customPermissionDefaults";
261
+ throw new Error(
262
+ `[platform-graphql] @salesforce/${family}/${name} was imported but has no first-paint value configured.
263
+ A permission is per-user runtime state, so the plugin refuses to silently render a fabricated \`false\`.
264
+ Add it to platformGraphql's ${optionKey}, e.g.
265
+ builtins.platformGraphql({ ${optionKey}: { ${JSON.stringify(name)}: false } })
266
+ (or use defaultProviders({ ${optionKey}: { ${JSON.stringify(name)}: false } })), then reflect the resolved
267
+ org value reactively via the module's subscribe() export.`
268
+ );
269
+ }
270
+ function permModule(name, fallback, kind) {
271
+ const getter = kind === "UserPermission" ? "getUserPermission" : "getCustomPermission";
272
+ const sub = kind === "UserPermission" ? "subscribeUserPermission" : "subscribeCustomPermission";
273
+ const n = JSON.stringify(name);
274
+ const fb = JSON.stringify(fallback);
275
+ return [
276
+ `import { ${getter}, ${sub} as __sub } from "${RUNTIME_MODULE_ID}";`,
277
+ `export default ${getter}(${n}, ${fb});`,
278
+ `export function subscribe(callback) { return __sub(${n}, ${fb}, callback); }`
279
+ ].join("\n");
280
+ }
281
+ function i18nModule(key, statics, objects) {
282
+ if (I18N_RUNTIME_KEYS.has(key)) {
283
+ const fallback = statics[key] ?? FALLBACK_I18N[key] ?? "";
284
+ const k = JSON.stringify(key);
285
+ const fb = JSON.stringify(fallback);
286
+ return [
287
+ `import { getI18n, subscribeI18n as __sub } from "${RUNTIME_MODULE_ID}";`,
288
+ `export default getI18n(${k}, ${fb});`,
289
+ `export function subscribe(callback) { return __sub(${k}, ${fb}, callback); }`
290
+ ].join("\n");
291
+ }
292
+ if (key in objects) {
293
+ return `export default ${JSON.stringify(objects[key])};`;
294
+ }
295
+ const value = statics[key] ?? key;
296
+ return `export default ${JSON.stringify(value)};`;
297
+ }
298
+ const FALLBACK_I18N = {
299
+ lang: "en",
300
+ dir: "ltr",
301
+ locale: "en-US",
302
+ currency: "USD",
303
+ timeZone: "America/Los_Angeles",
304
+ firstDayOfWeek: 1,
305
+ defaultCalendar: "gregorian",
306
+ defaultNumberingSystem: "latn"
307
+ };
308
+ export {
309
+ i18n as i,
310
+ platformGraphql
311
+ };
312
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/providers/i18n.ts","../../../src/providers/platform-graphql/constants.ts","../../../src/providers/platform-graphql/runtime.ts","../../../src/providers/platform-graphql/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { Provider } from \"../types\";\n\nconst BROWSER_DERIVED = new Set([\n\t\"lang\",\n\t\"dir\",\n\t\"locale\",\n\t\"currency\",\n\t\"timeZone\",\n\t\"firstDayOfWeek\",\n]);\n\n/**\n * CLDR number/date FORMAT patterns for `@salesforce/i18n/*`. These are reference\n * data (no org GraphQL source), so both this opt-out provider and the\n * GraphQL-backed `platformGraphql()` provider share this one table — re-exported\n * from `platform-graphql/i18n-static.ts` — to avoid drift. Values match the\n * authoritative `@salesforce/i18n` package's `dist/en-US/*` CLDR data.\n */\nexport const CLDR_FORMAT_DEFAULTS: Record<string, string> = {\n\t\"dateTime.shortDateFormat\": \"M/d/yyyy\",\n\t\"dateTime.mediumDateFormat\": \"MMM d, yyyy\",\n\t\"dateTime.longDateFormat\": \"MMMM d, yyyy\",\n\t\"dateTime.shortTimeFormat\": \"h:mm a\",\n\t\"dateTime.mediumTimeFormat\": \"h:mm:ss a\",\n\t\"dateTime.longTimeFormat\": \"h:mm:ss a z\",\n\t\"dateTime.shortDateTimeFormat\": \"M/d/yyyy, h:mm a\",\n\t\"number.numberFormat\": \"#,##0.##\",\n\t\"number.currencyFormat\": \"¤#,##0.00\",\n\t\"number.decimalSeparator\": \".\",\n\t\"number.groupingSeparator\": \",\",\n\t\"number.percentFormat\": \"#,##0%\",\n\t\"number.percentSign\": \"%\",\n\t\"number.plusSign\": \"+\",\n\t\"number.minusSign\": \"-\",\n\t\"number.exponentialSign\": \"E\",\n\t\"number.superscriptingExponentSign\": \"×\",\n\t\"number.perMilleSign\": \"‰\",\n\t\"number.infinity\": \"∞\",\n\t\"number.nan\": \"NaN\",\n\t\"number.currencySymbol\": \"$\",\n};\n\n// This opt-out provider also supplies the locale-identity calendar/numbering\n// defaults (the GraphQL provider resolves those from uiapi.platform.i18n\n// instead). Calendar name is \"gregorian\" to match the @salesforce/i18n package\n// and the calendarData object key below.\nconst STATIC_DEFAULTS: Record<string, string> = {\n\t...CLDR_FORMAT_DEFAULTS,\n\tdefaultCalendar: \"gregorian\",\n\tdefaultNumberingSystem: \"latn\",\n};\n\nconst MONTHS_WIDE = [\n\t\"January\",\n\t\"February\",\n\t\"March\",\n\t\"April\",\n\t\"May\",\n\t\"June\",\n\t\"July\",\n\t\"August\",\n\t\"September\",\n\t\"October\",\n\t\"November\",\n\t\"December\",\n];\nconst MONTHS_ABBR = [\n\t\"Jan\",\n\t\"Feb\",\n\t\"Mar\",\n\t\"Apr\",\n\t\"May\",\n\t\"Jun\",\n\t\"Jul\",\n\t\"Aug\",\n\t\"Sep\",\n\t\"Oct\",\n\t\"Nov\",\n\t\"Dec\",\n];\nconst DAYS_WIDE = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\nconst DAYS_ABBR = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n/**\n * CLDR calendar/digit reference data for `@salesforce/i18n/*` object keys.\n * Shared with `platformGraphql()` (re-exported from `platform-graphql/i18n-static.ts`).\n * The calendar is keyed `gregorian` to match `defaultCalendar` and the\n * authoritative `@salesforce/i18n` package (whose `calendarData` key is\n * `gregorian`, not `gregory`).\n */\nexport const CLDR_OBJECT_DEFAULTS: Record<string, unknown> = {\n\t\"common.digits\": { latn: \"0123456789\" },\n\t\"common.calendarData\": {\n\t\tgregorian: { calendarSystem: \"solar\", eras: {} },\n\t},\n\tcalendarData: {\n\t\tgregorian: {\n\t\t\tmonths: {\n\t\t\t\tformat: {\n\t\t\t\t\twide: MONTHS_WIDE,\n\t\t\t\t\tabbreviated: MONTHS_ABBR,\n\t\t\t\t\tnarrow: MONTHS_ABBR,\n\t\t\t\t},\n\t\t\t},\n\t\t\tdays: {\n\t\t\t\tformat: {\n\t\t\t\t\twide: DAYS_WIDE,\n\t\t\t\t\tabbreviated: DAYS_ABBR,\n\t\t\t\t\tnarrow: DAYS_ABBR,\n\t\t\t\t},\n\t\t\t},\n\t\t\tdayPeriods: {\n\t\t\t\tformat: {\n\t\t\t\t\twide: [\"AM\", \"PM\"],\n\t\t\t\t\tabbreviated: [\"am\", \"pm\"],\n\t\t\t\t\tnarrow: [\"a\", \"p\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\teras: {\n\t\t\t\teraAbbr: [\"AD\"],\n\t\t\t\teraNames: [\"Anno Domini\"],\n\t\t\t\teraNarrow: [\"A\"],\n\t\t\t},\n\t\t},\n\t},\n};\n\nconst RUNTIME_SOURCE = `\nconst RTL_LANGS = new Set([\n 'ar', 'arc', 'dv', 'fa', 'ha', 'he', 'khw', 'ks', 'ku', 'ps', 'ur', 'yi',\n]);\n\nfunction getLocale() {\n if (typeof navigator === 'undefined') return 'en-US';\n return navigator.language || 'en-US';\n}\n\nfunction getLang() {\n return getLocale().split('-')[0];\n}\n\nfunction getDir() {\n return RTL_LANGS.has(getLang()) ? 'rtl' : 'ltr';\n}\n\nfunction getCurrency() {\n try {\n const parts = new Intl.NumberFormat(getLocale(), {\n style: 'currency',\n currency: 'USD',\n currencyDisplay: 'code',\n }).resolvedOptions();\n return parts.currency || 'USD';\n } catch {\n return 'USD';\n }\n}\n\nfunction getTimeZone() {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nfunction getFirstDayOfWeek() {\n // @salesforce/i18n/firstDayOfWeek is contractually a number (1=Mon … 7=Sun).\n try {\n const loc = new Intl.Locale(getLocale());\n if (loc.weekInfo) return Number(loc.weekInfo.firstDay);\n if (typeof loc.getWeekInfo === 'function') return Number(loc.getWeekInfo().firstDay);\n } catch { /* unsupported in this browser */ }\n return 7;\n}\n\nconst values = {\n lang: getLang(),\n dir: getDir(),\n locale: getLocale(),\n currency: getCurrency(),\n timeZone: getTimeZone(),\n firstDayOfWeek: getFirstDayOfWeek(),\n};\n\nexport default values['__KEY__'];\n`;\n\nexport interface I18nOptions {\n\tstaticOverrides?: Record<string, string>;\n\tobjectOverrides?: Record<string, unknown>;\n}\n\n// Browser-derived (Intl) + static CLDR resolution — now an OPT-OUT. By default,\n// @salesforce/i18n/* resolves via GraphQL: the locale-IDENTITY keys (locale /\n// lang / dir / currency / timeZone / firstDayOfWeek / defaultCalendar /\n// defaultNumberingSystem) come from uiapi.platform.i18n through\n// builtins.platformGraphql(), giving the org's authoritative values rather than\n// the browser's. The number/date FORMAT patterns + calendar data are CLDR\n// reference data (no org source) and stay static in both providers. Use this\n// provider explicitly to opt out of the runtime fetch and derive identity from\n// the browser via Intl instead (W-22167030).\nexport function i18n(options: I18nOptions = {}): Provider {\n\tconst { staticOverrides = {}, objectOverrides = {} } = options;\n\tconst statics = { ...STATIC_DEFAULTS, ...staticOverrides };\n\tconst objects = { ...CLDR_OBJECT_DEFAULTS, ...objectOverrides };\n\n\treturn {\n\t\tprefix: \"@salesforce/i18n/\",\n\t\tresolve(specifier) {\n\t\t\tif (!specifier.startsWith(\"@salesforce/i18n/\")) return null;\n\n\t\t\tconst key = specifier.slice(\"@salesforce/i18n/\".length);\n\n\t\t\tif (BROWSER_DERIVED.has(key)) {\n\t\t\t\treturn RUNTIME_SOURCE.replace(\"__KEY__\", key);\n\t\t\t}\n\n\t\t\tif (key in objects) {\n\t\t\t\treturn `export default ${JSON.stringify(objects[key])};`;\n\t\t\t}\n\n\t\t\tconst value = statics[key] ?? key;\n\t\t\treturn `export default ${JSON.stringify(value)};`;\n\t\t},\n\t};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/** Scoped-module prefixes resolved via `uiapi.platform.*` GraphQL off-core. */\nexport const USER_PERMISSION_PREFIX = \"@salesforce/userPermission/\";\nexport const CUSTOM_PERMISSION_PREFIX = \"@salesforce/customPermission/\";\nexport const ACCESS_CHECK_PREFIX = \"@salesforce/accessCheck/\";\nexport const I18N_PREFIX = \"@salesforce/i18n/\";\n\n/** Vite virtual-module prefix for resolved platform-graphql modules. */\nexport const VIRTUAL_PLATFORM_PREFIX = \"\\0sf-platform-graphql:\";\n\n/** Shared runtime module id (read-as-string and injected at build). */\nexport const RUNTIME_MODULE_ID = \"\\0sf-platform-graphql-runtime\";\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/**\n * Shared runtime for scoped modules that resolve via `uiapi.platform.*` GraphQL\n * off-core through the Platform Data SDK:\n *\n * - `@salesforce/userPermission/<Name>` → `userPermissions(names:)` → boolean\n * - `@salesforce/accessCheck/<Name>` → `userPermissions(names:)` → boolean\n * - `@salesforce/customPermission/<Name>` → `customPermissions(names:)` → boolean\n * - `@salesforce/i18n/<key>` → `i18n { ... }` (locale identity)\n *\n * Like the labels runtime, each accessor returns a synchronous value (the\n * build-time fallback) immediately and schedules a batched GraphQL fetch; the\n * resolved org value lands in the cache and notifies subscribers. Components opt\n * into reactivity via the generated module's `subscribe(cb)` export.\n */\n\ninterface DomainState<V> {\n\tcache: Map<string, V>;\n\tpending: Set<string>;\n\tscheduled: boolean;\n\tsubscribers: Map<string, Set<(value: V) => void>>;\n}\n\nconst permState: DomainState<boolean> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\nconst customPermState: DomainState<boolean> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\n// i18n values are mostly strings, but a few keys are contractually numeric\n// (see I18N_NUMERIC_KEYS) so the domain is `string | number`.\nconst i18nState: DomainState<string | number> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\n\nlet probePromise: Promise<boolean> | null = null;\n\n/** i18n scalar fields exposed by `uiapi.platform.i18n` (locale identity). */\nexport const I18N_GRAPHQL_KEYS = [\n\t\"lang\",\n\t\"dir\",\n\t\"locale\",\n\t\"currency\",\n\t\"timeZone\",\n\t\"firstDayOfWeek\",\n\t\"defaultCalendar\",\n\t\"defaultNumberingSystem\",\n] as const;\n\n/**\n * i18n identity keys whose `@salesforce/i18n/*` contract is a NUMBER, not a\n * string (e.g. `firstDayOfWeek` is `1`=Mon … `7`=Sun). These are coerced with\n * `Number()` rather than `String()` so consumers that do arithmetic or strict\n * equality on them keep working. All other identity keys are strings.\n */\nexport const I18N_NUMERIC_KEYS = new Set<string>([\"firstDayOfWeek\"]);\n\nconst PERM_QUERY = `query UserPermissions($names: [String!]!) {\n uiapi { platform { userPermissions(names: $names) { name hasAccess } } }\n}`;\n\nconst CUSTOM_PERM_QUERY = `query CustomPermissions($names: [String!]!) {\n uiapi { platform { customPermissions(names: $names) { name hasAccess } } }\n}`;\n\nconst I18N_QUERY = `query I18n {\n uiapi { platform { i18n { ${I18N_GRAPHQL_KEYS.join(\" \")} } } }\n}`;\n\nasync function detectPlatformPath(): Promise<boolean> {\n\ttry {\n\t\tconst response = (await graphqlFetch(`{ uiapi { platform { __typename } } }`, {})) as {\n\t\t\tdata?: { uiapi?: { platform?: unknown } };\n\t\t};\n\t\treturn !!response?.data?.uiapi?.platform;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function getApiShape(): Promise<boolean> {\n\tif (!probePromise) {\n\t\tprobePromise = detectPlatformPath();\n\t}\n\treturn probePromise;\n}\n\nfunction notify<V>(state: DomainState<V>, key: string, value: V): void {\n\tif (state.cache.get(key) === value) return;\n\tstate.cache.set(key, value);\n\tconst set = state.subscribers.get(key);\n\tif (set) for (const cb of set) cb(value);\n}\n\nfunction subscribeTo<V>(\n\tstate: DomainState<V>,\n\tkey: string,\n\tcurrent: () => V,\n\tcallback: (value: V) => void,\n): () => void {\n\tlet set = state.subscribers.get(key);\n\tif (!set) {\n\t\tset = new Set();\n\t\tstate.subscribers.set(key, set);\n\t}\n\tset.add(callback);\n\tcallback(current());\n\treturn () => {\n\t\tstate.subscribers.get(key)?.delete(callback);\n\t};\n}\n\n// ── Permissions (userPermissions / accessCheck) ──────────────────────────────\n\nexport function getUserPermission(name: string, fallback: boolean): boolean {\n\tif (permState.cache.has(name)) return permState.cache.get(name)!;\n\tpermState.cache.set(name, fallback);\n\tpermState.pending.add(name);\n\tschedulePermFetch(permState, PERM_QUERY, \"userPermissions\");\n\treturn fallback;\n}\n\nexport function subscribeUserPermission(\n\tname: string,\n\tfallback: boolean,\n\tcb: (v: boolean) => void,\n): () => void {\n\treturn subscribeTo(permState, name, () => getUserPermission(name, fallback), cb);\n}\n\nexport function getCustomPermission(name: string, fallback: boolean): boolean {\n\tif (customPermState.cache.has(name)) return customPermState.cache.get(name)!;\n\tcustomPermState.cache.set(name, fallback);\n\tcustomPermState.pending.add(name);\n\tschedulePermFetch(customPermState, CUSTOM_PERM_QUERY, \"customPermissions\");\n\treturn fallback;\n}\n\nexport function subscribeCustomPermission(\n\tname: string,\n\tfallback: boolean,\n\tcb: (v: boolean) => void,\n): () => void {\n\treturn subscribeTo(customPermState, name, () => getCustomPermission(name, fallback), cb);\n}\n\ninterface PermissionRecord {\n\tname: string;\n\thasAccess: boolean;\n}\n\nfunction schedulePermFetch(\n\tstate: DomainState<boolean>,\n\tquery: string,\n\tfield: \"userPermissions\" | \"customPermissions\",\n): void {\n\tif (state.scheduled) return;\n\tstate.scheduled = true;\n\tPromise.resolve().then(() => {\n\t\tstate.scheduled = false;\n\t\tif (state.pending.size === 0) return;\n\t\tconst names = [...state.pending];\n\t\tstate.pending.clear();\n\t\tfetchPermissions(state, query, field, names);\n\t});\n}\n\nasync function fetchPermissions(\n\tstate: DomainState<boolean>,\n\tquery: string,\n\tfield: \"userPermissions\" | \"customPermissions\",\n\tnames: string[],\n): Promise<void> {\n\t// platform.* path is required for these fields; if absent, keep fallbacks.\n\tif (!(await getApiShape())) return;\n\tfor (let i = 0; i < names.length; i += 100) {\n\t\tconst batch = names.slice(i, i + 100);\n\t\ttry {\n\t\t\tconst response = (await graphqlFetch(query, { names: batch })) as {\n\t\t\t\tdata?: { uiapi?: { platform?: Record<string, PermissionRecord[]> } };\n\t\t\t};\n\t\t\tconst records = response?.data?.uiapi?.platform?.[field] ?? [];\n\t\t\tfor (const rec of records) {\n\t\t\t\t// An unknown/invalid name yields a `null` array entry (with a\n\t\t\t\t// matching ValidationError in `errors`), positionally aligned with\n\t\t\t\t// the requested name. Skip it so one bad name in a mixed batch does\n\t\t\t\t// not abort resolution for the valid names alongside it — their\n\t\t\t\t// fallbacks would otherwise silently stick.\n\t\t\t\tif (!rec) continue;\n\t\t\t\tnotify(state, rec.name, !!rec.hasAccess);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn(`[platform-graphql] ${field} fetch failed:`, e);\n\t\t}\n\t}\n}\n\n// ── i18n (locale identity) ───────────────────────────────────────────────────\n\nexport function getI18n(key: string, fallback: string | number): string | number {\n\tif (i18nState.cache.has(key)) return i18nState.cache.get(key)!;\n\ti18nState.cache.set(key, fallback);\n\t// Any i18n key triggers a single fetch that resolves ALL identity fields at\n\t// once, so there is no per-key pending set to track (unlike permissions).\n\tscheduleI18nFetch();\n\treturn fallback;\n}\n\nexport function subscribeI18n(\n\tkey: string,\n\tfallback: string | number,\n\tcb: (v: string | number) => void,\n): () => void {\n\treturn subscribeTo(i18nState, key, () => getI18n(key, fallback), cb);\n}\n\nfunction scheduleI18nFetch(): void {\n\tif (i18nState.scheduled) return;\n\ti18nState.scheduled = true;\n\tPromise.resolve().then(() => {\n\t\ti18nState.scheduled = false;\n\t\tfetchI18n();\n\t});\n}\n\nasync function fetchI18n(): Promise<void> {\n\tif (!(await getApiShape())) return;\n\ttry {\n\t\tconst response = (await graphqlFetch(I18N_QUERY, {})) as {\n\t\t\tdata?: { uiapi?: { platform?: { i18n?: Record<string, unknown> } } };\n\t\t};\n\t\tconst payload = response?.data?.uiapi?.platform?.i18n;\n\t\tif (!payload) return;\n\t\tfor (const k of I18N_GRAPHQL_KEYS) {\n\t\t\tif (payload[k] == null) continue;\n\t\t\t// firstDayOfWeek (and any other numeric-contract key) stays a number;\n\t\t\t// everything else is a string. See I18N_NUMERIC_KEYS.\n\t\t\tconst value = I18N_NUMERIC_KEYS.has(k) ? Number(payload[k]) : String(payload[k]);\n\t\t\tnotify(i18nState, k, value);\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(\"[platform-graphql] i18n fetch failed:\", e);\n\t}\n}\n\n// ── Shared SDK transport ─────────────────────────────────────────────────────\n\n/**\n * Fetch through the Platform Data SDK — surface-aware (direct session GraphQL on\n * WebApp/MFE, window.openai bridge on OpenAI/MCP). Returns `{}` when no data\n * surface is available, so callers keep their build-time fallbacks.\n */\nexport async function graphqlFetch(\n\tquery: string,\n\tvariables: Record<string, unknown>,\n): Promise<unknown> {\n\tlet createDataSDK:\n\t\t| ((options?: unknown) => Promise<{\n\t\t\t\tgraphql?: { query: (opts: unknown) => Promise<{ data?: unknown; errors?: unknown }> };\n\t\t }>)\n\t\t| undefined;\n\ttry {\n\t\t({ createDataSDK } = (await import(\"@salesforce/platform-sdk\")) as unknown as {\n\t\t\tcreateDataSDK: typeof createDataSDK;\n\t\t});\n\t} catch {\n\t\tconsole.warn(\n\t\t\t\"[platform-graphql] @salesforce/platform-sdk is not available. Using fallback values.\",\n\t\t);\n\t\treturn {};\n\t}\n\tif (typeof createDataSDK !== \"function\") return {};\n\tconst sdk = await createDataSDK();\n\tif (!sdk.graphql) return {};\n\tconst result = await sdk.graphql.query({ query, variables });\n\treturn { data: result.data, errors: result.errors };\n}\n\n/** Reset internal state — exposed for tests only. */\nexport function __resetForTest(): void {\n\tfor (const s of [permState, customPermState, i18nState]) {\n\t\ts.cache.clear();\n\t\ts.pending.clear();\n\t\ts.scheduled = false;\n\t\ts.subscribers.clear();\n\t}\n\tprobePromise = null;\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Plugin } from \"vite\";\nimport {\n\tACCESS_CHECK_PREFIX,\n\tCUSTOM_PERMISSION_PREFIX,\n\tI18N_PREFIX,\n\tRUNTIME_MODULE_ID,\n\tUSER_PERMISSION_PREFIX,\n\tVIRTUAL_PLATFORM_PREFIX,\n} from \"./constants\";\nimport { I18N_OBJECT_DEFAULTS, I18N_STATIC_DEFAULTS } from \"./i18n-static\";\nimport { I18N_GRAPHQL_KEYS } from \"./runtime\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nconst I18N_RUNTIME_KEYS = new Set<string>(I18N_GRAPHQL_KEYS);\n\nexport interface PlatformGraphqlOptions {\n\t/**\n\t * Explicit first-paint values for NAMED user permissions, keyed by permission\n\t * name, e.g. `{ ApiEnabled: false }`. **Required for every\n\t * `@salesforce/userPermission/<Name>` a bundle imports.**\n\t *\n\t * A permission is per-user runtime state. A plain default import captures the\n\t * generated module's value once at module-eval time and never updates unless\n\t * the component opts into the module's `subscribe()` export — so a silently\n\t * fabricated `false` would render a wrong, permanent answer about what the user\n\t * can do. Rather than guess, the build fails if a name is imported without an\n\t * entry here. Use `false` unless you have a specific reason to render `true`\n\t * before the org responds, then reflect the resolved value reactively via\n\t * `subscribe()`.\n\t */\n\tuserPermissionDefaults?: Record<string, boolean>;\n\t/**\n\t * Explicit first-paint values for named custom permissions. Required per\n\t * imported `@salesforce/customPermission/<Name>` — see {@link userPermissionDefaults}.\n\t */\n\tcustomPermissionDefaults?: Record<string, boolean>;\n\t/**\n\t * First-paint values for `@salesforce/accessCheck/<Name>` feature gates.\n\t * Unlike a named permission, an unconfigured access check is NOT a build error:\n\t * it defaults to `false`. Deny-by-default is the safe gate semantic, and base\n\t * components import many of these implicitly. Override to open a gate before\n\t * the fetch resolves.\n\t */\n\taccessCheckDefaults?: Record<string, boolean>;\n\t/**\n\t * String overrides for the GraphQL-backed i18n identity keys (locale, currency,\n\t * timeZone, …). Optional: the built-in CLDR placeholders are identical for every\n\t * user and self-correct once the fetch lands, so no per-key config is required.\n\t */\n\ti18nOverrides?: Record<string, string>;\n\t/** Object overrides for static (non-GraphQL) i18n keys. Optional. */\n\ti18nObjectOverrides?: Record<string, unknown>;\n}\n\n/**\n * Resolves scoped modules that have a real `uiapi.platform.*` GraphQL source,\n * fetched off-core through the Platform Data SDK:\n *\n * - `@salesforce/userPermission/<Name>` → `userPermissions` → boolean\n * - `@salesforce/accessCheck/<Name>` → `userPermissions` → boolean (alias)\n * - `@salesforce/customPermission/<Name>` → `customPermissions` → boolean\n * - `@salesforce/i18n/<key>` → `i18n { ... }` for locale-identity keys;\n * number/date FORMAT patterns + calendar data stay static (CLDR, no org source).\n *\n * Each generated module exports the build-time fallback as `default` (synchronous)\n * and an opt-in `subscribe(cb)` that fires with the resolved org value.\n *\n * `@salesforce/gate/*` is intentionally NOT handled here — its GraphQL field\n * (`uiapi.platform.gates`) is restricted to a UiTier context and is not reachable\n * off-core (verified: FieldUndefined / \"can only be executed in a UiTier context\").\n */\nexport function platformGraphql(options: PlatformGraphqlOptions = {}): Plugin {\n\tconst userPermDefaults = options.userPermissionDefaults ?? {};\n\tconst customPermDefaults = options.customPermissionDefaults ?? {};\n\tconst accessCheckDefaults = options.accessCheckDefaults ?? {};\n\tconst i18nOverrides = { ...I18N_STATIC_DEFAULTS, ...(options.i18nOverrides ?? {}) };\n\tconst i18nObjects = { ...I18N_OBJECT_DEFAULTS, ...(options.i18nObjectOverrides ?? {}) };\n\n\tconst PREFIXES = [\n\t\tUSER_PERMISSION_PREFIX,\n\t\tCUSTOM_PERMISSION_PREFIX,\n\t\tACCESS_CHECK_PREFIX,\n\t\tI18N_PREFIX,\n\t];\n\n\treturn {\n\t\tname: \"vite-plugin-platform-graphql\",\n\t\tenforce: \"pre\",\n\n\t\tresolveId(id) {\n\t\t\tif (id === RUNTIME_MODULE_ID) return RUNTIME_MODULE_ID;\n\t\t\tif (PREFIXES.some((p) => id.startsWith(p))) return VIRTUAL_PLATFORM_PREFIX + id;\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (id === RUNTIME_MODULE_ID) {\n\t\t\t\treturn readFileSync(join(__dirname, \"runtime.js\"), \"utf-8\");\n\t\t\t}\n\t\t\tif (!id.startsWith(VIRTUAL_PLATFORM_PREFIX)) return null;\n\t\t\tconst specifier = id.slice(VIRTUAL_PLATFORM_PREFIX.length);\n\n\t\t\tif (specifier.startsWith(USER_PERMISSION_PREFIX)) {\n\t\t\t\tconst name = specifier.slice(USER_PERMISSION_PREFIX.length);\n\t\t\t\treturn permModule(\n\t\t\t\t\tname,\n\t\t\t\t\trequireDefault(userPermDefaults, name, \"userPermission\"),\n\t\t\t\t\t\"UserPermission\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (specifier.startsWith(ACCESS_CHECK_PREFIX)) {\n\t\t\t\t// accessCheck resolves against user permissions (same GraphQL field),\n\t\t\t\t// but it's a feature GATE, not a named-permission assertion: an\n\t\t\t\t// unconfigured check safely denies (`false`) rather than erroring, so\n\t\t\t\t// base components (which import many accessChecks implicitly) keep\n\t\t\t\t// working without per-name config.\n\t\t\t\tconst name = specifier.slice(ACCESS_CHECK_PREFIX.length);\n\t\t\t\treturn permModule(name, accessCheckDefaults[name] ?? false, \"UserPermission\");\n\t\t\t}\n\t\t\tif (specifier.startsWith(CUSTOM_PERMISSION_PREFIX)) {\n\t\t\t\tconst name = specifier.slice(CUSTOM_PERMISSION_PREFIX.length);\n\t\t\t\treturn permModule(\n\t\t\t\t\tname,\n\t\t\t\t\trequireDefault(customPermDefaults, name, \"customPermission\"),\n\t\t\t\t\t\"CustomPermission\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (specifier.startsWith(I18N_PREFIX)) {\n\t\t\t\tconst key = specifier.slice(I18N_PREFIX.length);\n\t\t\t\treturn i18nModule(key, i18nOverrides, i18nObjects);\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t};\n}\n\n/**\n * Resolve the explicit first-paint value for a NAMED permission, or fail the\n * build. A named permission is per-user runtime state; a default import captures\n * the value once and never updates without `subscribe()`, so a silently\n * fabricated `false` would render a permanent wrong answer. We refuse to guess —\n * the author must state the value they want shown before the org responds.\n */\nfunction requireDefault(\n\tdefaults: Record<string, boolean>,\n\tname: string,\n\tfamily: \"userPermission\" | \"customPermission\",\n): boolean {\n\tif (name in defaults) return defaults[name]!;\n\tconst optionKey =\n\t\tfamily === \"userPermission\" ? \"userPermissionDefaults\" : \"customPermissionDefaults\";\n\tthrow new Error(\n\t\t`[platform-graphql] @salesforce/${family}/${name} was imported but has no first-paint value configured.\\n` +\n\t\t\t`A permission is per-user runtime state, so the plugin refuses to silently render a fabricated \\`false\\`.\\n` +\n\t\t\t`Add it to platformGraphql's ${optionKey}, e.g.\\n` +\n\t\t\t` builtins.platformGraphql({ ${optionKey}: { ${JSON.stringify(name)}: false } })\\n` +\n\t\t\t`(or use defaultProviders({ ${optionKey}: { ${JSON.stringify(name)}: false } })), then reflect the resolved\\n` +\n\t\t\t`org value reactively via the module's subscribe() export.`,\n\t);\n}\n\n/** Generate a boolean permission module (userPermission / accessCheck / customPermission). */\nfunction permModule(\n\tname: string,\n\tfallback: boolean,\n\tkind: \"UserPermission\" | \"CustomPermission\",\n): string {\n\tconst getter = kind === \"UserPermission\" ? \"getUserPermission\" : \"getCustomPermission\";\n\tconst sub = kind === \"UserPermission\" ? \"subscribeUserPermission\" : \"subscribeCustomPermission\";\n\tconst n = JSON.stringify(name);\n\tconst fb = JSON.stringify(fallback);\n\treturn [\n\t\t`import { ${getter}, ${sub} as __sub } from \"${RUNTIME_MODULE_ID}\";`,\n\t\t`export default ${getter}(${n}, ${fb});`,\n\t\t`export function subscribe(callback) { return __sub(${n}, ${fb}, callback); }`,\n\t].join(\"\\n\");\n}\n\n/** Generate an i18n module: identity keys → GraphQL; format/calendar keys → static. */\nfunction i18nModule(\n\tkey: string,\n\tstatics: Record<string, string>,\n\tobjects: Record<string, unknown>,\n): string {\n\tif (I18N_RUNTIME_KEYS.has(key)) {\n\t\tconst fallback = statics[key] ?? FALLBACK_I18N[key] ?? \"\";\n\t\tconst k = JSON.stringify(key);\n\t\tconst fb = JSON.stringify(fallback);\n\t\treturn [\n\t\t\t`import { getI18n, subscribeI18n as __sub } from \"${RUNTIME_MODULE_ID}\";`,\n\t\t\t`export default getI18n(${k}, ${fb});`,\n\t\t\t`export function subscribe(callback) { return __sub(${k}, ${fb}, callback); }`,\n\t\t].join(\"\\n\");\n\t}\n\tif (key in objects) {\n\t\treturn `export default ${JSON.stringify(objects[key])};`;\n\t}\n\tconst value = statics[key] ?? key;\n\treturn `export default ${JSON.stringify(value)};`;\n}\n\n/**\n * Build-time fallbacks for the GraphQL-backed i18n identity keys (used until\n * resolved). `firstDayOfWeek` is numeric to match the `@salesforce/i18n/*`\n * contract (`const firstDayOfWeek: number`); the rest are strings.\n */\nconst FALLBACK_I18N: Record<string, string | number> = {\n\tlang: \"en\",\n\tdir: \"ltr\",\n\tlocale: \"en-US\",\n\tcurrency: \"USD\",\n\ttimeZone: \"America/Los_Angeles\",\n\tfirstDayOfWeek: 1,\n\tdefaultCalendar: \"gregorian\",\n\tdefaultNumberingSystem: \"latn\",\n};\n"],"names":["__dirname","I18N_STATIC_DEFAULTS","I18N_OBJECT_DEFAULTS"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright (c) 2026, Salesforce, Inc.,
3
+ * All rights reserved.
4
+ * For full license text, see the LICENSE.txt file
5
+ */
6
+ /** i18n scalar fields exposed by `uiapi.platform.i18n` (locale identity). */
7
+ export declare const I18N_GRAPHQL_KEYS: readonly ["lang", "dir", "locale", "currency", "timeZone", "firstDayOfWeek", "defaultCalendar", "defaultNumberingSystem"];
8
+ /**
9
+ * i18n identity keys whose `@salesforce/i18n/*` contract is a NUMBER, not a
10
+ * string (e.g. `firstDayOfWeek` is `1`=Mon … `7`=Sun). These are coerced with
11
+ * `Number()` rather than `String()` so consumers that do arithmetic or strict
12
+ * equality on them keep working. All other identity keys are strings.
13
+ */
14
+ export declare const I18N_NUMERIC_KEYS: Set<string>;
15
+ export declare function getApiShape(): Promise<boolean>;
16
+ export declare function getUserPermission(name: string, fallback: boolean): boolean;
17
+ export declare function subscribeUserPermission(name: string, fallback: boolean, cb: (v: boolean) => void): () => void;
18
+ export declare function getCustomPermission(name: string, fallback: boolean): boolean;
19
+ export declare function subscribeCustomPermission(name: string, fallback: boolean, cb: (v: boolean) => void): () => void;
20
+ export declare function getI18n(key: string, fallback: string | number): string | number;
21
+ export declare function subscribeI18n(key: string, fallback: string | number, cb: (v: string | number) => void): () => void;
22
+ /**
23
+ * Fetch through the Platform Data SDK — surface-aware (direct session GraphQL on
24
+ * WebApp/MFE, window.openai bridge on OpenAI/MCP). Returns `{}` when no data
25
+ * surface is available, so callers keep their build-time fallbacks.
26
+ */
27
+ export declare function graphqlFetch(query: string, variables: Record<string, unknown>): Promise<unknown>;
28
+ /** Reset internal state — exposed for tests only. */
29
+ export declare function __resetForTest(): void;
30
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/providers/platform-graphql/runtime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+CH,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,2HASpB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,aAAsC,CAAC;AAyBrE,wBAAgB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAK9C;AA6BD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAM1E;AAED,wBAAgB,uBAAuB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GACtB,MAAM,IAAI,CAEZ;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAM5E;AAED,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,GACtB,MAAM,IAAI,CAEZ;AAuDD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAO/E;AAED,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,GAC9B,MAAM,IAAI,CAEZ;AAiCD;;;;GAIG;AACH,wBAAsB,YAAY,CACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED,qDAAqD;AACrD,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}
@@ -0,0 +1,189 @@
1
+ const permState = {
2
+ cache: /* @__PURE__ */ new Map(),
3
+ pending: /* @__PURE__ */ new Set(),
4
+ scheduled: false,
5
+ subscribers: /* @__PURE__ */ new Map()
6
+ };
7
+ const customPermState = {
8
+ cache: /* @__PURE__ */ new Map(),
9
+ pending: /* @__PURE__ */ new Set(),
10
+ scheduled: false,
11
+ subscribers: /* @__PURE__ */ new Map()
12
+ };
13
+ const i18nState = {
14
+ cache: /* @__PURE__ */ new Map(),
15
+ pending: /* @__PURE__ */ new Set(),
16
+ scheduled: false,
17
+ subscribers: /* @__PURE__ */ new Map()
18
+ };
19
+ let probePromise = null;
20
+ const I18N_GRAPHQL_KEYS = [
21
+ "lang",
22
+ "dir",
23
+ "locale",
24
+ "currency",
25
+ "timeZone",
26
+ "firstDayOfWeek",
27
+ "defaultCalendar",
28
+ "defaultNumberingSystem"
29
+ ];
30
+ const I18N_NUMERIC_KEYS = /* @__PURE__ */ new Set(["firstDayOfWeek"]);
31
+ const PERM_QUERY = `query UserPermissions($names: [String!]!) {
32
+ uiapi { platform { userPermissions(names: $names) { name hasAccess } } }
33
+ }`;
34
+ const CUSTOM_PERM_QUERY = `query CustomPermissions($names: [String!]!) {
35
+ uiapi { platform { customPermissions(names: $names) { name hasAccess } } }
36
+ }`;
37
+ const I18N_QUERY = `query I18n {
38
+ uiapi { platform { i18n { ${I18N_GRAPHQL_KEYS.join(" ")} } } }
39
+ }`;
40
+ async function detectPlatformPath() {
41
+ try {
42
+ const response = await graphqlFetch(`{ uiapi { platform { __typename } } }`, {});
43
+ return !!response?.data?.uiapi?.platform;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ function getApiShape() {
49
+ if (!probePromise) {
50
+ probePromise = detectPlatformPath();
51
+ }
52
+ return probePromise;
53
+ }
54
+ function notify(state, key, value) {
55
+ if (state.cache.get(key) === value) return;
56
+ state.cache.set(key, value);
57
+ const set = state.subscribers.get(key);
58
+ if (set) for (const cb of set) cb(value);
59
+ }
60
+ function subscribeTo(state, key, current, callback) {
61
+ let set = state.subscribers.get(key);
62
+ if (!set) {
63
+ set = /* @__PURE__ */ new Set();
64
+ state.subscribers.set(key, set);
65
+ }
66
+ set.add(callback);
67
+ callback(current());
68
+ return () => {
69
+ state.subscribers.get(key)?.delete(callback);
70
+ };
71
+ }
72
+ function getUserPermission(name, fallback) {
73
+ if (permState.cache.has(name)) return permState.cache.get(name);
74
+ permState.cache.set(name, fallback);
75
+ permState.pending.add(name);
76
+ schedulePermFetch(permState, PERM_QUERY, "userPermissions");
77
+ return fallback;
78
+ }
79
+ function subscribeUserPermission(name, fallback, cb) {
80
+ return subscribeTo(permState, name, () => getUserPermission(name, fallback), cb);
81
+ }
82
+ function getCustomPermission(name, fallback) {
83
+ if (customPermState.cache.has(name)) return customPermState.cache.get(name);
84
+ customPermState.cache.set(name, fallback);
85
+ customPermState.pending.add(name);
86
+ schedulePermFetch(customPermState, CUSTOM_PERM_QUERY, "customPermissions");
87
+ return fallback;
88
+ }
89
+ function subscribeCustomPermission(name, fallback, cb) {
90
+ return subscribeTo(customPermState, name, () => getCustomPermission(name, fallback), cb);
91
+ }
92
+ function schedulePermFetch(state, query, field) {
93
+ if (state.scheduled) return;
94
+ state.scheduled = true;
95
+ Promise.resolve().then(() => {
96
+ state.scheduled = false;
97
+ if (state.pending.size === 0) return;
98
+ const names = [...state.pending];
99
+ state.pending.clear();
100
+ fetchPermissions(state, query, field, names);
101
+ });
102
+ }
103
+ async function fetchPermissions(state, query, field, names) {
104
+ if (!await getApiShape()) return;
105
+ for (let i = 0; i < names.length; i += 100) {
106
+ const batch = names.slice(i, i + 100);
107
+ try {
108
+ const response = await graphqlFetch(query, { names: batch });
109
+ const records = response?.data?.uiapi?.platform?.[field] ?? [];
110
+ for (const rec of records) {
111
+ if (!rec) continue;
112
+ notify(state, rec.name, !!rec.hasAccess);
113
+ }
114
+ } catch (e) {
115
+ console.warn(`[platform-graphql] ${field} fetch failed:`, e);
116
+ }
117
+ }
118
+ }
119
+ function getI18n(key, fallback) {
120
+ if (i18nState.cache.has(key)) return i18nState.cache.get(key);
121
+ i18nState.cache.set(key, fallback);
122
+ scheduleI18nFetch();
123
+ return fallback;
124
+ }
125
+ function subscribeI18n(key, fallback, cb) {
126
+ return subscribeTo(i18nState, key, () => getI18n(key, fallback), cb);
127
+ }
128
+ function scheduleI18nFetch() {
129
+ if (i18nState.scheduled) return;
130
+ i18nState.scheduled = true;
131
+ Promise.resolve().then(() => {
132
+ i18nState.scheduled = false;
133
+ fetchI18n();
134
+ });
135
+ }
136
+ async function fetchI18n() {
137
+ if (!await getApiShape()) return;
138
+ try {
139
+ const response = await graphqlFetch(I18N_QUERY, {});
140
+ const payload = response?.data?.uiapi?.platform?.i18n;
141
+ if (!payload) return;
142
+ for (const k of I18N_GRAPHQL_KEYS) {
143
+ if (payload[k] == null) continue;
144
+ const value = I18N_NUMERIC_KEYS.has(k) ? Number(payload[k]) : String(payload[k]);
145
+ notify(i18nState, k, value);
146
+ }
147
+ } catch (e) {
148
+ console.warn("[platform-graphql] i18n fetch failed:", e);
149
+ }
150
+ }
151
+ async function graphqlFetch(query, variables) {
152
+ let createDataSDK;
153
+ try {
154
+ ({ createDataSDK } = await import("@salesforce/platform-sdk"));
155
+ } catch {
156
+ console.warn(
157
+ "[platform-graphql] @salesforce/platform-sdk is not available. Using fallback values."
158
+ );
159
+ return {};
160
+ }
161
+ if (typeof createDataSDK !== "function") return {};
162
+ const sdk = await createDataSDK();
163
+ if (!sdk.graphql) return {};
164
+ const result = await sdk.graphql.query({ query, variables });
165
+ return { data: result.data, errors: result.errors };
166
+ }
167
+ function __resetForTest() {
168
+ for (const s of [permState, customPermState, i18nState]) {
169
+ s.cache.clear();
170
+ s.pending.clear();
171
+ s.scheduled = false;
172
+ s.subscribers.clear();
173
+ }
174
+ probePromise = null;
175
+ }
176
+ export {
177
+ I18N_GRAPHQL_KEYS,
178
+ I18N_NUMERIC_KEYS,
179
+ __resetForTest,
180
+ getApiShape,
181
+ getCustomPermission,
182
+ getI18n,
183
+ getUserPermission,
184
+ graphqlFetch,
185
+ subscribeCustomPermission,
186
+ subscribeI18n,
187
+ subscribeUserPermission
188
+ };
189
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sources":["../../../src/providers/platform-graphql/runtime.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/**\n * Shared runtime for scoped modules that resolve via `uiapi.platform.*` GraphQL\n * off-core through the Platform Data SDK:\n *\n * - `@salesforce/userPermission/<Name>` → `userPermissions(names:)` → boolean\n * - `@salesforce/accessCheck/<Name>` → `userPermissions(names:)` → boolean\n * - `@salesforce/customPermission/<Name>` → `customPermissions(names:)` → boolean\n * - `@salesforce/i18n/<key>` → `i18n { ... }` (locale identity)\n *\n * Like the labels runtime, each accessor returns a synchronous value (the\n * build-time fallback) immediately and schedules a batched GraphQL fetch; the\n * resolved org value lands in the cache and notifies subscribers. Components opt\n * into reactivity via the generated module's `subscribe(cb)` export.\n */\n\ninterface DomainState<V> {\n\tcache: Map<string, V>;\n\tpending: Set<string>;\n\tscheduled: boolean;\n\tsubscribers: Map<string, Set<(value: V) => void>>;\n}\n\nconst permState: DomainState<boolean> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\nconst customPermState: DomainState<boolean> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\n// i18n values are mostly strings, but a few keys are contractually numeric\n// (see I18N_NUMERIC_KEYS) so the domain is `string | number`.\nconst i18nState: DomainState<string | number> = {\n\tcache: new Map(),\n\tpending: new Set(),\n\tscheduled: false,\n\tsubscribers: new Map(),\n};\n\nlet probePromise: Promise<boolean> | null = null;\n\n/** i18n scalar fields exposed by `uiapi.platform.i18n` (locale identity). */\nexport const I18N_GRAPHQL_KEYS = [\n\t\"lang\",\n\t\"dir\",\n\t\"locale\",\n\t\"currency\",\n\t\"timeZone\",\n\t\"firstDayOfWeek\",\n\t\"defaultCalendar\",\n\t\"defaultNumberingSystem\",\n] as const;\n\n/**\n * i18n identity keys whose `@salesforce/i18n/*` contract is a NUMBER, not a\n * string (e.g. `firstDayOfWeek` is `1`=Mon … `7`=Sun). These are coerced with\n * `Number()` rather than `String()` so consumers that do arithmetic or strict\n * equality on them keep working. All other identity keys are strings.\n */\nexport const I18N_NUMERIC_KEYS = new Set<string>([\"firstDayOfWeek\"]);\n\nconst PERM_QUERY = `query UserPermissions($names: [String!]!) {\n uiapi { platform { userPermissions(names: $names) { name hasAccess } } }\n}`;\n\nconst CUSTOM_PERM_QUERY = `query CustomPermissions($names: [String!]!) {\n uiapi { platform { customPermissions(names: $names) { name hasAccess } } }\n}`;\n\nconst I18N_QUERY = `query I18n {\n uiapi { platform { i18n { ${I18N_GRAPHQL_KEYS.join(\" \")} } } }\n}`;\n\nasync function detectPlatformPath(): Promise<boolean> {\n\ttry {\n\t\tconst response = (await graphqlFetch(`{ uiapi { platform { __typename } } }`, {})) as {\n\t\t\tdata?: { uiapi?: { platform?: unknown } };\n\t\t};\n\t\treturn !!response?.data?.uiapi?.platform;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function getApiShape(): Promise<boolean> {\n\tif (!probePromise) {\n\t\tprobePromise = detectPlatformPath();\n\t}\n\treturn probePromise;\n}\n\nfunction notify<V>(state: DomainState<V>, key: string, value: V): void {\n\tif (state.cache.get(key) === value) return;\n\tstate.cache.set(key, value);\n\tconst set = state.subscribers.get(key);\n\tif (set) for (const cb of set) cb(value);\n}\n\nfunction subscribeTo<V>(\n\tstate: DomainState<V>,\n\tkey: string,\n\tcurrent: () => V,\n\tcallback: (value: V) => void,\n): () => void {\n\tlet set = state.subscribers.get(key);\n\tif (!set) {\n\t\tset = new Set();\n\t\tstate.subscribers.set(key, set);\n\t}\n\tset.add(callback);\n\tcallback(current());\n\treturn () => {\n\t\tstate.subscribers.get(key)?.delete(callback);\n\t};\n}\n\n// ── Permissions (userPermissions / accessCheck) ──────────────────────────────\n\nexport function getUserPermission(name: string, fallback: boolean): boolean {\n\tif (permState.cache.has(name)) return permState.cache.get(name)!;\n\tpermState.cache.set(name, fallback);\n\tpermState.pending.add(name);\n\tschedulePermFetch(permState, PERM_QUERY, \"userPermissions\");\n\treturn fallback;\n}\n\nexport function subscribeUserPermission(\n\tname: string,\n\tfallback: boolean,\n\tcb: (v: boolean) => void,\n): () => void {\n\treturn subscribeTo(permState, name, () => getUserPermission(name, fallback), cb);\n}\n\nexport function getCustomPermission(name: string, fallback: boolean): boolean {\n\tif (customPermState.cache.has(name)) return customPermState.cache.get(name)!;\n\tcustomPermState.cache.set(name, fallback);\n\tcustomPermState.pending.add(name);\n\tschedulePermFetch(customPermState, CUSTOM_PERM_QUERY, \"customPermissions\");\n\treturn fallback;\n}\n\nexport function subscribeCustomPermission(\n\tname: string,\n\tfallback: boolean,\n\tcb: (v: boolean) => void,\n): () => void {\n\treturn subscribeTo(customPermState, name, () => getCustomPermission(name, fallback), cb);\n}\n\ninterface PermissionRecord {\n\tname: string;\n\thasAccess: boolean;\n}\n\nfunction schedulePermFetch(\n\tstate: DomainState<boolean>,\n\tquery: string,\n\tfield: \"userPermissions\" | \"customPermissions\",\n): void {\n\tif (state.scheduled) return;\n\tstate.scheduled = true;\n\tPromise.resolve().then(() => {\n\t\tstate.scheduled = false;\n\t\tif (state.pending.size === 0) return;\n\t\tconst names = [...state.pending];\n\t\tstate.pending.clear();\n\t\tfetchPermissions(state, query, field, names);\n\t});\n}\n\nasync function fetchPermissions(\n\tstate: DomainState<boolean>,\n\tquery: string,\n\tfield: \"userPermissions\" | \"customPermissions\",\n\tnames: string[],\n): Promise<void> {\n\t// platform.* path is required for these fields; if absent, keep fallbacks.\n\tif (!(await getApiShape())) return;\n\tfor (let i = 0; i < names.length; i += 100) {\n\t\tconst batch = names.slice(i, i + 100);\n\t\ttry {\n\t\t\tconst response = (await graphqlFetch(query, { names: batch })) as {\n\t\t\t\tdata?: { uiapi?: { platform?: Record<string, PermissionRecord[]> } };\n\t\t\t};\n\t\t\tconst records = response?.data?.uiapi?.platform?.[field] ?? [];\n\t\t\tfor (const rec of records) {\n\t\t\t\t// An unknown/invalid name yields a `null` array entry (with a\n\t\t\t\t// matching ValidationError in `errors`), positionally aligned with\n\t\t\t\t// the requested name. Skip it so one bad name in a mixed batch does\n\t\t\t\t// not abort resolution for the valid names alongside it — their\n\t\t\t\t// fallbacks would otherwise silently stick.\n\t\t\t\tif (!rec) continue;\n\t\t\t\tnotify(state, rec.name, !!rec.hasAccess);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn(`[platform-graphql] ${field} fetch failed:`, e);\n\t\t}\n\t}\n}\n\n// ── i18n (locale identity) ───────────────────────────────────────────────────\n\nexport function getI18n(key: string, fallback: string | number): string | number {\n\tif (i18nState.cache.has(key)) return i18nState.cache.get(key)!;\n\ti18nState.cache.set(key, fallback);\n\t// Any i18n key triggers a single fetch that resolves ALL identity fields at\n\t// once, so there is no per-key pending set to track (unlike permissions).\n\tscheduleI18nFetch();\n\treturn fallback;\n}\n\nexport function subscribeI18n(\n\tkey: string,\n\tfallback: string | number,\n\tcb: (v: string | number) => void,\n): () => void {\n\treturn subscribeTo(i18nState, key, () => getI18n(key, fallback), cb);\n}\n\nfunction scheduleI18nFetch(): void {\n\tif (i18nState.scheduled) return;\n\ti18nState.scheduled = true;\n\tPromise.resolve().then(() => {\n\t\ti18nState.scheduled = false;\n\t\tfetchI18n();\n\t});\n}\n\nasync function fetchI18n(): Promise<void> {\n\tif (!(await getApiShape())) return;\n\ttry {\n\t\tconst response = (await graphqlFetch(I18N_QUERY, {})) as {\n\t\t\tdata?: { uiapi?: { platform?: { i18n?: Record<string, unknown> } } };\n\t\t};\n\t\tconst payload = response?.data?.uiapi?.platform?.i18n;\n\t\tif (!payload) return;\n\t\tfor (const k of I18N_GRAPHQL_KEYS) {\n\t\t\tif (payload[k] == null) continue;\n\t\t\t// firstDayOfWeek (and any other numeric-contract key) stays a number;\n\t\t\t// everything else is a string. See I18N_NUMERIC_KEYS.\n\t\t\tconst value = I18N_NUMERIC_KEYS.has(k) ? Number(payload[k]) : String(payload[k]);\n\t\t\tnotify(i18nState, k, value);\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn(\"[platform-graphql] i18n fetch failed:\", e);\n\t}\n}\n\n// ── Shared SDK transport ─────────────────────────────────────────────────────\n\n/**\n * Fetch through the Platform Data SDK — surface-aware (direct session GraphQL on\n * WebApp/MFE, window.openai bridge on OpenAI/MCP). Returns `{}` when no data\n * surface is available, so callers keep their build-time fallbacks.\n */\nexport async function graphqlFetch(\n\tquery: string,\n\tvariables: Record<string, unknown>,\n): Promise<unknown> {\n\tlet createDataSDK:\n\t\t| ((options?: unknown) => Promise<{\n\t\t\t\tgraphql?: { query: (opts: unknown) => Promise<{ data?: unknown; errors?: unknown }> };\n\t\t }>)\n\t\t| undefined;\n\ttry {\n\t\t({ createDataSDK } = (await import(\"@salesforce/platform-sdk\")) as unknown as {\n\t\t\tcreateDataSDK: typeof createDataSDK;\n\t\t});\n\t} catch {\n\t\tconsole.warn(\n\t\t\t\"[platform-graphql] @salesforce/platform-sdk is not available. Using fallback values.\",\n\t\t);\n\t\treturn {};\n\t}\n\tif (typeof createDataSDK !== \"function\") return {};\n\tconst sdk = await createDataSDK();\n\tif (!sdk.graphql) return {};\n\tconst result = await sdk.graphql.query({ query, variables });\n\treturn { data: result.data, errors: result.errors };\n}\n\n/** Reset internal state — exposed for tests only. */\nexport function __resetForTest(): void {\n\tfor (const s of [permState, customPermState, i18nState]) {\n\t\ts.cache.clear();\n\t\ts.pending.clear();\n\t\ts.scheduled = false;\n\t\ts.subscribers.clear();\n\t}\n\tprobePromise = null;\n}\n"],"names":[],"mappings":"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"}