document-drive 1.19.1 → 1.20.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 (252) hide show
  1. package/README.md +4 -0
  2. package/dist/index.d.ts +28 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +18 -0
  5. package/dist/src/cache/memory.d.ts +10 -0
  6. package/dist/src/cache/memory.d.ts.map +1 -0
  7. package/dist/src/cache/memory.js +26 -0
  8. package/dist/src/cache/redis.d.ts +14 -0
  9. package/dist/src/cache/redis.d.ts.map +1 -0
  10. package/dist/src/cache/redis.js +40 -0
  11. package/dist/src/cache/types.d.ts +7 -0
  12. package/dist/src/cache/types.d.ts.map +1 -0
  13. package/dist/src/cache/types.js +1 -0
  14. package/dist/src/drive-document-model/constants.d.ts +2 -0
  15. package/dist/src/drive-document-model/constants.d.ts.map +1 -0
  16. package/dist/src/drive-document-model/constants.js +1 -0
  17. package/dist/src/drive-document-model/gen/actions.d.ts +7 -0
  18. package/dist/src/drive-document-model/gen/actions.d.ts.map +1 -0
  19. package/dist/src/drive-document-model/gen/actions.js +2 -0
  20. package/dist/src/drive-document-model/gen/constants.d.ts +7 -0
  21. package/dist/src/drive-document-model/gen/constants.d.ts.map +1 -0
  22. package/dist/src/drive-document-model/gen/constants.js +16 -0
  23. package/dist/src/drive-document-model/gen/creators.d.ts +3 -0
  24. package/dist/src/drive-document-model/gen/creators.d.ts.map +1 -0
  25. package/dist/src/drive-document-model/gen/creators.js +2 -0
  26. package/dist/src/drive-document-model/gen/document-model.d.ts +3 -0
  27. package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -0
  28. package/dist/src/drive-document-model/gen/document-model.js +210 -0
  29. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -0
  30. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -0
  31. package/dist/src/drive-document-model/gen/drive/actions.js +1 -0
  32. package/dist/src/drive-document-model/gen/drive/creators.d.ts +11 -0
  33. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -0
  34. package/dist/src/drive-document-model/gen/drive/creators.js +10 -0
  35. package/dist/src/drive-document-model/gen/drive/error.d.ts +2 -0
  36. package/dist/src/drive-document-model/gen/drive/error.d.ts.map +1 -0
  37. package/dist/src/drive-document-model/gen/drive/error.js +1 -0
  38. package/dist/src/drive-document-model/gen/drive/object.d.ts +14 -0
  39. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +1 -0
  40. package/dist/src/drive-document-model/gen/drive/object.js +28 -0
  41. package/dist/src/drive-document-model/gen/drive/operations.d.ts +14 -0
  42. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +1 -0
  43. package/dist/src/drive-document-model/gen/drive/operations.js +1 -0
  44. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -0
  45. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -0
  46. package/dist/src/drive-document-model/gen/node/actions.js +1 -0
  47. package/dist/src/drive-document-model/gen/node/creators.d.ts +10 -0
  48. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -0
  49. package/dist/src/drive-document-model/gen/node/creators.js +9 -0
  50. package/dist/src/drive-document-model/gen/node/error.d.ts +2 -0
  51. package/dist/src/drive-document-model/gen/node/error.d.ts.map +1 -0
  52. package/dist/src/drive-document-model/gen/node/error.js +1 -0
  53. package/dist/src/drive-document-model/gen/node/object.d.ts +13 -0
  54. package/dist/src/drive-document-model/gen/node/object.d.ts.map +1 -0
  55. package/dist/src/drive-document-model/gen/node/object.js +25 -0
  56. package/dist/src/drive-document-model/gen/node/operations.d.ts +13 -0
  57. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +1 -0
  58. package/dist/src/drive-document-model/gen/node/operations.js +1 -0
  59. package/dist/src/drive-document-model/gen/object.d.ts +21 -0
  60. package/dist/src/drive-document-model/gen/object.d.ts.map +1 -0
  61. package/dist/src/drive-document-model/gen/object.js +28 -0
  62. package/dist/src/drive-document-model/gen/reducer.d.ts +4 -0
  63. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -0
  64. package/dist/src/drive-document-model/gen/reducer.js +74 -0
  65. package/dist/src/drive-document-model/gen/schema/types.d.ts +176 -0
  66. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -0
  67. package/dist/src/drive-document-model/gen/schema/types.js +1 -0
  68. package/dist/src/drive-document-model/gen/schema/zod.d.ts +87 -0
  69. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -0
  70. package/dist/src/drive-document-model/gen/schema/zod.js +203 -0
  71. package/dist/src/drive-document-model/gen/types.d.ts +9 -0
  72. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -0
  73. package/dist/src/drive-document-model/gen/types.js +1 -0
  74. package/dist/src/drive-document-model/gen/utils.d.ts +10 -0
  75. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -0
  76. package/dist/src/drive-document-model/gen/utils.js +27 -0
  77. package/dist/src/drive-document-model/index.d.ts +2 -0
  78. package/dist/src/drive-document-model/index.d.ts.map +1 -0
  79. package/dist/src/drive-document-model/index.js +1 -0
  80. package/dist/src/drive-document-model/module.d.ts +3 -0
  81. package/dist/src/drive-document-model/module.d.ts.map +1 -0
  82. package/dist/src/drive-document-model/module.js +12 -0
  83. package/dist/src/drive-document-model/src/reducers/drive.d.ts +8 -0
  84. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -0
  85. package/dist/src/drive-document-model/src/reducers/drive.js +37 -0
  86. package/dist/src/drive-document-model/src/reducers/node.d.ts +8 -0
  87. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -0
  88. package/dist/src/drive-document-model/src/reducers/node.js +185 -0
  89. package/dist/src/drive-document-model/src/utils.d.ts +34 -0
  90. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -0
  91. package/dist/src/drive-document-model/src/utils.js +146 -0
  92. package/dist/src/queue/base.d.ts +43 -0
  93. package/dist/src/queue/base.d.ts.map +1 -0
  94. package/dist/src/queue/base.js +241 -0
  95. package/dist/src/queue/redis.d.ts +28 -0
  96. package/dist/src/queue/redis.d.ts.map +1 -0
  97. package/dist/src/queue/redis.js +110 -0
  98. package/dist/src/queue/types.d.ts +55 -0
  99. package/dist/src/queue/types.d.ts.map +1 -0
  100. package/dist/src/queue/types.js +6 -0
  101. package/dist/src/read-mode/errors.d.ts +12 -0
  102. package/dist/src/read-mode/errors.d.ts.map +1 -0
  103. package/dist/src/read-mode/errors.js +17 -0
  104. package/dist/src/read-mode/server.d.ts +4 -0
  105. package/dist/src/read-mode/server.d.ts.map +1 -0
  106. package/dist/src/read-mode/server.js +78 -0
  107. package/dist/src/read-mode/service.d.ts +18 -0
  108. package/dist/src/read-mode/service.d.ts.map +1 -0
  109. package/dist/src/read-mode/service.js +112 -0
  110. package/dist/src/read-mode/types.d.ts +35 -0
  111. package/dist/src/read-mode/types.d.ts.map +1 -0
  112. package/dist/src/read-mode/types.js +1 -0
  113. package/dist/src/server/base-server.d.ts +112 -0
  114. package/dist/src/server/base-server.d.ts.map +1 -0
  115. package/dist/src/server/base-server.js +1280 -0
  116. package/dist/src/server/builder.d.ts +30 -0
  117. package/dist/src/server/builder.d.ts.map +1 -0
  118. package/dist/src/server/builder.js +89 -0
  119. package/dist/src/server/constants.d.ts +2 -0
  120. package/dist/src/server/constants.d.ts.map +1 -0
  121. package/dist/src/server/constants.js +1 -0
  122. package/dist/src/server/error.d.ts +30 -0
  123. package/dist/src/server/error.d.ts.map +1 -0
  124. package/dist/src/server/error.js +47 -0
  125. package/dist/src/server/event-emitter.d.ts +8 -0
  126. package/dist/src/server/event-emitter.d.ts.map +1 -0
  127. package/dist/src/server/event-emitter.js +10 -0
  128. package/dist/src/server/listener/index.d.ts +2 -0
  129. package/dist/src/server/listener/index.d.ts.map +1 -0
  130. package/dist/src/server/listener/index.js +1 -0
  131. package/dist/src/server/listener/listener-manager.d.ts +27 -0
  132. package/dist/src/server/listener/listener-manager.d.ts.map +1 -0
  133. package/dist/src/server/listener/listener-manager.js +401 -0
  134. package/dist/src/server/listener/transmitter/factory.d.ts +8 -0
  135. package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -0
  136. package/dist/src/server/listener/transmitter/factory.js +25 -0
  137. package/dist/src/server/listener/transmitter/internal.d.ts +34 -0
  138. package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -0
  139. package/dist/src/server/listener/transmitter/internal.js +87 -0
  140. package/dist/src/server/listener/transmitter/pull-responder.d.ts +38 -0
  141. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -0
  142. package/dist/src/server/listener/transmitter/pull-responder.js +256 -0
  143. package/dist/src/server/listener/transmitter/switchboard-push.d.ts +9 -0
  144. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -0
  145. package/dist/src/server/listener/transmitter/switchboard-push.js +77 -0
  146. package/dist/src/server/listener/transmitter/types.d.ts +20 -0
  147. package/dist/src/server/listener/transmitter/types.d.ts.map +1 -0
  148. package/dist/src/server/listener/transmitter/types.js +1 -0
  149. package/dist/src/server/listener/util.d.ts +2 -0
  150. package/dist/src/server/listener/util.d.ts.map +1 -0
  151. package/dist/src/server/listener/util.js +22 -0
  152. package/dist/src/server/sync-manager.d.ts +30 -0
  153. package/dist/src/server/sync-manager.d.ts.map +1 -0
  154. package/dist/src/server/sync-manager.js +287 -0
  155. package/dist/src/server/types.d.ts +308 -0
  156. package/dist/src/server/types.d.ts.map +1 -0
  157. package/dist/src/server/types.js +12 -0
  158. package/dist/src/server/utils.d.ts +8 -0
  159. package/dist/src/server/utils.d.ts.map +1 -0
  160. package/dist/src/server/utils.js +47 -0
  161. package/dist/src/storage/base.d.ts +36 -0
  162. package/dist/src/storage/base.d.ts.map +1 -0
  163. package/dist/src/storage/base.js +4 -0
  164. package/dist/src/storage/browser.d.ts +36 -0
  165. package/dist/src/storage/browser.d.ts.map +1 -0
  166. package/dist/src/storage/browser.js +155 -0
  167. package/dist/src/storage/filesystem.d.ts +33 -0
  168. package/dist/src/storage/filesystem.d.ts.map +1 -0
  169. package/dist/src/storage/filesystem.js +197 -0
  170. package/dist/src/storage/memory.d.ts +33 -0
  171. package/dist/src/storage/memory.d.ts.map +1 -0
  172. package/dist/src/storage/memory.js +139 -0
  173. package/dist/src/storage/prisma.d.ts +67 -0
  174. package/dist/src/storage/prisma.d.ts.map +1 -0
  175. package/dist/src/storage/prisma.js +445 -0
  176. package/dist/src/storage/sequelize.d.ts +32 -0
  177. package/dist/src/storage/sequelize.d.ts.map +1 -0
  178. package/dist/src/storage/sequelize.js +373 -0
  179. package/dist/src/storage/types.d.ts +43 -0
  180. package/dist/src/storage/types.d.ts.map +1 -0
  181. package/dist/src/storage/types.js +1 -0
  182. package/dist/src/utils/default-drives-manager.d.ts +29 -0
  183. package/dist/src/utils/default-drives-manager.d.ts.map +1 -0
  184. package/dist/src/utils/default-drives-manager.js +208 -0
  185. package/dist/src/utils/graphql.d.ts +34 -0
  186. package/dist/src/utils/graphql.d.ts.map +1 -0
  187. package/dist/src/utils/graphql.js +183 -0
  188. package/dist/src/utils/logger.d.ts +27 -0
  189. package/dist/src/utils/logger.d.ts.map +1 -0
  190. package/dist/src/utils/logger.js +105 -0
  191. package/dist/src/utils/migrations.d.ts +4 -0
  192. package/dist/src/utils/migrations.d.ts.map +1 -0
  193. package/dist/src/utils/migrations.js +41 -0
  194. package/dist/src/utils/misc.d.ts +11 -0
  195. package/dist/src/utils/misc.d.ts.map +1 -0
  196. package/dist/src/utils/misc.js +43 -0
  197. package/dist/src/utils/run-asap.d.ts +12 -0
  198. package/dist/src/utils/run-asap.d.ts.map +1 -0
  199. package/dist/src/utils/run-asap.js +131 -0
  200. package/dist/test/document-helpers/utils.d.ts +8 -0
  201. package/dist/test/document-helpers/utils.d.ts.map +1 -0
  202. package/dist/test/document-helpers/utils.js +21 -0
  203. package/dist/test/utils.d.ts +48 -0
  204. package/dist/test/utils.d.ts.map +1 -0
  205. package/dist/test/utils.js +132 -0
  206. package/dist/test/vitest-setup.d.ts +2 -0
  207. package/dist/test/vitest-setup.d.ts.map +1 -0
  208. package/dist/test/vitest-setup.js +4 -0
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/dist/vitest.config.d.ts +3 -0
  211. package/dist/vitest.config.d.ts.map +1 -0
  212. package/dist/vitest.config.js +20 -0
  213. package/package.json +20 -38
  214. package/src/cache/index.ts +0 -2
  215. package/src/cache/memory.ts +0 -33
  216. package/src/cache/redis.ts +0 -56
  217. package/src/cache/types.ts +0 -9
  218. package/src/index.ts +0 -4
  219. package/src/queue/base.ts +0 -320
  220. package/src/queue/index.ts +0 -2
  221. package/src/queue/redis.ts +0 -144
  222. package/src/queue/types.ts +0 -79
  223. package/src/read-mode/errors.ts +0 -19
  224. package/src/read-mode/index.ts +0 -125
  225. package/src/read-mode/service.ts +0 -207
  226. package/src/read-mode/types.ts +0 -108
  227. package/src/server/error.ts +0 -70
  228. package/src/server/index.ts +0 -2444
  229. package/src/server/listener/index.ts +0 -2
  230. package/src/server/listener/manager.ts +0 -652
  231. package/src/server/listener/transmitter/index.ts +0 -4
  232. package/src/server/listener/transmitter/internal.ts +0 -143
  233. package/src/server/listener/transmitter/pull-responder.ts +0 -462
  234. package/src/server/listener/transmitter/switchboard-push.ts +0 -125
  235. package/src/server/listener/transmitter/types.ts +0 -27
  236. package/src/server/types.ts +0 -596
  237. package/src/server/utils.ts +0 -82
  238. package/src/storage/base.ts +0 -81
  239. package/src/storage/browser.ts +0 -238
  240. package/src/storage/filesystem.ts +0 -297
  241. package/src/storage/index.ts +0 -2
  242. package/src/storage/memory.ts +0 -211
  243. package/src/storage/prisma.ts +0 -653
  244. package/src/storage/sequelize.ts +0 -498
  245. package/src/storage/types.ts +0 -97
  246. package/src/utils/default-drives-manager.ts +0 -341
  247. package/src/utils/document-helpers.ts +0 -21
  248. package/src/utils/graphql.ts +0 -301
  249. package/src/utils/index.ts +0 -90
  250. package/src/utils/logger.ts +0 -38
  251. package/src/utils/migrations.ts +0 -58
  252. package/src/utils/run-asap.ts +0 -156
