@embeddables/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -0
- package/bin/embeddables.mjs +2 -0
- package/dist/auth/index.d.ts +43 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +100 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/commands/build-workbench.d.ts +5 -0
- package/dist/commands/build-workbench.d.ts.map +1 -0
- package/dist/commands/build-workbench.js +122 -0
- package/dist/commands/build.d.ts +7 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +22 -0
- package/dist/commands/dev.d.ts +11 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +153 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +112 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +18 -0
- package/dist/commands/pull.d.ts +7 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +97 -0
- package/dist/compiler/errors.d.ts +20 -0
- package/dist/compiler/errors.d.ts.map +1 -0
- package/dist/compiler/errors.js +35 -0
- package/dist/compiler/evalStatic.d.ts +3 -0
- package/dist/compiler/evalStatic.d.ts.map +1 -0
- package/dist/compiler/evalStatic.js +57 -0
- package/dist/compiler/flatten.js +1 -0
- package/dist/compiler/helpers/duplicateIds.d.ts +9 -0
- package/dist/compiler/helpers/duplicateIds.d.ts.map +1 -0
- package/dist/compiler/helpers/duplicateIds.js +71 -0
- package/dist/compiler/index.d.ts +16 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +934 -0
- package/dist/compiler/parsePage.d.ts +15 -0
- package/dist/compiler/parsePage.d.ts.map +1 -0
- package/dist/compiler/parsePage.js +562 -0
- package/dist/compiler/registry.d.ts +4 -0
- package/dist/compiler/registry.d.ts.map +1 -0
- package/dist/compiler/registry.js +44 -0
- package/dist/compiler/reverse.d.ts +17 -0
- package/dist/compiler/reverse.d.ts.map +1 -0
- package/dist/compiler/reverse.js +1632 -0
- package/dist/compiler/types.d.ts +21 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +1 -0
- package/dist/components/index.d.ts +21 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +21 -0
- package/dist/components/primitives/BaseComponent.d.ts +32 -0
- package/dist/components/primitives/BaseComponent.d.ts.map +1 -0
- package/dist/components/primitives/BaseComponent.js +26 -0
- package/dist/components/primitives/BookMeeting.d.ts +18 -0
- package/dist/components/primitives/BookMeeting.d.ts.map +1 -0
- package/dist/components/primitives/BookMeeting.js +5 -0
- package/dist/components/primitives/Chart.d.ts +41 -0
- package/dist/components/primitives/Chart.d.ts.map +1 -0
- package/dist/components/primitives/Chart.js +5 -0
- package/dist/components/primitives/Container.d.ts +8 -0
- package/dist/components/primitives/Container.d.ts.map +1 -0
- package/dist/components/primitives/Container.js +5 -0
- package/dist/components/primitives/CustomButton.d.ts +37 -0
- package/dist/components/primitives/CustomButton.d.ts.map +1 -0
- package/dist/components/primitives/CustomButton.js +10 -0
- package/dist/components/primitives/CustomHTML.d.ts +8 -0
- package/dist/components/primitives/CustomHTML.d.ts.map +1 -0
- package/dist/components/primitives/CustomHTML.js +5 -0
- package/dist/components/primitives/FileUpload.d.ts +18 -0
- package/dist/components/primitives/FileUpload.d.ts.map +1 -0
- package/dist/components/primitives/FileUpload.js +16 -0
- package/dist/components/primitives/InputBox.d.ts +34 -0
- package/dist/components/primitives/InputBox.d.ts.map +1 -0
- package/dist/components/primitives/InputBox.js +25 -0
- package/dist/components/primitives/Lottie.d.ts +11 -0
- package/dist/components/primitives/Lottie.d.ts.map +1 -0
- package/dist/components/primitives/Lottie.js +5 -0
- package/dist/components/primitives/MediaEmbed.d.ts +13 -0
- package/dist/components/primitives/MediaEmbed.d.ts.map +1 -0
- package/dist/components/primitives/MediaEmbed.js +6 -0
- package/dist/components/primitives/MediaImage.d.ts +8 -0
- package/dist/components/primitives/MediaImage.d.ts.map +1 -0
- package/dist/components/primitives/MediaImage.js +5 -0
- package/dist/components/primitives/OptionSelector.d.ts +35 -0
- package/dist/components/primitives/OptionSelector.d.ts.map +1 -0
- package/dist/components/primitives/OptionSelector.js +8 -0
- package/dist/components/primitives/PaypalCheckout.d.ts +25 -0
- package/dist/components/primitives/PaypalCheckout.d.ts.map +1 -0
- package/dist/components/primitives/PaypalCheckout.js +5 -0
- package/dist/components/primitives/PlainText.d.ts +6 -0
- package/dist/components/primitives/PlainText.d.ts.map +1 -0
- package/dist/components/primitives/PlainText.js +5 -0
- package/dist/components/primitives/ProgressBar.d.ts +15 -0
- package/dist/components/primitives/ProgressBar.d.ts.map +1 -0
- package/dist/components/primitives/ProgressBar.js +5 -0
- package/dist/components/primitives/RichText.d.ts +6 -0
- package/dist/components/primitives/RichText.d.ts.map +1 -0
- package/dist/components/primitives/RichText.js +5 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts +6 -0
- package/dist/components/primitives/RichTextMarkdown.d.ts.map +1 -0
- package/dist/components/primitives/RichTextMarkdown.js +5 -0
- package/dist/components/primitives/Rive.d.ts +16 -0
- package/dist/components/primitives/Rive.d.ts.map +1 -0
- package/dist/components/primitives/Rive.js +8 -0
- package/dist/components/primitives/StripeCheckout.d.ts +52 -0
- package/dist/components/primitives/StripeCheckout.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout.js +5 -0
- package/dist/components/primitives/StripeCheckout2.d.ts +30 -0
- package/dist/components/primitives/StripeCheckout2.d.ts.map +1 -0
- package/dist/components/primitives/StripeCheckout2.js +7 -0
- package/dist/proxy/injectApiInterceptor.d.ts +6 -0
- package/dist/proxy/injectApiInterceptor.d.ts.map +1 -0
- package/dist/proxy/injectApiInterceptor.js +66 -0
- package/dist/proxy/injectReload.d.ts +2 -0
- package/dist/proxy/injectReload.d.ts.map +1 -0
- package/dist/proxy/injectReload.js +14 -0
- package/dist/proxy/injectWorkbench.d.ts +4 -0
- package/dist/proxy/injectWorkbench.d.ts.map +1 -0
- package/dist/proxy/injectWorkbench.js +16 -0
- package/dist/proxy/server.d.ts +11 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +246 -0
- package/dist/proxy/sse.d.ts +5 -0
- package/dist/proxy/sse.d.ts.map +1 -0
- package/dist/proxy/sse.js +17 -0
- package/dist/types-builder.d.ts +800 -0
- package/dist/types-builder.d.ts.map +1 -0
- package/dist/types-builder.js +20 -0
- package/dist/workbench/ActionsPanel.d.ts +6 -0
- package/dist/workbench/ActionsPanel.d.ts.map +1 -0
- package/dist/workbench/ActionsPanel.js +47 -0
- package/dist/workbench/AutofillPanel.d.ts +6 -0
- package/dist/workbench/AutofillPanel.d.ts.map +1 -0
- package/dist/workbench/AutofillPanel.js +543 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts +6 -0
- package/dist/workbench/ComputedFieldsPanel.d.ts.map +1 -0
- package/dist/workbench/ComputedFieldsPanel.js +31 -0
- package/dist/workbench/ExperimentsPanel.d.ts +6 -0
- package/dist/workbench/ExperimentsPanel.d.ts.map +1 -0
- package/dist/workbench/ExperimentsPanel.js +182 -0
- package/dist/workbench/FieldEditorPanel.d.ts +9 -0
- package/dist/workbench/FieldEditorPanel.d.ts.map +1 -0
- package/dist/workbench/FieldEditorPanel.js +650 -0
- package/dist/workbench/InspectorPanel.d.ts +6 -0
- package/dist/workbench/InspectorPanel.d.ts.map +1 -0
- package/dist/workbench/InspectorPanel.js +341 -0
- package/dist/workbench/PageNavigator.d.ts +6 -0
- package/dist/workbench/PageNavigator.d.ts.map +1 -0
- package/dist/workbench/PageNavigator.js +123 -0
- package/dist/workbench/SchemaPanel.d.ts +6 -0
- package/dist/workbench/SchemaPanel.d.ts.map +1 -0
- package/dist/workbench/SchemaPanel.js +222 -0
- package/dist/workbench/UserDataPanel.d.ts +6 -0
- package/dist/workbench/UserDataPanel.d.ts.map +1 -0
- package/dist/workbench/UserDataPanel.js +350 -0
- package/dist/workbench/WorkbenchApp.d.ts +6 -0
- package/dist/workbench/WorkbenchApp.d.ts.map +1 -0
- package/dist/workbench/WorkbenchApp.js +193 -0
- package/dist/workbench/cloudflare-worker/README.md +31 -0
- package/dist/workbench/cloudflare-worker/public/workbench.css +1614 -0
- package/dist/workbench/cloudflare-worker/public/workbench.js +77 -0
- package/dist/workbench/cloudflare-worker/worker.js +40 -0
- package/dist/workbench/cloudflare-worker/wrangler.toml +10 -0
- package/dist/workbench/index.d.ts +9 -0
- package/dist/workbench/index.d.ts.map +1 -0
- package/dist/workbench/index.js +44 -0
- package/dist/workbench/workbench.css +1614 -0
- package/dist/workbench/workbench.js +77 -0
- package/package.json +79 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BaseComponentProps } from './BaseComponent';
|
|
2
|
+
export interface PlainTextProps extends BaseComponentProps {
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function PlainText({ id, key, text, ...baseProps }: PlainTextProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=PlainText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlainText.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/PlainText.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,cAAc,2CAMxE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type BaseComponentProps } from './BaseComponent';
|
|
2
|
+
export interface ProgressBarProps extends BaseComponentProps {
|
|
3
|
+
progress_type?: 'circle' | 'simple' | 'custom';
|
|
4
|
+
allow_nav?: boolean;
|
|
5
|
+
fill_connectors?: boolean;
|
|
6
|
+
node_icon?: string;
|
|
7
|
+
showProgressPercentage?: boolean;
|
|
8
|
+
progressBarLabelPosition?: 'bottom' | 'left' | 'right';
|
|
9
|
+
percentageType?: 'percent-complete' | 'fractional';
|
|
10
|
+
progressBarStartAtOne?: boolean;
|
|
11
|
+
progressBarCompleteText?: string;
|
|
12
|
+
animate_in?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function ProgressBar({ id, key, progress_type, allow_nav, fill_connectors, node_icon, showProgressPercentage, progressBarLabelPosition, percentageType, progressBarStartAtOne, progressBarCompleteText, animate_in, ...baseProps }: ProgressBarProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=ProgressBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressBar.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/ProgressBar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,aAAa,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,wBAAwB,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IACtD,cAAc,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAAA;IAClD,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,GAAG,EACH,aAAwB,EACxB,SAAS,EACT,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,wBAAmC,EACnC,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,GAAG,SAAS,EACb,EAAE,gBAAgB,2CAoBlB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function ProgressBar({ id, key, progress_type = 'simple', allow_nav, fill_connectors, node_icon, showProgressPercentage, progressBarLabelPosition = 'bottom', percentageType, progressBarStartAtOne, progressBarCompleteText, animate_in, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, className: `progress-bar progress-bar-${progress_type} ${allow_nav ? 'allow-nav' : ''} ${fill_connectors ? 'fill-connectors' : ''} ${animate_in ? 'animate-in' : ''}`, children: _jsxs("div", { className: "progress-bar-content", "data-label-position": progressBarLabelPosition, "data-percentage-type": percentageType, "data-start-at-one": progressBarStartAtOne, "data-complete-text": progressBarCompleteText, children: [node_icon && _jsx("span", { className: "node-icon", children: node_icon }), showProgressPercentage && _jsx("div", { className: "progress-percentage", children: "0%" })] }) }, key));
|
|
5
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BaseComponentProps } from './BaseComponent';
|
|
2
|
+
export interface RichTextProps extends BaseComponentProps {
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function RichText({ id, key, text, ...baseProps }: RichTextProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=RichText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/RichText.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,aAAa,2CAMtE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function RichText({ id, key, text, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, children: _jsx("div", { dangerouslySetInnerHTML: { __html: text } }) }, key));
|
|
5
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BaseComponentProps } from './BaseComponent';
|
|
2
|
+
export interface RichTextMarkdownProps extends BaseComponentProps {
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function RichTextMarkdown({ id, key, text, ...baseProps }: RichTextMarkdownProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=RichTextMarkdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextMarkdown.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/RichTextMarkdown.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,qBAAqB,2CAMtF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function RichTextMarkdown({ id, key, text, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, children: _jsx("div", { className: "markdown-content", children: text }) }, key));
|
|
5
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type BaseComponentProps } from './BaseComponent';
|
|
2
|
+
export interface RiveProps extends BaseComponentProps {
|
|
3
|
+
src?: string;
|
|
4
|
+
autoplay?: boolean;
|
|
5
|
+
artboard?: string;
|
|
6
|
+
animation?: string;
|
|
7
|
+
is_state_machine?: boolean;
|
|
8
|
+
width?: number;
|
|
9
|
+
height?: number;
|
|
10
|
+
flow_event_to_rive_action_mappings?: {
|
|
11
|
+
[key: string]: string;
|
|
12
|
+
}[];
|
|
13
|
+
capture_events?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function Rive({ id, key, src, autoplay, artboard, animation, is_state_machine, width, height, flow_event_to_rive_action_mappings, capture_events, ...baseProps }: RiveProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=Rive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rive.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/Rive.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAE/E,MAAM,WAAW,SAAU,SAAQ,kBAAkB;IACnD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kCAAkC,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAAE,CAAA;IAChE,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,wBAAgB,IAAI,CAAC,EACnB,EAAE,EACF,GAAG,EACH,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,kCAAkC,EAClC,cAAc,EACd,GAAG,SAAS,EACb,EAAE,SAAS,2CAoBX"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function Rive({ id, key, src, autoplay, artboard, animation, is_state_machine, width, height, flow_event_to_rive_action_mappings, capture_events, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, children: src && (_jsx("div", { className: "rive-container", "data-src": src, "data-artboard": artboard, "data-animation": animation, "data-state-machine": is_state_machine, "data-autoplay": autoplay, "data-capture-events": capture_events, style: {
|
|
5
|
+
width: width ? `${width}px` : undefined,
|
|
6
|
+
height: height ? `${height}px` : undefined,
|
|
7
|
+
} })) }, key));
|
|
8
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type InputComponentProps } from './BaseComponent';
|
|
2
|
+
export interface StripeCheckoutProps extends InputComponentProps {
|
|
3
|
+
on_payment_complete_conversions: Record<string, unknown>[];
|
|
4
|
+
pay_button_text?: string;
|
|
5
|
+
action: 'one-time-payment' | 'collect_details' | 'subscription';
|
|
6
|
+
publishable_key: string;
|
|
7
|
+
currency?: string;
|
|
8
|
+
country?: string;
|
|
9
|
+
amount: string | number;
|
|
10
|
+
billing_info_name?: string;
|
|
11
|
+
billing_info_email?: string;
|
|
12
|
+
billing_info_phone?: string;
|
|
13
|
+
billing_info_address_line1?: string;
|
|
14
|
+
billing_info_address_line2?: string;
|
|
15
|
+
billing_info_city?: string;
|
|
16
|
+
billing_info_state?: string;
|
|
17
|
+
billing_info_postal_code?: string;
|
|
18
|
+
billing_info_country?: string;
|
|
19
|
+
create_customer?: boolean;
|
|
20
|
+
output_customer_id?: boolean;
|
|
21
|
+
customer_id_key?: string;
|
|
22
|
+
output_subscription_id?: boolean;
|
|
23
|
+
subscription_id_key?: string;
|
|
24
|
+
output_invoice_id?: boolean;
|
|
25
|
+
invoice_id_key?: string;
|
|
26
|
+
output_payment_method?: boolean;
|
|
27
|
+
payment_method_key?: string;
|
|
28
|
+
output_payment_intent_id?: boolean;
|
|
29
|
+
payment_intent_id_key?: string;
|
|
30
|
+
trial_period_days?: string;
|
|
31
|
+
price_id?: string;
|
|
32
|
+
one_time_price_id?: string;
|
|
33
|
+
allow_alternate_payments?: boolean;
|
|
34
|
+
allow_buy_now_pay_later?: boolean;
|
|
35
|
+
place_hold_only?: boolean;
|
|
36
|
+
individual_fields?: boolean;
|
|
37
|
+
hide_cc_fields?: boolean;
|
|
38
|
+
enforce_validation?: boolean;
|
|
39
|
+
collect_details?: string;
|
|
40
|
+
next_on_complete?: string;
|
|
41
|
+
on_payment_failed_outputs?: string;
|
|
42
|
+
on_payment_complete_outputs?: string;
|
|
43
|
+
on_payment_attempted_outputs?: string;
|
|
44
|
+
cc_field_logos_image?: string;
|
|
45
|
+
promo_code?: string;
|
|
46
|
+
skip_https_check?: boolean;
|
|
47
|
+
use_new_backend?: boolean;
|
|
48
|
+
enable_automatic_tax?: boolean;
|
|
49
|
+
use_new_stripe_elements?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare function StripeCheckout({ id, key, pay_button_text, action, publishable_key, amount, currency, country, element_id, isRequired, ...baseProps }: StripeCheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
52
|
+
//# sourceMappingURL=StripeCheckout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StripeCheckout.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/StripeCheckout.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAGhF,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,CAAA;IAC/D,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EACF,GAAG,EACH,eAAuB,EACvB,MAAM,EACN,eAAe,EACf,MAAM,EACN,QAAQ,EACR,OAAO,EACP,UAAU,EACV,UAAU,EACV,GAAG,SAAS,EACb,EAAE,mBAAmB,2CAkBrB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function StripeCheckout({ id, key, pay_button_text = 'Pay', action, publishable_key, amount, currency, country, element_id, isRequired, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, children: _jsx("div", { className: "stripe-checkout", "data-action": action, "data-publishable-key": publishable_key, "data-amount": amount, "data-currency": currency, "data-country": country, id: element_id, children: _jsx("button", { type: "submit", disabled: isRequired === false, children: pay_button_text }) }) }, key));
|
|
5
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type InputComponentProps } from './BaseComponent';
|
|
2
|
+
import type { StripeCheckoutSession, StripeInitCheckoutOptions, StripeCheckoutConfirmOptions, StripeCreateElementOptions, StripeCheckoutExpressCheckoutElementOptions } from '../../types-builder';
|
|
3
|
+
type StripeElementType = 'payment' | 'express_checkout';
|
|
4
|
+
export interface StripeCheckout2Props extends InputComponentProps {
|
|
5
|
+
elements_to_display?: Array<StripeElementType>;
|
|
6
|
+
checkout_session?: StripeCheckoutSession;
|
|
7
|
+
init_checkout_options?: StripeInitCheckoutOptions;
|
|
8
|
+
confirm_checkout_options?: StripeCheckoutConfirmOptions;
|
|
9
|
+
create_element_options?: StripeCreateElementOptions;
|
|
10
|
+
create_express_checkout_element_options?: StripeCheckoutExpressCheckoutElementOptions;
|
|
11
|
+
enforce_validation?: boolean;
|
|
12
|
+
next_on_complete?: boolean;
|
|
13
|
+
display?: {
|
|
14
|
+
success_message?: string;
|
|
15
|
+
};
|
|
16
|
+
save_outputs_to_user_data?: {
|
|
17
|
+
customer_id?: string;
|
|
18
|
+
invoice_id?: string;
|
|
19
|
+
payment_method?: string;
|
|
20
|
+
payment_intent_id?: string;
|
|
21
|
+
setup_intent_id?: string;
|
|
22
|
+
};
|
|
23
|
+
on_payment_failed_outputs?: string;
|
|
24
|
+
on_payment_complete_outputs?: string;
|
|
25
|
+
on_payment_attempted_outputs?: string;
|
|
26
|
+
on_payment_complete_conversions?: Record<string, unknown>[];
|
|
27
|
+
}
|
|
28
|
+
export declare function StripeCheckout2({ id, key, elements_to_display, checkout_session, init_checkout_options, confirm_checkout_options, create_element_options, create_express_checkout_element_options, enforce_validation, next_on_complete, display, save_outputs_to_user_data, on_payment_failed_outputs, on_payment_complete_outputs, on_payment_attempted_outputs, on_payment_complete_conversions, element_id, isRequired, ...baseProps }: StripeCheckout2Props): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=StripeCheckout2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StripeCheckout2.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/StripeCheckout2.tsx"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,KAAK,EAEV,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,2CAA2C,EAC5C,MAAM,qBAAqB,CAAA;AAE5B,KAAK,iBAAiB,GAAG,SAAS,GAAG,kBAAkB,CAAA;AAEvD,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAE/D,mBAAmB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAE9C,gBAAgB,CAAC,EAAE,qBAAqB,CAAA;IACxC,qBAAqB,CAAC,EAAE,yBAAyB,CAAA;IACjD,wBAAwB,CAAC,EAAE,4BAA4B,CAAA;IACvD,sBAAsB,CAAC,EAAE,0BAA0B,CAAA;IACnD,uCAAuC,CAAC,EAAE,2CAA2C,CAAA;IACrF,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,OAAO,CAAC,EAAE;QACR,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB,CAAA;IACD,yBAAyB,CAAC,EAAE;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB,CAAA;IACD,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,4BAA4B,CAAC,EAAE,MAAM,CAAA;IAErC,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CAC5D;AAED,wBAAgB,eAAe,CAAC,EAC9B,EAAE,EACF,GAAG,EACH,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,uCAAuC,EACvC,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,+BAA+B,EAC/B,UAAU,EACV,UAAU,EACV,GAAG,SAAS,EACb,EAAE,oBAAoB,2CAyCtB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { BaseComponentWrapper } from './BaseComponent';
|
|
3
|
+
export function StripeCheckout2({ id, key, elements_to_display, checkout_session, init_checkout_options, confirm_checkout_options, create_element_options, create_express_checkout_element_options, enforce_validation, next_on_complete, display, save_outputs_to_user_data, on_payment_failed_outputs, on_payment_complete_outputs, on_payment_attempted_outputs, on_payment_complete_conversions, element_id, isRequired, ...baseProps }) {
|
|
4
|
+
return (_jsx(BaseComponentWrapper, { id: id, ...baseProps, children: _jsxs("div", { className: "stripe-checkout-2", id: element_id, "data-elements": JSON.stringify(elements_to_display), "data-checkout-session": JSON.stringify(checkout_session), "data-init-options": init_checkout_options ? JSON.stringify(init_checkout_options) : undefined, "data-confirm-options": confirm_checkout_options ? JSON.stringify(confirm_checkout_options) : undefined, "data-create-element-options": create_element_options ? JSON.stringify(create_element_options) : undefined, "data-express-checkout-options": create_express_checkout_element_options
|
|
5
|
+
? JSON.stringify(create_express_checkout_element_options)
|
|
6
|
+
: undefined, "data-enforce-validation": enforce_validation, "data-next-on-complete": next_on_complete, "data-success-message": display?.success_message, "data-save-outputs": save_outputs_to_user_data ? JSON.stringify(save_outputs_to_user_data) : undefined, "data-payment-failed-outputs": on_payment_failed_outputs, "data-payment-complete-outputs": on_payment_complete_outputs, "data-payment-attempted-outputs": on_payment_attempted_outputs, children: [_jsx("div", { className: "stripe-elements-container" }), display?.success_message && (_jsx("div", { className: "success-message", style: { display: 'none' }, children: display.success_message }))] }) }, key));
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injects a script that intercepts fetch/XHR calls to the remote engine
|
|
3
|
+
* and rewrites them to go through the local proxy instead.
|
|
4
|
+
*/
|
|
5
|
+
export declare function injectApiInterceptor(html: string, remoteOrigin: string): string;
|
|
6
|
+
//# sourceMappingURL=injectApiInterceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectApiInterceptor.d.ts","sourceRoot":"","sources":["../../src/proxy/injectApiInterceptor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAiE/E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injects a script that intercepts fetch/XHR calls to the remote engine
|
|
3
|
+
* and rewrites them to go through the local proxy instead.
|
|
4
|
+
*/
|
|
5
|
+
export function injectApiInterceptor(html, remoteOrigin) {
|
|
6
|
+
// This script needs to run BEFORE any other scripts, so inject into <head>
|
|
7
|
+
const lower = html.toLowerCase();
|
|
8
|
+
const headCloseIndex = lower.indexOf('</head>');
|
|
9
|
+
// The interceptor script - patches fetch and XMLHttpRequest
|
|
10
|
+
const interceptorScript = `<script>(function(){
|
|
11
|
+
var remoteOrigin = ${JSON.stringify(remoteOrigin)};
|
|
12
|
+
var localOrigin = window.location.origin;
|
|
13
|
+
|
|
14
|
+
// Helper to rewrite URLs
|
|
15
|
+
function rewriteUrl(url) {
|
|
16
|
+
if (typeof url === 'string' && url.startsWith(remoteOrigin)) {
|
|
17
|
+
var newUrl = url.replace(remoteOrigin, localOrigin);
|
|
18
|
+
console.log('[DevProxy] Intercepted:', url, '->', newUrl);
|
|
19
|
+
return newUrl;
|
|
20
|
+
}
|
|
21
|
+
if (url instanceof URL && url.origin === remoteOrigin) {
|
|
22
|
+
var newUrl = new URL(url.pathname + url.search + url.hash, localOrigin);
|
|
23
|
+
console.log('[DevProxy] Intercepted:', url.href, '->', newUrl.href);
|
|
24
|
+
return newUrl;
|
|
25
|
+
}
|
|
26
|
+
return url;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Patch fetch
|
|
30
|
+
var originalFetch = window.fetch;
|
|
31
|
+
window.fetch = function(input, init) {
|
|
32
|
+
if (typeof input === 'string') {
|
|
33
|
+
input = rewriteUrl(input);
|
|
34
|
+
} else if (input instanceof Request) {
|
|
35
|
+
var newUrl = rewriteUrl(input.url);
|
|
36
|
+
if (newUrl !== input.url) {
|
|
37
|
+
input = new Request(newUrl, input);
|
|
38
|
+
}
|
|
39
|
+
} else if (input instanceof URL) {
|
|
40
|
+
input = rewriteUrl(input);
|
|
41
|
+
}
|
|
42
|
+
return originalFetch.call(this, input, init);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Patch XMLHttpRequest
|
|
46
|
+
var originalXHROpen = XMLHttpRequest.prototype.open;
|
|
47
|
+
XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
|
|
48
|
+
url = rewriteUrl(url);
|
|
49
|
+
return originalXHROpen.call(this, method, url, async, user, password);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
console.log('[DevProxy] API interceptor installed, rewriting', remoteOrigin, 'to', localOrigin);
|
|
53
|
+
})();</script>`;
|
|
54
|
+
const injection = `\n${interceptorScript}\n`;
|
|
55
|
+
if (headCloseIndex === -1) {
|
|
56
|
+
// No </head> tag found; try to inject after <head> or at the start
|
|
57
|
+
const headOpenIndex = lower.indexOf('<head>');
|
|
58
|
+
if (headOpenIndex !== -1) {
|
|
59
|
+
const insertPos = headOpenIndex + '<head>'.length;
|
|
60
|
+
return html.slice(0, insertPos) + injection + html.slice(insertPos);
|
|
61
|
+
}
|
|
62
|
+
// No head at all, prepend to document
|
|
63
|
+
return injection + html;
|
|
64
|
+
}
|
|
65
|
+
return html.slice(0, headCloseIndex) + injection + html.slice(headCloseIndex);
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectReload.d.ts","sourceRoot":"","sources":["../../src/proxy/injectReload.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBvD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function injectReloadScript(html) {
|
|
2
|
+
const lower = html.toLowerCase();
|
|
3
|
+
const bodyCloseIndex = lower.lastIndexOf('</body>');
|
|
4
|
+
const reloadScript = '<script>(function(){' +
|
|
5
|
+
'var es = new EventSource("/__embeddables_reload");' +
|
|
6
|
+
'es.addEventListener("reload", function() { window.location.reload(); });' +
|
|
7
|
+
'})();</script>';
|
|
8
|
+
const injection = `\n${reloadScript}\n`;
|
|
9
|
+
if (bodyCloseIndex === -1) {
|
|
10
|
+
// No </body> tag found; append at the end
|
|
11
|
+
return html + injection;
|
|
12
|
+
}
|
|
13
|
+
return html.slice(0, bodyCloseIndex) + injection + html.slice(bodyCloseIndex);
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injectWorkbench.d.ts","sourceRoot":"","sources":["../../src/proxy/injectWorkbench.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsBxF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function injectWorkbenchHtml(html, opts) {
|
|
2
|
+
const lower = html.toLowerCase();
|
|
3
|
+
const bodyCloseIndex = lower.lastIndexOf('</body>');
|
|
4
|
+
const container = '<div id="__embeddables_workbench_root"></div>';
|
|
5
|
+
const configScript = `<script>(function(){` +
|
|
6
|
+
'window.__EMBEDDABLES_WORKBENCH = window.__EMBEDDABLES_WORKBENCH || {};' +
|
|
7
|
+
`window.__EMBEDDABLES_WORKBENCH.embeddableId = ${JSON.stringify(opts.embeddableId)};` +
|
|
8
|
+
'})();</script>';
|
|
9
|
+
const scriptTag = `<script src="/__embeddables_workbench.js" onload="if(typeof window.__embeddables_bootstrap_workbench==='function'){window.__embeddables_bootstrap_workbench({embeddableId:window.__EMBEDDABLES_WORKBENCH.embeddableId});}"></script>`;
|
|
10
|
+
const injection = `\n${container}\n${configScript}\n${scriptTag}\n`;
|
|
11
|
+
if (bodyCloseIndex === -1) {
|
|
12
|
+
// No </body> tag found; append at the end
|
|
13
|
+
return html + injection;
|
|
14
|
+
}
|
|
15
|
+
return html.slice(0, bodyCloseIndex) + injection + html.slice(bodyCloseIndex);
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function startProxyServer(opts: {
|
|
2
|
+
port: number;
|
|
3
|
+
engineOrigin: string;
|
|
4
|
+
overrideRoute: string;
|
|
5
|
+
generatedJsonPath: string;
|
|
6
|
+
embeddableId: string;
|
|
7
|
+
watchWorkbench?: boolean;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
broadcastReload: () => void;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"AAcA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;;GAqRA"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
5
|
+
import * as esbuild from 'esbuild';
|
|
6
|
+
import chokidar from 'chokidar';
|
|
7
|
+
import postcss from 'postcss';
|
|
8
|
+
import tailwindcss from '@tailwindcss/postcss';
|
|
9
|
+
import autoprefixer from 'autoprefixer';
|
|
10
|
+
import { attachSse } from './sse.js';
|
|
11
|
+
import { injectWorkbenchHtml } from './injectWorkbench.js';
|
|
12
|
+
import { injectReloadScript } from './injectReload.js';
|
|
13
|
+
import { injectApiInterceptor } from './injectApiInterceptor.js';
|
|
14
|
+
export async function startProxyServer(opts) {
|
|
15
|
+
const app = express();
|
|
16
|
+
// Use path relative to project root (where package.json lives)
|
|
17
|
+
const workbenchEntry = path.join(process.cwd(), 'src', 'workbench', 'index.tsx');
|
|
18
|
+
const workbenchDir = path.join(process.cwd(), 'src', 'workbench');
|
|
19
|
+
const workbenchCssEntry = path.join(process.cwd(), 'src', 'workbench', 'workbench.css');
|
|
20
|
+
// Build the Workbench bundle. If it fails, we log the error and
|
|
21
|
+
// keep the proxy running; HTML injection will still happen but the script may 404.
|
|
22
|
+
let workbenchBundle = null;
|
|
23
|
+
let workbenchCss = null;
|
|
24
|
+
const buildWorkbench = async () => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await esbuild.build({
|
|
27
|
+
entryPoints: [workbenchEntry],
|
|
28
|
+
bundle: true,
|
|
29
|
+
format: 'iife',
|
|
30
|
+
globalName: '__EmbeddablesWorkbenchBundle',
|
|
31
|
+
platform: 'browser',
|
|
32
|
+
write: false,
|
|
33
|
+
sourcemap: 'inline',
|
|
34
|
+
});
|
|
35
|
+
const outputFile = result.outputFiles?.[0];
|
|
36
|
+
if (outputFile) {
|
|
37
|
+
workbenchBundle = outputFile.contents;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
workbenchBundle = null;
|
|
41
|
+
}
|
|
42
|
+
const rawCss = fs.readFileSync(workbenchCssEntry, 'utf8');
|
|
43
|
+
const cssResult = await postcss([tailwindcss(), autoprefixer]).process(rawCss, {
|
|
44
|
+
from: workbenchCssEntry,
|
|
45
|
+
});
|
|
46
|
+
workbenchCss = cssResult.css;
|
|
47
|
+
if (workbenchBundle) {
|
|
48
|
+
console.log('[Workbench] Bundle built successfully');
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
console.warn('[Workbench] Bundle build completed but no output file found');
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.warn('[Workbench] Failed to build Workbench bundle. Workbench UI will be unavailable.', err);
|
|
56
|
+
workbenchCss = null;
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Initial build
|
|
61
|
+
await buildWorkbench();
|
|
62
|
+
// Add JSON body parsing middleware
|
|
63
|
+
app.use(express.json());
|
|
64
|
+
app.use(express.urlencoded({ extended: true }));
|
|
65
|
+
const { broadcastReload } = attachSse(app);
|
|
66
|
+
// Watch workbench files if enabled
|
|
67
|
+
if (opts.watchWorkbench) {
|
|
68
|
+
const workbenchGlob = path.join(workbenchDir, '**/*');
|
|
69
|
+
const watcher = chokidar.watch(workbenchGlob, {
|
|
70
|
+
ignoreInitial: true,
|
|
71
|
+
});
|
|
72
|
+
let rebuildTimeout;
|
|
73
|
+
watcher.on('all', async () => {
|
|
74
|
+
clearTimeout(rebuildTimeout);
|
|
75
|
+
rebuildTimeout = setTimeout(async () => {
|
|
76
|
+
console.log('[Workbench] Files changed, rebuilding bundle...');
|
|
77
|
+
const success = await buildWorkbench();
|
|
78
|
+
if (success) {
|
|
79
|
+
broadcastReload();
|
|
80
|
+
console.log('[Workbench] Bundle rebuilt and reload broadcast');
|
|
81
|
+
}
|
|
82
|
+
}, 100);
|
|
83
|
+
});
|
|
84
|
+
console.log(`[Workbench] Watching ${workbenchGlob} for changes`);
|
|
85
|
+
}
|
|
86
|
+
// Serve the Workbench bundle as a static asset
|
|
87
|
+
app.get('/__embeddables_workbench.js', (_req, res) => {
|
|
88
|
+
if (!workbenchBundle) {
|
|
89
|
+
res
|
|
90
|
+
.status(503)
|
|
91
|
+
.type('text/plain')
|
|
92
|
+
.send('Workbench bundle is not available. Check dev server logs.');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
|
|
96
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
97
|
+
res.send(Buffer.from(workbenchBundle));
|
|
98
|
+
});
|
|
99
|
+
app.get('/__embeddables_workbench.css', (_req, res) => {
|
|
100
|
+
if (!workbenchCss) {
|
|
101
|
+
res
|
|
102
|
+
.status(503)
|
|
103
|
+
.type('text/plain')
|
|
104
|
+
.send('Workbench CSS is not available. Check dev server logs.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
res.setHeader('Content-Type', 'text/css; charset=utf-8');
|
|
108
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
109
|
+
res.send(workbenchCss);
|
|
110
|
+
});
|
|
111
|
+
// Intercept GET requests to overrideRoute: convert to POST and add generated JSON to body
|
|
112
|
+
app.get(opts.overrideRoute, async (req, res) => {
|
|
113
|
+
console.log(`[/init] Intercepted GET ${opts.overrideRoute}, query:`, req.query);
|
|
114
|
+
try {
|
|
115
|
+
// Load the generated JSON
|
|
116
|
+
const raw = fs.readFileSync(opts.generatedJsonPath, 'utf8');
|
|
117
|
+
const generatedJson = JSON.parse(raw);
|
|
118
|
+
generatedJson.id = opts.embeddableId;
|
|
119
|
+
console.log(`[/init] Loaded local JSON, pages: ${generatedJson.pages?.length ?? 0}`);
|
|
120
|
+
// Create POST request body with the JSON
|
|
121
|
+
const postBody = {
|
|
122
|
+
json: {
|
|
123
|
+
flow: generatedJson,
|
|
124
|
+
flowId: generatedJson.id,
|
|
125
|
+
groupId: 'group_test',
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
// Build the target URL with query parameters
|
|
129
|
+
const queryString = new URLSearchParams(req.query).toString();
|
|
130
|
+
const targetUrl = `${opts.engineOrigin}/init${queryString ? `?${queryString}` : ''}`;
|
|
131
|
+
console.log(`[/init] Forwarding to engine: POST ${targetUrl}`);
|
|
132
|
+
// Forward headers from original request (excluding problematic ones)
|
|
133
|
+
const headers = {};
|
|
134
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
135
|
+
if (!['host', 'connection', 'content-length'].includes(key.toLowerCase())) {
|
|
136
|
+
if (typeof value === 'string') {
|
|
137
|
+
headers[key] = value;
|
|
138
|
+
}
|
|
139
|
+
else if (Array.isArray(value) && value.length > 0) {
|
|
140
|
+
headers[key] = value[0];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
headers['Content-Type'] = 'application/json';
|
|
145
|
+
// Forward the modified request to the engine as POST
|
|
146
|
+
const engineResponse = await fetch(targetUrl, {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers,
|
|
149
|
+
body: JSON.stringify(postBody),
|
|
150
|
+
});
|
|
151
|
+
// Parse and forward the response
|
|
152
|
+
const responseBody = await engineResponse.json();
|
|
153
|
+
console.log(`[/init] Engine response: status=${engineResponse.status}, hasFlow=${!!responseBody?.flow}, flowPages=${responseBody?.flow?.pages?.length ?? 'N/A'}`);
|
|
154
|
+
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
|
155
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
156
|
+
return res.status(engineResponse.status).send(JSON.stringify(responseBody));
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
console.error('Failed to modify /init request', err);
|
|
160
|
+
if (!res.headersSent) {
|
|
161
|
+
res.status(500).json({
|
|
162
|
+
error: 'Failed to modify /init request',
|
|
163
|
+
details: err?.message ?? String(err),
|
|
164
|
+
path: opts.generatedJsonPath,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// For GET / from localhost: fetch HTML from engine, inject Workbench, then send.
|
|
170
|
+
// This avoids selfHandleResponse/responseInterceptor which were causing the proxy to hang.
|
|
171
|
+
app.get('/', async (req, res, next) => {
|
|
172
|
+
const host = (req.headers.host ?? '').toString();
|
|
173
|
+
const isLocalhost = host.startsWith('localhost') || host.startsWith('127.0.0.1');
|
|
174
|
+
console.log(`[Workbench] GET / handler: host=${host}, isLocalhost=${isLocalhost}, url=${req.url}`);
|
|
175
|
+
if (!isLocalhost) {
|
|
176
|
+
console.log('[Workbench] Not localhost, skipping injection');
|
|
177
|
+
return next();
|
|
178
|
+
}
|
|
179
|
+
const targetUrl = `${opts.engineOrigin}${req.url}`;
|
|
180
|
+
console.log(`[Workbench] Fetching from engine: ${targetUrl}`);
|
|
181
|
+
try {
|
|
182
|
+
const headers = {};
|
|
183
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
184
|
+
if (!['host', 'connection'].includes(key.toLowerCase())) {
|
|
185
|
+
if (typeof value === 'string')
|
|
186
|
+
headers[key] = value;
|
|
187
|
+
else if (Array.isArray(value) && value[0])
|
|
188
|
+
headers[key] = value[0];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const engineRes = await fetch(targetUrl, { method: 'GET', headers });
|
|
192
|
+
const contentType = engineRes.headers.get('content-type') ?? '';
|
|
193
|
+
console.log(`[Workbench] Engine response: status=${engineRes.status}, content-type=${contentType}`);
|
|
194
|
+
if (!contentType.includes('text/html')) {
|
|
195
|
+
console.log('[Workbench] Not HTML, proxying normally');
|
|
196
|
+
return next();
|
|
197
|
+
}
|
|
198
|
+
const html = await engineRes.text();
|
|
199
|
+
console.log(`[Workbench] Got HTML (${html.length} chars), injecting Workbench...`);
|
|
200
|
+
let modifiedHtml = html;
|
|
201
|
+
// If proxying to a remote engine, inject API interceptor to rewrite absolute URLs
|
|
202
|
+
const isRemoteEngine = !opts.engineOrigin.includes('localhost') && !opts.engineOrigin.includes('127.0.0.1');
|
|
203
|
+
if (isRemoteEngine) {
|
|
204
|
+
modifiedHtml = injectApiInterceptor(modifiedHtml, opts.engineOrigin);
|
|
205
|
+
console.log(`[Workbench] Injected API interceptor for ${opts.engineOrigin}`);
|
|
206
|
+
}
|
|
207
|
+
modifiedHtml = injectReloadScript(modifiedHtml);
|
|
208
|
+
modifiedHtml = injectWorkbenchHtml(modifiedHtml, {
|
|
209
|
+
embeddableId: opts.embeddableId,
|
|
210
|
+
});
|
|
211
|
+
console.log(`[Workbench] Injection complete (${modifiedHtml.length} chars), sending response`);
|
|
212
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
213
|
+
res.setHeader('Cache-Control', engineRes.headers.get('cache-control') ?? 'no-store');
|
|
214
|
+
res.status(engineRes.status).send(modifiedHtml);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
console.error('[Workbench] Error fetching/injecting HTML:', err);
|
|
218
|
+
next();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
// Proxy everything else to the engine (no response interception)
|
|
222
|
+
app.use('/', createProxyMiddleware({
|
|
223
|
+
target: opts.engineOrigin,
|
|
224
|
+
changeOrigin: true,
|
|
225
|
+
ws: true,
|
|
226
|
+
on: {
|
|
227
|
+
proxyReq: (proxyReq, req) => {
|
|
228
|
+
console.log(`[Proxy] ${req.method} ${req.url} → ${opts.engineOrigin}${req.url}`);
|
|
229
|
+
},
|
|
230
|
+
error: (err, req, res) => {
|
|
231
|
+
console.error('[Proxy] Error proxying request:', err);
|
|
232
|
+
if (!res.headersSent) {
|
|
233
|
+
res.status(500).send('Proxy error');
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
}));
|
|
238
|
+
app.listen(opts.port, () => {
|
|
239
|
+
console.log(`Dev proxy: http://localhost:${opts.port}`);
|
|
240
|
+
console.log(` → Engine: ${opts.engineOrigin}`);
|
|
241
|
+
console.log(`Override route: GET ${opts.overrideRoute}`);
|
|
242
|
+
console.log(`Serving: ${opts.generatedJsonPath}`);
|
|
243
|
+
console.log(`Reload SSE: /__embeddables_reload`);
|
|
244
|
+
});
|
|
245
|
+
return { broadcastReload };
|
|
246
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/proxy/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAElC,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO;;EAoB7C"}
|