@recursica/adapter-tester 2.0.1 → 2.0.3
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.
- package/README.md +1 -1
- package/dist/cli.cjs +2 -2
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/devServer.d.ts.map +1 -1
- package/dist/harness/mantineSourceOfTruth.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.html +37 -37
- package/dist/index.js +1 -1
- package/dist/{mantineSourceOfTruth-D6tezfE1.cjs → mantineSourceOfTruth-BUb5MZy0.cjs} +4 -4
- package/dist/{mantineSourceOfTruth-D6tezfE1.cjs.map → mantineSourceOfTruth-BUb5MZy0.cjs.map} +1 -1
- package/dist/{mantineSourceOfTruth-BtZhbJA_.js → mantineSourceOfTruth-BUkqMNEo.js} +26 -23
- package/dist/{mantineSourceOfTruth-BtZhbJA_.js.map → mantineSourceOfTruth-BUkqMNEo.js.map} +1 -1
- package/package.json +1 -1
- package/public/index.html +37 -37
package/dist/devServer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devServer.d.ts","sourceRoot":"","sources":["../src/devServer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"devServer.d.ts","sourceRoot":"","sources":["../src/devServer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAgGhF,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAC5B,YAAY,EAAE,mBAAmB,EACjC,UAAU,EAAE,sBAAsB,EAAE,EACpC,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CA6HN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mantineSourceOfTruth.d.ts","sourceRoot":"","sources":["../../src/harness/mantineSourceOfTruth.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,EAAE,OAAO,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAqID,8EAA8E;AAC9E,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,kCAAkC,GAC1C,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,kCAAkC,GAC1C,sBAAsB,
|
|
1
|
+
{"version":3,"file":"mantineSourceOfTruth.d.ts","sourceRoot":"","sources":["../../src/harness/mantineSourceOfTruth.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iFAAiF;IACjF,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,EAAE,OAAO,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;CACjB;AAqID,8EAA8E;AAC9E,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,kCAAkC,GAC1C,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,kCAAkC,GAC1C,sBAAsB,CAwBxB"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-B0Eop8Az.cjs"),r=require("./mantineSourceOfTruth-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./config-B0Eop8Az.cjs"),r=require("./mantineSourceOfTruth-BUb5MZy0.cjs");exports.defineAdapterTesterConfig=e.defineAdapterTesterConfig;exports.getSourceOfTruth=e.getSourceOfTruth;exports.mantineSourceOfTruthWebServer=r.mantineSourceOfTruthWebServer;exports.scaffoldMantineSourceOfTruthHarness=r.scaffoldMantineSourceOfTruthHarness;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.html
CHANGED
|
@@ -165,11 +165,11 @@
|
|
|
165
165
|
<body>
|
|
166
166
|
<div class="pane" id="leftPane">
|
|
167
167
|
<div class="header">
|
|
168
|
-
<span id="
|
|
169
|
-
<span class="status connected" id="
|
|
168
|
+
<span id="ownLabel">Target</span>
|
|
169
|
+
<span class="status connected" id="ownStatus">Connected & Syncing</span>
|
|
170
170
|
</div>
|
|
171
|
-
<!-- Load
|
|
172
|
-
<iframe id="
|
|
171
|
+
<!-- Load this project's own Storybook via the SAME ORIGIN proxy -->
|
|
172
|
+
<iframe id="own" src="/?path=/story/ui-kit-slider--default"></iframe>
|
|
173
173
|
</div>
|
|
174
174
|
|
|
175
175
|
<div class="divider" id="vDivider"></div>
|
|
@@ -177,13 +177,13 @@
|
|
|
177
177
|
<div class="pane" id="rightPane">
|
|
178
178
|
<div class="right-top" id="rightTop">
|
|
179
179
|
<div class="header">
|
|
180
|
-
<span id="
|
|
181
|
-
<span class="status connected" id="
|
|
180
|
+
<span id="sourceOfTruthLabel">Source of Truth</span>
|
|
181
|
+
<span class="status connected" id="sourceOfTruthStatus">Ready</span>
|
|
182
182
|
</div>
|
|
183
|
-
<!-- Spacer to align the view with the
|
|
183
|
+
<!-- Spacer to align the view with the own Storybook's header (40px) -->
|
|
184
184
|
<div style="height: 40px; flex: 0 0 40px; background-color: #fff; border-bottom: 1px solid #e6e6e6; box-sizing: border-box;"></div>
|
|
185
|
-
<!-- Load the bare
|
|
186
|
-
<iframe id="
|
|
185
|
+
<!-- Load the bare source-of-truth component preview -->
|
|
186
|
+
<iframe id="sourceOfTruth" src=""></iframe>
|
|
187
187
|
</div>
|
|
188
188
|
|
|
189
189
|
<div class="h-divider" id="hDivider"></div>
|
|
@@ -214,13 +214,13 @@
|
|
|
214
214
|
|
|
215
215
|
<script>
|
|
216
216
|
// Injected by the dev server — see src/devServer.ts.
|
|
217
|
-
const devConfig = window.__ADAPTER_TESTER__ || { sourceOfTruthName: 'Source of Truth',
|
|
217
|
+
const devConfig = window.__ADAPTER_TESTER__ || { ownName: 'Target', sourceOfTruthName: 'Source of Truth', sourceOfTruthPort: 6011 };
|
|
218
|
+
document.getElementById('ownLabel').textContent = devConfig.ownName;
|
|
218
219
|
document.getElementById('sourceOfTruthLabel').textContent = `${devConfig.sourceOfTruthName} (Source of Truth)`;
|
|
219
|
-
document.getElementById('targetLabel').textContent = devConfig.targetName;
|
|
220
220
|
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
const
|
|
221
|
+
const ownIframe = document.getElementById('own');
|
|
222
|
+
const sourceOfTruthIframe = document.getElementById('sourceOfTruth');
|
|
223
|
+
const sourceOfTruthStatus = document.getElementById('sourceOfTruthStatus');
|
|
224
224
|
|
|
225
225
|
// Sync initial iframe sources with outer URL if params exist, else fall
|
|
226
226
|
// back to a sensible default story so both panes load something on open.
|
|
@@ -228,17 +228,17 @@
|
|
|
228
228
|
const initialId = outerParams.get('id') || 'ui-kit-slider--default';
|
|
229
229
|
const initialArgs = outerParams.get('args');
|
|
230
230
|
|
|
231
|
-
let
|
|
231
|
+
let ownSrc = `/?path=/story/${initialId}`;
|
|
232
232
|
if (initialArgs) {
|
|
233
|
-
|
|
233
|
+
ownSrc += `&args=${initialArgs}`;
|
|
234
234
|
}
|
|
235
|
-
|
|
235
|
+
ownIframe.src = ownSrc;
|
|
236
236
|
|
|
237
|
-
let
|
|
237
|
+
let sotSrc = `http://localhost:${devConfig.sourceOfTruthPort}/iframe.html?id=${initialId}&viewMode=story`;
|
|
238
238
|
if (initialArgs) {
|
|
239
|
-
|
|
239
|
+
sotSrc += `&args=${initialArgs}`;
|
|
240
240
|
}
|
|
241
|
-
|
|
241
|
+
sourceOfTruthIframe.src = sotSrc;
|
|
242
242
|
|
|
243
243
|
// Resizers
|
|
244
244
|
const vDivider = document.getElementById('vDivider');
|
|
@@ -263,8 +263,8 @@
|
|
|
263
263
|
vDivider.addEventListener('mousedown', (e) => {
|
|
264
264
|
isVResizing = true;
|
|
265
265
|
document.body.style.cursor = 'col-resize';
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
ownIframe.style.pointerEvents = 'none';
|
|
267
|
+
sourceOfTruthIframe.style.pointerEvents = 'none';
|
|
268
268
|
});
|
|
269
269
|
|
|
270
270
|
document.addEventListener('mousemove', (e) => {
|
|
@@ -288,8 +288,8 @@
|
|
|
288
288
|
isVResizing = false;
|
|
289
289
|
isHResizing = false;
|
|
290
290
|
document.body.style.cursor = 'default';
|
|
291
|
-
|
|
292
|
-
|
|
291
|
+
ownIframe.style.pointerEvents = 'auto';
|
|
292
|
+
sourceOfTruthIframe.style.pointerEvents = 'auto';
|
|
293
293
|
}
|
|
294
294
|
});
|
|
295
295
|
|
|
@@ -298,8 +298,8 @@
|
|
|
298
298
|
hDivider.addEventListener('mousedown', (e) => {
|
|
299
299
|
isHResizing = true;
|
|
300
300
|
document.body.style.cursor = 'row-resize';
|
|
301
|
-
|
|
302
|
-
|
|
301
|
+
ownIframe.style.pointerEvents = 'none';
|
|
302
|
+
sourceOfTruthIframe.style.pointerEvents = 'none';
|
|
303
303
|
});
|
|
304
304
|
|
|
305
305
|
// Auto-save notes logic
|
|
@@ -406,7 +406,7 @@
|
|
|
406
406
|
let lastUrl = '';
|
|
407
407
|
setInterval(() => {
|
|
408
408
|
try {
|
|
409
|
-
const currentUrl =
|
|
409
|
+
const currentUrl = ownIframe.contentWindow.location.href;
|
|
410
410
|
|
|
411
411
|
if (currentUrl && currentUrl !== lastUrl && currentUrl !== 'about:blank') {
|
|
412
412
|
lastUrl = currentUrl;
|
|
@@ -440,19 +440,19 @@
|
|
|
440
440
|
window.history.replaceState({}, '', outerUrl.pathname + outerUrl.search);
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
let
|
|
443
|
+
let sotUrl = `http://localhost:${devConfig.sourceOfTruthPort}/iframe.html?id=${id}&viewMode=story`;
|
|
444
444
|
if (args) {
|
|
445
|
-
|
|
445
|
+
sotUrl += `&args=${args}`;
|
|
446
446
|
}
|
|
447
|
-
|
|
448
|
-
if (
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
447
|
+
|
|
448
|
+
if (sourceOfTruthIframe.src !== sotUrl) {
|
|
449
|
+
sourceOfTruthStatus.textContent = 'Updating...';
|
|
450
|
+
sourceOfTruthStatus.classList.remove('connected');
|
|
451
|
+
sourceOfTruthIframe.src = sotUrl;
|
|
452
|
+
|
|
453
453
|
setTimeout(() => {
|
|
454
|
-
|
|
455
|
-
|
|
454
|
+
sourceOfTruthStatus.textContent = 'Synced';
|
|
455
|
+
sourceOfTruthStatus.classList.add('connected');
|
|
456
456
|
}, 500);
|
|
457
457
|
}
|
|
458
458
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";const t=require("node:fs"),o=require("node:path"),
|
|
1
|
+
"use strict";const t=require("node:fs"),o=require("node:path"),c="^8.0.0",s="^10.3.3",d="^19.0.0",p={"@storybook/addon-docs":s,"@storybook/addon-a11y":s,"storybook-dark-mode":"^5.0.0"},u={"react-markdown":"^10.1.0"};function m(e){return{name:"adapter-tester-mantine-source-of-truth-harness",private:!0,type:"module",scripts:{storybook:`storybook dev -p ${e.port}`},dependencies:{"@recursica/mantine-adapter":e.mantineAdapterVersion,"@recursica/storybook-template":e.storybookTemplateVersion,"@recursica/official-release":"latest","@recursica/adapter-common":"latest","@mantine/core":c,"@mantine/dates":c,react:d,"react-dom":d,storybook:s,"@storybook/react-vite":s,...p,...u}}}const f=`import { createMainConfig } from "@recursica/storybook-template/main";
|
|
2
2
|
|
|
3
3
|
const config = createMainConfig({
|
|
4
4
|
stories: [
|
|
@@ -69,7 +69,7 @@ const preview: Preview = {
|
|
|
69
69
|
};
|
|
70
70
|
|
|
71
71
|
export default preview;
|
|
72
|
-
`;function
|
|
72
|
+
`;function l(e){const{dir:r,port:a,mantineAdapterVersion:i="latest",storybookTemplateVersion:n="latest"}=e;return t.mkdirSync(o.join(r,".storybook"),{recursive:!0}),t.writeFileSync(o.join(r,"package.json"),JSON.stringify(m({mantineAdapterVersion:i,storybookTemplateVersion:n,port:a}),null,2)+`
|
|
73
73
|
`),t.writeFileSync(o.join(r,".storybook/main.ts"),f),t.writeFileSync(o.join(r,".storybook/preview.tsx"),y),t.writeFileSync(o.join(r,".gitignore"),`node_modules
|
|
74
|
-
`),r}function h(e){const r=
|
|
75
|
-
//# sourceMappingURL=mantineSourceOfTruth-
|
|
74
|
+
`),r}function h(e){const r=l(e),{mantineAdapterVersion:a="latest",storybookTemplateVersion:i="latest"}=e;return{command:`npm install @recursica/mantine-adapter@${a} @recursica/storybook-template@${i} --no-audit --no-fund && npm run storybook`,port:e.port,cwd:r,reuseExistingServer:!process.env.CI,timeout:180*1e3}}exports.mantineSourceOfTruthWebServer=h;exports.scaffoldMantineSourceOfTruthHarness=l;
|
|
75
|
+
//# sourceMappingURL=mantineSourceOfTruth-BUb5MZy0.cjs.map
|
package/dist/{mantineSourceOfTruth-D6tezfE1.cjs.map → mantineSourceOfTruth-BUb5MZy0.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mantineSourceOfTruth-D6tezfE1.cjs","sources":["../src/harness/mantineSourceOfTruth.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Generates a small, throwaway Storybook project that installs\n * `@recursica/mantine-adapter` as a real npm dependency (not a workspace\n * link) and boots a real Storybook from its published `src/**\\/*.stories.tsx`\n * files, using `@recursica/storybook-template`'s exported factories.\n *\n * This lets any repo — including ones that never checked out the Recursica\n * monorepo — run adapter-tester's visual regression suite against Mantine\n * (Recursica's source-of-truth adapter) as one side of the comparison, while\n * the other side is that repo's own already-running local Storybook.\n *\n * See PROPOSAL-installed-package-harness.md for the verified prototype this\n * is built from, and the three upstream gaps it works around.\n */\n\nexport interface MantineSourceOfTruthHarnessOptions {\n /**\n * Directory the harness project is scaffolded into. Regenerated on every\n * call — add it to your .gitignore rather than committing it.\n */\n dir: string;\n /** Port the harness's Storybook dev server boots on. */\n port: number;\n /** npm version/range for @recursica/mantine-adapter. Defaults to \"latest\". */\n mantineAdapterVersion?: string;\n /** npm version/range for @recursica/storybook-template. Defaults to \"latest\". */\n storybookTemplateVersion?: string;\n}\n\nexport interface HarnessWebServerConfig {\n command: string;\n port: number;\n cwd: string;\n reuseExistingServer: boolean;\n timeout: number;\n}\n\n// Peer/dev ranges pinned to what @recursica/mantine-adapter and\n// @recursica/storybook-template themselves require, so the harness can't\n// drift onto an incompatible Mantine or Storybook major version.\nconst MANTINE_CORE_RANGE = \"^8.0.0\";\nconst STORYBOOK_RANGE = \"^10.3.3\";\nconst REACT_RANGE = \"^19.0.0\";\n\n// storybook-template's createMainConfig() defaults its addons list to these\n// three but doesn't declare them as peerDependencies (proposal gap 2) — a\n// harness that skips installing any of them gets a silent \"could not\n// resolve addon\" warning at boot, then a hard runtime crash later when Vite\n// pre-bundles preview.tsx's dependency graph. Installed explicitly here.\nconst DEFAULT_ADDON_DEPENDENCIES = {\n \"@storybook/addon-docs\": STORYBOOK_RANGE,\n \"@storybook/addon-a11y\": STORYBOOK_RANGE,\n \"storybook-dark-mode\": \"^5.0.0\",\n};\n\n// mantine-adapter's Introduction.stories.tsx (Version.tsx/OverStyling.tsx)\n// needs react-markdown, but it's a devDependency there — Storybook-only,\n// never bundled into dist — so an external `npm install` of the published\n// package won't pull it in. The harness boots a real Storybook against\n// src/, so it must provide this itself. Installed explicitly here.\nconst WORKAROUND_DEPENDENCIES = {\n \"react-markdown\": \"^10.1.0\",\n};\n\nfunction harnessPackageJson(options: {\n mantineAdapterVersion: string;\n storybookTemplateVersion: string;\n port: number;\n}) {\n return {\n name: \"adapter-tester-mantine-source-of-truth-harness\",\n private: true,\n type: \"module\",\n scripts: {\n storybook: `storybook dev -p ${options.port}`,\n },\n dependencies: {\n \"@recursica/mantine-adapter\": options.mantineAdapterVersion,\n \"@recursica/storybook-template\": options.storybookTemplateVersion,\n \"@recursica/official-release\": \"latest\",\n \"@recursica/adapter-common\": \"latest\",\n \"@mantine/core\": MANTINE_CORE_RANGE,\n \"@mantine/dates\": MANTINE_CORE_RANGE,\n react: REACT_RANGE,\n \"react-dom\": REACT_RANGE,\n storybook: STORYBOOK_RANGE,\n \"@storybook/react-vite\": STORYBOOK_RANGE,\n ...DEFAULT_ADDON_DEPENDENCIES,\n ...WORKAROUND_DEPENDENCIES,\n },\n };\n}\n\nconst MAIN_TS = `import { createMainConfig } from \"@recursica/storybook-template/main\";\n\nconst config = createMainConfig({\n stories: [\n \"../node_modules/@recursica/mantine-adapter/src/**/*.stories.@(js|jsx|mjs|ts|tsx)\",\n ],\n enableCORS: true,\n});\n\n// react-docgen-typescript can't resolve a TS project for a config file living\n// in .storybook/ when the component source it's docgen'ing lives three\n// directories down inside node_modules — it throws \"Cannot read properties\n// of undefined (reading 'fileExists')\", which surfaces as a plain 404 on\n// preview.tsx. Docgen only powers Storybook's Controls/Docs tables, which\n// this harness never renders, so disabling it is a safe workaround (see\n// PROPOSAL-installed-package-harness.md, gap 3).\nconfig.typescript = { ...config.typescript, reactDocgen: false };\n\nexport default config;\n`;\n\nconst PREVIEW_TSX = `import type { Preview } from \"@storybook/react-vite\";\nimport { createPreviewConfig } from \"@recursica/storybook-template/preview\";\nimport { MantineProvider } from \"@mantine/core\";\nimport { Layer } from \"@recursica/adapter-common\";\nimport \"@mantine/core/styles.css\";\nimport \"@mantine/dates/styles.css\";\nimport \"@recursica/adapter-common/style.css\";\nimport \"@recursica/official-release/recursica_variables_scoped.css\";\nimport recursicaTokens from \"@recursica/official-release/recursica_tokens.json\";\nimport recursicaBrand from \"@recursica/official-release/recursica_brand.json\";\nimport recursicaUIKit from \"@recursica/official-release/recursica_ui-kit.json\";\n\nconst basePreview = createPreviewConfig({\n defaultTheme: \"light\",\n recursicaTokensJsonPath: recursicaTokens,\n recursicaBrandJsonPath: recursicaBrand,\n recursicaUIKitJsonPath: recursicaUIKit,\n});\n\n// Mirrors mantine-adapter's own .storybook/preview.tsx decorator (every story defaults to\n// withLayer: true, layer: 0, wrapped with 48px padding) — every real adapter's own preview.tsx\n// applies this same wrapping, so a target adapter's story renders inside the same Layer\n// chrome/padding the source-of-truth side does. Without this, target screenshots come out\n// dramatically smaller/differently-positioned than the source of truth's (no Layer padding,\n// background, or border-radius at all), which alone can blow past the pixel-diff threshold\n// regardless of whether the actual Recursica tokens match — a false positive, not a real\n// component bug. ColorSchemeWrapper (mantine-adapter's dark-mode-toggle sync helper) is\n// intentionally not replicated — it only matters for the interactive dev-mode UI, not automated\n// screenshot diffing, which always runs in a single theme.\nconst preview: Preview = {\n ...basePreview,\n decorators: [\n (Story, context) => {\n const { withLayer = true, layer = 0 } = context.args;\n const content = <Story />;\n return (\n <MantineProvider>\n {withLayer ? (\n <Layer layer={layer as 0 | 1 | 2 | 3} style={{ padding: \"48px\" }}>\n {content}\n </Layer>\n ) : (\n content\n )}\n </MantineProvider>\n );\n },\n ...(basePreview.decorators || []),\n ],\n};\n\nexport default preview;\n`;\n\n/** Writes the harness project's files to `options.dir` without booting it. */\nexport function scaffoldMantineSourceOfTruthHarness(\n options: MantineSourceOfTruthHarnessOptions,\n): string {\n const {\n dir,\n port,\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n mkdirSync(join(dir, \".storybook\"), { recursive: true });\n writeFileSync(\n join(dir, \"package.json\"),\n JSON.stringify(\n harnessPackageJson({\n mantineAdapterVersion,\n storybookTemplateVersion,\n port,\n }),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(join(dir, \".storybook/main.ts\"), MAIN_TS);\n writeFileSync(join(dir, \".storybook/preview.tsx\"), PREVIEW_TSX);\n writeFileSync(join(dir, \".gitignore\"), \"node_modules\\n\");\n\n return dir;\n}\n\n/**\n * Scaffolds the harness and returns a Playwright `webServer` entry for it.\n * Spread the result directly into `playwright.config.ts`'s `webServer` array.\n */\nexport function mantineSourceOfTruthWebServer(\n options: MantineSourceOfTruthHarnessOptions,\n): HarnessWebServerConfig {\n const dir = scaffoldMantineSourceOfTruthHarness(options);\n return {\n command: \"npm install --no-audit --no-fund && npm run storybook\",\n port: options.port,\n cwd: dir,\n reuseExistingServer: !process.env.CI,\n timeout: 180 * 1000,\n };\n}\n"],"names":["MANTINE_CORE_RANGE","STORYBOOK_RANGE","REACT_RANGE","DEFAULT_ADDON_DEPENDENCIES","WORKAROUND_DEPENDENCIES","harnessPackageJson","options","MAIN_TS","PREVIEW_TSX","scaffoldMantineSourceOfTruthHarness","dir","port","mantineAdapterVersion","storybookTemplateVersion","mkdirSync","join","writeFileSync","mantineSourceOfTruthWebServer"],"mappings":"+DA2CMA,EAAqB,SACrBC,EAAkB,UAClBC,EAAc,UAOdC,EAA6B,CACjC,wBAAyBF,EACzB,wBAAyBA,EACzB,sBAAuB,QACzB,EAOMG,EAA0B,CAC9B,iBAAkB,SACpB,EAEA,SAASC,EAAmBC,EAIzB,CACD,MAAO,CACL,KAAM,iDACN,QAAS,GACT,KAAM,SACN,QAAS,CACP,UAAW,oBAAoBA,EAAQ,IAAI,EAAA,EAE7C,aAAc,CACZ,6BAA8BA,EAAQ,sBACtC,gCAAiCA,EAAQ,yBACzC,8BAA+B,SAC/B,4BAA6B,SAC7B,gBAAiBN,EACjB,iBAAkBA,EAClB,MAAOE,EACP,YAAaA,EACb,UAAWD,EACX,wBAAyBA,EACzB,GAAGE,EACH,GAAGC,CAAA,CACL,CAEJ,CAEA,MAAMG,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBVC,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuDb,SAASC,EACdH,EACQ,CACR,KAAM,CACJ,IAAAI,EACA,KAAAC,EACA,sBAAAC,EAAwB,SACxB,yBAAAC,EAA2B,QAAA,EACzBP,EAEJQ,OAAAA,EAAAA,UAAUC,EAAAA,KAAKL,EAAK,YAAY,EAAG,CAAE,UAAW,GAAM,EACtDM,EAAAA,cACED,EAAAA,KAAKL,EAAK,cAAc,EACxB,KAAK,UACHL,EAAmB,CACjB,sBAAAO,EACA,yBAAAC,EACA,KAAAF,CAAA,CACD,EACD,KACA,CAAA,EACE;AAAA,CAAA,EAENK,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,oBAAoB,EAAGH,CAAO,EACtDS,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,wBAAwB,EAAGF,CAAW,EAC9DQ,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,YAAY,EAAG;AAAA,CAAgB,EAEhDA,CACT,CAMO,SAASO,EACdX,EACwB,CACxB,MAAMI,EAAMD,EAAoCH,CAAO,EACvD,MAAO,CACL,QAAS,wDACT,KAAMA,EAAQ,KACd,IAAKI,EACL,oBAAqB,CAAC,QAAQ,IAAI,GAClC,QAAS,IAAM,GAAA,CAEnB"}
|
|
1
|
+
{"version":3,"file":"mantineSourceOfTruth-BUb5MZy0.cjs","sources":["../src/harness/mantineSourceOfTruth.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Generates a small, throwaway Storybook project that installs\n * `@recursica/mantine-adapter` as a real npm dependency (not a workspace\n * link) and boots a real Storybook from its published `src/**\\/*.stories.tsx`\n * files, using `@recursica/storybook-template`'s exported factories.\n *\n * This lets any repo — including ones that never checked out the Recursica\n * monorepo — run adapter-tester's visual regression suite against Mantine\n * (Recursica's source-of-truth adapter) as one side of the comparison, while\n * the other side is that repo's own already-running local Storybook.\n *\n * See PROPOSAL-installed-package-harness.md for the verified prototype this\n * is built from, and the three upstream gaps it works around.\n */\n\nexport interface MantineSourceOfTruthHarnessOptions {\n /**\n * Directory the harness project is scaffolded into. Regenerated on every\n * call — add it to your .gitignore rather than committing it.\n */\n dir: string;\n /** Port the harness's Storybook dev server boots on. */\n port: number;\n /** npm version/range for @recursica/mantine-adapter. Defaults to \"latest\". */\n mantineAdapterVersion?: string;\n /** npm version/range for @recursica/storybook-template. Defaults to \"latest\". */\n storybookTemplateVersion?: string;\n}\n\nexport interface HarnessWebServerConfig {\n command: string;\n port: number;\n cwd: string;\n reuseExistingServer: boolean;\n timeout: number;\n}\n\n// Peer/dev ranges pinned to what @recursica/mantine-adapter and\n// @recursica/storybook-template themselves require, so the harness can't\n// drift onto an incompatible Mantine or Storybook major version.\nconst MANTINE_CORE_RANGE = \"^8.0.0\";\nconst STORYBOOK_RANGE = \"^10.3.3\";\nconst REACT_RANGE = \"^19.0.0\";\n\n// storybook-template's createMainConfig() defaults its addons list to these\n// three but doesn't declare them as peerDependencies (proposal gap 2) — a\n// harness that skips installing any of them gets a silent \"could not\n// resolve addon\" warning at boot, then a hard runtime crash later when Vite\n// pre-bundles preview.tsx's dependency graph. Installed explicitly here.\nconst DEFAULT_ADDON_DEPENDENCIES = {\n \"@storybook/addon-docs\": STORYBOOK_RANGE,\n \"@storybook/addon-a11y\": STORYBOOK_RANGE,\n \"storybook-dark-mode\": \"^5.0.0\",\n};\n\n// mantine-adapter's Introduction.stories.tsx (Version.tsx/OverStyling.tsx)\n// needs react-markdown, but it's a devDependency there — Storybook-only,\n// never bundled into dist — so an external `npm install` of the published\n// package won't pull it in. The harness boots a real Storybook against\n// src/, so it must provide this itself. Installed explicitly here.\nconst WORKAROUND_DEPENDENCIES = {\n \"react-markdown\": \"^10.1.0\",\n};\n\nfunction harnessPackageJson(options: {\n mantineAdapterVersion: string;\n storybookTemplateVersion: string;\n port: number;\n}) {\n return {\n name: \"adapter-tester-mantine-source-of-truth-harness\",\n private: true,\n type: \"module\",\n scripts: {\n storybook: `storybook dev -p ${options.port}`,\n },\n dependencies: {\n \"@recursica/mantine-adapter\": options.mantineAdapterVersion,\n \"@recursica/storybook-template\": options.storybookTemplateVersion,\n \"@recursica/official-release\": \"latest\",\n \"@recursica/adapter-common\": \"latest\",\n \"@mantine/core\": MANTINE_CORE_RANGE,\n \"@mantine/dates\": MANTINE_CORE_RANGE,\n react: REACT_RANGE,\n \"react-dom\": REACT_RANGE,\n storybook: STORYBOOK_RANGE,\n \"@storybook/react-vite\": STORYBOOK_RANGE,\n ...DEFAULT_ADDON_DEPENDENCIES,\n ...WORKAROUND_DEPENDENCIES,\n },\n };\n}\n\nconst MAIN_TS = `import { createMainConfig } from \"@recursica/storybook-template/main\";\n\nconst config = createMainConfig({\n stories: [\n \"../node_modules/@recursica/mantine-adapter/src/**/*.stories.@(js|jsx|mjs|ts|tsx)\",\n ],\n enableCORS: true,\n});\n\n// react-docgen-typescript can't resolve a TS project for a config file living\n// in .storybook/ when the component source it's docgen'ing lives three\n// directories down inside node_modules — it throws \"Cannot read properties\n// of undefined (reading 'fileExists')\", which surfaces as a plain 404 on\n// preview.tsx. Docgen only powers Storybook's Controls/Docs tables, which\n// this harness never renders, so disabling it is a safe workaround (see\n// PROPOSAL-installed-package-harness.md, gap 3).\nconfig.typescript = { ...config.typescript, reactDocgen: false };\n\nexport default config;\n`;\n\nconst PREVIEW_TSX = `import type { Preview } from \"@storybook/react-vite\";\nimport { createPreviewConfig } from \"@recursica/storybook-template/preview\";\nimport { MantineProvider } from \"@mantine/core\";\nimport { Layer } from \"@recursica/adapter-common\";\nimport \"@mantine/core/styles.css\";\nimport \"@mantine/dates/styles.css\";\nimport \"@recursica/adapter-common/style.css\";\nimport \"@recursica/official-release/recursica_variables_scoped.css\";\nimport recursicaTokens from \"@recursica/official-release/recursica_tokens.json\";\nimport recursicaBrand from \"@recursica/official-release/recursica_brand.json\";\nimport recursicaUIKit from \"@recursica/official-release/recursica_ui-kit.json\";\n\nconst basePreview = createPreviewConfig({\n defaultTheme: \"light\",\n recursicaTokensJsonPath: recursicaTokens,\n recursicaBrandJsonPath: recursicaBrand,\n recursicaUIKitJsonPath: recursicaUIKit,\n});\n\n// Mirrors mantine-adapter's own .storybook/preview.tsx decorator (every story defaults to\n// withLayer: true, layer: 0, wrapped with 48px padding) — every real adapter's own preview.tsx\n// applies this same wrapping, so a target adapter's story renders inside the same Layer\n// chrome/padding the source-of-truth side does. Without this, target screenshots come out\n// dramatically smaller/differently-positioned than the source of truth's (no Layer padding,\n// background, or border-radius at all), which alone can blow past the pixel-diff threshold\n// regardless of whether the actual Recursica tokens match — a false positive, not a real\n// component bug. ColorSchemeWrapper (mantine-adapter's dark-mode-toggle sync helper) is\n// intentionally not replicated — it only matters for the interactive dev-mode UI, not automated\n// screenshot diffing, which always runs in a single theme.\nconst preview: Preview = {\n ...basePreview,\n decorators: [\n (Story, context) => {\n const { withLayer = true, layer = 0 } = context.args;\n const content = <Story />;\n return (\n <MantineProvider>\n {withLayer ? (\n <Layer layer={layer as 0 | 1 | 2 | 3} style={{ padding: \"48px\" }}>\n {content}\n </Layer>\n ) : (\n content\n )}\n </MantineProvider>\n );\n },\n ...(basePreview.decorators || []),\n ],\n};\n\nexport default preview;\n`;\n\n/** Writes the harness project's files to `options.dir` without booting it. */\nexport function scaffoldMantineSourceOfTruthHarness(\n options: MantineSourceOfTruthHarnessOptions,\n): string {\n const {\n dir,\n port,\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n mkdirSync(join(dir, \".storybook\"), { recursive: true });\n writeFileSync(\n join(dir, \"package.json\"),\n JSON.stringify(\n harnessPackageJson({\n mantineAdapterVersion,\n storybookTemplateVersion,\n port,\n }),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(join(dir, \".storybook/main.ts\"), MAIN_TS);\n writeFileSync(join(dir, \".storybook/preview.tsx\"), PREVIEW_TSX);\n writeFileSync(join(dir, \".gitignore\"), \"node_modules\\n\");\n\n return dir;\n}\n\n/**\n * Scaffolds the harness and returns a Playwright `webServer` entry for it.\n * Spread the result directly into `playwright.config.ts`'s `webServer` array.\n */\nexport function mantineSourceOfTruthWebServer(\n options: MantineSourceOfTruthHarnessOptions,\n): HarnessWebServerConfig {\n const dir = scaffoldMantineSourceOfTruthHarness(options);\n const {\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n // A bare `npm install` is satisfied by a package-lock.json already sitting\n // in `dir` from a prior run and skips re-resolving against the registry\n // entirely — no network call — so a run can silently keep testing against\n // a stale @recursica/mantine-adapter/storybook-template even after a newer\n // version is published. Naming the two version-pinned packages as explicit\n // `pkg@specifier` CLI args instead forces npm to re-check just those two\n // against the registry every run, while the rest of node_modules stays\n // cached.\n const command = `npm install @recursica/mantine-adapter@${mantineAdapterVersion} @recursica/storybook-template@${storybookTemplateVersion} --no-audit --no-fund && npm run storybook`;\n\n return {\n command,\n port: options.port,\n cwd: dir,\n reuseExistingServer: !process.env.CI,\n timeout: 180 * 1000,\n };\n}\n"],"names":["MANTINE_CORE_RANGE","STORYBOOK_RANGE","REACT_RANGE","DEFAULT_ADDON_DEPENDENCIES","WORKAROUND_DEPENDENCIES","harnessPackageJson","options","MAIN_TS","PREVIEW_TSX","scaffoldMantineSourceOfTruthHarness","dir","port","mantineAdapterVersion","storybookTemplateVersion","mkdirSync","join","writeFileSync","mantineSourceOfTruthWebServer"],"mappings":"+DA2CMA,EAAqB,SACrBC,EAAkB,UAClBC,EAAc,UAOdC,EAA6B,CACjC,wBAAyBF,EACzB,wBAAyBA,EACzB,sBAAuB,QACzB,EAOMG,EAA0B,CAC9B,iBAAkB,SACpB,EAEA,SAASC,EAAmBC,EAIzB,CACD,MAAO,CACL,KAAM,iDACN,QAAS,GACT,KAAM,SACN,QAAS,CACP,UAAW,oBAAoBA,EAAQ,IAAI,EAAA,EAE7C,aAAc,CACZ,6BAA8BA,EAAQ,sBACtC,gCAAiCA,EAAQ,yBACzC,8BAA+B,SAC/B,4BAA6B,SAC7B,gBAAiBN,EACjB,iBAAkBA,EAClB,MAAOE,EACP,YAAaA,EACb,UAAWD,EACX,wBAAyBA,EACzB,GAAGE,EACH,GAAGC,CAAA,CACL,CAEJ,CAEA,MAAMG,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBVC,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuDb,SAASC,EACdH,EACQ,CACR,KAAM,CACJ,IAAAI,EACA,KAAAC,EACA,sBAAAC,EAAwB,SACxB,yBAAAC,EAA2B,QAAA,EACzBP,EAEJQ,OAAAA,EAAAA,UAAUC,EAAAA,KAAKL,EAAK,YAAY,EAAG,CAAE,UAAW,GAAM,EACtDM,EAAAA,cACED,EAAAA,KAAKL,EAAK,cAAc,EACxB,KAAK,UACHL,EAAmB,CACjB,sBAAAO,EACA,yBAAAC,EACA,KAAAF,CAAA,CACD,EACD,KACA,CAAA,EACE;AAAA,CAAA,EAENK,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,oBAAoB,EAAGH,CAAO,EACtDS,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,wBAAwB,EAAGF,CAAW,EAC9DQ,EAAAA,cAAcD,EAAAA,KAAKL,EAAK,YAAY,EAAG;AAAA,CAAgB,EAEhDA,CACT,CAMO,SAASO,EACdX,EACwB,CACxB,MAAMI,EAAMD,EAAoCH,CAAO,EACjD,CACJ,sBAAAM,EAAwB,SACxB,yBAAAC,EAA2B,QAAA,EACzBP,EAYJ,MAAO,CACL,QAHc,0CAA0CM,CAAqB,kCAAkCC,CAAwB,6CAIvI,KAAMP,EAAQ,KACd,IAAKI,EACL,oBAAqB,CAAC,QAAQ,IAAI,GAClC,QAAS,IAAM,GAAA,CAEnB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { mkdirSync as p, writeFileSync as o } from "node:fs";
|
|
2
2
|
import { join as t } from "node:path";
|
|
3
|
-
const
|
|
4
|
-
"@storybook/addon-docs":
|
|
5
|
-
"@storybook/addon-a11y":
|
|
3
|
+
const c = "^8.0.0", a = "^10.3.3", d = "^19.0.0", m = {
|
|
4
|
+
"@storybook/addon-docs": a,
|
|
5
|
+
"@storybook/addon-a11y": a,
|
|
6
6
|
"storybook-dark-mode": "^5.0.0"
|
|
7
|
-
},
|
|
7
|
+
}, l = {
|
|
8
8
|
"react-markdown": "^10.1.0"
|
|
9
9
|
};
|
|
10
10
|
function u(e) {
|
|
@@ -20,14 +20,14 @@ function u(e) {
|
|
|
20
20
|
"@recursica/storybook-template": e.storybookTemplateVersion,
|
|
21
21
|
"@recursica/official-release": "latest",
|
|
22
22
|
"@recursica/adapter-common": "latest",
|
|
23
|
-
"@mantine/core":
|
|
24
|
-
"@mantine/dates":
|
|
25
|
-
react:
|
|
26
|
-
"react-dom":
|
|
27
|
-
storybook:
|
|
28
|
-
"@storybook/react-vite":
|
|
29
|
-
...
|
|
30
|
-
...
|
|
23
|
+
"@mantine/core": c,
|
|
24
|
+
"@mantine/dates": c,
|
|
25
|
+
react: d,
|
|
26
|
+
"react-dom": d,
|
|
27
|
+
storybook: a,
|
|
28
|
+
"@storybook/react-vite": a,
|
|
29
|
+
...m,
|
|
30
|
+
...l
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
33
|
}
|
|
@@ -106,17 +106,17 @@ export default preview;
|
|
|
106
106
|
function h(e) {
|
|
107
107
|
const {
|
|
108
108
|
dir: r,
|
|
109
|
-
port:
|
|
110
|
-
mantineAdapterVersion:
|
|
111
|
-
storybookTemplateVersion:
|
|
109
|
+
port: s,
|
|
110
|
+
mantineAdapterVersion: i = "latest",
|
|
111
|
+
storybookTemplateVersion: n = "latest"
|
|
112
112
|
} = e;
|
|
113
113
|
return p(t(r, ".storybook"), { recursive: !0 }), o(
|
|
114
114
|
t(r, "package.json"),
|
|
115
115
|
JSON.stringify(
|
|
116
116
|
u({
|
|
117
|
-
mantineAdapterVersion:
|
|
118
|
-
storybookTemplateVersion:
|
|
119
|
-
port:
|
|
117
|
+
mantineAdapterVersion: i,
|
|
118
|
+
storybookTemplateVersion: n,
|
|
119
|
+
port: s
|
|
120
120
|
}),
|
|
121
121
|
null,
|
|
122
122
|
2
|
|
@@ -125,10 +125,13 @@ function h(e) {
|
|
|
125
125
|
), o(t(r, ".storybook/main.ts"), f), o(t(r, ".storybook/preview.tsx"), y), o(t(r, ".gitignore"), `node_modules
|
|
126
126
|
`), r;
|
|
127
127
|
}
|
|
128
|
-
function
|
|
129
|
-
const r = h(e)
|
|
128
|
+
function w(e) {
|
|
129
|
+
const r = h(e), {
|
|
130
|
+
mantineAdapterVersion: s = "latest",
|
|
131
|
+
storybookTemplateVersion: i = "latest"
|
|
132
|
+
} = e;
|
|
130
133
|
return {
|
|
131
|
-
command:
|
|
134
|
+
command: `npm install @recursica/mantine-adapter@${s} @recursica/storybook-template@${i} --no-audit --no-fund && npm run storybook`,
|
|
132
135
|
port: e.port,
|
|
133
136
|
cwd: r,
|
|
134
137
|
reuseExistingServer: !process.env.CI,
|
|
@@ -136,7 +139,7 @@ function k(e) {
|
|
|
136
139
|
};
|
|
137
140
|
}
|
|
138
141
|
export {
|
|
139
|
-
|
|
142
|
+
w as m,
|
|
140
143
|
h as s
|
|
141
144
|
};
|
|
142
|
-
//# sourceMappingURL=mantineSourceOfTruth-
|
|
145
|
+
//# sourceMappingURL=mantineSourceOfTruth-BUkqMNEo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mantineSourceOfTruth-BtZhbJA_.js","sources":["../src/harness/mantineSourceOfTruth.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Generates a small, throwaway Storybook project that installs\n * `@recursica/mantine-adapter` as a real npm dependency (not a workspace\n * link) and boots a real Storybook from its published `src/**\\/*.stories.tsx`\n * files, using `@recursica/storybook-template`'s exported factories.\n *\n * This lets any repo — including ones that never checked out the Recursica\n * monorepo — run adapter-tester's visual regression suite against Mantine\n * (Recursica's source-of-truth adapter) as one side of the comparison, while\n * the other side is that repo's own already-running local Storybook.\n *\n * See PROPOSAL-installed-package-harness.md for the verified prototype this\n * is built from, and the three upstream gaps it works around.\n */\n\nexport interface MantineSourceOfTruthHarnessOptions {\n /**\n * Directory the harness project is scaffolded into. Regenerated on every\n * call — add it to your .gitignore rather than committing it.\n */\n dir: string;\n /** Port the harness's Storybook dev server boots on. */\n port: number;\n /** npm version/range for @recursica/mantine-adapter. Defaults to \"latest\". */\n mantineAdapterVersion?: string;\n /** npm version/range for @recursica/storybook-template. Defaults to \"latest\". */\n storybookTemplateVersion?: string;\n}\n\nexport interface HarnessWebServerConfig {\n command: string;\n port: number;\n cwd: string;\n reuseExistingServer: boolean;\n timeout: number;\n}\n\n// Peer/dev ranges pinned to what @recursica/mantine-adapter and\n// @recursica/storybook-template themselves require, so the harness can't\n// drift onto an incompatible Mantine or Storybook major version.\nconst MANTINE_CORE_RANGE = \"^8.0.0\";\nconst STORYBOOK_RANGE = \"^10.3.3\";\nconst REACT_RANGE = \"^19.0.0\";\n\n// storybook-template's createMainConfig() defaults its addons list to these\n// three but doesn't declare them as peerDependencies (proposal gap 2) — a\n// harness that skips installing any of them gets a silent \"could not\n// resolve addon\" warning at boot, then a hard runtime crash later when Vite\n// pre-bundles preview.tsx's dependency graph. Installed explicitly here.\nconst DEFAULT_ADDON_DEPENDENCIES = {\n \"@storybook/addon-docs\": STORYBOOK_RANGE,\n \"@storybook/addon-a11y\": STORYBOOK_RANGE,\n \"storybook-dark-mode\": \"^5.0.0\",\n};\n\n// mantine-adapter's Introduction.stories.tsx (Version.tsx/OverStyling.tsx)\n// needs react-markdown, but it's a devDependency there — Storybook-only,\n// never bundled into dist — so an external `npm install` of the published\n// package won't pull it in. The harness boots a real Storybook against\n// src/, so it must provide this itself. Installed explicitly here.\nconst WORKAROUND_DEPENDENCIES = {\n \"react-markdown\": \"^10.1.0\",\n};\n\nfunction harnessPackageJson(options: {\n mantineAdapterVersion: string;\n storybookTemplateVersion: string;\n port: number;\n}) {\n return {\n name: \"adapter-tester-mantine-source-of-truth-harness\",\n private: true,\n type: \"module\",\n scripts: {\n storybook: `storybook dev -p ${options.port}`,\n },\n dependencies: {\n \"@recursica/mantine-adapter\": options.mantineAdapterVersion,\n \"@recursica/storybook-template\": options.storybookTemplateVersion,\n \"@recursica/official-release\": \"latest\",\n \"@recursica/adapter-common\": \"latest\",\n \"@mantine/core\": MANTINE_CORE_RANGE,\n \"@mantine/dates\": MANTINE_CORE_RANGE,\n react: REACT_RANGE,\n \"react-dom\": REACT_RANGE,\n storybook: STORYBOOK_RANGE,\n \"@storybook/react-vite\": STORYBOOK_RANGE,\n ...DEFAULT_ADDON_DEPENDENCIES,\n ...WORKAROUND_DEPENDENCIES,\n },\n };\n}\n\nconst MAIN_TS = `import { createMainConfig } from \"@recursica/storybook-template/main\";\n\nconst config = createMainConfig({\n stories: [\n \"../node_modules/@recursica/mantine-adapter/src/**/*.stories.@(js|jsx|mjs|ts|tsx)\",\n ],\n enableCORS: true,\n});\n\n// react-docgen-typescript can't resolve a TS project for a config file living\n// in .storybook/ when the component source it's docgen'ing lives three\n// directories down inside node_modules — it throws \"Cannot read properties\n// of undefined (reading 'fileExists')\", which surfaces as a plain 404 on\n// preview.tsx. Docgen only powers Storybook's Controls/Docs tables, which\n// this harness never renders, so disabling it is a safe workaround (see\n// PROPOSAL-installed-package-harness.md, gap 3).\nconfig.typescript = { ...config.typescript, reactDocgen: false };\n\nexport default config;\n`;\n\nconst PREVIEW_TSX = `import type { Preview } from \"@storybook/react-vite\";\nimport { createPreviewConfig } from \"@recursica/storybook-template/preview\";\nimport { MantineProvider } from \"@mantine/core\";\nimport { Layer } from \"@recursica/adapter-common\";\nimport \"@mantine/core/styles.css\";\nimport \"@mantine/dates/styles.css\";\nimport \"@recursica/adapter-common/style.css\";\nimport \"@recursica/official-release/recursica_variables_scoped.css\";\nimport recursicaTokens from \"@recursica/official-release/recursica_tokens.json\";\nimport recursicaBrand from \"@recursica/official-release/recursica_brand.json\";\nimport recursicaUIKit from \"@recursica/official-release/recursica_ui-kit.json\";\n\nconst basePreview = createPreviewConfig({\n defaultTheme: \"light\",\n recursicaTokensJsonPath: recursicaTokens,\n recursicaBrandJsonPath: recursicaBrand,\n recursicaUIKitJsonPath: recursicaUIKit,\n});\n\n// Mirrors mantine-adapter's own .storybook/preview.tsx decorator (every story defaults to\n// withLayer: true, layer: 0, wrapped with 48px padding) — every real adapter's own preview.tsx\n// applies this same wrapping, so a target adapter's story renders inside the same Layer\n// chrome/padding the source-of-truth side does. Without this, target screenshots come out\n// dramatically smaller/differently-positioned than the source of truth's (no Layer padding,\n// background, or border-radius at all), which alone can blow past the pixel-diff threshold\n// regardless of whether the actual Recursica tokens match — a false positive, not a real\n// component bug. ColorSchemeWrapper (mantine-adapter's dark-mode-toggle sync helper) is\n// intentionally not replicated — it only matters for the interactive dev-mode UI, not automated\n// screenshot diffing, which always runs in a single theme.\nconst preview: Preview = {\n ...basePreview,\n decorators: [\n (Story, context) => {\n const { withLayer = true, layer = 0 } = context.args;\n const content = <Story />;\n return (\n <MantineProvider>\n {withLayer ? (\n <Layer layer={layer as 0 | 1 | 2 | 3} style={{ padding: \"48px\" }}>\n {content}\n </Layer>\n ) : (\n content\n )}\n </MantineProvider>\n );\n },\n ...(basePreview.decorators || []),\n ],\n};\n\nexport default preview;\n`;\n\n/** Writes the harness project's files to `options.dir` without booting it. */\nexport function scaffoldMantineSourceOfTruthHarness(\n options: MantineSourceOfTruthHarnessOptions,\n): string {\n const {\n dir,\n port,\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n mkdirSync(join(dir, \".storybook\"), { recursive: true });\n writeFileSync(\n join(dir, \"package.json\"),\n JSON.stringify(\n harnessPackageJson({\n mantineAdapterVersion,\n storybookTemplateVersion,\n port,\n }),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(join(dir, \".storybook/main.ts\"), MAIN_TS);\n writeFileSync(join(dir, \".storybook/preview.tsx\"), PREVIEW_TSX);\n writeFileSync(join(dir, \".gitignore\"), \"node_modules\\n\");\n\n return dir;\n}\n\n/**\n * Scaffolds the harness and returns a Playwright `webServer` entry for it.\n * Spread the result directly into `playwright.config.ts`'s `webServer` array.\n */\nexport function mantineSourceOfTruthWebServer(\n options: MantineSourceOfTruthHarnessOptions,\n): HarnessWebServerConfig {\n const dir = scaffoldMantineSourceOfTruthHarness(options);\n return {\n command: \"npm install --no-audit --no-fund && npm run storybook\",\n port: options.port,\n cwd: dir,\n reuseExistingServer: !process.env.CI,\n timeout: 180 * 1000,\n };\n}\n"],"names":["MANTINE_CORE_RANGE","STORYBOOK_RANGE","REACT_RANGE","DEFAULT_ADDON_DEPENDENCIES","WORKAROUND_DEPENDENCIES","harnessPackageJson","options","MAIN_TS","PREVIEW_TSX","scaffoldMantineSourceOfTruthHarness","dir","port","mantineAdapterVersion","storybookTemplateVersion","mkdirSync","join","writeFileSync","mantineSourceOfTruthWebServer"],"mappings":";;AA2CA,MAAMA,IAAqB,UACrBC,IAAkB,WAClBC,IAAc,WAOdC,IAA6B;AAAA,EACjC,yBAAyBF;AAAA,EACzB,yBAAyBA;AAAA,EACzB,uBAAuB;AACzB,GAOMG,IAA0B;AAAA,EAC9B,kBAAkB;AACpB;AAEA,SAASC,EAAmBC,GAIzB;AACD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,WAAW,oBAAoBA,EAAQ,IAAI;AAAA,IAAA;AAAA,IAE7C,cAAc;AAAA,MACZ,8BAA8BA,EAAQ;AAAA,MACtC,iCAAiCA,EAAQ;AAAA,MACzC,+BAA+B;AAAA,MAC/B,6BAA6B;AAAA,MAC7B,iBAAiBN;AAAA,MACjB,kBAAkBA;AAAA,MAClB,OAAOE;AAAA,MACP,aAAaA;AAAA,MACb,WAAWD;AAAA,MACX,yBAAyBA;AAAA,MACzB,GAAGE;AAAA,MACH,GAAGC;AAAA,IAAA;AAAA,EACL;AAEJ;AAEA,MAAMG,IAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBVC,IAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDb,SAASC,EACdH,GACQ;AACR,QAAM;AAAA,IACJ,KAAAI;AAAA,IACA,MAAAC;AAAA,IACA,uBAAAC,IAAwB;AAAA,IACxB,0BAAAC,IAA2B;AAAA,EAAA,IACzBP;AAEJ,SAAAQ,EAAUC,EAAKL,GAAK,YAAY,GAAG,EAAE,WAAW,IAAM,GACtDM;AAAA,IACED,EAAKL,GAAK,cAAc;AAAA,IACxB,KAAK;AAAA,MACHL,EAAmB;AAAA,QACjB,uBAAAO;AAAA,QACA,0BAAAC;AAAA,QACA,MAAAF;AAAA,MAAA,CACD;AAAA,MACD;AAAA,MACA;AAAA,IAAA,IACE;AAAA;AAAA,EAAA,GAENK,EAAcD,EAAKL,GAAK,oBAAoB,GAAGH,CAAO,GACtDS,EAAcD,EAAKL,GAAK,wBAAwB,GAAGF,CAAW,GAC9DQ,EAAcD,EAAKL,GAAK,YAAY,GAAG;AAAA,CAAgB,GAEhDA;AACT;AAMO,SAASO,EACdX,GACwB;AACxB,QAAMI,IAAMD,EAAoCH,CAAO;AACvD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAMA,EAAQ;AAAA,IACd,KAAKI;AAAA,IACL,qBAAqB,CAAC,QAAQ,IAAI;AAAA,IAClC,SAAS,MAAM;AAAA,EAAA;AAEnB;"}
|
|
1
|
+
{"version":3,"file":"mantineSourceOfTruth-BUkqMNEo.js","sources":["../src/harness/mantineSourceOfTruth.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Generates a small, throwaway Storybook project that installs\n * `@recursica/mantine-adapter` as a real npm dependency (not a workspace\n * link) and boots a real Storybook from its published `src/**\\/*.stories.tsx`\n * files, using `@recursica/storybook-template`'s exported factories.\n *\n * This lets any repo — including ones that never checked out the Recursica\n * monorepo — run adapter-tester's visual regression suite against Mantine\n * (Recursica's source-of-truth adapter) as one side of the comparison, while\n * the other side is that repo's own already-running local Storybook.\n *\n * See PROPOSAL-installed-package-harness.md for the verified prototype this\n * is built from, and the three upstream gaps it works around.\n */\n\nexport interface MantineSourceOfTruthHarnessOptions {\n /**\n * Directory the harness project is scaffolded into. Regenerated on every\n * call — add it to your .gitignore rather than committing it.\n */\n dir: string;\n /** Port the harness's Storybook dev server boots on. */\n port: number;\n /** npm version/range for @recursica/mantine-adapter. Defaults to \"latest\". */\n mantineAdapterVersion?: string;\n /** npm version/range for @recursica/storybook-template. Defaults to \"latest\". */\n storybookTemplateVersion?: string;\n}\n\nexport interface HarnessWebServerConfig {\n command: string;\n port: number;\n cwd: string;\n reuseExistingServer: boolean;\n timeout: number;\n}\n\n// Peer/dev ranges pinned to what @recursica/mantine-adapter and\n// @recursica/storybook-template themselves require, so the harness can't\n// drift onto an incompatible Mantine or Storybook major version.\nconst MANTINE_CORE_RANGE = \"^8.0.0\";\nconst STORYBOOK_RANGE = \"^10.3.3\";\nconst REACT_RANGE = \"^19.0.0\";\n\n// storybook-template's createMainConfig() defaults its addons list to these\n// three but doesn't declare them as peerDependencies (proposal gap 2) — a\n// harness that skips installing any of them gets a silent \"could not\n// resolve addon\" warning at boot, then a hard runtime crash later when Vite\n// pre-bundles preview.tsx's dependency graph. Installed explicitly here.\nconst DEFAULT_ADDON_DEPENDENCIES = {\n \"@storybook/addon-docs\": STORYBOOK_RANGE,\n \"@storybook/addon-a11y\": STORYBOOK_RANGE,\n \"storybook-dark-mode\": \"^5.0.0\",\n};\n\n// mantine-adapter's Introduction.stories.tsx (Version.tsx/OverStyling.tsx)\n// needs react-markdown, but it's a devDependency there — Storybook-only,\n// never bundled into dist — so an external `npm install` of the published\n// package won't pull it in. The harness boots a real Storybook against\n// src/, so it must provide this itself. Installed explicitly here.\nconst WORKAROUND_DEPENDENCIES = {\n \"react-markdown\": \"^10.1.0\",\n};\n\nfunction harnessPackageJson(options: {\n mantineAdapterVersion: string;\n storybookTemplateVersion: string;\n port: number;\n}) {\n return {\n name: \"adapter-tester-mantine-source-of-truth-harness\",\n private: true,\n type: \"module\",\n scripts: {\n storybook: `storybook dev -p ${options.port}`,\n },\n dependencies: {\n \"@recursica/mantine-adapter\": options.mantineAdapterVersion,\n \"@recursica/storybook-template\": options.storybookTemplateVersion,\n \"@recursica/official-release\": \"latest\",\n \"@recursica/adapter-common\": \"latest\",\n \"@mantine/core\": MANTINE_CORE_RANGE,\n \"@mantine/dates\": MANTINE_CORE_RANGE,\n react: REACT_RANGE,\n \"react-dom\": REACT_RANGE,\n storybook: STORYBOOK_RANGE,\n \"@storybook/react-vite\": STORYBOOK_RANGE,\n ...DEFAULT_ADDON_DEPENDENCIES,\n ...WORKAROUND_DEPENDENCIES,\n },\n };\n}\n\nconst MAIN_TS = `import { createMainConfig } from \"@recursica/storybook-template/main\";\n\nconst config = createMainConfig({\n stories: [\n \"../node_modules/@recursica/mantine-adapter/src/**/*.stories.@(js|jsx|mjs|ts|tsx)\",\n ],\n enableCORS: true,\n});\n\n// react-docgen-typescript can't resolve a TS project for a config file living\n// in .storybook/ when the component source it's docgen'ing lives three\n// directories down inside node_modules — it throws \"Cannot read properties\n// of undefined (reading 'fileExists')\", which surfaces as a plain 404 on\n// preview.tsx. Docgen only powers Storybook's Controls/Docs tables, which\n// this harness never renders, so disabling it is a safe workaround (see\n// PROPOSAL-installed-package-harness.md, gap 3).\nconfig.typescript = { ...config.typescript, reactDocgen: false };\n\nexport default config;\n`;\n\nconst PREVIEW_TSX = `import type { Preview } from \"@storybook/react-vite\";\nimport { createPreviewConfig } from \"@recursica/storybook-template/preview\";\nimport { MantineProvider } from \"@mantine/core\";\nimport { Layer } from \"@recursica/adapter-common\";\nimport \"@mantine/core/styles.css\";\nimport \"@mantine/dates/styles.css\";\nimport \"@recursica/adapter-common/style.css\";\nimport \"@recursica/official-release/recursica_variables_scoped.css\";\nimport recursicaTokens from \"@recursica/official-release/recursica_tokens.json\";\nimport recursicaBrand from \"@recursica/official-release/recursica_brand.json\";\nimport recursicaUIKit from \"@recursica/official-release/recursica_ui-kit.json\";\n\nconst basePreview = createPreviewConfig({\n defaultTheme: \"light\",\n recursicaTokensJsonPath: recursicaTokens,\n recursicaBrandJsonPath: recursicaBrand,\n recursicaUIKitJsonPath: recursicaUIKit,\n});\n\n// Mirrors mantine-adapter's own .storybook/preview.tsx decorator (every story defaults to\n// withLayer: true, layer: 0, wrapped with 48px padding) — every real adapter's own preview.tsx\n// applies this same wrapping, so a target adapter's story renders inside the same Layer\n// chrome/padding the source-of-truth side does. Without this, target screenshots come out\n// dramatically smaller/differently-positioned than the source of truth's (no Layer padding,\n// background, or border-radius at all), which alone can blow past the pixel-diff threshold\n// regardless of whether the actual Recursica tokens match — a false positive, not a real\n// component bug. ColorSchemeWrapper (mantine-adapter's dark-mode-toggle sync helper) is\n// intentionally not replicated — it only matters for the interactive dev-mode UI, not automated\n// screenshot diffing, which always runs in a single theme.\nconst preview: Preview = {\n ...basePreview,\n decorators: [\n (Story, context) => {\n const { withLayer = true, layer = 0 } = context.args;\n const content = <Story />;\n return (\n <MantineProvider>\n {withLayer ? (\n <Layer layer={layer as 0 | 1 | 2 | 3} style={{ padding: \"48px\" }}>\n {content}\n </Layer>\n ) : (\n content\n )}\n </MantineProvider>\n );\n },\n ...(basePreview.decorators || []),\n ],\n};\n\nexport default preview;\n`;\n\n/** Writes the harness project's files to `options.dir` without booting it. */\nexport function scaffoldMantineSourceOfTruthHarness(\n options: MantineSourceOfTruthHarnessOptions,\n): string {\n const {\n dir,\n port,\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n mkdirSync(join(dir, \".storybook\"), { recursive: true });\n writeFileSync(\n join(dir, \"package.json\"),\n JSON.stringify(\n harnessPackageJson({\n mantineAdapterVersion,\n storybookTemplateVersion,\n port,\n }),\n null,\n 2,\n ) + \"\\n\",\n );\n writeFileSync(join(dir, \".storybook/main.ts\"), MAIN_TS);\n writeFileSync(join(dir, \".storybook/preview.tsx\"), PREVIEW_TSX);\n writeFileSync(join(dir, \".gitignore\"), \"node_modules\\n\");\n\n return dir;\n}\n\n/**\n * Scaffolds the harness and returns a Playwright `webServer` entry for it.\n * Spread the result directly into `playwright.config.ts`'s `webServer` array.\n */\nexport function mantineSourceOfTruthWebServer(\n options: MantineSourceOfTruthHarnessOptions,\n): HarnessWebServerConfig {\n const dir = scaffoldMantineSourceOfTruthHarness(options);\n const {\n mantineAdapterVersion = \"latest\",\n storybookTemplateVersion = \"latest\",\n } = options;\n\n // A bare `npm install` is satisfied by a package-lock.json already sitting\n // in `dir` from a prior run and skips re-resolving against the registry\n // entirely — no network call — so a run can silently keep testing against\n // a stale @recursica/mantine-adapter/storybook-template even after a newer\n // version is published. Naming the two version-pinned packages as explicit\n // `pkg@specifier` CLI args instead forces npm to re-check just those two\n // against the registry every run, while the rest of node_modules stays\n // cached.\n const command = `npm install @recursica/mantine-adapter@${mantineAdapterVersion} @recursica/storybook-template@${storybookTemplateVersion} --no-audit --no-fund && npm run storybook`;\n\n return {\n command,\n port: options.port,\n cwd: dir,\n reuseExistingServer: !process.env.CI,\n timeout: 180 * 1000,\n };\n}\n"],"names":["MANTINE_CORE_RANGE","STORYBOOK_RANGE","REACT_RANGE","DEFAULT_ADDON_DEPENDENCIES","WORKAROUND_DEPENDENCIES","harnessPackageJson","options","MAIN_TS","PREVIEW_TSX","scaffoldMantineSourceOfTruthHarness","dir","port","mantineAdapterVersion","storybookTemplateVersion","mkdirSync","join","writeFileSync","mantineSourceOfTruthWebServer"],"mappings":";;AA2CA,MAAMA,IAAqB,UACrBC,IAAkB,WAClBC,IAAc,WAOdC,IAA6B;AAAA,EACjC,yBAAyBF;AAAA,EACzB,yBAAyBA;AAAA,EACzB,uBAAuB;AACzB,GAOMG,IAA0B;AAAA,EAC9B,kBAAkB;AACpB;AAEA,SAASC,EAAmBC,GAIzB;AACD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP,WAAW,oBAAoBA,EAAQ,IAAI;AAAA,IAAA;AAAA,IAE7C,cAAc;AAAA,MACZ,8BAA8BA,EAAQ;AAAA,MACtC,iCAAiCA,EAAQ;AAAA,MACzC,+BAA+B;AAAA,MAC/B,6BAA6B;AAAA,MAC7B,iBAAiBN;AAAA,MACjB,kBAAkBA;AAAA,MAClB,OAAOE;AAAA,MACP,aAAaA;AAAA,MACb,WAAWD;AAAA,MACX,yBAAyBA;AAAA,MACzB,GAAGE;AAAA,MACH,GAAGC;AAAA,IAAA;AAAA,EACL;AAEJ;AAEA,MAAMG,IAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqBVC,IAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDb,SAASC,EACdH,GACQ;AACR,QAAM;AAAA,IACJ,KAAAI;AAAA,IACA,MAAAC;AAAA,IACA,uBAAAC,IAAwB;AAAA,IACxB,0BAAAC,IAA2B;AAAA,EAAA,IACzBP;AAEJ,SAAAQ,EAAUC,EAAKL,GAAK,YAAY,GAAG,EAAE,WAAW,IAAM,GACtDM;AAAA,IACED,EAAKL,GAAK,cAAc;AAAA,IACxB,KAAK;AAAA,MACHL,EAAmB;AAAA,QACjB,uBAAAO;AAAA,QACA,0BAAAC;AAAA,QACA,MAAAF;AAAA,MAAA,CACD;AAAA,MACD;AAAA,MACA;AAAA,IAAA,IACE;AAAA;AAAA,EAAA,GAENK,EAAcD,EAAKL,GAAK,oBAAoB,GAAGH,CAAO,GACtDS,EAAcD,EAAKL,GAAK,wBAAwB,GAAGF,CAAW,GAC9DQ,EAAcD,EAAKL,GAAK,YAAY,GAAG;AAAA,CAAgB,GAEhDA;AACT;AAMO,SAASO,EACdX,GACwB;AACxB,QAAMI,IAAMD,EAAoCH,CAAO,GACjD;AAAA,IACJ,uBAAAM,IAAwB;AAAA,IACxB,0BAAAC,IAA2B;AAAA,EAAA,IACzBP;AAYJ,SAAO;AAAA,IACL,SAHc,0CAA0CM,CAAqB,kCAAkCC,CAAwB;AAAA,IAIvI,MAAMP,EAAQ;AAAA,IACd,KAAKI;AAAA,IACL,qBAAqB,CAAC,QAAQ,IAAI;AAAA,IAClC,SAAS,MAAM;AAAA,EAAA;AAEnB;"}
|
package/package.json
CHANGED
package/public/index.html
CHANGED
|
@@ -165,11 +165,11 @@
|
|
|
165
165
|
<body>
|
|
166
166
|
<div class="pane" id="leftPane">
|
|
167
167
|
<div class="header">
|
|
168
|
-
<span id="
|
|
169
|
-
<span class="status connected" id="
|
|
168
|
+
<span id="ownLabel">Target</span>
|
|
169
|
+
<span class="status connected" id="ownStatus">Connected & Syncing</span>
|
|
170
170
|
</div>
|
|
171
|
-
<!-- Load
|
|
172
|
-
<iframe id="
|
|
171
|
+
<!-- Load this project's own Storybook via the SAME ORIGIN proxy -->
|
|
172
|
+
<iframe id="own" src="/?path=/story/ui-kit-slider--default"></iframe>
|
|
173
173
|
</div>
|
|
174
174
|
|
|
175
175
|
<div class="divider" id="vDivider"></div>
|
|
@@ -177,13 +177,13 @@
|
|
|
177
177
|
<div class="pane" id="rightPane">
|
|
178
178
|
<div class="right-top" id="rightTop">
|
|
179
179
|
<div class="header">
|
|
180
|
-
<span id="
|
|
181
|
-
<span class="status connected" id="
|
|
180
|
+
<span id="sourceOfTruthLabel">Source of Truth</span>
|
|
181
|
+
<span class="status connected" id="sourceOfTruthStatus">Ready</span>
|
|
182
182
|
</div>
|
|
183
|
-
<!-- Spacer to align the view with the
|
|
183
|
+
<!-- Spacer to align the view with the own Storybook's header (40px) -->
|
|
184
184
|
<div style="height: 40px; flex: 0 0 40px; background-color: #fff; border-bottom: 1px solid #e6e6e6; box-sizing: border-box;"></div>
|
|
185
|
-
<!-- Load the bare
|
|
186
|
-
<iframe id="
|
|
185
|
+
<!-- Load the bare source-of-truth component preview -->
|
|
186
|
+
<iframe id="sourceOfTruth" src=""></iframe>
|
|
187
187
|
</div>
|
|
188
188
|
|
|
189
189
|
<div class="h-divider" id="hDivider"></div>
|
|
@@ -214,13 +214,13 @@
|
|
|
214
214
|
|
|
215
215
|
<script>
|
|
216
216
|
// Injected by the dev server — see src/devServer.ts.
|
|
217
|
-
const devConfig = window.__ADAPTER_TESTER__ || { sourceOfTruthName: 'Source of Truth',
|
|
217
|
+
const devConfig = window.__ADAPTER_TESTER__ || { ownName: 'Target', sourceOfTruthName: 'Source of Truth', sourceOfTruthPort: 6011 };
|
|
218
|
+
document.getElementById('ownLabel').textContent = devConfig.ownName;
|
|
218
219
|
document.getElementById('sourceOfTruthLabel').textContent = `${devConfig.sourceOfTruthName} (Source of Truth)`;
|
|
219
|
-
document.getElementById('targetLabel').textContent = devConfig.targetName;
|
|
220
220
|
|
|
221
|
-
const
|
|
222
|
-
const
|
|
223
|
-
const
|
|
221
|
+
const ownIframe = document.getElementById('own');
|
|
222
|
+
const sourceOfTruthIframe = document.getElementById('sourceOfTruth');
|
|
223
|
+
const sourceOfTruthStatus = document.getElementById('sourceOfTruthStatus');
|
|
224
224
|
|
|
225
225
|
// Sync initial iframe sources with outer URL if params exist, else fall
|
|
226
226
|
// back to a sensible default story so both panes load something on open.
|
|
@@ -228,17 +228,17 @@
|
|
|
228
228
|
const initialId = outerParams.get('id') || 'ui-kit-slider--default';
|
|
229
229
|
const initialArgs = outerParams.get('args');
|
|
230
230
|
|
|
231
|
-
let
|
|
231
|
+
let ownSrc = `/?path=/story/${initialId}`;
|
|
232
232
|
if (initialArgs) {
|
|
233
|
-
|
|
233
|
+
ownSrc += `&args=${initialArgs}`;
|
|
234
234
|
}
|
|
235
|
-
|
|
235
|
+
ownIframe.src = ownSrc;
|
|
236
236
|
|
|
237
|
-
let
|
|
237
|
+
let sotSrc = `http://localhost:${devConfig.sourceOfTruthPort}/iframe.html?id=${initialId}&viewMode=story`;
|
|
238
238
|
if (initialArgs) {
|
|
239
|
-
|
|
239
|
+
sotSrc += `&args=${initialArgs}`;
|
|
240
240
|
}
|
|
241
|
-
|
|
241
|
+
sourceOfTruthIframe.src = sotSrc;
|
|
242
242
|
|
|
243
243
|
// Resizers
|
|
244
244
|
const vDivider = document.getElementById('vDivider');
|
|
@@ -263,8 +263,8 @@
|
|
|
263
263
|
vDivider.addEventListener('mousedown', (e) => {
|
|
264
264
|
isVResizing = true;
|
|
265
265
|
document.body.style.cursor = 'col-resize';
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
ownIframe.style.pointerEvents = 'none';
|
|
267
|
+
sourceOfTruthIframe.style.pointerEvents = 'none';
|
|
268
268
|
});
|
|
269
269
|
|
|
270
270
|
document.addEventListener('mousemove', (e) => {
|
|
@@ -288,8 +288,8 @@
|
|
|
288
288
|
isVResizing = false;
|
|
289
289
|
isHResizing = false;
|
|
290
290
|
document.body.style.cursor = 'default';
|
|
291
|
-
|
|
292
|
-
|
|
291
|
+
ownIframe.style.pointerEvents = 'auto';
|
|
292
|
+
sourceOfTruthIframe.style.pointerEvents = 'auto';
|
|
293
293
|
}
|
|
294
294
|
});
|
|
295
295
|
|
|
@@ -298,8 +298,8 @@
|
|
|
298
298
|
hDivider.addEventListener('mousedown', (e) => {
|
|
299
299
|
isHResizing = true;
|
|
300
300
|
document.body.style.cursor = 'row-resize';
|
|
301
|
-
|
|
302
|
-
|
|
301
|
+
ownIframe.style.pointerEvents = 'none';
|
|
302
|
+
sourceOfTruthIframe.style.pointerEvents = 'none';
|
|
303
303
|
});
|
|
304
304
|
|
|
305
305
|
// Auto-save notes logic
|
|
@@ -406,7 +406,7 @@
|
|
|
406
406
|
let lastUrl = '';
|
|
407
407
|
setInterval(() => {
|
|
408
408
|
try {
|
|
409
|
-
const currentUrl =
|
|
409
|
+
const currentUrl = ownIframe.contentWindow.location.href;
|
|
410
410
|
|
|
411
411
|
if (currentUrl && currentUrl !== lastUrl && currentUrl !== 'about:blank') {
|
|
412
412
|
lastUrl = currentUrl;
|
|
@@ -440,19 +440,19 @@
|
|
|
440
440
|
window.history.replaceState({}, '', outerUrl.pathname + outerUrl.search);
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
let
|
|
443
|
+
let sotUrl = `http://localhost:${devConfig.sourceOfTruthPort}/iframe.html?id=${id}&viewMode=story`;
|
|
444
444
|
if (args) {
|
|
445
|
-
|
|
445
|
+
sotUrl += `&args=${args}`;
|
|
446
446
|
}
|
|
447
|
-
|
|
448
|
-
if (
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
447
|
+
|
|
448
|
+
if (sourceOfTruthIframe.src !== sotUrl) {
|
|
449
|
+
sourceOfTruthStatus.textContent = 'Updating...';
|
|
450
|
+
sourceOfTruthStatus.classList.remove('connected');
|
|
451
|
+
sourceOfTruthIframe.src = sotUrl;
|
|
452
|
+
|
|
453
453
|
setTimeout(() => {
|
|
454
|
-
|
|
455
|
-
|
|
454
|
+
sourceOfTruthStatus.textContent = 'Synced';
|
|
455
|
+
sourceOfTruthStatus.classList.add('connected');
|
|
456
456
|
}, 500);
|
|
457
457
|
}
|
|
458
458
|
}
|