@powerhousedao/reactor-browser 6.0.0-dev.65 → 6.0.0-dev.67

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 (267) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/src/analytics/context.d.ts.map +1 -1
  4. package/dist/src/analytics.js +82425 -3
  5. package/dist/src/connect.js +54019 -2
  6. package/dist/src/index.d.ts +1 -0
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +66007 -15
  9. package/dist/src/re-exports.d.ts +3 -0
  10. package/dist/src/re-exports.d.ts.map +1 -0
  11. package/dist/src/relational/hooks/useRelationalDb.d.ts +2 -1
  12. package/dist/src/relational/hooks/useRelationalDb.d.ts.map +1 -1
  13. package/dist/tsconfig.tsbuildinfo +1 -1
  14. package/package.json +19 -22
  15. package/dist/src/actions/dispatch.js +0 -51
  16. package/dist/src/actions/dispatch.js.map +0 -1
  17. package/dist/src/actions/document.js +0 -497
  18. package/dist/src/actions/document.js.map +0 -1
  19. package/dist/src/actions/drive.js +0 -120
  20. package/dist/src/actions/drive.js.map +0 -1
  21. package/dist/src/actions/index.js +0 -4
  22. package/dist/src/actions/index.js.map +0 -1
  23. package/dist/src/actions/queue.js +0 -131
  24. package/dist/src/actions/queue.js.map +0 -1
  25. package/dist/src/actions/sign.js +0 -66
  26. package/dist/src/actions/sign.js.map +0 -1
  27. package/dist/src/analytics/context.js +0 -148
  28. package/dist/src/analytics/context.js.map +0 -1
  29. package/dist/src/analytics/hooks/analytics-query.js +0 -157
  30. package/dist/src/analytics/hooks/analytics-query.js.map +0 -1
  31. package/dist/src/analytics/hooks/document-timeline.js +0 -10
  32. package/dist/src/analytics/hooks/document-timeline.js.map +0 -1
  33. package/dist/src/analytics/hooks/index.js +0 -4
  34. package/dist/src/analytics/hooks/index.js.map +0 -1
  35. package/dist/src/analytics/hooks/timeline-items.js +0 -104
  36. package/dist/src/analytics/hooks/timeline-items.js.map +0 -1
  37. package/dist/src/analytics/index.js +0 -3
  38. package/dist/src/analytics/index.js.map +0 -1
  39. package/dist/src/analytics/store/browser.js +0 -2
  40. package/dist/src/analytics/store/browser.js.map +0 -1
  41. package/dist/src/analytics/store/memory.js +0 -2
  42. package/dist/src/analytics/store/memory.js.map +0 -1
  43. package/dist/src/analytics/types.js +0 -2
  44. package/dist/src/analytics/types.js.map +0 -1
  45. package/dist/src/analytics.js.map +0 -1
  46. package/dist/src/connect.js.map +0 -1
  47. package/dist/src/constants.js +0 -3
  48. package/dist/src/constants.js.map +0 -1
  49. package/dist/src/context/index.js +0 -2
  50. package/dist/src/context/index.js.map +0 -1
  51. package/dist/src/context/read-mode.js +0 -177
  52. package/dist/src/context/read-mode.js.map +0 -1
  53. package/dist/src/document-cache.js +0 -143
  54. package/dist/src/document-cache.js.map +0 -1
  55. package/dist/src/document-model.js +0 -6
  56. package/dist/src/document-model.js.map +0 -1
  57. package/dist/src/errors.js +0 -30
  58. package/dist/src/errors.js.map +0 -1
  59. package/dist/src/global/core.js +0 -22
  60. package/dist/src/global/core.js.map +0 -1
  61. package/dist/src/global/index.js +0 -2
  62. package/dist/src/global/index.js.map +0 -1
  63. package/dist/src/global/types.js +0 -2
  64. package/dist/src/global/types.js.map +0 -1
  65. package/dist/src/hooks/add-ph-event-handlers.js +0 -103
  66. package/dist/src/hooks/add-ph-event-handlers.js.map +0 -1
  67. package/dist/src/hooks/allowed-document-model-modules.js +0 -10
  68. package/dist/src/hooks/allowed-document-model-modules.js.map +0 -1
  69. package/dist/src/hooks/child-nodes.js +0 -15
  70. package/dist/src/hooks/child-nodes.js.map +0 -1
  71. package/dist/src/hooks/config/connect.js +0 -210
  72. package/dist/src/hooks/config/connect.js.map +0 -1
  73. package/dist/src/hooks/config/editor.js +0 -43
  74. package/dist/src/hooks/config/editor.js.map +0 -1
  75. package/dist/src/hooks/config/set-config-by-key.js +0 -15
  76. package/dist/src/hooks/config/set-config-by-key.js.map +0 -1
  77. package/dist/src/hooks/config/set-config-by-object.js +0 -84
  78. package/dist/src/hooks/config/set-config-by-object.js.map +0 -1
  79. package/dist/src/hooks/config/use-value-by-key.js +0 -23
  80. package/dist/src/hooks/config/use-value-by-key.js.map +0 -1
  81. package/dist/src/hooks/config/utils.js +0 -6
  82. package/dist/src/hooks/config/utils.js.map +0 -1
  83. package/dist/src/hooks/connect.js +0 -16
  84. package/dist/src/hooks/connect.js.map +0 -1
  85. package/dist/src/hooks/crypto.js +0 -13
  86. package/dist/src/hooks/crypto.js.map +0 -1
  87. package/dist/src/hooks/did.js +0 -3
  88. package/dist/src/hooks/did.js.map +0 -1
  89. package/dist/src/hooks/dispatch.js +0 -20
  90. package/dist/src/hooks/dispatch.js.map +0 -1
  91. package/dist/src/hooks/document-by-id.js +0 -13
  92. package/dist/src/hooks/document-by-id.js.map +0 -1
  93. package/dist/src/hooks/document-cache.js +0 -124
  94. package/dist/src/hooks/document-cache.js.map +0 -1
  95. package/dist/src/hooks/document-model-modules.js +0 -10
  96. package/dist/src/hooks/document-model-modules.js.map +0 -1
  97. package/dist/src/hooks/document-of-type.js +0 -22
  98. package/dist/src/hooks/document-of-type.js.map +0 -1
  99. package/dist/src/hooks/document-operations.js +0 -92
  100. package/dist/src/hooks/document-operations.js.map +0 -1
  101. package/dist/src/hooks/document-types.js +0 -13
  102. package/dist/src/hooks/document-types.js.map +0 -1
  103. package/dist/src/hooks/drive-by-id.js +0 -12
  104. package/dist/src/hooks/drive-by-id.js.map +0 -1
  105. package/dist/src/hooks/drives.js +0 -9
  106. package/dist/src/hooks/drives.js.map +0 -1
  107. package/dist/src/hooks/editor-modules.js +0 -43
  108. package/dist/src/hooks/editor-modules.js.map +0 -1
  109. package/dist/src/hooks/features.js +0 -6
  110. package/dist/src/hooks/features.js.map +0 -1
  111. package/dist/src/hooks/folder-by-id.js +0 -6
  112. package/dist/src/hooks/folder-by-id.js.map +0 -1
  113. package/dist/src/hooks/import-script-modules.js +0 -6
  114. package/dist/src/hooks/import-script-modules.js.map +0 -1
  115. package/dist/src/hooks/index.js +0 -41
  116. package/dist/src/hooks/index.js.map +0 -1
  117. package/dist/src/hooks/items-in-selected-drive.js +0 -35
  118. package/dist/src/hooks/items-in-selected-drive.js.map +0 -1
  119. package/dist/src/hooks/items-in-selected-folder.js +0 -33
  120. package/dist/src/hooks/items-in-selected-folder.js.map +0 -1
  121. package/dist/src/hooks/loading.js +0 -3
  122. package/dist/src/hooks/loading.js.map +0 -1
  123. package/dist/src/hooks/login-status.js +0 -3
  124. package/dist/src/hooks/login-status.js.map +0 -1
  125. package/dist/src/hooks/make-ph-event-functions.js +0 -46
  126. package/dist/src/hooks/make-ph-event-functions.js.map +0 -1
  127. package/dist/src/hooks/modals.js +0 -26
  128. package/dist/src/hooks/modals.js.map +0 -1
  129. package/dist/src/hooks/node-actions.js +0 -108
  130. package/dist/src/hooks/node-actions.js.map +0 -1
  131. package/dist/src/hooks/node-by-id.js +0 -7
  132. package/dist/src/hooks/node-by-id.js.map +0 -1
  133. package/dist/src/hooks/node-path.js +0 -23
  134. package/dist/src/hooks/node-path.js.map +0 -1
  135. package/dist/src/hooks/parent-folder.js +0 -13
  136. package/dist/src/hooks/parent-folder.js.map +0 -1
  137. package/dist/src/hooks/reactor.js +0 -25
  138. package/dist/src/hooks/reactor.js.map +0 -1
  139. package/dist/src/hooks/renown.js +0 -9
  140. package/dist/src/hooks/renown.js.map +0 -1
  141. package/dist/src/hooks/revision-history.js +0 -17
  142. package/dist/src/hooks/revision-history.js.map +0 -1
  143. package/dist/src/hooks/selected-document.js +0 -35
  144. package/dist/src/hooks/selected-document.js.map +0 -1
  145. package/dist/src/hooks/selected-drive.js +0 -63
  146. package/dist/src/hooks/selected-drive.js.map +0 -1
  147. package/dist/src/hooks/selected-folder.js +0 -10
  148. package/dist/src/hooks/selected-folder.js.map +0 -1
  149. package/dist/src/hooks/selected-node.js +0 -54
  150. package/dist/src/hooks/selected-node.js.map +0 -1
  151. package/dist/src/hooks/selected-timeline-item.js +0 -9
  152. package/dist/src/hooks/selected-timeline-item.js.map +0 -1
  153. package/dist/src/hooks/subgraph-modules.js +0 -6
  154. package/dist/src/hooks/subgraph-modules.js.map +0 -1
  155. package/dist/src/hooks/supported-document-types.js +0 -7
  156. package/dist/src/hooks/supported-document-types.js.map +0 -1
  157. package/dist/src/hooks/timeline-revision.js +0 -9
  158. package/dist/src/hooks/timeline-revision.js.map +0 -1
  159. package/dist/src/hooks/toast.js +0 -9
  160. package/dist/src/hooks/toast.js.map +0 -1
  161. package/dist/src/hooks/use-feature-flags.js +0 -19
  162. package/dist/src/hooks/use-feature-flags.js.map +0 -1
  163. package/dist/src/hooks/use-get-switchboard-link.js +0 -49
  164. package/dist/src/hooks/use-get-switchboard-link.js.map +0 -1
  165. package/dist/src/hooks/use-on-drop-file.js +0 -21
  166. package/dist/src/hooks/use-on-drop-file.js.map +0 -1
  167. package/dist/src/hooks/user-permissions.js +0 -17
  168. package/dist/src/hooks/user-permissions.js.map +0 -1
  169. package/dist/src/hooks/user.js +0 -9
  170. package/dist/src/hooks/user.js.map +0 -1
  171. package/dist/src/hooks/vetra-packages.js +0 -27
  172. package/dist/src/hooks/vetra-packages.js.map +0 -1
  173. package/dist/src/index.js.map +0 -1
  174. package/dist/src/pglite/drop.js +0 -27
  175. package/dist/src/pglite/drop.js.map +0 -1
  176. package/dist/src/pglite/hooks/index.js +0 -2
  177. package/dist/src/pglite/hooks/index.js.map +0 -1
  178. package/dist/src/pglite/hooks/usePGlite.js +0 -37
  179. package/dist/src/pglite/hooks/usePGlite.js.map +0 -1
  180. package/dist/src/pglite/index.js +0 -3
  181. package/dist/src/pglite/index.js.map +0 -1
  182. package/dist/src/reactor-client-document-cache.js +0 -138
  183. package/dist/src/reactor-client-document-cache.js.map +0 -1
  184. package/dist/src/reactor.js +0 -145
  185. package/dist/src/reactor.js.map +0 -1
  186. package/dist/src/relational/hooks/index.js +0 -3
  187. package/dist/src/relational/hooks/index.js.map +0 -1
  188. package/dist/src/relational/hooks/useRelationalDb.js +0 -36
  189. package/dist/src/relational/hooks/useRelationalDb.js.map +0 -1
  190. package/dist/src/relational/hooks/useRelationalQuery.js +0 -76
  191. package/dist/src/relational/hooks/useRelationalQuery.js.map +0 -1
  192. package/dist/src/relational/index.js +0 -3
  193. package/dist/src/relational/index.js.map +0 -1
  194. package/dist/src/relational/utils/createProcessorQuery.js +0 -24
  195. package/dist/src/relational/utils/createProcessorQuery.js.map +0 -1
  196. package/dist/src/relational/utils/index.js +0 -2
  197. package/dist/src/relational/utils/index.js.map +0 -1
  198. package/dist/src/renown/constants.js +0 -40
  199. package/dist/src/renown/constants.js.map +0 -1
  200. package/dist/src/renown/index.js +0 -3
  201. package/dist/src/renown/index.js.map +0 -1
  202. package/dist/src/renown/utils.js +0 -52
  203. package/dist/src/renown/utils.js.map +0 -1
  204. package/dist/src/storage/index.js +0 -2
  205. package/dist/src/storage/index.js.map +0 -1
  206. package/dist/src/storage/types.js +0 -2
  207. package/dist/src/storage/types.js.map +0 -1
  208. package/dist/src/types/config.js +0 -2
  209. package/dist/src/types/config.js.map +0 -1
  210. package/dist/src/types/documents.js +0 -2
  211. package/dist/src/types/documents.js.map +0 -1
  212. package/dist/src/types/global.js +0 -2
  213. package/dist/src/types/global.js.map +0 -1
  214. package/dist/src/types/index.js +0 -2
  215. package/dist/src/types/index.js.map +0 -1
  216. package/dist/src/types/modals.js +0 -2
  217. package/dist/src/types/modals.js.map +0 -1
  218. package/dist/src/types/reactor.js +0 -2
  219. package/dist/src/types/reactor.js.map +0 -1
  220. package/dist/src/types/timeline.js +0 -2
  221. package/dist/src/types/timeline.js.map +0 -1
  222. package/dist/src/types/toast.js +0 -2
  223. package/dist/src/types/toast.js.map +0 -1
  224. package/dist/src/types/upload.js +0 -2
  225. package/dist/src/types/upload.js.map +0 -1
  226. package/dist/src/types/vetra.js +0 -2
  227. package/dist/src/types/vetra.js.map +0 -1
  228. package/dist/src/utils/documents.js +0 -20
  229. package/dist/src/utils/documents.js.map +0 -1
  230. package/dist/src/utils/drive-url.js +0 -3
  231. package/dist/src/utils/drive-url.js.map +0 -1
  232. package/dist/src/utils/drives.js +0 -29
  233. package/dist/src/utils/drives.js.map +0 -1
  234. package/dist/src/utils/export-document.js +0 -18
  235. package/dist/src/utils/export-document.js.map +0 -1
  236. package/dist/src/utils/get-revision-from-date.js +0 -10
  237. package/dist/src/utils/get-revision-from-date.js.map +0 -1
  238. package/dist/src/utils/index.js +0 -12
  239. package/dist/src/utils/index.js.map +0 -1
  240. package/dist/src/utils/nodes.js +0 -17
  241. package/dist/src/utils/nodes.js.map +0 -1
  242. package/dist/src/utils/switchboard.js +0 -76
  243. package/dist/src/utils/switchboard.js.map +0 -1
  244. package/dist/src/utils/url.js +0 -77
  245. package/dist/src/utils/url.js.map +0 -1
  246. package/dist/src/utils/user.js +0 -15
  247. package/dist/src/utils/user.js.map +0 -1
  248. package/dist/src/utils/validate-document.js +0 -38
  249. package/dist/src/utils/validate-document.js.map +0 -1
  250. package/dist/src/utils/vetra.js +0 -87
  251. package/dist/src/utils/vetra.js.map +0 -1
  252. package/dist/test/analytics.test.js +0 -263
  253. package/dist/test/analytics.test.js.map +0 -1
  254. package/dist/test/document-cache.test.js +0 -457
  255. package/dist/test/document-cache.test.js.map +0 -1
  256. package/dist/test/drop.test.js +0 -83
  257. package/dist/test/drop.test.js.map +0 -1
  258. package/dist/test/getSwitchboardUrl.test.js +0 -107
  259. package/dist/test/getSwitchboardUrl.test.js.map +0 -1
  260. package/dist/test/hooks/document-cache.test.js +0 -642
  261. package/dist/test/hooks/document-cache.test.js.map +0 -1
  262. package/dist/test/reactor.test.js +0 -26
  263. package/dist/test/reactor.test.js.map +0 -1
  264. package/dist/test/switchboard.test.js +0 -27
  265. package/dist/test/switchboard.test.js.map +0 -1
  266. package/dist/vitest.config.js +0 -24
  267. package/dist/vitest.config.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/reactor-browser",
