Initial commit with Advoware proxy

This commit is contained in:
root
2025-10-19 14:57:07 +00:00
commit 273aa8b549
45771 changed files with 5534555 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
import { FC } from 'react';
import { ConfigurationLitItem } from '../hooks/use-endpoint-configuration';
interface ConfigurationListItemProps {
value: ConfigurationLitItem;
id: string;
onUpdate: (key: string, field: 'name' | 'value' | 'active', value: string | boolean) => void;
onRemove?: (key: string) => void;
required?: boolean;
}
export declare const ConfigurationListItem: FC<ConfigurationListItemProps>;
export {};
//# sourceMappingURL=configuration-list-item.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"configuration-list-item.d.ts","sourceRoot":"","sources":["../../src/components/configuration-list-item.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAuC,MAAM,OAAO,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAA;AAE1E,UAAU,0BAA0B;IAClC,KAAK,EAAE,oBAAoB,CAAA;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAA;IAC5F,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAmFhE,CAAA"}

View File

@@ -0,0 +1,36 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Button, Checkbox, cn, Input } from '@motiadev/ui';
import { AlertCircle, Check, Trash2 } from 'lucide-react';
import { memo, useCallback, useRef, useState } from 'react';
export const ConfigurationListItem = memo(({ value, id, onUpdate, onRemove, required = false }) => {
const [activeConfiguration, setActiveConfiguration] = useState(null);
const [valueToDelete, setValueToDelete] = useState(null);
const deleteTimeout = useRef(undefined);
const isActive = activeConfiguration === id;
const onDelete = useCallback((key) => {
clearTimeout(deleteTimeout.current);
setValueToDelete(key);
deleteTimeout.current = setTimeout(() => {
setValueToDelete(null);
}, 5000);
}, [setValueToDelete]);
const onMouseOver = useCallback(() => {
if (required)
return;
setActiveConfiguration(id);
}, [id, required]);
const onMouseLeave = useCallback(() => {
if (required)
return;
setActiveConfiguration(null);
}, [required]);
return (_jsxs("div", { className: cn('grid grid-cols-[auto_1fr_auto] items-center py-2 px-4 bg-muted/30 rounded-lg gap-2', isActive && 'bg-card'), onMouseOver: onMouseOver, onMouseLeave: onMouseLeave, children: [_jsx(Checkbox, { checked: value.active, onCheckedChange: (checked) => onUpdate(id, 'active', checked), disabled: required, children: _jsx(Check, { className: "h-3 w-3" }) }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(Input, { readOnly: required, disabled: !value.active, variant: required ? 'outlineReadonly' : 'outline', id: `name-${id}`, defaultValue: value.name, onBlur: (e) => onUpdate(id, 'name', e.target.value), placeholder: "Name", className: "h-8" }), _jsx(Input, { disabled: !value.active, variant: 'outline', id: `value-${id}`, defaultValue: value.value, onBlur: (e) => onUpdate(id, 'value', e.target.value), placeholder: "Value", className: "h-8" })] }), _jsx(Button, { variant: "ghost", size: "icon", onClick: () => {
if (valueToDelete === id) {
onRemove?.(id);
}
else {
onDelete(id);
}
}, className: cn('h-6 w-6 opacity-0 transition-opacity duration-200', isActive && 'opacity-100'), title: valueToDelete === id && isActive ? 'Click again to remove' : 'Remove', children: valueToDelete === id ? _jsx(AlertCircle, { className: "h-3 w-3 text-destructive" }) : _jsx(Trash2, { className: "h-3 w-3" }) })] }));
});
//# sourceMappingURL=configuration-list-item.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"configuration-list-item.js","sourceRoot":"","sources":["../../src/components/configuration-list-item.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAM,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAW/D,MAAM,CAAC,MAAM,qBAAqB,GAAmC,IAAI,CACvE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE,EAAE;IACtD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACnF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvE,MAAM,aAAa,GAAG,MAAM,CAA6B,SAAS,CAAC,CAAA;IACnE,MAAM,QAAQ,GAAG,mBAAmB,KAAK,EAAE,CAAA;IAE3C,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,GAAW,EAAE,EAAE;QACd,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACnC,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACrB,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC,EACD,CAAC,gBAAgB,CAAC,CACnB,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,QAAQ;YAAE,OAAM;QACpB,sBAAsB,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;IAElB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,QAAQ;YAAE,OAAM;QACpB,sBAAsB,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,oFAAoF,EACpF,QAAQ,IAAI,SAAS,CACtB,EACD,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,aAE1B,KAAC,QAAQ,IACP,OAAO,EAAE,KAAK,CAAC,MAAM,EACrB,eAAe,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EACtE,QAAQ,EAAE,QAAQ,YAElB,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,GAAG,GACpB,EACX,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,KAAK,IACJ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,EACvB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,EACjD,EAAE,EAAE,QAAQ,EAAE,EAAE,EAChB,YAAY,EAAE,KAAK,CAAC,IAAI,EACxB,MAAM,EAAE,CAAC,CAAsC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxF,WAAW,EAAC,MAAM,EAClB,SAAS,EAAC,KAAK,GACf,EACF,KAAC,KAAK,IACJ,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,EACvB,OAAO,EAAE,SAAS,EAClB,EAAE,EAAE,SAAS,EAAE,EAAE,EACjB,YAAY,EAAE,KAAK,CAAC,KAAK,EACzB,MAAM,EAAE,CAAC,CAAqC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxF,WAAW,EAAC,OAAO,EACnB,SAAS,EAAC,KAAK,GACf,IACE,EACN,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;wBACzB,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;oBAChB,CAAC;yBAAM,CAAC;wBACN,QAAQ,CAAC,EAAE,CAAC,CAAA;oBACd,CAAC;gBACH,CAAC,EACD,SAAS,EAAE,EAAE,CAAC,mDAAmD,EAAE,QAAQ,IAAI,aAAa,CAAC,EAC7F,KAAK,EAAE,aAAa,KAAK,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,YAE3E,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,SAAS,EAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC,KAAC,MAAM,IAAC,SAAS,EAAC,SAAS,GAAG,GACtG,IACL,CACP,CAAA;AACH,CAAC,CACF,CAAA"}

View File

@@ -0,0 +1,8 @@
import * as React from 'react';
import { ApiRouteMethod } from '../types/endpoint';
interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {
variant: ApiRouteMethod;
}
export declare const EndpointBadge: React.MemoExoticComponent<({ className, variant, ...props }: BadgeProps) => import("react/jsx-runtime").JSX.Element>;
export {};
//# sourceMappingURL=endpoint-badge.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-badge.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAuBlD,UAAU,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAC/D,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,eAAO,MAAM,aAAa,+DAA2C,UAAU,6CAK7E,CAAA"}

View File

@@ -0,0 +1,29 @@
import { jsx as _jsx } from "react/jsx-runtime";
import { cn } from '@motiadev/ui';
import { memo } from 'react';
const getMethodStyles = (method) => {
switch (method.toUpperCase()) {
case 'POST':
return 'bg-[#258DC3]/15 text-[#258DC3]';
case 'GET':
return 'bg-[#709A2D]/15 text-[#709A2D]';
case 'DELETE':
return 'bg-[#DE2134]/15 text-[#DE2134]';
case 'PUT':
return 'bg-[#B9922D]/15 text-[#B9922D]';
case 'PATCH':
return 'bg-[#B9922D]/15 text-[#B9922D]';
case 'HEAD':
return 'bg-[#E221DF]/15 text-[#E221DF]';
case 'OPTIONS':
return 'bg-[#B9922D]/15 text-[#B9922D]';
default:
return 'bg-[#258DC3]/15 text-[#258DC3]'; // default to GET
}
};
export const EndpointBadge = memo(({ className, variant, ...props }) => {
const baseClasses = 'rounded-lg px-2 py-0.5 text-xs font-mono font-bold transition-colors';
const methodClasses = getMethodStyles(variant);
return _jsx("div", { className: cn(baseClasses, methodClasses, className), ...props });
});
//# sourceMappingURL=endpoint-badge.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-badge.js","sourceRoot":"","sources":["../../src/components/endpoint-badge.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAG5B,MAAM,eAAe,GAAG,CAAC,MAAsB,EAAU,EAAE;IACzD,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,gCAAgC,CAAA;QACzC,KAAK,KAAK;YACR,OAAO,gCAAgC,CAAA;QACzC,KAAK,QAAQ;YACX,OAAO,gCAAgC,CAAA;QACzC,KAAK,KAAK;YACR,OAAO,gCAAgC,CAAA;QACzC,KAAK,OAAO;YACV,OAAO,gCAAgC,CAAA;QACzC,KAAK,MAAM;YACT,OAAO,gCAAgC,CAAA;QACzC,KAAK,SAAS;YACZ,OAAO,gCAAgC,CAAA;QACzC;YACE,OAAO,gCAAgC,CAAA,CAAC,iBAAiB;IAC7D,CAAC;AACH,CAAC,CAAA;AAMD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAc,EAAE,EAAE;IACjF,MAAM,WAAW,GAAG,sEAAsE,CAAA;IAC1F,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAE9C,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAAA;AACjF,CAAC,CAAC,CAAA"}

View File

@@ -0,0 +1,11 @@
import { FC } from 'react';
import { ApiEndpoint } from '../types/endpoint';
type EndpointItemProps = {
endpoint: ApiEndpoint;
isSelected: boolean;
isLast: boolean;
onSelect: (id: string) => void;
};
export declare const EndpointItem: FC<EndpointItemProps>;
export {};
//# sourceMappingURL=endpoint-item.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-item.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-item.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,WAAW,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAgC9C,CAAA"}

View File

