@fragments-sdk/cli 0.7.9 → 0.7.10

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 (98) hide show
  1. package/dist/bin.js +13 -13
  2. package/dist/bin.js.map +1 -1
  3. package/dist/{chunk-CWKQQR6C.js → chunk-57OW43NL.js} +3 -3
  4. package/dist/chunk-57OW43NL.js.map +1 -0
  5. package/dist/{chunk-AA6CAHCZ.js → chunk-7CRC46HV.js} +2 -2
  6. package/dist/chunk-7CRC46HV.js.map +1 -0
  7. package/dist/{chunk-3JPJTU25.js → chunk-CRTN6BIW.js} +5 -5
  8. package/dist/chunk-CRTN6BIW.js.map +1 -0
  9. package/dist/{chunk-LHIIBI6F.js → chunk-M42XIHPV.js} +2 -2
  10. package/dist/{chunk-2EFVPE5Q.js → chunk-TQOGBAOZ.js} +2 -2
  11. package/dist/chunk-TQOGBAOZ.js.map +1 -0
  12. package/dist/core/index.d.ts +1944 -0
  13. package/dist/{core-YAPWXDZW.js → core/index.js} +5 -5
  14. package/dist/defineFragment-C6PFzZyo.d.ts +656 -0
  15. package/dist/{generate-LEBVZCCH.js → generate-ZPERYZLF.js} +4 -4
  16. package/dist/index.d.ts +4 -159
  17. package/dist/index.js +9 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/{init-4VXL3Q6N.js → init-GID2DXB3.js} +69 -7
  20. package/dist/init-GID2DXB3.js.map +1 -0
  21. package/dist/mcp-bin.js +3 -3
  22. package/dist/{scan-3NYSRF6G.js → scan-BSMLGBX4.js} +5 -5
  23. package/dist/{service-HL6TMP3B.js → service-QACVPR37.js} +3 -3
  24. package/dist/{static-viewer-KLD24I4R.js → static-viewer-2RQD5QLR.js} +3 -3
  25. package/dist/{test-Y7YZOJLE.js → test-36UELXTE.js} +3 -3
  26. package/dist/{tokens-M4FCJKBK.js → tokens-A3BZIQPB.js} +4 -4
  27. package/dist/{viewer-ZWQQ74FV.js → viewer-ZA7WK3EY.js} +137 -30
  28. package/dist/viewer-ZA7WK3EY.js.map +1 -0
  29. package/package.json +6 -1
  30. package/src/commands/add.ts +1 -1
  31. package/src/commands/init.ts +84 -4
  32. package/src/core/defineFragment.ts +1 -1
  33. package/src/core/figma.ts +1 -1
  34. package/src/core/index.ts +2 -2
  35. package/src/core/loader.ts +3 -3
  36. package/src/core/schema.ts +1 -1
  37. package/src/index.ts +6 -0
  38. package/src/migrate/converter.ts +1 -1
  39. package/src/service/snippet-validation.test.ts +5 -5
  40. package/src/service/snippet-validation.ts +0 -1
  41. package/src/viewer/__tests__/viewer-integration.test.ts +16 -23
  42. package/src/viewer/components/AccessibilityPanel.tsx +1 -1
  43. package/src/viewer/components/ActionsPanel.tsx +1 -1
  44. package/src/viewer/components/App.tsx +137 -96
  45. package/src/viewer/components/BottomPanel.tsx +1 -1
  46. package/src/viewer/components/CodePanel.naming.test.tsx +1 -1
  47. package/src/viewer/components/CodePanel.tsx +1 -1
  48. package/src/viewer/components/CommandPalette.tsx +1 -1
  49. package/src/viewer/components/ComponentGraph.tsx +1 -1
  50. package/src/viewer/components/ComponentHeader.tsx +1 -1
  51. package/src/viewer/components/ContractPanel.tsx +1 -1
  52. package/src/viewer/components/ErrorBoundary.tsx +1 -1
  53. package/src/viewer/components/HealthDashboard.tsx +1 -1
  54. package/src/viewer/components/HmrStatusIndicator.tsx +1 -1
  55. package/src/viewer/components/InteractionsPanel.tsx +1 -1
  56. package/src/viewer/components/IsolatedRender.tsx +1 -1
  57. package/src/viewer/components/KeyboardShortcutsHelp.tsx +1 -1
  58. package/src/viewer/components/LandingPage.tsx +1 -1
  59. package/src/viewer/components/Layout.tsx +1 -1
  60. package/src/viewer/components/LeftSidebar.tsx +105 -18
  61. package/src/viewer/components/MultiViewportPreview.tsx +1 -1
  62. package/src/viewer/components/PreviewArea.tsx +1 -2
  63. package/src/viewer/components/PreviewFrameHost.tsx +0 -4
  64. package/src/viewer/components/PreviewMenu.tsx +247 -0
  65. package/src/viewer/components/PreviewToolbar.tsx +1 -1
  66. package/src/viewer/components/PropsEditor.tsx +1 -1
  67. package/src/viewer/components/PropsTable.tsx +1 -1
  68. package/src/viewer/components/RightSidebar.tsx +1 -1
  69. package/src/viewer/components/ScreenshotButton.tsx +1 -1
  70. package/src/viewer/components/SkeletonLoader.tsx +1 -1
  71. package/src/viewer/components/Toast.tsx +2 -2
  72. package/src/viewer/components/TokenStylePanel.tsx +1 -1
  73. package/src/viewer/components/VariantMatrix.tsx +1 -1
  74. package/src/viewer/components/VariantTabs.tsx +1 -1
  75. package/src/viewer/components/ViewportSelector.tsx +1 -1
  76. package/src/viewer/constants/ui.ts +14 -0
  77. package/src/viewer/entry.tsx +3 -4
  78. package/src/viewer/hooks/useKeyboardShortcuts.ts +65 -17
  79. package/src/viewer/hooks/useViewSettings.ts +1 -2
  80. package/src/viewer/index.ts +1 -1
  81. package/src/viewer/preview-frame.html +6 -9
  82. package/src/viewer/server.ts +80 -7
  83. package/src/viewer/styles/globals.css +12 -51
  84. package/src/viewer/vite-plugin.ts +70 -9
  85. package/dist/chunk-2EFVPE5Q.js.map +0 -1
  86. package/dist/chunk-3JPJTU25.js.map +0 -1
  87. package/dist/chunk-AA6CAHCZ.js.map +0 -1
  88. package/dist/chunk-CWKQQR6C.js.map +0 -1
  89. package/dist/init-4VXL3Q6N.js.map +0 -1
  90. package/dist/viewer-ZWQQ74FV.js.map +0 -1
  91. /package/dist/{chunk-LHIIBI6F.js.map → chunk-M42XIHPV.js.map} +0 -0
  92. /package/dist/{core-YAPWXDZW.js.map → core/index.js.map} +0 -0
  93. /package/dist/{generate-LEBVZCCH.js.map → generate-ZPERYZLF.js.map} +0 -0
  94. /package/dist/{scan-3NYSRF6G.js.map → scan-BSMLGBX4.js.map} +0 -0
  95. /package/dist/{service-HL6TMP3B.js.map → service-QACVPR37.js.map} +0 -0
  96. /package/dist/{static-viewer-KLD24I4R.js.map → static-viewer-2RQD5QLR.js.map} +0 -0
  97. /package/dist/{test-Y7YZOJLE.js.map → test-36UELXTE.js.map} +0 -0
  98. /package/dist/{tokens-M4FCJKBK.js.map → tokens-A3BZIQPB.js.map} +0 -0