3
- "version": "6.0.0-dev.65",
3
+ "version": "6.0.0-dev.67",
4
4
  "license": "AGPL-3.0-only",
5
5
  "type": "module",
6
6
  "repository": {
@@ -15,20 +15,16 @@
15
15
  ],
16
16
  "exports": {
17
17
  ".": {
18
- "import": "./dist/src/index.js",
19
- "types": "./dist/src/index.d.ts"
18
+ "types": "./dist/src/index.d.ts",
19
+ "import": "./dist/src/index.js"
20
20
  },
21
21
  "./connect": {
22
22
  "types": "./dist/src/connect.d.ts",
23
- "default": "./dist/src/connect.js"
23
+ "import": "./dist/src/connect.js"
24
24
  },
25
25
  "./analytics": {
26
26
  "types": "./dist/src/analytics.d.ts",
27
- "default": "./dist/src/analytics.js"
28
- },
29
- "./analytics/hooks": {
30
- "types": "./dist/src/analytics/hooks/index.d.ts",
31
- "default": "./dist/src/analytics/hooks/index.js"
27
+ "import": "./dist/src/analytics.js"
32
28
  }
33
29
  },
34
30
  "sideEffects": false,
@@ -38,6 +34,7 @@
38
34
  "@types/react": "19.2.14",
