@optimizely/ocp-local-env 1.0.0-beta.6 → 1.0.0-beta.7
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/package.json +2 -1
- package/dist/public/bundle.7a5338c67e783e9b42f7.js +3 -0
- package/dist/public/{bundle.932ab47a0dbf0319bc8b.js.LICENSE.txt → bundle.7a5338c67e783e9b42f7.js.LICENSE.txt} +33 -0
- package/dist/public/bundle.7a5338c67e783e9b42f7.js.map +1 -0
- package/dist/public/index.html +1 -1
- package/dist/src/executor/DestinationExecutor.js +10 -7
- package/dist/src/executor/DestinationExecutor.js.map +1 -1
- package/dist/src/executor/FunctionExecutor.js +1 -1
- package/dist/src/executor/FunctionExecutor.js.map +1 -1
- package/dist/src/executor/JobExecutor.js +1 -1
- package/dist/src/executor/JobExecutor.js.map +1 -1
- package/dist/src/executor/LifecycleExecutor.js +1 -1
- package/dist/src/executor/LifecycleExecutor.js.map +1 -1
- package/dist/src/executor/SourceExecutor.d.ts +32 -0
- package/dist/src/executor/SourceExecutor.js +161 -0
- package/dist/src/executor/SourceExecutor.js.map +1 -0
- package/dist/src/local_engine/LocalJobApi.d.ts +38 -0
- package/dist/src/local_engine/LocalJobApi.js +180 -0
- package/dist/src/local_engine/LocalJobApi.js.map +1 -0
- package/dist/src/local_engine/local-engine-child-base.d.ts +16 -0
- package/dist/src/local_engine/local-engine-child-base.js +201 -14
- package/dist/src/local_engine/local-engine-child-base.js.map +1 -1
- package/dist/src/local_engine/local-engine-client.d.ts +70 -1
- package/dist/src/local_engine/local-engine-client.js +545 -26
- package/dist/src/local_engine/local-engine-client.js.map +1 -1
- package/dist/src/local_engine/local-engine-types.d.ts +98 -2
- package/dist/src/local_engine/local-engine-unified.d.ts +18 -0
- package/dist/src/local_engine/local-engine-unified.js +227 -1
- package/dist/src/local_engine/local-engine-unified.js.map +1 -1
- package/dist/src/local_engine/local-engine-utils.js +34 -7
- package/dist/src/local_engine/local-engine-utils.js.map +1 -1
- package/dist/src/local_engine/localSDKConfig.js +237 -39
- package/dist/src/local_engine/localSDKConfig.js.map +1 -1
- package/dist/src/local_engine/storage/LocalConfigStore.d.ts +18 -0
- package/dist/src/local_engine/storage/LocalConfigStore.js +52 -3
- package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalJobStore.d.ts +1 -0
- package/dist/src/local_engine/storage/LocalJobStore.js +12 -2
- package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalKVStore.d.ts +1 -0
- package/dist/src/local_engine/storage/LocalKVStore.js +134 -75
- package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +1 -0
- package/dist/src/local_engine/storage/LocalNotificationStore.js +17 -3
- package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +1 -0
- package/dist/src/local_engine/storage/LocalSecretsStore.js +37 -6
- package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +1 -0
- package/dist/src/local_engine/storage/LocalSettingsStore.js +61 -11
- package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -1
- package/dist/src/local_engine/storage/SourceDataStore.d.ts +23 -0
- package/dist/src/local_engine/storage/SourceDataStore.js +83 -0
- package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +25 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js +61 -0
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +1 -0
- package/dist/src/local_engine/utils.js +20 -4
- package/dist/src/local_engine/utils.js.map +1 -1
- package/dist/src/logging/LogManager.d.ts +191 -34
- package/dist/src/logging/LogManager.js +209 -103
- package/dist/src/logging/LogManager.js.map +1 -1
- package/dist/src/server/api/destinations.js +30 -6
- package/dist/src/server/api/destinations.js.map +1 -1
- package/dist/src/server/api/jobs.js +3 -0
- package/dist/src/server/api/jobs.js.map +1 -1
- package/dist/src/server/api/sources.d.ts +7 -0
- package/dist/src/server/api/sources.js +380 -0
- package/dist/src/server/api/sources.js.map +1 -0
- package/dist/src/server/api.js +64 -3
- package/dist/src/server/api.js.map +1 -1
- package/dist/src/server.js +203 -19
- package/dist/src/server.js.map +1 -1
- package/dist/src/ui/components/App.js +165 -21
- package/dist/src/ui/components/App.js.map +1 -1
- package/dist/src/ui/components/DestinationsView.d.ts +8 -0
- package/dist/src/ui/components/DestinationsView.js +30 -9
- package/dist/src/ui/components/DestinationsView.js.map +1 -1
- package/dist/src/ui/components/FunctionsView.d.ts +7 -0
- package/dist/src/ui/components/FunctionsView.js +69 -9
- package/dist/src/ui/components/FunctionsView.js.map +1 -1
- package/dist/src/ui/components/JobsView.d.ts +7 -0
- package/dist/src/ui/components/JobsView.js +55 -15
- package/dist/src/ui/components/JobsView.js.map +1 -1
- package/dist/src/ui/components/SourceDataViewer.d.ts +8 -0
- package/dist/src/ui/components/SourceDataViewer.js +84 -0
- package/dist/src/ui/components/SourceDataViewer.js.map +1 -0
- package/dist/src/ui/components/SourceJobsSection.d.ts +8 -0
- package/dist/src/ui/components/SourceJobsSection.js +99 -0
- package/dist/src/ui/components/SourceJobsSection.js.map +1 -0
- package/dist/src/ui/components/SourceLifecycleSection.d.ts +7 -0
- package/dist/src/ui/components/SourceLifecycleSection.js +58 -0
- package/dist/src/ui/components/SourceLifecycleSection.js.map +1 -0
- package/dist/src/ui/components/SourceSchemaViewer.d.ts +7 -0
- package/dist/src/ui/components/SourceSchemaViewer.js +65 -0
- package/dist/src/ui/components/SourceSchemaViewer.js.map +1 -0
- package/dist/src/ui/components/SourceWebhookEditor.d.ts +8 -0
- package/dist/src/ui/components/SourceWebhookEditor.js +168 -0
- package/dist/src/ui/components/SourceWebhookEditor.js.map +1 -0
- package/dist/src/ui/components/SourcesView.d.ts +14 -0
- package/dist/src/ui/components/SourcesView.js +74 -0
- package/dist/src/ui/components/SourcesView.js.map +1 -0
- package/dist/src/ui/components/TabbedConsole.d.ts +3 -1
- package/dist/src/ui/components/TabbedConsole.js +81 -11
- package/dist/src/ui/components/TabbedConsole.js.map +1 -1
- package/dist/src/ui/hooks/useEntityNavigation.d.ts +72 -0
- package/dist/src/ui/hooks/useEntityNavigation.js +150 -0
- package/dist/src/ui/hooks/useEntityNavigation.js.map +1 -0
- package/dist/src/ui/hooks/useQueryParams.d.ts +6 -0
- package/dist/src/ui/hooks/useQueryParams.js +39 -0
- package/dist/src/ui/hooks/useQueryParams.js.map +1 -0
- package/dist/src/ui/index.js +3 -2
- package/dist/src/ui/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/public/bundle.932ab47a0dbf0319bc8b.js +0 -3
- package/dist/public/bundle.932ab47a0dbf0319bc8b.js.map +0 -1
- package/dist/src/server/api/lifecycle.d.ts +0 -6
- package/dist/src/server/api/lifecycle.js +0 -72
- package/dist/src/server/api/lifecycle.js.map +0 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SourcesView = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
7
|
+
const useEntityNavigation_1 = require("../hooks/useEntityNavigation");
|
|
8
|
+
const SourceSchemaViewer_1 = require("./SourceSchemaViewer");
|
|
9
|
+
const SourceWebhookEditor_1 = require("./SourceWebhookEditor");
|
|
10
|
+
const SourceDataViewer_1 = require("./SourceDataViewer");
|
|
11
|
+
const SourceJobsSection_1 = require("./SourceJobsSection");
|
|
12
|
+
const SourceLifecycleSection_1 = require("./SourceLifecycleSection");
|
|
13
|
+
const SourcesView = ({ apiBaseUrl, appInstalled, buildStatus }) => {
|
|
14
|
+
const location = (0, react_router_dom_1.useLocation)();
|
|
15
|
+
const [sources, setSources] = (0, react_1.useState)([]);
|
|
16
|
+
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
17
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
18
|
+
// Derive state from URL
|
|
19
|
+
const pathParts = location.pathname.split('/').filter(Boolean);
|
|
20
|
+
const selectedSource = pathParts.length > 1 ? pathParts[1] : null;
|
|
21
|
+
// Use entity navigation hook for navigation, validation, auto-selection, and tab management
|
|
22
|
+
const { navigateToEntity: setSelectedSourceAndNavigate, activeTab, setActiveTab: setActiveTabAndUpdateUrl, } = (0, useEntityNavigation_1.useEntityNavigation)({
|
|
23
|
+
basePath: '/sources',
|
|
24
|
+
entityName: 'source',
|
|
25
|
+
entities: sources,
|
|
26
|
+
selectedEntityId: selectedSource,
|
|
27
|
+
defaultTab: 'schema',
|
|
28
|
+
validTabs: ['schema', 'webhook', 'jobs', 'lifecycle'],
|
|
29
|
+
});
|
|
30
|
+
(0, react_1.useEffect)(() => {
|
|
31
|
+
if (appInstalled) {
|
|
32
|
+
fetchSources();
|
|
33
|
+
}
|
|
34
|
+
}, [appInstalled]);
|
|
35
|
+
const fetchSources = async () => {
|
|
36
|
+
try {
|
|
37
|
+
setLoading(true);
|
|
38
|
+
const response = await fetch(`${apiBaseUrl}/sources`);
|
|
39
|
+
const data = await response.json();
|
|
40
|
+
setSources(data.sources || []);
|
|
41
|
+
setError(null);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
setError(`Failed to load sources: ${err.message}`);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
setLoading(false);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
// Show loading state during initial build or when build is in progress
|
|
51
|
+
if (buildStatus?.buildInProgress || (buildStatus?.lastBuildSuccess === null && buildStatus?.lastBuildTimestamp === null)) {
|
|
52
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "sources-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Building App..." }), (0, jsx_runtime_1.jsx)("p", { children: "Please wait while the app is being built." }), (0, jsx_runtime_1.jsx)("div", { className: "spinner" })] }) }));
|
|
53
|
+
}
|
|
54
|
+
// Show error state if build failed
|
|
55
|
+
if (buildStatus?.lastBuildSuccess === false) {
|
|
56
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "sources-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Build Failed" }), (0, jsx_runtime_1.jsx)("p", { children: "The app failed to build. Please check the console for errors." }), buildStatus.lastBuildError && ((0, jsx_runtime_1.jsx)("pre", { className: "error-details", children: buildStatus.lastBuildError }))] }) }));
|
|
57
|
+
}
|
|
58
|
+
if (!appInstalled) {
|
|
59
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "sources-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Sources Not Available" }), (0, jsx_runtime_1.jsx)("p", { children: "Install your app first to configure sources. Sources will appear here after installation." })] }) }));
|
|
60
|
+
}
|
|
61
|
+
if (loading) {
|
|
62
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "destinations-view", children: (0, jsx_runtime_1.jsx)("div", { className: "placeholder-content", children: (0, jsx_runtime_1.jsx)("p", { children: "Loading sources..." }) }) }));
|
|
63
|
+
}
|
|
64
|
+
if (error) {
|
|
65
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "destinations-view", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Error" }), (0, jsx_runtime_1.jsx)("p", { children: error })] }) }));
|
|
66
|
+
}
|
|
67
|
+
if (sources.length === 0) {
|
|
68
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "destinations-view", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "No Sources Found" }), (0, jsx_runtime_1.jsx)("p", { children: "No sources defined in app.yml" })] }) }));
|
|
69
|
+
}
|
|
70
|
+
const selectedSourceObj = sources.find(s => s.id === selectedSource);
|
|
71
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "destinations-view", children: (0, jsx_runtime_1.jsxs)("div", { className: "destinations-layout", children: [(0, jsx_runtime_1.jsxs)("div", { className: "destinations-sidebar", children: [(0, jsx_runtime_1.jsx)("div", { className: "destinations-header", children: (0, jsx_runtime_1.jsx)("h4", { children: "Sources" }) }), (0, jsx_runtime_1.jsx)("div", { className: "destinations-list", children: sources.map(source => ((0, jsx_runtime_1.jsxs)("div", { className: `destination-item ${selectedSource === source.id ? 'active' : ''}`, onClick: () => setSelectedSourceAndNavigate(source.id), children: [(0, jsx_runtime_1.jsx)("div", { className: "destination-name", children: source.id }), (0, jsx_runtime_1.jsx)("div", { className: "destination-description", children: source.description })] }, source.id))) })] }), (0, jsx_runtime_1.jsx)("div", { className: "destinations-content", children: selectedSource && selectedSourceObj ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "source-tabs", children: [(0, jsx_runtime_1.jsx)("button", { className: `source-tab ${activeTab === 'schema' ? 'active' : ''}`, onClick: () => setActiveTabAndUpdateUrl?.('schema'), children: "Schema" }), (0, jsx_runtime_1.jsx)("button", { className: `source-tab ${activeTab === 'webhook' ? 'active' : ''}`, onClick: () => setActiveTabAndUpdateUrl?.('webhook'), children: "Function" }), selectedSourceObj?.jobs && Object.keys(selectedSourceObj.jobs).length > 0 && ((0, jsx_runtime_1.jsx)("button", { className: `source-tab ${activeTab === 'jobs' ? 'active' : ''}`, onClick: () => setActiveTabAndUpdateUrl?.('jobs'), children: "Jobs" })), (0, jsx_runtime_1.jsx)("button", { className: `source-tab ${activeTab === 'lifecycle' ? 'active' : ''}`, onClick: () => setActiveTabAndUpdateUrl?.('lifecycle'), children: "Lifecycle" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "source-tab-content", children: [activeTab === 'schema' && ((0, jsx_runtime_1.jsx)("div", { className: "source-schema-full-width", children: (0, jsx_runtime_1.jsx)(SourceSchemaViewer_1.SourceSchemaViewer, { sourceId: selectedSource, apiBaseUrl: apiBaseUrl }) })), activeTab === 'webhook' && ((0, jsx_runtime_1.jsxs)("div", { className: "source-tab-panel", children: [(0, jsx_runtime_1.jsx)("div", { className: "source-main-section", children: (0, jsx_runtime_1.jsx)("div", { className: "source-panel", children: (0, jsx_runtime_1.jsx)(SourceWebhookEditor_1.SourceWebhookEditor, { sourceId: selectedSource, apiBaseUrl: apiBaseUrl, webhookUrl: selectedSourceObj.webhookUrl }) }) }), (0, jsx_runtime_1.jsx)("div", { className: "source-side-panels", children: (0, jsx_runtime_1.jsx)("div", { className: "source-panel", children: (0, jsx_runtime_1.jsx)(SourceDataViewer_1.SourceDataViewer, { sourceId: selectedSource, apiBaseUrl: apiBaseUrl, context: "webhook" }) }) })] })), activeTab === 'jobs' && ((0, jsx_runtime_1.jsx)("div", { className: "source-jobs-full-width", children: (0, jsx_runtime_1.jsx)(SourceJobsSection_1.SourceJobsSection, { sourceId: selectedSource, jobs: selectedSourceObj.jobs || {}, apiBaseUrl: apiBaseUrl }) })), activeTab === 'lifecycle' && ((0, jsx_runtime_1.jsx)("div", { className: "source-lifecycle-full-width", children: (0, jsx_runtime_1.jsx)(SourceLifecycleSection_1.SourceLifecycleSection, { sourceId: selectedSource, apiBaseUrl: apiBaseUrl }) }))] })] })) : ((0, jsx_runtime_1.jsx)("div", { className: "no-destination-selected", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Select a Source" }), (0, jsx_runtime_1.jsx)("p", { children: "Choose a source from the sidebar to view its schema and test it" })] }) })) })] }) }));
|
|
72
|
+
};
|
|
73
|
+
exports.SourcesView = SourcesView;
|
|
74
|
+
//# sourceMappingURL=SourcesView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SourcesView.js","sourceRoot":"","sources":["../../../../src/ui/components/SourcesView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { LogEntry } from '../../logging/LogManager';
|
|
2
3
|
interface TabbedConsoleProps {
|
|
3
|
-
logs:
|
|
4
|
+
logs: LogEntry[];
|
|
4
5
|
onClearLogs: () => void;
|
|
5
6
|
storeTimestamps?: {
|
|
6
7
|
settings?: string | null;
|
|
@@ -10,6 +11,7 @@ interface TabbedConsoleProps {
|
|
|
10
11
|
notifications?: string | null;
|
|
11
12
|
} | null;
|
|
12
13
|
onRefreshStores?: () => void;
|
|
14
|
+
notificationCount?: number;
|
|
13
15
|
}
|
|
14
16
|
declare const TabbedConsole: React.FC<TabbedConsoleProps>;
|
|
15
17
|
export default TabbedConsole;
|
|
@@ -6,25 +6,88 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = require("react");
|
|
8
8
|
const StoreViewer_1 = __importDefault(require("./StoreViewer"));
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
9
|
+
const useQueryParams_1 = require("../hooks/useQueryParams");
|
|
10
|
+
const TabbedConsole = ({ logs, onClearLogs, storeTimestamps, onRefreshStores, notificationCount = 0 }) => {
|
|
11
|
+
const { getParam, setParam } = (0, useQueryParams_1.useQueryParams)();
|
|
12
|
+
// Derive activeTab from URL, default to 'console'
|
|
13
|
+
const activeTab = getParam('console') || 'console';
|
|
14
|
+
// Restore expanded state from localStorage, default to false
|
|
15
|
+
const [expanded, setExpanded] = (0, react_1.useState)(() => {
|
|
16
|
+
const stored = localStorage.getItem('consoleExpanded');
|
|
17
|
+
return stored ? JSON.parse(stored) : false;
|
|
18
|
+
});
|
|
19
|
+
// Restore height from localStorage, default to 200
|
|
20
|
+
const [height, setHeight] = (0, react_1.useState)(() => {
|
|
21
|
+
const stored = localStorage.getItem('consoleHeight');
|
|
22
|
+
return stored ? parseInt(stored, 10) : 200;
|
|
23
|
+
});
|
|
24
|
+
const [logFilter, setLogFilter] = (0, react_1.useState)('app');
|
|
25
|
+
const [categoryFilter, setCategoryFilter] = (0, react_1.useState)('all');
|
|
26
|
+
const [levelFilter, setLevelFilter] = (0, react_1.useState)('all');
|
|
13
27
|
const dragStateRef = (0, react_1.useRef)({
|
|
14
28
|
isMouseDown: false,
|
|
15
29
|
isDragging: false,
|
|
16
30
|
startY: 0,
|
|
17
31
|
startHeight: 200
|
|
18
32
|
});
|
|
33
|
+
// Log categories organized by source type
|
|
34
|
+
const APP_CATEGORIES = [
|
|
35
|
+
'function',
|
|
36
|
+
'lifecycle',
|
|
37
|
+
'jobs',
|
|
38
|
+
'notifications'
|
|
39
|
+
];
|
|
40
|
+
const SYSTEM_CATEGORIES = [
|
|
41
|
+
'build',
|
|
42
|
+
'destination',
|
|
43
|
+
'kvstore',
|
|
44
|
+
'settings',
|
|
45
|
+
'secrets',
|
|
46
|
+
'config',
|
|
47
|
+
'ipc',
|
|
48
|
+
'process'
|
|
49
|
+
];
|
|
50
|
+
// Save expanded state to localStorage when it changes
|
|
51
|
+
(0, react_1.useEffect)(() => {
|
|
52
|
+
localStorage.setItem('consoleExpanded', JSON.stringify(expanded));
|
|
53
|
+
}, [expanded]);
|
|
54
|
+
// Save height to localStorage when it changes
|
|
55
|
+
(0, react_1.useEffect)(() => {
|
|
56
|
+
localStorage.setItem('consoleHeight', String(height));
|
|
57
|
+
}, [height]);
|
|
58
|
+
const filterLogs = (logs) => {
|
|
59
|
+
let filtered = logs;
|
|
60
|
+
// Filter by source (all/app/engine)
|
|
61
|
+
if (logFilter === 'app') {
|
|
62
|
+
filtered = filtered.filter(log => log.source === 'app');
|
|
63
|
+
}
|
|
64
|
+
else if (logFilter === 'engine') {
|
|
65
|
+
filtered = filtered.filter(log => log.source === 'system');
|
|
66
|
+
}
|
|
67
|
+
// Filter by category
|
|
68
|
+
if (categoryFilter !== 'all') {
|
|
69
|
+
filtered = filtered.filter(log => log.category === categoryFilter);
|
|
70
|
+
}
|
|
71
|
+
// Filter by level (hierarchical: show selected level and above)
|
|
72
|
+
if (levelFilter !== 'all') {
|
|
73
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
74
|
+
const minLevelIndex = levels.indexOf(levelFilter);
|
|
75
|
+
filtered = filtered.filter(log => levels.indexOf(log.level) >= minLevelIndex);
|
|
76
|
+
}
|
|
77
|
+
return filtered;
|
|
78
|
+
};
|
|
19
79
|
const renderTabContent = () => {
|
|
20
80
|
switch (activeTab) {
|
|
21
81
|
case 'console':
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
82
|
+
const filteredLogs = filterLogs(logs);
|
|
83
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "console-tab-content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "console-controls", children: [(0, jsx_runtime_1.jsxs)("div", { className: "filter-row", children: [(0, jsx_runtime_1.jsxs)("div", { className: "filter-group", children: [(0, jsx_runtime_1.jsx)("label", { className: "filter-label", children: "Source:" }), (0, jsx_runtime_1.jsxs)("select", { className: "filter-select", value: logFilter, onChange: (e) => setLogFilter(e.target.value), children: [(0, jsx_runtime_1.jsx)("option", { value: "app", children: "App" }), (0, jsx_runtime_1.jsx)("option", { value: "engine", children: "Engine (System)" }), (0, jsx_runtime_1.jsx)("option", { value: "all", children: "All Sources" })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "filter-group", children: [(0, jsx_runtime_1.jsx)("label", { className: "filter-label", children: "Level:" }), (0, jsx_runtime_1.jsxs)("select", { className: "filter-select", value: levelFilter, onChange: (e) => setLevelFilter(e.target.value), children: [(0, jsx_runtime_1.jsx)("option", { value: "all", children: "All Levels" }), (0, jsx_runtime_1.jsx)("option", { value: "debug", children: "Debug+" }), (0, jsx_runtime_1.jsx)("option", { value: "info", children: "Info+" }), (0, jsx_runtime_1.jsx)("option", { value: "warn", children: "Warn+" }), (0, jsx_runtime_1.jsx)("option", { value: "error", children: "Error Only" })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "filter-group", children: [(0, jsx_runtime_1.jsx)("label", { className: "filter-label", children: "Category:" }), (0, jsx_runtime_1.jsxs)("select", { className: "filter-select", value: categoryFilter, onChange: (e) => setCategoryFilter(e.target.value), children: [(0, jsx_runtime_1.jsx)("option", { value: "all", children: "All Categories" }), (0, jsx_runtime_1.jsx)("optgroup", { label: "\u2500\u2500\u2500 App \u2500\u2500\u2500", children: APP_CATEGORIES.map(cat => ((0, jsx_runtime_1.jsx)("option", { value: cat, children: cat }, cat))) }), (0, jsx_runtime_1.jsx)("optgroup", { label: "\u2500\u2500\u2500 System \u2500\u2500\u2500", children: SYSTEM_CATEGORIES.map(cat => ((0, jsx_runtime_1.jsx)("option", { value: cat, children: cat }, cat))) })] })] })] }), (0, jsx_runtime_1.jsx)("button", { className: "clear-logs-btn", onClick: onClearLogs, children: "Clear Logs" })] }), (0, jsx_runtime_1.jsx)("div", { className: "log-container", children: filteredLogs.length > 0 ? (filteredLogs.map((log) => {
|
|
84
|
+
// Format log inline with access to all fields
|
|
85
|
+
const time = new Date(log.timestamp).toLocaleTimeString();
|
|
86
|
+
const id = log.context?.id || 'unknown';
|
|
87
|
+
const sourceCategoryId = `${log.source}:${log.category}:${id}`;
|
|
88
|
+
const level = log.level.toUpperCase();
|
|
89
|
+
const formattedLog = `[${time}] ${sourceCategoryId.toUpperCase()} ${level}: ${log.message}`;
|
|
90
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `log-line log-${log.level} log-source-${log.source} log-category-${log.category}`, children: formattedLog }, log.id));
|
|
28
91
|
})) : ((0, jsx_runtime_1.jsx)("div", { className: "no-logs", children: "No console output yet" })) })] }));
|
|
29
92
|
case 'settings':
|
|
30
93
|
case 'secrets':
|
|
@@ -87,7 +150,14 @@ const TabbedConsole = ({ logs, onClearLogs, storeTimestamps, onRefreshStores })
|
|
|
87
150
|
document.addEventListener('mousemove', handleMouseMove);
|
|
88
151
|
document.addEventListener('mouseup', handleMouseUp);
|
|
89
152
|
};
|
|
90
|
-
|
|
153
|
+
// Handle tab click - switch tab and expand console if collapsed
|
|
154
|
+
const handleTabClick = (tab) => {
|
|
155
|
+
setParam('console', tab);
|
|
156
|
+
if (!expanded) {
|
|
157
|
+
setExpanded(true);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: `console-panel ${expanded ? 'expanded' : 'collapsed'}`, style: { height: expanded ? `${height}px` : '32px' }, children: [expanded && ((0, jsx_runtime_1.jsx)("div", { className: "console-resize-handle", onMouseDown: handleResizeMouseDown })), (0, jsx_runtime_1.jsxs)("div", { className: "console-tab-headers", children: [(0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'console' ? 'active' : ''}`, onClick: () => handleTabClick('console'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\uD83D\uDCCB" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "Console" }), (0, jsx_runtime_1.jsxs)("span", { className: "tab-count", children: ["(", logs.length, ")"] })] }), (0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'settings' ? 'active' : ''}`, onClick: () => handleTabClick('settings'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\u2699\uFE0F" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "Settings" })] }), (0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'secrets' ? 'active' : ''}`, onClick: () => handleTabClick('secrets'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\uD83D\uDD10" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "Secrets" })] }), (0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'kv' ? 'active' : ''}`, onClick: () => handleTabClick('kv'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\uD83D\uDDC3\uFE0F" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "KV Store" })] }), (0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'sharedKv' ? 'active' : ''}`, onClick: () => handleTabClick('sharedKv'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\uD83D\uDD17" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "Shared KV" })] }), (0, jsx_runtime_1.jsxs)("button", { className: `console-tab ${activeTab === 'notifications' ? 'active' : ''}`, onClick: () => handleTabClick('notifications'), children: [(0, jsx_runtime_1.jsx)("span", { className: "tab-icon", children: "\uD83D\uDD14" }), (0, jsx_runtime_1.jsx)("span", { className: "tab-label", children: "Notifications" }), notificationCount > 0 && ((0, jsx_runtime_1.jsx)("span", { className: "notification-badge", children: notificationCount }))] }), (0, jsx_runtime_1.jsx)("button", { className: "console-toggle", onClick: () => setExpanded(!expanded), children: expanded ? '▼' : '▲' })] }), expanded && ((0, jsx_runtime_1.jsx)("div", { className: "console-content", children: (0, jsx_runtime_1.jsx)("div", { className: "console-tab-body", children: renderTabContent() }) }))] }));
|
|
91
161
|
};
|
|
92
162
|
exports.default = TabbedConsole;
|
|
93
163
|
//# sourceMappingURL=TabbedConsole.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabbedConsole.js","sourceRoot":"","sources":["../../../../src/ui/components/TabbedConsole.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAA2D;AAC3D,gEAAwC;
|
|
1
|
+
{"version":3,"file":"TabbedConsole.js","sourceRoot":"","sources":["../../../../src/ui/components/TabbedConsole.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for entity navigation hook
|
|
3
|
+
*/
|
|
4
|
+
interface EntityNavigationConfig<TTab extends string = never> {
|
|
5
|
+
/** Base path for the entity (e.g., '/functions', '/jobs') */
|
|
6
|
+
basePath: string;
|
|
7
|
+
/** Entity name for logging purposes (e.g., 'function', 'job') */
|
|
8
|
+
entityName: string;
|
|
9
|
+
/** List of available entities */
|
|
10
|
+
entities: Array<{
|
|
11
|
+
id: string;
|
|
12
|
+
}>;
|
|
13
|
+
/** Currently selected entity ID from URL */
|
|
14
|
+
selectedEntityId: string | null;
|
|
15
|
+
/** Default tab value (optional, for views with tabs) */
|
|
16
|
+
defaultTab?: TTab;
|
|
17
|
+
/** Valid tab values (optional, for views with tabs) */
|
|
18
|
+
validTabs?: readonly TTab[];
|
|
19
|
+
/** Additional query parameters to preserve during navigation (default: ['console']) */
|
|
20
|
+
preserveParams?: string[];
|
|
21
|
+
/** Additional query parameters to set when navigating to an entity */
|
|
22
|
+
additionalParams?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Return value from entity navigation hook
|
|
26
|
+
*/
|
|
27
|
+
interface EntityNavigationReturn<TTab extends string = never> {
|
|
28
|
+
/** Navigate to a specific entity or clear selection */
|
|
29
|
+
navigateToEntity: (entityId: string | null, replace?: boolean) => void;
|
|
30
|
+
/** Whether the currently selected entity exists in the entities list */
|
|
31
|
+
isValidEntity: boolean;
|
|
32
|
+
/** Whether the first entity should be auto-selected */
|
|
33
|
+
shouldAutoSelect: boolean;
|
|
34
|
+
/** Active tab (if tabs are configured) */
|
|
35
|
+
activeTab?: TTab;
|
|
36
|
+
/** Set the active tab (if tabs are configured) */
|
|
37
|
+
setActiveTab?: (tab: TTab) => void;
|
|
38
|
+
/** Whether the current tab is valid (if tabs are configured) */
|
|
39
|
+
isValidTab?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Custom hook for managing entity selection and navigation with URL synchronization.
|
|
43
|
+
*
|
|
44
|
+
* This hook handles:
|
|
45
|
+
* - Navigation to/from entities while preserving query parameters (e.g., console tab)
|
|
46
|
+
* - Auto-selection of first entity when none is selected
|
|
47
|
+
* - Validation of entity ID and redirect to first entity if invalid
|
|
48
|
+
* - Optional tab management with validation
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // Simple entity navigation (no tabs)
|
|
53
|
+
* const { navigateToEntity } = useEntityNavigation({
|
|
54
|
+
* basePath: '/destinations',
|
|
55
|
+
* entityName: 'destination',
|
|
56
|
+
* entities: destinations,
|
|
57
|
+
* selectedEntityId: selectedDestination,
|
|
58
|
+
* });
|
|
59
|
+
*
|
|
60
|
+
* // With tabs
|
|
61
|
+
* const { navigateToEntity, activeTab, setActiveTab } = useEntityNavigation({
|
|
62
|
+
* basePath: '/functions',
|
|
63
|
+
* entityName: 'function',
|
|
64
|
+
* entities: functions,
|
|
65
|
+
* selectedEntityId: selectedFunction,
|
|
66
|
+
* defaultTab: 'body' as const,
|
|
67
|
+
* validTabs: ['params', 'headers', 'body'] as const,
|
|
68
|
+
* });
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function useEntityNavigation<TTab extends string = never>(config: EntityNavigationConfig<TTab>): EntityNavigationReturn<TTab>;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useEntityNavigation = useEntityNavigation;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
6
|
+
const useQueryParams_1 = require("./useQueryParams");
|
|
7
|
+
/**
|
|
8
|
+
* Custom hook for managing entity selection and navigation with URL synchronization.
|
|
9
|
+
*
|
|
10
|
+
* This hook handles:
|
|
11
|
+
* - Navigation to/from entities while preserving query parameters (e.g., console tab)
|
|
12
|
+
* - Auto-selection of first entity when none is selected
|
|
13
|
+
* - Validation of entity ID and redirect to first entity if invalid
|
|
14
|
+
* - Optional tab management with validation
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Simple entity navigation (no tabs)
|
|
19
|
+
* const { navigateToEntity } = useEntityNavigation({
|
|
20
|
+
* basePath: '/destinations',
|
|
21
|
+
* entityName: 'destination',
|
|
22
|
+
* entities: destinations,
|
|
23
|
+
* selectedEntityId: selectedDestination,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // With tabs
|
|
27
|
+
* const { navigateToEntity, activeTab, setActiveTab } = useEntityNavigation({
|
|
28
|
+
* basePath: '/functions',
|
|
29
|
+
* entityName: 'function',
|
|
30
|
+
* entities: functions,
|
|
31
|
+
* selectedEntityId: selectedFunction,
|
|
32
|
+
* defaultTab: 'body' as const,
|
|
33
|
+
* validTabs: ['params', 'headers', 'body'] as const,
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function useEntityNavigation(config) {
|
|
38
|
+
const navigate = (0, react_router_dom_1.useNavigate)();
|
|
39
|
+
const { getParam, setParams } = (0, useQueryParams_1.useQueryParams)();
|
|
40
|
+
const { basePath, entityName, entities, selectedEntityId, defaultTab, validTabs, preserveParams = ['console'], additionalParams = {}, } = config;
|
|
41
|
+
/**
|
|
42
|
+
* Build URLSearchParams with preserved parameters
|
|
43
|
+
*/
|
|
44
|
+
const buildPreservedParams = (0, react_1.useCallback)(() => {
|
|
45
|
+
const params = new URLSearchParams();
|
|
46
|
+
// Preserve specified query params
|
|
47
|
+
preserveParams.forEach(param => {
|
|
48
|
+
const value = getParam(param);
|
|
49
|
+
if (value) {
|
|
50
|
+
params.set(param, value);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// Add any additional params
|
|
54
|
+
Object.entries(additionalParams).forEach(([key, value]) => {
|
|
55
|
+
if (value) {
|
|
56
|
+
params.set(key, value);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return params;
|
|
60
|
+
}, [getParam, preserveParams, additionalParams]);
|
|
61
|
+
/**
|
|
62
|
+
* Navigate to an entity (or clear selection if entityId is null)
|
|
63
|
+
*/
|
|
64
|
+
const navigateToEntity = (0, react_1.useCallback)((entityId, replace = false) => {
|
|
65
|
+
const params = buildPreservedParams();
|
|
66
|
+
if (entityId) {
|
|
67
|
+
// Add default tab if configured
|
|
68
|
+
if (defaultTab) {
|
|
69
|
+
params.set('tab', defaultTab);
|
|
70
|
+
}
|
|
71
|
+
const query = params.toString();
|
|
72
|
+
navigate(`${basePath}/${entityId}${query ? `?${query}` : ''}`, { replace });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// No entity selected, navigate to base path
|
|
76
|
+
const query = params.toString();
|
|
77
|
+
navigate(`${basePath}${query ? `?${query}` : ''}`, { replace });
|
|
78
|
+
}
|
|
79
|
+
}, [navigate, basePath, defaultTab, buildPreservedParams]);
|
|
80
|
+
/**
|
|
81
|
+
* Check if the selected entity exists in the entities list
|
|
82
|
+
*/
|
|
83
|
+
const isValidEntity = (0, react_1.useMemo)(() => {
|
|
84
|
+
if (!selectedEntityId || entities.length === 0)
|
|
85
|
+
return true;
|
|
86
|
+
return entities.some(e => e.id === selectedEntityId);
|
|
87
|
+
}, [selectedEntityId, entities]);
|
|
88
|
+
/**
|
|
89
|
+
* Determine if we should auto-select the first entity
|
|
90
|
+
*/
|
|
91
|
+
const shouldAutoSelect = (0, react_1.useMemo)(() => {
|
|
92
|
+
return entities.length > 0 && !selectedEntityId;
|
|
93
|
+
}, [entities.length, selectedEntityId]);
|
|
94
|
+
/**
|
|
95
|
+
* Validate entity ID and redirect if invalid
|
|
96
|
+
*/
|
|
97
|
+
(0, react_1.useEffect)(() => {
|
|
98
|
+
if (selectedEntityId && entities.length > 0 && !isValidEntity) {
|
|
99
|
+
console.warn(`${entityName} '${selectedEntityId}' not found, redirecting to first ${entityName}`);
|
|
100
|
+
navigateToEntity(entities[0].id, true);
|
|
101
|
+
}
|
|
102
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
103
|
+
}, [selectedEntityId, entities, isValidEntity, entityName]);
|
|
104
|
+
/**
|
|
105
|
+
* Auto-select first entity if none selected
|
|
106
|
+
*/
|
|
107
|
+
(0, react_1.useEffect)(() => {
|
|
108
|
+
if (shouldAutoSelect) {
|
|
109
|
+
navigateToEntity(entities[0].id, true);
|
|
110
|
+
}
|
|
111
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
112
|
+
}, [shouldAutoSelect, entities]);
|
|
113
|
+
// Tab handling (if configured)
|
|
114
|
+
const activeTab = (validTabs && getParam('tab')) || defaultTab;
|
|
115
|
+
const isValidTab = (0, react_1.useMemo)(() => {
|
|
116
|
+
if (!validTabs || !activeTab)
|
|
117
|
+
return true;
|
|
118
|
+
return validTabs.includes(activeTab);
|
|
119
|
+
}, [validTabs, activeTab]);
|
|
120
|
+
const setActiveTab = (0, react_1.useCallback)((tab) => {
|
|
121
|
+
setParams({ tab });
|
|
122
|
+
}, [setParams]);
|
|
123
|
+
/**
|
|
124
|
+
* Validate tab and set default if needed
|
|
125
|
+
*/
|
|
126
|
+
(0, react_1.useEffect)(() => {
|
|
127
|
+
if (!validTabs || !selectedEntityId)
|
|
128
|
+
return;
|
|
129
|
+
const urlTab = getParam('tab');
|
|
130
|
+
if (urlTab && !validTabs.includes(urlTab)) {
|
|
131
|
+
console.warn(`Invalid tab '${urlTab}', resetting to '${defaultTab}'`);
|
|
132
|
+
setParams({ tab: defaultTab });
|
|
133
|
+
}
|
|
134
|
+
else if (!urlTab && defaultTab) {
|
|
135
|
+
setParams({ tab: defaultTab });
|
|
136
|
+
}
|
|
137
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
138
|
+
}, [selectedEntityId, validTabs, defaultTab, getParam('tab')]);
|
|
139
|
+
return {
|
|
140
|
+
navigateToEntity,
|
|
141
|
+
isValidEntity,
|
|
142
|
+
shouldAutoSelect,
|
|
143
|
+
...(validTabs && {
|
|
144
|
+
activeTab,
|
|
145
|
+
setActiveTab,
|
|
146
|
+
isValidTab,
|
|
147
|
+
}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=useEntityNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEntityNavigation.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useEntityNavigation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function useQueryParams(): {
|
|
2
|
+
getParam: (key: string) => string | null;
|
|
3
|
+
setParam: (key: string, value: string | null, replace?: boolean) => void;
|
|
4
|
+
setParams: (updates: Record<string, string | null>, replace?: boolean) => void;
|
|
5
|
+
searchParams: URLSearchParams;
|
|
6
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useQueryParams = useQueryParams;
|
|
4
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
function useQueryParams() {
|
|
7
|
+
const [searchParams, setSearchParams] = (0, react_router_dom_1.useSearchParams)();
|
|
8
|
+
const getParam = (0, react_1.useCallback)((key) => {
|
|
9
|
+
return searchParams.get(key);
|
|
10
|
+
}, [searchParams]);
|
|
11
|
+
const setParam = (0, react_1.useCallback)((key, value, replace) => {
|
|
12
|
+
setSearchParams(prev => {
|
|
13
|
+
const next = new URLSearchParams(prev);
|
|
14
|
+
if (value === null || value === undefined) {
|
|
15
|
+
next.delete(key);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
next.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
return next;
|
|
21
|
+
}, { replace });
|
|
22
|
+
}, [setSearchParams]);
|
|
23
|
+
const setParams = (0, react_1.useCallback)((updates, replace) => {
|
|
24
|
+
setSearchParams(prev => {
|
|
25
|
+
const next = new URLSearchParams(prev);
|
|
26
|
+
Object.entries(updates).forEach(([key, value]) => {
|
|
27
|
+
if (value === null || value === undefined) {
|
|
28
|
+
next.delete(key);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
next.set(key, value);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return next;
|
|
35
|
+
}, { replace });
|
|
36
|
+
}, [setSearchParams]);
|
|
37
|
+
return { getParam, setParam, setParams, searchParams };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=useQueryParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQueryParams.js","sourceRoot":"","sources":["../../../../src/ui/hooks/useQueryParams.ts"],"names":[],"mappings":";;AAGA,wCAkCC;AArCD,uDAAmD;AACnD,iCAAoC;AAEpC,SAAgB,cAAc;IAC5B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,kCAAe,GAAE,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,CAAC,GAAW,EAAiB,EAAE;QAC1D,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,CAAC,GAAW,EAAE,KAAoB,EAAE,OAAiB,EAAE,EAAE;QACpF,eAAe,CAAC,IAAI,CAAC,EAAE;YACrB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,CAAC,OAAsC,EAAE,OAAiB,EAAE,EAAE;QAC1F,eAAe,CAAC,IAAI,CAAC,EAAE;YACrB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC/C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC"}
|
package/dist/src/ui/index.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const client_1 = require("react-dom/client");
|
|
9
|
+
const react_router_dom_1 = require("react-router-dom");
|
|
9
10
|
const App_1 = __importDefault(require("./components/App"));
|
|
10
11
|
require("./styles.css");
|
|
11
12
|
// Find the root element
|
|
@@ -15,6 +16,6 @@ if (!rootElement) {
|
|
|
15
16
|
}
|
|
16
17
|
// Create a React root
|
|
17
18
|
const root = (0, client_1.createRoot)(rootElement);
|
|
18
|
-
// Render the app
|
|
19
|
-
root.render((0, jsx_runtime_1.jsx)(react_1.default.StrictMode, { children: (0, jsx_runtime_1.jsx)(App_1.default, {}) }));
|
|
19
|
+
// Render the app with BrowserRouter
|
|
20
|
+
root.render((0, jsx_runtime_1.jsx)(react_1.default.StrictMode, { children: (0, jsx_runtime_1.jsx)(react_router_dom_1.BrowserRouter, { children: (0, jsx_runtime_1.jsx)(App_1.default, {}) }) }));
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist/src/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/index.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,6CAA8C;AAC9C,2DAAmC;AACnC,wBAAsB;AAEtB,wBAAwB;AACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAEpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC;AAED,sBAAsB;AACtB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAErC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/index.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,6CAA8C;AAC9C,uDAAiD;AACjD,2DAAmC;AACnC,wBAAsB;AAEtB,wBAAwB;AACxB,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAEpD,IAAI,CAAC,WAAW,EAAE,CAAC;IACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;AACjD,CAAC;AAED,sBAAsB;AACtB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAErC,oCAAoC;AACpC,IAAI,CAAC,MAAM,CACT,uBAAC,eAAK,CAAC,UAAU,cACf,uBAAC,gCAAa,cACZ,uBAAC,aAAG,KAAG,GACO,GACC,CACpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optimizely/ocp-local-env",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.7",
|
|
4
4
|
"description": "Local testing environment for Optimizely Connect Platform (OCP) applications",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"types": "dist/src/index.d.ts",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"open": "^8.4.2",
|
|
54
54
|
"react": ">=17.0.0",
|
|
55
55
|
"react-dom": ">=17.0.0",
|
|
56
|
+
"react-router-dom": "^6.28.0",
|
|
56
57
|
"uuid": "^9.0.0"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|