@@ -4,15 +4,15 @@ import {
4
4
  findStorybookDir,
5
5
  generatePreviewModule,
6
6
  loadConfig
7
- } from "./chunk-CWKQQR6C.js";
7
+ } from "./chunk-57OW43NL.js";
8
8
  import {
9
9
  discoverFragmentFiles,
10
10
  discoverInstalledFragments
11
11
  } from "./chunk-AWYCDRPG.js";
12
12
  import {
13
13
  generateContext
14
- } from "./chunk-2EFVPE5Q.js";
15
- import "./chunk-AA6CAHCZ.js";
14
+ } from "./chunk-TQOGBAOZ.js";
15
+ import "./chunk-7CRC46HV.js";
16
16
  import {
17
17
  BRAND
18
18
  } from "./chunk-EKLMXTWU.js";
@@ -360,7 +360,7 @@ var sharedRenderPool = null;
360
360
  var browserPoolModule = null;
361
361
  async function getSharedRenderPool() {
362
362
  if (!browserPoolModule) {
363
- browserPoolModule = await import("./service-HL6TMP3B.js");
363
+ browserPoolModule = await import("./service-QACVPR37.js");
364
364
  }
365
365
  if (!sharedRenderPool) {
366
366
  sharedRenderPool = new browserPoolModule.BrowserPool({
@@ -603,7 +603,7 @@ function fragmentsPlugin(options) {
603
603
  const address = _server.httpServer?.address();
604
604
  const port = typeof address === "object" && address ? address.port : 6006;
605
605
  const renderViewport = viewport || { width: 800, height: 600 };
606
- const { FigmaClient, bufferToBase64Url } = await import("./service-HL6TMP3B.js");
606
+ const { FigmaClient, bufferToBase64Url } = await import("./service-QACVPR37.js");
607
607
  const figmaClient = new FigmaClient({
608
608
  accessToken: figmaToken
609
609
  });
@@ -694,7 +694,7 @@ function fragmentsPlugin(options) {
694
694
  );
695
695
  return;
696
696
  }
697
- const { FigmaClient } = await import("./service-HL6TMP3B.js");
697
+ const { FigmaClient } = await import("./service-QACVPR37.js");
698
698
  const figmaClient = new FigmaClient({ accessToken: figmaToken });
699
699
  const { fileKey, nodeId } = figmaClient.parseUrl(figmaUrl);
700
700
  const figmaDesignProps = await figmaClient.getNodeProperties(
@@ -735,7 +735,7 @@ function fragmentsPlugin(options) {
735
735
  }));
736
736
  return;
737
737
  }
738
- const { getSharedTokenRegistry } = await import("./service-HL6TMP3B.js");
738
+ const { getSharedTokenRegistry } = await import("./service-QACVPR37.js");
739
739
  const registry = getSharedTokenRegistry();
740
740
  if (!registry.isInitialized()) {
741
741
  await registry.initialize(config.tokens, projectRoot);
@@ -795,7 +795,7 @@ function fragmentsPlugin(options) {
795
795
  }));
796
796
  return;
797
797
  }