@@ -0,0 +1,5 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { cn } from '@motiadev/ui';
import { EndpointPath } from './endpoint-path';
export const EndpointItem = ({ endpoint, isSelected, isLast, onSelect }) => (_jsxs("div", { "data-testid": `endpoint-${endpoint.method}-${endpoint.path}`, onClick: () => onSelect(endpoint.id), className: cn('grid grid-cols-[auto_1fr] items-center justify-center px-[17px] select-none hover:bg-muted-foreground/10 cursor-pointer', isSelected && 'bg-muted-foreground/10'), children: [isLast ? (_jsx("svg", { width: "14", height: "34", viewBox: "0 0 12 34", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M6.5 16.5C6.50006 19.2614 8.7386 21.4999 11.5 21.5C11.7759 21.5003 12 21.724 12 22C12 22.276 11.7759 22.4997 11.5 22.5C8.18632 22.4999 5.50006 19.8137 5.5 16.5V0H6.5V16.5Z", className: "fill-[#555]" }) })) : (_jsx("svg", { width: "14", height: "34", viewBox: "0 0 12 34", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { d: "M6.5 0V11.5C6.50007 14.2614 8.73861 16.4999 11.5 16.5C11.7759 16.5003 12 16.724 12 17C12 17.276 11.7759 17.4997 11.5 17.5C9.41273 17.5 7.57486 16.4335 6.5 14.8164V34H5.5V0H6.5Z", className: "fill-[#555]" }) })), _jsx("div", { children: _jsxs("div", { className: "grid grid-cols-[auto_1fr] items-center gap-3 px-2", children: [_jsx(EndpointPath, { method: endpoint.method, path: endpoint.path }), _jsx("span", { className: "text-sm text-muted-foreground truncate", children: endpoint.description })] }) })] }));
//# sourceMappingURL=endpoint-item.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-item.js","sourceRoot":"","sources":["../../src/components/endpoint-item.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAS9C,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACjG,8BACe,YAAY,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,EAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EACpC,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,UAAU,IAAI,wBAAwB,CACvC,aAEA,MAAM,CAAC,CAAC,CAAC,CACR,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B,YAC5F,eACE,CAAC,EAAC,6KAA6K,EAC/K,SAAS,EAAC,aAAa,GACvB,GACE,CACP,CAAC,CAAC,CAAC,CACF,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B,YAC5F,eACE,CAAC,EAAC,kLAAkL,EACpL,SAAS,EAAC,aAAa,GACvB,GACE,CACP,EAED,wBACE,eAAK,SAAS,EAAC,mDAAmD,aAChE,KAAC,YAAY,IAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAI,EAC9D,eAAM,SAAS,EAAC,wCAAwC,YAAE,QAAQ,CAAC,WAAW,GAAQ,IAClF,GACF,IACF,CACP,CAAA"}

View File

@@ -0,0 +1,8 @@
import { FC } from 'react';
interface EndpointPathPreviewProps {
path: string;
baseUrl?: string;
}
export declare const EndpointPathPreview: FC<EndpointPathPreviewProps>;
export {};
//# sourceMappingURL=endpoint-path-preview.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-path-preview.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-path-preview.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAY,MAAM,OAAO,CAAA;AAGpC,UAAU,wBAAwB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CAyC5D,CAAA"}

View File

@@ -0,0 +1,22 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Button, cn } from '@motiadev/ui';
import { Check, Copy } from 'lucide-react';
import { useState } from 'react';
import { usePathUrl } from '../hooks/use-path-url';
export const EndpointPathPreview = ({ path, baseUrl = window.location.origin }) => {
const pathUrl = usePathUrl(path);
const fullUrl = `${baseUrl}${pathUrl}`;
const [copied, setCopied] = useState(false);
const handleCopy = async () => {
try {
await navigator.clipboard.writeText(fullUrl);
setCopied(true);
setTimeout(() => setCopied(false), 2000);
}
catch (err) {
console.error('Failed to copy URL:', err);
}
};
return (_jsxs("div", { className: "grid grid-cols-[auto_1fr] items-center gap-5 px-5 relative border-b border-border", children: [_jsx("div", { className: "text-sm font-medium py-2", children: "URL Preview" }), _jsxs("div", { className: "bg-muted-foreground/10 box-border grid grid-cols-[1fr_auto] gap-1 h-6 items-center px-2 py-1 rounded border border-border", children: [_jsx("div", { className: "min-w-0", children: _jsx("div", { className: "font-medium text-xs text-muted-foreground truncate", title: fullUrl, children: fullUrl }) }), _jsx(Button, { onClick: handleCopy, className: cn('w-3 h-3 grid place-items-center transition-colors cursor-pointer', copied ? 'text-green-400' : 'text-muted-foreground'), variant: "icon", size: "small", "aria-label": "Copy URL", children: copied ? _jsx(Check, { className: "w-2.5 h-2.5" }) : _jsx(Copy, { className: "w-2.5 h-2.5" }) })] })] }));
};
//# sourceMappingURL=endpoint-path-preview.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-path-preview.js","sourceRoot":"","sources":["../../src/components/endpoint-path-preview.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAOlD,MAAM,CAAC,MAAM,mBAAmB,GAAiC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE;IAC9G,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,OAAO,GAAG,GAAG,OAAO,GAAG,OAAO,EAAE,CAAA;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAC5C,SAAS,CAAC,IAAI,CAAC,CAAA;YACf,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAC,mFAAmF,aAChG,cAAK,SAAS,EAAC,0BAA0B,4BAAkB,EAE3D,eAAK,SAAS,EAAC,2HAA2H,aACxI,cAAK,SAAS,EAAC,SAAS,YACtB,cAAK,SAAS,EAAC,oDAAoD,EAAC,KAAK,EAAE,OAAO,YAC/E,OAAO,GACJ,GACF,EAEN,KAAC,MAAM,IACL,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,EAAE,CACX,kEAAkE,EAClE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,CACpD,EACD,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,OAAO,gBACD,UAAU,YAEpB,MAAM,CAAC,CAAC,CAAC,KAAC,KAAK,IAAC,SAAS,EAAC,aAAa,GAAG,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,aAAa,GAAG,GACvE,IACL,IACF,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,8 @@
import { FC } from 'react';
interface EndpointPathProps {
method: string;
path: string;
}
export declare const EndpointPath: FC<EndpointPathProps>;
export {};
//# sourceMappingURL=endpoint-path.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-path.d.ts","sourceRoot":"","sources":["../../src/components/endpoint-path.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAA;AAInC,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAMD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAiC9C,CAAA"}

View File

@@ -0,0 +1,26 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { useMemo } from 'react';
import { EndpointBadge } from './endpoint-badge';
const PathSeparator = () => {
return _jsx("div", { className: "text-muted-foreground", children: "/" });
};
export const EndpointPath = ({ method, path }) => {
const pathView = useMemo(() => {
const parts = path.split('/').filter(Boolean);
const partsLength = parts.length - 1;
return parts.flatMap((part, index) => {
const isLast = index === partsLength;
const key = `part-${part}-${index}`;
const separator = isLast ? undefined : _jsx(PathSeparator, {}, `separator-${key}`);
if (part.startsWith(':')) {
return [
_jsx("div", { className: "bg-[#2862FE]/20 text-[#2862FE] rounded-sm px-1 py-0.5 text-sm font-mono font-bold font-medium", children: part }, key),
separator,
];
}
return [_jsx("div", { children: part }, key), separator];
});
}, [path]);
return (_jsxs("div", { className: "grid grid-cols-[auto_1fr] gap-2 items-center", children: [_jsx(EndpointBadge, { variant: method, children: method }), _jsxs("span", { className: "font-mono font-bold whitespace-nowrap flex flex-row gap-2 items-center truncate", children: [_jsx(PathSeparator, {}), pathView] })] }));
};
//# sourceMappingURL=endpoint-path.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoint-path.js","sourceRoot":"","sources":["../../src/components/endpoint-path.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,OAAO,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAQhD,MAAM,aAAa,GAAG,GAAG,EAAE;IACzB,OAAO,cAAK,SAAS,EAAC,uBAAuB,kBAAQ,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;QACpC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,KAAK,KAAK,WAAW,CAAA;YACpC,MAAM,GAAG,GAAG,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAA;YACnC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAC,aAAa,MAAM,aAAa,GAAG,EAAE,CAAI,CAAA;YAEjF,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,cAEE,SAAS,EAAC,+FAA+F,YAExG,IAAI,IAHA,GAAG,CAIJ;oBACN,SAAS;iBACV,CAAA;YACH,CAAC;YACD,OAAO,CAAC,wBAAgB,IAAI,IAAV,GAAG,CAAc,EAAE,SAAS,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,OAAO,CACL,eAAK,SAAS,EAAC,8CAA8C,aAC3D,KAAC,aAAa,IAAC,OAAO,EAAE,MAAwB,YAAG,MAAM,GAAiB,EAC1E,gBAAM,SAAS,EAAC,iFAAiF,aAC/F,KAAC,aAAa,KAAG,EAChB,QAAQ,IACJ,IACH,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,8 @@
type EndpointsSearchProps = {
value: string;
onChange: (value: string) => void;
onClear: () => void;
};
export declare const EndpointsSearch: ({ value, onChange, onClear }: EndpointsSearchProps) => import("react/jsx-runtime").JSX.Element;
export {};
//# sourceMappingURL=endpoints-search.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoints-search.d.ts","sourceRoot":"","sources":["../../src/components/endpoints-search.tsx"],"names":[],"mappings":"AAGA,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,8BAA8B,oBAAoB,4CAyBjF,CAAA"}

View File

@@ -0,0 +1,10 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { cn, Input } from '@motiadev/ui';
import { Search, X } from 'lucide-react';
export const EndpointsSearch = ({ value, onChange, onClear }) => {
return (_jsx("div", { className: "p-2 border-b gap-4", "data-testid": "endpoints-search-container", children: _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50" }), _jsx(Input, { variant: "shade", value: value, onChange: (e) => onChange(e.target.value), className: "px-9 font-medium", placeholder: "Search by Method or Path" }), _jsx(X, { className: cn('cursor-pointer absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground/50 hover:text-muted-foreground', {
visible: value !== '',
invisible: value === '',
}), onClick: onClear })] }) }));
};
//# sourceMappingURL=endpoints-search.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoints-search.js","sourceRoot":"","sources":["../../src/components/endpoints-search.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAQxC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAwB,EAAE,EAAE;IACpF,OAAO,CACL,cAAK,SAAS,EAAC,oBAAoB,iBAAa,4BAA4B,YAC1E,eAAK,SAAS,EAAC,UAAU,aACvB,KAAC,MAAM,IAAC,SAAS,EAAC,2EAA2E,GAAG,EAChG,KAAC,KAAK,IACJ,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAC,kBAAkB,EAC5B,WAAW,EAAC,0BAA0B,GACtC,EACF,KAAC,CAAC,IACA,SAAS,EAAE,EAAE,CACX,uHAAuH,EACvH;wBACE,OAAO,EAAE,KAAK,KAAK,EAAE;wBACrB,SAAS,EAAE,KAAK,KAAK,EAAE;qBACxB,CACF,EACD,OAAO,EAAE,OAAO,GAChB,IACE,GACF,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,15 @@
import { FC } from 'react';
import { ApiEndpoint } from '../types/endpoint';
type FlowGroupProps = {
flow: string;
endpoints: ApiEndpoint[];
isOpen: boolean;
isSelected: boolean;
onToggle: (flow: string) => void;
onClearSelection: () => void;
selectedEndpointId?: string;
onSelectEndpoint: (id: string) => void;
};
export declare const FlowGroup: FC<FlowGroupProps>;
export {};
//# sourceMappingURL=flow-group.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"flow-group.d.ts","sourceRoot":"","sources":["../../src/components/flow-group.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,WAAW,EAAE,CAAA;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAyDxC,CAAA"}