@@ -0,0 +1,34 @@
1
+ import { DocumentDriveLocalState, FileNode, FolderNode } from "#drive-document-model/gen/types";
2
+ import { DocumentModelModule, DocumentModelState, OperationFromDocument, PHDocument } from "document-model";
3
+ import { BuildSchemaOptions, GraphQLError, ParseOptions } from "graphql";
4
+ import request from "graphql-request";
5
+ export { gql } from "graphql-request";
6
+ export type GraphQLResult<T> = {
7
+ [K in keyof T]: T[K] | null;
8
+ } & {
9
+ errors?: GraphQLError[];
10
+ };
11
+ export declare function requestGraphql<T>(...args: Parameters<typeof request>): Promise<GraphQLResult<T>>;
12
+ export type DriveInfo = {
13
+ id: string;
14
+ name: string;
15
+ slug: string;
16
+ icon?: string;
17
+ meta?: {
18
+ preferredEditor?: string;
19
+ };
20
+ };
21
+ export declare function generateDocumentStateQueryFields(documentModelState: DocumentModelState, options?: BuildSchemaOptions & ParseOptions): string;
22
+ export declare function requestPublicDrive(url: string): Promise<DriveInfo>;
23
+ export type DriveState = DriveInfo & Pick<DocumentDriveLocalState, "availableOffline" | "sharingType"> & {
24
+ nodes: Array<FolderNode | Omit<FileNode, "synchronizationUnits">>;
25
+ };
26
+ export type DocumentGraphQLResult<TDocument extends PHDocument> = TDocument & {
27
+ operations: (OperationFromDocument<TDocument> & {
28
+ inputText: string;
29
+ })[];
30
+ };
31
+ export declare function fetchDocument<TDocument extends PHDocument>(url: string, documentId: string, documentModelModule: DocumentModelModule<TDocument>): Promise<GraphQLResult<{
32
+ document: DocumentGraphQLResult<TDocument>;
33
+ }>>;
34
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../src/utils/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,UAAU,EACX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,YAAY,EAOZ,YAAY,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,OAA+B,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAMtC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;CAAE,GAAG;IAC/D,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAGF,wBAAsB,cAAc,CAAC,CAAC,EACpC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAClC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAc3B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAkDF,wBAAgB,gCAAgC,CAC9C,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAC1C,MAAM,CAqBR;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA6BxE;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAChC,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,GAAG,aAAa,CAAC,GAAG;IAClE,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;CACnE,CAAC;AAEJ,MAAM,MAAM,qBAAqB,CAAC,SAAS,SAAS,UAAU,IAAI,SAAS,GAAG;IAC5E,UAAU,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG;QAC9C,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,EAAE,CAAC;CACN,CAAC;AAEF,wBAAsB,aAAa,CAAC,SAAS,SAAS,UAAU,EAC9D,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAClD,OAAO,CACR,aAAa,CAAC;IACZ,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;CAC5C,CAAC,CACH,CA0FA"}
@@ -0,0 +1,183 @@
1
+ import { pascalCase } from "change-case";
2
+ import { GraphQLError, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, buildSchema, } from "graphql";
3
+ import { GraphQLClient, gql } from "graphql-request";
4
+ import { logger } from "./logger.js";
5
+ export { gql } from "graphql-request";
6
+ // replaces fetch so it can be used in Node and Browser envs
7
+ export async function requestGraphql(...args) {
8
+ const [url, ...requestArgs] = args;
9
+ const client = new GraphQLClient(url, { fetch });
10
+ const { errors, ...response } = await client.request(...requestArgs);
11
+ const result = { ...response };
12
+ if (errors?.length) {
13
+ result.errors = errors.map(({ message, ...options }) => new GraphQLError(message, options));
14
+ }
15
+ return result;
16
+ }
17
+ function getFields(type) {
18
+ if (type instanceof GraphQLObjectType) {
19
+ return Object.entries(type.getFields())
20
+ .map(([fieldName, field]) => {
21
+ const fieldType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type;
22
+ if (fieldType instanceof GraphQLObjectType ||
23
+ fieldType instanceof GraphQLUnionType) {
24
+ return `${fieldName} { ${getFields(fieldType)} }`;
25
+ }
26
+ if (fieldType instanceof GraphQLList) {
27
+ const listItemType = fieldType.ofType instanceof GraphQLNonNull
28
+ ? fieldType.ofType.ofType
29
+ : fieldType.ofType;
30
+ if (listItemType instanceof GraphQLScalarType) {
31
+ return fieldName;
32
+ }
33
+ else if (listItemType instanceof GraphQLObjectType ||
34
+ listItemType instanceof GraphQLUnionType) {
35
+ return `${fieldName} { ${getFields(listItemType)} }`;
36
+ }
37
+ else {
38
+ throw new Error(`List item type ${listItemType.toString()} is not handled`);
39
+ }
40
+ }
41
+ return fieldName;
42
+ })
43
+ .join(" ");
44
+ }
45
+ else if (type instanceof GraphQLUnionType) {
46
+ return type
47
+ .getTypes()
48
+ .map((unionType) => {
49
+ return `... on ${unionType.name} { ${getFields(unionType)} }`;
50
+ })
51
+ .join(" ");
52
+ }
53
+ return "";
54
+ }
55
+ export function generateDocumentStateQueryFields(documentModelState, options) {
56
+ const name = pascalCase(documentModelState.name);
57
+ const spec = documentModelState.specifications.at(-1);
58
+ if (!spec) {
59
+ throw new Error("No document model specification found");
60
+ }
61
+ const source = `${spec.state.global.schema} type Query { ${name}: ${name}State }`;
62
+ const schema = buildSchema(source, options);
63
+ const queryType = schema.getQueryType();
64
+ if (!queryType) {
65
+ throw new Error("No query type found");
66
+ }
67
+ const fields = queryType.getFields();
68
+ const stateQuery = fields[name];
69
+ if (!stateQuery) {
70
+ throw new Error("No state query found");
71
+ }
72
+ const queryFields = getFields(stateQuery.type);
73
+ return queryFields;
74
+ }
75
+ export async function requestPublicDrive(url) {
76
+ let drive;
77
+ try {
78
+ const result = await requestGraphql(url, gql `
79
+ query getDrive {
80
+ drive {
81
+ id
82
+ name
83
+ icon
84
+ slug
85
+ meta {
86
+ preferredEditor
87
+ }
88
+ }
89
+ }
90
+ `);
91
+ if (result.errors?.length || !result.drive) {
92
+ throw result.errors?.at(0) ?? new Error("Drive not found");
93
+ }
94
+ drive = result.drive;
95
+ }
96
+ catch (e) {
97
+ logger.error(e);
98
+ throw new Error("Couldn't find drive info");
99
+ }
100
+ return drive;
101
+ }
102
+ export async function fetchDocument(url, documentId, documentModelModule) {
103
+ const { documentModel, utils } = documentModelModule;
104
+ const stateFields = generateDocumentStateQueryFields(documentModel);
105
+ const name = pascalCase(documentModel.name);
106
+ const result = await requestGraphql(url, gql `
107
+ query ($id: String!) {
108
+ document(id: $id) {
109
+ id
110
+ name
111
+ created
112
+ documentType
113
+ lastModified
114
+ revision
115
+ operations {
116
+ id
117
+ error
118
+ hash
119
+ index
120
+ skip
121
+ timestamp
122
+ type
123
+ inputText
124
+ context {
125
+ signer {
126
+ user {
127
+ address
128
+ networkId
129
+ chainId
130
+ }
131
+ app {
132
+ name
133
+ key
134
+ }
135
+ signatures
136
+ }
137
+ }
138
+ }
139
+ ... on ${name} {
140
+ state {
141
+ ${stateFields}
142
+ }
143
+ initialState {
144
+ ${stateFields}
145
+ }
146
+ }
147
+ }
148
+ }
149
+ `, { id: documentId });
150
+ const document = result.document
151
+ ? {
152
+ ...result.document,
153
+ revision: {
154
+ global: result.document.revision.global,
155
+ local: 0,
156
+ },
157
+ state: result.document.state,
158
+ operations: {
159
+ global: result.document.operations.map(({ inputText, ...o }) => ({
160
+ ...o,
161
+ error: o.error ?? undefined,
162
+ scope: "global",
163
+ input: JSON.parse(inputText),
164
+ })),
165
+ local: [],
166
+ },
167
+ attachments: {},
168
+ initialState: utils.createExtendedState({
169
+ // TODO: getDocument should return all the initial state fields
170
+ created: result.document.created,
171
+ lastModified: result.document.created,
172
+ state: utils.createState({
173
+ global: result.document.initialState.state.global,
174
+ }),
175
+ }),
176
+ clipboard: [],
177
+ }
178
+ : null;
179
+ return {
180
+ ...result,
181
+ document,
182
+ };
183
+ }
@@ -0,0 +1,27 @@
1
+ type LogLevel = "verbose" | "debug" | "info" | "warn" | "error" | "silent";
2
+ export type ILogger = Pick<Console, "log" | "info" | "warn" | "error" | "debug"> & {
3
+ level: LogLevel | "env";
4
+ errorHandler: LoggerErrorHandler | undefined;
5
+ verbose: (message?: any, ...optionalParams: any[]) => void;
6
+ };
7
+ export type LoggerErrorHandler = (...data: any[]) => void;
8
+ export declare class ConsoleLogger implements ILogger {
9
+ #private;
10
+ constructor(tags?: string[], errorHandler?: LoggerErrorHandler);
11
+ get level(): LogLevel | "env";
12
+ set level(level: LogLevel | "env");
13
+ get errorHandler(): LoggerErrorHandler | undefined;
14
+ set errorHandler(handler: LoggerErrorHandler | undefined);
15
+ log(...data: any[]): void;
16
+ verbose(...data: any[]): void;
17
+ debug(...data: any[]): void;
18
+ info(...data: any[]): void;
19
+ warn(...data: any[]): void;
20
+ error(...data: any[]): void;
21
+ }
22
+ export declare const logger: ILogger;
23
+ export declare const setErrorHandler: (handler: LoggerErrorHandler) => void;
24
+ export declare const setLogLevel: (level: LogLevel | "env") => void;
25
+ export declare const childLogger: (tags: string[]) => ConsoleLogger;
26
+ export {};
27
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,IAAI,CACxB,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAC5C,GAAG;IACF,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IACxB,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAE7C,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAW1D,qBAAa,aAAc,YAAW,OAAO;;gBAK/B,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,kBAAkB;IAa9D,IAAI,KAAK,IAAI,QAAQ,GAAG,KAAK,CAE5B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,EAEhC;IAED,IAAI,YAAY,IAAI,kBAAkB,GAAG,SAAS,CAEjD;IAED,IAAI,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,EAEvD;IAmBD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ7B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;CAW5B;AASD,eAAO,MAAM,MAAM,EAAE,OAAwB,CAAC;AAE9C,eAAO,MAAM,eAAe,YAAa,kBAAkB,SAG1D,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW,QAAQ,GAAG,KAAK,SAGlD,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,EAAE,kBAKzC,CAAC"}
@@ -0,0 +1,105 @@
1
+ const LEVELS = {
2
+ verbose: 1,
3
+ debug: 2,
4
+ info: 3,
5
+ warn: 4,
6
+ error: 5,
7
+ silent: 6,
8
+ };
9
+ export class ConsoleLogger {
10
+ #tags;
11
+ #levelString = "env";
12
+ #errorHandler;
13
+ constructor(tags, errorHandler) {
14
+ this.#tags = (tags || []).map((tag) => `[${tag}]`);
15
+ this.#errorHandler = errorHandler;
16
+ // Bind all methods to the current instance
17
+ this.log = this.log.bind(this);
18
+ this.info = this.info.bind(this);
19
+ this.warn = this.warn.bind(this);
20
+ this.error = this.error.bind(this);
21
+ this.debug = this.debug.bind(this);
22
+ this.verbose = this.verbose.bind(this);
23
+ }
24
+ get level() {
25
+ return this.#levelString;
26
+ }
27
+ set level(level) {
28
+ this.#levelString = level;
29
+ }
30
+ get errorHandler() {
31
+ return this.#errorHandler;
32
+ }
33
+ set errorHandler(handler) {
34
+ this.#errorHandler = handler;
35
+ }
36
+ get #levelValue() {
37
+ if (this.#levelString === "env") {
38
+ const envLevel = process.env.LOG_LEVEL;
39
+ if (!envLevel) {
40
+ return LEVELS.debug;
41
+ }
42
+ if (!(envLevel in LEVELS)) {
43
+ return LEVELS.debug;
44
+ }
45
+ return LEVELS[envLevel];
46
+ }
47
+ return LEVELS[this.#levelString];
48
+ }
49
+ log(...data) {
50
+ return this.debug(...data);
51
+ }
52
+ verbose(...data) {
53
+ if (this.#levelValue > LEVELS.verbose) {
54
+ return;
55
+ }
56
+ return this.debug(...data);
57
+ }
58
+ debug(...data) {
59
+ if (this.#levelValue > LEVELS.debug) {
60
+ return;
61
+ }
62
+ return console.debug(...[...this.#tags, ...data]);
63
+ }
64
+ info(...data) {
65
+ if (this.#levelValue > LEVELS.info) {
66
+ return;
67
+ }
68
+ return console.info(...[...this.#tags, ...data]);
69
+ }
70
+ warn(...data) {
71
+ if (this.#levelValue > LEVELS.warn) {
72
+ return;
73
+ }
74
+ return console.warn(...[...this.#tags, ...data]);
75
+ }
76
+ error(...data) {
77
+ if (this.#levelValue > LEVELS.error) {
78
+ return;
79
+ }
80
+ if (this.#errorHandler) {
81
+ this.#errorHandler(...data);
82
+ }
83
+ return console.error(...[...this.#tags, ...data]);
84
+ }
85
+ }
86
+ const loggerInstance = new ConsoleLogger();
87
+ let logLevel = "env";
88
+ let errorHandler;
89
+ loggerInstance.level = logLevel;
90
+ loggerInstance.errorHandler = errorHandler;
91
+ export const logger = loggerInstance;
92
+ export const setErrorHandler = (handler) => {
93
+ errorHandler = handler;
94
+ loggerInstance.errorHandler = handler;
95
+ };
96
+ export const setLogLevel = (level) => {
97
+ logLevel = level;
98
+ loggerInstance.level = level;
99
+ };
100
+ export const childLogger = (tags) => {
101
+ const logger = new ConsoleLogger(tags);
102
+ logger.level = logLevel;
103
+ logger.errorHandler = errorHandler;
104
+ return logger;
105
+ };
@@ -0,0 +1,4 @@
1
+ import { Operation, PHDocument } from "document-model";
2
+ export declare function migrateDocumentOperationSignatures(document: PHDocument): PHDocument | undefined;
3
+ export declare function migrateLegacyOperationSignature<TGlobalState, TLocalState>(operation: Operation): Operation;
4
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/utils/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAET,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,UAAU,GACnB,UAAU,GAAG,SAAS,CAoBxB;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,WAAW,EACvE,SAAS,EAAE,SAAS,GACnB,SAAS,CAuBX"}
@@ -0,0 +1,41 @@
1
+ export function migrateDocumentOperationSignatures(document) {
2
+ let legacy = false;
3
+ const operations = Object.entries(document.operations).reduce((acc, [key, operations]) => {
4
+ const scope = key;
5
+ for (const op of operations) {
6
+ const newOp = migrateLegacyOperationSignature(op);
7
+ acc[scope].push(newOp);
8
+ if (newOp !== op) {
9
+ legacy = true;
10
+ }
11
+ }
12
+ return acc;
13
+ }, { global: [], local: [] });
14
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
15
+ return legacy ? { ...document, operations } : document;
16
+ }
17
+ export function migrateLegacyOperationSignature(operation) {
18
+ if (!operation.context?.signer || operation.context.signer.signatures) {
19
+ return operation;
20
+ }
21
+ const { signer } = operation.context;
22
+ if ("signature" in signer) {
23
+ const signature = signer.signature;
24
+ return {
25
+ ...operation,
26
+ context: {
27
+ ...operation.context,
28
+ signer: {
29
+ user: signer.user,
30
+ app: signer.app,
31
+ signatures: (signature?.length
32
+ ? [signature]
33
+ : []),
34
+ },
35
+ },
36
+ };
37
+ }
38
+ else {
39
+ return operation;
40
+ }
41
+ }
@@ -0,0 +1,11 @@
1
+ import { Operation, OperationFromDocument, OperationsFromDocument, PHDocument } from "document-model";
2
+ import { DocumentDriveDocument } from "#drive-document-model/gen/types";
3
+ import { RunAsap } from "./run-asap.js";
4
+ export declare const runAsap: typeof RunAsap.runAsap;
5
+ export declare const runAsapAsync: typeof RunAsap.runAsapAsync;
6
+ export declare function isDocumentDrive(document: PHDocument): document is DocumentDriveDocument;
7
+ export declare function mergeOperations<TDocument extends PHDocument>(currentOperations: OperationsFromDocument<TDocument>, newOperations: OperationFromDocument<TDocument>[]): OperationsFromDocument<TDocument>;
8
+ export declare function generateUUID(): string;
9
+ export declare function isNoopUpdate(operation: Operation, latestOperation?: Operation): boolean;
10
+ export declare function isBefore(dateA: Date | string, dateB: Date | string): boolean;
11
+ //# sourceMappingURL=misc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/utils/misc.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,qBAAqB,EAErB,sBAAsB,EACtB,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,eAAO,MAAM,OAAO,wBAAkB,CAAC;AACvC,eAAO,MAAM,YAAY,6BAAuB,CAAC;AAEjD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,GACnB,QAAQ,IAAI,qBAAqB,CAEnC;AAED,wBAAgB,eAAe,CAAC,SAAS,SAAS,UAAU,EAC1D,iBAAiB,EAAE,sBAAsB,CAAC,SAAS,CAAC,EACpD,aAAa,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,GAChD,sBAAsB,CAAC,SAAS,CAAC,CA0BnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,eAAe,CAAC,EAAE,SAAS,WAc5B;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,WAElE"}
@@ -0,0 +1,43 @@
1
+ import { generateId, } from "document-model";
2
+ import { driveDocumentType } from "#drive-document-model/constants";
3
+ import { OperationError } from "#server/error";
4
+ import { RunAsap } from "./run-asap.js";
5
+ export const runAsap = RunAsap.runAsap;
6
+ export const runAsapAsync = RunAsap.runAsapAsync;
7
+ export function isDocumentDrive(document) {
8
+ return document.documentType === driveDocumentType;
9
+ }
10
+ export function mergeOperations(currentOperations, newOperations) {
11
+ const minIndexByScope = Object.keys(currentOperations).reduce((acc, curr) => {
12
+ const scope = curr;
13
+ acc[scope] = currentOperations[scope].at(-1)?.index ?? 0;
14
+ return acc;
15
+ }, {});
16
+ const conflictOp = newOperations.find((op) => op.index < (minIndexByScope[op.scope] ?? 0));
17
+ if (conflictOp) {
18
+ throw new OperationError("ERROR", conflictOp, `Tried to add operation with index ${conflictOp.index} and document is at index ${minIndexByScope[conflictOp.scope]}`);
19
+ }
20
+ return newOperations
21
+ .sort((a, b) => a.index - b.index)
22
+ .reduce((acc, curr) => {
23
+ const existingOperations = acc[curr.scope] || [];
24
+ return { ...acc, [curr.scope]: [...existingOperations, curr] };
25
+ }, currentOperations);
26
+ }
27
+ export function generateUUID() {
28
+ return generateId();
29
+ }
30
+ export function isNoopUpdate(operation, latestOperation) {
31
+ if (!latestOperation) {
32
+ return false;
33
+ }
34
+ const isNoopOp = operation.type === "NOOP";
35
+ const isNoopLatestOp = latestOperation.type === "NOOP";
36
+ const isSameIndexOp = operation.index === latestOperation.index;
37
+ const isSkipOpGreaterThanLatestOp = operation.skip > latestOperation.skip;
38
+ return (isNoopOp && isNoopLatestOp && isSameIndexOp && isSkipOpGreaterThanLatestOp);
39
+ }
40
+ // return true if dateA is before dateB
41
+ export function isBefore(dateA, dateB) {
42
+ return new Date(dateA) < new Date(dateB);
43
+ }
@@ -0,0 +1,12 @@
1
+ export declare namespace RunAsap {
2
+ type Task<T = void> = () => T;
3
+ type AbortTask = () => void;
4
+ type RunAsap<T> = (task: Task<T>) => AbortTask;
5
+ const useMessageChannel: Error | ((task: Task) => () => void);
6
+ const usePostMessage: Error | ((task: Task) => () => void);
7
+ const useSetImmediate: Error | ((task: Task) => () => void);
8
+ const useSetTimeout: (task: Task) => () => void;
9
+ function runAsap<T = void>(task: Task<T>): AbortTask;
10
+ function runAsapAsync<T = void>(task: RunAsap.Task<Promise<T>>, queueMethod?: RunAsap<void>): Promise<T>;
11
+ }
12
+ //# sourceMappingURL=run-asap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-asap.d.ts","sourceRoot":"","sources":["../../../src/utils/run-asap.ts"],"names":[],"mappings":"AACA,yBAAiB,OAAO,CAAC;IACvB,KAAY,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC;IACrC,KAAY,SAAS,GAAG,MAAM,IAAI,CAAC;IACnC,KAAY,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAE/C,MAAM,iBAAiB,kBAKd,IAAI,gBAiBhB,CAAC;IAEE,MAAM,cAAc,kBA0DX,IAAI,gBAQhB,CAAC;IAEE,MAAM,eAAe,kBAQZ,IAAI,gBAIhB,CAAC;IAEE,MAAM,aAAa,SACV,IAAI,eAIhB,CAAC;IAIL,SAAgB,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAiB1D;IAED,SAAgB,YAAY,CAAC,CAAC,GAAG,IAAI,EACnC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,WAAW,GAAE,OAAO,CAAC,IAAI,CAAW,GACnC,OAAO,CAAC,CAAC,CAAC,CAWZ;CACF"}
@@ -0,0 +1,131 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-namespace
2
+ export var RunAsap;
3
+ (function (RunAsap) {
4
+ RunAsap.useMessageChannel = (() => {
5
+ if (typeof MessageChannel === "undefined") {
6
+ return new Error("MessageChannel is not supported");
7
+ }
8
+ return (task) => {
9
+ const controller = new AbortController();
10
+ const signal = controller.signal;
11
+ const mc = new MessageChannel();
12
+ mc.port1.postMessage(null);
13
+ mc.port2.addEventListener("message", () => {
14
+ task();
15
+ mc.port1.close();
16
+ mc.port2.close();
17
+ }, { once: true, signal: signal });
18
+ mc.port2.start();
19
+ return () => controller.abort();
20
+ };
21
+ })();
22
+ RunAsap.usePostMessage = (() => {
23
+ const _main =
24
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
25
+ (typeof window === "object" && window) ||
26
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
27
+ (typeof global === "object" && global) ||
28
+ (typeof self === "object" && self);
29
+ if (!_main) {
30
+ return new Error("No global object found");
31
+ }
32
+ const main = _main;
33
+ if (
34
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
35
+ !main.postMessage ||
36
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
37
+ !main.addEventListener ||
38
+ main.importScripts // web workers can't this method
39
+ ) {
40
+ return new Error("postMessage is not supported");
41
+ }
42
+ let index = 0;
43
+ const tasks = new Map();
44
+ function getNewIndex() {
45
+ if (index === 9007199254740991) {
46
+ return 0;
47
+ }
48
+ return ++index;
49
+ }
50
+ const MESSAGE_PREFIX = "com.usePostMessage" + Math.random();
51
+ main.addEventListener("message", (e) => {
52
+ const event = e;
53
+ if (typeof event.data !== "string") {
54
+ return;
55
+ }
56
+ if (event.source !== main || !event.data.startsWith(MESSAGE_PREFIX)) {
57
+ return;
58
+ }
59
+ const index = event.data.split(":").at(1);
60
+ if (index === undefined) {
61
+ return;
62
+ }
63
+ const i = +index;
64
+ const task = tasks.get(i);
65
+ if (task) {
66
+ task();
67
+ tasks.delete(i);
68
+ }
69
+ }, false);
70
+ return (task) => {
71
+ const i = getNewIndex();
72
+ tasks.set(i, task);
73
+ main.postMessage(MESSAGE_PREFIX + ":" + i, { targetOrigin: "*" });
74
+ return () => {
75
+ tasks.delete(i);
76
+ };
77
+ };
78
+ })();
79
+ RunAsap.useSetImmediate = (() => {
80
+ if (typeof window !== "undefined") {
81
+ return new Error("setImmediate is not supported on the browser");
82
+ }
83
+ if (typeof setImmediate === "undefined") {
84
+ return new Error("setImmediate is not supported");
85
+ }
86
+ return (task) => {
87
+ const id = setImmediate(task);
88
+ return () => clearImmediate(id);
89
+ };
90
+ })();
91
+ RunAsap.useSetTimeout = (() => {
92
+ return (task) => {
93
+ const id = setTimeout(task, 0);
94
+ return () => clearTimeout(id);
95
+ };
96
+ })();
97
+ // queues the task in the macro tasks queue, so it doesn't
98
+ // prevent the event loop from movin on the next tick
99
+ function runAsap(task) {
100
+ // if on node use setImmediate
101
+ if (!(RunAsap.useSetImmediate instanceof Error)) {
102
+ return RunAsap.useSetImmediate(task);
103
+ }
104
+ // on browser use MessageChannel if available
105
+ else if (!(RunAsap.useMessageChannel instanceof Error)) {
106
+ return RunAsap.useMessageChannel(task);
107
+ }
108
+ // otherwise use window.postMessage
109
+ else if (!(RunAsap.usePostMessage instanceof Error)) {
110
+ return RunAsap.usePostMessage(task);
111
+ }
112
+ // fallback to setTimeout with 0 delay
113
+ else {
114
+ return RunAsap.useSetTimeout(task);
115
+ }
116
+ }
117
+ RunAsap.runAsap = runAsap;
118
+ function runAsapAsync(task, queueMethod = runAsap) {
119
+ if (queueMethod instanceof Error) {
120
+ throw new Error("queueMethod is not supported", {
121
+ cause: queueMethod,
122
+ });
123
+ }
124
+ return new Promise((resolve, reject) => {
125
+ queueMethod(() => {
126
+ task().then(resolve).catch(reject);
127
+ });
128
+ });
129
+ }
130
+ RunAsap.runAsapAsync = runAsapAsync;
131
+ })(RunAsap || (RunAsap = {}));
@@ -0,0 +1,8 @@
1
+ import { Operation } from "document-model";
2
+ export type InputOperation = Partial<Omit<Operation, "index" | "skip">> & {
3
+ index: number;
4
+ skip: number;
5
+ };
6
+ export declare const buildOperation: (input: InputOperation, shuffled?: boolean) => Operation;
7
+ export declare const buildOperations: (inputs: InputOperation[], shuffled?: boolean) => Operation[];
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/document-helpers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,UAClB,cAAc,yBAEpB,SAoBF,CAAC;AAEF,eAAO,MAAM,eAAe,WAClB,cAAc,EAAE,yBAEvB,SAAS,EAAoD,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const buildOperation = (input, shuffled = false) => {
2
+ if (shuffled) {
3
+ return {
4
+ scope: "global",
5
+ type: "TEST",
6
+ timestamp: new Date().toISOString(),
7
+ input: {},
8
+ hash: `hash-${input.index}`,
9
+ ...input,
10
+ };
11
+ }
12
+ return {
13
+ hash: `hash-${input.index}`,
14
+ timestamp: new Date().toISOString(),
15
+ input: {},
16
+ scope: "global",
17
+ type: "TEST",
18
+ ...input,
19
+ };
20
+ };
21
+ export const buildOperations = (inputs, shuffled = false) => inputs.map((i) => buildOperation(i, shuffled));