798
- const { getSharedTokenRegistry } = await import("./service-HL6TMP3B.js");
798
+ const { getSharedTokenRegistry } = await import("./service-QACVPR37.js");
799
799
  const registry = getSharedTokenRegistry();
800
800
  if (!registry.isInitialized()) {
801
801
  await registry.initialize(config.tokens, projectRoot);
@@ -857,7 +857,7 @@ function fragmentsPlugin(options) {
857
857
  res.end(JSON.stringify({ error: "Could not resolve fragment file path" }));
858
858
  return;
859
859
  }
860
- const { getSharedTokenRegistry } = await import("./service-HL6TMP3B.js");
860
+ const { getSharedTokenRegistry } = await import("./service-QACVPR37.js");
861
861
  const registry = getSharedTokenRegistry();
862
862
  if (!registry.isInitialized()) {
863
863
  await registry.initialize(config.tokens, projectRoot);
@@ -983,7 +983,7 @@ function fragmentsPlugin(options) {
983
983
  }
984
984
  const { writeFile, mkdir } = await import("fs/promises");
985
985
  const { join: join2 } = await import("path");
986
- const { BRAND: BRAND2 } = await import("./core-YAPWXDZW.js");
986
+ const { BRAND: BRAND2 } = await import("./core/index.js");
987
987
  const fragmentsDir = join2(projectRoot, BRAND2.dataDir, BRAND2.componentsDir);
988
988
  await mkdir(fragmentsDir, { recursive: true });
989
989
  const fragmentPath = join2(
@@ -1056,7 +1056,7 @@ function fragmentsPlugin(options) {
1056
1056
  const {
1057
1057
  getSharedTokenRegistry,
1058
1058
  generateTokenPatches
1059
- } = await import("./service-HL6TMP3B.js");
1059
+ } = await import("./service-QACVPR37.js");
1060
1060
  const registry = getSharedTokenRegistry();
1061
1061
  if (!registry.isInitialized()) {
1062
1062
  await registry.initialize(config.tokens, projectRoot);
@@ -1403,7 +1403,27 @@ function isStoryFile(filePath) {
1403
1403
  function getBaseComponentPath(filePath) {
1404
1404
  return filePath.replace(/\.(fragment|stories)\.(tsx?|jsx?)$/, "");
1405
1405
  }
1406
- function generateFragmentsModule(fragmentFiles, config, previewConfigPath) {
1406
+ function extractComponentName(filePath) {
1407
+ const match = filePath.match(/([^/\\]+)\.(fragment|stories)\.(tsx?|jsx?)$/);
1408
+ return match ? match[1] : filePath.split("/").pop() || filePath;
1409
+ }
1410
+ async function extractDependenciesFromSource(absolutePath) {
1411
+ try {
1412
+ const source = await readFile(absolutePath, "utf-8");
1413
+ const depsMatch = source.match(/dependencies:\s*\[([\s\S]*?)\]/);
1414
+ if (!depsMatch) return [];
1415
+ const names = [];
1416
+ const nameRegex = /name:\s*['"]([^'"]+)['"]/g;
1417
+ let match;
1418
+ while ((match = nameRegex.exec(depsMatch[1])) !== null) {
1419
+ names.push(match[1]);
1420
+ }
1421
+ return names;
1422
+ } catch {
1423
+ return [];
1424
+ }
1425
+ }
1426
+ async function generateFragmentsModule(fragmentFiles, config, previewConfigPath) {
1407
1427
  const filesByBasePath = /* @__PURE__ */ new Map();
1408
1428
  for (const file of fragmentFiles) {
1409
1429
  const basePath = getBaseComponentPath(file.relativePath);
@@ -1416,18 +1436,26 @@ function generateFragmentsModule(fragmentFiles, config, previewConfigPath) {
1416
1436
  }
1417
1437
  filesByBasePath.set(basePath, existing);
1418
1438
  }
1419
- const loaders = Array.from(filesByBasePath.values()).map((files) => {
1420
- const primaryFile = files.storyFile || files.fragmentFile;
1421
- if (!primaryFile) return null;
1422
- const isStory = !!files.storyFile;
1423
- const metadataPath = files.storyFile && files.fragmentFile ? files.fragmentFile.absolutePath : null;
1424
- return ` {
1439
+ const loaderEntries = await Promise.all(
1440
+ Array.from(filesByBasePath.values()).map(async (files) => {
1441
+ const primaryFile = files.storyFile || files.fragmentFile;
1442
+ if (!primaryFile) return null;
1443
+ const isStory = !!files.storyFile;
1444
+ const metadataPath = files.storyFile && files.fragmentFile ? files.fragmentFile.absolutePath : null;
1445
+ const componentName = extractComponentName(primaryFile.relativePath);
1446
+ const fragmentSource = files.fragmentFile || primaryFile;
1447
+ const dependencies = await extractDependenciesFromSource(fragmentSource.absolutePath);
1448
+ return ` {
1425
1449
  path: "${primaryFile.relativePath}",
1426
1450
  isStory: ${isStory},
1451
+ componentName: ${JSON.stringify(componentName)},
1452
+ dependencies: ${JSON.stringify(dependencies)},
1427
1453
  loader: () => import("${primaryFile.absolutePath}"),
1428
1454
  metadataLoader: ${metadataPath ? `() => import("${metadataPath}")` : "null"}
1429
1455
  }`;
1430
- }).filter(Boolean).join(",\n");
1456
+ })
1457
+ );
1458
+ const loaders = loaderEntries.filter(Boolean).join(",\n");
1431
1459
  const previewImport = previewConfigPath ? `import * as previewConfig from "virtual:fragments-preview";` : "";
1432
1460
  const previewSetup = previewConfigPath ? `
1433
1461
  // Set global preview config before loading fragments
@@ -1441,7 +1469,7 @@ setPreviewConfig({
1441
1469
  });
1442
1470
  ` : "";
1443
1471
  return `
1444
- import { storyModuleToFragment, setPreviewConfig } from "@fragments/core";
1472
+ import { storyModuleToFragment, setPreviewConfig } from "@fragments-sdk/cli/core";
1445
1473
  ${previewImport}
1446
1474
  ${previewSetup}
1447
1475
  // Lazy fragment loaders (supports both .fragment.tsx and .stories.tsx)
@@ -1533,11 +1561,27 @@ export async function loadAllFragments() {
1533
1561
  return { path: loader.path, fragment };
1534
1562
  } catch (error) {
1535
1563
  console.warn("[Fragments] Failed to load " + loader.path + ":", error.message);
1536
- return null;
1564
+ // Create an error stub so the component still appears in the sidebar
1565
+ // with a helpful message about what went wrong
1566
+ return {
1567
+ path: loader.path,
1568
+ fragment: {
1569
+ meta: {
1570
+ name: loader.componentName || loader.path,
1571
+ description: 'Failed to load',
1572
+ category: '',
1573
+ },
1574
+ variants: [],
1575
+ _loadError: {
1576
+ message: error.message,
1577
+ dependencies: loader.dependencies || [],
1578
+ },
1579
+ },
1580
+ };
1537
1581
  }
1538
1582
  })
1539
1583
  );
1540
- // Filter out failed loads
1584
+ // Filter out nulls (fragments that had no component)
1541
1585
  return results.filter(r => r !== null);
1542
1586
  }
1543
1587
 
@@ -1951,7 +1995,7 @@ async function loadFullFragmentForCompare(_server, _fragmentFiles, componentName
1951
1995
  }
1952
1996
  }
1953
1997
  async function compareImages(image1Base64, image2Base64, threshold) {
1954
- const { DiffEngine, base64UrlToBuffer, bufferToBase64Url } = await import("./service-HL6TMP3B.js");
1998
+ const { DiffEngine, base64UrlToBuffer, bufferToBase64Url } = await import("./service-QACVPR37.js");
1955
1999
  const { PNG } = await import("pngjs");
1956
2000
  const buffer1 = base64UrlToBuffer(image1Base64);
1957
2001
  const buffer2 = base64UrlToBuffer(image2Base64);
@@ -2053,6 +2097,10 @@ var viewerRoot = resolve2(cliPackageRoot, "src/viewer");
2053
2097
  var packagesRoot = resolve2(cliPackageRoot, "..");
2054
2098
  var localUiLibRoot = resolve2(packagesRoot, "../libs/ui/src");
2055
2099
  function resolveUiLib(nodeModulesDir) {
2100
+ const localIndex = join(localUiLibRoot, "index.ts");
2101
+ if (existsSync(localIndex)) {
2102
+ return localUiLibRoot;
2103
+ }
2056
2104
  const installedUi = join(nodeModulesDir, "@fragments-sdk/ui/src/index.ts");
2057
2105
  if (existsSync(installedUi)) {
2058
2106
  return resolve2(dirname2(installedUi));
@@ -2063,6 +2111,65 @@ function resolveUiLib(nodeModulesDir) {
2063
2111
  }
2064
2112
  return localUiLibRoot;
2065
2113
  }
2114
+ function cjsInteropPlugin(nodeModulesPath) {
2115
+ const virtualModules = {
2116
+ // use-sync-external-store/shim is CJS-only, used by @base-ui/react.
2117
+ // Since React 18+, useSyncExternalStore is built-in — redirect to React's native export.
2118
+ "use-sync-external-store/shim": `export { useSyncExternalStore } from 'react';`,
2119
+ // use-sync-external-store/shim/with-selector is CJS-only, used by @base-ui/utils.
2120
+ // Provides useSyncExternalStoreWithSelector — a selector wrapper around useSyncExternalStore.
2121
+ "use-sync-external-store/shim/with-selector": `
2122
+ import { useSyncExternalStore, useRef, useEffect, useMemo, useDebugValue } from 'react';
2123
+ export function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
2124
+ var instRef = useRef(null);
2125
+ if (instRef.current === null) instRef.current = { hasValue: false, value: null };
2126
+ var inst = instRef.current;
2127
+ var _useMemo = useMemo(function () {
2128
+ var hasMemo = false, memoizedSnapshot, memoizedSelection;
2129
+ function memoizedSelector(nextSnapshot) {
2130
+ if (!hasMemo) {
2131
+ hasMemo = true;
2132
+ memoizedSnapshot = nextSnapshot;
2133
+ var nextSelection = selector(nextSnapshot);
2134
+ if (isEqual !== undefined && inst.hasValue && isEqual(inst.value, nextSelection))
2135
+ return memoizedSelection = inst.value;
2136
+ return memoizedSelection = nextSelection;
2137
+ }
2138
+ if (Object.is(memoizedSnapshot, nextSnapshot)) return memoizedSelection;
2139
+ var nextSelection = selector(nextSnapshot);
2140
+ if (isEqual !== undefined && isEqual(memoizedSelection, nextSelection)) {
2141
+ memoizedSnapshot = nextSnapshot;
2142
+ return memoizedSelection;
2143
+ }
2144
+ memoizedSnapshot = nextSnapshot;
2145
+ return memoizedSelection = nextSelection;
2146
+ }
2147
+ var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
2148
+ return [function () { return memoizedSelector(getSnapshot()); },
2149
+ maybeGetServerSnapshot === null ? undefined : function () { return memoizedSelector(maybeGetServerSnapshot()); }];
2150
+ }, [getSnapshot, getServerSnapshot, selector, isEqual]);
2151
+ var value = useSyncExternalStore(subscribe, _useMemo[0], _useMemo[1]);
2152
+ useEffect(function () { inst.hasValue = true; inst.value = value; }, [value]);
2153
+ useDebugValue(value);
2154
+ return value;
2155
+ }`
2156
+ };
2157
+ return {
2158
+ name: "fragments-cjs-interop",
2159
+ enforce: "pre",
2160
+ resolveId(source) {
2161
+ if (source in virtualModules) {
2162
+ return `\0cjs-interop:${source}`;
2163
+ }
2164
+ return void 0;
2165
+ },
2166
+ load(id) {
2167
+ if (!id.startsWith("\0cjs-interop:")) return void 0;
2168
+ const pkg = id.slice("\0cjs-interop:".length);
2169
+ return virtualModules[pkg];
2170
+ }
2171
+ };
2172
+ }
2066
2173
  async function createDevServer(options = {}) {
2067
2174
  const startTime = performance.now();
2068
2175
  const {
@@ -2124,6 +2231,8 @@ async function createDevServer(options = {}) {
2124
2231
  plugins: [
2125
2232
  // React support (if not already in project config)
2126
2233
  ...hasReactPlugin(projectViteConfig) ? [] : [react()],
2234
+ // CJS interop for packages imported from within node_modules
2235
+ cjsInteropPlugin(nodeModulesPath),
2127
2236
  // Fragments plugins (array including SVGR)
2128
2237
  ...fragmentsPlugin({
2129
2238
  fragmentFiles: allFragmentFiles,
@@ -2142,12 +2251,10 @@ async function createDevServer(options = {}) {
2142
2251
  // Dedupe ensures all imports of these packages resolve to the same copy
2143
2252
  dedupe: ["react", "react-dom"],
2144
2253
  alias: {
2145
- // Allow importing from viewer package
2146
- "@fragments/viewer": viewerRoot,
2147
- // Resolve @fragments/ui to installed @fragments-sdk/ui or local source
2148
- "@fragments/ui": resolveUiLib(nodeModulesPath),
2149
- // Resolve @fragments/core to the consolidated core source
2150
- "@fragments/core": resolve2(cliPackageRoot, "src/core/index.ts"),
2254
+ // Resolve @fragments-sdk/ui to local source or installed package
2255
+ "@fragments-sdk/ui": resolveUiLib(nodeModulesPath),
2256
+ // Resolve @fragments-sdk/cli/core to the CLI's own core source
2257
+ "@fragments-sdk/cli/core": resolve2(cliPackageRoot, "src/core/index.ts"),
2151
2258
  // Ensure ALL react imports resolve to project's node_modules
2152
2259
  // This is critical for viewer files loaded from outside project root
2153
2260
  "react": safeRealpath(join(nodeModulesPath, "react")),
@@ -2215,4 +2322,4 @@ export {
2215
2322
  createDevServer,
2216
2323
  fragmentsPlugin
2217
2324
  };
2218
- //# sourceMappingURL=viewer-ZWQQ74FV.js.map
2325
+ //# sourceMappingURL=viewer-ZA7WK3EY.js.map