View File

@@ -0,0 +1,13 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { cn } from '@motiadev/ui';
import { ChevronDown } from 'lucide-react';
import { EndpointItem } from './endpoint-item';
export const FlowGroup = ({ flow, endpoints, isOpen, isSelected, onToggle, onClearSelection, selectedEndpointId, onSelectEndpoint, }) => {
return (_jsxs("div", { className: "pt-2", children: [_jsxs("button", { "data-testid": `flow-group-${flow}`, className: "w-full grid grid-cols-[auto_1fr] items-center gap-3 hover:bg-muted/40 cursor-pointer min-h-8.5 select-none hover:bg-muted-foreground/10 px-4", onClick: () => {
if (isSelected) {
onClearSelection();
}
onToggle(flow);
}, children: [_jsxs("div", { className: "grid grid-cols-1", children: [_jsx(ChevronDown, { className: cn('w-4 h-4 transition-transform duration-300 text-[#555]', { 'rotate-180 mt-2.5': isOpen }), strokeWidth: 1.5 }), _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "2", height: "10", viewBox: "0 0 2 10", fill: "none", className: cn('ml-[7px]', { hidden: !isOpen }), children: _jsx("path", { d: "M1.5 1C1.5 0.723858 1.27614 0.5 1 0.5C0.723858 0.5 0.5 0.723858 0.5 1H1H1.5ZM1 1H0.5V10H1H1.5V1H1Z", className: "fill-[#555]" }) })] }), _jsx("h3", { className: "text-sm font-medium text-left", children: flow })] }), _jsx("div", { className: cn('grid grid-cols-1 items-center justify-center', { hidden: !isOpen }), children: endpoints.map((endpoint, index) => (_jsx(EndpointItem, { endpoint: endpoint, isSelected: selectedEndpointId === endpoint.id, isLast: index === endpoints.length - 1, onSelect: onSelectEndpoint }, endpoint.id))) })] }));
};
//# sourceMappingURL=flow-group.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"flow-group.js","sourceRoot":"","sources":["../../src/components/flow-group.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAa9C,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,EAC5C,IAAI,EACJ,SAAS,EACT,MAAM,EACN,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACD,EAAE,EAAE;IACnB,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,iCACe,cAAc,IAAI,EAAE,EACjC,SAAS,EAAC,8IAA8I,EACxJ,OAAO,EAAE,GAAG,EAAE;oBACZ,IAAI,UAAU,EAAE,CAAC;wBACf,gBAAgB,EAAE,CAAA;oBACpB,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,CAAA;gBAChB,CAAC,aAED,eAAK,SAAS,EAAC,kBAAkB,aAC/B,KAAC,WAAW,IACV,SAAS,EAAE,EAAE,CAAC,uDAAuD,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,EACvG,WAAW,EAAE,GAAG,GAChB,EACF,cACE,KAAK,EAAC,4BAA4B,EAClC,KAAK,EAAC,GAAG,EACT,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,UAAU,EAClB,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,YAE9C,eACE,CAAC,EAAC,oGAAoG,EACtG,SAAS,EAAC,aAAa,GACvB,GACE,IACF,EACN,aAAI,SAAS,EAAC,+BAA+B,YAAE,IAAI,GAAM,IAClD,EAET,cAAK,SAAS,EAAE,EAAE,CAAC,8CAA8C,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,YACpF,SAAS,CAAC,GAAG,CAAC,CAAC,QAAqB,EAAE,KAAa,EAAE,EAAE,CAAC,CACvD,KAAC,YAAY,IAEX,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,kBAAkB,KAAK,QAAQ,CAAC,EAAE,EAC9C,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EACtC,QAAQ,EAAE,gBAAgB,IAJrB,QAAQ,CAAC,EAAE,CAKhB,CACH,CAAC,GACE,IACF,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,12 @@
import { FC } from 'react';
type JsonEditorProps = {
value: string;
schema?: Record<string, unknown>;
onChange?: (value: string) => void;
onValidate?: (isValid: boolean) => void;
language?: 'json' | string;
readOnly?: boolean;
};
export declare const JsonEditor: FC<JsonEditorProps>;
export {};
//# sourceMappingURL=json-editor.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"json-editor.d.ts","sourceRoot":"","sources":["../../src/components/json-editor.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAwC,MAAM,OAAO,CAAA;AAEhE,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA4H1C,CAAA"}

View File

@@ -0,0 +1,105 @@
import { jsx as _jsx } from "react/jsx-runtime";
import { useThemeStore } from '@motiadev/ui';
import { Editor, useMonaco } from '@monaco-editor/react';
import { useEffect, useMemo, useRef, useState } from 'react';
export const JsonEditor = ({ value, schema, onChange, onValidate, language = 'json', readOnly = false, }) => {
const monaco = useMonaco();
const theme = useThemeStore((state) => state.theme);
const editorTheme = useMemo(() => (theme === 'dark' ? 'transparent-dark' : 'transparent-light'), [theme]);
const [editor, setEditor] = useState(null);
const resizeAnimationFrameRef = useRef(null);
useEffect(() => {
if (!monaco)
return;
monaco.editor.defineTheme('transparent-light', {
base: 'vs',
inherit: true,
rules: [],
colors: {
'editor.background': '#00000000',
'editor.lineHighlightBackground': '#00000000',
'editorLineNumber.foreground': '#999999',
'editorLineNumber.activeForeground': '#000000',
focusBorder: '#00000000',
'widget.border': '#00000000',
'editor.border': '#00000000',
'editorWidget.border': '#00000000',
},
});
monaco.editor.defineTheme('transparent-dark', {
base: 'vs-dark',
inherit: true,
rules: [],
colors: {
'editor.background': '#00000000',
'editor.lineHighlightBackground': '#00000000',
'editorLineNumber.foreground': '#666666',
'editorLineNumber.activeForeground': '#ffffff',
focusBorder: '#00000000',
'widget.border': '#00000000',
'editor.border': '#00000000',
'editorWidget.border': '#00000000',
},
});
}, [monaco]);
useEffect(() => {
if (!monaco)
return;
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ isolatedModules: true });
monaco.languages.json.jsonDefaults.setDiagnosticsOptions({
schemas: schema
? [
{
uri: window.location.href,
fileMatch: ['*'],
schema,
},
]
: [],
});
}, [monaco, schema]);
useEffect(() => {
if (!monaco)
return;
monaco.editor.setTheme(editorTheme);
}, [monaco, editorTheme]);
useEffect(() => {
if (!editor)
return;
const container = editor.getContainerDomNode().parentElement?.parentElement;
if (!container)
return;
const handleResize = () => {
if (resizeAnimationFrameRef.current !== null) {
cancelAnimationFrame(resizeAnimationFrameRef.current);
}
resizeAnimationFrameRef.current = requestAnimationFrame(() => {
const { width, height } = container.getBoundingClientRect();
editor.layout({ width, height });
resizeAnimationFrameRef.current = null;
});
};
handleResize();
const resizeObserver = new ResizeObserver(handleResize);
resizeObserver.observe(container);
return () => {
resizeObserver.disconnect();
if (resizeAnimationFrameRef.current !== null) {
cancelAnimationFrame(resizeAnimationFrameRef.current);
}
};
}, [editor]);
return (_jsx(Editor, { "data-testid": "json-editor", language: language, value: value, theme: editorTheme, onMount: setEditor, onChange: (value) => {
if (!value) {
onValidate?.(false);
}
onChange?.(value ?? '');
}, onValidate: (markers) => onValidate?.(markers.length === 0), options: {
automaticLayout: false,
readOnly,
scrollBeyondLastLine: false,
minimap: { enabled: false },
overviewRulerLanes: 0,
} }));
};
//# sourceMappingURL=json-editor.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"json-editor.js","sourceRoot":"","sources":["../../src/components/json-editor.tsx"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
export declare const EndpointsPage: () => import("react/jsx-runtime").JSX.Element;
//# sourceMappingURL=endpoints-page.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoints-page.d.ts","sourceRoot":"","sources":["../src/endpoints-page.tsx"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa,+CAwDzB,CAAA"}

