@optimizely/ocp-local-env 1.0.0-beta.4

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 (160) hide show
  1. package/README.md +165 -0
  2. package/dist/package.json +104 -0
  3. package/dist/public/bundle.da978bb5437cd82e6d37.js +3 -0
  4. package/dist/public/bundle.da978bb5437cd82e6d37.js.LICENSE.txt +49 -0
  5. package/dist/public/bundle.da978bb5437cd82e6d37.js.map +1 -0
  6. package/dist/public/index.html +1 -0
  7. package/dist/src/cli.d.ts +2 -0
  8. package/dist/src/cli.js +88 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/executor/FunctionExecutor.d.ts +56 -0
  11. package/dist/src/executor/FunctionExecutor.js +175 -0
  12. package/dist/src/executor/FunctionExecutor.js.map +1 -0
  13. package/dist/src/executor/JobExecutor.d.ts +60 -0
  14. package/dist/src/executor/JobExecutor.js +203 -0
  15. package/dist/src/executor/JobExecutor.js.map +1 -0
  16. package/dist/src/executor/LifecycleExecutor.d.ts +45 -0
  17. package/dist/src/executor/LifecycleExecutor.js +153 -0
  18. package/dist/src/executor/LifecycleExecutor.js.map +1 -0
  19. package/dist/src/executor/watcher.d.ts +63 -0
  20. package/dist/src/executor/watcher.js +213 -0
  21. package/dist/src/executor/watcher.js.map +1 -0
  22. package/dist/src/functions/hello.d.ts +4 -0
  23. package/dist/src/functions/hello.js +8 -0
  24. package/dist/src/functions/hello.js.map +1 -0
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +9 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/jobs/dailyJob.d.ts +4 -0
  29. package/dist/src/jobs/dailyJob.js +8 -0
  30. package/dist/src/jobs/dailyJob.js.map +1 -0
  31. package/dist/src/local_engine/LocalNotifier.d.ts +10 -0
  32. package/dist/src/local_engine/LocalNotifier.js +26 -0
  33. package/dist/src/local_engine/LocalNotifier.js.map +1 -0
  34. package/dist/src/local_engine/local-engine-child-base.d.ts +79 -0
  35. package/dist/src/local_engine/local-engine-child-base.js +304 -0
  36. package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
  37. package/dist/src/local_engine/local-engine-client.d.ts +80 -0
  38. package/dist/src/local_engine/local-engine-client.js +333 -0
  39. package/dist/src/local_engine/local-engine-client.js.map +1 -0
  40. package/dist/src/local_engine/local-engine-types.d.ts +132 -0
  41. package/dist/src/local_engine/local-engine-types.js +6 -0
  42. package/dist/src/local_engine/local-engine-types.js.map +1 -0
  43. package/dist/src/local_engine/local-engine-unified.d.ts +40 -0
  44. package/dist/src/local_engine/local-engine-unified.js +406 -0
  45. package/dist/src/local_engine/local-engine-unified.js.map +1 -0
  46. package/dist/src/local_engine/local-engine-utils.d.ts +70 -0
  47. package/dist/src/local_engine/local-engine-utils.js +192 -0
  48. package/dist/src/local_engine/local-engine-utils.js.map +1 -0
  49. package/dist/src/local_engine/localSDKConfig.d.ts +30 -0
  50. package/dist/src/local_engine/localSDKConfig.js +392 -0
  51. package/dist/src/local_engine/localSDKConfig.js.map +1 -0
  52. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +56 -0
  53. package/dist/src/local_engine/storage/LocalConfigStore.js +129 -0
  54. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
  55. package/dist/src/local_engine/storage/LocalJobStore.d.ts +110 -0
  56. package/dist/src/local_engine/storage/LocalJobStore.js +239 -0
  57. package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
  58. package/dist/src/local_engine/storage/LocalKVStore.d.ts +105 -0
  59. package/dist/src/local_engine/storage/LocalKVStore.js +1002 -0
  60. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
  61. package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +27 -0
  62. package/dist/src/local_engine/storage/LocalNotificationStore.js +125 -0
  63. package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
  64. package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +114 -0
  65. package/dist/src/local_engine/storage/LocalSecretsStore.js +319 -0
  66. package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
  67. package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +161 -0
  68. package/dist/src/local_engine/storage/LocalSettingsStore.js +417 -0
  69. package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
  70. package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
  71. package/dist/src/local_engine/storage/NumberSet.js +32 -0
  72. package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
  73. package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
  74. package/dist/src/local_engine/storage/StringSet.js +32 -0
  75. package/dist/src/local_engine/storage/StringSet.js.map +1 -0
  76. package/dist/src/local_engine/types.d.ts +52 -0
  77. package/dist/src/local_engine/types.js +6 -0
  78. package/dist/src/local_engine/types.js.map +1 -0
  79. package/dist/src/local_engine/utils.d.ts +31 -0
  80. package/dist/src/local_engine/utils.js +126 -0
  81. package/dist/src/local_engine/utils.js.map +1 -0
  82. package/dist/src/logging/LogManager.d.ts +89 -0
  83. package/dist/src/logging/LogManager.js +237 -0
  84. package/dist/src/logging/LogManager.js.map +1 -0
  85. package/dist/src/server/api/functions.d.ts +7 -0
  86. package/dist/src/server/api/functions.js +80 -0
  87. package/dist/src/server/api/functions.js.map +1 -0
  88. package/dist/src/server/api/jobs.d.ts +8 -0
  89. package/dist/src/server/api/jobs.js +242 -0
  90. package/dist/src/server/api/jobs.js.map +1 -0
  91. package/dist/src/server/api/lifecycle.d.ts +6 -0
  92. package/dist/src/server/api/lifecycle.js +73 -0
  93. package/dist/src/server/api/lifecycle.js.map +1 -0
  94. package/dist/src/server/api/settings.d.ts +6 -0
  95. package/dist/src/server/api/settings.js +117 -0
  96. package/dist/src/server/api/settings.js.map +1 -0
  97. package/dist/src/server/api/stores.d.ts +2 -0
  98. package/dist/src/server/api/stores.js +341 -0
  99. package/dist/src/server/api/stores.js.map +1 -0
  100. package/dist/src/server/api/v1.d.ts +10 -0
  101. package/dist/src/server/api/v1.js +711 -0
  102. package/dist/src/server/api/v1.js.map +1 -0
  103. package/dist/src/server/api.d.ts +8 -0
  104. package/dist/src/server/api.js +154 -0
  105. package/dist/src/server/api.js.map +1 -0
  106. package/dist/src/server/app-discovery.d.ts +5 -0
  107. package/dist/src/server/app-discovery.js +81 -0
  108. package/dist/src/server/app-discovery.js.map +1 -0
  109. package/dist/src/server/config.d.ts +21 -0
  110. package/dist/src/server/config.js +100 -0
  111. package/dist/src/server/config.js.map +1 -0
  112. package/dist/src/server/websocket.d.ts +0 -0
  113. package/dist/src/server/websocket.js +2 -0
  114. package/dist/src/server/websocket.js.map +1 -0
  115. package/dist/src/server.d.ts +2 -0
  116. package/dist/src/server.js +546 -0
  117. package/dist/src/server.js.map +1 -0
  118. package/dist/src/types/app.d.ts +155 -0
  119. package/dist/src/types/app.js +24 -0
  120. package/dist/src/types/app.js.map +1 -0
  121. package/dist/src/types/kvstore.d.ts +320 -0
  122. package/dist/src/types/kvstore.js +5 -0
  123. package/dist/src/types/kvstore.js.map +1 -0
  124. package/dist/src/ui/components/App.d.ts +6 -0
  125. package/dist/src/ui/components/App.js +255 -0
  126. package/dist/src/ui/components/App.js.map +1 -0
  127. package/dist/src/ui/components/FunctionsView.d.ts +6 -0
  128. package/dist/src/ui/components/FunctionsView.js +217 -0
  129. package/dist/src/ui/components/FunctionsView.js.map +1 -0
  130. package/dist/src/ui/components/JobsView.d.ts +6 -0
  131. package/dist/src/ui/components/JobsView.js +257 -0
  132. package/dist/src/ui/components/JobsView.js.map +1 -0
  133. package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
  134. package/dist/src/ui/components/KVStoreViewer.js +168 -0
  135. package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
  136. package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
  137. package/dist/src/ui/components/NotificationViewer.js +69 -0
  138. package/dist/src/ui/components/NotificationViewer.js.map +1 -0
  139. package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
  140. package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
  141. package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
  142. package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
  143. package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
  144. package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
  145. package/dist/src/ui/components/StoreViewer.d.ts +16 -0
  146. package/dist/src/ui/components/StoreViewer.js +86 -0
  147. package/dist/src/ui/components/StoreViewer.js.map +1 -0
  148. package/dist/src/ui/components/TabbedConsole.d.ts +15 -0
  149. package/dist/src/ui/components/TabbedConsole.js +93 -0
  150. package/dist/src/ui/components/TabbedConsole.js.map +1 -0
  151. package/dist/src/ui/components/common/DataTree.d.ts +15 -0
  152. package/dist/src/ui/components/common/DataTree.js +95 -0
  153. package/dist/src/ui/components/common/DataTree.js.map +1 -0
  154. package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
  155. package/dist/src/ui/components/common/EyeIcon.js +11 -0
  156. package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
  157. package/dist/src/ui/index.d.ts +1 -0
  158. package/dist/src/ui/index.js +20 -0
  159. package/dist/src/ui/index.js.map +1 -0
  160. package/package.json +104 -0
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createFunctionRoutes = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ /**
9
+ * Create API routes for function execution
10
+ */
11
+ function createFunctionRoutes(app, configStore) {
12
+ const router = express_1.default.Router();
13
+ // List all functions
14
+ router.get('/', (req, res) => {
15
+ const functions = app.manifest.functions || {};
16
+ const protocol = req.secure ? 'https' : 'http';
17
+ const host = req.get('host') || 'localhost:3000';
18
+ const result = Object.entries(functions).map(([id, func]) => {
19
+ let functionUrl = '';
20
+ if (configStore && configStore.isInstalled()) {
21
+ if (func.global) {
22
+ // Global functions don't have GUID in the URL
23
+ functionUrl = `${protocol}://${host}/functions/${app.manifest.meta.app_id}/${id}`;
24
+ }
25
+ else {
26
+ // Non-global functions have GUID in the URL
27
+ const guid = configStore.getFunctionGuid(id);
28
+ functionUrl = `${protocol}://${host}/functions/${app.manifest.meta.app_id}/${id}/${guid}`;
29
+ }
30
+ }
31
+ return {
32
+ id,
33
+ entry_point: func.entry_point,
34
+ description: func.description,
35
+ global: func.global || false,
36
+ url: functionUrl
37
+ };
38
+ });
39
+ res.json(result);
40
+ });
41
+ // Get function details
42
+ router.get('/:functionId', (req, res) => {
43
+ const { functionId } = req.params;
44
+ const functions = app.manifest.functions || {};
45
+ if (!functions[functionId]) {
46
+ return res.status(404).json({
47
+ error: `Function '${functionId}' not found`
48
+ });
49
+ }
50
+ res.json({
51
+ id: functionId,
52
+ ...functions[functionId]
53
+ });
54
+ });
55
+ // Execute function
56
+ router.post('/:functionId/execute', async (req, res) => {
57
+ const { functionId } = req.params;
58
+ const payload = req.body;
59
+ const functions = app.manifest.functions || {};
60
+ if (!functions[functionId]) {
61
+ return res.status(404).json({
62
+ error: `Function '${functionId}' not found`
63
+ });
64
+ }
65
+ // For now, just return a placeholder response
66
+ // This will be replaced with actual code execution later
67
+ res.json({
68
+ result: `Function '${functionId}' executed (placeholder)`,
69
+ input: payload,
70
+ logs: [
71
+ `Function ${functionId} execution started`,
72
+ `Function ${functionId} execution completed`
73
+ ],
74
+ executionTime: 0
75
+ });
76
+ });
77
+ return router;
78
+ }
79
+ exports.createFunctionRoutes = createFunctionRoutes;
80
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../../src/server/api/functions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import express from 'express';
2
+ import { App } from '../../types/app';
3
+ import { LocalSettingsStore } from '../../local_engine/storage/LocalSettingsStore';
4
+ import { LocalConfigStore } from '../../local_engine/storage/LocalConfigStore';
5
+ /**
6
+ * Create API routes for job execution
7
+ */
8
+ export declare function createJobRoutes(app: App, settingsStore: LocalSettingsStore, configStore: LocalConfigStore, appDir: string): express.Router;
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createJobRoutes = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const JobExecutor_1 = require("../../executor/JobExecutor");
9
+ const LocalJobStore_1 = require("../../local_engine/storage/LocalJobStore");
10
+ /**
11
+ * Create API routes for job execution
12
+ */
13
+ function createJobRoutes(app, settingsStore, configStore, appDir) {
14
+ const router = express_1.default.Router();
15
+ const jobExecutor = new JobExecutor_1.JobExecutor(appDir, app);
16
+ const jobStore = LocalJobStore_1.LocalJobStore.getInstance(appDir);
17
+ /**
18
+ * GET /jobs - List all jobs from app manifest
19
+ */
20
+ router.get('/', (req, res) => {
21
+ try {
22
+ const jobs = jobExecutor.getJobs();
23
+ res.json({
24
+ success: true,
25
+ jobs: jobs.map(job => ({
26
+ ...job,
27
+ validation: jobExecutor.validateJob(job.id)
28
+ }))
29
+ });
30
+ }
31
+ catch (error) {
32
+ res.status(500).json({
33
+ success: false,
34
+ error: {
35
+ message: error.message,
36
+ stack: error.stack
37
+ }
38
+ });
39
+ }
40
+ });
41
+ /**
42
+ * GET /jobs/executions - List recent job executions
43
+ */
44
+ router.get('/executions', (req, res) => {
45
+ try {
46
+ const jobId = req.query.jobId;
47
+ const limit = parseInt(req.query.limit) || 50;
48
+ let executions = jobExecutor.getExecutions(jobId);
49
+ // Limit results
50
+ if (limit > 0) {
51
+ executions = executions.slice(0, limit);
52
+ }
53
+ res.json({
54
+ success: true,
55
+ executions,
56
+ stats: jobExecutor.getStats()
57
+ });
58
+ }
59
+ catch (error) {
60
+ res.status(500).json({
61
+ success: false,
62
+ error: {
63
+ message: error.message,
64
+ stack: error.stack
65
+ }
66
+ });
67
+ }
68
+ });
69
+ /**
70
+ * GET /jobs/executions/:executionId - Get specific execution details
71
+ */
72
+ router.get('/executions/:executionId', (req, res) => {
73
+ try {
74
+ const { executionId } = req.params;
75
+ const execution = jobExecutor.getExecution(executionId);
76
+ if (!execution) {
77
+ return res.status(404).json({
78
+ success: false,
79
+ error: {
80
+ message: `Execution not found: ${executionId}`
81
+ }
82
+ });
83
+ }
84
+ res.json({
85
+ success: true,
86
+ execution
87
+ });
88
+ }
89
+ catch (error) {
90
+ res.status(500).json({
91
+ success: false,
92
+ error: {
93
+ message: error.message,
94
+ stack: error.stack
95
+ }
96
+ });
97
+ }
98
+ });
99
+ /**
100
+ * GET /jobs/executions/:executionId/states - Get execution state history
101
+ */
102
+ router.get('/executions/:executionId/states', (req, res) => {
103
+ try {
104
+ const { executionId } = req.params;
105
+ const states = jobExecutor.getExecutionStates(executionId);
106
+ res.json({
107
+ success: true,
108
+ states
109
+ });
110
+ }
111
+ catch (error) {
112
+ res.status(500).json({
113
+ success: false,
114
+ error: {
115
+ message: error.message,
116
+ stack: error.stack
117
+ }
118
+ });
119
+ }
120
+ });
121
+ /**
122
+ * POST /jobs/:jobId/start - Start job execution
123
+ */
124
+ router.post('/:jobId/start', async (req, res) => {
125
+ try {
126
+ const { jobId } = req.params;
127
+ const { parameters, dataSyncId, sourceKey } = req.body;
128
+ // Validate job exists
129
+ const jobs = jobExecutor.getJobs();
130
+ const jobDef = jobs.find(j => j.id === jobId);
131
+ if (!jobDef) {
132
+ return res.status(404).json({
133
+ success: false,
134
+ error: {
135
+ message: `Job not found: ${jobId}`
136
+ }
137
+ });
138
+ }
139
+ // Validate job is built
140
+ const validation = jobExecutor.validateJob(jobId);
141
+ if (!validation.valid) {
142
+ return res.status(400).json({
143
+ success: false,
144
+ error: {
145
+ message: validation.error
146
+ }
147
+ });
148
+ }
149
+ // Create execution request
150
+ const request = {
151
+ jobId,
152
+ parameters: parameters || {},
153
+ dataSyncId,
154
+ sourceKey
155
+ };
156
+ // Execute job asynchronously
157
+ const response = await jobExecutor.executeJob(request);
158
+ res.json({
159
+ success: response.success,
160
+ execution: {
161
+ id: response.executionId,
162
+ status: response.status,
163
+ startedAt: response.startedAt,
164
+ completedAt: response.completedAt,
165
+ executionTime: response.executionTime,
166
+ stateCount: response.stateCount
167
+ },
168
+ error: response.error
169
+ });
170
+ }
171
+ catch (error) {
172
+ res.status(500).json({
173
+ success: false,
174
+ error: {
175
+ message: error.message,
176
+ stack: error.stack
177
+ }
178
+ });
179
+ }
180
+ });
181
+ /**
182
+ * GET /jobs/:jobId - Get specific job definition
183
+ */
184
+ router.get('/:jobId', (req, res) => {
185
+ try {
186
+ const { jobId } = req.params;
187
+ const jobs = jobExecutor.getJobs();
188
+ const job = jobs.find(j => j.id === jobId);
189
+ if (!job) {
190
+ return res.status(404).json({
191
+ success: false,
192
+ error: {
193
+ message: `Job not found: ${jobId}`
194
+ }
195
+ });
196
+ }
197
+ const validation = jobExecutor.validateJob(jobId);
198
+ const executions = jobExecutor.getExecutions(jobId);
199
+ res.json({
200
+ success: true,
201
+ job: {
202
+ ...job,
203
+ validation
204
+ },
205
+ recentExecutions: executions.slice(0, 10) // Last 10 executions
206
+ });
207
+ }
208
+ catch (error) {
209
+ res.status(500).json({
210
+ success: false,
211
+ error: {
212
+ message: error.message,
213
+ stack: error.stack
214
+ }
215
+ });
216
+ }
217
+ });
218
+ /**
219
+ * POST /jobs/cleanup - Clean up old executions
220
+ */
221
+ router.post('/cleanup', (req, res) => {
222
+ try {
223
+ jobExecutor.cleanup();
224
+ res.json({
225
+ success: true,
226
+ message: 'Job execution cleanup completed'
227
+ });
228
+ }
229
+ catch (error) {
230
+ res.status(500).json({
231
+ success: false,
232
+ error: {
233
+ message: error.message,
234
+ stack: error.stack
235
+ }
236
+ });
237
+ }
238
+ });
239
+ return router;
240
+ }
241
+ exports.createJobRoutes = createJobRoutes;
242
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../../src/server/api/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import express from 'express';
2
+ import { App } from '../../types/app';
3
+ /**
4
+ * Create API routes for lifecycle hooks
5
+ */
6
+ export declare function createLifecycleRoutes(app: App): express.Router;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createLifecycleRoutes = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const app_1 = require("../../types/app");
9
+ /**
10
+ * Create API routes for lifecycle hooks
11
+ */
12
+ function createLifecycleRoutes(app) {
13
+ const router = express_1.default.Router();
14
+ // Get lifecycle status
15
+ router.get('/status', (req, res) => {
16
+ res.json({
17
+ hasLifecycleClass: true,
18
+ hooks: [
19
+ { type: app_1.LifecycleHookType.INSTALL, available: true },
20
+ { type: app_1.LifecycleHookType.UNINSTALL, available: true },
21
+ { type: app_1.LifecycleHookType.UPGRADE, available: true }
22
+ ]
23
+ });
24
+ });
25
+ // Execute install hook
26
+ router.post('/install', async (req, res) => {
27
+ const settings = req.body.settings || {};
28
+ // For now, just return a placeholder response
29
+ // This will be replaced with actual code execution later
30
+ res.json({
31
+ success: true,
32
+ settings,
33
+ logs: [
34
+ 'Install lifecycle hook started',
35
+ 'Install lifecycle hook completed'
36
+ ],
37
+ executionTime: 0
38
+ });
39
+ });
40
+ // Execute uninstall hook
41
+ router.post('/uninstall', async (req, res) => {
42
+ // For now, just return a placeholder response
43
+ // This will be replaced with actual code execution later
44
+ res.json({
45
+ success: true,
46
+ logs: [
47
+ 'Uninstall lifecycle hook started',
48
+ 'Uninstall lifecycle hook completed'
49
+ ],
50
+ executionTime: 0
51
+ });
52
+ });
53
+ // Execute upgrade hook
54
+ router.post('/upgrade', async (req, res) => {
55
+ const previousVersion = req.body.previousVersion || '0.0.0';
56
+ const settings = req.body.settings || {};
57
+ // For now, just return a placeholder response
58
+ // This will be replaced with actual code execution later
59
+ res.json({
60
+ success: true,
61
+ previousVersion,
62
+ settings,
63
+ logs: [
64
+ 'Upgrade lifecycle hook started',
65
+ 'Upgrade lifecycle hook completed'
66
+ ],
67
+ executionTime: 0
68
+ });
69
+ });
70
+ return router;
71
+ }
72
+ exports.createLifecycleRoutes = createLifecycleRoutes;
73
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../../src/server/api/lifecycle.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA8B;AAC9B,yCAAyD;AAEzD;;GAEG;AACH,SAAgB,qBAAqB,CAAC,GAAQ;IAC5C,MAAM,MAAM,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,uBAAuB;IACvB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACjC,GAAG,CAAC,IAAI,CAAC;YACP,iBAAiB,EAAE,IAAI;YACvB,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,uBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;gBACpD,EAAE,IAAI,EAAE,uBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;gBACtD,EAAE,IAAI,EAAE,uBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;aACrD;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEzC,8CAA8C;QAC9C,yDAAyD;QACzD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,IAAI,EAAE;gBACJ,gCAAgC;gBAChC,kCAAkC;aACnC;YACD,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,8CAA8C;QAC9C,yDAAyD;QACzD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,kCAAkC;gBAClC,oCAAoC;aACrC;YACD,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,eAAe,GAAG,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QAEzC,8CAA8C;QAC9C,yDAAyD;QACzD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,IAAI;YACb,eAAe;YACf,QAAQ;YACR,IAAI,EAAE;gBACJ,gCAAgC;gBAChC,kCAAkC;aACnC;YACD,aAAa,EAAE,CAAC;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAlED,sDAkEC"}
@@ -0,0 +1,6 @@
1
+ import express from 'express';
2
+ import { App } from '../../types/app';
3
+ /**
4
+ * Create API routes for settings management
5
+ */
6
+ export declare function createSettingsRoutes(app: App): express.Router;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createSettingsRoutes = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ // Store settings in memory for simplicity in this implementation
11
+ // In a real implementation, this would use a proper storage system
12
+ let currentSettings = {};
13
+ /**
14
+ * Create API routes for settings management
15
+ */
16
+ function createSettingsRoutes(app) {
17
+ const router = express_1.default.Router();
18
+ // Get a specific setting
19
+ router.get('/:key', (req, res) => {
20
+ const { key } = req.params;
21
+ if (currentSettings[key] === undefined) {
22
+ return res.status(404).json({
23
+ success: false,
24
+ error: `Setting '${key}' not found`
25
+ });
26
+ }
27
+ res.json({
28
+ success: true,
29
+ key,
30
+ value: currentSettings[key]
31
+ });
32
+ });
33
+ // Reset settings to default
34
+ router.post('/reset', (req, res) => {
35
+ // Reset to empty settings
36
+ currentSettings = {};
37
+ // Save empty settings to file
38
+ saveSettingsToFile(app.path, {});
39
+ res.json({
40
+ success: true,
41
+ settings: {}
42
+ });
43
+ });
44
+ // Initialize settings from file if it exists
45
+ try {
46
+ const savedSettings = loadSettingsFromFile(app.path);
47
+ if (savedSettings) {
48
+ currentSettings = savedSettings;
49
+ }
50
+ }
51
+ catch (error) {
52
+ console.error('Error loading settings from file:', error);
53
+ }
54
+ return router;
55
+ }
56
+ exports.createSettingsRoutes = createSettingsRoutes;
57
+ /**
58
+ * Validate settings against schema
59
+ */
60
+ function validateSettings(settings, schema) {
61
+ const errors = [];
62
+ // Check required fields
63
+ if (schema.required) {
64
+ for (const requiredField of schema.required) {
65
+ if (settings[requiredField] === undefined) {
66
+ errors.push(`Missing required field: ${requiredField}`);
67
+ }
68
+ }
69
+ }
70
+ // Check that all settings are defined in schema
71
+ for (const [key, value] of Object.entries(settings)) {
72
+ if (!schema.properties[key]) {
73
+ errors.push(`Unknown setting: ${key}`);
74
+ }
75
+ // Basic type checking could be added here
76
+ // For simplicity, we're skipping it in this implementation
77
+ }
78
+ return {
79
+ valid: errors.length === 0,
80
+ errors: errors.length > 0 ? errors : undefined
81
+ };
82
+ }
83
+ /**
84
+ * Save settings to a file
85
+ */
86
+ function saveSettingsToFile(appPath, settings) {
87
+ try {
88
+ const settingsDir = path_1.default.join(appPath, '.ocp-local');
89
+ // Create directory if it doesn't exist
90
+ if (!fs_1.default.existsSync(settingsDir)) {
91
+ fs_1.default.mkdirSync(settingsDir, { recursive: true });
92
+ }
93
+ const settingsPath = path_1.default.join(settingsDir, 'settings.json');
94
+ fs_1.default.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
95
+ }
96
+ catch (error) {
97
+ console.error('Error saving settings to file:', error);
98
+ }
99
+ }
100
+ /**
101
+ * Load settings from a file
102
+ */
103
+ function loadSettingsFromFile(appPath) {
104
+ const settingsPath = path_1.default.join(appPath, '.ocp-local', 'settings.json');
105
+ if (!fs_1.default.existsSync(settingsPath)) {
106
+ return null;
107
+ }
108
+ try {
109
+ const settingsContent = fs_1.default.readFileSync(settingsPath, 'utf8');
110
+ return JSON.parse(settingsContent);
111
+ }
112
+ catch (error) {
113
+ console.error('Error loading settings from file:', error);
114
+ return null;
115
+ }
116
+ }
117
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../src/server/api/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;