@yolk-sdk/emulators 0.1.0-canary.96

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 (333) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2135 -0
  3. package/dist/anthropic.d.mts +269 -0
  4. package/dist/anthropic.d.mts.map +1 -0
  5. package/dist/anthropic.mjs +177 -0
  6. package/dist/anthropic.mjs.map +1 -0
  7. package/dist/chat-completions.d.mts +288 -0
  8. package/dist/chat-completions.d.mts.map +1 -0
  9. package/dist/chat-completions.mjs +451 -0
  10. package/dist/chat-completions.mjs.map +1 -0
  11. package/dist/codex.d.mts +265 -0
  12. package/dist/codex.d.mts.map +1 -0
  13. package/dist/codex.mjs +199 -0
  14. package/dist/codex.mjs.map +1 -0
  15. package/dist/dropbox/api.d.mts +63 -0
  16. package/dist/dropbox/api.d.mts.map +1 -0
  17. package/dist/dropbox/api.mjs +565 -0
  18. package/dist/dropbox/api.mjs.map +1 -0
  19. package/dist/dropbox/state.d.mts +136 -0
  20. package/dist/dropbox/state.d.mts.map +1 -0
  21. package/dist/dropbox/state.mjs +209 -0
  22. package/dist/dropbox/state.mjs.map +1 -0
  23. package/dist/dropbox.d.mts +79 -0
  24. package/dist/dropbox.d.mts.map +1 -0
  25. package/dist/dropbox.mjs +124 -0
  26. package/dist/dropbox.mjs.map +1 -0
  27. package/dist/email-fixtures.d.mts +36 -0
  28. package/dist/email-fixtures.d.mts.map +1 -0
  29. package/dist/email-fixtures.mjs +1080 -0
  30. package/dist/email-fixtures.mjs.map +1 -0
  31. package/dist/email.d.mts +160 -0
  32. package/dist/email.d.mts.map +1 -0
  33. package/dist/email.mjs +608 -0
  34. package/dist/email.mjs.map +1 -0
  35. package/dist/emulator-compose.d.mts +40 -0
  36. package/dist/emulator-compose.d.mts.map +1 -0
  37. package/dist/emulator-compose.mjs +91 -0
  38. package/dist/emulator-compose.mjs.map +1 -0
  39. package/dist/emulator-http.d.mts +53 -0
  40. package/dist/emulator-http.d.mts.map +1 -0
  41. package/dist/emulator-http.mjs +117 -0
  42. package/dist/emulator-http.mjs.map +1 -0
  43. package/dist/emulator-kernel.d.mts +176 -0
  44. package/dist/emulator-kernel.d.mts.map +1 -0
  45. package/dist/emulator-kernel.mjs +413 -0
  46. package/dist/emulator-kernel.mjs.map +1 -0
  47. package/dist/fixture-route.d.mts +129 -0
  48. package/dist/fixture-route.d.mts.map +1 -0
  49. package/dist/fixture-route.mjs +257 -0
  50. package/dist/fixture-route.mjs.map +1 -0
  51. package/dist/fortnox/api.d.mts +92 -0
  52. package/dist/fortnox/api.d.mts.map +1 -0
  53. package/dist/fortnox/api.mjs +750 -0
  54. package/dist/fortnox/api.mjs.map +1 -0
  55. package/dist/fortnox/state.d.mts +533 -0
  56. package/dist/fortnox/state.d.mts.map +1 -0
  57. package/dist/fortnox/state.mjs +612 -0
  58. package/dist/fortnox/state.mjs.map +1 -0
  59. package/dist/fortnox.d.mts +128 -0
  60. package/dist/fortnox.d.mts.map +1 -0
  61. package/dist/fortnox.mjs +403 -0
  62. package/dist/fortnox.mjs.map +1 -0
  63. package/dist/gateway-evaluate-recordings.d.mts +12 -0
  64. package/dist/gateway-evaluate-recordings.d.mts.map +1 -0
  65. package/dist/gateway-evaluate-recordings.mjs +128 -0
  66. package/dist/gateway-evaluate-recordings.mjs.map +1 -0
  67. package/dist/gateway.d.mts +272 -0
  68. package/dist/gateway.d.mts.map +1 -0
  69. package/dist/gateway.mjs +400 -0
  70. package/dist/gateway.mjs.map +1 -0
  71. package/dist/github/api.d.mts +63 -0
  72. package/dist/github/api.d.mts.map +1 -0
  73. package/dist/github/api.mjs +527 -0
  74. package/dist/github/api.mjs.map +1 -0
  75. package/dist/github/state.d.mts +272 -0
  76. package/dist/github/state.d.mts.map +1 -0
  77. package/dist/github/state.mjs +303 -0
  78. package/dist/github/state.mjs.map +1 -0
  79. package/dist/github.d.mts +77 -0
  80. package/dist/github.d.mts.map +1 -0
  81. package/dist/github.mjs +180 -0
  82. package/dist/github.mjs.map +1 -0
  83. package/dist/google/calendar.d.mts +10 -0
  84. package/dist/google/calendar.d.mts.map +1 -0
  85. package/dist/google/calendar.mjs +252 -0
  86. package/dist/google/calendar.mjs.map +1 -0
  87. package/dist/google/drive.d.mts +8 -0
  88. package/dist/google/drive.d.mts.map +1 -0
  89. package/dist/google/drive.mjs +252 -0
  90. package/dist/google/drive.mjs.map +1 -0
  91. package/dist/google/gmail.d.mts +10 -0
  92. package/dist/google/gmail.d.mts.map +1 -0
  93. package/dist/google/gmail.mjs +591 -0
  94. package/dist/google/gmail.mjs.map +1 -0
  95. package/dist/google/shared.d.mts +107 -0
  96. package/dist/google/shared.d.mts.map +1 -0
  97. package/dist/google/shared.mjs +146 -0
  98. package/dist/google/shared.mjs.map +1 -0
  99. package/dist/google/state.d.mts +385 -0
  100. package/dist/google/state.d.mts.map +1 -0
  101. package/dist/google/state.mjs +496 -0
  102. package/dist/google/state.mjs.map +1 -0
  103. package/dist/google.d.mts +75 -0
  104. package/dist/google.d.mts.map +1 -0
  105. package/dist/google.mjs +210 -0
  106. package/dist/google.mjs.map +1 -0
  107. package/dist/linkedin-search/api.d.mts +45 -0
  108. package/dist/linkedin-search/api.d.mts.map +1 -0
  109. package/dist/linkedin-search/api.mjs +181 -0
  110. package/dist/linkedin-search/api.mjs.map +1 -0
  111. package/dist/linkedin-search/state.d.mts +123 -0
  112. package/dist/linkedin-search/state.d.mts.map +1 -0
  113. package/dist/linkedin-search/state.mjs +261 -0
  114. package/dist/linkedin-search/state.mjs.map +1 -0
  115. package/dist/linkedin-search.d.mts +69 -0
  116. package/dist/linkedin-search.d.mts.map +1 -0
  117. package/dist/linkedin-search.mjs +158 -0
  118. package/dist/linkedin-search.mjs.map +1 -0
  119. package/dist/mcp/api.d.mts +44 -0
  120. package/dist/mcp/api.d.mts.map +1 -0
  121. package/dist/mcp/api.mjs +557 -0
  122. package/dist/mcp/api.mjs.map +1 -0
  123. package/dist/mcp/recordings.d.mts +40 -0
  124. package/dist/mcp/recordings.d.mts.map +1 -0
  125. package/dist/mcp/recordings.mjs +2390 -0
  126. package/dist/mcp/recordings.mjs.map +1 -0
  127. package/dist/mcp/state.d.mts +71 -0
  128. package/dist/mcp/state.d.mts.map +1 -0
  129. package/dist/mcp/state.mjs +83 -0
  130. package/dist/mcp/state.mjs.map +1 -0
  131. package/dist/mcp.d.mts +84 -0
  132. package/dist/mcp.d.mts.map +1 -0
  133. package/dist/mcp.mjs +241 -0
  134. package/dist/mcp.mjs.map +1 -0
  135. package/dist/messages.d.mts +183 -0
  136. package/dist/messages.d.mts.map +1 -0
  137. package/dist/messages.mjs +532 -0
  138. package/dist/messages.mjs.map +1 -0
  139. package/dist/microsoft/api.d.mts +47 -0
  140. package/dist/microsoft/api.d.mts.map +1 -0
  141. package/dist/microsoft/api.mjs +178 -0
  142. package/dist/microsoft/api.mjs.map +1 -0
  143. package/dist/microsoft/calendar.d.mts +30 -0
  144. package/dist/microsoft/calendar.d.mts.map +1 -0
  145. package/dist/microsoft/calendar.mjs +271 -0
  146. package/dist/microsoft/calendar.mjs.map +1 -0
  147. package/dist/microsoft/drive.d.mts +36 -0
  148. package/dist/microsoft/drive.d.mts.map +1 -0
  149. package/dist/microsoft/drive.mjs +298 -0
  150. package/dist/microsoft/drive.mjs.map +1 -0
  151. package/dist/microsoft/graph.d.mts +198 -0
  152. package/dist/microsoft/graph.d.mts.map +1 -0
  153. package/dist/microsoft/graph.mjs +264 -0
  154. package/dist/microsoft/graph.mjs.map +1 -0
  155. package/dist/microsoft/mail.d.mts +48 -0
  156. package/dist/microsoft/mail.d.mts.map +1 -0
  157. package/dist/microsoft/mail.mjs +488 -0
  158. package/dist/microsoft/mail.mjs.map +1 -0
  159. package/dist/microsoft/state.d.mts +480 -0
  160. package/dist/microsoft/state.d.mts.map +1 -0
  161. package/dist/microsoft/state.mjs +625 -0
  162. package/dist/microsoft/state.mjs.map +1 -0
  163. package/dist/microsoft.d.mts +168 -0
  164. package/dist/microsoft.d.mts.map +1 -0
  165. package/dist/microsoft.mjs +483 -0
  166. package/dist/microsoft.mjs.map +1 -0
  167. package/dist/node.d.mts +47 -0
  168. package/dist/node.d.mts.map +1 -0
  169. package/dist/node.mjs +178 -0
  170. package/dist/node.mjs.map +1 -0
  171. package/dist/notion/api.d.mts +51 -0
  172. package/dist/notion/api.d.mts.map +1 -0
  173. package/dist/notion/api.mjs +507 -0
  174. package/dist/notion/api.mjs.map +1 -0
  175. package/dist/notion/state.d.mts +329 -0
  176. package/dist/notion/state.d.mts.map +1 -0
  177. package/dist/notion/state.mjs +432 -0
  178. package/dist/notion/state.mjs.map +1 -0
  179. package/dist/notion.d.mts +72 -0
  180. package/dist/notion.d.mts.map +1 -0
  181. package/dist/notion.mjs +127 -0
  182. package/dist/notion.mjs.map +1 -0
  183. package/dist/openai.d.mts +165 -0
  184. package/dist/openai.d.mts.map +1 -0
  185. package/dist/openai.mjs +141 -0
  186. package/dist/openai.mjs.map +1 -0
  187. package/dist/opencode-recordings.d.mts +7 -0
  188. package/dist/opencode-recordings.d.mts.map +1 -0
  189. package/dist/opencode-recordings.mjs +222 -0
  190. package/dist/opencode-recordings.mjs.map +1 -0
  191. package/dist/opencode.d.mts +70 -0
  192. package/dist/opencode.d.mts.map +1 -0
  193. package/dist/opencode.mjs +217 -0
  194. package/dist/opencode.mjs.map +1 -0
  195. package/dist/r2-fixtures.d.mts +36 -0
  196. package/dist/r2-fixtures.d.mts.map +1 -0
  197. package/dist/r2-fixtures.mjs +245 -0
  198. package/dist/r2-fixtures.mjs.map +1 -0
  199. package/dist/r2-guard.d.mts +43 -0
  200. package/dist/r2-guard.d.mts.map +1 -0
  201. package/dist/r2-guard.mjs +215 -0
  202. package/dist/r2-guard.mjs.map +1 -0
  203. package/dist/r2.d.mts +166 -0
  204. package/dist/r2.d.mts.map +1 -0
  205. package/dist/r2.mjs +517 -0
  206. package/dist/r2.mjs.map +1 -0
  207. package/dist/responses.d.mts +231 -0
  208. package/dist/responses.d.mts.map +1 -0
  209. package/dist/responses.mjs +556 -0
  210. package/dist/responses.mjs.map +1 -0
  211. package/dist/route-evidence.d.mts +45 -0
  212. package/dist/route-evidence.d.mts.map +1 -0
  213. package/dist/route-evidence.mjs +56 -0
  214. package/dist/route-evidence.mjs.map +1 -0
  215. package/dist/router.d.mts +93 -0
  216. package/dist/router.d.mts.map +1 -0
  217. package/dist/router.mjs +259 -0
  218. package/dist/router.mjs.map +1 -0
  219. package/dist/stateful-core.d.mts +17 -0
  220. package/dist/stateful-core.d.mts.map +1 -0
  221. package/dist/stateful-core.mjs +41 -0
  222. package/dist/stateful-core.mjs.map +1 -0
  223. package/dist/stateful-emulator.d.mts +565 -0
  224. package/dist/stateful-emulator.d.mts.map +1 -0
  225. package/dist/stateful-emulator.mjs +1228 -0
  226. package/dist/stateful-emulator.mjs.map +1 -0
  227. package/dist/stateful-secrets.d.mts +84 -0
  228. package/dist/stateful-secrets.d.mts.map +1 -0
  229. package/dist/stateful-secrets.mjs +216 -0
  230. package/dist/stateful-secrets.mjs.map +1 -0
  231. package/dist/subscription-usage-recordings.d.mts +9 -0
  232. package/dist/subscription-usage-recordings.d.mts.map +1 -0
  233. package/dist/subscription-usage-recordings.mjs +53 -0
  234. package/dist/subscription-usage-recordings.mjs.map +1 -0
  235. package/dist/subscription-usage.d.mts +53 -0
  236. package/dist/subscription-usage.d.mts.map +1 -0
  237. package/dist/subscription-usage.mjs +21 -0
  238. package/dist/subscription-usage.mjs.map +1 -0
  239. package/dist/telegram/api.d.mts +34 -0
  240. package/dist/telegram/api.d.mts.map +1 -0
  241. package/dist/telegram/api.mjs +257 -0
  242. package/dist/telegram/api.mjs.map +1 -0
  243. package/dist/telegram/state.d.mts +128 -0
  244. package/dist/telegram/state.d.mts.map +1 -0
  245. package/dist/telegram/state.mjs +154 -0
  246. package/dist/telegram/state.mjs.map +1 -0
  247. package/dist/telegram.d.mts +62 -0
  248. package/dist/telegram.d.mts.map +1 -0
  249. package/dist/telegram.mjs +127 -0
  250. package/dist/telegram.mjs.map +1 -0
  251. package/dist/todoist/api.d.mts +55 -0
  252. package/dist/todoist/api.d.mts.map +1 -0
  253. package/dist/todoist/api.mjs +415 -0
  254. package/dist/todoist/api.mjs.map +1 -0
  255. package/dist/todoist/state.d.mts +275 -0
  256. package/dist/todoist/state.d.mts.map +1 -0
  257. package/dist/todoist/state.mjs +345 -0
  258. package/dist/todoist/state.mjs.map +1 -0
  259. package/dist/todoist.d.mts +68 -0
  260. package/dist/todoist.d.mts.map +1 -0
  261. package/dist/todoist.mjs +181 -0
  262. package/dist/todoist.mjs.map +1 -0
  263. package/dist/xai.d.mts +267 -0
  264. package/dist/xai.d.mts.map +1 -0
  265. package/dist/xai.mjs +252 -0
  266. package/dist/xai.mjs.map +1 -0
  267. package/package.json +157 -0
  268. package/src/anthropic.ts +289 -0
  269. package/src/chat-completions.ts +924 -0
  270. package/src/codex.ts +296 -0
  271. package/src/dropbox/api.ts +1084 -0
  272. package/src/dropbox/state.ts +364 -0
  273. package/src/dropbox.ts +203 -0
  274. package/src/email-fixtures.ts +1297 -0
  275. package/src/email.ts +1108 -0
  276. package/src/emulator-compose.ts +147 -0
  277. package/src/emulator-http.ts +184 -0
  278. package/src/emulator-kernel.ts +844 -0
  279. package/src/fixture-route.ts +561 -0
  280. package/src/fortnox/api.ts +1352 -0
  281. package/src/fortnox/state.ts +798 -0
  282. package/src/fortnox.ts +801 -0
  283. package/src/gateway-evaluate-recordings.ts +153 -0
  284. package/src/gateway.ts +530 -0
  285. package/src/github/api.ts +986 -0
  286. package/src/github/state.ts +439 -0
  287. package/src/github.ts +271 -0
  288. package/src/google/calendar.ts +486 -0
  289. package/src/google/drive.ts +471 -0
  290. package/src/google/gmail.ts +1011 -0
  291. package/src/google/shared.ts +321 -0
  292. package/src/google/state.ts +686 -0
  293. package/src/google.ts +298 -0
  294. package/src/linkedin-search/api.ts +363 -0
  295. package/src/linkedin-search/state.ts +373 -0
  296. package/src/linkedin-search.ts +241 -0
  297. package/src/mcp/api.ts +995 -0
  298. package/src/mcp/recordings.ts +2665 -0
  299. package/src/mcp/state.ts +125 -0
  300. package/src/mcp.ts +319 -0
  301. package/src/messages.ts +844 -0
  302. package/src/microsoft/api.ts +426 -0
  303. package/src/microsoft/calendar.ts +491 -0
  304. package/src/microsoft/drive.ts +541 -0
  305. package/src/microsoft/graph.ts +550 -0
  306. package/src/microsoft/mail.ts +833 -0
  307. package/src/microsoft/state.ts +822 -0
  308. package/src/microsoft.ts +982 -0
  309. package/src/node.ts +293 -0
  310. package/src/notion/api.ts +976 -0
  311. package/src/notion/state.ts +512 -0
  312. package/src/notion.ts +210 -0
  313. package/src/openai.ts +198 -0
  314. package/src/opencode-recordings.ts +257 -0
  315. package/src/opencode.ts +271 -0
  316. package/src/r2-fixtures.ts +295 -0
  317. package/src/r2-guard.ts +323 -0
  318. package/src/r2.ts +890 -0
  319. package/src/responses.ts +901 -0
  320. package/src/route-evidence.ts +90 -0
  321. package/src/router.ts +490 -0
  322. package/src/stateful-core.ts +70 -0
  323. package/src/stateful-emulator.ts +2571 -0
  324. package/src/stateful-secrets.ts +299 -0
  325. package/src/subscription-usage-recordings.ts +77 -0
  326. package/src/subscription-usage.ts +68 -0
  327. package/src/telegram/api.ts +437 -0
  328. package/src/telegram/state.ts +229 -0
  329. package/src/telegram.ts +227 -0
  330. package/src/todoist/api.ts +736 -0
  331. package/src/todoist/state.ts +456 -0
  332. package/src/todoist.ts +316 -0
  333. package/src/xai.ts +341 -0