View File

@@ -0,0 +1,29 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { cn } from '@motiadev/ui';
import { useCallback, useMemo, useState } from 'react';
import { EndpointsSearch } from './components/endpoints-search';
import { FlowGroup } from './components/flow-group';
import { useEndpointConfiguration } from './hooks/use-endpoint-configuration';
import { useGetEndpoints } from './hooks/use-get-endpoints';
import { SidePanel } from './play/side-panel';
export const EndpointsPage = () => {
const { endpoints, groupedEndpoints } = useGetEndpoints();
const { selectedEndpointId, setSelectedEndpointId, toggleFlowGroupStatus, flowGroupStatus } = useEndpointConfiguration();
const selectedEndpoint = useMemo(() => endpoints.find((endpoint) => endpoint.id === selectedEndpointId), [endpoints, selectedEndpointId]);
const onClose = useCallback(() => {
setSelectedEndpointId('');
}, [setSelectedEndpointId]);
const [search, setSearch] = useState('');
const filteredEndpoints = useMemo(() => {
return Object.entries(groupedEndpoints).filter(([_, endpoints]) => {
return endpoints.some((endpoint) => endpoint.method?.toLowerCase().includes(search.toLowerCase()) ||
endpoint.path?.toLowerCase().includes(search.toLowerCase()));
});
}, [groupedEndpoints, search]);
return (_jsxs("div", { className: cn('grid h-full max-h-full', selectedEndpoint ? 'grid-cols-[300px_1fr] ' : 'grid-cols-1'), "data-testid": "endpoints-list", children: [_jsxs("div", { className: "grid grid-rows-[auto_1fr] h-full overflow-auto min-w-0", children: [_jsx(EndpointsSearch, { value: search, onChange: setSearch, onClear: () => setSearch('') }), _jsx("div", { className: "grid grid-cols-1 auto-rows-max overflow-auto min-w-0", children: filteredEndpoints.map(([flow, endpoints]) => {
const isSelected = endpoints.some((endpoint) => endpoint.id === selectedEndpointId);
const isOpen = !flowGroupStatus[flow] || isSelected || search !== '';
return (_jsx(FlowGroup, { flow: flow, endpoints: endpoints, isOpen: isOpen, isSelected: isSelected, onToggle: toggleFlowGroupStatus, onClearSelection: () => setSelectedEndpointId(''), selectedEndpointId: selectedEndpointId, onSelectEndpoint: setSelectedEndpointId }, flow));
}) })] }), selectedEndpoint && _jsx(SidePanel, { endpoint: selectedEndpoint, onClose: onClose })] }));
};
//# sourceMappingURL=endpoints-page.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"endpoints-page.js","sourceRoot":"","sources":["../src/endpoints-page.tsx"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,78 @@
export type ConfigurationLitItem = {
name: string;
value: string;
active: boolean;
};
export type Headers = {
[key: string]: ConfigurationLitItem;
};
export type Params = {
[key: string]: ConfigurationLitItem;
};
export type ResponseData = {
headers: Record<string, string>;
body: Record<string, any>;
statusCode: number;
executionTime: number;
};
type Actions = {
setResponse: (response: Response | undefined, startTime?: number) => void;
setHeaders: (headers: Headers) => void;
removeHeaders: (key: string) => void;
setBody: (body: string) => void;
setSelectedEndpointId: (selectedEndpointId: string | undefined) => void;
setQueryParams: (params: Params) => void;
removeQueryParams: (key: string) => void;
setPathParams: (pathParams: Params) => void;
removePathParams: (key: string) => void;
setBodyIsValid: (bodyIsValid: boolean) => void;
toggleFlowGroupStatus: (flow: string) => void;
};
type State = {
selectedEndpointId: string;
headers: Record<string, Headers>;
body: Record<string, string>;
bodyIsValid: Record<string, boolean>;
response: Record<string, ResponseData | undefined>;
queryParams: Record<string, Params>;
pathParams: Record<string, Params>;
flowGroupStatus: Record<string, boolean>;
};
export type UseEndpointConfiguration = State & Actions;
export declare const getHeadersSelector: (state: UseEndpointConfiguration) => Headers;
export declare const getBodyIsValidSelector: (state: UseEndpointConfiguration) => boolean;
export declare const getBodySelector: (state: UseEndpointConfiguration) => string;
export declare const getResponseSelector: (state: UseEndpointConfiguration) => ResponseData | undefined;
export declare const getQueryParamsSelector: (state: UseEndpointConfiguration) => Params;
export declare const getPathParamsSelector: (state: UseEndpointConfiguration) => Params;
export declare const useEndpointConfiguration: import("zustand").UseBoundStore<Omit<Omit<import("zustand").StoreApi<UseEndpointConfiguration>, "setState" | "persist"> & {
setState(partial: UseEndpointConfiguration | Partial<UseEndpointConfiguration> | ((state: UseEndpointConfiguration) => UseEndpointConfiguration | Partial<UseEndpointConfiguration>), replace?: false | undefined): unknown;
setState(state: UseEndpointConfiguration | ((state: UseEndpointConfiguration) => UseEndpointConfiguration), replace: true): unknown;
persist: {
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<UseEndpointConfiguration, unknown, unknown>>) => void;
clearStorage: () => void;
rehydrate: () => Promise<void> | void;
hasHydrated: () => boolean;
onHydrate: (fn: (state: UseEndpointConfiguration) => void) => () => void;
onFinishHydration: (fn: (state: UseEndpointConfiguration) => void) => () => void;
getOptions: () => Partial<import("zustand/middleware").PersistOptions<UseEndpointConfiguration, unknown, unknown>>;
};
}, "setState" | "devtools"> & {
setState(partial: UseEndpointConfiguration | Partial<UseEndpointConfiguration> | ((state: UseEndpointConfiguration) => UseEndpointConfiguration | Partial<UseEndpointConfiguration>), replace?: false | undefined, action?: (string | {
[x: string]: unknown;
[x: number]: unknown;
[x: symbol]: unknown;
type: string;
}) | undefined): unknown;
setState(state: UseEndpointConfiguration | ((state: UseEndpointConfiguration) => UseEndpointConfiguration), replace: true, action?: (string | {
[x: string]: unknown;
[x: number]: unknown;
[x: symbol]: unknown;
type: string;
}) | undefined): unknown;
devtools: {
cleanup: () => void;
};
}>;
export {};
//# sourceMappingURL=use-endpoint-configuration.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-endpoint-configuration.d.ts","sourceRoot":"","sources":["../../src/hooks/use-endpoint-configuration.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,MAAM,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAA;CACpC,CAAA;AAQD,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,KAAK,OAAO,GAAG;IACb,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACzE,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,qBAAqB,EAAE,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IACvE,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,cAAc,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,KAAK,KAAK,GAAG;IACX,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC,CAAA;IAClD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,KAAK,GAAG,OAAO,CAAA;AAEtD,eAAO,MAAM,kBAAkB,GAAI,OAAO,wBAAwB,YAMjE,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,OAAO,wBAAwB,YAMrE,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,wBAAwB,WAM9D,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,wBAAwB,6BAMlE,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,OAAO,wBAAwB,WAMrE,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,wBAAwB,WAMpE,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FpC,CAAA"}

View File

