@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.
Files changed (119) hide show
  1. package/dist/package.json +2 -1
  2. package/dist/public/bundle.7a5338c67e783e9b42f7.js +3 -0
  3. package/dist/public/{bundle.932ab47a0dbf0319bc8b.js.LICENSE.txt → bundle.7a5338c67e783e9b42f7.js.LICENSE.txt} +33 -0
  4. package/dist/public/bundle.7a5338c67e783e9b42f7.js.map +1 -0
  5. package/dist/public/index.html +1 -1
  6. package/dist/src/executor/DestinationExecutor.js +10 -7
  7. package/dist/src/executor/DestinationExecutor.js.map +1 -1
  8. package/dist/src/executor/FunctionExecutor.js +1 -1
  9. package/dist/src/executor/FunctionExecutor.js.map +1 -1
  10. package/dist/src/executor/JobExecutor.js +1 -1
  11. package/dist/src/executor/JobExecutor.js.map +1 -1
  12. package/dist/src/executor/LifecycleExecutor.js +1 -1
  13. package/dist/src/executor/LifecycleExecutor.js.map +1 -1
  14. package/dist/src/executor/SourceExecutor.d.ts +32 -0
  15. package/dist/src/executor/SourceExecutor.js +161 -0
  16. package/dist/src/executor/SourceExecutor.js.map +1 -0
  17. package/dist/src/local_engine/LocalJobApi.d.ts +38 -0
  18. package/dist/src/local_engine/LocalJobApi.js +180 -0
  19. package/dist/src/local_engine/LocalJobApi.js.map +1 -0
  20. package/dist/src/local_engine/local-engine-child-base.d.ts +16 -0
  21. package/dist/src/local_engine/local-engine-child-base.js +201 -14
  22. package/dist/src/local_engine/local-engine-child-base.js.map +1 -1
  23. package/dist/src/local_engine/local-engine-client.d.ts +70 -1
  24. package/dist/src/local_engine/local-engine-client.js +545 -26
  25. package/dist/src/local_engine/local-engine-client.js.map +1 -1
  26. package/dist/src/local_engine/local-engine-types.d.ts +98 -2
  27. package/dist/src/local_engine/local-engine-unified.d.ts +18 -0
  28. package/dist/src/local_engine/local-engine-unified.js +227 -1
  29. package/dist/src/local_engine/local-engine-unified.js.map +1 -1
  30. package/dist/src/local_engine/local-engine-utils.js +34 -7
  31. package/dist/src/local_engine/local-engine-utils.js.map +1 -1
  32. package/dist/src/local_engine/localSDKConfig.js +237 -39
  33. package/dist/src/local_engine/localSDKConfig.js.map +1 -1
  34. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +18 -0
  35. package/dist/src/local_engine/storage/LocalConfigStore.js +52 -3
  36. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -1
  37. package/dist/src/local_engine/storage/LocalJobStore.d.ts +1 -0
  38. package/dist/src/local_engine/storage/LocalJobStore.js +12 -2
  39. package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -1
  40. package/dist/src/local_engine/storage/LocalKVStore.d.ts +1 -0
  41. package/dist/src/local_engine/storage/LocalKVStore.js +134 -75
  42. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -1
  43. package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +1 -0
  44. package/dist/src/local_engine/storage/LocalNotificationStore.js +17 -3
  45. package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -1
  46. package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +1 -0
  47. package/dist/src/local_engine/storage/LocalSecretsStore.js +37 -6
  48. package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -1
  49. package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +1 -0
  50. package/dist/src/local_engine/storage/LocalSettingsStore.js +61 -11
  51. package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -1
  52. package/dist/src/local_engine/storage/SourceDataStore.d.ts +23 -0
  53. package/dist/src/local_engine/storage/SourceDataStore.js +83 -0
  54. package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -0
  55. package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +25 -0
  56. package/dist/src/local_engine/storage/SourceJobExecutionStore.js +61 -0
  57. package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +1 -0
  58. package/dist/src/local_engine/utils.js +20 -4
  59. package/dist/src/local_engine/utils.js.map +1 -1
  60. package/dist/src/logging/LogManager.d.ts +191 -34
  61. package/dist/src/logging/LogManager.js +209 -103
  62. package/dist/src/logging/LogManager.js.map +1 -1
  63. package/dist/src/server/api/destinations.js +30 -6
  64. package/dist/src/server/api/destinations.js.map +1 -1
  65. package/dist/src/server/api/jobs.js +3 -0
  66. package/dist/src/server/api/jobs.js.map +1 -1
  67. package/dist/src/server/api/sources.d.ts +7 -0
  68. package/dist/src/server/api/sources.js +380 -0
  69. package/dist/src/server/api/sources.js.map +1 -0
  70. package/dist/src/server/api.js +64 -3
  71. package/dist/src/server/api.js.map +1 -1
  72. package/dist/src/server.js +203 -19
  73. package/dist/src/server.js.map +1 -1
  74. package/dist/src/ui/components/App.js +165 -21
  75. package/dist/src/ui/components/App.js.map +1 -1
  76. package/dist/src/ui/components/DestinationsView.d.ts +8 -0
  77. package/dist/src/ui/components/DestinationsView.js +30 -9
  78. package/dist/src/ui/components/DestinationsView.js.map +1 -1
  79. package/dist/src/ui/components/FunctionsView.d.ts +7 -0
  80. package/dist/src/ui/components/FunctionsView.js +69 -9
  81. package/dist/src/ui/components/FunctionsView.js.map +1 -1
  82. package/dist/src/ui/components/JobsView.d.ts +7 -0
  83. package/dist/src/ui/components/JobsView.js +55 -15
  84. package/dist/src/ui/components/JobsView.js.map +1 -1
  85. package/dist/src/ui/components/SourceDataViewer.d.ts +8 -0
  86. package/dist/src/ui/components/SourceDataViewer.js +84 -0
  87. package/dist/src/ui/components/SourceDataViewer.js.map +1 -0
  88. package/dist/src/ui/components/SourceJobsSection.d.ts +8 -0
  89. package/dist/src/ui/components/SourceJobsSection.js +99 -0
  90. package/dist/src/ui/components/SourceJobsSection.js.map +1 -0
  91. package/dist/src/ui/components/SourceLifecycleSection.d.ts +7 -0
  92. package/dist/src/ui/components/SourceLifecycleSection.js +58 -0
  93. package/dist/src/ui/components/SourceLifecycleSection.js.map +1 -0
  94. package/dist/src/ui/components/SourceSchemaViewer.d.ts +7 -0
  95. package/dist/src/ui/components/SourceSchemaViewer.js +65 -0
  96. package/dist/src/ui/components/SourceSchemaViewer.js.map +1 -0
  97. package/dist/src/ui/components/SourceWebhookEditor.d.ts +8 -0
  98. package/dist/src/ui/components/SourceWebhookEditor.js +168 -0
  99. package/dist/src/ui/components/SourceWebhookEditor.js.map +1 -0
  100. package/dist/src/ui/components/SourcesView.d.ts +14 -0
  101. package/dist/src/ui/components/SourcesView.js +74 -0
  102. package/dist/src/ui/components/SourcesView.js.map +1 -0
  103. package/dist/src/ui/components/TabbedConsole.d.ts +3 -1
  104. package/dist/src/ui/components/TabbedConsole.js +81 -11
  105. package/dist/src/ui/components/TabbedConsole.js.map +1 -1
  106. package/dist/src/ui/hooks/useEntityNavigation.d.ts +72 -0
  107. package/dist/src/ui/hooks/useEntityNavigation.js +150 -0
  108. package/dist/src/ui/hooks/useEntityNavigation.js.map +1 -0
  109. package/dist/src/ui/hooks/useQueryParams.d.ts +6 -0
  110. package/dist/src/ui/hooks/useQueryParams.js +39 -0
  111. package/dist/src/ui/hooks/useQueryParams.js.map +1 -0
  112. package/dist/src/ui/index.js +3 -2
  113. package/dist/src/ui/index.js.map +1 -1
  114. package/package.json +2 -1
  115. package/dist/public/bundle.932ab47a0dbf0319bc8b.js +0 -3
  116. package/dist/public/bundle.932ab47a0dbf0319bc8b.js.map +0 -1
  117. package/dist/src/server/api/lifecycle.d.ts +0 -6
  118. package/dist/src/server/api/lifecycle.js +0 -72
  119. 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: string[];
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 TabbedConsole = ({ logs, onClearLogs, storeTimestamps, onRefreshStores }) => {
10
- const [activeTab, setActiveTab] = (0, react_1.useState)('console');
11
- const [expanded, setExpanded] = (0, react_1.useState)(false);
12
- const [height, setHeight] = (0, react_1.useState)(200);
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
- return ((0, jsx_runtime_1.jsxs)("div", { className: "console-tab-content", children: [(0, jsx_runtime_1.jsx)("div", { className: "console-controls", children: (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: logs.length > 0 ? (logs.map((log, index) => {
23
- // Determine log level for styling
24
- const logLevel = log.includes(' ERROR:') ? 'error' :
25
- log.includes(' WARN:') ? 'warn' :
26
- log.includes(' DEBUG:') ? 'debug' : 'info';
27
- return ((0, jsx_runtime_1.jsx)("div", { className: `log-line log-${logLevel}`, children: log }, index));
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
- 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: () => setActiveTab('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: () => setActiveTab('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: () => setActiveTab('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: () => setActiveTab('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: () => setActiveTab('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: () => setActiveTab('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" })] }), (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() }) }))] }));
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":"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"}
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"}
@@ -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
@@ -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,iBAAiB;AACjB,IAAI,CAAC,MAAM,CACT,uBAAC,eAAK,CAAC,UAAU,cACf,uBAAC,aAAG,KAAG,GACU,CACpB,CAAC"}
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.6",
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": {