@tappify/extension-sdk 2.1.0-beta.3 → 2.1.0-beta.4
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/dist/{chunk-QQSCA6CC.mjs → chunk-6FASZFC4.mjs} +2 -2
- package/dist/{chunk-SALMPL5V.cjs → chunk-6MP5DKLZ.cjs} +20 -20
- package/dist/{chunk-SALMPL5V.cjs.map → chunk-6MP5DKLZ.cjs.map} +1 -1
- package/dist/{chunk-BPCGXXMD.cjs → chunk-AYYJCRS4.cjs} +10 -10
- package/dist/{chunk-BPCGXXMD.cjs.map → chunk-AYYJCRS4.cjs.map} +1 -1
- package/dist/{chunk-KZ5NGFUP.mjs → chunk-CEFLOQD4.mjs} +2 -2
- package/dist/{chunk-7YKH4LZN.cjs → chunk-EV3KKP62.cjs} +17 -6
- package/dist/chunk-EV3KKP62.cjs.map +1 -0
- package/dist/{chunk-SGCYEEXD.mjs → chunk-IHLK4I7J.mjs} +17 -6
- package/dist/chunk-IHLK4I7J.mjs.map +1 -0
- package/dist/{chunk-A74HCO6T.cjs → chunk-TEIGGORZ.cjs} +3 -3
- package/dist/{chunk-A74HCO6T.cjs.map → chunk-TEIGGORZ.cjs.map} +1 -1
- package/dist/{chunk-SWG7CNTZ.mjs → chunk-WW2D3N2T.mjs} +3 -3
- package/dist/{client-DE-vMgdO.d.cts → client-BLnec4SD.d.cts} +1 -1
- package/dist/{client-BO3kavn0.d.ts → client-BRxKTo-L.d.ts} +1 -1
- package/dist/codegen.d.cts +14 -5
- package/dist/codegen.d.ts +14 -5
- package/dist/{constants-Bh759FUI.d.cts → constants-CvHbO3ia.d.cts} +14 -5
- package/dist/{constants-Bh759FUI.d.ts → constants-CvHbO3ia.d.ts} +14 -5
- package/dist/{context-mr8R5CNt.d.ts → context-BjhW0QWy.d.ts} +1 -1
- package/dist/{context-DI0EJCRD.d.cts → context-CsviWecX.d.cts} +1 -1
- package/dist/host.d.cts +4 -4
- package/dist/host.d.ts +4 -4
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/manifest.cjs +16 -16
- package/dist/manifest.d.cts +10 -4
- package/dist/manifest.d.ts +10 -4
- package/dist/manifest.mjs +1 -1
- package/dist/server.cjs +8 -8
- package/dist/server.d.cts +5 -5
- package/dist/server.d.ts +5 -5
- package/dist/server.mjs +3 -3
- package/dist/testing/index.cjs +8 -8
- package/dist/testing/index.d.cts +3 -3
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.mjs +4 -4
- package/dist/{types-BdDaLnqs.d.cts → types-C5k8VwaA.d.cts} +1 -1
- package/dist/{types-uGHrRaOj.d.ts → types-DBpDxGlT.d.ts} +1 -1
- package/dist/ui.d.cts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/vite-preview-bootstrap.d.cts +2 -2
- package/dist/vite-preview-bootstrap.d.ts +2 -2
- package/dist/vite-preview.cjs +7 -7
- package/dist/vite-preview.cjs.map +1 -1
- package/dist/vite-preview.d.cts +3 -3
- package/dist/vite-preview.d.ts +3 -3
- package/dist/vite-preview.mjs +4 -4
- package/dist/vite-preview.mjs.map +1 -1
- package/dist/vite.cjs +16 -5
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.d.cts +14 -5
- package/dist/vite.d.ts +14 -5
- package/dist/vite.mjs +16 -5
- package/dist/vite.mjs.map +1 -1
- package/dist/{work-events-C5n497rx.d.ts → work-events-BYU25wmX.d.ts} +2 -2
- package/dist/{work-events-DSklu4t-.d.cts → work-events-CxFu-YZE.d.cts} +2 -2
- package/package.json +1 -1
- package/schema/extension-v2.json +75 -330
- package/dist/chunk-7YKH4LZN.cjs.map +0 -1
- package/dist/chunk-SGCYEEXD.mjs.map +0 -1
- /package/dist/{chunk-QQSCA6CC.mjs.map → chunk-6FASZFC4.mjs.map} +0 -0
- /package/dist/{chunk-KZ5NGFUP.mjs.map → chunk-CEFLOQD4.mjs.map} +0 -0
- /package/dist/{chunk-SWG7CNTZ.mjs.map → chunk-WW2D3N2T.mjs.map} +0 -0
package/dist/testing/index.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { JSONWebKeySet } from 'jose';
|
|
2
|
-
import { a as TapFilters, N as TapProjectResult, o as TapApp, Q as TapRelease, D as TapKeyword, F as TapListing, U as TapReviewsResult, v as TapCrashesResult, R as TapRevenueResult, W as TapSeriesMetric, Y as TapSeriesResult, d as TapQuery, e as TapResult, b as TapSize, T as Tap, a6 as TapToastTone, t as TapConfirmOptions, q as TapChatCard, c as TapHostEvents } from '../types-
|
|
3
|
-
import { k as TappifyHealth, b as MetricsInput, c as MetricsResponse, M as MentionItems, C as ContextBlock, _ as WorkOperationMap, l as TappifyInstall, j as TappifyHandlerOptions, a as TappifyClaims, T as TappifyFetchHandler, B as WorkEvent, S as SendWorkEventOptions, F as WorkHydratedCommentCreatedEvent, I as WorkHydratedItemDeletedEvent, J as WorkHydratedStatusChangedEvent } from '../work-events-
|
|
2
|
+
import { a as TapFilters, N as TapProjectResult, o as TapApp, Q as TapRelease, D as TapKeyword, F as TapListing, U as TapReviewsResult, v as TapCrashesResult, R as TapRevenueResult, W as TapSeriesMetric, Y as TapSeriesResult, d as TapQuery, e as TapResult, b as TapSize, T as Tap, a6 as TapToastTone, t as TapConfirmOptions, q as TapChatCard, c as TapHostEvents } from '../types-C5k8VwaA.cjs';
|
|
3
|
+
import { k as TappifyHealth, b as MetricsInput, c as MetricsResponse, M as MentionItems, C as ContextBlock, _ as WorkOperationMap, l as TappifyInstall, j as TappifyHandlerOptions, a as TappifyClaims, T as TappifyFetchHandler, B as WorkEvent, S as SendWorkEventOptions, F as WorkHydratedCommentCreatedEvent, I as WorkHydratedItemDeletedEvent, J as WorkHydratedStatusChangedEvent } from '../work-events-CxFu-YZE.cjs';
|
|
4
4
|
export { M as MatcherResult, a as MatcherTarget, r as registerTapMatchers, t as tapMatchers } from '../matchers-Cz93AK1n.cjs';
|
|
5
|
-
import { S as ScopeKey, x as MetricDeclaration, a5 as ToolDeclaration } from '../constants-
|
|
5
|
+
import { S as ScopeKey, x as MetricDeclaration, a5 as ToolDeclaration } from '../constants-CvHbO3ia.cjs';
|
|
6
6
|
import { QueryClient } from '@tanstack/react-query';
|
|
7
7
|
import { RenderOptions, RenderResult } from '@testing-library/react';
|
|
8
8
|
import { ReactElement } from 'react';
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { JSONWebKeySet } from 'jose';
|
|
2
|
-
import { a as TapFilters, N as TapProjectResult, o as TapApp, Q as TapRelease, D as TapKeyword, F as TapListing, U as TapReviewsResult, v as TapCrashesResult, R as TapRevenueResult, W as TapSeriesMetric, Y as TapSeriesResult, d as TapQuery, e as TapResult, b as TapSize, T as Tap, a6 as TapToastTone, t as TapConfirmOptions, q as TapChatCard, c as TapHostEvents } from '../types-
|
|
3
|
-
import { k as TappifyHealth, b as MetricsInput, c as MetricsResponse, M as MentionItems, C as ContextBlock, _ as WorkOperationMap, l as TappifyInstall, j as TappifyHandlerOptions, a as TappifyClaims, T as TappifyFetchHandler, B as WorkEvent, S as SendWorkEventOptions, F as WorkHydratedCommentCreatedEvent, I as WorkHydratedItemDeletedEvent, J as WorkHydratedStatusChangedEvent } from '../work-events-
|
|
2
|
+
import { a as TapFilters, N as TapProjectResult, o as TapApp, Q as TapRelease, D as TapKeyword, F as TapListing, U as TapReviewsResult, v as TapCrashesResult, R as TapRevenueResult, W as TapSeriesMetric, Y as TapSeriesResult, d as TapQuery, e as TapResult, b as TapSize, T as Tap, a6 as TapToastTone, t as TapConfirmOptions, q as TapChatCard, c as TapHostEvents } from '../types-DBpDxGlT.js';
|
|
3
|
+
import { k as TappifyHealth, b as MetricsInput, c as MetricsResponse, M as MentionItems, C as ContextBlock, _ as WorkOperationMap, l as TappifyInstall, j as TappifyHandlerOptions, a as TappifyClaims, T as TappifyFetchHandler, B as WorkEvent, S as SendWorkEventOptions, F as WorkHydratedCommentCreatedEvent, I as WorkHydratedItemDeletedEvent, J as WorkHydratedStatusChangedEvent } from '../work-events-BYU25wmX.js';
|
|
4
4
|
export { M as MatcherResult, a as MatcherTarget, r as registerTapMatchers, t as tapMatchers } from '../matchers-Cz93AK1n.js';
|
|
5
|
-
import { S as ScopeKey, x as MetricDeclaration, a5 as ToolDeclaration } from '../constants-
|
|
5
|
+
import { S as ScopeKey, x as MetricDeclaration, a5 as ToolDeclaration } from '../constants-CvHbO3ia.js';
|
|
6
6
|
import { QueryClient } from '@tanstack/react-query';
|
|
7
7
|
import { RenderOptions, RenderResult } from '@testing-library/react';
|
|
8
8
|
import { ReactElement } from 'react';
|
package/dist/testing/index.mjs
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
fixtures,
|
|
20
20
|
signTestToken,
|
|
21
21
|
testJwks
|
|
22
|
-
} from "../chunk-
|
|
22
|
+
} from "../chunk-WW2D3N2T.mjs";
|
|
23
23
|
import {
|
|
24
24
|
installPrefix,
|
|
25
25
|
procedurePrefix
|
|
@@ -30,11 +30,11 @@ import {
|
|
|
30
30
|
import "../chunk-QA5AL3VZ.mjs";
|
|
31
31
|
import {
|
|
32
32
|
sendWorkEvent
|
|
33
|
-
} from "../chunk-
|
|
34
|
-
import "../chunk-
|
|
33
|
+
} from "../chunk-6FASZFC4.mjs";
|
|
34
|
+
import "../chunk-CEFLOQD4.mjs";
|
|
35
35
|
import {
|
|
36
36
|
CARD_KEYS
|
|
37
|
-
} from "../chunk-
|
|
37
|
+
} from "../chunk-IHLK4I7J.mjs";
|
|
38
38
|
import "../chunk-QXD7WVKK.mjs";
|
|
39
39
|
import "../chunk-J5LGTIGS.mjs";
|
|
40
40
|
|
package/dist/ui.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ButtonHTMLAttributes, ComponentPropsWithoutRef, ReactNode, ReactElement, CSSProperties, InputHTMLAttributes } from 'react';
|
|
4
4
|
import { ClassValue as ClassValue$1 } from 'clsx';
|
|
5
|
-
import { J as JsonSchema } from './constants-
|
|
5
|
+
import { J as JsonSchema } from './constants-CvHbO3ia.cjs';
|
|
6
6
|
|
|
7
7
|
/** Visual emphasis available for a {@link Button}. */
|
|
8
8
|
type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'inverse' | 'destructive';
|
package/dist/ui.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ButtonHTMLAttributes, ComponentPropsWithoutRef, ReactNode, ReactElement, CSSProperties, InputHTMLAttributes } from 'react';
|
|
4
4
|
import { ClassValue as ClassValue$1 } from 'clsx';
|
|
5
|
-
import { J as JsonSchema } from './constants-
|
|
5
|
+
import { J as JsonSchema } from './constants-CvHbO3ia.js';
|
|
6
6
|
|
|
7
7
|
/** Visual emphasis available for a {@link Button}. */
|
|
8
8
|
type ButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'inverse' | 'destructive';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LocalPreviewOptions } from './client-
|
|
1
|
+
import { L as LocalPreviewOptions } from './client-BLnec4SD.cjs';
|
|
2
2
|
import 'react';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
|
-
import './constants-
|
|
4
|
+
import './constants-CvHbO3ia.cjs';
|
|
5
5
|
|
|
6
6
|
interface PreviewBootstrapDependencies {
|
|
7
7
|
prepareHost?(reactUrl: string): Promise<void>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { L as LocalPreviewOptions } from './client-
|
|
1
|
+
import { L as LocalPreviewOptions } from './client-BRxKTo-L.js';
|
|
2
2
|
import 'react';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
|
-
import './constants-
|
|
4
|
+
import './constants-CvHbO3ia.js';
|
|
5
5
|
|
|
6
6
|
interface PreviewBootstrapDependencies {
|
|
7
7
|
prepareHost?(reactUrl: string): Promise<void>;
|
package/dist/vite-preview.cjs
CHANGED
|
@@ -9,15 +9,15 @@ var _chunkNN263PGQcjs = require('./chunk-NN263PGQ.cjs');
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkAYYJCRS4cjs = require('./chunk-AYYJCRS4.cjs');
|
|
13
13
|
require('./chunk-GAUZYBXE.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
var _chunkVV7ELNRWcjs = require('./chunk-VV7ELNRW.cjs');
|
|
18
18
|
require('./chunk-PRCZMOLD.cjs');
|
|
19
|
-
require('./chunk-
|
|
20
|
-
require('./chunk-
|
|
19
|
+
require('./chunk-TEIGGORZ.cjs');
|
|
20
|
+
require('./chunk-EV3KKP62.cjs');
|
|
21
21
|
require('./chunk-6HETNZJY.cjs');
|
|
22
22
|
require('./chunk-Q7SFCCGT.cjs');
|
|
23
23
|
|
|
@@ -39,7 +39,7 @@ var _jsxruntime = require('react/jsx-runtime'); var JsxRuntime = _interopRequire
|
|
|
39
39
|
// package.json
|
|
40
40
|
var package_default = {
|
|
41
41
|
name: "@tappify/extension-sdk",
|
|
42
|
-
version: "2.1.0-beta.
|
|
42
|
+
version: "2.1.0-beta.4",
|
|
43
43
|
description: "Build extensions that run inside Tappify",
|
|
44
44
|
author: "Tappify Team",
|
|
45
45
|
license: "MIT",
|
|
@@ -392,7 +392,7 @@ function previewProps(contribution, state) {
|
|
|
392
392
|
case "widget":
|
|
393
393
|
return { config: {} };
|
|
394
394
|
case "rowAction":
|
|
395
|
-
return { row: { ...
|
|
395
|
+
return { row: { ..._chunkAYYJCRS4cjs.fixtureKeywords[0] } };
|
|
396
396
|
case "settings":
|
|
397
397
|
return {
|
|
398
398
|
values: state.settings,
|
|
@@ -714,10 +714,10 @@ function LocalPreview({
|
|
|
714
714
|
}, [contribution, loadKey, loader, manifest.id, remote]);
|
|
715
715
|
const host = _react.useMemo.call(void 0, () => {
|
|
716
716
|
void generation;
|
|
717
|
-
return
|
|
717
|
+
return _chunkAYYJCRS4cjs.createTapMock.call(void 0, {
|
|
718
718
|
extensionId: manifest.id,
|
|
719
719
|
extensionName: manifest.name,
|
|
720
|
-
project:
|
|
720
|
+
project: _chunkAYYJCRS4cjs.fixtures.project.project,
|
|
721
721
|
theme,
|
|
722
722
|
size,
|
|
723
723
|
server: localProcedureStubs(manifest)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/extension-sdk/extension-sdk/dist/vite-preview.cjs","../src/vite-preview.tsx","../src/vite/preview/client.tsx","../package.json","../src/vite/preview/error-boundary.tsx","../src/vite/preview/model.ts","../src/vite/preview/styles.ts"],"names":["jsxs","jsx"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACvBA,0CAA2B;ADyB3B;AACA;AEzBA,6GAA+B;AAC/B,2EAAuB;AACvB;AACE;AACA;AACA;AACA;AAAA;AAGF,wFAA0B;AAC1B,sGAA4B;AF0B5B;AACA;AGtCA,IAAA,gBAAA,EAAA;AAAA,EACE,IAAA,EAAQ,wBAAA;AAAA,EACR,OAAA,EAAW,cAAA;AAAA,EACX,WAAA,EAAe,0CAAA;AAAA,EACf,MAAA,EAAU,cAAA;AAAA,EACV,OAAA,EAAW,KAAA;AAAA,EACX,IAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAW;AAAA,IACT,GAAA,EAAK;AAAA,MACH,KAAA,EAAS,mBAAA;AAAA,MACT,MAAA,EAAU,kBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,KAAA,EAAS,sBAAA;AAAA,MACT,MAAA,EAAU,qBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAS,oBAAA;AAAA,MACT,MAAA,EAAU,mBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAS,kBAAA;AAAA,MACT,MAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAS,gBAAA;AAAA,MACT,MAAA,EAAU,eAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAS,kBAAA;AAAA,MACT,MAAA,EAAU,iBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,KAAA,EAAS,0BAAA;AAAA,MACT,MAAA,EAAU,yBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,0BAAA,EAA4B;AAAA,MAC1B,KAAA,EAAS,oCAAA;AAAA,MACT,MAAA,EAAU,mCAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAA,EAAS,2BAAA;AAAA,MACT,MAAA,EAAU,0BAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,KAAA,EAAS,4BAAA;AAAA,MACT,MAAA,EAAU,2BAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,KAAA,EAAS,0BAAA;AAAA,MACT,MAAA,EAAU,yBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,KAAA,EAAS,qBAAA;AAAA,MACT,MAAA,EAAU,oBAAA;AAAA,MACV,OAAA,EAAW;AAAA,IACb,CAAA;AAAA,IACA,iBAAA,EAAmB,sBAAA;AAAA,IACnB,4BAAA,EAA8B,4BAAA;AAAA,IAC9B,gBAAA,EAAkB;AAAA,EACpB,CAAA;AAAA,EACA,OAAA,EAAW;AAAA,IACT,IAAA,EAAQ;AAAA,EACV,CAAA;AAAA,EACA,IAAA,EAAQ,kBAAA;AAAA,EACR,MAAA,EAAU,kBAAA;AAAA,EACV,KAAA,EAAS,mBAAA;AAAA,EACT,WAAA,EAAe;AAAA,IACb,OAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAS;AAAA,IACP,MAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAc;AAAA,IACZ,IAAA,EAAQ,KAAA;AAAA,IACR,GAAA,EAAO;AAAA,EACT,CAAA;AAAA,EACA,IAAA,EAAQ;AAAA,IACN,GAAA,EAAO;AAAA,EACT,CAAA;AAAA,EACA,QAAA,EAAY,oCAAA;AAAA,EACZ,QAAA,EAAY;AAAA,IACV,SAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,OAAA,EAAW;AAAA,IACT,KAAA,EAAS,qDAAA;AAAA,IACT,cAAA,EAAgB,kCAAA;AAAA,IAChB,0BAAA,EAA4B,yCAAA;AAAA,IAC5B,qBAAA,EAAuB,oCAAA;AAAA,IACvB,qBAAA,EAAuB,sCAAA;AAAA,IACvB,eAAA,EAAiB,sEAAA;AAAA,IACjB,eAAA,EAAiB,gKAAA;AAAA,IACjB,gBAAA,EAAkB,4HAAA;AAAA,IAClB,GAAA,EAAO,cAAA;AAAA,IACP,YAAA,EAAc,cAAA;AAAA,IACd,MAAA,EAAU,iFAAA;AAAA,IACV,cAAA,EAAgB,iFAAA;AAAA,IAChB,IAAA,EAAQ,yCAAA;AAAA,IACR,IAAA,EAAQ,yCAAA;AAAA,IACR,YAAA,EAAc,gBAAA;AAAA,IACd,OAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAU,IAAA;AAAA,IACV,cAAA,EAAkB,2BAAA;AAAA,IAClB,UAAA,EAAc,8FAAA;AAAA,IACd,kBAAA,EAAoB;AAAA,EACtB,CAAA;AAAA,EACA,gBAAA,EAAoB;AAAA,IAClB,yBAAA,EAA2B,UAAA;AAAA,IAC3B,uBAAA,EAAyB,UAAA;AAAA,IACzB,wBAAA,EAA0B,UAAA;AAAA,IAC1B,KAAA,EAAS,SAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,IAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA,oBAAA,EAAwB;AAAA,IACtB,yBAAA,EAA2B;AAAA,MACzB,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,uBAAA,EAAyB;AAAA,MACvB,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,wBAAA,EAA0B;AAAA,MACxB,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,KAAA,EAAS;AAAA,MACP,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,QAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,MAAA,EAAU;AAAA,MACR,QAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA;AAAA,EACA,YAAA,EAAgB;AAAA,IACd,4BAAA,EAA8B,QAAA;AAAA,IAC9B,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ,SAAA;AAAA,IACR,2BAAA,EAA6B,SAAA;AAAA,IAC7B,GAAA,EAAO;AAAA,EACT,CAAA;AAAA,EACA,eAAA,EAAmB;AAAA,IACjB,iBAAA,EAAmB,SAAA;AAAA,IACnB,iCAAA,EAAmC,SAAA;AAAA,IACnC,YAAA,EAAc,SAAA;AAAA,IACd,yBAAA,EAA2B,SAAA;AAAA,IAC3B,6BAAA,EAA+B,QAAA;AAAA,IAC/B,mCAAA,EAAqC,SAAA;AAAA,IACrC,uBAAA,EAAyB,SAAA;AAAA,IACzB,0BAAA,EAA4B,SAAA;AAAA,IAC5B,uBAAA,EAAyB,SAAA;AAAA,IACzB,2CAAA,EAA6C,SAAA;AAAA,IAC7C,uBAAA,EAAyB,WAAA;AAAA,IACzB,2BAAA,EAA6B,QAAA;AAAA,IAC7B,wBAAA,EAA0B,SAAA;AAAA,IAC1B,6BAAA,EAA+B,SAAA;AAAA,IAC/B,oBAAA,EAAsB,SAAA;AAAA,IACtB,aAAA,EAAe,UAAA;AAAA,IACf,cAAA,EAAgB,SAAA;AAAA,IAChB,kBAAA,EAAoB,SAAA;AAAA,IACpB,qBAAA,EAAuB,QAAA;AAAA,IACvB,UAAA,EAAc,QAAA;AAAA,IACd,4CAAA,EAA8C,QAAA;AAAA,IAC9C,MAAA,EAAU,QAAA;AAAA,IACV,2BAAA,EAA6B,QAAA;AAAA,IAC7B,MAAA,EAAU,SAAA;AAAA,IACV,wBAAA,EAA0B,SAAA;AAAA,IAC1B,wBAAA,EAA0B,QAAA;AAAA,IAC1B,qBAAA,EAAuB,SAAA;AAAA,IACvB,2BAAA,EAA6B,QAAA;AAAA,IAC7B,OAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,KAAA,EAAS,QAAA;AAAA,IACT,aAAA,EAAe,SAAA;AAAA,IACf,QAAA,EAAY,QAAA;AAAA,IACZ,kCAAA,EAAoC,QAAA;AAAA,IACpC,KAAA,EAAS,SAAA;AAAA,IACT,WAAA,EAAa,SAAA;AAAA,IACb,kBAAA,EAAoB,SAAA;AAAA,IACpB,IAAA,EAAQ,QAAA;AAAA,IACR,GAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAW,UAAA;AAAA,IACX,yBAAA,EAA2B,SAAA;AAAA,IAC3B,UAAA,EAAc,QAAA;AAAA,IACd,mBAAA,EAAqB,SAAA;AAAA,IACrB,IAAA,EAAQ,SAAA;AAAA,IACR,MAAA,EAAU;AAAA,EACZ,CAAA;AAAA,EACA,MAAA,EAAU;AAAA,IACR,UAAA,EAAc;AAAA,MACZ,IAAA,EAAQ,2BAAA;AAAA,MACR,KAAA,EAAS;AAAA,QACP,IAAA,EAAQ;AAAA,UACN,WAAA,EAAe,aAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,GAAA,EAAO;AAAA,UACL,WAAA,EAAe,SAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,IAAA,EAAQ;AAAA,UACN,WAAA,EAAe,uBAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,KAAA,EAAS;AAAA,UACP,WAAA,EAAe,uCAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,QAAA,EAAY;AAAA,UACV,WAAA,EAAe,kBAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,IAAA,EAAQ;AAAA,UACN,WAAA,EAAe,0BAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,IAAA,EAAQ;AAAA,UACN,WAAA,EAAe,0BAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,KAAA,EAAS;AAAA,UACP,WAAA,EAAe,8BAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,EAAA,EAAM;AAAA,UACJ,WAAA,EAAe,eAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,KAAA,EAAS;AAAA,UACP,WAAA,EAAe,OAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,MAAA,EAAU;AAAA,UACR,WAAA,EAAe,wBAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,GAAA,EAAO;AAAA,UACL,WAAA,EAAe,yCAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,IAAA,EAAQ;AAAA,UACN,WAAA,EAAe,6BAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,OAAA,EAAW;AAAA,UACT,WAAA,EAAe,oCAAA;AAAA,UACf,KAAA,EAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAAA,EACA,aAAA,EAAe;AAAA,IACb,YAAA,EAAc;AAAA,MACZ,cAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,IACF,CAAA;AAAA,IACA,aAAA,EAAe;AAAA,MACb,kBAAA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAA;AHwCA;AACA;AIrUA;AA2BQ;AAjBD,IAAM,qBAAA,EAAN,MAAA,QAAmC,iBAGxC;AAAA,EAHK,WAAA,CAAA,EAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AAIL,IAAA,IAAA,CAAA,MAAA,EAAmC,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,EAAA;AAAA,EAEjD,OAAO,wBAAA,CAAyB,KAAA,EAAyC;AACvE,IAAA,OAAO,EAAE,MAAM,CAAA;AAAA,EACjB;AAAA,EAEA,iBAAA,CAAkB,MAAA,EAAe,KAAA,EAAwB;AAAA,EAEzD;AAAA,EAEA,MAAA,CAAA,EAAoB;AAClB,IAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,EAAM;AAC7B,MAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,IAAA,EAAK,OAAA,EACxC,QAAA,EAAA;AAAA,wBAAA,6BAAA,QAAC,EAAA,EAAO,QAAA,EAAA,qCAAA,CAAkC,CAAA;AAAA,wBAC1C,6BAAA,MAAC,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAA,CAAQ;AAAA,MAAA,EAAA,CAClC,CAAA;AAAA,IAEJ;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,EACpB;AACF,CAAA;AJyTA;AACA;AK5TA,IAAM,UAAA,EAA2C;AAAA,EAC/C,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,YAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,aAAA,CAAc,QAAA,EAAkD;AACvE,EAAA,MAAM,OAAA,kBAAS,IAAI,GAAA,CAAoB,CAAA;AACvC,EAAA,MAAM,YAAA,EAAc,QAAA,CAAS,WAAA;AAE7B,EAAA,IAAA,CAAA,MAAW,KAAA,oBAAQ,WAAA,CAAY,KAAA,UAAS,CAAC,GAAA,EAAG;AAC1C,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,CAAA;AAC/B,EAAA;AAC8B,EAAA;AACD,IAAA;AAC7B,EAAA;AACqB,EAAA;AACK,IAAA;AAC1B,EAAA;AACqB,EAAA;AACQ,IAAA;AAC7B,EAAA;AAC0B,EAAA;AAEnB,EAAA;AACT;AAGE;AAE6B,EAAA;AACE,EAAA;AACJ,IAAA;AAClB,IAAA;AACL,MAAA;AAEe,MAAA;AAGjB,IAAA;AACD,EAAA;AACH;AAGE;AAG2B,EAAA;AACpB,IAAA;AACwB,MAAA;AACxB,IAAA;AACK,MAAA;AACL,IAAA;AACiB,MAAA;AACjB,IAAA;AACgB,MAAA;AAChB,IAAA;AACI,MAAA;AACS,QAAA;AACM,QAAA;AACtB,MAAA;AACJ,EAAA;AACF;ALiTkC;AACA;AMnZL;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;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;AN6fK;AACA;AEpU9BA;AA/H2B;AACH;AACH;AAGvB;AAG8B,EAAA;AACb,EAAA;AACkB,EAAA;AAEb,EAAA;AACE,EAAA;AACD,EAAA;AAEnB,IAAA;AACQ,MAAA;AACmB,MAAA;AACjB,MAAA;AACC,QAAA;AACU,UAAA;AACJ,UAAA;AACE,UAAA;AACf,QAAA;AACa,QAAA;AACO,UAAA;AACP,UAAA;AACE,UAAA;AACf,QAAA;AACqB,QAAA;AACJ,UAAA;AACJ,UAAA;AACE,UAAA;AACf,QAAA;AACyB,QAAA;AACd,UAAA;AAGE,UAAA;AACE,UAAA;AACf,QAAA;AAC0B,QAAA;AACf,UAAA;AACE,UAAA;AACE,UAAA;AACf,QAAA;AACF,MAAA;AACD,IAAA;AACL,EAAA;AAC6B,EAAA;AACtB,EAAA;AACT;AAGE;AAIS,EAAA;AAGgB,EAAA;AACb,IAAA;AACC,MAAA;AACX,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAEqD;AAE/B,EAAA;AAKV,IAAA;AACV,EAAA;AACqB,EAAA;AAC0B,IAAA;AAC/C,EAAA;AACF;AAEuC;AACrC,EAAA;AACA,EAAA;AACA,EAAA;AACuC;AACd,EAAA;AACP,EAAA;AACc,IAAA;AAChC,EAAA;AACF;AAEmD;AAC7C,EAAA;AAC2B,IAAA;AACb,IAAA;AACV,EAAA;AACC,IAAA;AACT,EAAA;AACF;AAGE;AAEc,EAAA;AACiB,IAAA;AAC3B,MAAA;AACM,MAAA;AACM,QAAA;AACR,UAAA;AACF,QAAA;AACF,MAAA;AACD,IAAA;AACH,EAAA;AACF;AAEiB;AACf,EAAA;AACA,EAAA;AAIC;AAEE,EAAA;AACM,oBAAA;AACJ,oBAAA;AACH,EAAA;AAEJ;AAOwB;AACtB,EAAA;AACA,EAAA;AACA,EAAA;AAKC;AACyB,EAAA;AACM,EAAA;AACX,IAAA;AACD,IAAA;AACC,IAAA;AACG,IAAA;AACD,MAAA;AACC,MAAA;AACC,MAAA;AACG,MAAA;AAC1B,IAAA;AAC0B,IAAA;AACvB,EAAA;AAEW,EAAA;AACM,IAAA;AACS,IAAA;AACF,IAAA;AACX,EAAA;AAEF,EAAA;AACM,IAAA;AACkB,IAAA;AACc,IAAA;AACzB,MAAA;AACJ,MAAA;AACC,MAAA;AACE,MAAA;AACH,MAAA;AACvB,IAAA;AAEA,IAAA;AACE,MAAA;AACA,MAAA;AACF,IAAA;AAC0B,IAAA;AACb,IAAA;AACW,MAAA;AACxB,IAAA;AACgB,EAAA;AAGhBC,EAAAA;AAAC,IAAA;AAAA,IAAA;AACM,MAAA;AACK,MAAA;AACc,MAAA;AAEN,MAAA;AAAoD,IAAA;AACxE,EAAA;AAEJ;AAE6B;AAC3B,EAAA;AACA,EAAA;AACS,EAAA;AACW;AACO,EAAA;AACC,EAAA;AACE,qCAAA;AAC9B,EAAA;AAC0B,EAAA;AACM,EAAA;AACR,EAAA;AACQ,EAAA;AACA,EAAA;AACJ,EAAA;AACrB,IAAA;AACG,IAAA;AACT,EAAA;AAGY,EAAA;AAEmB,EAAA;AACH,EAAA;AAEb,EAAA;AACkB,IAAA;AAChB,IAAA;AACU,IAAA;AACd,IAAA;AACY,MAAA;AACtB,MAAA;AACqB,MAAA;AAEL,IAAA;AACC,MAAA;AACL,MAAA;AACH,QAAA;AACG,QAAA;AACG,QAAA;AACc,QAAA;AAC1B,MAAA;AAEwB,IAAA;AACV,MAAA;AACL,MAAA;AACH,QAAA;AACG,QAAA;AAEW,QAAA;AAGpB,MAAA;AACF,IAAA;AACU,IAAA;AACC,MAAA;AACd,IAAA;AACyB,EAAA;AAEA,EAAA;AACpB,IAAA;AACgB,IAAA;AACG,MAAA;AACE,MAAA;AACE,MAAA;AAC1B,MAAA;AACA,MAAA;AAC4B,MAAA;AAC7B,IAAA;AAC6B,EAAA;AACJ,EAAA;AACrB,IAAA;AACwB,IAAA;AAChB,EAAA;AAGE,EAAA;AAEb,EAAA;AAC4B,EAAA;AAE5BA,IAAAA;AAK0B,EAAA;AAE1BD,IAAAA;AACG,sBAAA;AACA,sBAAA;AACH,IAAA;AAE0B,EAAA;AACF,IAAA;AACC,IAAA;AACzB,MAAA;AACkB,MAAA;AACnB,IAAA;AAECC,IAAAA;AAQG,EAAA;AAEHD,IAAAA;AAAsC,MAAA;AAAmB,MAAA;AAAM,MAAA;AAAC,IAAA;AAEpE,EAAA;AAGG,EAAA;AACE,oBAAA;AACA,oBAAA;AACE,sBAAA;AACE,wBAAA;AACA,wBAAA;AACE,0BAAA;AACA,0BAAA;AACE,4BAAA;AACiB,YAAA;AACjB,YAAA;AACH,UAAA;AACF,QAAA;AACF,MAAA;AACC,sBAAA;AAEG,QAAA;AACG,0BAAA;AACDC,0BAAAA;AAAC,YAAA;AAAA,YAAA;AACQ,cAAA;AACG,cAAA;AAET,cAAA;AACE,gBAAA;AAAA,gBAAA;AAEa,kBAAA;AAEN,kBAAA;AAAA,gBAAA;AAHiB,gBAAA;AAK1B,cAAA;AAAA,YAAA;AACH,UAAA;AAEA,QAAA;AACH,wBAAA;AACE,0BAAA;AACDD,0BAAAA;AAAC,YAAA;AAAA,YAAA;AACQ,cAAA;AACG,cAAA;AAEV,cAAA;AAAAC,gCAAAA;AACAA,gCAAAA;AAAyB,cAAA;AAAA,YAAA;AAC3B,UAAA;AACF,QAAA;AACC,wBAAA;AACE,0BAAA;AACDD,0BAAAA;AAAC,YAAA;AAAA,YAAA;AACQ,cAAA;AACG,cAAA;AAEV,cAAA;AAAAC,gCAAAA;AACAA,gCAAAA;AACAA,gCAAAA;AAA6B,cAAA;AAAA,YAAA;AAC/B,UAAA;AACF,QAAA;AACC,wBAAA;AACE,0BAAA;AACDD,0BAAAA;AAAC,YAAA;AAAA,YAAA;AACQ,cAAA;AACI,cAAA;AACD,cAAA;AAEV,cAAA;AAAAC,gCAAAA;AACAA,gCAAAA;AACAA,gCAAAA;AAAyB,cAAA;AAAA,YAAA;AAC3B,UAAA;AACF,QAAA;AACAA,wBAAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACL,YAAA;AACM,YAAA;AACI,YAAA;AACC,cAAA;AACA,cAAA;AAChB,YAAA;AACD,YAAA;AAAA,UAAA;AAED,QAAA;AACF,MAAA;AACF,IAAA;AACC,oBAAA;AACE,MAAA;AAAA,MAAA;AACW,QAAA;AACK,QAAA;AACJ,QAAA;AACA,QAAA;AAEV,QAAA;AAAA,MAAA;AAEL,IAAA;AACF,EAAA;AAEJ;AFwYkC;AACA;ACr0BpB;AANoB;AAChC,EAAA;AACA,EAAA;AACA,EAAA;AACkC;AACL,EAAA;AACjBA,EAAAA;AACc,EAAA;AAC5B;AD80BkC;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/extension-sdk/extension-sdk/dist/vite-preview.cjs","sourcesContent":[null,"import { createRoot } from 'react-dom/client';\nimport { LocalPreview, type LocalPreviewOptions } from './vite/preview/client';\n\nexport {\n componentFromModule,\n loadContribution,\n LocalPreview,\n} from './vite/preview/client';\nexport type {\n LocalPreviewOptions,\n LocalPreviewProps,\n PreviewLoadRequest,\n PreviewModuleLoader,\n} from './vite/preview/client';\n\nexport function mountLocalPreview({\n manifest,\n remote,\n mount,\n}: LocalPreviewOptions): () => void {\n const root = createRoot(mount);\n root.render(<LocalPreview manifest={manifest} remote={remote} />);\n return () => root.unmount();\n}\n","import type { ModuleFederation } from '@module-federation/runtime';\nimport * as TanstackQuery from '@tanstack/react-query';\nimport * as React from 'react';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n} from 'react';\nimport * as ReactDom from 'react-dom';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport packageJson from '../../../package.json';\nimport type { TapSettingsValues, TapSize } from '../../client/types';\nimport { TapHostProvider, createHostQueryClient } from '../../host/provider';\nimport * as TappifySdk from '../../index';\nimport { remoteName } from '../../manifest/define';\nimport type { ExtensionManifest } from '../../manifest/types';\nimport { fixtures } from '../../testing/fixtures';\nimport { createTapMock } from '../../testing/mock';\nimport { PreviewErrorBoundary } from './error-boundary';\nimport { previewProps, previewSelections } from './model';\nimport { previewStyles } from './styles';\n\nexport interface PreviewLoadRequest {\n extensionId: string;\n remote: string;\n expose: string;\n}\n\nexport type PreviewModuleLoader = (\n request: PreviewLoadRequest,\n) => Promise<unknown>;\n\nexport interface LocalPreviewOptions {\n manifest: ExtensionManifest;\n remote: string;\n mount: HTMLElement;\n}\n\nexport interface LocalPreviewProps {\n manifest: ExtensionManifest;\n remote: string;\n loader?: PreviewModuleLoader;\n}\n\ntype Theme = 'light' | 'dark';\ntype Viewport = 'desktop' | 'tablet' | 'mobile';\n\ntype LoadState =\n | { key: string; status: 'loading' }\n | {\n key: string;\n status: 'ready';\n Component: ComponentType<Record<string, unknown>>;\n styles: string[];\n }\n | { key: string; status: 'failed'; message: string };\n\nconst SINGLETON = { singleton: true, requiredVersion: false } as const;\nconst federationInstances = new Map<string, Promise<ModuleFederation>>();\nlet federationSequence = 0;\n\nasync function federationFor(\n extensionId: string,\n remote: string,\n): Promise<ModuleFederation> {\n const key = `${extensionId}|${remote}`;\n const existing = federationInstances.get(key);\n if (existing !== undefined) return existing;\n\n federationSequence += 1;\n const name = remoteName(extensionId);\n const created = import('@module-federation/runtime').then(\n ({ createInstance }) =>\n createInstance({\n name: `tappify_local_preview_${String(federationSequence)}`,\n remotes: [{ name, alias: name, entry: remote, type: 'module' }],\n shared: {\n react: {\n version: React.version,\n lib: () => React,\n shareConfig: SINGLETON,\n },\n 'react-dom': {\n version: ReactDom.version,\n lib: () => ReactDom,\n shareConfig: SINGLETON,\n },\n 'react/jsx-runtime': {\n version: React.version,\n lib: () => JsxRuntime,\n shareConfig: SINGLETON,\n },\n '@tanstack/react-query': {\n version: packageJson.peerDependencies[\n '@tanstack/react-query'\n ].replace(/^[^\\d]*/, ''),\n lib: () => TanstackQuery,\n shareConfig: SINGLETON,\n },\n '@tappify/extension-sdk': {\n version: packageJson.version,\n lib: () => TappifySdk,\n shareConfig: SINGLETON,\n },\n },\n }),\n );\n federationInstances.set(key, created);\n return created;\n}\n\nexport function componentFromModule(\n module: unknown,\n expose: string,\n): ComponentType<Record<string, unknown>> {\n const candidate =\n typeof module === 'object' && module !== null && 'default' in module\n ? (module as { default: unknown }).default\n : module;\n if (typeof candidate !== 'function') {\n throw new Error(\n `${expose} did not default-export a React component. Export the contribution component as default.`,\n );\n }\n return candidate as ComponentType<Record<string, unknown>>;\n}\n\nfunction stylesFromModule(module: unknown): string[] {\n if (\n typeof module !== 'object' ||\n module === null ||\n !('styles' in module) ||\n !Array.isArray(module.styles)\n ) {\n return [];\n }\n return module.styles.filter(\n (style): style is string => typeof style === 'string',\n );\n}\n\nexport async function loadContribution({\n extensionId,\n remote,\n expose,\n}: PreviewLoadRequest): Promise<unknown> {\n const federation = await federationFor(extensionId, remote);\n return federation.loadRemote(\n `${remoteName(extensionId)}/${expose.replace(/^\\.\\//, '')}`,\n );\n}\n\nfunction isExternalRemote(remote: string): boolean {\n try {\n const host = new URL(remote).hostname;\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '[::1]';\n } catch {\n return true;\n }\n}\n\nfunction localProcedureStubs(\n manifest: ExtensionManifest,\n): Record<string, () => never> {\n return Object.fromEntries(\n Object.keys(manifest.server?.procedures ?? {}).map(name => [\n name,\n () => {\n throw new Error(\n 'This view needs live server data. Run tappify extension dev --live to connect it.',\n );\n },\n ]),\n );\n}\n\nfunction Message({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"tap-preview-message\" role=\"status\">\n <h2>{title}</h2>\n <span>{children}</span>\n </div>\n );\n}\n\ninterface PreviewShadowNodes {\n root: ShadowRoot;\n content: HTMLElement;\n}\n\nfunction PreviewSurface({\n portal,\n styles,\n children,\n}: {\n portal: HTMLElement;\n styles: string[];\n children: React.ReactNode;\n}) {\n const [nodes, setNodes] = useState<PreviewShadowNodes | null>(null);\n const attachHost = useCallback((host: HTMLDivElement | null): void => {\n if (host === null) return;\n const root = host.shadowRoot ?? host.attachShadow({ mode: 'open' });\n let content = root.querySelector<HTMLElement>('[data-tap-content]');\n if (content === null) {\n content = document.createElement('div');\n content.className = 'tap-root';\n content.setAttribute('data-tap-content', '');\n root.appendChild(content);\n }\n setNodes({ root, content });\n }, []);\n\n useEffect(() => {\n if (nodes === null) return;\n nodes.root.appendChild(portal);\n return () => portal.remove();\n }, [nodes, portal]);\n\n useEffect(() => {\n if (nodes === null) return;\n const injected: HTMLStyleElement[] = [];\n const inject = (kind: string, css: string): void => {\n const element = document.createElement('style');\n element.setAttribute('data-tap-style', kind);\n element.textContent = css;\n nodes.root.insertBefore(element, nodes.content);\n injected.push(element);\n };\n\n inject(\n 'preview',\n ':host { display: block; height: 100%; min-height: 0; overflow: auto; } .tap-root { box-sizing: border-box; height: 100%; min-height: 100%; padding: 24px; }',\n );\n for (const css of styles) inject('remote', css);\n return () => {\n for (const element of injected) element.remove();\n };\n }, [nodes, styles]);\n\n return (\n <div\n ref={attachHost}\n className=\"tap-preview-surface\"\n data-tap-preview-surface\n >\n {nodes === null ? null : ReactDom.createPortal(children, nodes.content)}\n </div>\n );\n}\n\nexport function LocalPreview({\n manifest,\n remote,\n loader = loadContribution,\n}: LocalPreviewProps) {\n const selections = useMemo(() => previewSelections(manifest), [manifest]);\n const [expose, setExpose] = useState(\n selections[0]?.contribution.expose ?? '',\n );\n const [theme, setTheme] = useState<Theme>('light');\n const [viewport, setViewport] = useState<Viewport>('desktop');\n const [size, setSize] = useState<TapSize>('slot');\n const [generation, setGeneration] = useState(0);\n const [settings, setSettings] = useState<TapSettingsValues>({});\n const [loaded, setLoaded] = useState<LoadState>({\n key: '',\n status: 'loading',\n });\n\n const selection =\n selections.find(item => item.contribution.expose === expose) ??\n selections[0];\n const contribution = selection?.contribution;\n const loadKey = `${remote}|${contribution?.expose ?? ''}`;\n\n useEffect(() => {\n if (contribution === undefined) return;\n let cancelled = false;\n setLoaded({ key: loadKey, status: 'loading' });\n void loader({\n extensionId: manifest.id,\n remote,\n expose: contribution.expose,\n })\n .then(module => {\n if (cancelled) return;\n setLoaded({\n key: loadKey,\n status: 'ready',\n Component: componentFromModule(module, contribution.expose),\n styles: stylesFromModule(module),\n });\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n setLoaded({\n key: loadKey,\n status: 'failed',\n message:\n error instanceof Error\n ? error.message\n : 'The remote entry could not be loaded.',\n });\n });\n return () => {\n cancelled = true;\n };\n }, [contribution, loadKey, loader, manifest.id, remote]);\n\n const host = useMemo(() => {\n void generation;\n return createTapMock({\n extensionId: manifest.id,\n extensionName: manifest.name,\n project: fixtures.project.project,\n theme,\n size,\n server: localProcedureStubs(manifest),\n });\n }, [generation, manifest, size, theme]);\n const queryClient = useMemo(() => {\n void generation;\n return createHostQueryClient();\n }, [generation]);\n\n const current: LoadState =\n loaded.key === loadKey ? loaded : { key: loadKey, status: 'loading' };\n\n let content: React.ReactNode;\n if (contribution === undefined) {\n content = (\n <Message title=\"No UI contributions\">\n Run `tappify extension add` and choose a page, tab, widget, row action,\n or settings panel.\n </Message>\n );\n } else if (current.status === 'failed') {\n content = (\n <div className=\"tap-preview-message\" role=\"alert\">\n <strong>The remote entry could not load.</strong>\n <span>{current.message}</span>\n </div>\n );\n } else if (current.status === 'ready') {\n const Component = current.Component;\n const props = previewProps(contribution, {\n settings,\n onSettingsChange: setSettings,\n });\n content = (\n <TapHostProvider tap={host.tap} queryClient={queryClient}>\n <PreviewSurface portal={host.portal} styles={current.styles}>\n <PreviewErrorBoundary key={`${loadKey}|${String(generation)}`}>\n <Component {...props} />\n </PreviewErrorBoundary>\n </PreviewSurface>\n </TapHostProvider>\n );\n } else {\n content = (\n <Message title=\"Loading contribution\">Loading {selection.label}.</Message>\n );\n }\n\n return (\n <main className=\"tap-preview\" data-theme={theme}>\n <style>{previewStyles}</style>\n <header className=\"tap-preview-bar\">\n <div className=\"tap-preview-brand\">\n <img src={`/${manifest.icon.replace(/^\\.\\//, '')}`} alt=\"\" />\n <div>\n <strong>{manifest.name}</strong>\n <span>\n <i aria-hidden=\"true\" />\n {isExternalRemote(remote) ? 'External remote' : 'Local preview'}\n {' · Fixture data'}\n </span>\n </div>\n </div>\n <div className=\"tap-preview-controls\">\n {selections.length > 0 ? (\n <label className=\"tap-preview-field tap-preview-field--contribution\">\n <span>Contribution</span>\n <select\n value={contribution?.expose ?? ''}\n onChange={event => setExpose(event.target.value)}\n >\n {selections.map(item => (\n <option\n key={item.contribution.expose}\n value={item.contribution.expose}\n >\n {item.label}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n <label className=\"tap-preview-field\">\n <span>Theme</span>\n <select\n value={theme}\n onChange={event => setTheme(event.target.value as Theme)}\n >\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </label>\n <label className=\"tap-preview-field\">\n <span>Viewport</span>\n <select\n value={viewport}\n onChange={event => setViewport(event.target.value as Viewport)}\n >\n <option value=\"desktop\">Desktop</option>\n <option value=\"tablet\">Tablet</option>\n <option value=\"mobile\">Mobile</option>\n </select>\n </label>\n <label className=\"tap-preview-field\">\n <span>Surface</span>\n <select\n value={size}\n aria-label=\"Surface size\"\n onChange={event => setSize(event.target.value as TapSize)}\n >\n <option value=\"slot\">Slot</option>\n <option value=\"panel\">Panel</option>\n <option value=\"page\">Page</option>\n </select>\n </label>\n <button\n className=\"tap-preview-reset\"\n type=\"button\"\n aria-label=\"Reset fixtures\"\n onClick={() => {\n setSettings({});\n setGeneration(value => value + 1);\n }}\n >\n Reset\n </button>\n </div>\n </header>\n <section className=\"tap-preview-stage\">\n <div\n className=\"tap-preview-canvas\"\n data-viewport={viewport}\n data-size={size}\n aria-label=\"Preview canvas\"\n >\n {content}\n </div>\n </section>\n </main>\n );\n}\n","{\n \"name\": \"@tappify/extension-sdk\",\n \"version\": \"2.1.0-beta.3\",\n \"description\": \"Build extensions that run inside Tappify\",\n \"author\": \"Tappify Team\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./manifest\": {\n \"types\": \"./dist/manifest.d.ts\",\n \"import\": \"./dist/manifest.mjs\",\n \"require\": \"./dist/manifest.cjs\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.cjs\"\n },\n \"./host\": {\n \"types\": \"./dist/host.d.ts\",\n \"import\": \"./dist/host.mjs\",\n \"require\": \"./dist/host.cjs\"\n },\n \"./ui\": {\n \"types\": \"./dist/ui.d.ts\",\n \"import\": \"./dist/ui.mjs\",\n \"require\": \"./dist/ui.cjs\"\n },\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.mjs\",\n \"require\": \"./dist/vite.cjs\"\n },\n \"./vite/preview\": {\n \"types\": \"./dist/vite-preview.d.ts\",\n \"import\": \"./dist/vite-preview.mjs\",\n \"require\": \"./dist/vite-preview.cjs\"\n },\n \"./vite/preview/bootstrap\": {\n \"types\": \"./dist/vite-preview-bootstrap.d.ts\",\n \"import\": \"./dist/vite-preview-bootstrap.mjs\",\n \"require\": \"./dist/vite-preview-bootstrap.cjs\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing/index.d.ts\",\n \"import\": \"./dist/testing/index.mjs\",\n \"require\": \"./dist/testing/index.cjs\"\n },\n \"./testing/vitest\": {\n \"types\": \"./dist/testing/vitest.d.ts\",\n \"import\": \"./dist/testing/vitest.mjs\",\n \"require\": \"./dist/testing/vitest.cjs\"\n },\n \"./testing/jest\": {\n \"types\": \"./dist/testing/jest.d.ts\",\n \"import\": \"./dist/testing/jest.mjs\",\n \"require\": \"./dist/testing/jest.cjs\"\n },\n \"./codegen\": {\n \"types\": \"./dist/codegen.d.ts\",\n \"import\": \"./dist/codegen.mjs\",\n \"require\": \"./dist/codegen.cjs\"\n },\n \"./ui/styles.css\": \"./dist/ui/styles.css\",\n \"./schema/extension-v2.json\": \"./schema/extension-v2.json\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": [\n \"*.css\",\n \"./dist/testing/vitest.*\",\n \"./dist/testing/jest.*\"\n ],\n \"files\": [\n \"dist\",\n \"schema\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tappify-dev/extension-sdk.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/tappify-dev/extension-sdk/issues\"\n },\n \"homepage\": \"https://docs.tappify.ai/extensions\",\n \"keywords\": [\n \"tappify\",\n \"extension\",\n \"extension-sdk\",\n \"react\",\n \"module-federation\"\n ],\n \"scripts\": {\n \"build\": \"rm -rf dist && tsup && node scripts/copy-styles.mjs\",\n \"build:schema\": \"tsx scripts/build-json-schema.ts\",\n \"build:manifest-reference\": \"tsx scripts/build-manifest-reference.ts\",\n \"build:api-reference\": \"tsx scripts/build-api-reference.ts\",\n \"check:hosted-schema\": \"node scripts/check-hosted-schema.mjs\",\n \"docs:examples\": \"tsx scripts/check-tsdoc-examples.ts && tsc -p tsconfig.examples.json\",\n \"docs:validate\": \"typedoc --options typedoc.frontend.json --emit none && typedoc --options typedoc.server.json --emit none && typedoc --options typedoc.testing.json --emit none\",\n \"docs:reference\": \"pnpm docs:examples && pnpm docs:validate && pnpm build:schema && pnpm build:manifest-reference && pnpm build:api-reference\",\n \"dev\": \"tsup --watch\",\n \"type-check\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,mjs,cjs}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,mjs,cjs}\\\"\",\n \"lint\": \"eslint \\\"{src,test}/**/*.{ts,tsx}\\\" --fix\",\n \"test\": \"vitest run --passWithNoTests --coverage\",\n \"test:watch\": \"vitest --watch\",\n \"prepare\": \"husky\",\n \"commit\": \"cz\",\n \"prepublishOnly\": \"npm run build && npm test\",\n \"spellcheck\": \"cspell \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,yml,mjs,cjs}\\\" \\\".github/**/*.yml\\\"\",\n \"semantic-release\": \"semantic-release\"\n },\n \"peerDependencies\": {\n \"@module-federation/vite\": \">=1.16.0\",\n \"@tanstack/react-query\": \"^5.100.0\",\n \"@testing-library/react\": \">=16.0.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"vite\": \">=8.0.0\",\n \"vitest\": \">=3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@module-federation/vite\": {\n \"optional\": true\n },\n \"@tanstack/react-query\": {\n \"optional\": true\n },\n \"@testing-library/react\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"react-dom\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n },\n \"vitest\": {\n \"optional\": true\n }\n },\n \"dependencies\": {\n \"@module-federation/runtime\": \"~2.5.1\",\n \"clsx\": \"^2.1.1\",\n \"jose\": \"^6.2.12\",\n \"json-schema-to-typescript\": \"^16.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@commitlint/cli\": \"^20.4.3\",\n \"@commitlint/config-conventional\": \"^20.4.3\",\n \"@eslint/js\": \"^10.0.1\",\n \"@module-federation/vite\": \"~1.16.0\",\n \"@semantic-release/changelog\": \"^6.0.3\",\n \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/github\": \"^12.0.6\",\n \"@semantic-release/npm\": \"^13.1.5\",\n \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n \"@tanstack/react-query\": \"^5.100.14\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.1.0\",\n \"@testing-library/user-event\": \"^14.5.2\",\n \"@types/json-schema\": \"^7.0.15\",\n \"@types/node\": \"^22.13.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.2.7\",\n \"@vitest/coverage-v8\": \"^3.0.0\",\n \"commitizen\": \"^4.3.1\",\n \"conventional-changelog-conventionalcommits\": \"^9.3.0\",\n \"cspell\": \"^9.7.0\",\n \"cz-conventional-changelog\": \"^3.3.0\",\n \"eslint\": \"^10.0.2\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.5\",\n \"eslint-plugin-react\": \"^7.37.0\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"globals\": \"^17.4.0\",\n \"happy-dom\": \"^17.0.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^16.3.2\",\n \"prettier\": \"^3.8.1\",\n \"prettier-plugin-organize-imports\": \"^4.3.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"semantic-release\": \"^25.0.3\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.20.0\",\n \"typedoc\": \"^0.28.20\",\n \"typedoc-plugin-markdown\": \"^4.13.0\",\n \"typescript\": \"^5.7.0\",\n \"typescript-eslint\": \"^8.56.1\",\n \"vite\": \"^8.0.14\",\n \"vitest\": \"^3.0.0\"\n },\n \"config\": {\n \"commitizen\": {\n \"path\": \"cz-conventional-changelog\",\n \"types\": {\n \"feat\": {\n \"description\": \"New feature\",\n \"title\": \"Features\"\n },\n \"fix\": {\n \"description\": \"Bug fix\",\n \"title\": \"Fixes\"\n },\n \"docs\": {\n \"description\": \"Documentation changes\",\n \"title\": \"Documentation\"\n },\n \"style\": {\n \"description\": \"Code style changes (formatting, etc.)\",\n \"title\": \"Styles\"\n },\n \"refactor\": {\n \"description\": \"Code refactoring\",\n \"title\": \"Refactoring\"\n },\n \"perf\": {\n \"description\": \"Performance improvements\",\n \"title\": \"Performance\"\n },\n \"test\": {\n \"description\": \"Adding or updating tests\",\n \"title\": \"Tests\"\n },\n \"build\": {\n \"description\": \"Build system or dependencies\",\n \"title\": \"Build\"\n },\n \"ci\": {\n \"description\": \"CI/CD changes\",\n \"title\": \"CI/CD\"\n },\n \"chore\": {\n \"description\": \"Chore\",\n \"title\": \"Chores\"\n },\n \"revert\": {\n \"description\": \"Revert previous commit\",\n \"title\": \"Reverts\"\n },\n \"wip\": {\n \"description\": \"Work in progress / continuing a feature\",\n \"title\": \"Work in Progress\"\n },\n \"cont\": {\n \"description\": \"Continue/complete a feature\",\n \"title\": \"Continue Feature\"\n },\n \"improve\": {\n \"description\": \"Small improvements or enhancements\",\n \"title\": \"Improvements\"\n }\n }\n }\n },\n \"lint-staged\": {\n \"*.{ts,tsx}\": [\n \"eslint --fix\",\n \"prettier --write\",\n \"cspell --no-must-find-files\"\n ],\n \"*.{json,md}\": [\n \"prettier --write\",\n \"cspell --no-must-find-files\"\n ]\n }\n}\n","import { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface PreviewErrorBoundaryProps {\n children: ReactNode;\n}\n\ninterface PreviewErrorBoundaryState {\n error: Error | null;\n}\n\nexport class PreviewErrorBoundary extends Component<\n PreviewErrorBoundaryProps,\n PreviewErrorBoundaryState\n> {\n state: PreviewErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): PreviewErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(_error: Error, _info: ErrorInfo): void {\n // The visible diagnostic is the local preview's reporting boundary.\n }\n\n render(): ReactNode {\n if (this.state.error !== null) {\n return (\n <div className=\"tap-preview-message\" role=\"alert\">\n <strong>The contribution could not render.</strong>\n <span>{this.state.error.message}</span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","import type {\n TapPageProps,\n TapRowActionProps,\n TapSettingsProps,\n TapSettingsValues,\n TapTabProps,\n TapWidgetProps,\n} from '../../client/types';\nimport { uiContributions } from '../../manifest/define';\nimport type {\n ExposableKind,\n ExtensionManifest,\n UiContributionRef,\n} from '../../manifest/types';\nimport { fixtureKeywords } from '../../testing/fixtures';\n\nexport interface PreviewSelection {\n contribution: UiContributionRef;\n label: string;\n}\n\nexport interface PreviewState {\n settings: TapSettingsValues;\n onSettingsChange(values: TapSettingsValues): void;\n}\n\nexport type PreviewProps =\n | TapWidgetProps\n | TapTabProps\n | TapPageProps\n | TapRowActionProps\n | TapSettingsProps;\n\nconst kindLabel: Record<ExposableKind, string> = {\n page: 'page',\n tab: 'tab',\n widget: 'widget',\n rowAction: 'row action',\n settings: 'settings',\n};\n\nfunction titleByExpose(manifest: ExtensionManifest): Map<string, string> {\n const titles = new Map<string, string>();\n const contributes = manifest.contributes;\n\n for (const page of contributes.pages ?? []) {\n titles.set(`./pages/${page.id}`, page.title);\n }\n for (const tab of contributes.tabs ?? []) {\n titles.set(`./tabs/${tab.id}`, tab.title);\n }\n for (const widget of contributes.widgets ?? []) {\n titles.set(`./widgets/${widget.id}`, widget.title);\n }\n for (const action of contributes.rowActions ?? []) {\n titles.set(`./rowActions/${action.id}`, action.title);\n }\n if (contributes.settings) titles.set('./settings', 'Settings');\n\n return titles;\n}\n\nexport function previewSelections(\n manifest: ExtensionManifest,\n): PreviewSelection[] {\n const titles = titleByExpose(manifest);\n return uiContributions(manifest).map(contribution => {\n const title = titles.get(contribution.expose) ?? contribution.id;\n return {\n contribution,\n label:\n contribution.kind === 'settings'\n ? title\n : `${title} (${kindLabel[contribution.kind]})`,\n };\n });\n}\n\nexport function previewProps(\n contribution: UiContributionRef,\n state: PreviewState,\n): PreviewProps {\n switch (contribution.kind) {\n case 'page':\n return { params: { pageId: contribution.id, path: '/' } };\n case 'tab':\n return {};\n case 'widget':\n return { config: {} };\n case 'rowAction':\n return { row: { ...fixtureKeywords[0] } };\n case 'settings':\n return {\n values: state.settings,\n onChange: values => state.onSettingsChange(values),\n };\n }\n}\n\nexport function previewTopology(manifest: ExtensionManifest): string {\n return uiContributions(manifest)\n .map(({ kind, id, expose, entry }) =>\n JSON.stringify({ kind, id, expose, entry }),\n )\n .sort()\n .join('\\n');\n}\n","export const previewStyles = `\n:root {\n color-scheme: light;\n font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background: #f2f3ee;\n color: #121212;\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n}\n* { box-sizing: border-box; }\nbody { margin: 0; min-width: 320px; background: #f2f3ee; }\nbutton, select { font: inherit; }\n.tap-preview {\n --preview-canvas: #f2f3ee;\n --preview-paper: #fdfdfd;\n --preview-ink: #121212;\n --preview-muted: #686b66;\n --preview-border: #d5d7d1;\n --preview-control: #f7f8f4;\n --preview-green: #235027;\n min-height: 100vh;\n display: grid;\n grid-template-rows: auto 1fr;\n background: var(--preview-canvas);\n color: var(--preview-ink);\n}\n.tap-preview[data-theme=\"dark\"] {\n color-scheme: dark;\n --preview-canvas: #111216;\n --preview-paper: #181920;\n --preview-ink: #f4f5f1;\n --preview-muted: #a7aaa4;\n --preview-border: #303239;\n --preview-control: #202229;\n --preview-green: #b4d773;\n}\n.tap-preview-bar {\n min-height: 68px;\n display: flex;\n gap: 24px;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--preview-border);\n background: var(--preview-paper);\n}\n.tap-preview-brand { min-width: 210px; margin-right: auto; display: flex; align-items: center; gap: 10px; }\n.tap-preview-brand img { width: 36px; height: 36px; flex: 0 0 auto; object-fit: cover; border: 1px solid var(--preview-border); border-radius: 8px; background: #fff; }\n.tap-preview-brand strong, .tap-preview-brand span { display: block; }\n.tap-preview-brand strong { font-size: 14px; font-weight: 650; letter-spacing: -0.01em; }\n.tap-preview-brand span { margin-top: 2px; color: var(--preview-muted); font-size: 11px; }\n.tap-preview-brand i { width: 6px; height: 6px; display: inline-block; margin-right: 6px; border-radius: 50%; background: #64a75f; box-shadow: 0 0 0 2px rgb(100 167 95 / 14%); }\n.tap-preview-controls { display: flex; align-items: end; gap: 8px; }\n.tap-preview-field { min-width: 104px; display: grid; gap: 4px; color: var(--preview-muted); font-size: 10px; font-weight: 600; letter-spacing: 0.045em; text-transform: uppercase; }\n.tap-preview-field--contribution { min-width: 190px; }\n.tap-preview-field select, .tap-preview-reset {\n height: 32px;\n border: 1px solid var(--preview-border);\n border-radius: 6px;\n outline: none;\n background: var(--preview-control);\n color: var(--preview-ink);\n font-size: 12px;\n font-weight: 500;\n letter-spacing: normal;\n text-transform: none;\n}\n.tap-preview-field select { width: 100%; padding: 0 28px 0 9px; cursor: pointer; }\n.tap-preview-field select:focus, .tap-preview-reset:focus-visible { border-color: var(--preview-green); box-shadow: 0 0 0 2px color-mix(in srgb, var(--preview-green) 18%, transparent); }\n.tap-preview-reset { padding: 0 12px; cursor: pointer; }\n.tap-preview-reset:hover { border-color: color-mix(in srgb, var(--preview-ink) 34%, var(--preview-border)); background: var(--preview-paper); }\n.tap-preview-stage { min-width: 0; padding: 22px 24px 14px; overflow: auto; }\n.tap-preview-canvas {\n width: 100%;\n max-width: 1440px;\n height: max(380px, calc(100vh - 118px));\n margin: 0 auto;\n border: 1px solid var(--preview-border);\n border-radius: 8px;\n overflow: hidden;\n background: var(--preview-paper);\n color: var(--preview-ink);\n box-shadow: 0 2px 8px rgb(20 24 18 / 5%);\n transition: max-width 160ms ease;\n}\n.tap-preview-canvas[data-viewport=\"tablet\"] { max-width: 768px; }\n.tap-preview-canvas[data-viewport=\"mobile\"] { max-width: 390px; }\n.tap-preview-canvas[data-size=\"slot\"] { width: min(100%, 680px); height: 380px; }\n.tap-preview-canvas[data-size=\"panel\"] { width: min(100%, 960px); height: clamp(420px, calc(100vh - 118px), 620px); }\n.tap-preview-canvas[data-size=\"page\"] { height: max(380px, calc(100vh - 118px)); }\n.tap-preview-surface { display: block; height: 100%; min-height: 0; }\n.tap-preview-message { min-height: 360px; display: grid; place-content: center; gap: 8px; padding: 32px; text-align: center; }\n.tap-preview-message span { max-width: 62ch; color: var(--preview-muted); }\n@media (max-width: 640px) {\n .tap-preview-stage { padding: 12px; }\n .tap-preview-bar { align-items: flex-start; padding: 12px; }\n .tap-preview-brand { min-width: 0; }\n .tap-preview-controls { width: 100%; overflow-x: auto; padding-bottom: 2px; }\n .tap-preview-field { min-width: 100px; }\n .tap-preview-field--contribution { min-width: 180px; }\n}\n@media (max-width: 900px) {\n .tap-preview-bar { flex-wrap: wrap; gap: 12px; }\n .tap-preview-controls { flex: 1 1 100%; }\n}\n`;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/extension-sdk/extension-sdk/dist/vite-preview.cjs","../src/vite-preview.tsx","../src/vite/preview/client.tsx","../package.json","../src/vite/preview/error-boundary.tsx","../src/vite/preview/model.ts","../src/vite/preview/styles.ts"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/extension-sdk/extension-sdk/dist/vite-preview.cjs","sourcesContent":[null,"import { createRoot } from 'react-dom/client';\nimport { LocalPreview, type LocalPreviewOptions } from './vite/preview/client';\n\nexport {\n componentFromModule,\n loadContribution,\n LocalPreview,\n} from './vite/preview/client';\nexport type {\n LocalPreviewOptions,\n LocalPreviewProps,\n PreviewLoadRequest,\n PreviewModuleLoader,\n} from './vite/preview/client';\n\nexport function mountLocalPreview({\n manifest,\n remote,\n mount,\n}: LocalPreviewOptions): () => void {\n const root = createRoot(mount);\n root.render(<LocalPreview manifest={manifest} remote={remote} />);\n return () => root.unmount();\n}\n","import type { ModuleFederation } from '@module-federation/runtime';\nimport * as TanstackQuery from '@tanstack/react-query';\nimport * as React from 'react';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n} from 'react';\nimport * as ReactDom from 'react-dom';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport packageJson from '../../../package.json';\nimport type { TapSettingsValues, TapSize } from '../../client/types';\nimport { TapHostProvider, createHostQueryClient } from '../../host/provider';\nimport * as TappifySdk from '../../index';\nimport { remoteName } from '../../manifest/define';\nimport type { ExtensionManifest } from '../../manifest/types';\nimport { fixtures } from '../../testing/fixtures';\nimport { createTapMock } from '../../testing/mock';\nimport { PreviewErrorBoundary } from './error-boundary';\nimport { previewProps, previewSelections } from './model';\nimport { previewStyles } from './styles';\n\nexport interface PreviewLoadRequest {\n extensionId: string;\n remote: string;\n expose: string;\n}\n\nexport type PreviewModuleLoader = (\n request: PreviewLoadRequest,\n) => Promise<unknown>;\n\nexport interface LocalPreviewOptions {\n manifest: ExtensionManifest;\n remote: string;\n mount: HTMLElement;\n}\n\nexport interface LocalPreviewProps {\n manifest: ExtensionManifest;\n remote: string;\n loader?: PreviewModuleLoader;\n}\n\ntype Theme = 'light' | 'dark';\ntype Viewport = 'desktop' | 'tablet' | 'mobile';\n\ntype LoadState =\n | { key: string; status: 'loading' }\n | {\n key: string;\n status: 'ready';\n Component: ComponentType<Record<string, unknown>>;\n styles: string[];\n }\n | { key: string; status: 'failed'; message: string };\n\nconst SINGLETON = { singleton: true, requiredVersion: false } as const;\nconst federationInstances = new Map<string, Promise<ModuleFederation>>();\nlet federationSequence = 0;\n\nasync function federationFor(\n extensionId: string,\n remote: string,\n): Promise<ModuleFederation> {\n const key = `${extensionId}|${remote}`;\n const existing = federationInstances.get(key);\n if (existing !== undefined) return existing;\n\n federationSequence += 1;\n const name = remoteName(extensionId);\n const created = import('@module-federation/runtime').then(\n ({ createInstance }) =>\n createInstance({\n name: `tappify_local_preview_${String(federationSequence)}`,\n remotes: [{ name, alias: name, entry: remote, type: 'module' }],\n shared: {\n react: {\n version: React.version,\n lib: () => React,\n shareConfig: SINGLETON,\n },\n 'react-dom': {\n version: ReactDom.version,\n lib: () => ReactDom,\n shareConfig: SINGLETON,\n },\n 'react/jsx-runtime': {\n version: React.version,\n lib: () => JsxRuntime,\n shareConfig: SINGLETON,\n },\n '@tanstack/react-query': {\n version: packageJson.peerDependencies[\n '@tanstack/react-query'\n ].replace(/^[^\\d]*/, ''),\n lib: () => TanstackQuery,\n shareConfig: SINGLETON,\n },\n '@tappify/extension-sdk': {\n version: packageJson.version,\n lib: () => TappifySdk,\n shareConfig: SINGLETON,\n },\n },\n }),\n );\n federationInstances.set(key, created);\n return created;\n}\n\nexport function componentFromModule(\n module: unknown,\n expose: string,\n): ComponentType<Record<string, unknown>> {\n const candidate =\n typeof module === 'object' && module !== null && 'default' in module\n ? (module as { default: unknown }).default\n : module;\n if (typeof candidate !== 'function') {\n throw new Error(\n `${expose} did not default-export a React component. Export the contribution component as default.`,\n );\n }\n return candidate as ComponentType<Record<string, unknown>>;\n}\n\nfunction stylesFromModule(module: unknown): string[] {\n if (\n typeof module !== 'object' ||\n module === null ||\n !('styles' in module) ||\n !Array.isArray(module.styles)\n ) {\n return [];\n }\n return module.styles.filter(\n (style): style is string => typeof style === 'string',\n );\n}\n\nexport async function loadContribution({\n extensionId,\n remote,\n expose,\n}: PreviewLoadRequest): Promise<unknown> {\n const federation = await federationFor(extensionId, remote);\n return federation.loadRemote(\n `${remoteName(extensionId)}/${expose.replace(/^\\.\\//, '')}`,\n );\n}\n\nfunction isExternalRemote(remote: string): boolean {\n try {\n const host = new URL(remote).hostname;\n return host !== 'localhost' && host !== '127.0.0.1' && host !== '[::1]';\n } catch {\n return true;\n }\n}\n\nfunction localProcedureStubs(\n manifest: ExtensionManifest,\n): Record<string, () => never> {\n return Object.fromEntries(\n Object.keys(manifest.server?.procedures ?? {}).map(name => [\n name,\n () => {\n throw new Error(\n 'This view needs live server data. Run tappify extension dev --live to connect it.',\n );\n },\n ]),\n );\n}\n\nfunction Message({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"tap-preview-message\" role=\"status\">\n <h2>{title}</h2>\n <span>{children}</span>\n </div>\n );\n}\n\ninterface PreviewShadowNodes {\n root: ShadowRoot;\n content: HTMLElement;\n}\n\nfunction PreviewSurface({\n portal,\n styles,\n children,\n}: {\n portal: HTMLElement;\n styles: string[];\n children: React.ReactNode;\n}) {\n const [nodes, setNodes] = useState<PreviewShadowNodes | null>(null);\n const attachHost = useCallback((host: HTMLDivElement | null): void => {\n if (host === null) return;\n const root = host.shadowRoot ?? host.attachShadow({ mode: 'open' });\n let content = root.querySelector<HTMLElement>('[data-tap-content]');\n if (content === null) {\n content = document.createElement('div');\n content.className = 'tap-root';\n content.setAttribute('data-tap-content', '');\n root.appendChild(content);\n }\n setNodes({ root, content });\n }, []);\n\n useEffect(() => {\n if (nodes === null) return;\n nodes.root.appendChild(portal);\n return () => portal.remove();\n }, [nodes, portal]);\n\n useEffect(() => {\n if (nodes === null) return;\n const injected: HTMLStyleElement[] = [];\n const inject = (kind: string, css: string): void => {\n const element = document.createElement('style');\n element.setAttribute('data-tap-style', kind);\n element.textContent = css;\n nodes.root.insertBefore(element, nodes.content);\n injected.push(element);\n };\n\n inject(\n 'preview',\n ':host { display: block; height: 100%; min-height: 0; overflow: auto; } .tap-root { box-sizing: border-box; height: 100%; min-height: 100%; padding: 24px; }',\n );\n for (const css of styles) inject('remote', css);\n return () => {\n for (const element of injected) element.remove();\n };\n }, [nodes, styles]);\n\n return (\n <div\n ref={attachHost}\n className=\"tap-preview-surface\"\n data-tap-preview-surface\n >\n {nodes === null ? null : ReactDom.createPortal(children, nodes.content)}\n </div>\n );\n}\n\nexport function LocalPreview({\n manifest,\n remote,\n loader = loadContribution,\n}: LocalPreviewProps) {\n const selections = useMemo(() => previewSelections(manifest), [manifest]);\n const [expose, setExpose] = useState(\n selections[0]?.contribution.expose ?? '',\n );\n const [theme, setTheme] = useState<Theme>('light');\n const [viewport, setViewport] = useState<Viewport>('desktop');\n const [size, setSize] = useState<TapSize>('slot');\n const [generation, setGeneration] = useState(0);\n const [settings, setSettings] = useState<TapSettingsValues>({});\n const [loaded, setLoaded] = useState<LoadState>({\n key: '',\n status: 'loading',\n });\n\n const selection =\n selections.find(item => item.contribution.expose === expose) ??\n selections[0];\n const contribution = selection?.contribution;\n const loadKey = `${remote}|${contribution?.expose ?? ''}`;\n\n useEffect(() => {\n if (contribution === undefined) return;\n let cancelled = false;\n setLoaded({ key: loadKey, status: 'loading' });\n void loader({\n extensionId: manifest.id,\n remote,\n expose: contribution.expose,\n })\n .then(module => {\n if (cancelled) return;\n setLoaded({\n key: loadKey,\n status: 'ready',\n Component: componentFromModule(module, contribution.expose),\n styles: stylesFromModule(module),\n });\n })\n .catch((error: unknown) => {\n if (cancelled) return;\n setLoaded({\n key: loadKey,\n status: 'failed',\n message:\n error instanceof Error\n ? error.message\n : 'The remote entry could not be loaded.',\n });\n });\n return () => {\n cancelled = true;\n };\n }, [contribution, loadKey, loader, manifest.id, remote]);\n\n const host = useMemo(() => {\n void generation;\n return createTapMock({\n extensionId: manifest.id,\n extensionName: manifest.name,\n project: fixtures.project.project,\n theme,\n size,\n server: localProcedureStubs(manifest),\n });\n }, [generation, manifest, size, theme]);\n const queryClient = useMemo(() => {\n void generation;\n return createHostQueryClient();\n }, [generation]);\n\n const current: LoadState =\n loaded.key === loadKey ? loaded : { key: loadKey, status: 'loading' };\n\n let content: React.ReactNode;\n if (contribution === undefined) {\n content = (\n <Message title=\"No UI contributions\">\n Run `tappify extension add` and choose a page, tab, widget, row action,\n or settings panel.\n </Message>\n );\n } else if (current.status === 'failed') {\n content = (\n <div className=\"tap-preview-message\" role=\"alert\">\n <strong>The remote entry could not load.</strong>\n <span>{current.message}</span>\n </div>\n );\n } else if (current.status === 'ready') {\n const Component = current.Component;\n const props = previewProps(contribution, {\n settings,\n onSettingsChange: setSettings,\n });\n content = (\n <TapHostProvider tap={host.tap} queryClient={queryClient}>\n <PreviewSurface portal={host.portal} styles={current.styles}>\n <PreviewErrorBoundary key={`${loadKey}|${String(generation)}`}>\n <Component {...props} />\n </PreviewErrorBoundary>\n </PreviewSurface>\n </TapHostProvider>\n );\n } else {\n content = (\n <Message title=\"Loading contribution\">Loading {selection.label}.</Message>\n );\n }\n\n return (\n <main className=\"tap-preview\" data-theme={theme}>\n <style>{previewStyles}</style>\n <header className=\"tap-preview-bar\">\n <div className=\"tap-preview-brand\">\n <img src={`/${manifest.icon.replace(/^\\.\\//, '')}`} alt=\"\" />\n <div>\n <strong>{manifest.name}</strong>\n <span>\n <i aria-hidden=\"true\" />\n {isExternalRemote(remote) ? 'External remote' : 'Local preview'}\n {' · Fixture data'}\n </span>\n </div>\n </div>\n <div className=\"tap-preview-controls\">\n {selections.length > 0 ? (\n <label className=\"tap-preview-field tap-preview-field--contribution\">\n <span>Contribution</span>\n <select\n value={contribution?.expose ?? ''}\n onChange={event => setExpose(event.target.value)}\n >\n {selections.map(item => (\n <option\n key={item.contribution.expose}\n value={item.contribution.expose}\n >\n {item.label}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n <label className=\"tap-preview-field\">\n <span>Theme</span>\n <select\n value={theme}\n onChange={event => setTheme(event.target.value as Theme)}\n >\n <option value=\"light\">Light</option>\n <option value=\"dark\">Dark</option>\n </select>\n </label>\n <label className=\"tap-preview-field\">\n <span>Viewport</span>\n <select\n value={viewport}\n onChange={event => setViewport(event.target.value as Viewport)}\n >\n <option value=\"desktop\">Desktop</option>\n <option value=\"tablet\">Tablet</option>\n <option value=\"mobile\">Mobile</option>\n </select>\n </label>\n <label className=\"tap-preview-field\">\n <span>Surface</span>\n <select\n value={size}\n aria-label=\"Surface size\"\n onChange={event => setSize(event.target.value as TapSize)}\n >\n <option value=\"slot\">Slot</option>\n <option value=\"panel\">Panel</option>\n <option value=\"page\">Page</option>\n </select>\n </label>\n <button\n className=\"tap-preview-reset\"\n type=\"button\"\n aria-label=\"Reset fixtures\"\n onClick={() => {\n setSettings({});\n setGeneration(value => value + 1);\n }}\n >\n Reset\n </button>\n </div>\n </header>\n <section className=\"tap-preview-stage\">\n <div\n className=\"tap-preview-canvas\"\n data-viewport={viewport}\n data-size={size}\n aria-label=\"Preview canvas\"\n >\n {content}\n </div>\n </section>\n </main>\n );\n}\n","{\n \"name\": \"@tappify/extension-sdk\",\n \"version\": \"2.1.0-beta.4\",\n \"description\": \"Build extensions that run inside Tappify\",\n \"author\": \"Tappify Team\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./manifest\": {\n \"types\": \"./dist/manifest.d.ts\",\n \"import\": \"./dist/manifest.mjs\",\n \"require\": \"./dist/manifest.cjs\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.mjs\",\n \"require\": \"./dist/server.cjs\"\n },\n \"./host\": {\n \"types\": \"./dist/host.d.ts\",\n \"import\": \"./dist/host.mjs\",\n \"require\": \"./dist/host.cjs\"\n },\n \"./ui\": {\n \"types\": \"./dist/ui.d.ts\",\n \"import\": \"./dist/ui.mjs\",\n \"require\": \"./dist/ui.cjs\"\n },\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.mjs\",\n \"require\": \"./dist/vite.cjs\"\n },\n \"./vite/preview\": {\n \"types\": \"./dist/vite-preview.d.ts\",\n \"import\": \"./dist/vite-preview.mjs\",\n \"require\": \"./dist/vite-preview.cjs\"\n },\n \"./vite/preview/bootstrap\": {\n \"types\": \"./dist/vite-preview-bootstrap.d.ts\",\n \"import\": \"./dist/vite-preview-bootstrap.mjs\",\n \"require\": \"./dist/vite-preview-bootstrap.cjs\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing/index.d.ts\",\n \"import\": \"./dist/testing/index.mjs\",\n \"require\": \"./dist/testing/index.cjs\"\n },\n \"./testing/vitest\": {\n \"types\": \"./dist/testing/vitest.d.ts\",\n \"import\": \"./dist/testing/vitest.mjs\",\n \"require\": \"./dist/testing/vitest.cjs\"\n },\n \"./testing/jest\": {\n \"types\": \"./dist/testing/jest.d.ts\",\n \"import\": \"./dist/testing/jest.mjs\",\n \"require\": \"./dist/testing/jest.cjs\"\n },\n \"./codegen\": {\n \"types\": \"./dist/codegen.d.ts\",\n \"import\": \"./dist/codegen.mjs\",\n \"require\": \"./dist/codegen.cjs\"\n },\n \"./ui/styles.css\": \"./dist/ui/styles.css\",\n \"./schema/extension-v2.json\": \"./schema/extension-v2.json\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": [\n \"*.css\",\n \"./dist/testing/vitest.*\",\n \"./dist/testing/jest.*\"\n ],\n \"files\": [\n \"dist\",\n \"schema\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tappify-dev/extension-sdk.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/tappify-dev/extension-sdk/issues\"\n },\n \"homepage\": \"https://docs.tappify.ai/extensions\",\n \"keywords\": [\n \"tappify\",\n \"extension\",\n \"extension-sdk\",\n \"react\",\n \"module-federation\"\n ],\n \"scripts\": {\n \"build\": \"rm -rf dist && tsup && node scripts/copy-styles.mjs\",\n \"build:schema\": \"tsx scripts/build-json-schema.ts\",\n \"build:manifest-reference\": \"tsx scripts/build-manifest-reference.ts\",\n \"build:api-reference\": \"tsx scripts/build-api-reference.ts\",\n \"check:hosted-schema\": \"node scripts/check-hosted-schema.mjs\",\n \"docs:examples\": \"tsx scripts/check-tsdoc-examples.ts && tsc -p tsconfig.examples.json\",\n \"docs:validate\": \"typedoc --options typedoc.frontend.json --emit none && typedoc --options typedoc.server.json --emit none && typedoc --options typedoc.testing.json --emit none\",\n \"docs:reference\": \"pnpm docs:examples && pnpm docs:validate && pnpm build:schema && pnpm build:manifest-reference && pnpm build:api-reference\",\n \"dev\": \"tsup --watch\",\n \"type-check\": \"tsc --noEmit\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,mjs,cjs}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,mjs,cjs}\\\"\",\n \"lint\": \"eslint \\\"{src,test}/**/*.{ts,tsx}\\\" --fix\",\n \"test\": \"vitest run --passWithNoTests --coverage\",\n \"test:watch\": \"vitest --watch\",\n \"prepare\": \"husky\",\n \"commit\": \"cz\",\n \"prepublishOnly\": \"npm run build && npm test\",\n \"spellcheck\": \"cspell \\\"src/**/*.{ts,tsx}\\\" \\\"test/**/*.{ts,tsx}\\\" \\\"*.{json,md,yml,mjs,cjs}\\\" \\\".github/**/*.yml\\\"\",\n \"semantic-release\": \"semantic-release\"\n },\n \"peerDependencies\": {\n \"@module-federation/vite\": \">=1.16.0\",\n \"@tanstack/react-query\": \"^5.100.0\",\n \"@testing-library/react\": \">=16.0.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"vite\": \">=8.0.0\",\n \"vitest\": \">=3.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@module-federation/vite\": {\n \"optional\": true\n },\n \"@tanstack/react-query\": {\n \"optional\": true\n },\n \"@testing-library/react\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n },\n \"react-dom\": {\n \"optional\": true\n },\n \"vite\": {\n \"optional\": true\n },\n \"vitest\": {\n \"optional\": true\n }\n },\n \"dependencies\": {\n \"@module-federation/runtime\": \"~2.5.1\",\n \"clsx\": \"^2.1.1\",\n \"jose\": \"^6.2.12\",\n \"json-schema-to-typescript\": \"^16.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@commitlint/cli\": \"^20.4.3\",\n \"@commitlint/config-conventional\": \"^20.4.3\",\n \"@eslint/js\": \"^10.0.1\",\n \"@module-federation/vite\": \"~1.16.0\",\n \"@semantic-release/changelog\": \"^6.0.3\",\n \"@semantic-release/commit-analyzer\": \"^13.0.1\",\n \"@semantic-release/git\": \"^10.0.1\",\n \"@semantic-release/github\": \"^12.0.6\",\n \"@semantic-release/npm\": \"^13.1.5\",\n \"@semantic-release/release-notes-generator\": \"^14.1.0\",\n \"@tanstack/react-query\": \"^5.100.14\",\n \"@testing-library/jest-dom\": \"^6.6.3\",\n \"@testing-library/react\": \"^16.1.0\",\n \"@testing-library/user-event\": \"^14.5.2\",\n \"@types/json-schema\": \"^7.0.15\",\n \"@types/node\": \"^22.13.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.2.7\",\n \"@vitest/coverage-v8\": \"^3.0.0\",\n \"commitizen\": \"^4.3.1\",\n \"conventional-changelog-conventionalcommits\": \"^9.3.0\",\n \"cspell\": \"^9.7.0\",\n \"cz-conventional-changelog\": \"^3.3.0\",\n \"eslint\": \"^10.0.2\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"eslint-plugin-prettier\": \"^5.5.5\",\n \"eslint-plugin-react\": \"^7.37.0\",\n \"eslint-plugin-react-hooks\": \"^5.1.0\",\n \"globals\": \"^17.4.0\",\n \"happy-dom\": \"^17.0.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^16.3.2\",\n \"prettier\": \"^3.8.1\",\n \"prettier-plugin-organize-imports\": \"^4.3.0\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"semantic-release\": \"^25.0.3\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.20.0\",\n \"typedoc\": \"^0.28.20\",\n \"typedoc-plugin-markdown\": \"^4.13.0\",\n \"typescript\": \"^5.7.0\",\n \"typescript-eslint\": \"^8.56.1\",\n \"vite\": \"^8.0.14\",\n \"vitest\": \"^3.0.0\"\n },\n \"config\": {\n \"commitizen\": {\n \"path\": \"cz-conventional-changelog\",\n \"types\": {\n \"feat\": {\n \"description\": \"New feature\",\n \"title\": \"Features\"\n },\n \"fix\": {\n \"description\": \"Bug fix\",\n \"title\": \"Fixes\"\n },\n \"docs\": {\n \"description\": \"Documentation changes\",\n \"title\": \"Documentation\"\n },\n \"style\": {\n \"description\": \"Code style changes (formatting, etc.)\",\n \"title\": \"Styles\"\n },\n \"refactor\": {\n \"description\": \"Code refactoring\",\n \"title\": \"Refactoring\"\n },\n \"perf\": {\n \"description\": \"Performance improvements\",\n \"title\": \"Performance\"\n },\n \"test\": {\n \"description\": \"Adding or updating tests\",\n \"title\": \"Tests\"\n },\n \"build\": {\n \"description\": \"Build system or dependencies\",\n \"title\": \"Build\"\n },\n \"ci\": {\n \"description\": \"CI/CD changes\",\n \"title\": \"CI/CD\"\n },\n \"chore\": {\n \"description\": \"Chore\",\n \"title\": \"Chores\"\n },\n \"revert\": {\n \"description\": \"Revert previous commit\",\n \"title\": \"Reverts\"\n },\n \"wip\": {\n \"description\": \"Work in progress / continuing a feature\",\n \"title\": \"Work in Progress\"\n },\n \"cont\": {\n \"description\": \"Continue/complete a feature\",\n \"title\": \"Continue Feature\"\n },\n \"improve\": {\n \"description\": \"Small improvements or enhancements\",\n \"title\": \"Improvements\"\n }\n }\n }\n },\n \"lint-staged\": {\n \"*.{ts,tsx}\": [\n \"eslint --fix\",\n \"prettier --write\",\n \"cspell --no-must-find-files\"\n ],\n \"*.{json,md}\": [\n \"prettier --write\",\n \"cspell --no-must-find-files\"\n ]\n }\n}\n","import { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface PreviewErrorBoundaryProps {\n children: ReactNode;\n}\n\ninterface PreviewErrorBoundaryState {\n error: Error | null;\n}\n\nexport class PreviewErrorBoundary extends Component<\n PreviewErrorBoundaryProps,\n PreviewErrorBoundaryState\n> {\n state: PreviewErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): PreviewErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(_error: Error, _info: ErrorInfo): void {\n // The visible diagnostic is the local preview's reporting boundary.\n }\n\n render(): ReactNode {\n if (this.state.error !== null) {\n return (\n <div className=\"tap-preview-message\" role=\"alert\">\n <strong>The contribution could not render.</strong>\n <span>{this.state.error.message}</span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","import type {\n TapPageProps,\n TapRowActionProps,\n TapSettingsProps,\n TapSettingsValues,\n TapTabProps,\n TapWidgetProps,\n} from '../../client/types';\nimport { uiContributions } from '../../manifest/define';\nimport type {\n ExposableKind,\n ExtensionManifest,\n UiContributionRef,\n} from '../../manifest/types';\nimport { fixtureKeywords } from '../../testing/fixtures';\n\nexport interface PreviewSelection {\n contribution: UiContributionRef;\n label: string;\n}\n\nexport interface PreviewState {\n settings: TapSettingsValues;\n onSettingsChange(values: TapSettingsValues): void;\n}\n\nexport type PreviewProps =\n | TapWidgetProps\n | TapTabProps\n | TapPageProps\n | TapRowActionProps\n | TapSettingsProps;\n\nconst kindLabel: Record<ExposableKind, string> = {\n page: 'page',\n tab: 'tab',\n widget: 'widget',\n rowAction: 'row action',\n settings: 'settings',\n};\n\nfunction titleByExpose(manifest: ExtensionManifest): Map<string, string> {\n const titles = new Map<string, string>();\n const contributes = manifest.contributes;\n\n for (const page of contributes.pages ?? []) {\n titles.set(`./pages/${page.id}`, page.title);\n }\n for (const tab of contributes.tabs ?? []) {\n titles.set(`./tabs/${tab.id}`, tab.title);\n }\n for (const widget of contributes.widgets ?? []) {\n titles.set(`./widgets/${widget.id}`, widget.title);\n }\n for (const action of contributes.rowActions ?? []) {\n titles.set(`./rowActions/${action.id}`, action.title);\n }\n if (contributes.settings) titles.set('./settings', 'Settings');\n\n return titles;\n}\n\nexport function previewSelections(\n manifest: ExtensionManifest,\n): PreviewSelection[] {\n const titles = titleByExpose(manifest);\n return uiContributions(manifest).map(contribution => {\n const title = titles.get(contribution.expose) ?? contribution.id;\n return {\n contribution,\n label:\n contribution.kind === 'settings'\n ? title\n : `${title} (${kindLabel[contribution.kind]})`,\n };\n });\n}\n\nexport function previewProps(\n contribution: UiContributionRef,\n state: PreviewState,\n): PreviewProps {\n switch (contribution.kind) {\n case 'page':\n return { params: { pageId: contribution.id, path: '/' } };\n case 'tab':\n return {};\n case 'widget':\n return { config: {} };\n case 'rowAction':\n return { row: { ...fixtureKeywords[0] } };\n case 'settings':\n return {\n values: state.settings,\n onChange: values => state.onSettingsChange(values),\n };\n }\n}\n\nexport function previewTopology(manifest: ExtensionManifest): string {\n return uiContributions(manifest)\n .map(({ kind, id, expose, entry }) =>\n JSON.stringify({ kind, id, expose, entry }),\n )\n .sort()\n .join('\\n');\n}\n","export const previewStyles = `\n:root {\n color-scheme: light;\n font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background: #f2f3ee;\n color: #121212;\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n}\n* { box-sizing: border-box; }\nbody { margin: 0; min-width: 320px; background: #f2f3ee; }\nbutton, select { font: inherit; }\n.tap-preview {\n --preview-canvas: #f2f3ee;\n --preview-paper: #fdfdfd;\n --preview-ink: #121212;\n --preview-muted: #686b66;\n --preview-border: #d5d7d1;\n --preview-control: #f7f8f4;\n --preview-green: #235027;\n min-height: 100vh;\n display: grid;\n grid-template-rows: auto 1fr;\n background: var(--preview-canvas);\n color: var(--preview-ink);\n}\n.tap-preview[data-theme=\"dark\"] {\n color-scheme: dark;\n --preview-canvas: #111216;\n --preview-paper: #181920;\n --preview-ink: #f4f5f1;\n --preview-muted: #a7aaa4;\n --preview-border: #303239;\n --preview-control: #202229;\n --preview-green: #b4d773;\n}\n.tap-preview-bar {\n min-height: 68px;\n display: flex;\n gap: 24px;\n align-items: center;\n padding: 12px 20px;\n border-bottom: 1px solid var(--preview-border);\n background: var(--preview-paper);\n}\n.tap-preview-brand { min-width: 210px; margin-right: auto; display: flex; align-items: center; gap: 10px; }\n.tap-preview-brand img { width: 36px; height: 36px; flex: 0 0 auto; object-fit: cover; border: 1px solid var(--preview-border); border-radius: 8px; background: #fff; }\n.tap-preview-brand strong, .tap-preview-brand span { display: block; }\n.tap-preview-brand strong { font-size: 14px; font-weight: 650; letter-spacing: -0.01em; }\n.tap-preview-brand span { margin-top: 2px; color: var(--preview-muted); font-size: 11px; }\n.tap-preview-brand i { width: 6px; height: 6px; display: inline-block; margin-right: 6px; border-radius: 50%; background: #64a75f; box-shadow: 0 0 0 2px rgb(100 167 95 / 14%); }\n.tap-preview-controls { display: flex; align-items: end; gap: 8px; }\n.tap-preview-field { min-width: 104px; display: grid; gap: 4px; color: var(--preview-muted); font-size: 10px; font-weight: 600; letter-spacing: 0.045em; text-transform: uppercase; }\n.tap-preview-field--contribution { min-width: 190px; }\n.tap-preview-field select, .tap-preview-reset {\n height: 32px;\n border: 1px solid var(--preview-border);\n border-radius: 6px;\n outline: none;\n background: var(--preview-control);\n color: var(--preview-ink);\n font-size: 12px;\n font-weight: 500;\n letter-spacing: normal;\n text-transform: none;\n}\n.tap-preview-field select { width: 100%; padding: 0 28px 0 9px; cursor: pointer; }\n.tap-preview-field select:focus, .tap-preview-reset:focus-visible { border-color: var(--preview-green); box-shadow: 0 0 0 2px color-mix(in srgb, var(--preview-green) 18%, transparent); }\n.tap-preview-reset { padding: 0 12px; cursor: pointer; }\n.tap-preview-reset:hover { border-color: color-mix(in srgb, var(--preview-ink) 34%, var(--preview-border)); background: var(--preview-paper); }\n.tap-preview-stage { min-width: 0; padding: 22px 24px 14px; overflow: auto; }\n.tap-preview-canvas {\n width: 100%;\n max-width: 1440px;\n height: max(380px, calc(100vh - 118px));\n margin: 0 auto;\n border: 1px solid var(--preview-border);\n border-radius: 8px;\n overflow: hidden;\n background: var(--preview-paper);\n color: var(--preview-ink);\n box-shadow: 0 2px 8px rgb(20 24 18 / 5%);\n transition: max-width 160ms ease;\n}\n.tap-preview-canvas[data-viewport=\"tablet\"] { max-width: 768px; }\n.tap-preview-canvas[data-viewport=\"mobile\"] { max-width: 390px; }\n.tap-preview-canvas[data-size=\"slot\"] { width: min(100%, 680px); height: 380px; }\n.tap-preview-canvas[data-size=\"panel\"] { width: min(100%, 960px); height: clamp(420px, calc(100vh - 118px), 620px); }\n.tap-preview-canvas[data-size=\"page\"] { height: max(380px, calc(100vh - 118px)); }\n.tap-preview-surface { display: block; height: 100%; min-height: 0; }\n.tap-preview-message { min-height: 360px; display: grid; place-content: center; gap: 8px; padding: 32px; text-align: center; }\n.tap-preview-message span { max-width: 62ch; color: var(--preview-muted); }\n@media (max-width: 640px) {\n .tap-preview-stage { padding: 12px; }\n .tap-preview-bar { align-items: flex-start; padding: 12px; }\n .tap-preview-brand { min-width: 0; }\n .tap-preview-controls { width: 100%; overflow-x: auto; padding-bottom: 2px; }\n .tap-preview-field { min-width: 100px; }\n .tap-preview-field--contribution { min-width: 180px; }\n}\n@media (max-width: 900px) {\n .tap-preview-bar { flex-wrap: wrap; gap: 12px; }\n .tap-preview-controls { flex: 1 1 100%; }\n}\n`;\n"]}
|
package/dist/vite-preview.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { L as LocalPreviewOptions } from './client-
|
|
2
|
-
export { a as LocalPreview, b as LocalPreviewProps, P as PreviewLoadRequest, c as PreviewModuleLoader, d as componentFromModule, l as loadContribution } from './client-
|
|
1
|
+
import { L as LocalPreviewOptions } from './client-BLnec4SD.cjs';
|
|
2
|
+
export { a as LocalPreview, b as LocalPreviewProps, P as PreviewLoadRequest, c as PreviewModuleLoader, d as componentFromModule, l as loadContribution } from './client-BLnec4SD.cjs';
|
|
3
3
|
import 'react';
|
|
4
4
|
import 'react/jsx-runtime';
|
|
5
|
-
import './constants-
|
|
5
|
+
import './constants-CvHbO3ia.cjs';
|
|
6
6
|
|
|
7
7
|
declare function mountLocalPreview({ manifest, remote, mount, }: LocalPreviewOptions): () => void;
|
|
8
8
|
|
package/dist/vite-preview.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { L as LocalPreviewOptions } from './client-
|
|
2
|
-
export { a as LocalPreview, b as LocalPreviewProps, P as PreviewLoadRequest, c as PreviewModuleLoader, d as componentFromModule, l as loadContribution } from './client-
|
|
1
|
+
import { L as LocalPreviewOptions } from './client-BRxKTo-L.js';
|
|
2
|
+
export { a as LocalPreview, b as LocalPreviewProps, P as PreviewLoadRequest, c as PreviewModuleLoader, d as componentFromModule, l as loadContribution } from './client-BRxKTo-L.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import 'react/jsx-runtime';
|
|
5
|
-
import './constants-
|
|
5
|
+
import './constants-CvHbO3ia.js';
|
|
6
6
|
|
|
7
7
|
declare function mountLocalPreview({ manifest, remote, mount, }: LocalPreviewOptions): () => void;
|
|
8
8
|
|
package/dist/vite-preview.mjs
CHANGED
|
@@ -9,15 +9,15 @@ import {
|
|
|
9
9
|
createTapMock,
|
|
10
10
|
fixtureKeywords,
|
|
11
11
|
fixtures
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WW2D3N2T.mjs";
|
|
13
13
|
import "./chunk-SGEYDV3K.mjs";
|
|
14
14
|
import {
|
|
15
15
|
TapHostProvider,
|
|
16
16
|
createHostQueryClient
|
|
17
17
|
} from "./chunk-RBIQT75L.mjs";
|
|
18
18
|
import "./chunk-QA5AL3VZ.mjs";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-CEFLOQD4.mjs";
|
|
20
|
+
import "./chunk-IHLK4I7J.mjs";
|
|
21
21
|
import "./chunk-QXD7WVKK.mjs";
|
|
22
22
|
import "./chunk-J5LGTIGS.mjs";
|
|
23
23
|
|
|
@@ -39,7 +39,7 @@ import * as JsxRuntime from "react/jsx-runtime";
|
|
|
39
39
|
// package.json
|
|
40
40
|
var package_default = {
|
|
41
41
|
name: "@tappify/extension-sdk",
|
|
42
|
-
version: "2.1.0-beta.
|
|
42
|
+
version: "2.1.0-beta.4",
|
|
43
43
|
description: "Build extensions that run inside Tappify",
|
|
44
44
|
author: "Tappify Team",
|
|
45
45
|
license: "MIT",
|