@@ -0,0 +1,130 @@
import { create } from 'zustand';
import { createJSONStorage, devtools, persist } from 'zustand/middleware';
const defaultHeaders = {
CONTENT_TYPE: { name: 'Content-Type', value: 'application/json', active: true },
USER_AGENT: { name: 'User-Agent', value: 'Motia/1.0', active: true },
ACCEPT: { name: 'Accept', value: 'application/json', active: true },
};
export const getHeadersSelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.headers[selectedEndpointId] || defaultHeaders;
}
return defaultHeaders;
};
export const getBodyIsValidSelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.bodyIsValid[selectedEndpointId];
}
return true;
};
export const getBodySelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.body[selectedEndpointId] || '';
}
return '';
};
export const getResponseSelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.response[selectedEndpointId] || undefined;
}
return undefined;
};
export const getQueryParamsSelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.queryParams[selectedEndpointId] || {};
}
return {};
};
export const getPathParamsSelector = (state) => {
const selectedEndpointId = state.selectedEndpointId;
if (selectedEndpointId) {
return state.pathParams[selectedEndpointId] || {};
}
return {};
};
export const useEndpointConfiguration = create()(persist(devtools((set) => ({
selectedEndpointId: '',
headers: {},
body: {},
bodyIsValid: {},
response: {},
queryParams: {},
pathParams: {},
flowGroupStatus: {},
toggleFlowGroupStatus: (flow) => set((state) => ({ flowGroupStatus: { ...state.flowGroupStatus, [flow]: !state.flowGroupStatus[flow] } })),
setSelectedEndpointId: (selectedEndpointId) => set({ selectedEndpointId }),
setQueryParams: (queryParams) => set((state) => ({ queryParams: { ...state.queryParams, [state.selectedEndpointId]: queryParams } })),
removeQueryParams: (key) => set((state) => {
const newQueryParams = { ...state.queryParams[state.selectedEndpointId] };
delete newQueryParams[key];
return {
queryParams: {
...state.queryParams,
[state.selectedEndpointId]: newQueryParams,
},
};
}),
setPathParams: (pathParams) => set((state) => ({ pathParams: { ...state.pathParams, [state.selectedEndpointId]: pathParams } })),
removePathParams: (key) => set((state) => {
const newPathParams = { ...state.pathParams[state.selectedEndpointId] };
delete newPathParams[key];
return {
pathParams: {
...state.pathParams,
[state.selectedEndpointId]: newPathParams,
},
};
}),
setHeaders: (headers) => set((state) => ({ headers: { ...state.headers, [state.selectedEndpointId]: headers } })),
setResponse: async (response, startTime) => {
if (!response) {
set((state) => ({
response: {
...state.response,
[state.selectedEndpointId]: undefined,
},
}));
return;
}
let body = undefined;
try {
body = response ? await response.json() : undefined;
}
catch (error) {
console.error('Error setting response:', error);
}
set((state) => ({
response: {
...state.response,
[state.selectedEndpointId]: {
executionTime: Date.now() - startTime,
statusCode: response?.status,
headers: response?.headers ? Object.fromEntries(response.headers.entries()) : {},
body: body,
},
},
}));
},
setBody: (body) => set((state) => ({ body: { ...state.body, [state.selectedEndpointId]: body } })),
removeHeaders: (key) => set((state) => {
const currentHeaders = state.headers[state.selectedEndpointId] || defaultHeaders;
const newHeaders = { ...currentHeaders };
delete newHeaders[key];
return {
headers: {
...state.headers,
[state.selectedEndpointId]: newHeaders,
},
};
}),
setBodyIsValid: (bodyIsValid) => set((state) => ({ bodyIsValid: { ...state.bodyIsValid, [state.selectedEndpointId]: bodyIsValid } })),
})), {
name: 'motia-endpoint-configuration',
storage: createJSONStorage(() => localStorage),
}));
//# sourceMappingURL=use-endpoint-configuration.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
import { ApiEndpoint } from '../types/endpoint';
export declare const useGetEndpoints: () => {
endpoints: ApiEndpoint[];
groupedEndpoints: Record<string, ApiEndpoint[]>;
};
//# sourceMappingURL=use-get-endpoints.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-get-endpoints.d.ts","sourceRoot":"","sources":["../../src/hooks/use-get-endpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,eAAO,MAAM,eAAe;;;CAyB3B,CAAA"}

View File

@@ -0,0 +1,23 @@
import { useStreamGroup } from '@motiadev/stream-client-react';
import { useMemo } from 'react';
export const useGetEndpoints = () => {
const { data: endpoints } = useStreamGroup({
streamName: '__motia.api-endpoints',
groupId: 'default',
});
const groupedEndpoints = useMemo(() => {
return endpoints.reduce((acc, endpoint) => {
endpoint.flows?.forEach((flow) => {
acc[flow] = acc[flow] || [];
acc[flow].push(endpoint);
});
if (endpoint.flows?.length == 0) {
acc['no-flow'] = acc['no-flow'] || [];
acc['no-flow'].push(endpoint);
}
return acc;
}, {});
}, [endpoints]);
return { endpoints, groupedEndpoints };
};
//# sourceMappingURL=use-get-endpoints.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-get-endpoints.js","sourceRoot":"","sources":["../../src/hooks/use-get-endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,cAAc,CAAc;QACtD,UAAU,EAAE,uBAAuB;QACnC,OAAO,EAAE,SAAS;KACnB,CAAC,CAAA;IAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE;QACpC,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YAChB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC/B,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;gBAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1B,CAAC,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;gBAChC,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;gBACrC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/B,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAAmC,CACpC,CAAA;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAA;AACxC,CAAC,CAAA"}

View File

@@ -0,0 +1,5 @@
export declare const useJsonSchemaToJson: (schema: Record<string, any> | undefined) => {
body: string;
setBody: import("react").Dispatch<import("react").SetStateAction<string>>;
};
//# sourceMappingURL=use-json-schema-to-json.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-json-schema-to-json.d.ts","sourceRoot":"","sources":["../../src/hooks/use-json-schema-to-json.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;;;CAU1E,CAAA"}

View File

@@ -0,0 +1,12 @@
import { useEffect, useState } from 'react';
import { convertJsonSchemaToJson } from './utils';
export const useJsonSchemaToJson = (schema) => {
const [body, setBody] = useState('');
useEffect(() => {
if (schema) {
setBody(JSON.stringify(convertJsonSchemaToJson(schema), null, 2));
}
}, [schema]);
return { body, setBody };
};
//# sourceMappingURL=use-json-schema-to-json.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-json-schema-to-json.js","sourceRoot":"","sources":["../../src/hooks/use-json-schema-to-json.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAuC,EAAE,EAAE;IAC7E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACnE,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const usePathParams: (path: string) => string[];
//# sourceMappingURL=use-path-params.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-path-params.d.ts","sourceRoot":"","sources":["../../src/hooks/use-path-params.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,aAGzC,CAAA"}

View File

@@ -0,0 +1,5 @@
export const usePathParams = (path) => {
const pathParams = path.match(/:(\w+)/g);
return pathParams?.map((param) => param.slice(1)) ?? [];
};
//# sourceMappingURL=use-path-params.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-path-params.js","sourceRoot":"","sources":["../../src/hooks/use-path-params.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACxC,OAAO,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AACzD,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const usePathUrl: (path: string) => string;
//# sourceMappingURL=use-path-url.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-path-url.d.ts","sourceRoot":"","sources":["../../src/hooks/use-path-url.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,WAYtC,CAAA"}

View File

@@ -0,0 +1,15 @@
import { useMemo } from 'react';
import { getPathParamsSelector, getQueryParamsSelector, useEndpointConfiguration, } from './use-endpoint-configuration';
import { useShallow } from 'zustand/react/shallow';
const queryParamsSelector = (state) => Object.values(getQueryParamsSelector(state)).filter((param) => param.active && param.value !== '' && param.name !== '');
export const usePathUrl = (path) => {
const pathParams = useEndpointConfiguration(useShallow(getPathParamsSelector));
const queryParams = useEndpointConfiguration(useShallow(queryParamsSelector));
return useMemo(() => {
const url = path.replace(/:(\w+)/g, (match, p1) => {
return pathParams[p1]?.value || match;
});
return (url + (queryParams.length > 0 ? `?${queryParams.map((param) => `${param.name}=${param.value}`).join('&')}` : ''));
}, [path, pathParams, queryParams]);
};
//# sourceMappingURL=use-path-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-path-url.js","sourceRoot":"","sources":["../../src/hooks/use-path-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EAEtB,wBAAwB,GACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAElD,MAAM,mBAAmB,GAAG,CAAC,KAA+B,EAAE,EAAE,CAC9D,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CACjD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CACnE,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;IACzC,MAAM,UAAU,GAAG,wBAAwB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,wBAAwB,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAE7E,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAChD,OAAO,UAAU,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,KAAK,CAAA;QACvC,CAAC,CAAC,CAAA;QACF,OAAO,CACL,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACjH,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;AACrC,CAAC,CAAA"}

View File

@@ -0,0 +1,8 @@
export declare const useStateStream: (object: Record<string, any> | undefined) => {
data: {};
originalData: any[] | {
[x: string]: any;
};
isStreamed: boolean;
};
//# sourceMappingURL=use-state-stream.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-state-stream.d.ts","sourceRoot":"","sources":["../../src/hooks/use-state-stream.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;;;;;;CAUrE,CAAA"}

View File

@@ -0,0 +1,12 @@
import { useStreamItem } from '@motiadev/stream-client-react';
export const useStateStream = (object) => {
const { __motia, ...rest } = object || {};
const { data } = useStreamItem(__motia);
const originalData = Array.isArray(object) ? object : rest || object;
return {
data: data || originalData,
originalData,
isStreamed: !!__motia,
};
};
//# sourceMappingURL=use-state-stream.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"use-state-stream.js","sourceRoot":"","sources":["../../src/hooks/use-state-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAE7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAuC,EAAE,EAAE;IACxE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IACzC,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAA;IAEpE,OAAO;QACL,IAAI,EAAE,IAAI,IAAI,YAAY;QAC1B,YAAY;QACZ,UAAU,EAAE,CAAC,CAAC,OAAO;KACtB,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const convertJsonSchemaToJson: (schema?: Record<string, any>) => any;
//# sourceMappingURL=utils.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/hooks/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,GA+BtE,CAAA"}

View File

@@ -0,0 +1,30 @@
export const convertJsonSchemaToJson = (schema) => {
if (!schema)
return {};
if (schema.type === 'object') {
const result = {};
if (schema.properties) {
Object.entries(schema.properties).forEach(([key, value]) => {
result[key] = convertJsonSchemaToJson(value);
});
}
return result;
}
switch (schema.type) {
case 'array':
return [convertJsonSchemaToJson(schema.items)];
case 'string':
return schema.enum?.[0] ?? schema.description ?? 'string';
case 'number':
return schema.description ?? 0;
case 'integer':
return 0;
case 'boolean':
return schema.description ?? false;
case 'null':
return schema.description ?? null;
default:
return undefined;
}
};
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/hooks/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAA4B,EAAO,EAAE;IAC3E,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAA;IAEtB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAwB,EAAE,CAAA;QAEtC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAgB,EAAE,EAAE;gBACxE,MAAM,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO;YACV,OAAO,CAAC,uBAAuB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAA;QAC3D,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,WAAW,IAAI,CAAC,CAAA;QAChC,KAAK,SAAS;YACZ,OAAO,CAAC,CAAA;QACV,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,WAAW,IAAI,KAAK,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,WAAW,IAAI,IAAI,CAAA;QACnC;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export { EndpointsPage } from './endpoints-page';
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}