39
35
  "@types/react-dom": "19.2.3",
40
36
  "@types/slug": "^5.0.9",
37
+ "@types/bun": "1.3.10",
41
38
  "@types/wicg-file-system-access": "^2020.9.8",
42
39
  "@vitejs/plugin-react": "5.1.4",
43
40
  "@vitest/browser": "^3.2.4",
@@ -46,13 +43,7 @@
46
43
  "react": "19.2.4",
47
44
  "react-dom": "19.2.4",
48
45
  "vitest": "3.2.4",
49
- "vitest-browser-react": "^1.0.1"
50
- },
51
- "peerDependencies": {
52
- "react": ">=19.0.0",
53
- "react-dom": ">=19.0.0"
54
- },
55
- "dependencies": {
46
+ "vitest-browser-react": "^1.0.1",
56
47
  "fast-deep-equal": "3.1.3",
57
48
  "@electric-sql/pglite": "0.3.15",
58
49
  "@tanstack/react-query": "^5.49.2",
@@ -63,16 +54,22 @@
63
54
  "luxon": "^3.6.1",
64
55
  "lz-string": "^1.5.0",
65
56
  "slug": "^11.0.0",
66
- "@powerhousedao/analytics-engine-browser": "6.0.0-dev.65",
67
- "@renown/sdk": "6.0.0-dev.65",
68
- "@powerhousedao/analytics-engine-core": "6.0.0-dev.65",
69
- "document-drive": "6.0.0-dev.65",
70
- "@powerhousedao/reactor": "6.0.0-dev.65",
71
- "document-model": "6.0.0-dev.65"
57
+ "@powerhousedao/analytics-engine-core": "6.0.0-dev.67",
58
+ "@powerhousedao/reactor": "6.0.0-dev.67",
59
+ "@powerhousedao/analytics-engine-browser": "6.0.0-dev.67",
60
+ "@renown/sdk": "6.0.0-dev.67",
61
+ "document-drive": "6.0.0-dev.67",
62
+ "document-model": "6.0.0-dev.67"
63
+ },
64
+ "peerDependencies": {
65
+ "react": ">=19.0.0",
66
+ "react-dom": ">=19.0.0",
67
+ "@electric-sql/pglite": ">=0.3.0"
72
68
  },
