@codefluss/sandbox 0.0.1-alpha.1

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 (233) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +413 -0
  3. package/dist/__tests__/auto-resize-script.test.d.ts +2 -0
  4. package/dist/__tests__/auto-resize-script.test.d.ts.map +1 -0
  5. package/dist/__tests__/auto-resize-script.test.js +49 -0
  6. package/dist/__tests__/auto-resize-script.test.js.map +1 -0
  7. package/dist/__tests__/sandbox-component.test.d.ts +2 -0
  8. package/dist/__tests__/sandbox-component.test.d.ts.map +1 -0
  9. package/dist/__tests__/sandbox-component.test.js +281 -0
  10. package/dist/__tests__/sandbox-component.test.js.map +1 -0
  11. package/dist/__tests__/sandbox-config.test.d.ts +2 -0
  12. package/dist/__tests__/sandbox-config.test.d.ts.map +1 -0
  13. package/dist/__tests__/sandbox-config.test.js +148 -0
  14. package/dist/__tests__/sandbox-config.test.js.map +1 -0
  15. package/dist/__tests__/sandbox-iframe.test.d.ts +2 -0
  16. package/dist/__tests__/sandbox-iframe.test.d.ts.map +1 -0
  17. package/dist/__tests__/sandbox-iframe.test.js +212 -0
  18. package/dist/__tests__/sandbox-iframe.test.js.map +1 -0
  19. package/dist/__tests__/setup.d.ts +2 -0
  20. package/dist/__tests__/setup.d.ts.map +1 -0
  21. package/dist/__tests__/setup.js +27 -0
  22. package/dist/__tests__/setup.js.map +1 -0
  23. package/dist/components/index.d.ts +5 -0
  24. package/dist/components/index.d.ts.map +1 -0
  25. package/dist/components/index.js +5 -0
  26. package/dist/components/index.js.map +1 -0
  27. package/dist/components/performance-wrapper.d.ts +12 -0
  28. package/dist/components/performance-wrapper.d.ts.map +1 -0
  29. package/dist/components/performance-wrapper.js +162 -0
  30. package/dist/components/performance-wrapper.js.map +1 -0
  31. package/dist/components/sandbox-component.d.ts +3 -0
  32. package/dist/components/sandbox-component.d.ts.map +1 -0
  33. package/dist/components/sandbox-component.js +123 -0
  34. package/dist/components/sandbox-component.js.map +1 -0
  35. package/dist/components/sandbox-iframe-cached.d.ts +3 -0
  36. package/dist/components/sandbox-iframe-cached.d.ts.map +1 -0
  37. package/dist/components/sandbox-iframe-cached.js +176 -0
  38. package/dist/components/sandbox-iframe-cached.js.map +1 -0
  39. package/dist/components/sandbox-iframe.d.ts +3 -0
  40. package/dist/components/sandbox-iframe.d.ts.map +1 -0
  41. package/dist/components/sandbox-iframe.js +131 -0
  42. package/dist/components/sandbox-iframe.js.map +1 -0
  43. package/dist/converters/auto-detect/auto-detect.d.ts +13 -0
  44. package/dist/converters/auto-detect/auto-detect.d.ts.map +1 -0
  45. package/dist/converters/auto-detect/auto-detect.js +224 -0
  46. package/dist/converters/auto-detect/auto-detect.js.map +1 -0
  47. package/dist/converters/auto-detect/index.d.ts +3 -0
  48. package/dist/converters/auto-detect/index.d.ts.map +1 -0
  49. package/dist/converters/auto-detect/index.js +2 -0
  50. package/dist/converters/auto-detect/index.js.map +1 -0
  51. package/dist/converters/codepen/codepen-converter.d.ts +9 -0
  52. package/dist/converters/codepen/codepen-converter.d.ts.map +1 -0
  53. package/dist/converters/codepen/codepen-converter.js +99 -0
  54. package/dist/converters/codepen/codepen-converter.js.map +1 -0
  55. package/dist/converters/codepen/index.d.ts +2 -0
  56. package/dist/converters/codepen/index.d.ts.map +1 -0
  57. package/dist/converters/codepen/index.js +2 -0
  58. package/dist/converters/codepen/index.js.map +1 -0
  59. package/dist/converters/gist/gist-converter.d.ts +31 -0
  60. package/dist/converters/gist/gist-converter.d.ts.map +1 -0
  61. package/dist/converters/gist/gist-converter.js +162 -0
  62. package/dist/converters/gist/gist-converter.js.map +1 -0
  63. package/dist/converters/gist/index.d.ts +2 -0
  64. package/dist/converters/gist/index.d.ts.map +1 -0
  65. package/dist/converters/gist/index.js +2 -0
  66. package/dist/converters/gist/index.js.map +1 -0
  67. package/dist/converters/shared/html-parser.d.ts +4 -0
  68. package/dist/converters/shared/html-parser.d.ts.map +1 -0
  69. package/dist/converters/shared/html-parser.js +39 -0
  70. package/dist/converters/shared/html-parser.js.map +1 -0
  71. package/dist/converters/shared/index.d.ts +4 -0
  72. package/dist/converters/shared/index.d.ts.map +1 -0
  73. package/dist/converters/shared/index.js +3 -0
  74. package/dist/converters/shared/index.js.map +1 -0
  75. package/dist/converters/shared/sanitization.d.ts +5 -0
  76. package/dist/converters/shared/sanitization.d.ts.map +1 -0
  77. package/dist/converters/shared/sanitization.js +176 -0
  78. package/dist/converters/shared/sanitization.js.map +1 -0
  79. package/dist/converters/shared/types.d.ts +23 -0
  80. package/dist/converters/shared/types.d.ts.map +1 -0
  81. package/dist/converters/shared/types.js +2 -0
  82. package/dist/converters/shared/types.js.map +1 -0
  83. package/dist/core/index.d.ts +13 -0
  84. package/dist/core/index.d.ts.map +1 -0
  85. package/dist/core/index.js +10 -0
  86. package/dist/core/index.js.map +1 -0
  87. package/dist/frameworks/__tests__/file-utils.test.d.ts +2 -0
  88. package/dist/frameworks/__tests__/file-utils.test.d.ts.map +1 -0
  89. package/dist/frameworks/__tests__/file-utils.test.js +408 -0
  90. package/dist/frameworks/__tests__/file-utils.test.js.map +1 -0
  91. package/dist/frameworks/__tests__/sandpack-wrapper.test.d.ts +2 -0
  92. package/dist/frameworks/__tests__/sandpack-wrapper.test.d.ts.map +1 -0
  93. package/dist/frameworks/__tests__/sandpack-wrapper.test.js +147 -0
  94. package/dist/frameworks/__tests__/sandpack-wrapper.test.js.map +1 -0
  95. package/dist/frameworks/file-utils.d.ts +20 -0
  96. package/dist/frameworks/file-utils.d.ts.map +1 -0
  97. package/dist/frameworks/file-utils.js +293 -0
  98. package/dist/frameworks/file-utils.js.map +1 -0
  99. package/dist/frameworks/framework-detector.d.ts +5 -0
  100. package/dist/frameworks/framework-detector.d.ts.map +1 -0
  101. package/dist/frameworks/framework-detector.js +117 -0
  102. package/dist/frameworks/framework-detector.js.map +1 -0
  103. package/dist/frameworks/index.d.ts +6 -0
  104. package/dist/frameworks/index.d.ts.map +1 -0
  105. package/dist/frameworks/index.js +5 -0
  106. package/dist/frameworks/index.js.map +1 -0
  107. package/dist/frameworks/sandpack-wrapper.d.ts +28 -0
  108. package/dist/frameworks/sandpack-wrapper.d.ts.map +1 -0
  109. package/dist/frameworks/sandpack-wrapper.js +55 -0
  110. package/dist/frameworks/sandpack-wrapper.js.map +1 -0
  111. package/dist/frameworks/templates/index.d.ts +8 -0
  112. package/dist/frameworks/templates/index.d.ts.map +1 -0
  113. package/dist/frameworks/templates/index.js +29 -0
  114. package/dist/frameworks/templates/index.js.map +1 -0
  115. package/dist/frameworks/templates/react-template.d.ts +3 -0
  116. package/dist/frameworks/templates/react-template.d.ts.map +1 -0
  117. package/dist/frameworks/templates/react-template.js +376 -0
  118. package/dist/frameworks/templates/react-template.js.map +1 -0
  119. package/dist/frameworks/templates/svelte-template.d.ts +3 -0
  120. package/dist/frameworks/templates/svelte-template.d.ts.map +1 -0
  121. package/dist/frameworks/templates/svelte-template.js +373 -0
  122. package/dist/frameworks/templates/svelte-template.js.map +1 -0
  123. package/dist/frameworks/templates/vanilla-template.d.ts +3 -0
  124. package/dist/frameworks/templates/vanilla-template.d.ts.map +1 -0
  125. package/dist/frameworks/templates/vanilla-template.js +455 -0
  126. package/dist/frameworks/templates/vanilla-template.js.map +1 -0
  127. package/dist/frameworks/templates/vue-template.d.ts +3 -0
  128. package/dist/frameworks/templates/vue-template.d.ts.map +1 -0
  129. package/dist/frameworks/templates/vue-template.js +388 -0
  130. package/dist/frameworks/templates/vue-template.js.map +1 -0
  131. package/dist/frameworks/types.d.ts +57 -0
  132. package/dist/frameworks/types.d.ts.map +1 -0
  133. package/dist/frameworks/types.js +2 -0
  134. package/dist/frameworks/types.js.map +1 -0
  135. package/dist/index.d.ts +7 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +7 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/lib/performance-tracker.d.ts +45 -0
  140. package/dist/lib/performance-tracker.d.ts.map +1 -0
  141. package/dist/lib/performance-tracker.js +165 -0
  142. package/dist/lib/performance-tracker.js.map +1 -0
  143. package/dist/lib/sandbox-cache.d.ts +24 -0
  144. package/dist/lib/sandbox-cache.d.ts.map +1 -0
  145. package/dist/lib/sandbox-cache.js +138 -0
  146. package/dist/lib/sandbox-cache.js.map +1 -0
  147. package/dist/locales/de.json +72 -0
  148. package/dist/locales/en.json +72 -0
  149. package/dist/locales/index.d.ts +148 -0
  150. package/dist/locales/index.d.ts.map +1 -0
  151. package/dist/locales/index.js +7 -0
  152. package/dist/locales/index.js.map +1 -0
  153. package/dist/performance/sandpack-bundle-cache.d.ts +19 -0
  154. package/dist/performance/sandpack-bundle-cache.d.ts.map +1 -0
  155. package/dist/performance/sandpack-bundle-cache.js +48 -0
  156. package/dist/performance/sandpack-bundle-cache.js.map +1 -0
  157. package/dist/sandbox-config.d.ts +4 -0
  158. package/dist/sandbox-config.d.ts.map +1 -0
  159. package/dist/sandbox-config.js +235 -0
  160. package/dist/sandbox-config.js.map +1 -0
  161. package/dist/storage/__tests__/indexeddb-adapter.test.d.ts +2 -0
  162. package/dist/storage/__tests__/indexeddb-adapter.test.d.ts.map +1 -0
  163. package/dist/storage/__tests__/indexeddb-adapter.test.js +192 -0
  164. package/dist/storage/__tests__/indexeddb-adapter.test.js.map +1 -0
  165. package/dist/storage/__tests__/project-manager.test.d.ts +2 -0
  166. package/dist/storage/__tests__/project-manager.test.d.ts.map +1 -0
  167. package/dist/storage/__tests__/project-manager.test.js +266 -0
  168. package/dist/storage/__tests__/project-manager.test.js.map +1 -0
  169. package/dist/storage/index.d.ts +5 -0
  170. package/dist/storage/index.d.ts.map +1 -0
  171. package/dist/storage/index.js +4 -0
  172. package/dist/storage/index.js.map +1 -0
  173. package/dist/storage/indexeddb-adapter.d.ts +18 -0
  174. package/dist/storage/indexeddb-adapter.d.ts.map +1 -0
  175. package/dist/storage/indexeddb-adapter.js +232 -0
  176. package/dist/storage/indexeddb-adapter.js.map +1 -0
  177. package/dist/storage/project-manager.d.ts +35 -0
  178. package/dist/storage/project-manager.d.ts.map +1 -0
  179. package/dist/storage/project-manager.js +213 -0
  180. package/dist/storage/project-manager.js.map +1 -0
  181. package/dist/storage/types.d.ts +59 -0
  182. package/dist/storage/types.d.ts.map +1 -0
  183. package/dist/storage/types.js +2 -0
  184. package/dist/storage/types.js.map +1 -0
  185. package/dist/storage/zip-handler.d.ts +5 -0
  186. package/dist/storage/zip-handler.d.ts.map +1 -0
  187. package/dist/storage/zip-handler.js +200 -0
  188. package/dist/storage/zip-handler.js.map +1 -0
  189. package/dist/types/sandbox-types.d.ts +54 -0
  190. package/dist/types/sandbox-types.d.ts.map +1 -0
  191. package/dist/types/sandbox-types.js +2 -0
  192. package/dist/types/sandbox-types.js.map +1 -0
  193. package/dist/utils/__tests__/converters/auto-detect.test.d.ts +2 -0
  194. package/dist/utils/__tests__/converters/auto-detect.test.d.ts.map +1 -0
  195. package/dist/utils/__tests__/converters/auto-detect.test.js +381 -0
  196. package/dist/utils/__tests__/converters/auto-detect.test.js.map +1 -0
  197. package/dist/utils/__tests__/converters/codepen-converter.test.d.ts +2 -0
  198. package/dist/utils/__tests__/converters/codepen-converter.test.d.ts.map +1 -0
  199. package/dist/utils/__tests__/converters/codepen-converter.test.js +408 -0
  200. package/dist/utils/__tests__/converters/codepen-converter.test.js.map +1 -0
  201. package/dist/utils/__tests__/converters/gist-converter.test.d.ts +2 -0
  202. package/dist/utils/__tests__/converters/gist-converter.test.d.ts.map +1 -0
  203. package/dist/utils/__tests__/converters/gist-converter.test.js +458 -0
  204. package/dist/utils/__tests__/converters/gist-converter.test.js.map +1 -0
  205. package/dist/utils/__tests__/converters/html-parser.test.d.ts +2 -0
  206. package/dist/utils/__tests__/converters/html-parser.test.d.ts.map +1 -0
  207. package/dist/utils/__tests__/converters/html-parser.test.js +285 -0
  208. package/dist/utils/__tests__/converters/html-parser.test.js.map +1 -0
  209. package/dist/utils/__tests__/converters/sanitization.test.d.ts +2 -0
  210. package/dist/utils/__tests__/converters/sanitization.test.d.ts.map +1 -0
  211. package/dist/utils/__tests__/converters/sanitization.test.js +210 -0
  212. package/dist/utils/__tests__/converters/sanitization.test.js.map +1 -0
  213. package/dist/utils/auto-resize-script.d.ts +4 -0
  214. package/dist/utils/auto-resize-script.d.ts.map +1 -0
  215. package/dist/utils/auto-resize-script.js +125 -0
  216. package/dist/utils/auto-resize-script.js.map +1 -0
  217. package/dist/widgets/banner/BannerWidget.d.ts +15 -0
  218. package/dist/widgets/banner/BannerWidget.d.ts.map +1 -0
  219. package/dist/widgets/banner/BannerWidget.js +33 -0
  220. package/dist/widgets/banner/BannerWidget.js.map +1 -0
  221. package/dist/widgets/form/FormWidget.d.ts +23 -0
  222. package/dist/widgets/form/FormWidget.d.ts.map +1 -0
  223. package/dist/widgets/form/FormWidget.js +42 -0
  224. package/dist/widgets/form/FormWidget.js.map +1 -0
  225. package/dist/widgets/index.d.ts +8 -0
  226. package/dist/widgets/index.d.ts.map +1 -0
  227. package/dist/widgets/index.js +28 -0
  228. package/dist/widgets/index.js.map +1 -0
  229. package/dist/widgets/types.d.ts +28 -0
  230. package/dist/widgets/types.d.ts.map +1 -0
  231. package/dist/widgets/types.js +2 -0
  232. package/dist/widgets/types.js.map +1 -0
  233. package/package.json +116 -0