View File

@@ -0,0 +1,2 @@
export { EndpointsPage } from './endpoints-page';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const getStatusMessage: (statusCode: number) => string;
//# sourceMappingURL=utils.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/play/reponse-code/utils.ts"],"names":[],"mappings":"AA0EA,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,WAElD,CAAA"}

View File

@@ -0,0 +1,73 @@
const statusMessages = {
// 1xx Informational
100: 'Continue',
101: 'Switching Protocols',
102: 'Processing',
103: 'Early Hints',
// 2xx Success
200: 'OK',
201: 'Created',
202: 'Accepted',
203: 'Non-Authoritative Information',
204: 'No Content',
205: 'Reset Content',
206: 'Partial Content',
207: 'Multi-Status',
208: 'Already Reported',
226: 'IM Used',
// 3xx Redirection
300: 'Multiple Choices',
301: 'Moved Permanently',
302: 'Found',
303: 'See Other',
304: 'Not Modified',
305: 'Use Proxy',
307: 'Temporary Redirect',
308: 'Permanent Redirect',
// 4xx Client Error
400: 'Bad Request',
401: 'Unauthorized',
402: 'Payment Required',
403: 'Forbidden',
404: 'Not Found',
405: 'Method Not Allowed',
406: 'Not Acceptable',
407: 'Proxy Authentication Required',
408: 'Request Timeout',
409: 'Conflict',
410: 'Gone',
411: 'Length Required',
412: 'Precondition Failed',
413: 'Payload Too Large',
414: 'URI Too Long',
415: 'Unsupported Media Type',
416: 'Range Not Satisfiable',
417: 'Expectation Failed',
418: "I'm a teapot",
421: 'Misdirected Request',
422: 'Unprocessable Entity',
423: 'Locked',
424: 'Failed Dependency',
425: 'Too Early',
426: 'Upgrade Required',
428: 'Precondition Required',
429: 'Too Many Requests',
431: 'Request Header Fields Too Large',
451: 'Unavailable For Legal Reasons',
// 5xx Server Error
500: 'Internal Server Error',
501: 'Not Implemented',
502: 'Bad Gateway',
503: 'Service Unavailable',
504: 'Gateway Timeout',
505: 'HTTP Version Not Supported',
506: 'Variant Also Negotiates',
507: 'Insufficient Storage',
508: 'Loop Detected',
510: 'Not Extended',
511: 'Network Authentication Required',
};
export const getStatusMessage = (statusCode) => {
return statusMessages[statusCode] || 'Unknown';
};
//# sourceMappingURL=utils.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/play/reponse-code/utils.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAA2B;IAC7C,oBAAoB;IACpB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,aAAa;IAElB,cAAc;IACd,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,+BAA+B;IACpC,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,SAAS;IAEd,kBAAkB;IAClB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,oBAAoB;IAEzB,mBAAmB;IACnB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,gBAAgB;IACrB,GAAG,EAAE,+BAA+B;IACpC,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,wBAAwB;IAC7B,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,sBAAsB;IAC3B,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,iCAAiC;IACtC,GAAG,EAAE,+BAA+B;IAEpC,mBAAmB;IACnB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,4BAA4B;IACjC,GAAG,EAAE,yBAAyB;IAC9B,GAAG,EAAE,sBAAsB;IAC3B,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,iCAAiC;CACvC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE;IACrD,OAAO,cAAc,CAAC,UAAU,CAAC,IAAI,SAAS,CAAA;AAChD,CAAC,CAAA"}

View File

@@ -0,0 +1,7 @@
import { FC } from 'react';
type ResponseCodeProps = {
statusCode: number;
};
export declare const ResponseCode: FC<ResponseCodeProps>;
export {};
//# sourceMappingURL=response-code.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"response-code.d.ts","sourceRoot":"","sources":["../../src/play/response-code.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAG1B,KAAK,iBAAiB,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAkB9C,CAAA"}

View File

@@ -0,0 +1,11 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { cn } from '@motiadev/ui';
import { getStatusMessage } from './reponse-code/utils';
export const ResponseCode = ({ statusCode }) => {
const statusMessage = getStatusMessage(statusCode);
const isSuccess = statusCode > 0 && statusCode < 400;
const isWarning = statusCode >= 400 && statusCode < 500;
const isError = statusCode >= 500;
return (_jsxs("div", { className: cn('px-2 py-1 rounded-sm flex items-center gap-1', isWarning && 'dark:bg-[#EAB71F]/20 dark:text-[#EAB71F] bg-[#EAB71F] text-white', isError && 'dark:bg-[#F8367D]/20 dark:text-[#F8367D] bg-[#F8367D] text-white', isSuccess && 'dark:bg-accent-200 dark:text-primary bg-accent text-white'), children: [_jsx("span", { className: "font-bold font-mono", children: statusCode }), " ", statusMessage] }));
};
//# sourceMappingURL=response-code.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"response-code.js","sourceRoot":"","sources":["../../src/play/response-code.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAMvD,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;IACpE,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,GAAG,CAAA;IACpD,MAAM,SAAS,GAAG,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,CAAA;IACvD,MAAM,OAAO,GAAG,UAAU,IAAI,GAAG,CAAA;IAEjC,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,8CAA8C,EAC9C,SAAS,IAAI,kEAAkE,EAC/E,OAAO,IAAI,kEAAkE,EAC7E,SAAS,IAAI,2DAA2D,CACzE,aAED,eAAM,SAAS,EAAC,qBAAqB,YAAE,UAAU,GAAQ,OAAE,aAAa,IACpE,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,7 @@
import { FC } from 'react';
type SidePanelBodyTabProps = {
schema: Record<string, any> | undefined;
};
export declare const SidePanelBodyTab: FC<SidePanelBodyTabProps>;
export {};
//# sourceMappingURL=side-panel-body-tab.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-body-tab.d.ts","sourceRoot":"","sources":["../../src/play/side-panel-body-tab.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAgC,MAAM,OAAO,CAAA;AAMxD,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;CACxC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAiCrD,CAAA"}

View File

@@ -0,0 +1,23 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { CircleX } from 'lucide-react';
import { memo, useCallback, useEffect } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { JsonEditor } from '../components/json-editor';
import { getBodyIsValidSelector, getBodySelector, useEndpointConfiguration } from '../hooks/use-endpoint-configuration';
import { convertJsonSchemaToJson } from '../hooks/utils';
export const SidePanelBodyTab = memo(({ schema }) => {
const { setBody, setBodyIsValid } = useEndpointConfiguration();
const bodyIsValid = useEndpointConfiguration(useShallow(getBodyIsValidSelector));
const body = useEndpointConfiguration(getBodySelector);
useEffect(() => {
if (schema) {
setBody(body || JSON.stringify(convertJsonSchemaToJson(schema), null, 2));
setBodyIsValid(true);
}
}, [schema]);
const handleBodyChange = useCallback((value) => {
setBody(value);
}, [setBody, setBodyIsValid]);
return (_jsxs("div", { className: "max-h-full h-full relative", children: [_jsx(JsonEditor, { value: body, schema: schema, onChange: handleBodyChange, onValidate: setBodyIsValid }), !bodyIsValid && (_jsxs("div", { className: "absolute bottom-0 left-0 right-0 border-t border-border p-3 text-sm dark:text-yellow-500 text-yellow-700 flex items-center gap-1 font-medium", "data-testid": "endpoint-body-tab-invalid", children: [_jsx(CircleX, { className: "w-4 h-4" }), "The body payload is invalid"] }))] }));
});
//# sourceMappingURL=side-panel-body-tab.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-body-tab.js","sourceRoot":"","sources":["../../src/play/side-panel-body-tab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAM,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAMxD,MAAM,CAAC,MAAM,gBAAgB,GAA8B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7E,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAC9D,MAAM,WAAW,GAAG,wBAAwB,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAA;IAChF,MAAM,IAAI,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAA;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzE,cAAc,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,KAAa,EAAE,EAAE;QAChB,OAAO,CAAC,KAAK,CAAC,CAAA;IAChB,CAAC,EACD,CAAC,OAAO,EAAE,cAAc,CAAC,CAC1B,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,GAAI,EAClG,CAAC,WAAW,IAAI,CACf,eACE,SAAS,EAAC,8IAA8I,iBAC5I,2BAA2B,aAEvC,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,mCAE3B,CACP,IACG,CACP,CAAA;AACH,CAAC,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const SidePanelHeadersTab: () => import("react/jsx-runtime").JSX.Element;
//# sourceMappingURL=side-panel-headers-tab.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-headers-tab.d.ts","sourceRoot":"","sources":["../../src/play/side-panel-headers-tab.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,mBAAmB,+CA2C/B,CAAA"}

View File