73
69
  "scripts": {
74
70
  "tsc": "tsc",
75
71
  "lint": "eslint",
72
+ "build:bundle": "bun run ./bundle.ts",
76
73
  "test:browser": "vitest --run",
77
74
  "install:playwright": "playwright install"
78
75
  }
@@ -1,51 +0,0 @@
1
- import { logger } from "document-drive";
2
- import { queueActions } from "./queue.js";
3
- import { makeSignedActionsWithContext } from "./sign.js";
4
- async function getDocument(documentId) {
5
- try {
6
- return await window.ph?.reactorClient?.get(documentId);
7
- }
8
- catch (error) {
9
- logger.debug(`Failed to get document with id ${documentId}:`, error);
10
- return undefined;
11
- }
12
- }
13
- function getActionErrors(result, actions) {
14
- return actions.reduce((errors, a) => {
15
- const scopeOperations = result.operations[a.scope];
16
- if (!scopeOperations) {
17
- return errors;
18
- }
19
- const op = scopeOperations.findLast((op) => op.action.id === a.id);
20
- if (op?.error) {
21
- errors.push(new Error(op.error));
22
- }
23
- return errors;
24
- }, new Array());
25
- }
26
- export async function dispatchActions(actionOrActions, documentOrDocumentId, onErrors, onSuccess) {
27
- const document = typeof documentOrDocumentId === "string"
28
- ? await getDocument(documentOrDocumentId)
29
- : documentOrDocumentId;
30
- if (!document) {
31
- logger.error(`Document with id ${JSON.stringify(documentOrDocumentId)} not found`);
32
- return;
33
- }
34
- const signedActionsWithContext = await makeSignedActionsWithContext(actionOrActions, document);
35
- if (!signedActionsWithContext) {
36
- logger.error("No signed actions with context found");
37
- return;
38
- }
39
- const result = await queueActions(document, signedActionsWithContext);
40
- if (onErrors && result) {
41
- const errors = getActionErrors(result, signedActionsWithContext);
42
- if (errors.length) {
43
- onErrors(errors);
44
- }
45
- }
46
- if (onSuccess && result) {
47
- onSuccess(result);
48
- }
49
- return result;
50
- }
51
- //# sourceMappingURL=dispatch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../src/actions/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAEzD,KAAK,UAAU,WAAW,CACxB,UAAkB;IAElB,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB,EAAE,OAAiB;IAC5D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,IAAI,KAAK,EAAS,CAAC,CAAC;AACzB,CAAC;AA4BD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,eAA8C,EAC9C,oBAAqD,EACrD,QAAoC,EACpC,SAAwC;IAExC,MAAM,QAAQ,GACZ,OAAO,oBAAoB,KAAK,QAAQ;QACtC,CAAC,CAAC,MAAM,WAAW,CAAC,oBAAoB,CAAC;QACzC,CAAC,CAAC,oBAAoB,CAAC;IAE3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CACV,oBAAoB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,YAAY,CACrE,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,wBAAwB,GAAG,MAAM,4BAA4B,CACjE,eAAe,EACf,QAAQ,CACT,CAAC;IACF,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAEtE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,497 +0,0 @@
1
- import { addFolder as baseAddFolder, copyNode as baseCopyNode, deleteNode as baseDeleteNode, updateFile as baseUpdateFile, generateNodesCopy, handleTargetNameCollisions, isFileNode, isFolderNode, logger, updateNode, } from "document-drive";
2
- import { documentModelDocumentType } from "document-model";
3
- import { baseLoadFromInput, baseSaveToFileHandle, createPresignedHeader, createZip, generateId, replayDocument, } from "document-model/core";
4
- import { UnsupportedDocumentTypeError } from "../errors.js";
5
- import { isDocumentTypeSupported } from "../utils/documents.js";
6
- import { getUserPermissions } from "../utils/user.js";
7
- import { queueActions, queueOperations, uploadOperations } from "./queue.js";
8
- async function isDocumentInLocation(document, driveId, parentFolder) {
9
- const reactorClient = window.ph?.reactorClient;
10
- if (!reactorClient) {
11
- return { isDuplicate: false };
12
- }
13
- // Get the drive and check its nodes
14
- let drive;
15
- try {
16
- drive = await reactorClient.get(driveId);
17
- }
18
- catch {
19
- return { isDuplicate: false };
20
- }
21
- // Case 1: Check for duplicate by ID
22
- const nodeById = drive.state.global.nodes.find((node) => node.id === document.header.id);
23
- if (nodeById && nodeById.parentFolder === (parentFolder ?? null)) {
24
- return {
25
- isDuplicate: true,
26
- duplicateType: "id",
27
- nodeId: nodeById.id,
28
- };
29
- }
30
- // Case 2: Check for duplicate by name + type in same parent folder
31
- const nodeByNameAndType = drive.state.global.nodes.find((node) => isFileNode(node) &&
32
- node.name === document.header.name &&
33
- node.documentType === document.header.documentType &&
34
- node.parentFolder === (parentFolder ?? null));
35
- if (nodeByNameAndType) {
36
- return {
37
- isDuplicate: true,
38
- duplicateType: "name",
39
- nodeId: nodeByNameAndType.id,
40
- };
41
- }
42
- return { isDuplicate: false };
43
- }
44
- function getDocumentTypeIcon(document) {
45
- const documentType = document.header.documentType;
46
- switch (documentType) {
47
- case "powerhouse/document-model":
48
- return "document-model";
49
- case "powerhouse/app":
50
- return "app";
51
- case "powerhouse/document-editor":
52
- return "editor";
53
- case "powerhouse/subgraph":
54
- return "subgraph";
55
- case "powerhouse/package":
56
- return "package";
57
- case "powerhouse/processor": {
58
- // Check the processor type from global state (safely)
59
- const globalState = document.state
60
- .global;
61
- const processorType = globalState?.type;
62
- if (processorType === "analytics")
63
- return "analytics-processor";
64
- if (processorType === "relational")
65
- return "relational-processor";
66
- if (processorType === "codegen")
67
- return "codegen-processor";
68
- return undefined;
69
- }
70
- default:
71
- return undefined;
72
- }
73
- }
74
- export function downloadFile(document, fileName) {
75
- const zip = createZip(document);
76
- zip
77
- .generateAsync({ type: "blob" })
78
- .then((blob) => {
79
- const link = window.document.createElement("a");
80
- link.style.display = "none";
81
- link.href = URL.createObjectURL(blob);
82
- link.download = fileName;
83
- window.document.body.appendChild(link);
84
- link.click();
85
- window.document.body.removeChild(link);
86
- })
87
- .catch(logger.error);
88
- }
89
- async function getDocumentExtension(document) {
90
- const documentType = document.header.documentType;
91
- // DocumentModel definitions always use "phdm"
92
- if (documentType === documentModelDocumentType) {
93
- return "phdm";
94
- }
95
- let rawExtension;
96
- const reactorClient = window.ph?.reactorClient;
97
- if (reactorClient) {
98
- const { results: documentModelModules } = await reactorClient.getDocumentModelModules();
99
- const module = documentModelModules.find((m) => m.documentModel.global.id === documentType);
100
- rawExtension = module?.utils.fileExtension;
101
- }
102
- // Clean the extension (remove leading/trailing dots) and fallback to "phdm"
103
- const cleanExtension = (rawExtension ?? "phdm").replace(/^\.+|\.+$/g, "");
104
- return cleanExtension || "phdm";
105
- }
106
- export async function exportFile(document, suggestedName) {
107
- if (!window.ph?.reactorClient) {
108
- throw new Error("ReactorClient not initialized");
109
- }
110
- // Get the extension from the document model module
111
- const extension = await getDocumentExtension(document);
112
- const name = `${suggestedName || document.header.name || "Untitled"}.${extension}.phd`;
113
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
114
- if (!window.showSaveFilePicker) {
115
- return downloadFile(document, name);
116
- }
117
- try {
118
- const fileHandle = await window.showSaveFilePicker({
119
- suggestedName: name,
120
- });
121
- await baseSaveToFileHandle(document, fileHandle);
122
- return fileHandle;
123
- }
124
- catch (e) {
125
- // ignores error if user cancelled the file picker
126
- if (!(e instanceof DOMException && e.name === "AbortError")) {
127
- throw e;
128
- }
129
- }
130
- }
131
- export async function loadFile(path) {
132
- const baseDocument = await baseLoadFromInput(path, (state) => state, { checkHashes: true });
133
- const reactorClient = window.ph?.reactorClient;
134
- if (!reactorClient) {
135
- throw new Error("ReactorClient not initialized");
136
- }
137
- const { results: documentModelModules } = await reactorClient.getDocumentModelModules();
138
- const documentModelModule = documentModelModules.find((module) => module.documentModel.global.id === baseDocument.header.documentType);
139
- if (!documentModelModule) {
140
- throw new Error(`Document "${baseDocument.header.documentType}" is not supported`);
141
- }
142
- return documentModelModule.utils.loadFromInput(path);
143
- }
144
- export async function addDocument(driveId, name, documentType, parentFolder, document, id, preferredEditor) {
145
- const { isAllowedToCreateDocuments } = getUserPermissions();
146
- if (!isAllowedToCreateDocuments) {
147
- throw new Error("User is not allowed to create documents");
148
- }
149
- const reactorClient = window.ph?.reactorClient;
150
- if (!reactorClient) {
151
- throw new Error("ReactorClient not initialized");
152
- }
153
- // get the module
154
- const documentModelModule = await reactorClient.getDocumentModelModule(documentType);
155
- // create - use passed document's state if available
156
- const newDocument = documentModelModule.utils.createDocument({
157
- ...document?.state,
158
- });
159
- newDocument.header.name = name;
160
- // Create document using ReactorClient
161
- let newDoc;
162
- try {
163
- newDoc = await reactorClient.createDocumentInDrive(driveId, newDocument, parentFolder);
164
- }
165
- catch (e) {
166
- logger.error("Error adding document", e);
167
- throw new Error("There was an error adding document");
168
- }
169
- // Return a file node structure for compatibility
170
- return {
171
- id: newDoc.header.id,
172
- name: newDoc.header.name,
173
- documentType,
174
- parentFolder: parentFolder ?? null,
175
- kind: "file",
176
- };
177
- }
178
- export async function addFile(file, driveId, name, parentFolder) {
179
- logger.verbose(`addFile(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);
180
- const { isAllowedToCreateDocuments } = getUserPermissions();
181
- if (!isAllowedToCreateDocuments) {
182
- throw new Error("User is not allowed to create files");
183
- }
184
- const document = await loadFile(file);
185
- let duplicateId = false;
186
- const reactorClient = window.ph?.reactorClient;
187
- if (!reactorClient) {
188
- throw new Error("ReactorClient not initialized");
189
- }
190
- try {
191
- await reactorClient.get(document.header.id);
192
- duplicateId = true;
193
- }
194
- catch {
195
- // document id not found
196
- }
197
- const documentId = duplicateId ? generateId() : document.header.id;
198
- const header = createPresignedHeader(documentId, document.header.documentType);
199
- header.lastModifiedAtUtcIso = document.header.createdAtUtcIso;
200
- header.meta = document.header.meta;
201
- header.name = name || document.header.name;
202
- // copy the document at it's initial state
203
- const initialDocument = {
204
- ...document,
205
- header,
206
- state: document.initialState,
207
- operations: Object.keys(document.operations).reduce((acc, key) => {
208
- acc[key] = [];
209
- return acc;
210
- }, {}),
211
- };
212
- await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);
213
- // then add all the operations in chunks
214
- uploadOperations(documentId, document.operations, queueOperations).catch((error) => {
215
- throw error;
216
- });
217
- }
218
- export async function addFileWithProgress(file, driveId, name, parentFolder, onProgress, documentTypes, resolveConflict) {
219
- logger.verbose(`addFileWithProgress(drive: ${driveId}, name: ${name}, folder: ${parentFolder})`);
220
- const reactor = window.ph?.reactorClient;
221
- if (!reactor) {
222
- return;
223
- }
224
- const { isAllowedToCreateDocuments } = getUserPermissions();
225
- if (!isAllowedToCreateDocuments) {
226
- throw new Error("User is not allowed to create files");
227
- }
228
- // Loading stage (0-10%)
229
- try {
230
- onProgress?.({ stage: "loading", progress: 0 });
231
- const document = await loadFile(file);
232
- // Check for duplicate in same location
233
- const duplicateCheck = await isDocumentInLocation(document, driveId, parentFolder);
234
- if (duplicateCheck.isDuplicate && !resolveConflict) {
235
- // Report conflict and return early
236
- onProgress?.({
237
- stage: "conflict",
238
- progress: 0,
239
- duplicateType: duplicateCheck.duplicateType,
240
- });
241
- return undefined;
242
- }
243
- // Handle replace resolution by deleting the existing document
244
- if (duplicateCheck.isDuplicate &&
245
- resolveConflict === "replace" &&
246
- duplicateCheck.nodeId) {
247
- await deleteNode(driveId, duplicateCheck.nodeId);
248
- }
249
- // For "duplicate" resolution, we continue normally which creates a new document
250
- // with a different ID (the default behavior)
251
- // Send documentType info immediately after loading
252
- const documentType = getDocumentTypeIcon(document);
253
- if (documentType) {
254
- onProgress?.({ stage: "loading", progress: 10, documentType });
255
- }
256
- else {
257
- onProgress?.({ stage: "loading", progress: 10 });
258
- }
259
- if (!isDocumentTypeSupported(document.header.documentType, documentTypes)) {
260
- onProgress?.({
261
- stage: "unsupported-document-type",
262
- progress: 100,
263
- error: `Document type ${document.header.documentType} is not supported`,
264
- });
265
- throw new UnsupportedDocumentTypeError(document.header.documentType);
266
- }
267
- // ensure we have the module + can load it (throws if not found)
268
- await reactor.getDocumentModelModule(document.header.documentType);
269
- // Initializing stage (10-20%)
270
- onProgress?.({ stage: "initializing", progress: 10 });
271
- let duplicateId = false;
272
- try {
273
- await reactor.get(document.header.id);
274
- duplicateId = true;
275
- }
276
- catch {
277
- // document id not found
278
- }
279
- const documentId = duplicateId ? generateId() : document.header.id;
280
- const header = createPresignedHeader(documentId, document.header.documentType);
281
- header.lastModifiedAtUtcIso = document.header.createdAtUtcIso;
282
- header.meta = document.header.meta;
283
- header.name = name || document.header.name;
284
- // copy the document at it's initial state
285
- const initialDocument = {
286
- ...document,
287
- header,
288
- state: document.initialState,
289
- operations: Object.keys(document.operations).reduce((acc, key) => {
290
- acc[key] = [];
291
- return acc;
292
- }, {}),
293
- };
294
- const fileNode = await addDocument(driveId, name || document.header.name, document.header.documentType, parentFolder, initialDocument, documentId, document.header.meta?.preferredEditor);
295
- if (!fileNode) {
296
- throw new Error("There was an error adding file");
297
- }
298
- onProgress?.({ stage: "initializing", progress: 20 });
299
- // Uploading stage (20-100%)
300
- await uploadOperations(documentId, document.operations, queueOperations, {
301
- onProgress: (uploadProgress) => {
302
- if (uploadProgress.totalOperations &&
303
- uploadProgress.uploadedOperations !== undefined) {
304
- const uploadPercent = uploadProgress.totalOperations > 0
305
- ? uploadProgress.uploadedOperations /
306
- uploadProgress.totalOperations
307
- : 0;
308
- const overallProgress = 20 + Math.round(uploadPercent * 80);
309
- onProgress?.({
310
- stage: "uploading",
311
- progress: overallProgress,
312
- totalOperations: uploadProgress.totalOperations,
313
- uploadedOperations: uploadProgress.uploadedOperations,
314
- });
315
- }
316
- },
317
- });
318
- onProgress?.({ stage: "complete", progress: 100 });
319
- return fileNode;
320
- }
321
- catch (error) {
322
- // Don't override unsupported-document-type status
323
- if (!UnsupportedDocumentTypeError.isError(error)) {
324
- const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
325
- onProgress?.({
326
- stage: "failed",
327
- progress: 100,
328
- error: errorMessage,
329
- });
330
- }
331
- throw error;
332
- }
333
- }
334
- export async function updateFile(driveId, nodeId, documentType, name, parentFolder) {
335
- const reactor = window.ph?.reactorClient;
336
- if (!reactor) {
337
- return;
338
- }
339
- const { isAllowedToCreateDocuments } = getUserPermissions();
340
- if (!isAllowedToCreateDocuments) {
341
- throw new Error("User is not allowed to update files");
342
- }
343
- const drive = await reactor.get(driveId);
344
- const unsafeCastAsDrive = (await queueActions(drive, baseUpdateFile({
345
- id: nodeId,
346
- name: name ?? undefined,
347
- parentFolder,
348
- documentType,
349
- })));
350
- const node = unsafeCastAsDrive.state.global.nodes.find((node) => node.id === nodeId);
351
- if (!node || !isFileNode(node)) {
352
- throw new Error("There was an error updating document");
353
- }
354
- return node;
355
- }
356
- export async function addFolder(driveId, name, parentFolder) {
357
- const { isAllowedToCreateDocuments } = getUserPermissions();
358
- if (!isAllowedToCreateDocuments) {
359
- throw new Error("User is not allowed to create folders");
360
- }
361
- const reactorClient = window.ph?.reactorClient;
362
- if (!reactorClient) {
363
- throw new Error("ReactorClient not initialized");
364
- }
365
- // Get the drive document and add folder action
366
- const drive = await reactorClient.get(driveId);
367
- const folderId = generateId();
368
- const updatedDrive = await reactorClient.execute(driveId, "main", [
369
- baseAddFolder({
370
- id: folderId,
371
- name,
372
- parentFolder,
373
- }),
374
- ]);
375
- const node = updatedDrive.state.global.nodes.find((node) => node.id === folderId);
376
- if (!node || !isFolderNode(node)) {
377
- throw new Error("There was an error adding folder");
378
- }
379
- return node;
380
- }
381
- export async function deleteNode(driveId, nodeId) {
382
- const { isAllowedToCreateDocuments } = getUserPermissions();
383
- if (!isAllowedToCreateDocuments) {
384
- throw new Error("User is not allowed to delete documents");
385
- }
386
- const reactorClient = window.ph?.reactorClient;
387
- if (!reactorClient) {
388
- throw new Error("ReactorClient not initialized");
389
- }
390
- // delete the node in the drive document
391
- await reactorClient.execute(driveId, "main", [
392
- baseDeleteNode({ id: nodeId }),
393
- ]);
394
- // now delete the document
395
- await reactorClient.deleteDocument(nodeId);
396
- }
397
- export async function renameNode(driveId, nodeId, name) {
398
- const { isAllowedToCreateDocuments } = getUserPermissions();
399
- if (!isAllowedToCreateDocuments) {
400
- throw new Error("User is not allowed to rename documents");
401
- }
402
- const reactorClient = window.ph?.reactorClient;
403
- if (!reactorClient) {
404
- throw new Error("ReactorClient not initialized");
405
- }
406
- // Rename the node in the drive document using updateNode action
407
- const drive = await reactorClient.execute(driveId, "main", [updateNode({ id: nodeId, name })]);
408
- const node = drive.state.global.nodes.find((n) => n.id === nodeId);
409
- if (!node) {
410
- throw new Error("There was an error renaming node");
411
- }
412
- return node;
413
- }
414
- export async function renameDriveNode(driveId, nodeId, name) {
415
- const { isAllowedToCreateDocuments } = getUserPermissions();
416
- if (!isAllowedToCreateDocuments) {
417
- throw new Error("User is not allowed to rename documents");
418
- }
419
- const reactorClient = window.ph?.reactorClient;
420
- if (!reactorClient) {
421
- throw new Error("ReactorClient not initialized");
422
- }
423
- await reactorClient.execute(driveId, "main", [
424
- updateNode({ id: nodeId, name }),
425
- ]);
426
- const drive = await reactorClient.get(driveId);
427
- return drive.state.global.nodes.find((n) => n.id === nodeId);
428
- }
429
- export async function moveNode(driveId, src, target) {
430
- const { isAllowedToCreateDocuments } = getUserPermissions();
431
- if (!isAllowedToCreateDocuments) {
432
- throw new Error("User is not allowed to move documents");
433
- }
434
- const reactorClient = window.ph?.reactorClient;
435
- if (!reactorClient) {
436
- throw new Error("ReactorClient not initialized");
437
- }
438
- // Get current parent folder from source node
439
- const sourceParent = src.parentFolder ?? driveId;
440
- const targetParent = target?.id ?? driveId;
441
- return await reactorClient.moveChildren(sourceParent, targetParent, [src.id]);
442
- }
443
- async function _duplicateDocument(reactor, document, newId = generateId()) {
444
- const documentModule = await reactor.getDocumentModelModule(document.header.documentType);
445
- return replayDocument(document.initialState, document.operations, documentModule.reducer, createPresignedHeader(newId, document.header.documentType));
446
- }
447
- export async function copyNode(driveId, src, target) {
448
- const reactor = window.ph?.reactorClient;
449
- if (!reactor) {
450
- return;
451
- }
452
- const { isAllowedToCreateDocuments } = getUserPermissions();
453
- if (!isAllowedToCreateDocuments) {
454
- throw new Error("User is not allowed to copy documents");
455
- }
456
- const drive = await reactor.get(driveId);
457
- const copyNodesInput = generateNodesCopy({
458
- srcId: src.id,
459
- targetParentFolder: target?.id,
460
- targetName: src.name,
461
- }, () => generateId(), drive.state.global.nodes);
462
- // Pre-calculate collision-resolved names for all nodes to be copied
463
- const resolvedNamesMap = new Map();
464
- for (const copyNodeInput of copyNodesInput) {
465
- const node = drive.state.global.nodes.find((n) => n.id === copyNodeInput.srcId);
466
- if (node) {
467
- const resolvedName = handleTargetNameCollisions({
468
- nodes: drive.state.global.nodes,
469
- srcName: copyNodeInput.targetName || node.name,
470
- targetParentFolder: copyNodeInput.targetParentFolder || null,
471
- });
472
- resolvedNamesMap.set(copyNodeInput.targetId, resolvedName);
473
- }
474
- }
475
- const fileNodesToCopy = copyNodesInput.filter((copyNodeInput) => {
476
- const node = drive.state.global.nodes.find((node) => node.id === copyNodeInput.srcId);
477
- return node !== undefined && isFileNode(node);
478
- });
479
- for (const fileNodeToCopy of fileNodesToCopy) {
480
- try {
481
- const document = await reactor.get(fileNodeToCopy.srcId);
482
- const duplicatedDocument = await _duplicateDocument(reactor, document, fileNodeToCopy.targetId);
483
- // Set the header name to match the collision-resolved node name
484
- const resolvedName = resolvedNamesMap.get(fileNodeToCopy.targetId);
485
- if (resolvedName) {
486
- duplicatedDocument.header.name = resolvedName;
487
- }
488
- await reactor.createDocumentInDrive(driveId, duplicatedDocument, target?.id);
489
- }
490
- catch (e) {
491
- logger.error(`Error copying document ${fileNodeToCopy.srcId}: ${String(e)}`);
492
- }
493
- }
494
- const copyActions = copyNodesInput.map((copyNodeInput) => baseCopyNode(copyNodeInput));
495
- return await queueActions(drive, copyActions);
496
- }
497
- //# sourceMappingURL=document.js.map