@mastra/playground-ui 60.1.0-alpha.0 → 60.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/dist/{code-editor-IR5UX112.js → code-editor-28chVxHw.js} +6 -4
- package/dist/code-editor-28chVxHw.js.map +1 -0
- package/dist/{code-editor-DzQEzQJh.cjs → code-editor-B_wPmKPf.cjs} +6 -4
- package/dist/code-editor-B_wPmKPf.cjs.map +1 -0
- package/dist/components/CodeEditor.cjs.js +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/Workflow.cjs.js +3 -3
- package/dist/components/Workflow.es.js +3 -3
- package/dist/domains/chat/components/network-choice-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/components/network-choice-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.cjs.js +1 -1
- package/dist/domains/chat/messages/dataset-save-action.es.js +1 -1
- package/dist/domains/chat/messages/message-row.cjs.js +1 -1
- package/dist/domains/chat/messages/message-row.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/agent-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/background-task-metadata-dialog.es.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/code-mode-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +1 -1
- package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +1 -1
- package/dist/domains/metrics/drilldown.cjs.js +0 -1
- package/dist/domains/metrics/drilldown.cjs.js.map +1 -1
- package/dist/domains/metrics/drilldown.es.js +0 -1
- package/dist/domains/metrics/drilldown.es.js.map +1 -1
- package/dist/domains/metrics/metrics-filters.cjs.js +0 -2
- package/dist/domains/metrics/metrics-filters.cjs.js.map +1 -1
- package/dist/domains/metrics/metrics-filters.es.js +0 -2
- package/dist/domains/metrics/metrics-filters.es.js.map +1 -1
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +1 -1
- package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +1 -1
- package/dist/domains/workflows/components/workflow-step-detail.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-step-detail.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-button.es.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.cjs.js +1 -1
- package/dist/domains/workflows/workflow/data/workflow-data-inspector.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.cjs.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-json-input.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-data-edge.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-map-config-dialog.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-run-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-status.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-step-action-bar.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +1 -1
- package/dist/hooks/use-environment-variables-editor.cjs.js +6 -1
- package/dist/hooks/use-environment-variables-editor.cjs.js.map +1 -1
- package/dist/hooks/use-environment-variables-editor.es.js +6 -1
- package/dist/hooks/use-environment-variables-editor.es.js.map +1 -1
- package/dist/src/domains/metrics/hooks/use-metrics-filters.d.ts +0 -1
- package/dist/src/domains/metrics/metrics-filters.d.ts +0 -2
- package/dist/src/ds/components/CodeEditor/variable-autocomplete-extension.d.ts +6 -0
- package/dist/src/hooks/use-environment-variables-editor.d.ts +1 -1
- package/dist/{tool-card-DPrShK-9.js → tool-card-C_K5PwrK.js} +2 -2
- package/dist/{tool-card-DPrShK-9.js.map → tool-card-C_K5PwrK.js.map} +1 -1
- package/dist/{tool-card-BfMA9tub.cjs → tool-card-rxo27sve.cjs} +2 -2
- package/dist/{tool-card-BfMA9tub.cjs.map → tool-card-rxo27sve.cjs.map} +1 -1
- package/dist/{workflow-code-dialog-content-COlaHWtW.cjs → workflow-code-dialog-content-BFm2IWDl.cjs} +2 -2
- package/dist/{workflow-code-dialog-content-COlaHWtW.cjs.map → workflow-code-dialog-content-BFm2IWDl.cjs.map} +1 -1
- package/dist/{workflow-code-dialog-content-BQBHzRfZ.js → workflow-code-dialog-content-BM4ZnrUr.js} +2 -2
- package/dist/{workflow-code-dialog-content-BQBHzRfZ.js.map → workflow-code-dialog-content-BM4ZnrUr.js.map} +1 -1
- package/dist/{workflow-data-edge-view-BvhW_gux.cjs → workflow-data-edge-view-7f8O6pVW.cjs} +2 -2
- package/dist/{workflow-data-edge-view-BvhW_gux.cjs.map → workflow-data-edge-view-7f8O6pVW.cjs.map} +1 -1
- package/dist/{workflow-data-edge-view-BjfKYysc.js → workflow-data-edge-view-BpGLV-at.js} +2 -2
- package/dist/{workflow-data-edge-view-BjfKYysc.js.map → workflow-data-edge-view-BpGLV-at.js.map} +1 -1
- package/dist/{workflow-edge-data-button-BTsPGDpk.cjs → workflow-edge-data-button-BOVRo4xO.cjs} +2 -2
- package/dist/{workflow-edge-data-button-BTsPGDpk.cjs.map → workflow-edge-data-button-BOVRo4xO.cjs.map} +1 -1
- package/dist/{workflow-edge-data-button-CIP46GJE.js → workflow-edge-data-button-C6eyWbcG.js} +2 -2
- package/dist/{workflow-edge-data-button-CIP46GJE.js.map → workflow-edge-data-button-C6eyWbcG.js.map} +1 -1
- package/package.json +11 -11
- package/dist/code-editor-DzQEzQJh.cjs.map +0 -1
- package/dist/code-editor-IR5UX112.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useWorkflowStepDetail } from '../../context/workflow-step-detail-context.es.js';
|
|
3
3
|
import { useWorkflowData, workflowDataKey } from './use-workflow-data.es.js';
|
|
4
|
-
import { W as WorkflowEdgeDataButton } from '../../../../workflow-edge-data-button-
|
|
4
|
+
import { W as WorkflowEdgeDataButton } from '../../../../workflow-edge-data-button-C6eyWbcG.js';
|
|
5
5
|
|
|
6
6
|
function WorkflowDataButton({ selection }) {
|
|
7
7
|
const { stepDetail, showData } = useWorkflowStepDetail();
|
|
@@ -12,7 +12,7 @@ const domains_workflows_context_workflowStepDetailContext = require('../../conte
|
|
|
12
12
|
const domains_workflows_workflow_data_useWorkflowData = require('./use-workflow-data.cjs.js');
|
|
13
13
|
const Badge = require('../../../../Badge-D3EctKQo.cjs');
|
|
14
14
|
const Button = require('../../../../Button-CXhSUBxN.cjs');
|
|
15
|
-
const codeEditor = require('../../../../code-editor-
|
|
15
|
+
const codeEditor = require('../../../../code-editor-B_wPmKPf.cjs');
|
|
16
16
|
const Txt = require('../../../../Txt-DPmEpNbp.cjs');
|
|
17
17
|
|
|
18
18
|
const DIRECTION_ICONS = { input: lucideReact.ArrowDownToLine, output: lucideReact.ArrowUpFromLine };
|
|
@@ -8,7 +8,7 @@ import { useWorkflowStepDetail } from '../../context/workflow-step-detail-contex
|
|
|
8
8
|
import { useWorkflowData, workflowDataKey } from './use-workflow-data.es.js';
|
|
9
9
|
import { B as Badge } from '../../../../Badge-DmOqFpXW.js';
|
|
10
10
|
import { B as Button } from '../../../../Button-D43ghVKt.js';
|
|
11
|
-
import { C as CodeEditor } from '../../../../code-editor-
|
|
11
|
+
import { C as CodeEditor } from '../../../../code-editor-28chVxHw.js';
|
|
12
12
|
import { T as Txt } from '../../../../Txt-BP1SRHmL.js';
|
|
13
13
|
|
|
14
14
|
const DIRECTION_ICONS = { input: ArrowDownToLine, output: ArrowUpFromLine };
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const codeEditor = require('../../../../code-editor-
|
|
6
|
+
const codeEditor = require('../../../../code-editor-B_wPmKPf.cjs');
|
|
7
7
|
const fieldBlock = require('../../../../field-block-DtaPqBa3.cjs');
|
|
8
8
|
const fieldErrorId = require('../../../../field-error-id-B3Z2Zu5y.cjs');
|
|
9
9
|
const lib_form_components_formSubmitRow = require('../../../../lib/form/components/form-submit-row.cjs.js');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { C as CodeEditor } from '../../../../code-editor-
|
|
2
|
+
import { C as CodeEditor } from '../../../../code-editor-28chVxHw.js';
|
|
3
3
|
import { F as FieldBlock } from '../../../../field-block--PeppIRb.js';
|
|
4
4
|
import { f as fieldErrorId } from '../../../../field-error-id-D3yg1nBh.js';
|
|
5
5
|
import { FormSubmitRow } from '../../../../lib/form/components/form-submit-row.es.js';
|
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
7
|
const domains_workflows_workflow_data_workflowDataButton = require('./data/workflow-data-button.cjs.js');
|
|
8
|
-
const workflowDataEdgeView = require('../../../workflow-data-edge-view-
|
|
8
|
+
const workflowDataEdgeView = require('../../../workflow-data-edge-view-7f8O6pVW.cjs');
|
|
9
9
|
|
|
10
10
|
function getEdgeDataSelection({ data, parentWorkflowName }) {
|
|
11
11
|
if (data?.boundaryPayload) return { type: data.boundaryPayload, workflowName: parentWorkflowName };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { memo } from 'react';
|
|
3
3
|
import { WorkflowDataButton } from './data/workflow-data-button.es.js';
|
|
4
|
-
import { W as WorkflowDataEdgeView } from '../../../workflow-data-edge-view-
|
|
4
|
+
import { W as WorkflowDataEdgeView } from '../../../workflow-data-edge-view-BpGLV-at.js';
|
|
5
5
|
|
|
6
6
|
function getEdgeDataSelection({ data, parentWorkflowName }) {
|
|
7
7
|
if (data?.boundaryPayload) return { type: data.boundaryPayload, workflowName: parentWorkflowName };
|
|
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
|
|
|
7
7
|
const React = require('react');
|
|
8
8
|
const Button = require('../../../Button-CXhSUBxN.cjs');
|
|
9
9
|
const dialog = require('../../../dialog-d_AK1NQD.cjs');
|
|
10
|
-
const workflowCodeDialogContent = require('../../../workflow-code-dialog-content-
|
|
10
|
+
const workflowCodeDialogContent = require('../../../workflow-code-dialog-content-BFm2IWDl.cjs');
|
|
11
11
|
|
|
12
12
|
function WorkflowMapConfigDialog({ stepName, mapConfig }) {
|
|
13
13
|
const [open, setOpen] = React.useState(false);
|
|
@@ -3,7 +3,7 @@ import { Eye } from 'lucide-react';
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { B as Button } from '../../../Button-D43ghVKt.js';
|
|
5
5
|
import { D as Dialog, d as DialogContent, g as DialogHeader, j as DialogTitle, a as DialogBody } from '../../../dialog-Dt5kASkl.js';
|
|
6
|
-
import { W as WorkflowCodeContent } from '../../../workflow-code-dialog-content-
|
|
6
|
+
import { W as WorkflowCodeContent } from '../../../workflow-code-dialog-content-BM4ZnrUr.js';
|
|
7
7
|
|
|
8
8
|
function WorkflowMapConfigDialog({ stepName, mapConfig }) {
|
|
9
9
|
const [open, setOpen] = useState(false);
|
|
@@ -6,7 +6,7 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
const safeStringify = require('@mastra/core/utils/safe-stringify');
|
|
7
7
|
const lucideReact = require('lucide-react');
|
|
8
8
|
const React = require('react');
|
|
9
|
-
const codeEditor = require('../../../code-editor-
|
|
9
|
+
const codeEditor = require('../../../code-editor-B_wPmKPf.cjs');
|
|
10
10
|
const collapsible = require('../../../collapsible-jfzzU7Gp.cjs');
|
|
11
11
|
const tabsRoot = require('../../../tabs-root-C-ePF1y9.cjs');
|
|
12
12
|
const tabsTab = require('../../../tabs-tab-BmIBFifi.cjs');
|
|
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { safeStringify } from '@mastra/core/utils/safe-stringify';
|
|
3
3
|
import { Database, ChevronRight, ArrowDownToLine, ArrowUpFromLine, Braces } from 'lucide-react';
|
|
4
4
|
import { useState } from 'react';
|
|
5
|
-
import { C as CodeEditor } from '../../../code-editor-
|
|
5
|
+
import { C as CodeEditor } from '../../../code-editor-28chVxHw.js';
|
|
6
6
|
import { C as Collapsible, b as CollapsibleTrigger, a as CollapsibleContent } from '../../../collapsible-BNUn4644.js';
|
|
7
7
|
import { a as Tabs, T as TabList } from '../../../tabs-root-lrZZ3KwH.js';
|
|
8
8
|
import { T as Tab } from '../../../tabs-tab-DoPSW-1s.js';
|
|
@@ -7,7 +7,7 @@ const lucideReact = require('lucide-react');
|
|
|
7
7
|
const domains_workflows_workflowStatusTone = require('../workflow-status-tone.cjs.js');
|
|
8
8
|
const domains_workflows_workflow_workflowCard = require('./workflow-card.cjs.js');
|
|
9
9
|
const domains_chat_messages_tripwireNotice = require('../../chat/messages/tripwire-notice.cjs.js');
|
|
10
|
-
const codeEditor = require('../../../code-editor-
|
|
10
|
+
const codeEditor = require('../../../code-editor-B_wPmKPf.cjs');
|
|
11
11
|
const Txt = require('../../../Txt-DPmEpNbp.cjs');
|
|
12
12
|
const icons_CheckIcon = require('../../../icons/CheckIcon.cjs.js');
|
|
13
13
|
const icons_CrossIcon = require('../../../icons/CrossIcon.cjs.js');
|
|
@@ -3,7 +3,7 @@ import { ShieldAlert, CirclePause, HourglassIcon, Loader2 } from 'lucide-react';
|
|
|
3
3
|
import { workflowStatusToneText, workflowStatusTone } from '../workflow-status-tone.es.js';
|
|
4
4
|
import { WorkflowCard } from './workflow-card.es.js';
|
|
5
5
|
import { TripwireNotice } from '../../chat/messages/tripwire-notice.es.js';
|
|
6
|
-
import { C as CodeEditor } from '../../../code-editor-
|
|
6
|
+
import { C as CodeEditor } from '../../../code-editor-28chVxHw.js';
|
|
7
7
|
import { T as Txt } from '../../../Txt-BP1SRHmL.js';
|
|
8
8
|
import { CheckIcon } from '../../../icons/CheckIcon.es.js';
|
|
9
9
|
import { CrossIcon } from '../../../icons/CrossIcon.es.js';
|
|
@@ -8,7 +8,7 @@ const domains_workflows_context_workflowRunContext = require('../context/workflo
|
|
|
8
8
|
const domains_workflows_context_workflowStepDetailContext = require('../context/workflow-step-detail-context.cjs.js');
|
|
9
9
|
const domains_workflows_workflow_workflowTimeTravelForm = require('./workflow-time-travel-form.cjs.js');
|
|
10
10
|
const dialog = require('../../../dialog-d_AK1NQD.cjs');
|
|
11
|
-
const workflowCodeDialogContent = require('../../../workflow-code-dialog-content-
|
|
11
|
+
const workflowCodeDialogContent = require('../../../workflow-code-dialog-content-BFm2IWDl.cjs');
|
|
12
12
|
const workflowStepAction = require('../../../workflow-step-action-COOlMQGX.cjs');
|
|
13
13
|
|
|
14
14
|
const WorkflowStepActionBar = ({
|
|
@@ -4,7 +4,7 @@ import { WorkflowRunContext } from '../context/workflow-run-context.es.js';
|
|
|
4
4
|
import { useWorkflowStepDetail } from '../context/workflow-step-detail-context.es.js';
|
|
5
5
|
import { WorkflowTimeTravelForm } from './workflow-time-travel-form.es.js';
|
|
6
6
|
import { D as Dialog, d as DialogContent, g as DialogHeader, j as DialogTitle, a as DialogBody } from '../../../dialog-Dt5kASkl.js';
|
|
7
|
-
import { W as WorkflowCodeContent } from '../../../workflow-code-dialog-content-
|
|
7
|
+
import { W as WorkflowCodeContent } from '../../../workflow-code-dialog-content-BM4ZnrUr.js';
|
|
8
8
|
import { a as WorkflowStepActions, W as WorkflowStepAction } from '../../../workflow-step-action-B3coZwPr.js';
|
|
9
9
|
|
|
10
10
|
const WorkflowStepActionBar = ({
|
|
@@ -11,7 +11,7 @@ const domains_workflows_components_workflowLayout = require('../components/workf
|
|
|
11
11
|
const domains_workflows_workflow_workflowInputData = require('./workflow-input-data.cjs.js');
|
|
12
12
|
const activity = require('../../../activity-BYMLNb0G.cjs');
|
|
13
13
|
const Badge = require('../../../Badge-D3EctKQo.cjs');
|
|
14
|
-
const codeEditor = require('../../../code-editor-
|
|
14
|
+
const codeEditor = require('../../../code-editor-B_wPmKPf.cjs');
|
|
15
15
|
const collapsible = require('../../../collapsible-jfzzU7Gp.cjs');
|
|
16
16
|
const Txt = require('../../../Txt-DPmEpNbp.cjs');
|
|
17
17
|
const icons_Icon = require('../../../icons/Icon.cjs.js');
|
|
@@ -7,7 +7,7 @@ import { panelSurfaceStyle } from '../components/workflow-layout.es.js';
|
|
|
7
7
|
import { WorkflowInputData } from './workflow-input-data.es.js';
|
|
8
8
|
import { a as ActivityWick } from '../../../activity-B8TfxRNU.js';
|
|
9
9
|
import { B as Badge } from '../../../Badge-DmOqFpXW.js';
|
|
10
|
-
import { C as CodeEditor } from '../../../code-editor-
|
|
10
|
+
import { C as CodeEditor } from '../../../code-editor-28chVxHw.js';
|
|
11
11
|
import { C as Collapsible, b as CollapsibleTrigger, a as CollapsibleContent } from '../../../collapsible-BNUn4644.js';
|
|
12
12
|
import { T as Txt } from '../../../Txt-BP1SRHmL.js';
|
|
13
13
|
import { Icon } from '../../../icons/Icon.es.js';
|
|
@@ -9,7 +9,7 @@ const superjson = require('superjson');
|
|
|
9
9
|
const zod = require('zod');
|
|
10
10
|
const domains_workflows_context_workflowRunContext = require('../context/workflow-run-context.cjs.js');
|
|
11
11
|
const domains_workflows_workflow_workflowInputData = require('./workflow-input-data.cjs.js');
|
|
12
|
-
const codeEditor = require('../../../code-editor-
|
|
12
|
+
const codeEditor = require('../../../code-editor-B_wPmKPf.cjs');
|
|
13
13
|
const collapsible = require('../../../collapsible-jfzzU7Gp.cjs');
|
|
14
14
|
const fieldBlock = require('../../../field-block-DtaPqBa3.cjs');
|
|
15
15
|
const fieldErrorId = require('../../../field-error-id-B3Z2Zu5y.cjs');
|
|
@@ -5,7 +5,7 @@ import { parse } from 'superjson';
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { WorkflowRunContext } from '../context/workflow-run-context.es.js';
|
|
7
7
|
import { WorkflowInputData } from './workflow-input-data.es.js';
|
|
8
|
-
import { C as CodeEditor } from '../../../code-editor-
|
|
8
|
+
import { C as CodeEditor } from '../../../code-editor-28chVxHw.js';
|
|
9
9
|
import { C as Collapsible, b as CollapsibleTrigger, a as CollapsibleContent } from '../../../collapsible-BNUn4644.js';
|
|
10
10
|
import { F as FieldBlock } from '../../../field-block--PeppIRb.js';
|
|
11
11
|
import { f as fieldErrorId } from '../../../field-error-id-D3yg1nBh.js';
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const React = require('react');
|
|
6
6
|
const envFile = require('../env-file-BU2hStkm.cjs');
|
|
7
7
|
|
|
8
|
+
const ENV_ASSIGNMENT_LINE = /^(?:export\s+)?[A-Za-z_][A-Za-z0-9_]*\s*=/;
|
|
8
9
|
function defaultCreateRow(entry) {
|
|
9
10
|
return { key: entry.key, value: entry.value };
|
|
10
11
|
}
|
|
@@ -137,7 +138,11 @@ function useCustomEnvironmentVariablesEditor({
|
|
|
137
138
|
const afterIds = rowIds.slice(targetIndex + 1);
|
|
138
139
|
return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);
|
|
139
140
|
}
|
|
140
|
-
function handlePaste(index, text) {
|
|
141
|
+
function handlePaste(index, text, field) {
|
|
142
|
+
if (field === "value") {
|
|
143
|
+
const lines = text.split(/\r?\n/).filter((line) => line.trim());
|
|
144
|
+
if (lines.length < 2 || !lines.every((line) => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;
|
|
145
|
+
}
|
|
141
146
|
const entries = parsePastedEnvText(text);
|
|
142
147
|
if (entries.length === 0) return false;
|
|
143
148
|
mergeParsedRows(entries, index);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-environment-variables-editor.cjs.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string) => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string) {\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":["createEmptyEnvironmentVariableEntry","useRef","useState","readEnvFile","getDuplicateEnvironmentVariableKeys","collectEnvironmentVariables","parseEnvFileText"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-environment-variables-editor.cjs.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nconst ENV_ASSIGNMENT_LINE = /^(?:export\\s+)?[A-Za-z_][A-Za-z0-9_]*\\s*=/;\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string, field: 'key' | 'value') => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string, field: 'key' | 'value') {\n // Values (connection strings, PEM keys, JSON) stay literal unless every line is a KEY= assignment\n if (field === 'value') {\n const lines = text.split(/\\r?\\n/).filter(line => line.trim());\n if (lines.length < 2 || !lines.every(line => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;\n }\n\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":["createEmptyEnvironmentVariableEntry","useRef","useState","readEnvFile","getDuplicateEnvironmentVariableKeys","collectEnvironmentVariables","parseEnvFileText"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useRef, useState } from 'react';
|
|
2
2
|
import { g as getDuplicateEnvironmentVariableKeys, c as collectEnvironmentVariables, a as createEmptyEnvironmentVariableEntry, r as readEnvFile, p as parseEnvFileText } from '../env-file-BITYowCx.js';
|
|
3
3
|
|
|
4
|
+
const ENV_ASSIGNMENT_LINE = /^(?:export\s+)?[A-Za-z_][A-Za-z0-9_]*\s*=/;
|
|
4
5
|
function defaultCreateRow(entry) {
|
|
5
6
|
return { key: entry.key, value: entry.value };
|
|
6
7
|
}
|
|
@@ -133,7 +134,11 @@ function useCustomEnvironmentVariablesEditor({
|
|
|
133
134
|
const afterIds = rowIds.slice(targetIndex + 1);
|
|
134
135
|
return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);
|
|
135
136
|
}
|
|
136
|
-
function handlePaste(index, text) {
|
|
137
|
+
function handlePaste(index, text, field) {
|
|
138
|
+
if (field === "value") {
|
|
139
|
+
const lines = text.split(/\r?\n/).filter((line) => line.trim());
|
|
140
|
+
if (lines.length < 2 || !lines.every((line) => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;
|
|
141
|
+
}
|
|
137
142
|
const entries = parsePastedEnvText(text);
|
|
138
143
|
if (entries.length === 0) return false;
|
|
139
144
|
mergeParsedRows(entries, index);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-environment-variables-editor.es.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string) => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string) {\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-environment-variables-editor.es.js","sources":["../../src/hooks/use-environment-variables-editor.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\nimport {\n collectEnvironmentVariables,\n createEmptyEnvironmentVariableEntry,\n getDuplicateEnvironmentVariableKeys,\n parseEnvFileText,\n readEnvFile,\n} from '@/lib/env-file';\nimport type { EnvironmentVariableEntry } from '@/lib/env-file';\n\nconst ENV_ASSIGNMENT_LINE = /^(?:export\\s+)?[A-Za-z_][A-Za-z0-9_]*\\s*=/;\n\nexport type EnvironmentVariableRow = EnvironmentVariableEntry;\n\nexport interface UseEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n initialRows?: readonly TRow[];\n rows?: readonly TRow[];\n onRowsChange?: (rows: TRow[]) => void;\n getEditableRows?: (rows: readonly TRow[]) => readonly TRow[];\n getPreservedRows?: (rows: readonly TRow[]) => readonly TRow[];\n maxUploadSize?: number;\n}\n\nexport interface EnvironmentVariablesEditorRowFactories<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n createDefaultRow: () => TRow;\n createRow: (entry: EnvironmentVariableEntry) => TRow;\n}\n\nexport interface EnvironmentVariablesEditorFileUploadEvent {\n target: {\n files?: FileList | readonly File[] | null;\n };\n}\n\nexport interface EnvironmentVariablesEditorController<TRow extends EnvironmentVariableRow = EnvironmentVariableRow> {\n rows: readonly TRow[];\n uploadError: string | null;\n fileInputRef: RefObject<HTMLInputElement | null>;\n duplicateKeys: Set<string>;\n hasDuplicateKeys: boolean;\n isDirty: boolean;\n isRowsDirty: boolean;\n setRows: (rows: readonly TRow[]) => TRow[];\n resetRows: (rows?: readonly TRow[]) => TRow[];\n appendRow: (row?: TRow) => TRow[];\n updateRow: (index: number, patch: Partial<EnvironmentVariableEntry>) => TRow[];\n removeRow: (index: number) => TRow[];\n getRowsForSubmit: () => TRow[];\n getEnvironmentVariablesForSubmit: () => Record<string, string>;\n handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;\n handlePaste: (index: number, text: string, field: 'key' | 'value') => boolean;\n clearUploadError: () => void;\n getRowId: (index: number) => string;\n isValueRevealed: (index: number) => boolean;\n toggleValueVisibility: (index: number) => void;\n rowHasDuplicateKey: (index: number) => boolean;\n}\n\ntype DefaultEnvironmentVariablesEditorOptions = UseEnvironmentVariablesEditorOptions<EnvironmentVariableRow>;\n\ntype CustomEnvironmentVariablesEditorOptions<TRow extends EnvironmentVariableRow> =\n UseEnvironmentVariablesEditorOptions<TRow> & EnvironmentVariablesEditorRowFactories<TRow>;\n\nfunction defaultCreateRow(entry: EnvironmentVariableEntry): EnvironmentVariableRow {\n return { key: entry.key, value: entry.value };\n}\n\nfunction defaultEditableRows<TRow extends EnvironmentVariableRow>(rows: readonly TRow[]) {\n return rows;\n}\n\nfunction defaultPreservedRows() {\n return [];\n}\n\nfunction normalizeRows<TRow extends EnvironmentVariableRow>(\n rows: readonly TRow[] | undefined,\n createDefaultRow: () => TRow,\n) {\n return rows && rows.length > 0 ? rows.map(row => ({ ...row })) : [createDefaultRow()];\n}\n\nfunction hasOnlyEmptyRow(rows: readonly EnvironmentVariableEntry[]) {\n if (rows.length !== 1) return false;\n const [firstRow] = rows;\n if (!firstRow) return false;\n return !firstRow.key.trim() && !firstRow.value;\n}\n\nfunction areRowsEqual(a: readonly EnvironmentVariableEntry[], b: readonly EnvironmentVariableEntry[]) {\n if (a.length !== b.length) return false;\n\n for (let index = 0; index < a.length; index++) {\n const aRow = a[index];\n const bRow = b[index];\n if (!aRow || !bRow || aRow.key !== bRow.key || aRow.value !== bRow.value) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useEnvironmentVariablesEditor(\n options: DefaultEnvironmentVariablesEditorOptions = {},\n): EnvironmentVariablesEditorController {\n return useCustomEnvironmentVariablesEditor({\n ...options,\n createDefaultRow: createEmptyEnvironmentVariableEntry,\n createRow: defaultCreateRow,\n });\n}\n\nexport function useCustomEnvironmentVariablesEditor<TRow extends EnvironmentVariableRow>({\n initialRows,\n rows: controlledRows,\n onRowsChange,\n createDefaultRow,\n createRow,\n getEditableRows = defaultEditableRows,\n getPreservedRows = defaultPreservedRows,\n maxUploadSize,\n}: CustomEnvironmentVariablesEditorOptions<TRow>): EnvironmentVariablesEditorController<TRow> {\n const initialSourceRows = controlledRows ?? initialRows;\n const nextRowId = useRef(0);\n const fallbackRowIds = useRef<Record<number, string>>({});\n const [uncontrolledRows, setUncontrolledRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [baselineRows, setBaselineRows] = useState(() => normalizeRows(initialSourceRows, createDefaultRow));\n const [rowIds, setRowIds] = useState(() =>\n normalizeRows(initialSourceRows, createDefaultRow).map(() => createRowId()),\n );\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [revealedValues, setRevealedValues] = useState<Record<number, boolean>>({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const rows = controlledRows ? normalizeRows(controlledRows, createDefaultRow) : uncontrolledRows;\n const editableRows = (sourceRows: readonly TRow[] = rows) => getEditableRows(sourceRows);\n const preservedRows = (sourceRows: readonly TRow[] = rows) => getPreservedRows(sourceRows);\n\n function createRowId() {\n const rowId = nextRowId.current;\n nextRowId.current += 1;\n return `environment-variable-row-${rowId}`;\n }\n\n function commitRows(nextRows: readonly TRow[], nextRowIds?: readonly string[]) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n const normalizedRowIds = normalizedRows.map((_, index) => nextRowIds?.[index] ?? rowIds[index] ?? createRowId());\n\n if (!controlledRows) {\n setUncontrolledRows(normalizedRows);\n }\n\n setRowIds(normalizedRowIds);\n onRowsChange?.(normalizedRows);\n return normalizedRows;\n }\n\n function setRows(nextRows: readonly TRow[]) {\n return commitRows(nextRows);\n }\n\n function resetRows(nextRows: readonly TRow[] = baselineRows) {\n const normalizedRows = normalizeRows(nextRows, createDefaultRow);\n commitRows(\n normalizedRows,\n normalizedRows.map(() => createRowId()),\n );\n setBaselineRows(normalizedRows);\n setRevealedValues({});\n setUploadError(null);\n return normalizedRows;\n }\n\n function getRowsForSubmit() {\n return [...rows];\n }\n\n function appendRow(row = createDefaultRow()) {\n return commitRows([...rows, row], [...rowIds, createRowId()]);\n }\n\n function updateRow(index: number, patch: Partial<EnvironmentVariableEntry>) {\n return commitRows(\n rows.map((row, rowIndex) => (rowIndex === index ? { ...row, ...patch } : row)),\n rowIds,\n );\n }\n\n function removeRow(index: number) {\n const nextRows = rows.filter((_, rowIndex) => rowIndex !== index);\n const nextRowIds = rowIds.filter((_, rowIndex) => rowIndex !== index);\n setRevealedValues({});\n return commitRows(\n nextRows.length > 0 ? nextRows : [createDefaultRow()],\n nextRows.length > 0 ? nextRowIds : [createRowId()],\n );\n }\n\n function mergeParsedRows(parsedRows: readonly EnvironmentVariableEntry[], targetIndex?: number) {\n const newRows = parsedRows.map(createRow);\n const newRowIds = newRows.map(() => createRowId());\n const currentEditableRows = editableRows(rows);\n\n if (hasOnlyEmptyRow(currentEditableRows)) {\n const preserved = preservedRows(rows);\n return commitRows([...preserved, ...newRows], [...rowIds.slice(0, preserved.length), ...newRowIds]);\n }\n\n if (typeof targetIndex !== 'number') {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetRow = rows[targetIndex];\n if (!targetRow) {\n return commitRows([...rows, ...newRows], [...rowIds, ...newRowIds]);\n }\n\n const targetIsEmpty = !targetRow.key.trim() && !targetRow.value;\n const before = rows.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const after = rows.slice(targetIndex + 1);\n const beforeIds = rowIds.slice(0, targetIndex + (targetIsEmpty ? 0 : 1));\n const afterIds = rowIds.slice(targetIndex + 1);\n return commitRows([...before, ...newRows, ...after], [...beforeIds, ...newRowIds, ...afterIds]);\n }\n\n function handlePaste(index: number, text: string, field: 'key' | 'value') {\n // Values (connection strings, PEM keys, JSON) stay literal unless every line is a KEY= assignment\n if (field === 'value') {\n const lines = text.split(/\\r?\\n/).filter(line => line.trim());\n if (lines.length < 2 || !lines.every(line => ENV_ASSIGNMENT_LINE.test(line.trim()))) return false;\n }\n\n const entries = parsePastedEnvText(text);\n if (entries.length === 0) return false;\n\n mergeParsedRows(entries, index);\n setRevealedValues({});\n setUploadError(null);\n return true;\n }\n\n async function handleFileUpload(event: EnvironmentVariablesEditorFileUploadEvent) {\n setUploadError(null);\n const file = event.target.files?.[0];\n if (!file) return;\n\n const result = await readEnvFile(file, { maxSize: maxUploadSize });\n if (!result.ok) {\n setUploadError(result.error);\n if (fileInputRef.current) fileInputRef.current.value = '';\n return;\n }\n\n mergeParsedRows(result.entries);\n setRevealedValues({});\n\n if (fileInputRef.current) fileInputRef.current.value = '';\n }\n\n const duplicateKeys = getDuplicateEnvironmentVariableKeys(rows);\n const rowsDirty = !areRowsEqual(rows, baselineRows);\n\n return {\n rows,\n uploadError,\n fileInputRef,\n duplicateKeys,\n hasDuplicateKeys: duplicateKeys.size > 0,\n isDirty: rowsDirty,\n isRowsDirty: rowsDirty,\n setRows,\n resetRows,\n appendRow,\n updateRow,\n removeRow,\n getRowsForSubmit,\n getEnvironmentVariablesForSubmit: () => collectEnvironmentVariables(getRowsForSubmit()),\n handleFileUpload,\n handlePaste,\n clearUploadError: () => setUploadError(null),\n getRowId: index => rowIds[index] ?? (fallbackRowIds.current[index] ??= createRowId()),\n isValueRevealed: index => Boolean(revealedValues[index]),\n toggleValueVisibility: index => setRevealedValues(previous => ({ ...previous, [index]: !previous[index] })),\n rowHasDuplicateKey: index => duplicateKeys.has(rows[index]?.key.trim() ?? ''),\n };\n}\n\nfunction parsePastedEnvText(text: string) {\n const trimmedText = text.trim();\n const entries = parseEnvFileText(trimmedText);\n\n const firstAssignmentLooksLikeEnvVar = /^(?:export\\s+)?[A-Z_][A-Z0-9_]*\\s*=/.test(trimmedText);\n const hasBulkShape = entries.length > 1 || trimmedText.includes('\\n') || firstAssignmentLooksLikeEnvVar;\n\n return hasBulkShape ? entries : [];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,6 @@ export declare const METRICS_ROOT_ENTITY_TYPE_PARAM = "rootEntityType";
|
|
|
22
22
|
* equivalent dimensions into metrics). */
|
|
23
23
|
export declare const METRICS_PROPERTY_FILTER_PARAM_BY_FIELD: {
|
|
24
24
|
readonly tags: "filterTags";
|
|
25
|
-
readonly entityId: "filterEntityId";
|
|
26
25
|
readonly entityName: "filterEntityName";
|
|
27
26
|
readonly runId: "filterRunId";
|
|
28
27
|
readonly threadId: "filterThreadId";
|
|
@@ -78,7 +77,6 @@ export declare function applyMetricsPropertyFilterTokens(params: URLSearchParams
|
|
|
78
77
|
export type MetricsDimensionalFilter = {
|
|
79
78
|
rootEntityType?: EntityType;
|
|
80
79
|
entityName?: string;
|
|
81
|
-
entityId?: string;
|
|
82
80
|
tags?: string[];
|
|
83
81
|
serviceName?: string;
|
|
84
82
|
environment?: string;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { CompletionContext, CompletionResult } from '@codemirror/autocomplete';
|
|
1
2
|
import { Extension } from '@codemirror/state';
|
|
3
|
+
import { VariableCompletion } from './schema-to-variables';
|
|
2
4
|
import { JsonSchema } from '../../../lib/json-schema';
|
|
3
5
|
/**
|
|
4
6
|
* Creates a CodeMirror autocomplete extension for {{variable}} placeholders.
|
|
@@ -21,3 +23,7 @@ import { JsonSchema } from '../../../lib/json-schema';
|
|
|
21
23
|
* ```
|
|
22
24
|
*/
|
|
23
25
|
export declare function createVariableAutocomplete(schema: JsonSchema | undefined): Extension;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a completion source function for CodeMirror's autocompletion.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createVariableCompletionSource(variables: VariableCompletion[]): (context: CompletionContext) => CompletionResult | null;
|
|
@@ -34,7 +34,7 @@ export interface EnvironmentVariablesEditorController<TRow extends EnvironmentVa
|
|
|
34
34
|
getRowsForSubmit: () => TRow[];
|
|
35
35
|
getEnvironmentVariablesForSubmit: () => Record<string, string>;
|
|
36
36
|
handleFileUpload: (event: EnvironmentVariablesEditorFileUploadEvent) => Promise<void>;
|
|
37
|
-
handlePaste: (index: number, text: string) => boolean;
|
|
37
|
+
handlePaste: (index: number, text: string, field: 'key' | 'value') => boolean;
|
|
38
38
|
clearUploadError: () => void;
|
|
39
39
|
getRowId: (index: number) => string;
|
|
40
40
|
isValueRevealed: (index: number) => boolean;
|
|
@@ -25,7 +25,7 @@ import { ToolApprovalButtons } from './domains/chat/tools/badges/tool-approval-b
|
|
|
25
25
|
import { a as ToolCallMono } from './tool-call-mono-CC6uzvhS.js';
|
|
26
26
|
import 'lucide-react';
|
|
27
27
|
import { B as Button } from './Button-D43ghVKt.js';
|
|
28
|
-
import { C as CodeEditor } from './code-editor-
|
|
28
|
+
import { C as CodeEditor } from './code-editor-28chVxHw.js';
|
|
29
29
|
import { AgentIcon } from './icons/AgentIcon.es.js';
|
|
30
30
|
import { resolveToChildMessages } from './domains/chat/tools/badges/resolve-child-messages.es.js';
|
|
31
31
|
import { useAgentMessages } from './domains/agents/hooks/use-agent-messages.es.js';
|
|
@@ -414,4 +414,4 @@ const ToolCardInner = ({
|
|
|
414
414
|
};
|
|
415
415
|
|
|
416
416
|
export { AgentBadge as A, ToolCard as T, AgentBadgeWrapper as a, ToolCardInner as b };
|
|
417
|
-
//# sourceMappingURL=tool-card-
|
|
417
|
+
//# sourceMappingURL=tool-card-C_K5PwrK.js.map
|