@@ -0,0 +1,252 @@
1
+ import { exactBodyKeys, exactQuery, isNotEmulated, notEmulated, statefulRoute } from "../stateful-emulator.mjs";
2
+ import { answer, evidence, googleEmulatorApisOrigin, googleErrorBody, googleJson, googleNoContent, isRunText, listPage, pageSize, param, recordedValue } from "./shared.mjs";
3
+ import { driveFile, driveFolderMimeType, mintedFolderId, mintedFolderIdPattern } from "./state.mjs";
4
+ import { Predicate } from "effect";
5
+ //#region src/google/drive.ts
6
+ /**
7
+ * Drive routes of the Google emulator (internal): the folder listing with page tokens, file reads
8
+ * with the connector's full `fields` selection, and the lifecycle of a run-scoped folder (create,
9
+ * trash, permanent delete, and the recorded 404 afterwards).
10
+ *
11
+ * Every answer comes from the Drive fixtures, through the seed or the request, or is minted (folder
12
+ * ids, page tokens, and `createdTime` / `modifiedTime` / `trashedTime` from the injectable clock).
13
+ * Every Drive request must send `accept: application/json`, as the fixtures record.
14
+ *
15
+ * @experimental
16
+ */
17
+ const listCase = "google.drive.list-page-token";
18
+ const fieldsCase = "google.drive.get-file-fields";
19
+ const folderCase = "google.drive.folder-trash-delete";
20
+ const fileIdSegment = /^[A-Za-z0-9_-]{10,200}$/;
21
+ const drive = (method, path, write, caseIds, withFile) => evidence(googleEmulatorApisOrigin, method, `/drive/v3/files${path}`, write, caseIds, withFile ? { fileId: fileIdSegment } : {});
22
+ /**
23
+ * The file `fields` selection the connector sends (a data copy of `googleDriveFileFields`; the
24
+ * fixture URLs carry it, so the drift test fails when it changes).
25
+ */
26
+ const fileFields = [
27
+ "kind",
28
+ "driveId",
29
+ "id",
30
+ "name",
31
+ "mimeType",
32
+ "description",
33
+ "starred",
34
+ "trashed",
35
+ "explicitlyTrashed",
36
+ "trashedTime",
37
+ "trashingUser",
38
+ "parents",
39
+ "spaces",
40
+ "version",
41
+ "webContentLink",
42
+ "webViewLink",
43
+ "iconLink",
44
+ "hasThumbnail",
45
+ "thumbnailLink",
46
+ "thumbnailVersion",
47
+ "viewedByMe",
48
+ "viewedByMeTime",
49
+ "createdTime",
50
+ "modifiedTime",
51
+ "modifiedByMeTime",
52
+ "sharedWithMeTime",
53
+ "ownedByMe",
54
+ "shared",
55
+ "owners",
56
+ "permissionIds",
57
+ "lastModifyingUser",
58
+ "sharingUser",
59
+ "size",
60
+ "quotaBytesUsed",
61
+ "md5Checksum",
62
+ "sha1Checksum",
63
+ "sha256Checksum",
64
+ "fileExtension",
65
+ "fullFileExtension",
66
+ "originalFilename",
67
+ "headRevisionId",
68
+ "folderColorRgb",
69
+ "resourceKey",
70
+ "copyRequiresWriterPermission",
71
+ "writersCanShare",
72
+ "properties",
73
+ "appProperties",
74
+ "capabilities",
75
+ "shortcutDetails",
76
+ "contentRestrictions",
77
+ "linkShareMetadata"
78
+ ].join(",");
79
+ const listFields = `kind,nextPageToken,incompleteSearch,files(${fileFields})`;
80
+ const parentQueryPattern = /^'([A-Za-z0-9_-]{10,200})' in parents and trashed = false$/;
81
+ const renderFile = (file, withoutParents = false) => {
82
+ const head = {
83
+ kind: "drive#file",
84
+ id: file.id,
85
+ name: file.name,
86
+ mimeType: file.mimeType,
87
+ starred: file.starred,
88
+ trashed: file.trashed,
89
+ explicitlyTrashed: file.explicitlyTrashed
90
+ };
91
+ if (file.trashedTime !== void 0) head.trashedTime = file.trashedTime;
92
+ return {
93
+ ...head,
94
+ parents: withoutParents ? [] : [...file.parents],
95
+ spaces: [...file.spaces],
96
+ version: file.version,
97
+ webViewLink: file.webViewLink,
98
+ iconLink: file.iconLink,
99
+ hasThumbnail: file.hasThumbnail,
100
+ viewedByMe: file.viewedByMe,
101
+ createdTime: file.createdTime,
102
+ modifiedTime: file.modifiedTime,
103
+ ownedByMe: file.ownedByMe,
104
+ shared: file.shared,
105
+ writersCanShare: file.writersCanShare,
106
+ capabilities: file.capabilities
107
+ };
108
+ };
109
+ /** Every Drive request sends `accept: application/json`, as the fixtures record. */
110
+ const acceptsJson = (request) => request.header("accept") === "application/json" ? void 0 : notEmulated("Drive requests without accept: application/json are not emulated");
111
+ /** The `supportsAllDrives=true&fields=<file fields>` query of file reads and writes. */
112
+ const fileQuery = (request) => {
113
+ const query = exactQuery(request, ["supportsAllDrives", "fields"]);
114
+ if (isNotEmulated(query)) return query;
115
+ return recordedValue(query, "supportsAllDrives", "true") ?? (query["fields"] === fileFields ? void 0 : notEmulated("a fields selection other than the connector one is not emulated"));
116
+ };
117
+ const findFile = (state, id) => state.files.find((file) => file.id === id);
118
+ /** A folder items can live in: an implied folder or a stored untrashed folder. */
119
+ const isLiveFolder = (state, id) => {
120
+ const folder = findFile(state, id);
121
+ return state.impliedFolderIds.includes(id) || folder !== void 0 && folder.mimeType === "application/vnd.google-apps.folder" && !folder.trashed;
122
+ };
123
+ const isCreatedHere = (file) => mintedFolderIdPattern.test(file.id);
124
+ const listFiles = statefulRoute(drive("GET", "", false, [
125
+ listCase,
126
+ fieldsCase,
127
+ folderCase
128
+ ], false), "none", (request) => {
129
+ const accepts = acceptsJson(request);
130
+ if (accepts !== void 0) return accepts;
131
+ const query = exactQuery(request, [
132
+ "pageSize",
133
+ "q",
134
+ "spaces",
135
+ "supportsAllDrives",
136
+ "includeItemsFromAllDrives",
137
+ "corpora",
138
+ "fields"
139
+ ], ["pageToken"]);
140
+ if (isNotEmulated(query)) return query;
141
+ const recorded = recordedValue(query, "spaces", "drive") ?? recordedValue(query, "supportsAllDrives", "true") ?? recordedValue(query, "includeItemsFromAllDrives", "true") ?? recordedValue(query, "corpora", "user") ?? (query["fields"] === listFields ? void 0 : notEmulated("a fields selection other than the connector one is not emulated"));
142
+ if (recorded !== void 0) return recorded;
143
+ const parentId = parentQueryPattern.exec(query["q"] ?? "")?.[1];
144
+ if (parentId === void 0) return notEmulated(`q other than '<folder>' in parents and trashed = false is not emulated`);
145
+ const size = pageSize(query["pageSize"], "pageSize", 1, 1e3);
146
+ if (isNotEmulated(size)) return size;
147
+ const pageToken = query["pageToken"];
148
+ return pageToken === "" ? notEmulated("an empty pageToken is not emulated") : {
149
+ parentId,
150
+ pageSize: size,
151
+ pageToken
152
+ };
153
+ }, (state, input, { env }) => {
154
+ if (!isLiveFolder(state, input.parentId)) return notEmulated("listing anything but a folder the state holds is not emulated");
155
+ const children = state.files.filter((file) => file.parents.includes(input.parentId) && (env.drills.listIncludesTrashed || !file.trashed));
156
+ if (children.length === 0) return notEmulated("a folder listing without items is not emulated (no fixture records one)");
157
+ return listPage(env, "drive", `drive\u0000${input.parentId}\u0000${input.pageSize}`, children.map((file) => renderFile(file)), input.pageSize, input.pageToken, env.drills.drivePageRepeats, (page, nextPageToken) => {
158
+ const head = {
159
+ kind: "drive#fileList",
160
+ incompleteSearch: false
161
+ };
162
+ if (nextPageToken !== void 0) head.nextPageToken = nextPageToken;
163
+ return googleJson(200, {
164
+ ...head,
165
+ files: [...page]
166
+ });
167
+ });
168
+ });
169
+ const getFile = statefulRoute(drive("GET", "/{fileId}", false, [fieldsCase, folderCase], true), "none", (request) => acceptsJson(request) ?? fileQuery(request) ?? param(request, "fileId"), (state, id, { env }) => {
170
+ const file = findFile(state, id);
171
+ if (file !== void 0) return answer(() => googleJson(200, renderFile(file, env.drills.getFileWithoutParents)));
172
+ if (state.impliedFolderIds.includes(id)) return notEmulated("reading a folder a fixture only names is not emulated");
173
+ return answer(() => googleJson(404, googleErrorBody(404, `File not found: ${id}.`, "notFound", "NOT_FOUND")));
174
+ });
175
+ /** The Drive routes, in manifest order. */
176
+ const driveRoutes = [
177
+ listFiles,
178
+ statefulRoute(drive("POST", "", true, [folderCase], false), "json", (request) => {
179
+ const body = acceptsJson(request) ?? fileQuery(request) ?? exactBodyKeys(request.json, "the create body", [
180
+ "name",
181
+ "mimeType",
182
+ "parents"
183
+ ]);
184
+ if (isNotEmulated(body)) return body;
185
+ const name = Predicate.isString(body.name) ? body.name : "";
186
+ if (!isRunText(name, "folder")) return notEmulated("a folder name other than \"yolk-conformance <runId> folder\"");
187
+ if (body.mimeType !== "application/vnd.google-apps.folder") return notEmulated("creating anything but a folder is not emulated");
188
+ const parents = body.parents;
189
+ return Array.isArray(parents) && parents.length === 1 && Predicate.isString(parents[0]) ? {
190
+ name,
191
+ parentId: parents[0]
192
+ } : notEmulated("a create with other than one parent is not emulated");
193
+ }, (state, input, { env }) => {
194
+ if (!isLiveFolder(state, input.parentId)) return notEmulated("creating a folder outside a folder the state holds is not emulated");
195
+ return () => {
196
+ const at = new Date(env.now()).toISOString();
197
+ const number = state.counters.nextFolderNumber;
198
+ const folder = driveFile({
199
+ id: mintedFolderId(number),
200
+ name: input.name,
201
+ mimeType: driveFolderMimeType,
202
+ parents: [input.parentId],
203
+ createdTime: at
204
+ });
205
+ state.counters = {
206
+ ...state.counters,
207
+ nextFolderNumber: number + 1
208
+ };
209
+ state.files = [...state.files, folder];
210
+ return googleJson(200, renderFile(folder));
211
+ };
212
+ }),
213
+ getFile,
214
+ statefulRoute(drive("PATCH", "/{fileId}", true, [folderCase], true), "json", (request) => {
215
+ const body = acceptsJson(request) ?? fileQuery(request) ?? exactBodyKeys(request.json, "the update body", ["trashed"]);
216
+ if (isNotEmulated(body)) return body;
217
+ return body.trashed === true ? param(request, "fileId") : notEmulated("updates other than { trashed: true } are not emulated");
218
+ }, (state, id, { env }) => {
219
+ const file = findFile(state, id);
220
+ if (file === void 0 || !isCreatedHere(file) || file.trashed) return notEmulated("trashing anything but a live folder created here is not emulated");
221
+ return () => {
222
+ const at = new Date(env.now()).toISOString();
223
+ const trashed = {
224
+ ...file,
225
+ trashed: true,
226
+ explicitlyTrashed: true,
227
+ trashedTime: at
228
+ };
229
+ state.files = state.files.map((candidate) => candidate.id === id ? trashed : candidate);
230
+ return googleJson(200, renderFile(trashed));
231
+ };
232
+ }),
233
+ statefulRoute(drive("DELETE", "/{fileId}", true, [folderCase], true), "none", (request) => {
234
+ const accepts = acceptsJson(request);
235
+ if (accepts !== void 0) return accepts;
236
+ const query = exactQuery(request, ["supportsAllDrives"]);
237
+ if (isNotEmulated(query)) return query;
238
+ return recordedValue(query, "supportsAllDrives", "true") ?? param(request, "fileId");
239
+ }, (state, id) => {
240
+ const file = findFile(state, id);
241
+ if (file === void 0 || !isCreatedHere(file)) return notEmulated("deleting anything but a folder created here is not emulated");
242
+ if (state.files.some((candidate) => candidate.parents.includes(id))) return notEmulated("deleting a folder that holds items is not emulated");
243
+ return () => {
244
+ state.files = state.files.filter((candidate) => candidate.id !== id);
245
+ return googleNoContent();
246
+ };
247
+ })
248
+ ];
249
+ //#endregion
250
+ export { driveRoutes };
251
+
252
+ //# sourceMappingURL=drive.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.mjs","names":[],"sources":["../../src/google/drive.ts"],"sourcesContent":["/**\n * Drive routes of the Google emulator (internal): the folder listing with page tokens, file reads\n * with the connector's full `fields` selection, and the lifecycle of a run-scoped folder (create,\n * trash, permanent delete, and the recorded 404 afterwards).\n *\n * Every answer comes from the Drive fixtures, through the seed or the request, or is minted (folder\n * ids, page tokens, and `createdTime` / `modifiedTime` / `trashedTime` from the injectable clock).\n * Every Drive request must send `accept: application/json`, as the fixtures record.\n *\n * @experimental\n */\nimport { Predicate } from 'effect'\nimport type * as Schema from 'effect/Schema'\nimport {\n exactBodyKeys,\n exactQuery,\n isNotEmulated,\n notEmulated,\n statefulRoute,\n type EmulatedRequest,\n type NotEmulated\n} from '../stateful-emulator.ts'\nimport {\n answer,\n evidence,\n googleEmulatorApisOrigin,\n googleErrorBody,\n googleJson,\n googleNoContent,\n isRunText,\n listPage,\n pageSize,\n param,\n recordedValue,\n type GoogleRoute\n} from './shared.ts'\nimport {\n driveFile,\n driveFolderMimeType,\n mintedFolderId,\n mintedFolderIdPattern,\n type GoogleEmulatorDriveFile,\n type GoogleEmulatorState\n} from './state.ts'\n\nconst listCase = 'google.drive.list-page-token'\n\nconst fieldsCase = 'google.drive.get-file-fields'\n\nconst folderCase = 'google.drive.folder-trash-delete'\n\nconst fileIdSegment = /^[A-Za-z0-9_-]{10,200}$/\n\nconst drive = (\n method: string,\n path: string,\n write: boolean,\n caseIds: ReadonlyArray<string>,\n withFile: boolean\n) =>\n evidence(\n googleEmulatorApisOrigin,\n method,\n `/drive/v3/files${path}`,\n write,\n caseIds,\n withFile ? { fileId: fileIdSegment } : {}\n )\n\n/**\n * The file `fields` selection the connector sends (a data copy of `googleDriveFileFields`; the\n * fixture URLs carry it, so the drift test fails when it changes).\n */\nconst fileFields = [\n 'kind',\n 'driveId',\n 'id',\n 'name',\n 'mimeType',\n 'description',\n 'starred',\n 'trashed',\n 'explicitlyTrashed',\n 'trashedTime',\n 'trashingUser',\n 'parents',\n 'spaces',\n 'version',\n 'webContentLink',\n 'webViewLink',\n 'iconLink',\n 'hasThumbnail',\n 'thumbnailLink',\n 'thumbnailVersion',\n 'viewedByMe',\n 'viewedByMeTime',\n 'createdTime',\n 'modifiedTime',\n 'modifiedByMeTime',\n 'sharedWithMeTime',\n 'ownedByMe',\n 'shared',\n 'owners',\n 'permissionIds',\n 'lastModifyingUser',\n 'sharingUser',\n 'size',\n 'quotaBytesUsed',\n 'md5Checksum',\n 'sha1Checksum',\n 'sha256Checksum',\n 'fileExtension',\n 'fullFileExtension',\n 'originalFilename',\n 'headRevisionId',\n 'folderColorRgb',\n 'resourceKey',\n 'copyRequiresWriterPermission',\n 'writersCanShare',\n 'properties',\n 'appProperties',\n 'capabilities',\n 'shortcutDetails',\n 'contentRestrictions',\n 'linkShareMetadata'\n].join(',')\n\nconst listFields = `kind,nextPageToken,incompleteSearch,files(${fileFields})`\n\nconst parentQueryPattern = /^'([A-Za-z0-9_-]{10,200})' in parents and trashed = false$/\n\n// Rendering, in the fixture key order.\n\ntype FileHead = {\n readonly kind: string\n readonly id: string\n readonly name: string\n readonly mimeType: string\n readonly starred: boolean\n readonly trashed: boolean\n readonly explicitlyTrashed: boolean\n trashedTime?: string\n}\n\ntype FileListHead = {\n readonly kind: string\n readonly incompleteSearch: boolean\n nextPageToken?: string\n}\n\nconst renderFile = (file: GoogleEmulatorDriveFile, withoutParents = false): Schema.JsonObject => {\n const head: FileHead = {\n kind: 'drive#file',\n id: file.id,\n name: file.name,\n mimeType: file.mimeType,\n starred: file.starred,\n trashed: file.trashed,\n explicitlyTrashed: file.explicitlyTrashed\n }\n\n // Drive answers `trashedTime` only for a trashed item.\n if (file.trashedTime !== undefined) head.trashedTime = file.trashedTime\n\n return {\n ...head,\n parents: withoutParents ? [] : [...file.parents],\n spaces: [...file.spaces],\n version: file.version,\n webViewLink: file.webViewLink,\n iconLink: file.iconLink,\n hasThumbnail: file.hasThumbnail,\n viewedByMe: file.viewedByMe,\n createdTime: file.createdTime,\n modifiedTime: file.modifiedTime,\n ownedByMe: file.ownedByMe,\n shared: file.shared,\n writersCanShare: file.writersCanShare,\n capabilities: file.capabilities\n }\n}\n\n/** Every Drive request sends `accept: application/json`, as the fixtures record. */\nconst acceptsJson = (request: EmulatedRequest): NotEmulated | undefined =>\n request.header('accept') === 'application/json'\n ? undefined\n : notEmulated('Drive requests without accept: application/json are not emulated')\n\n/** The `supportsAllDrives=true&fields=<file fields>` query of file reads and writes. */\nconst fileQuery = (request: EmulatedRequest): NotEmulated | undefined => {\n const query = exactQuery(request, ['supportsAllDrives', 'fields'])\n\n if (isNotEmulated(query)) return query\n\n return (\n recordedValue(query, 'supportsAllDrives', 'true') ??\n (query['fields'] === fileFields\n ? undefined\n : notEmulated('a fields selection other than the connector one is not emulated'))\n )\n}\n\nconst findFile = (state: GoogleEmulatorState, id: string) =>\n state.files.find(file => file.id === id)\n\n/** A folder items can live in: an implied folder or a stored untrashed folder. */\nconst isLiveFolder = (state: GoogleEmulatorState, id: string): boolean => {\n const folder = findFile(state, id)\n\n return (\n state.impliedFolderIds.includes(id) ||\n (folder !== undefined && folder.mimeType === driveFolderMimeType && !folder.trashed)\n )\n}\n\nconst isCreatedHere = (file: GoogleEmulatorDriveFile): boolean =>\n mintedFolderIdPattern.test(file.id)\n\n// Listing.\n\ntype ListInput = {\n readonly parentId: string\n readonly pageSize: number\n readonly pageToken: string | undefined\n}\n\nconst listFiles: GoogleRoute = statefulRoute(\n drive('GET', '', false, [listCase, fieldsCase, folderCase], false),\n 'none',\n (request): ListInput | NotEmulated => {\n const accepts = acceptsJson(request)\n\n if (accepts !== undefined) return accepts\n\n const query = exactQuery(\n request,\n [\n 'pageSize',\n 'q',\n 'spaces',\n 'supportsAllDrives',\n 'includeItemsFromAllDrives',\n 'corpora',\n 'fields'\n ],\n ['pageToken']\n )\n\n if (isNotEmulated(query)) return query\n\n const recorded =\n recordedValue(query, 'spaces', 'drive') ??\n recordedValue(query, 'supportsAllDrives', 'true') ??\n recordedValue(query, 'includeItemsFromAllDrives', 'true') ??\n recordedValue(query, 'corpora', 'user') ??\n (query['fields'] === listFields\n ? undefined\n : notEmulated('a fields selection other than the connector one is not emulated'))\n\n if (recorded !== undefined) return recorded\n\n const parentId = parentQueryPattern.exec(query['q'] ?? '')?.[1]\n\n if (parentId === undefined) {\n return notEmulated(`q other than '<folder>' in parents and trashed = false is not emulated`)\n }\n\n const size = pageSize(query['pageSize'], 'pageSize', 1, 1000)\n\n if (isNotEmulated(size)) return size\n\n const pageToken = query['pageToken']\n\n return pageToken === ''\n ? notEmulated('an empty pageToken is not emulated')\n : { parentId, pageSize: size, pageToken }\n },\n (state, input, { env }) => {\n if (!isLiveFolder(state, input.parentId)) {\n return notEmulated('listing anything but a folder the state holds is not emulated')\n }\n\n const children = state.files.filter(\n file =>\n file.parents.includes(input.parentId) && (env.drills.listIncludesTrashed || !file.trashed)\n )\n\n // Every recorded listing has children; an empty one is no fixture's answer.\n if (children.length === 0) {\n return notEmulated('a folder listing without items is not emulated (no fixture records one)')\n }\n\n return listPage(\n env,\n 'drive',\n `drive\\u0000${input.parentId}\\u0000${input.pageSize}`,\n children.map(file => renderFile(file)),\n input.pageSize,\n input.pageToken,\n env.drills.drivePageRepeats,\n (page, nextPageToken) => {\n const head: FileListHead = { kind: 'drive#fileList', incompleteSearch: false }\n\n // The last page carries no `nextPageToken`.\n if (nextPageToken !== undefined) head.nextPageToken = nextPageToken\n\n return googleJson(200, { ...head, files: [...page] })\n }\n )\n }\n)\n\n// File reads and the folder lifecycle.\n\nconst getFile: GoogleRoute = statefulRoute(\n drive('GET', '/{fileId}', false, [fieldsCase, folderCase], true),\n 'none',\n request => acceptsJson(request) ?? fileQuery(request) ?? param(request, 'fileId'),\n (state, id, { env }) => {\n const file = findFile(state, id)\n\n if (file !== undefined) {\n return answer(() => googleJson(200, renderFile(file, env.drills.getFileWithoutParents)))\n }\n\n if (state.impliedFolderIds.includes(id)) {\n return notEmulated('reading a folder a fixture only names is not emulated')\n }\n\n // The recorded not-found answer of an item the account does not hold.\n return answer(() =>\n googleJson(404, googleErrorBody(404, `File not found: ${id}.`, 'notFound', 'NOT_FOUND'))\n )\n }\n)\n\ntype CreateInput = { readonly name: string; readonly parentId: string }\n\nconst createFolder: GoogleRoute = statefulRoute(\n drive('POST', '', true, [folderCase], false),\n 'json',\n (request): CreateInput | NotEmulated => {\n const body =\n acceptsJson(request) ??\n fileQuery(request) ??\n exactBodyKeys(request.json, 'the create body', ['name', 'mimeType', 'parents'])\n\n if (isNotEmulated(body)) return body\n\n const name = Predicate.isString(body.name) ? body.name : ''\n\n if (!isRunText(name, 'folder')) {\n return notEmulated('a folder name other than \"yolk-conformance <runId> folder\"')\n }\n\n if (body.mimeType !== driveFolderMimeType) {\n return notEmulated('creating anything but a folder is not emulated')\n }\n\n const parents = body.parents\n\n return Array.isArray(parents) && parents.length === 1 && Predicate.isString(parents[0])\n ? { name, parentId: parents[0] }\n : notEmulated('a create with other than one parent is not emulated')\n },\n (state, input, { env }) => {\n if (!isLiveFolder(state, input.parentId)) {\n return notEmulated('creating a folder outside a folder the state holds is not emulated')\n }\n\n return () => {\n // Read the clock before any write: a failing clock writes nothing.\n const at = new Date(env.now()).toISOString()\n const number = state.counters.nextFolderNumber\n\n const folder = driveFile({\n id: mintedFolderId(number),\n name: input.name,\n mimeType: driveFolderMimeType,\n parents: [input.parentId],\n createdTime: at\n })\n\n state.counters = { ...state.counters, nextFolderNumber: number + 1 }\n state.files = [...state.files, folder]\n\n return googleJson(200, renderFile(folder))\n }\n }\n)\n\nconst trashFile: GoogleRoute = statefulRoute(\n drive('PATCH', '/{fileId}', true, [folderCase], true),\n 'json',\n (request): string | NotEmulated => {\n const body =\n acceptsJson(request) ??\n fileQuery(request) ??\n exactBodyKeys(request.json, 'the update body', ['trashed'])\n\n if (isNotEmulated(body)) return body\n\n return body.trashed === true\n ? param(request, 'fileId')\n : notEmulated('updates other than { trashed: true } are not emulated')\n },\n (state, id, { env }) => {\n const file = findFile(state, id)\n\n if (file === undefined || !isCreatedHere(file) || file.trashed) {\n return notEmulated('trashing anything but a live folder created here is not emulated')\n }\n\n return () => {\n const at = new Date(env.now()).toISOString()\n\n const trashed: GoogleEmulatorDriveFile = {\n ...file,\n trashed: true,\n explicitlyTrashed: true,\n trashedTime: at\n }\n\n state.files = state.files.map(candidate => (candidate.id === id ? trashed : candidate))\n\n return googleJson(200, renderFile(trashed))\n }\n }\n)\n\nconst deleteFile: GoogleRoute = statefulRoute(\n drive('DELETE', '/{fileId}', true, [folderCase], true),\n 'none',\n (request): string | NotEmulated => {\n const accepts = acceptsJson(request)\n\n if (accepts !== undefined) return accepts\n\n const query = exactQuery(request, ['supportsAllDrives'])\n\n if (isNotEmulated(query)) return query\n\n return recordedValue(query, 'supportsAllDrives', 'true') ?? param(request, 'fileId')\n },\n (state, id) => {\n const file = findFile(state, id)\n\n if (file === undefined || !isCreatedHere(file)) {\n return notEmulated('deleting anything but a folder created here is not emulated')\n }\n\n if (state.files.some(candidate => candidate.parents.includes(id))) {\n return notEmulated('deleting a folder that holds items is not emulated')\n }\n\n return () => {\n state.files = state.files.filter(candidate => candidate.id !== id)\n\n return googleNoContent()\n }\n }\n)\n\n/** The Drive routes, in manifest order. */\nexport const driveRoutes: ReadonlyArray<GoogleRoute> = [\n listFiles,\n createFolder,\n getFile,\n trashFile,\n deleteFile\n]\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { GoogleRoute } from "./shared.mjs";
2
+
3
+ //#region src/google/gmail.d.ts
4
+ /** Path prefix of every Gmail API route (`/gmail/v1/users/me`). */
5
+ declare const gmailApiPath = "/gmail/v1/users/me";
6
+ /** The Gmail routes, in manifest order. */
7
+ declare const gmailRoutes: ReadonlyArray<GoogleRoute>;
8
+ //#endregion
9
+ export { gmailApiPath, gmailRoutes };
10
+ //# sourceMappingURL=gmail.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.d.mts","names":[],"sources":["../../src/google/gmail.ts"],"mappings":";;;;cA4Da,YAAA;AAAb;AAAA,cAu6Ba,WAAA,EAAa,aAAa,CAAC,WAAA"}