@@ -0,0 +1,26 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Button } from '@motiadev/ui';
import { Plus } from 'lucide-react';
import { useCallback } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { ConfigurationListItem } from '../components/configuration-list-item';
import { getHeadersSelector, useEndpointConfiguration } from '../hooks/use-endpoint-configuration';
export const SidePanelHeadersTab = () => {
const { setHeaders, removeHeaders } = useEndpointConfiguration();
const headers = useEndpointConfiguration(useShallow(getHeadersSelector));
const addHeader = useCallback(() => {
const newHeader = {
name: '',
value: '',
active: true,
};
setHeaders({ ...headers, [new Date().getTime().toString()]: newHeader });
}, [headers, setHeaders]);
const updateHeader = useCallback((key, field, value) => {
if (!key)
return;
setHeaders({ ...headers, [key]: { ...headers[key], [field]: value } });
}, [headers, setHeaders]);
return (_jsxs("div", { className: "h-full max-h-full grid grid-rows-[auto_1fr]", children: [_jsx("div", { className: "grid px-4 border-b h-10 items-center grid-cols-[auto_1fr]", children: _jsxs(Button, { size: "sm", onClick: addHeader, children: [_jsx(Plus, { className: "h-3 w-3" }), "Add"] }) }), _jsxs("div", { className: "p-2", children: [Object.entries(headers).map(([key, header]) => (_jsx(ConfigurationListItem, { value: header, id: key, onUpdate: updateHeader, onRemove: removeHeaders }, key))), Object.entries(headers).length === 0 && (_jsx("div", { className: "grid grid-cols-1 items-center h-full", children: _jsx("div", { className: "text-sm text-muted-foreground text-center", children: "There are no headers in this endpoint" }) }))] })] }));
};
//# sourceMappingURL=side-panel-headers-tab.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-headers-tab.js","sourceRoot":"","sources":["../../src/play/side-panel-headers-tab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AAElG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,wBAAwB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAExE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,IAAI;SACb,CAAA;QACD,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;IAC1E,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;IAEzB,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,GAAW,EAAE,KAAkC,EAAE,KAAuB,EAAE,EAAE;QAC3E,IAAI,CAAC,GAAG;YAAE,OAAM;QAChB,UAAU,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IACxE,CAAC,EACD,CAAC,OAAO,EAAE,UAAU,CAAC,CACtB,CAAA;IAED,OAAO,CACL,eAAK,SAAS,EAAC,6CAA6C,aAC1D,cAAK,SAAS,EAAC,2DAA2D,YACxE,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,SAAS,aAClC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,WAErB,GACL,EAEN,eAAK,SAAS,EAAC,KAAK,aACjB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAC9C,KAAC,qBAAqB,IAAW,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,IAA5E,GAAG,CAA6E,CAC7G,CAAC,EAED,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CACvC,cAAK,SAAS,EAAC,sCAAsC,YACnD,cAAK,SAAS,EAAC,2CAA2C,sDAA4C,GAClG,CACP,IACG,IACF,CACP,CAAA;AACH,CAAC,CAAA"}

View File

@@ -0,0 +1,6 @@
type SidePanelParamsTabProps = {
path: string;
};
export declare const SidePanelParamsTab: ({ path }: SidePanelParamsTabProps) => import("react/jsx-runtime").JSX.Element;
export {};
//# sourceMappingURL=side-panel-params-tab.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-params-tab.d.ts","sourceRoot":"","sources":["../../src/play/side-panel-params-tab.tsx"],"names":[],"mappings":"AAYA,KAAK,uBAAuB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,uBAAuB,4CAuFnE,CAAA"}

View File

@@ -0,0 +1,39 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { Button } from '@motiadev/ui';
import { Plus } from 'lucide-react';
import { useCallback, useMemo } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { ConfigurationListItem } from '../components/configuration-list-item';
import { EndpointPathPreview } from '../components/endpoint-path-preview';
import { getPathParamsSelector, getQueryParamsSelector, useEndpointConfiguration, } from '../hooks/use-endpoint-configuration';
export const SidePanelParamsTab = ({ path }) => {
const { setQueryParams, removeQueryParams, setPathParams } = useEndpointConfiguration();
const queryParams = useEndpointConfiguration(useShallow(getQueryParamsSelector));
const pathParams = useEndpointConfiguration(useShallow(getPathParamsSelector));
const pathParamsConfig = useMemo(() => {
const params = path.match(/:(\w+)/g);
return (params?.map((param) => {
return { name: param.slice(1), value: pathParams[param.slice(1)]?.value ?? '', active: true };
}) ?? []);
}, [path]);
const addParam = useCallback(() => {
const newParam = {
name: '',
value: '',
active: true,
};
setQueryParams({ ...queryParams, [new Date().getTime().toString()]: newParam });
}, [queryParams, setQueryParams]);
const updateParam = useCallback((key, field, value) => {
if (!key)
return;
setQueryParams({ ...queryParams, [key]: { ...queryParams[key], [field]: value } });
}, [queryParams, setQueryParams]);
const updatePathParam = useCallback((key, field, value) => {
if (!key)
return;
setPathParams({ ...pathParams, [key]: { ...pathParams[key], [field]: value } });
}, [pathParams, setPathParams]);
return (_jsxs("div", { className: "h-full grid grid-rows-[auto_auto_1fr]", children: [_jsx("div", { className: "grid px-4 border-b h-10 items-center grid-cols-[auto_1fr]", children: _jsxs(Button, { size: "sm", onClick: addParam, children: [_jsx(Plus, { className: "h-3 w-3" }), "Add"] }) }), _jsx(EndpointPathPreview, { path: path }), _jsxs("div", { className: "grid grid-rows-[1fr_1fr]", children: [_jsxs("div", { className: "p-2 border-b border-border", children: [_jsx("div", { className: "text-sm font-medium pl-3", children: "Query" }), Object.entries(queryParams).map(([key, param]) => (_jsx(ConfigurationListItem, { value: param, id: key, onUpdate: updateParam, onRemove: removeQueryParams }, key))), Object.entries(queryParams).length === 0 && (_jsx("div", { className: "grid grid-cols-1 items-center h-full", children: _jsx("div", { className: "text-sm text-muted-foreground text-center", children: "There are no query params in this endpoint" }) }))] }), pathParamsConfig.length > 0 && (_jsxs("div", { className: "p-2", children: [_jsx("div", { className: "text-sm font-medium pl-3", children: "Path" }), pathParamsConfig.map((pathName) => (_jsx(ConfigurationListItem, { value: { name: pathName.name, value: pathName.value, active: pathName.active }, id: pathName.name, required: true, onUpdate: updatePathParam }, pathName.name)))] }))] })] }));
};
//# sourceMappingURL=side-panel-params-tab.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-params-tab.js","sourceRoot":"","sources":["../../src/play/side-panel-params-tab.tsx"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
export declare const SidePanelResponse: import("react").MemoExoticComponent<() => import("react/jsx-runtime").JSX.Element | null>;
//# sourceMappingURL=side-panel-response.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-response.d.ts","sourceRoot":"","sources":["../../src/play/side-panel-response.tsx"],"names":[],"mappings":"AAUA,eAAO,MAAM,iBAAiB,2FA6D5B,CAAA"}

View File

@@ -0,0 +1,21 @@
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { Button, Tabs, TabsContent, TabsList, TabsTrigger } from '@motiadev/ui';
import { X } from 'lucide-react';
import { memo, useState } from 'react';
import ReactJson from 'react18-json-view';
import { getResponseSelector, useEndpointConfiguration } from '../hooks/use-endpoint-configuration';
import { useStateStream } from '../hooks/use-state-stream';
import { ResponseCode } from './response-code';
export const SidePanelResponse = memo(() => {
const { setResponse } = useEndpointConfiguration();
const response = useEndpointConfiguration(getResponseSelector);
const { data } = useStateStream(response?.body);
const [activeTab, setActiveTab] = useState('preview');
const onClose = () => setResponse(undefined);
if (!response) {
return null;
}
return (_jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), className: "border-l border-border", "data-testid": "endpoint-response-container", children: [_jsxs("div", { className: "grid grid-cols-[1fr_auto] items-center h-10 border-b px-5 bg-card", children: [_jsxs(TabsList, { children: [_jsx(TabsTrigger, { value: "preview", className: "cursor-pointer", children: "Preview" }), _jsx(TabsTrigger, { value: "headers", className: "grid grid-cols-[auto_auto] gap-2 items-center cursor-pointer", children: "Headers" })] }), _jsx(Button, { variant: "ghost", size: "icon", onClick: onClose, children: _jsx(X, { className: "h-4 w-4" }) })] }), _jsx("div", { className: "sticky bottom-0 border-b border-border p-3 text-sm flex items-center gap-1 font-medium", children: _jsxs("div", { className: "flex flex-row items-center flex-1 gap-3", children: [_jsx(ResponseCode, { statusCode: response.statusCode }), !!response.executionTime && (_jsxs("div", { className: "text-muted-foreground bg-muted-foreground/10 px-2 py-1 rounded-sm", children: [response.executionTime, "ms"] }))] }) }), _jsx(TabsContent, { value: "preview", children: _jsx(ReactJson, { src: data }) }), _jsx(TabsContent, { value: "headers", children: _jsx("div", { className: "grid grid-cols-[auto_minmax(0,1fr)] gap-4 p-4 overflow-auto auto-rows-max h-full", children: response.headers &&
Object.entries(response.headers).map(([key, value]) => (_jsxs(_Fragment, { children: [_jsx("span", { className: "font-bold text-sm h-8 items-center grid whitespace-nowrap", children: key }), _jsx("span", { className: "text-sm text-muted-foreground h-8 items-center grid whitespace-nowrap", children: value })] }))) }) })] }));
});
//# sourceMappingURL=side-panel-response.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel-response.js","sourceRoot":"","sources":["../../src/play/side-panel-response.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAA;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAI9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE;IACzC,MAAM,EAAE,WAAW,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,mBAAmB,CAAC,CAAA;IAE9D,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC/C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAY,SAAS,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IAE5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CACL,MAAC,IAAI,IACH,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,YAAY,CAAC,KAAkB,CAAC,EAClE,SAAS,EAAC,wBAAwB,iBACtB,6BAA6B,aAEzC,eAAK,SAAS,EAAC,mEAAmE,aAChF,MAAC,QAAQ,eACP,KAAC,WAAW,IAAC,KAAK,EAAC,SAAS,EAAC,SAAS,EAAC,gBAAgB,wBAEzC,EACd,KAAC,WAAW,IAAC,KAAK,EAAC,SAAS,EAAC,SAAS,EAAC,8DAA8D,wBAEvF,IACL,EACX,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,YAClD,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GAClB,IACL,EAEN,cAAK,SAAS,EAAC,wFAAwF,YACrG,eAAK,SAAS,EAAC,yCAAyC,aACtD,KAAC,YAAY,IAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAI,EAChD,CAAC,CAAC,QAAQ,CAAC,aAAa,IAAI,CAC3B,eAAK,SAAS,EAAC,mEAAmE,aAC/E,QAAQ,CAAC,aAAa,UACnB,CACP,IACG,GACF,EAEN,KAAC,WAAW,IAAC,KAAK,EAAC,SAAS,YAC1B,KAAC,SAAS,IAAC,GAAG,EAAE,IAAc,GAAI,GACtB,EAEd,KAAC,WAAW,IAAC,KAAK,EAAC,SAAS,YAC1B,cAAK,SAAS,EAAC,kFAAkF,YAC9F,QAAQ,CAAC,OAAO;wBACf,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACrD,8BACE,eAAM,SAAS,EAAC,2DAA2D,YAAE,GAAG,GAAQ,EACxF,eAAM,SAAS,EAAC,uEAAuE,YAAE,KAAK,GAAQ,IACrG,CACJ,CAAC,GACA,GACM,IACT,CACR,CAAA;AACH,CAAC,CAAC,CAAA"}