@@ -0,0 +1,266 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import JSZip from 'jszip';
3
+ import { ProjectManager } from '../project-manager';
4
+ describe('ProjectManager', () => {
5
+ let manager;
6
+ beforeEach(async () => {
7
+ manager = new ProjectManager({
8
+ enabled: false,
9
+ });
10
+ await manager.init();
11
+ });
12
+ afterEach(async () => {
13
+ await manager.deleteAll();
14
+ manager.close();
15
+ });
16
+ describe('Initialization', () => {
17
+ it('should initialize successfully', async () => {
18
+ const newManager = new ProjectManager();
19
+ const result = await newManager.init();
20
+ expect(result.success).toBe(true);
21
+ newManager.close();
22
+ });
23
+ });
24
+ describe('CRUD Operations', () => {
25
+ it('should create a new project', async () => {
26
+ const result = await manager.create({
27
+ name: 'Test Project',
28
+ framework: 'react',
29
+ files: [
30
+ {
31
+ path: '/App.tsx',
32
+ content: 'export default function App() {}',
33
+ },
34
+ ],
35
+ });
36
+ expect(result.success).toBe(true);
37
+ expect(result.data).toBeDefined();
38
+ expect(result.data?.name).toBe('Test Project');
39
+ expect(result.data?.id).toBeDefined();
40
+ });
41
+ it('should update an existing project', async () => {
42
+ const createResult = await manager.create({
43
+ name: 'Original Name',
44
+ framework: 'react',
45
+ files: [],
46
+ });
47
+ expect(createResult.data).toBeDefined();
48
+ const projectId = createResult.data.id;
49
+ const updateResult = await manager.update(projectId, {
50
+ name: 'Updated Name',
51
+ });
52
+ expect(updateResult.success).toBe(true);
53
+ expect(updateResult.data?.name).toBe('Updated Name');
54
+ });
55
+ it('should get project by ID', async () => {
56
+ const createResult = await manager.create({
57
+ name: 'Test Project',
58
+ framework: 'vue',
59
+ files: [],
60
+ });
61
+ const projectId = createResult.data.id;
62
+ const getResult = await manager.getById(projectId);
63
+ expect(getResult.success).toBe(true);
64
+ expect(getResult.data?.name).toBe('Test Project');
65
+ });
66
+ it('should return error for non-existent project', async () => {
67
+ const result = await manager.getById('non-existent-id');
68
+ expect(result.success).toBe(false);
69
+ expect(result.error).toBeDefined();
70
+ });
71
+ it('should get all projects', async () => {
72
+ await manager.create({
73
+ name: 'Project 1',
74
+ framework: 'react',
75
+ files: [],
76
+ });
77
+ await manager.create({
78
+ name: 'Project 2',
79
+ framework: 'vue',
80
+ files: [],
81
+ });
82
+ const result = await manager.getAll();
83
+ expect(result.success).toBe(true);
84
+ expect(result.data?.length).toBe(2);
85
+ });
86
+ it('should delete a project', async () => {
87
+ const createResult = await manager.create({
88
+ name: 'To Delete',
89
+ framework: 'react',
90
+ files: [],
91
+ });
92
+ const projectId = createResult.data.id;
93
+ const deleteResult = await manager.delete(projectId);
94
+ expect(deleteResult.success).toBe(true);
95
+ const getResult = await manager.getById(projectId);
96
+ expect(getResult.success).toBe(false);
97
+ });
98
+ it('should delete all projects', async () => {
99
+ await manager.create({
100
+ name: 'Project 1',
101
+ framework: 'react',
102
+ files: [],
103
+ });
104
+ await manager.create({
105
+ name: 'Project 2',
106
+ framework: 'vue',
107
+ files: [],
108
+ });
109
+ const deleteResult = await manager.deleteAll();
110
+ expect(deleteResult.success).toBe(true);
111
+ const allResult = await manager.getAll();
112
+ expect(allResult.data?.length).toBe(0);
113
+ });
114
+ });
115
+ describe('Filtering', () => {
116
+ beforeEach(async () => {
117
+ await manager.create({
118
+ name: 'React App',
119
+ framework: 'react',
120
+ files: [],
121
+ tags: ['frontend'],
122
+ });
123
+ await manager.create({
124
+ name: 'Vue App',
125
+ framework: 'vue',
126
+ files: [],
127
+ tags: ['frontend', 'ssr'],
128
+ });
129
+ await manager.create({
130
+ name: 'Svelte Demo',
131
+ framework: 'svelte',
132
+ files: [],
133
+ tags: ['demo'],
134
+ });
135
+ });
136
+ it('should filter by framework', async () => {
137
+ const result = await manager.getAll({ framework: 'react' });
138
+ expect(result.success).toBe(true);
139
+ expect(result.data?.length).toBe(1);
140
+ expect(result.data?.[0].name).toBe('React App');
141
+ });
142
+ it('should filter by tags', async () => {
143
+ const result = await manager.getAll({ tags: ['ssr'] });
144
+ expect(result.success).toBe(true);
145
+ expect(result.data?.length).toBe(1);
146
+ expect(result.data?.[0].name).toBe('Vue App');
147
+ });
148
+ it('should search by name', async () => {
149
+ const result = await manager.getAll({ search: 'demo' });
150
+ expect(result.success).toBe(true);
151
+ expect(result.data?.length).toBe(1);
152
+ expect(result.data?.[0].name).toBe('Svelte Demo');
153
+ });
154
+ });
155
+ describe('Import/Export', () => {
156
+ it('should import project from ZIP', async () => {
157
+ const zip = new JSZip();
158
+ zip.file('App.tsx', 'import React from "react";\nexport default function App() {}');
159
+ zip.file('package.json', JSON.stringify({
160
+ dependencies: {
161
+ react: '^18.2.0',
162
+ },
163
+ }));
164
+ const blob = await zip.generateAsync({ type: 'blob' });
165
+ const file = new File([blob], 'react-app.zip');
166
+ const result = await manager.importFromZip(file);
167
+ expect(result.success).toBe(true);
168
+ expect(result.data?.project).toBeDefined();
169
+ expect(result.data?.project.framework).toBe('react');
170
+ });
171
+ it('should export project to ZIP', async () => {
172
+ const createResult = await manager.create({
173
+ name: 'Export Test',
174
+ framework: 'react',
175
+ files: [
176
+ {
177
+ path: '/App.tsx',
178
+ content: 'export default function App() {}',
179
+ },
180
+ ],
181
+ });
182
+ const projectId = createResult.data.id;
183
+ const exportResult = await manager.exportToZip(projectId);
184
+ expect(exportResult.success).toBe(true);
185
+ expect(exportResult.data).toBeInstanceOf(Blob);
186
+ });
187
+ it('should return error when exporting non-existent project', async () => {
188
+ const result = await manager.exportToZip('non-existent');
189
+ expect(result.success).toBe(false);
190
+ expect(result.error).toContain('not found');
191
+ });
192
+ });
193
+ describe('Duplicate', () => {
194
+ it('should duplicate a project', async () => {
195
+ const original = await manager.create({
196
+ name: 'Original',
197
+ description: 'Original description',
198
+ framework: 'react',
199
+ files: [
200
+ {
201
+ path: '/App.tsx',
202
+ content: 'content',
203
+ },
204
+ ],
205
+ tags: ['tag1'],
206
+ });
207
+ const projectId = original.data.id;
208
+ const duplicate = await manager.duplicate(projectId);
209
+ expect(duplicate.success).toBe(true);
210
+ expect(duplicate.data?.name).toBe('Original (Copy)');
211
+ expect(duplicate.data?.description).toBe('Original description');
212
+ expect(duplicate.data?.framework).toBe('react');
213
+ expect(duplicate.data?.files.length).toBe(1);
214
+ expect(duplicate.data?.id).not.toBe(projectId);
215
+ });
216
+ it('should return error when duplicating non-existent project', async () => {
217
+ const result = await manager.duplicate('non-existent');
218
+ expect(result.success).toBe(false);
219
+ expect(result.error).toBeDefined();
220
+ });
221
+ });
222
+ describe('Auto-Save', () => {
223
+ it('should enable auto-save', () => {
224
+ const autoSaveManager = new ProjectManager({
225
+ enabled: true,
226
+ debounceMs: 1000,
227
+ });
228
+ expect(() => {
229
+ autoSaveManager.enableAutoSave('test-id');
230
+ }).not.toThrow();
231
+ autoSaveManager.close();
232
+ });
233
+ it('should disable auto-save', () => {
234
+ const autoSaveManager = new ProjectManager({
235
+ enabled: true,
236
+ debounceMs: 1000,
237
+ });
238
+ autoSaveManager.enableAutoSave('test-id');
239
+ expect(() => {
240
+ autoSaveManager.disableAutoSave('test-id');
241
+ }).not.toThrow();
242
+ autoSaveManager.close();
243
+ });
244
+ it('should schedule auto-save', () => {
245
+ vi.useFakeTimers();
246
+ const autoSaveManager = new ProjectManager({
247
+ enabled: true,
248
+ debounceMs: 1000,
249
+ });
250
+ autoSaveManager.scheduleAutoSave('test-id');
251
+ vi.advanceTimersByTime(1000);
252
+ vi.useRealTimers();
253
+ autoSaveManager.close();
254
+ });
255
+ });
256
+ describe('Storage Quota', () => {
257
+ it('should get storage quota', async () => {
258
+ const result = await manager.getQuota();
259
+ if (result.success && result.data) {
260
+ expect(result.data.quota).toBeGreaterThanOrEqual(0);
261
+ expect(result.data.usage).toBeGreaterThanOrEqual(0);
262
+ }
263
+ });
264
+ });
265
+ });
266
+ //# sourceMappingURL=project-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.test.js","sourceRoot":"","sources":["../../../src/storage/__tests__/project-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { SandboxDB } from './indexeddb-adapter';
2
+ export { ProjectManager } from './project-manager';
3
+ export { importFromZip, exportToZip, downloadProjectAsZip, } from './zip-handler';
4
+ export type { Framework, SandboxFile, SandboxProject, StorageQuota, StorageConfig, StorageResult, ProjectFilter, ZipExportOptions, ZipImportResult, AutoSaveConfig, } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EACN,aAAa,EACb,WAAW,EACX,oBAAoB,GACpB,MAAM,eAAe,CAAC;AAGvB,YAAY,EACX,SAAS,EACT,WAAW,EACX,cAAc,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { SandboxDB } from './indexeddb-adapter';
2
+ export { ProjectManager } from './project-manager';
3
+ export { importFromZip, exportToZip, downloadProjectAsZip, } from './zip-handler';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EACN,aAAa,EACb,WAAW,EACX,oBAAoB,GACpB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SandboxProject, StorageConfig, StorageQuota, StorageResult, ProjectFilter } from './types';
2
+ export declare class SandboxDB {
3
+ private db;
4
+ private config;
5
+ constructor(config?: Partial<StorageConfig>);
6
+ init(): Promise<StorageResult<void>>;
7
+ private openDatabase;
8
+ save(project: SandboxProject): Promise<StorageResult<SandboxProject>>;
9
+ getById(id: string): Promise<StorageResult<SandboxProject>>;
10
+ getAll(filter?: ProjectFilter): Promise<StorageResult<SandboxProject[]>>;
11
+ delete(id: string): Promise<StorageResult<void>>;
12
+ clear(): Promise<StorageResult<void>>;
13
+ getQuota(): Promise<StorageResult<StorageQuota>>;
14
+ close(): void;
15
+ private executeTransaction;
16
+ private applyFilters;
17
+ }
18
+ //# sourceMappingURL=indexeddb-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexeddb-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/indexeddb-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,MAAM,SAAS,CAAC;AA0BjB,qBAAa,SAAS;IACrB,OAAO,CAAC,EAAE,CAA4B;IACtC,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAQrC,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAe1C,OAAO,CAAC,YAAY;IAkCd,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IA4BrE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IA2B3D,MAAM,CACX,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;IA4BrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAsBhD,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAsBrC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAmCtD,KAAK,IAAI,IAAI;IAUb,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,YAAY;CAsDpB"}
@@ -0,0 +1,232 @@
1
+ const DEFAULT_CONFIG = {
2
+ dbName: 'codefluss-sandbox',
3
+ version: 1,
4
+ storeName: 'projects',
5
+ };
6
+ export class SandboxDB {
7
+ db = null;
8
+ config;
9
+ constructor(config) {
10
+ this.config = { ...DEFAULT_CONFIG, ...config };
11
+ }
12
+ async init() {
13
+ try {
14
+ this.db = await this.openDatabase();
15
+ return { success: true };
16
+ }
17
+ catch (error) {
18
+ return {
19
+ success: false,
20
+ error: `Failed to initialize database: ${error instanceof Error ? error.message : 'Unknown error'}`,
21
+ };
22
+ }
23
+ }
24
+ openDatabase() {
25
+ return new Promise((resolve, reject) => {
26
+ const request = indexedDB.open(this.config.dbName, this.config.version);
27
+ request.onerror = () => {
28
+ reject(new Error(`Database error: ${request.error?.message}`));
29
+ };
30
+ request.onsuccess = () => {
31
+ resolve(request.result);
32
+ };
33
+ request.onupgradeneeded = (event) => {
34
+ const db = event.target.result;
35
+ if (!db.objectStoreNames.contains(this.config.storeName)) {
36
+ const store = db.createObjectStore(this.config.storeName, {
37
+ keyPath: 'id',
38
+ });
39
+ store.createIndex('by-framework', 'framework', { unique: false });
40
+ store.createIndex('by-updated', 'updatedAt', { unique: false });
41
+ store.createIndex('by-created', 'createdAt', { unique: false });
42
+ store.createIndex('by-name', 'name', { unique: false });
43
+ }
44
+ };
45
+ });
46
+ }
47
+ async save(project) {
48
+ if (!this.db) {
49
+ return { success: false, error: 'Database not initialized' };
50
+ }
51
+ try {
52
+ const updatedProject = {
53
+ ...project,
54
+ updatedAt: new Date(),
55
+ };
56
+ await this.executeTransaction('readwrite', (store) => {
57
+ store.put(updatedProject);
58
+ });
59
+ return { success: true, data: updatedProject };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ success: false,
64
+ error: `Failed to save project: ${error instanceof Error ? error.message : 'Unknown error'}`,
65
+ };
66
+ }
67
+ }
68
+ async getById(id) {
69
+ if (!this.db) {
70
+ return { success: false, error: 'Database not initialized' };
71
+ }
72
+ try {
73
+ const project = await this.executeTransaction('readonly', (store) => store.get(id));
74
+ if (!project) {
75
+ return { success: false, error: 'Project not found' };
76
+ }
77
+ return { success: true, data: project };
78
+ }
79
+ catch (error) {
80
+ return {
81
+ success: false,
82
+ error: `Failed to get project: ${error instanceof Error ? error.message : 'Unknown error'}`,
83
+ };
84
+ }
85
+ }
86
+ async getAll(filter) {
87
+ if (!this.db) {
88
+ return { success: false, error: 'Database not initialized' };
89
+ }
90
+ try {
91
+ let projects = await this.executeTransaction('readonly', (store) => store.getAll());
92
+ if (filter) {
93
+ projects = this.applyFilters(projects, filter);
94
+ }
95
+ return { success: true, data: projects };
96
+ }
97
+ catch (error) {
98
+ return {
99
+ success: false,
100
+ error: `Failed to get projects: ${error instanceof Error ? error.message : 'Unknown error'}`,
101
+ };
102
+ }
103
+ }
104
+ async delete(id) {
105
+ if (!this.db) {
106
+ return { success: false, error: 'Database not initialized' };
107
+ }
108
+ try {
109
+ await this.executeTransaction('readwrite', (store) => {
110
+ store.delete(id);
111
+ });
112
+ return { success: true };
113
+ }
114
+ catch (error) {
115
+ return {
116
+ success: false,
117
+ error: `Failed to delete project: ${error instanceof Error ? error.message : 'Unknown error'}`,
118
+ };
119
+ }
120
+ }
121
+ async clear() {
122
+ if (!this.db) {
123
+ return { success: false, error: 'Database not initialized' };
124
+ }
125
+ try {
126
+ await this.executeTransaction('readwrite', (store) => {
127
+ store.clear();
128
+ });
129
+ return { success: true };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ success: false,
134
+ error: `Failed to clear database: ${error instanceof Error ? error.message : 'Unknown error'}`,
135
+ };
136
+ }
137
+ }
138
+ async getQuota() {
139
+ try {
140
+ if (!navigator.storage || !navigator.storage.estimate) {
141
+ return {
142
+ success: false,
143
+ error: 'Storage API not supported',
144
+ };
145
+ }
146
+ const estimate = await navigator.storage.estimate();
147
+ const quota = estimate.quota || 0;
148
+ const usage = estimate.usage || 0;
149
+ const available = quota - usage;
150
+ const percentage = quota > 0 ? (usage / quota) * 100 : 0;
151
+ return {
152
+ success: true,
153
+ data: {
154
+ quota,
155
+ usage,
156
+ available,
157
+ percentage,
158
+ },
159
+ };
160
+ }
161
+ catch (error) {
162
+ return {
163
+ success: false,
164
+ error: `Failed to get quota: ${error instanceof Error ? error.message : 'Unknown error'}`,
165
+ };
166
+ }
167
+ }
168
+ close() {
169
+ if (this.db) {
170
+ this.db.close();
171
+ this.db = null;
172
+ }
173
+ }
174
+ executeTransaction(mode, operation) {
175
+ return new Promise((resolve, reject) => {
176
+ if (!this.db) {
177
+ reject(new Error('Database not initialized'));
178
+ return;
179
+ }
180
+ const transaction = this.db.transaction([this.config.storeName], mode);
181
+ const store = transaction.objectStore(this.config.storeName);
182
+ const request = operation(store);
183
+ if (request) {
184
+ request.onsuccess = () => resolve(request.result);
185
+ request.onerror = () => reject(new Error(`Transaction error: ${request.error?.message}`));
186
+ }
187
+ transaction.oncomplete = () => {
188
+ if (!request) {
189
+ resolve(undefined);
190
+ }
191
+ };
192
+ transaction.onerror = () => {
193
+ reject(new Error(`Transaction error: ${transaction.error?.message}`));
194
+ };
195
+ });
196
+ }
197
+ applyFilters(projects, filter) {
198
+ let filtered = projects;
199
+ if (filter.framework) {
200
+ filtered = filtered.filter((p) => p.framework === filter.framework);
201
+ }
202
+ if (filter.tags && filter.tags.length > 0) {
203
+ filtered = filtered.filter((p) => p.tags && p.tags.some((tag) => filter.tags?.includes(tag)));
204
+ }
205
+ if (filter.search) {
206
+ const searchLower = filter.search.toLowerCase();
207
+ filtered = filtered.filter((p) => p.name.toLowerCase().includes(searchLower) ||
208
+ p.description?.toLowerCase().includes(searchLower));
209
+ }
210
+ if (filter.sortBy) {
211
+ const direction = filter.sortDirection === 'desc' ? -1 : 1;
212
+ filtered.sort((a, b) => {
213
+ const aVal = filter.sortBy === 'name'
214
+ ? a.name
215
+ : a[filter.sortBy];
216
+ const bVal = filter.sortBy === 'name'
217
+ ? b.name
218
+ : b[filter.sortBy];
219
+ if (aVal < bVal)
220
+ return -1 * direction;
221
+ if (aVal > bVal)
222
+ return 1 * direction;
223
+ return 0;
224
+ });
225
+ }
226
+ if (filter.limit && filter.limit > 0) {
227
+ filtered = filtered.slice(0, filter.limit);
228
+ }
229
+ return filtered;
230
+ }
231
+ }
232
+ //# sourceMappingURL=indexeddb-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexeddb-adapter.js","sourceRoot":"","sources":["../../src/storage/indexeddb-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { SandboxProject, SandboxFile, Framework, StorageResult, StorageQuota, ProjectFilter, AutoSaveConfig, ZipExportOptions } from './types';
2
+ export declare class ProjectManager {
3
+ private db;
4
+ private autoSaveTimers;
5
+ private autoSaveConfig;
6
+ constructor(autoSaveConfig?: Partial<AutoSaveConfig>);
7
+ init(): Promise<StorageResult<void>>;
8
+ create(options: {
9
+ name: string;
10
+ description?: string;
11
+ framework: Framework;
12
+ files: SandboxFile[];
13
+ dependencies?: Record<string, string>;
14
+ tags?: string[];
15
+ }): Promise<StorageResult<SandboxProject>>;
16
+ update(id: string, updates: Partial<Omit<SandboxProject, 'id' | 'createdAt' | 'updatedAt'>>): Promise<StorageResult<SandboxProject>>;
17
+ getById(id: string): Promise<StorageResult<SandboxProject>>;
18
+ getAll(filter?: ProjectFilter): Promise<StorageResult<SandboxProject[]>>;
19
+ delete(id: string): Promise<StorageResult<void>>;
20
+ deleteAll(): Promise<StorageResult<void>>;
21
+ getQuota(): Promise<StorageResult<StorageQuota>>;
22
+ enableAutoSave(projectId: string): void;
23
+ disableAutoSave(projectId: string): void;
24
+ private saveProject;
25
+ scheduleAutoSave(projectId: string): void;
26
+ importFromZip(file: File): Promise<StorageResult<{
27
+ project: SandboxProject;
28
+ warnings: string[];
29
+ }>>;
30
+ exportToZip(projectId: string, options?: ZipExportOptions): Promise<StorageResult<Blob>>;
31
+ downloadAsZip(projectId: string, options?: ZipExportOptions): Promise<StorageResult<void>>;
32
+ duplicate(projectId: string): Promise<StorageResult<SandboxProject>>;
33
+ close(): void;
34
+ }
35
+ //# sourceMappingURL=project-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.d.ts","sourceRoot":"","sources":["../../src/storage/project-manager.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACX,cAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,gBAAgB,EAEhB,MAAM,SAAS,CAAC;AA0CjB,qBAAa,cAAc;IAC1B,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,cAAc,CAAiB;gBAE3B,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAQ9C,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAOpC,MAAM,CAAC,OAAO,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,WAAW,EAAE,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAsBpC,MAAM,CACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC,GACtE,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAsBnC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAO3D,MAAM,CACX,MAAM,CAAC,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,CAAC;IAOrC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAShD,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAWzC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAOtD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBvC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;YAW1B,WAAW;IAUzB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAqBnC,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CACvC,aAAa,CAAC;QACb,OAAO,EAAE,cAAc,CAAC;QACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC,CACF;IAgDK,WAAW,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAwBzB,aAAa,CAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAwBzB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IA2B1E,KAAK,IAAI,IAAI;CAQb"}