View File

@@ -0,0 +1,9 @@
import { FC } from 'react';
import { ApiEndpoint } from '../types/endpoint';
type EndpointSidePanelProps = {
endpoint: ApiEndpoint;
onClose: () => void;
};
export declare const SidePanel: FC<EndpointSidePanelProps>;
export {};
//# sourceMappingURL=side-panel.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel.d.ts","sourceRoot":"","sources":["../../src/play/side-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAkB,MAAM,OAAO,CAAA;AAW1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAO/C,KAAK,sBAAsB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAA;AAQ5E,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,sBAAsB,CAgF/C,CAAA"}

View File

@@ -0,0 +1,25 @@
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { BackgroundEffect, Badge, Button, cn, Tabs, TabsContent, TabsList, TabsTrigger } from '@motiadev/ui';
import { Book, X } from 'lucide-react';
import { memo, useState } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { EndpointPath } from '../components/endpoint-path';
import { getHeadersSelector, getQueryParamsSelector, getResponseSelector, useEndpointConfiguration, } from '../hooks/use-endpoint-configuration';
import { SpecSidePanel } from '../spec/spec-side-panel';
import { SidePanelBodyTab } from './side-panel-body-tab';
import { SidePanelHeadersTab } from './side-panel-headers-tab';
import { SidePanelParamsTab } from './side-panel-params-tab';
import { SidePanelResponse } from './side-panel-response';
import { TriggerButton } from './trigger-button';
const headersCountSelector = (state) => Object.keys(getHeadersSelector(state)).length;
const hasResponseSelector = (state) => getResponseSelector(state) !== undefined;
const paramsCountSelector = (state) => Object.keys(getQueryParamsSelector(state)).length;
export const SidePanel = memo(({ endpoint, onClose }) => {
const [activeTab, setActiveTab] = useState('body');
const [isSpecOpen, setIsSpecOpen] = useState(false);
const headersCount = useEndpointConfiguration(useShallow(headersCountSelector));
const hasResponse = useEndpointConfiguration(useShallow(hasResponseSelector));
const paramsCount = useEndpointConfiguration(useShallow(paramsCountSelector));
return (_jsxs("div", { className: "isolate grid grid-cols-1 overflow-y-auto min-w-0 grid-rows-[auto_1fr] border-l border-border", "data-testid": "endpoint-details-panel", children: [_jsx(BackgroundEffect, {}), _jsxs("div", { className: "grid grid-cols-[1fr_1fr_auto] items-start gap-4 px-5 py-4 border-b bg-card w-full", children: [_jsxs("div", { className: "grid grid-rows-2 gap-2", children: [_jsx(EndpointPath, { method: endpoint.method, path: endpoint.path }), endpoint.description && _jsx("p", { className: "text-sm text-muted-foreground", children: endpoint.description })] }), _jsx("div", { className: "flex items-end justify-end", children: _jsx(Button, { variant: "icon", size: "icon", onClick: () => setIsSpecOpen(!isSpecOpen), "data-testid": "endpoint-spec-button", children: _jsx(Book, {}) }) }), _jsx(Button, { variant: "icon", size: "icon", onClick: onClose, children: _jsx(X, {}) })] }), _jsxs("div", { className: cn('grid grid-cols-[minmax(350px,1fr)_minmax(auto,1fr)]', !hasResponse && 'grid-cols-1'), children: [_jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), children: [_jsxs("div", { className: "grid grid-cols-[1fr_auto] items-center h-10 border-b px-5 bg-card", children: [_jsxs(TabsList, { children: [_jsxs(TabsTrigger, { value: "params", className: "grid grid-cols-[auto_auto] gap-2 items-center cursor-pointer", "data-testid": "endpoint-params-tab", children: ["Params", _jsx(Badge, { variant: "outline", className: "h-4 px-1.5 text-xs", children: paramsCount })] }), _jsx(TabsTrigger, { value: "body", className: "cursor-pointer", "data-testid": "endpoint-body-tab", children: "Body" }), _jsxs(TabsTrigger, { value: "headers", className: "grid grid-cols-[auto_auto] gap-2 items-center cursor-pointer", "data-testid": "endpoint-headers-tab", children: ["Headers", _jsx(Badge, { variant: "outline", className: "h-4 px-1.5 text-xs", children: headersCount })] })] }), _jsx(TriggerButton, { method: endpoint.method, path: endpoint.path.toString() })] }), _jsx(TabsContent, { value: "params", children: _jsx(SidePanelParamsTab, { path: endpoint.path }) }), _jsx(TabsContent, { value: "body", children: _jsx(SidePanelBodyTab, { schema: endpoint.bodySchema }) }), _jsx(TabsContent, { value: "headers", children: _jsx(SidePanelHeadersTab, {}) })] }), _jsx(SidePanelResponse, {})] }), isSpecOpen && _jsx(SpecSidePanel, { endpoint: endpoint, onClose: () => setIsSpecOpen(false) })] }));
});
//# sourceMappingURL=side-panel.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"side-panel.js","sourceRoot":"","sources":["../../src/play/side-panel.tsx"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,7 @@
type TriggerButtonProps = {
method: string;
path: string;
};
export declare const TriggerButton: import("react").MemoExoticComponent<({ method, path }: TriggerButtonProps) => import("react/jsx-runtime").JSX.Element>;
export {};
//# sourceMappingURL=trigger-button.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"trigger-button.d.ts","sourceRoot":"","sources":["../../src/play/trigger-button.tsx"],"names":[],"mappings":"AAYA,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,eAAO,MAAM,aAAa,yDAA2B,kBAAkB,6CA0CrE,CAAA"}

View File

@@ -0,0 +1,40 @@
import { jsx as _jsx } from "react/jsx-runtime";
import { Button } from '@motiadev/ui';
import { Loader2, Play } from 'lucide-react';
import { memo, useState } from 'react';
import { useShallow } from 'zustand/react/shallow';
import { getBodySelector, getHeadersSelector, useEndpointConfiguration, } from '../hooks/use-endpoint-configuration';
import { usePathUrl } from '../hooks/use-path-url';
export const TriggerButton = memo(({ method, path }) => {
const { setResponse } = useEndpointConfiguration();
const headers = useEndpointConfiguration(useShallow(getHeadersSelector));
const body = useEndpointConfiguration(useShallow(getBodySelector));
const pathUrl = usePathUrl(path);
const [isLoading, setIsLoading] = useState(false);
const onClick = async () => {
try {
setIsLoading(true);
const _headers = Object.values(headers)
.filter((header) => header.active && header.name !== '' && header.value !== '')
.reduce((acc, header) => {
acc[header.name.toLowerCase()] = header.value;
return acc;
}, {});
const startTime = Date.now();
const response = await fetch(pathUrl, {
method: method,
headers: _headers,
body: ['GET', 'DELETE', 'HEAD', 'OPTIONS'].includes(method) ? null : body,
});
setResponse(response, startTime);
}
catch (error) {
console.error('Error triggering endpoint:', error);
}
finally {
setIsLoading(false);
}
};
return (_jsx(Button, { variant: "ghost", size: "icon", onClick: onClick, disabled: isLoading, "data-testid": "endpoint-play-button", children: isLoading ? _jsx(Loader2, { className: "animate-spin" }) : _jsx(Play, { className: "h-4 w-4" }) }));
});
//# sourceMappingURL=trigger-button.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"trigger-button.js","sourceRoot":"","sources":["../../src/play/trigger-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAEL,eAAe,EACf,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAOlD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAsB,EAAE,EAAE;IACzE,MAAM,EAAE,WAAW,EAAE,GAAG,wBAAwB,EAAE,CAAA;IAClD,MAAM,OAAO,GAAG,wBAAwB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,wBAAwB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAA;IAClE,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAEhC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,YAAY,CAAC,IAAI,CAAC,CAAA;YAElB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;iBACpC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;iBAC9E,MAAM,CACL,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBACd,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;gBAC7C,OAAO,GAAG,CAAA;YACZ,CAAC,EACD,EAA4B,CAC7B,CAAA;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;gBACpC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;aAC1E,CAAC,CAAA;YAEF,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAA;QACpD,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,KAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,iBAAc,sBAAsB,YAC1G,SAAS,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,SAAS,EAAC,cAAc,GAAG,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,GACzE,CACV,CAAA;AACH,CAAC,CAAC,CAAA"}

Some files were not shown because too many files have changed in this diff Show More