skywriter 1.0.0

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 (561) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +852 -0
  3. package/dist/cli/commands/host.d.ts +6 -0
  4. package/dist/cli/commands/host.d.ts.map +1 -0
  5. package/dist/cli/commands/host.js +52 -0
  6. package/dist/cli/commands/host.js.map +1 -0
  7. package/dist/cli/commands/init.d.ts +15 -0
  8. package/dist/cli/commands/init.d.ts.map +1 -0
  9. package/dist/cli/commands/init.js +207 -0
  10. package/dist/cli/commands/init.js.map +1 -0
  11. package/dist/cli/commands/login.d.ts +18 -0
  12. package/dist/cli/commands/login.d.ts.map +1 -0
  13. package/dist/cli/commands/login.js +152 -0
  14. package/dist/cli/commands/login.js.map +1 -0
  15. package/dist/cli/commands/logout.d.ts +15 -0
  16. package/dist/cli/commands/logout.d.ts.map +1 -0
  17. package/dist/cli/commands/logout.js +62 -0
  18. package/dist/cli/commands/logout.js.map +1 -0
  19. package/dist/cli/commands/pull.d.ts +19 -0
  20. package/dist/cli/commands/pull.d.ts.map +1 -0
  21. package/dist/cli/commands/pull.js +44 -0
  22. package/dist/cli/commands/pull.js.map +1 -0
  23. package/dist/cli/commands/push.d.ts +9 -0
  24. package/dist/cli/commands/push.d.ts.map +1 -0
  25. package/dist/cli/commands/push.js +49 -0
  26. package/dist/cli/commands/push.js.map +1 -0
  27. package/dist/cli/commands/removeServer.d.ts +9 -0
  28. package/dist/cli/commands/removeServer.d.ts.map +1 -0
  29. package/dist/cli/commands/removeServer.js +55 -0
  30. package/dist/cli/commands/removeServer.js.map +1 -0
  31. package/dist/cli/commands/render.d.ts +6 -0
  32. package/dist/cli/commands/render.d.ts.map +1 -0
  33. package/dist/cli/commands/render.js +11 -0
  34. package/dist/cli/commands/render.js.map +1 -0
  35. package/dist/cli/commands/serve.d.ts +7 -0
  36. package/dist/cli/commands/serve.d.ts.map +1 -0
  37. package/dist/cli/commands/serve.js +55 -0
  38. package/dist/cli/commands/serve.js.map +1 -0
  39. package/dist/cli/commands/sessions.d.ts +6 -0
  40. package/dist/cli/commands/sessions.d.ts.map +1 -0
  41. package/dist/cli/commands/sessions.js +24 -0
  42. package/dist/cli/commands/sessions.js.map +1 -0
  43. package/dist/cli/commands/settings.d.ts +10 -0
  44. package/dist/cli/commands/settings.d.ts.map +1 -0
  45. package/dist/cli/commands/settings.js +69 -0
  46. package/dist/cli/commands/settings.js.map +1 -0
  47. package/dist/cli/commands/switchServer.d.ts +9 -0
  48. package/dist/cli/commands/switchServer.d.ts.map +1 -0
  49. package/dist/cli/commands/switchServer.js +52 -0
  50. package/dist/cli/commands/switchServer.js.map +1 -0
  51. package/dist/cli/commands/vscodeInit.d.ts +13 -0
  52. package/dist/cli/commands/vscodeInit.d.ts.map +1 -0
  53. package/dist/cli/commands/vscodeInit.js +152 -0
  54. package/dist/cli/commands/vscodeInit.js.map +1 -0
  55. package/dist/cli/commands/whoami.d.ts +6 -0
  56. package/dist/cli/commands/whoami.d.ts.map +1 -0
  57. package/dist/cli/commands/whoami.js +67 -0
  58. package/dist/cli/commands/whoami.js.map +1 -0
  59. package/dist/cli/index.d.ts +3 -0
  60. package/dist/cli/index.d.ts.map +1 -0
  61. package/dist/cli/index.js +5 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/middleware/checkDuplicatePath.d.ts +19 -0
  64. package/dist/cli/middleware/checkDuplicatePath.d.ts.map +1 -0
  65. package/dist/cli/middleware/checkDuplicatePath.js +45 -0
  66. package/dist/cli/middleware/checkDuplicatePath.js.map +1 -0
  67. package/dist/cli/middleware/redirectRoot.d.ts +18 -0
  68. package/dist/cli/middleware/redirectRoot.d.ts.map +1 -0
  69. package/dist/cli/middleware/redirectRoot.js +44 -0
  70. package/dist/cli/middleware/redirectRoot.js.map +1 -0
  71. package/dist/cli/middleware/serveDocument.d.ts +10 -0
  72. package/dist/cli/middleware/serveDocument.d.ts.map +1 -0
  73. package/dist/cli/middleware/serveDocument.js +104 -0
  74. package/dist/cli/middleware/serveDocument.js.map +1 -0
  75. package/dist/cli/middleware/serveUploads.d.ts +20 -0
  76. package/dist/cli/middleware/serveUploads.d.ts.map +1 -0
  77. package/dist/cli/middleware/serveUploads.js +93 -0
  78. package/dist/cli/middleware/serveUploads.js.map +1 -0
  79. package/dist/cli/middleware/types.d.ts +43 -0
  80. package/dist/cli/middleware/types.d.ts.map +1 -0
  81. package/dist/cli/middleware/types.js +2 -0
  82. package/dist/cli/middleware/types.js.map +1 -0
  83. package/dist/cli/pathOperations/deletePathUploads.d.ts +6 -0
  84. package/dist/cli/pathOperations/deletePathUploads.d.ts.map +1 -0
  85. package/dist/cli/pathOperations/deletePathUploads.js +68 -0
  86. package/dist/cli/pathOperations/deletePathUploads.js.map +1 -0
  87. package/dist/cli/pathOperations/downloadPathUploads.d.ts +6 -0
  88. package/dist/cli/pathOperations/downloadPathUploads.d.ts.map +1 -0
  89. package/dist/cli/pathOperations/downloadPathUploads.js +156 -0
  90. package/dist/cli/pathOperations/downloadPathUploads.js.map +1 -0
  91. package/dist/cli/pathOperations/pullPathViaGit.d.ts +9 -0
  92. package/dist/cli/pathOperations/pullPathViaGit.d.ts.map +1 -0
  93. package/dist/cli/pathOperations/pullPathViaGit.js +86 -0
  94. package/dist/cli/pathOperations/pullPathViaGit.js.map +1 -0
  95. package/dist/cli/pathOperations/pullPathViaTar.d.ts +14 -0
  96. package/dist/cli/pathOperations/pullPathViaTar.d.ts.map +1 -0
  97. package/dist/cli/pathOperations/pullPathViaTar.js +252 -0
  98. package/dist/cli/pathOperations/pullPathViaTar.js.map +1 -0
  99. package/dist/cli/pathOperations/pushPathViaGit.d.ts +9 -0
  100. package/dist/cli/pathOperations/pushPathViaGit.d.ts.map +1 -0
  101. package/dist/cli/pathOperations/pushPathViaGit.js +49 -0
  102. package/dist/cli/pathOperations/pushPathViaGit.js.map +1 -0
  103. package/dist/cli/pathOperations/pushPathViaTar.d.ts +6 -0
  104. package/dist/cli/pathOperations/pushPathViaTar.d.ts.map +1 -0
  105. package/dist/cli/pathOperations/pushPathViaTar.js +63 -0
  106. package/dist/cli/pathOperations/pushPathViaTar.js.map +1 -0
  107. package/dist/cli/pathOperations/uploadPathUploads.d.ts +6 -0
  108. package/dist/cli/pathOperations/uploadPathUploads.d.ts.map +1 -0
  109. package/dist/cli/pathOperations/uploadPathUploads.js +114 -0
  110. package/dist/cli/pathOperations/uploadPathUploads.js.map +1 -0
  111. package/dist/cli/pathOperations/validatePathSettings.d.ts +14 -0
  112. package/dist/cli/pathOperations/validatePathSettings.d.ts.map +1 -0
  113. package/dist/cli/pathOperations/validatePathSettings.js +191 -0
  114. package/dist/cli/pathOperations/validatePathSettings.js.map +1 -0
  115. package/dist/cli/utils/assemble.d.ts +22 -0
  116. package/dist/cli/utils/assemble.d.ts.map +1 -0
  117. package/dist/cli/utils/assemble.js +219 -0
  118. package/dist/cli/utils/assemble.js.map +1 -0
  119. package/dist/cli/utils/cliName.d.ts +3 -0
  120. package/dist/cli/utils/cliName.d.ts.map +1 -0
  121. package/dist/cli/utils/cliName.js +17 -0
  122. package/dist/cli/utils/cliName.js.map +1 -0
  123. package/dist/cli/utils/codeWorkspace.d.ts +13 -0
  124. package/dist/cli/utils/codeWorkspace.d.ts.map +1 -0
  125. package/dist/cli/utils/codeWorkspace.js +20 -0
  126. package/dist/cli/utils/codeWorkspace.js.map +1 -0
  127. package/dist/cli/utils/colors.d.ts +14 -0
  128. package/dist/cli/utils/colors.d.ts.map +1 -0
  129. package/dist/cli/utils/colors.js +22 -0
  130. package/dist/cli/utils/colors.js.map +1 -0
  131. package/dist/cli/utils/config.d.ts +35 -0
  132. package/dist/cli/utils/config.d.ts.map +1 -0
  133. package/dist/cli/utils/config.js +95 -0
  134. package/dist/cli/utils/config.js.map +1 -0
  135. package/dist/cli/utils/copilotInstructions.d.ts +5 -0
  136. package/dist/cli/utils/copilotInstructions.d.ts.map +1 -0
  137. package/dist/cli/utils/copilotInstructions.js +101 -0
  138. package/dist/cli/utils/copilotInstructions.js.map +1 -0
  139. package/dist/cli/utils/createLoggedFs.d.ts +17 -0
  140. package/dist/cli/utils/createLoggedFs.d.ts.map +1 -0
  141. package/dist/cli/utils/createLoggedFs.js +106 -0
  142. package/dist/cli/utils/createLoggedFs.js.map +1 -0
  143. package/dist/cli/utils/credentials.d.ts +38 -0
  144. package/dist/cli/utils/credentials.d.ts.map +1 -0
  145. package/dist/cli/utils/credentials.js +400 -0
  146. package/dist/cli/utils/credentials.js.map +1 -0
  147. package/dist/cli/utils/discover.d.ts +26 -0
  148. package/dist/cli/utils/discover.d.ts.map +1 -0
  149. package/dist/cli/utils/discover.js +209 -0
  150. package/dist/cli/utils/discover.js.map +1 -0
  151. package/dist/cli/utils/formatPlan.d.ts +40 -0
  152. package/dist/cli/utils/formatPlan.d.ts.map +1 -0
  153. package/dist/cli/utils/formatPlan.js +148 -0
  154. package/dist/cli/utils/formatPlan.js.map +1 -0
  155. package/dist/cli/utils/git.d.ts +17 -0
  156. package/dist/cli/utils/git.d.ts.map +1 -0
  157. package/dist/cli/utils/git.js +57 -0
  158. package/dist/cli/utils/git.js.map +1 -0
  159. package/dist/cli/utils/gitUrl.d.ts +7 -0
  160. package/dist/cli/utils/gitUrl.d.ts.map +1 -0
  161. package/dist/cli/utils/gitUrl.js +23 -0
  162. package/dist/cli/utils/gitUrl.js.map +1 -0
  163. package/dist/cli/utils/log.d.ts +22 -0
  164. package/dist/cli/utils/log.d.ts.map +1 -0
  165. package/dist/cli/utils/log.js +31 -0
  166. package/dist/cli/utils/log.js.map +1 -0
  167. package/dist/cli/utils/logData.d.ts +5 -0
  168. package/dist/cli/utils/logData.d.ts.map +1 -0
  169. package/dist/cli/utils/logData.js +65 -0
  170. package/dist/cli/utils/logData.js.map +1 -0
  171. package/dist/cli/utils/loggedFetch.d.ts +4 -0
  172. package/dist/cli/utils/loggedFetch.d.ts.map +1 -0
  173. package/dist/cli/utils/loggedFetch.js +15 -0
  174. package/dist/cli/utils/loggedFetch.js.map +1 -0
  175. package/dist/cli/utils/pageContext.d.ts +50 -0
  176. package/dist/cli/utils/pageContext.d.ts.map +1 -0
  177. package/dist/cli/utils/pageContext.js +86 -0
  178. package/dist/cli/utils/pageContext.js.map +1 -0
  179. package/dist/cli/utils/parseDocumentPath.d.ts +13 -0
  180. package/dist/cli/utils/parseDocumentPath.d.ts.map +1 -0
  181. package/dist/cli/utils/parseDocumentPath.js +35 -0
  182. package/dist/cli/utils/parseDocumentPath.js.map +1 -0
  183. package/dist/cli/utils/populateCache.d.ts +12 -0
  184. package/dist/cli/utils/populateCache.d.ts.map +1 -0
  185. package/dist/cli/utils/populateCache.js +21 -0
  186. package/dist/cli/utils/populateCache.js.map +1 -0
  187. package/dist/cli/utils/prefixLog.d.ts +21 -0
  188. package/dist/cli/utils/prefixLog.d.ts.map +1 -0
  189. package/dist/cli/utils/prefixLog.js +73 -0
  190. package/dist/cli/utils/prefixLog.js.map +1 -0
  191. package/dist/cli/utils/program.d.ts +7 -0
  192. package/dist/cli/utils/program.d.ts.map +1 -0
  193. package/dist/cli/utils/program.js +266 -0
  194. package/dist/cli/utils/program.js.map +1 -0
  195. package/dist/cli/utils/promptExec.d.ts +27 -0
  196. package/dist/cli/utils/promptExec.d.ts.map +1 -0
  197. package/dist/cli/utils/promptExec.js +47 -0
  198. package/dist/cli/utils/promptExec.js.map +1 -0
  199. package/dist/cli/utils/pullHarness.d.ts +15 -0
  200. package/dist/cli/utils/pullHarness.d.ts.map +1 -0
  201. package/dist/cli/utils/pullHarness.js +101 -0
  202. package/dist/cli/utils/pullHarness.js.map +1 -0
  203. package/dist/cli/utils/pullViaGit.d.ts +6 -0
  204. package/dist/cli/utils/pullViaGit.d.ts.map +1 -0
  205. package/dist/cli/utils/pullViaGit.js +13 -0
  206. package/dist/cli/utils/pullViaGit.js.map +1 -0
  207. package/dist/cli/utils/pullViaTar.d.ts +10 -0
  208. package/dist/cli/utils/pullViaTar.d.ts.map +1 -0
  209. package/dist/cli/utils/pullViaTar.js +15 -0
  210. package/dist/cli/utils/pullViaTar.js.map +1 -0
  211. package/dist/cli/utils/pushHarness.d.ts +24 -0
  212. package/dist/cli/utils/pushHarness.d.ts.map +1 -0
  213. package/dist/cli/utils/pushHarness.js +82 -0
  214. package/dist/cli/utils/pushHarness.js.map +1 -0
  215. package/dist/cli/utils/pushViaGit.d.ts +6 -0
  216. package/dist/cli/utils/pushViaGit.d.ts.map +1 -0
  217. package/dist/cli/utils/pushViaGit.js +16 -0
  218. package/dist/cli/utils/pushViaGit.js.map +1 -0
  219. package/dist/cli/utils/pushViaTar.d.ts +6 -0
  220. package/dist/cli/utils/pushViaTar.d.ts.map +1 -0
  221. package/dist/cli/utils/pushViaTar.js +9 -0
  222. package/dist/cli/utils/pushViaTar.js.map +1 -0
  223. package/dist/cli/utils/resolveTarget.d.ts +23 -0
  224. package/dist/cli/utils/resolveTarget.d.ts.map +1 -0
  225. package/dist/cli/utils/resolveTarget.js +43 -0
  226. package/dist/cli/utils/resolveTarget.js.map +1 -0
  227. package/dist/cli/utils/settingsValidation.d.ts +23 -0
  228. package/dist/cli/utils/settingsValidation.d.ts.map +1 -0
  229. package/dist/cli/utils/settingsValidation.js +176 -0
  230. package/dist/cli/utils/settingsValidation.js.map +1 -0
  231. package/dist/cli/utils/types.d.ts +33 -0
  232. package/dist/cli/utils/types.d.ts.map +1 -0
  233. package/dist/cli/utils/types.js +2 -0
  234. package/dist/cli/utils/types.js.map +1 -0
  235. package/dist/cli/utils/validateAndGetFilesFromDir.d.ts +10 -0
  236. package/dist/cli/utils/validateAndGetFilesFromDir.d.ts.map +1 -0
  237. package/dist/cli/utils/validateAndGetFilesFromDir.js +74 -0
  238. package/dist/cli/utils/validateAndGetFilesFromDir.js.map +1 -0
  239. package/dist/cli/utils/watchForChanges.d.ts +7 -0
  240. package/dist/cli/utils/watchForChanges.d.ts.map +1 -0
  241. package/dist/cli/utils/watchForChanges.js +44 -0
  242. package/dist/cli/utils/watchForChanges.js.map +1 -0
  243. package/dist/db/index.d.ts +5 -0
  244. package/dist/db/index.d.ts.map +1 -0
  245. package/dist/db/index.js +23 -0
  246. package/dist/db/index.js.map +1 -0
  247. package/dist/editor.bundle.dev.js +30823 -0
  248. package/dist/editor.bundle.dev.js.map +7 -0
  249. package/dist/editor.bundle.js +30347 -0
  250. package/dist/editor.bundle.js.map +7 -0
  251. package/dist/editor.bundle.prod.js +1373 -0
  252. package/dist/index.d.ts +5 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +4 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/operations/addRedirect.d.ts +20 -0
  257. package/dist/operations/addRedirect.d.ts.map +1 -0
  258. package/dist/operations/addRedirect.js +46 -0
  259. package/dist/operations/addRedirect.js.map +1 -0
  260. package/dist/operations/addUpload.d.ts +29 -0
  261. package/dist/operations/addUpload.d.ts.map +1 -0
  262. package/dist/operations/addUpload.js +96 -0
  263. package/dist/operations/addUpload.js.map +1 -0
  264. package/dist/operations/addUploadsFromContent.d.ts +27 -0
  265. package/dist/operations/addUploadsFromContent.d.ts.map +1 -0
  266. package/dist/operations/addUploadsFromContent.js +311 -0
  267. package/dist/operations/addUploadsFromContent.js.map +1 -0
  268. package/dist/operations/clearDraft.d.ts +17 -0
  269. package/dist/operations/clearDraft.d.ts.map +1 -0
  270. package/dist/operations/clearDraft.js +56 -0
  271. package/dist/operations/clearDraft.js.map +1 -0
  272. package/dist/operations/createDocumentRecord.d.ts +11 -0
  273. package/dist/operations/createDocumentRecord.d.ts.map +1 -0
  274. package/dist/operations/createDocumentRecord.js +100 -0
  275. package/dist/operations/createDocumentRecord.js.map +1 -0
  276. package/dist/operations/createRoute.d.ts +6 -0
  277. package/dist/operations/createRoute.d.ts.map +1 -0
  278. package/dist/operations/createRoute.js +10 -0
  279. package/dist/operations/createRoute.js.map +1 -0
  280. package/dist/operations/createSession.d.ts +21 -0
  281. package/dist/operations/createSession.d.ts.map +1 -0
  282. package/dist/operations/createSession.js +27 -0
  283. package/dist/operations/createSession.js.map +1 -0
  284. package/dist/operations/deleteSession.d.ts +13 -0
  285. package/dist/operations/deleteSession.d.ts.map +1 -0
  286. package/dist/operations/deleteSession.js +15 -0
  287. package/dist/operations/deleteSession.js.map +1 -0
  288. package/dist/operations/findDocument.d.ts +18 -0
  289. package/dist/operations/findDocument.d.ts.map +1 -0
  290. package/dist/operations/findDocument.js +53 -0
  291. package/dist/operations/findDocument.js.map +1 -0
  292. package/dist/operations/getAllUploadsForDocument.d.ts +11 -0
  293. package/dist/operations/getAllUploadsForDocument.d.ts.map +1 -0
  294. package/dist/operations/getAllUploadsForDocument.js +15 -0
  295. package/dist/operations/getAllUploadsForDocument.js.map +1 -0
  296. package/dist/operations/getDocumentClientState.d.ts +30 -0
  297. package/dist/operations/getDocumentClientState.d.ts.map +1 -0
  298. package/dist/operations/getDocumentClientState.js +246 -0
  299. package/dist/operations/getDocumentClientState.js.map +1 -0
  300. package/dist/operations/getDocumentInstance.d.ts +7 -0
  301. package/dist/operations/getDocumentInstance.d.ts.map +1 -0
  302. package/dist/operations/getDocumentInstance.js +32 -0
  303. package/dist/operations/getDocumentInstance.js.map +1 -0
  304. package/dist/operations/getDocumentRecord.d.ts +6 -0
  305. package/dist/operations/getDocumentRecord.d.ts.map +1 -0
  306. package/dist/operations/getDocumentRecord.js +8 -0
  307. package/dist/operations/getDocumentRecord.js.map +1 -0
  308. package/dist/operations/getDualDocument.d.ts +28 -0
  309. package/dist/operations/getDualDocument.d.ts.map +1 -0
  310. package/dist/operations/getDualDocument.js +81 -0
  311. package/dist/operations/getDualDocument.js.map +1 -0
  312. package/dist/operations/getDualDocuments.d.ts +26 -0
  313. package/dist/operations/getDualDocuments.d.ts.map +1 -0
  314. package/dist/operations/getDualDocuments.js +130 -0
  315. package/dist/operations/getDualDocuments.js.map +1 -0
  316. package/dist/operations/getOptimisticDocument.d.ts +6 -0
  317. package/dist/operations/getOptimisticDocument.d.ts.map +1 -0
  318. package/dist/operations/getOptimisticDocument.js +30 -0
  319. package/dist/operations/getOptimisticDocument.js.map +1 -0
  320. package/dist/operations/getPage.d.ts +18 -0
  321. package/dist/operations/getPage.d.ts.map +1 -0
  322. package/dist/operations/getPage.js +31 -0
  323. package/dist/operations/getPage.js.map +1 -0
  324. package/dist/operations/getPages.d.ts +18 -0
  325. package/dist/operations/getPages.d.ts.map +1 -0
  326. package/dist/operations/getPages.js +30 -0
  327. package/dist/operations/getPages.js.map +1 -0
  328. package/dist/operations/getRedirects.d.ts +13 -0
  329. package/dist/operations/getRedirects.d.ts.map +1 -0
  330. package/dist/operations/getRedirects.js +30 -0
  331. package/dist/operations/getRedirects.js.map +1 -0
  332. package/dist/operations/getRenderDocument.d.ts +18 -0
  333. package/dist/operations/getRenderDocument.d.ts.map +1 -0
  334. package/dist/operations/getRenderDocument.js +27 -0
  335. package/dist/operations/getRenderDocument.js.map +1 -0
  336. package/dist/operations/getRenderDocumentWithAssociations.d.ts +15 -0
  337. package/dist/operations/getRenderDocumentWithAssociations.d.ts.map +1 -0
  338. package/dist/operations/getRenderDocumentWithAssociations.js +64 -0
  339. package/dist/operations/getRenderDocumentWithAssociations.js.map +1 -0
  340. package/dist/operations/getRenderDocuments.d.ts +16 -0
  341. package/dist/operations/getRenderDocuments.d.ts.map +1 -0
  342. package/dist/operations/getRenderDocuments.js +25 -0
  343. package/dist/operations/getRenderDocuments.js.map +1 -0
  344. package/dist/operations/getUpload.d.ts +25 -0
  345. package/dist/operations/getUpload.d.ts.map +1 -0
  346. package/dist/operations/getUpload.js +37 -0
  347. package/dist/operations/getUpload.js.map +1 -0
  348. package/dist/operations/getUploads.d.ts +25 -0
  349. package/dist/operations/getUploads.d.ts.map +1 -0
  350. package/dist/operations/getUploads.js +76 -0
  351. package/dist/operations/getUploads.js.map +1 -0
  352. package/dist/operations/getUsersCount.d.ts +12 -0
  353. package/dist/operations/getUsersCount.d.ts.map +1 -0
  354. package/dist/operations/getUsersCount.js +12 -0
  355. package/dist/operations/getUsersCount.js.map +1 -0
  356. package/dist/operations/login.d.ts +20 -0
  357. package/dist/operations/login.d.ts.map +1 -0
  358. package/dist/operations/login.js +38 -0
  359. package/dist/operations/login.js.map +1 -0
  360. package/dist/operations/removeDocument.d.ts +19 -0
  361. package/dist/operations/removeDocument.d.ts.map +1 -0
  362. package/dist/operations/removeDocument.js +54 -0
  363. package/dist/operations/removeDocument.js.map +1 -0
  364. package/dist/operations/removeRedirect.d.ts +15 -0
  365. package/dist/operations/removeRedirect.d.ts.map +1 -0
  366. package/dist/operations/removeRedirect.js +71 -0
  367. package/dist/operations/removeRedirect.js.map +1 -0
  368. package/dist/operations/removeUpload.d.ts +21 -0
  369. package/dist/operations/removeUpload.d.ts.map +1 -0
  370. package/dist/operations/removeUpload.js +49 -0
  371. package/dist/operations/removeUpload.js.map +1 -0
  372. package/dist/operations/search.d.ts +19 -0
  373. package/dist/operations/search.d.ts.map +1 -0
  374. package/dist/operations/search.js +109 -0
  375. package/dist/operations/search.js.map +1 -0
  376. package/dist/operations/seedIfEmpty.d.ts +7 -0
  377. package/dist/operations/seedIfEmpty.d.ts.map +1 -0
  378. package/dist/operations/seedIfEmpty.js +100 -0
  379. package/dist/operations/seedIfEmpty.js.map +1 -0
  380. package/dist/operations/signup.d.ts +21 -0
  381. package/dist/operations/signup.d.ts.map +1 -0
  382. package/dist/operations/signup.js +45 -0
  383. package/dist/operations/signup.js.map +1 -0
  384. package/dist/operations/types.d.ts +223 -0
  385. package/dist/operations/types.d.ts.map +1 -0
  386. package/dist/operations/types.js +2 -0
  387. package/dist/operations/types.js.map +1 -0
  388. package/dist/operations/updateUpload.d.ts +27 -0
  389. package/dist/operations/updateUpload.d.ts.map +1 -0
  390. package/dist/operations/updateUpload.js +78 -0
  391. package/dist/operations/updateUpload.js.map +1 -0
  392. package/dist/operations/updateViaArchive.d.ts +23 -0
  393. package/dist/operations/updateViaArchive.d.ts.map +1 -0
  394. package/dist/operations/updateViaArchive.js +229 -0
  395. package/dist/operations/updateViaArchive.js.map +1 -0
  396. package/dist/operations/upsert.d.ts +26 -0
  397. package/dist/operations/upsert.d.ts.map +1 -0
  398. package/dist/operations/upsert.js +257 -0
  399. package/dist/operations/upsert.js.map +1 -0
  400. package/dist/operations/utils/common.d.ts +2 -0
  401. package/dist/operations/utils/common.d.ts.map +1 -0
  402. package/dist/operations/utils/common.js +2 -0
  403. package/dist/operations/utils/common.js.map +1 -0
  404. package/dist/operations/utils/contentType.d.ts +2 -0
  405. package/dist/operations/utils/contentType.d.ts.map +1 -0
  406. package/dist/operations/utils/contentType.js +66 -0
  407. package/dist/operations/utils/contentType.js.map +1 -0
  408. package/dist/operations/utils/dataType.d.ts +7 -0
  409. package/dist/operations/utils/dataType.d.ts.map +1 -0
  410. package/dist/operations/utils/dataType.js +35 -0
  411. package/dist/operations/utils/dataType.js.map +1 -0
  412. package/dist/operations/utils/generateUniqueFilename.d.ts +7 -0
  413. package/dist/operations/utils/generateUniqueFilename.d.ts.map +1 -0
  414. package/dist/operations/utils/generateUniqueFilename.js +38 -0
  415. package/dist/operations/utils/generateUniqueFilename.js.map +1 -0
  416. package/dist/operations/utils/hasEtaTemplates.d.ts +2 -0
  417. package/dist/operations/utils/hasEtaTemplates.d.ts.map +1 -0
  418. package/dist/operations/utils/hasEtaTemplates.js +10 -0
  419. package/dist/operations/utils/hasEtaTemplates.js.map +1 -0
  420. package/dist/operations/utils/normalizeDocumentQuery.d.ts +12 -0
  421. package/dist/operations/utils/normalizeDocumentQuery.d.ts.map +1 -0
  422. package/dist/operations/utils/normalizeDocumentQuery.js +45 -0
  423. package/dist/operations/utils/normalizeDocumentQuery.js.map +1 -0
  424. package/dist/operations/utils/utils.d.ts +4 -0
  425. package/dist/operations/utils/utils.d.ts.map +1 -0
  426. package/dist/operations/utils/utils.js +4 -0
  427. package/dist/operations/utils/utils.js.map +1 -0
  428. package/dist/operations/validateSession.d.ts +17 -0
  429. package/dist/operations/validateSession.d.ts.map +1 -0
  430. package/dist/operations/validateSession.js +27 -0
  431. package/dist/operations/validateSession.js.map +1 -0
  432. package/dist/render/index.d.ts +9 -0
  433. package/dist/render/index.d.ts.map +1 -0
  434. package/dist/render/index.js +347 -0
  435. package/dist/render/index.js.map +1 -0
  436. package/dist/render/utils/base.d.ts +74 -0
  437. package/dist/render/utils/base.d.ts.map +1 -0
  438. package/dist/render/utils/base.js +290 -0
  439. package/dist/render/utils/base.js.map +1 -0
  440. package/dist/render/utils/extractRawBlocks.d.ts +10 -0
  441. package/dist/render/utils/extractRawBlocks.d.ts.map +1 -0
  442. package/dist/render/utils/extractRawBlocks.js +28 -0
  443. package/dist/render/utils/extractRawBlocks.js.map +1 -0
  444. package/dist/render/utils/rawBlocks.d.ts +10 -0
  445. package/dist/render/utils/rawBlocks.d.ts.map +1 -0
  446. package/dist/render/utils/rawBlocks.js +28 -0
  447. package/dist/render/utils/rawBlocks.js.map +1 -0
  448. package/dist/render/utils/usageTracker.d.ts +10 -0
  449. package/dist/render/utils/usageTracker.d.ts.map +1 -0
  450. package/dist/render/utils/usageTracker.js +87 -0
  451. package/dist/render/utils/usageTracker.js.map +1 -0
  452. package/dist/responder/index.d.ts +34 -0
  453. package/dist/responder/index.d.ts.map +1 -0
  454. package/dist/responder/index.js +546 -0
  455. package/dist/responder/index.js.map +1 -0
  456. package/dist/server/index.d.ts +7 -0
  457. package/dist/server/index.d.ts.map +1 -0
  458. package/dist/server/index.js +54 -0
  459. package/dist/server/index.js.map +1 -0
  460. package/dist/server/middleware/authorize.d.ts +3 -0
  461. package/dist/server/middleware/authorize.d.ts.map +1 -0
  462. package/dist/server/middleware/authorize.js +15 -0
  463. package/dist/server/middleware/authorize.js.map +1 -0
  464. package/dist/server/middleware/establishAuth.d.ts +3 -0
  465. package/dist/server/middleware/establishAuth.d.ts.map +1 -0
  466. package/dist/server/middleware/establishAuth.js +45 -0
  467. package/dist/server/middleware/establishAuth.js.map +1 -0
  468. package/dist/server/middleware/log.d.ts +3 -0
  469. package/dist/server/middleware/log.d.ts.map +1 -0
  470. package/dist/server/middleware/log.js +12 -0
  471. package/dist/server/middleware/log.js.map +1 -0
  472. package/dist/server/middleware/requirePathMatch.d.ts +3 -0
  473. package/dist/server/middleware/requirePathMatch.d.ts.map +1 -0
  474. package/dist/server/middleware/requirePathMatch.js +25 -0
  475. package/dist/server/middleware/requirePathMatch.js.map +1 -0
  476. package/dist/server/middleware/requireQuery.d.ts +3 -0
  477. package/dist/server/middleware/requireQuery.d.ts.map +1 -0
  478. package/dist/server/middleware/requireQuery.js +24 -0
  479. package/dist/server/middleware/requireQuery.js.map +1 -0
  480. package/dist/server/middleware/withDb.d.ts +4 -0
  481. package/dist/server/middleware/withDb.d.ts.map +1 -0
  482. package/dist/server/middleware/withDb.js +7 -0
  483. package/dist/server/middleware/withDb.js.map +1 -0
  484. package/dist/server/routes/assets.d.ts +4 -0
  485. package/dist/server/routes/assets.d.ts.map +1 -0
  486. package/dist/server/routes/assets.js +178 -0
  487. package/dist/server/routes/assets.js.map +1 -0
  488. package/dist/server/routes/documents.d.ts +4 -0
  489. package/dist/server/routes/documents.d.ts.map +1 -0
  490. package/dist/server/routes/documents.js +40 -0
  491. package/dist/server/routes/documents.js.map +1 -0
  492. package/dist/server/routes/edit.d.ts +22 -0
  493. package/dist/server/routes/edit.d.ts.map +1 -0
  494. package/dist/server/routes/edit.js +494 -0
  495. package/dist/server/routes/edit.js.map +1 -0
  496. package/dist/server/routes/git.d.ts +4 -0
  497. package/dist/server/routes/git.d.ts.map +1 -0
  498. package/dist/server/routes/git.js +612 -0
  499. package/dist/server/routes/git.js.map +1 -0
  500. package/dist/server/routes/readUpload.d.ts +4 -0
  501. package/dist/server/routes/readUpload.d.ts.map +1 -0
  502. package/dist/server/routes/readUpload.js +57 -0
  503. package/dist/server/routes/readUpload.js.map +1 -0
  504. package/dist/server/utils/NotFoundError.d.ts +9 -0
  505. package/dist/server/utils/NotFoundError.d.ts.map +1 -0
  506. package/dist/server/utils/NotFoundError.js +16 -0
  507. package/dist/server/utils/NotFoundError.js.map +1 -0
  508. package/dist/server/utils/editor.css +1535 -0
  509. package/dist/server/utils/htmlEditorPage.d.ts +6 -0
  510. package/dist/server/utils/htmlEditorPage.d.ts.map +1 -0
  511. package/dist/server/utils/htmlEditorPage.js +518 -0
  512. package/dist/server/utils/htmlEditorPage.js.map +1 -0
  513. package/dist/server/utils/htmlLoginPage.d.ts +6 -0
  514. package/dist/server/utils/htmlLoginPage.d.ts.map +1 -0
  515. package/dist/server/utils/htmlLoginPage.js +134 -0
  516. package/dist/server/utils/htmlLoginPage.js.map +1 -0
  517. package/dist/server/utils/layout.css +153 -0
  518. package/dist/server/utils/types.d.ts +18 -0
  519. package/dist/server/utils/types.d.ts.map +1 -0
  520. package/dist/server/utils/types.js +2 -0
  521. package/dist/server/utils/types.js.map +1 -0
  522. package/dist/server-bin/index.d.ts +2 -0
  523. package/dist/server-bin/index.d.ts.map +1 -0
  524. package/dist/server-bin/index.js +26 -0
  525. package/dist/server-bin/index.js.map +1 -0
  526. package/dist/utils/functionContext.d.ts +12 -0
  527. package/dist/utils/functionContext.d.ts.map +1 -0
  528. package/dist/utils/functionContext.js +19 -0
  529. package/dist/utils/functionContext.js.map +1 -0
  530. package/dist/utils/functionContextClient.d.ts +23 -0
  531. package/dist/utils/functionContextClient.d.ts.map +1 -0
  532. package/dist/utils/functionContextClient.js +93 -0
  533. package/dist/utils/functionContextClient.js.map +1 -0
  534. package/dist/utils/stringifyData.d.ts +2 -0
  535. package/dist/utils/stringifyData.d.ts.map +1 -0
  536. package/dist/utils/stringifyData.js +23 -0
  537. package/dist/utils/stringifyData.js.map +1 -0
  538. package/dist/utils/stripImageExif.d.ts +14 -0
  539. package/dist/utils/stripImageExif.d.ts.map +1 -0
  540. package/dist/utils/stripImageExif.js +112 -0
  541. package/dist/utils/stripImageExif.js.map +1 -0
  542. package/dist/utils/types.d.ts +81 -0
  543. package/dist/utils/types.d.ts.map +1 -0
  544. package/dist/utils/types.js +2 -0
  545. package/dist/utils/types.js.map +1 -0
  546. package/migrations/1770796673000_initial-schema.js +178 -0
  547. package/package.json +97 -0
  548. package/pages/skywriter/.github/copilot-instructions.md +94 -0
  549. package/pages/skywriter/content.md +862 -0
  550. package/pages/skywriter/data.json +1 -0
  551. package/pages/skywriter/doc.code-workspace +15 -0
  552. package/pages/skywriter/script.js +1 -0
  553. package/pages/skywriter/server.js +1 -0
  554. package/pages/skywriter/settings.json +11 -0
  555. package/pages/skywriter/style.css +167 -0
  556. package/pages/skywriter/template/content.eta +55 -0
  557. package/pages/skywriter/template/data.json +1 -0
  558. package/pages/skywriter/template/script.js +512 -0
  559. package/pages/skywriter/template/server.js +27 -0
  560. package/pages/skywriter/template/settings.json +11 -0
  561. package/pages/skywriter/template/style.css +447 -0
@@ -0,0 +1,45 @@
1
+ import bcrypt from 'bcrypt';
2
+ const SALT_ROUNDS = 10;
3
+ /**
4
+ * Create a new user account
5
+ * @param client Database client
6
+ * @param params Signup parameters
7
+ * @returns The created user (without password hash)
8
+ * @throws Error if username already exists or validation fails
9
+ */
10
+ export const signup = async (client, params) => {
11
+ const { username, password, password_confirm } = params;
12
+ // Validate password confirmation if provided
13
+ if (password_confirm !== undefined && password !== password_confirm) {
14
+ throw new Error('Passwords do not match');
15
+ }
16
+ // Validate input
17
+ if (!username || username.trim().length === 0) {
18
+ throw new Error('Username is required');
19
+ }
20
+ if (username.length < 3) {
21
+ throw new Error('Username must be at least 3 characters long');
22
+ }
23
+ if (username.length > 255) {
24
+ throw new Error('Username must not exceed 255 characters');
25
+ }
26
+ if (!password || password.length === 0) {
27
+ throw new Error('Password is required');
28
+ }
29
+ if (password.length < 8) {
30
+ throw new Error('Password must be at least 8 characters long');
31
+ }
32
+ // Check if username already exists
33
+ const existingUser = await client.query('SELECT id FROM users WHERE username = $1', [username.trim()]);
34
+ if (existingUser.rows.length > 0) {
35
+ throw new Error('Username already exists');
36
+ }
37
+ // Hash the password
38
+ const passwordHash = await bcrypt.hash(password, SALT_ROUNDS);
39
+ // Insert the new user
40
+ const result = await client.query(`INSERT INTO users (username, password_hash)
41
+ VALUES ($1, $2)
42
+ RETURNING id, username, created_at`, [username.trim(), passwordHash]);
43
+ return result.rows[0];
44
+ };
45
+ //# sourceMappingURL=signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/operations/signup.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,WAAW,GAAG,EAAE,CAAA;AActB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAA8C,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;IACxF,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAC,GAAG,MAAM,CAAA;IAErD,6CAA6C;IAC7C,IAAI,gBAAgB,KAAK,SAAS,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,mCAAmC;IACnC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAEtG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAE7D,sBAAsB;IACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;wCAEoC,EACpC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAChC,CAAA;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACvB,CAAC,CAAA"}
@@ -0,0 +1,223 @@
1
+ import type { PoolClient } from 'pg';
2
+ /**
3
+ * Generic type for database operations
4
+ * All database operations follow this pattern: (client: PoolClient, ...args) => Promise<Result>
5
+ */
6
+ export type DbOperation<Args extends unknown[] = [], Result = unknown> = (client: PoolClient, ...args: Args) => Promise<Result>;
7
+ export interface Document {
8
+ id: DocumentId;
9
+ path_id: RouteId;
10
+ current_record_id: number | null;
11
+ draft_record_id: number | null;
12
+ published: boolean;
13
+ created_at: Date;
14
+ updated_at: Date;
15
+ }
16
+ export interface DocumentRecord {
17
+ id: number;
18
+ title: string;
19
+ content: string;
20
+ data: string;
21
+ style: string;
22
+ script: string;
23
+ server: string;
24
+ template_id: number | null;
25
+ slot_id: number | null;
26
+ content_type: string;
27
+ data_type: string | null;
28
+ has_eta: boolean;
29
+ mime_type: string;
30
+ extension: string;
31
+ created_at: Date;
32
+ updated_at: Date;
33
+ }
34
+ export interface Route {
35
+ id: RouteId;
36
+ path: string;
37
+ document_id: DocumentId;
38
+ created_at: Date;
39
+ }
40
+ export interface Upload {
41
+ id: UploadId;
42
+ filename: string;
43
+ document_id: DocumentId | null;
44
+ created_at: Date;
45
+ original_filename: string;
46
+ hidden: boolean;
47
+ hash: string;
48
+ }
49
+ export interface UploadsManyQuery {
50
+ sortBy?: 'created_at' | 'original_filename' | 'filename';
51
+ sortOrder?: 'asc' | 'desc';
52
+ limit?: number;
53
+ offset?: number;
54
+ startsWithPath?: string;
55
+ }
56
+ export interface GetOptions {
57
+ /** Include draft version in response (if exists) */
58
+ draft?: boolean;
59
+ /** Filter by published status: true = published only, false = unpublished only, undefined = both (no filter) */
60
+ published?: boolean;
61
+ }
62
+ /**
63
+ * Comprehensive document query type
64
+ * Accepts multiple input formats:
65
+ * - string (path)
66
+ * - {path: string} (path object)
67
+ * - {path?: string} (optional path object, for combined with EditDocumentInput)
68
+ * - number (document id)
69
+ * - {id: number} (id object)
70
+ * - {id?: number} (optional id object, for combined with EditDocumentInput)
71
+ * - DualDocument (extracts id)
72
+ * - Route (extracts document_id)
73
+ *
74
+ * The {id?: DocumentId, path?: string} object form is used for upsert operations
75
+ * when combined with EditDocumentInput.
76
+ */
77
+ export type DocumentQuery = string | {
78
+ path?: string;
79
+ } | DocumentId | {
80
+ id?: DocumentId;
81
+ } | DualDocument | Route;
82
+ /**
83
+ * Redirect query type for identifying a redirect route
84
+ * Accepts:
85
+ * - number (redirect/route id)
86
+ * - string (redirect path)
87
+ * - {id: number} (redirect/route id object)
88
+ * - {path: string} (redirect path object)
89
+ */
90
+ export type RedirectQuery = RouteId | string | {
91
+ id: RouteId;
92
+ } | {
93
+ path: string;
94
+ };
95
+ export interface EditDocumentInput {
96
+ path?: string;
97
+ title?: string;
98
+ content?: string | null;
99
+ data?: string | null;
100
+ style?: string | null;
101
+ script?: string | null;
102
+ server?: string | null;
103
+ template_id?: DocumentId | null;
104
+ slot_id?: DocumentId | null;
105
+ content_type?: string | null;
106
+ data_type?: string | null;
107
+ has_eta?: boolean;
108
+ mime_type?: string;
109
+ extension?: string;
110
+ published?: boolean;
111
+ draft?: boolean;
112
+ }
113
+ export interface DocumentInstance {
114
+ id: DocumentId;
115
+ path: string;
116
+ title: string;
117
+ content: string;
118
+ data: string;
119
+ style: string;
120
+ script: string;
121
+ server: string;
122
+ template_id: DocumentId | null;
123
+ slot_id: DocumentId | null;
124
+ content_type: string;
125
+ data_type: string | null;
126
+ has_eta: boolean;
127
+ mime_type: string;
128
+ extension: string;
129
+ published: boolean;
130
+ created_at: Date;
131
+ updated_at: Date;
132
+ }
133
+ interface DocumentCore {
134
+ id: DocumentId;
135
+ path: string;
136
+ redirect?: boolean;
137
+ published: boolean;
138
+ }
139
+ export interface DualDocument extends DocumentCore {
140
+ current?: DocumentInstance;
141
+ draft?: DocumentInstance;
142
+ }
143
+ export type RenderDocumentParts = {
144
+ document: DualDocument;
145
+ redirects?: Route[];
146
+ uploads?: Upload[];
147
+ };
148
+ export type RenderDocument = DocumentCore & DocumentInstance & {
149
+ redirects?: Route[];
150
+ uploads?: Upload[];
151
+ draft: boolean;
152
+ slot?: RenderDocument;
153
+ template?: RenderDocument;
154
+ };
155
+ declare const __brand: unique symbol;
156
+ type Branded<T, B> = T & {
157
+ [__brand]: B;
158
+ };
159
+ export type DocumentId = Branded<number, 'DocumentId'>;
160
+ type RouteId = Branded<number, 'RouteId'>;
161
+ export type UploadId = Branded<number, 'UploadId'>;
162
+ export interface DocumentManyQuery {
163
+ sortBy?: 'created_at' | 'updated_at' | 'title' | 'path';
164
+ sortOrder?: 'asc' | 'desc';
165
+ published?: boolean;
166
+ draft?: boolean;
167
+ limit?: number;
168
+ offset?: number;
169
+ startsWithPath?: string;
170
+ }
171
+ export interface SearchOptions {
172
+ /** Search query string (case-insensitive LIKE pattern match on path and title) */
173
+ query: string;
174
+ /** Maximum number of results (default: 10) */
175
+ limit?: number;
176
+ /** Filter by published status: true = only published, false = only unpublished, undefined = both */
177
+ published?: boolean;
178
+ }
179
+ export interface SearchResult extends DocumentCore {
180
+ /** Current document title */
181
+ title: string;
182
+ }
183
+ /**
184
+ * Result of saving a downloaded image as an upload
185
+ */
186
+ export interface SavedUpload {
187
+ /** The original foreign image info */
188
+ original: {
189
+ url: string;
190
+ match: string;
191
+ type: 'html' | 'markdown';
192
+ alt?: string;
193
+ };
194
+ /** The new local URL to use */
195
+ localUrl: string;
196
+ /** The upload's original_filename */
197
+ originalFilename: string;
198
+ }
199
+ interface RenderDocumentOptions {
200
+ /** Include redirects in response (default: true) */
201
+ includeRedirects?: boolean;
202
+ /** Include uploads in response (default: true) */
203
+ includeUploads?: boolean;
204
+ /** Include hidden uploads in response (default: false) */
205
+ includeHiddenUploads?: boolean;
206
+ /** Include slot document (default: false) */
207
+ includeSlot?: boolean;
208
+ /** Include template document (default: false) */
209
+ includeTemplate?: boolean;
210
+ }
211
+ export interface RenderDocumentGetOptions extends GetOptions, RenderDocumentOptions {
212
+ }
213
+ export interface RenderDocumentsManyQuery extends DocumentManyQuery, RenderDocumentOptions {
214
+ }
215
+ /**
216
+ * Factory function type for creating function context
217
+ * Used by getPage/getPages to pass context to the render function
218
+ */
219
+ export type FunctionContext = (client: import('pg').PoolClient, doc: RenderDocument | {
220
+ path: string;
221
+ }, requestQuery?: Record<string, string>) => Record<string, unknown>;
222
+ export {};
223
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/operations/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/operations/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { Upload, DbOperation, UploadId } from './types.ts';
2
+ /**
3
+ * Input for updating an upload
4
+ */
5
+ interface UpdateUploadInput {
6
+ /** New filename for the upload */
7
+ original_filename?: string;
8
+ /** Whether the upload is hidden */
9
+ hidden?: boolean;
10
+ }
11
+ /**
12
+ * Updates an upload's original_filename and/or hidden status.
13
+ *
14
+ * When renaming or unhiding causes a filename collision with an existing visible upload:
15
+ * - The existing visible upload gets renamed with an incremented suffix
16
+ * - The existing visible upload is marked as hidden
17
+ * - The target upload takes the desired filename and visibility
18
+ *
19
+ * @param client Database client
20
+ * @param uploadId The ID of the upload to update
21
+ * @param input The fields to update (original_filename and/or hidden)
22
+ * @returns The updated Upload object
23
+ * @throws Error if upload doesn't exist
24
+ */
25
+ export declare const updateUpload: DbOperation<[UploadId, UpdateUploadInput], Upload>;
26
+ export {};
27
+ //# sourceMappingURL=updateUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateUpload.d.ts","sourceRoot":"","sources":["../../src/operations/updateUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAA;AAIzE;;GAEG;AACH,UAAU,iBAAiB;IACzB,kCAAkC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAoF3E,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { getAllUploadsForDocument } from "./getAllUploadsForDocument.js";
2
+ import { generateUniqueFilename } from "./utils/generateUniqueFilename.js";
3
+ /**
4
+ * Updates an upload's original_filename and/or hidden status.
5
+ *
6
+ * When renaming or unhiding causes a filename collision with an existing visible upload:
7
+ * - The existing visible upload gets renamed with an incremented suffix
8
+ * - The existing visible upload is marked as hidden
9
+ * - The target upload takes the desired filename and visibility
10
+ *
11
+ * @param client Database client
12
+ * @param uploadId The ID of the upload to update
13
+ * @param input The fields to update (original_filename and/or hidden)
14
+ * @returns The updated Upload object
15
+ * @throws Error if upload doesn't exist
16
+ */
17
+ export const updateUpload = async (client, uploadId, input) => {
18
+ const { original_filename: newFilename, hidden: newHidden } = input;
19
+ // Nothing to update
20
+ if (newFilename === undefined && newHidden === undefined) {
21
+ const result = await client.query(`SELECT id, filename, document_id, created_at, original_filename, hidden
22
+ FROM uploads WHERE id = $1`, [uploadId]);
23
+ if (result.rows.length === 0) {
24
+ throw new Error('Upload does not exist');
25
+ }
26
+ return result.rows[0];
27
+ }
28
+ try {
29
+ await client.query('BEGIN');
30
+ // Get the current upload
31
+ const currentResult = await client.query(`SELECT id, filename, document_id, created_at, original_filename, hidden
32
+ FROM uploads WHERE id = $1 FOR UPDATE`, [uploadId]);
33
+ if (currentResult.rows.length === 0) {
34
+ throw new Error('Upload does not exist');
35
+ }
36
+ const currentUpload = currentResult.rows[0];
37
+ const documentId = currentUpload.document_id;
38
+ // Determine the target state
39
+ const targetFilename = newFilename ?? currentUpload.original_filename;
40
+ const targetHidden = newHidden ?? currentUpload.hidden;
41
+ // Check if we need to handle a collision
42
+ // A collision occurs when:
43
+ // 1. The target filename is different from current OR we're unhiding
44
+ // 2. The target will be visible (not hidden)
45
+ // 3. There's already a visible upload with that filename (other than this one)
46
+ const willBeVisible = !targetHidden;
47
+ const filenameChanging = targetFilename !== currentUpload.original_filename;
48
+ const visibilityChanging = targetHidden !== currentUpload.hidden;
49
+ if (willBeVisible && (filenameChanging || visibilityChanging)) {
50
+ // Get all uploads for collision checking
51
+ const allUploads = await getAllUploadsForDocument(client, documentId);
52
+ const existingFilenames = allUploads.map(u => u.original_filename);
53
+ // Find any existing visible upload with the target filename (excluding this upload)
54
+ const collidingUpload = allUploads.find(u => u.original_filename === targetFilename && !u.hidden && u.id !== uploadId);
55
+ if (collidingUpload) {
56
+ // Generate a new unique filename for the displaced upload
57
+ const displacedFilename = generateUniqueFilename(targetFilename, existingFilenames);
58
+ // Mark the colliding upload as hidden and rename it
59
+ await client.query(`UPDATE uploads SET original_filename = $1, hidden = true WHERE id = $2`, [
60
+ displacedFilename,
61
+ collidingUpload.id,
62
+ ]);
63
+ }
64
+ }
65
+ // Update the target upload
66
+ const updateResult = await client.query(`UPDATE uploads
67
+ SET original_filename = $1, hidden = $2
68
+ WHERE id = $3
69
+ RETURNING id, filename, document_id, created_at, original_filename, hidden`, [targetFilename, targetHidden, uploadId]);
70
+ await client.query('COMMIT');
71
+ return updateResult.rows[0];
72
+ }
73
+ catch (error) {
74
+ await client.query('ROLLBACK');
75
+ throw error;
76
+ }
77
+ };
78
+ //# sourceMappingURL=updateUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateUpload.js","sourceRoot":"","sources":["../../src/operations/updateUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { DocumentQuery, DbOperation } from './types.ts';
2
+ import { Readable } from 'stream';
3
+ /**
4
+ * Update a document from a tar.gz archive
5
+ * Validates that the archive contains the expected files and no unexpected files
6
+ *
7
+ * Expected files:
8
+ * - settings.json (base document, required)
9
+ * - content.* (any extension, optional, but only one file) OR index.html (optional, mutually exclusive with content.*)
10
+ * - data.* (any extension, optional, but only one file)
11
+ * - server.js (optional)
12
+ * - style.css (optional)
13
+ * - script.js (optional)
14
+ *
15
+ * Size limits:
16
+ * - Max 10 MB per file
17
+ * - Max 50 MB total archive
18
+ * - Max 10 files (excluding directories)
19
+ *
20
+ * @throws Error if archive contains multiple content/data files, both index.html and content.* files, unrecognized files, or exceeds size limits
21
+ */
22
+ export declare const updateViaArchive: DbOperation<[DocumentQuery, Readable], void>;
23
+ //# sourceMappingURL=updateViaArchive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateViaArchive.d.ts","sourceRoot":"","sources":["../../src/operations/updateViaArchive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAqB,WAAW,EAAC,MAAM,YAAY,CAAA;AAK7E,OAAO,EAAC,QAAQ,EAAC,MAAM,QAAQ,CAAA;AAmB/B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,IAAI,CAsOzE,CAAA"}
@@ -0,0 +1,229 @@
1
+ import { upsert } from "./upsert.js";
2
+ import { findDocument } from "./findDocument.js";
3
+ import { extract as tarExtract } from 'tar-stream';
4
+ import { createGunzip } from 'zlib';
5
+ // Allowed file patterns
6
+ const ALLOWED_FILES = ['settings.json', /^content\./, 'index.html', /^data\./, 'server.js', 'style.css', 'script.js'];
7
+ // Size limits for archive processing
8
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB per file
9
+ const MAX_ARCHIVE_FILES = ALLOWED_FILES.length; // Maximum number of files (excluding directories)
10
+ const MAX_TOTAL_SIZE = MAX_FILE_SIZE * MAX_ARCHIVE_FILES; // Total archive size limit
11
+ /**
12
+ * Update a document from a tar.gz archive
13
+ * Validates that the archive contains the expected files and no unexpected files
14
+ *
15
+ * Expected files:
16
+ * - settings.json (base document, required)
17
+ * - content.* (any extension, optional, but only one file) OR index.html (optional, mutually exclusive with content.*)
18
+ * - data.* (any extension, optional, but only one file)
19
+ * - server.js (optional)
20
+ * - style.css (optional)
21
+ * - script.js (optional)
22
+ *
23
+ * Size limits:
24
+ * - Max 10 MB per file
25
+ * - Max 50 MB total archive
26
+ * - Max 10 files (excluding directories)
27
+ *
28
+ * @throws Error if archive contains multiple content/data files, both index.html and content.* files, unrecognized files, or exceeds size limits
29
+ */
30
+ export const updateViaArchive = async (client, query, stream) => {
31
+ // Create streams for decompression and extraction
32
+ const gunzip = createGunzip();
33
+ const extract = tarExtract();
34
+ // Track total bytes received for size validation
35
+ let totalBytesReceived = 0;
36
+ const MAX_BYTES_TO_TRACK = MAX_TOTAL_SIZE + 1; // Track one byte over limit to detect overflow
37
+ const archiveFiles = {};
38
+ const contentFiles = [];
39
+ const dataFiles = [];
40
+ const unrecognizedFiles = [];
41
+ let fileCount = 0;
42
+ let validationError = null;
43
+ // Helper to check if a filename matches allowed patterns
44
+ const isAllowedFile = (fileName) => {
45
+ return ALLOWED_FILES.some(pattern => {
46
+ if (typeof pattern === 'string') {
47
+ return fileName === pattern;
48
+ }
49
+ return pattern.test(fileName);
50
+ });
51
+ };
52
+ // Track total archive size as it streams through
53
+ gunzip.on('data', (chunk) => {
54
+ if (totalBytesReceived <= MAX_BYTES_TO_TRACK) {
55
+ totalBytesReceived += chunk.length;
56
+ }
57
+ });
58
+ // Set up tar extraction handlers
59
+ extract.on('entry', (header, stream, next) => {
60
+ const fileName = header.name;
61
+ const fileSize = header.size || 0;
62
+ // Skip directories
63
+ if (header.type === 'directory') {
64
+ stream.resume();
65
+ next();
66
+ return;
67
+ }
68
+ // Increment file count
69
+ fileCount++;
70
+ // Check file count limit
71
+ if (fileCount > MAX_ARCHIVE_FILES) {
72
+ validationError = validationError || new Error(`Archive contains too many files (max ${MAX_ARCHIVE_FILES})`);
73
+ stream.resume(); // Drain the stream
74
+ next();
75
+ return;
76
+ }
77
+ // Check individual file size
78
+ if (fileSize > MAX_FILE_SIZE) {
79
+ validationError =
80
+ validationError ||
81
+ new Error(`File '${fileName}' size (${fileSize} bytes) exceeds maximum allowed size (${MAX_FILE_SIZE} bytes)`);
82
+ stream.resume(); // Drain the stream
83
+ next();
84
+ return;
85
+ }
86
+ // Check if file is allowed
87
+ if (!isAllowedFile(fileName)) {
88
+ unrecognizedFiles.push(fileName);
89
+ stream.resume();
90
+ next();
91
+ return;
92
+ }
93
+ // Collect file contents
94
+ const chunks = [];
95
+ stream.on('data', (chunk) => {
96
+ chunks.push(chunk);
97
+ });
98
+ stream.on('end', () => {
99
+ const content = Buffer.concat(chunks).toString('utf-8');
100
+ // Identify file types
101
+ if (fileName === 'settings.json') {
102
+ archiveFiles.settings = content;
103
+ }
104
+ else if (fileName === 'index.html' || fileName.startsWith('content.')) {
105
+ contentFiles.push(fileName);
106
+ archiveFiles.content = content;
107
+ }
108
+ else if (fileName.startsWith('data.')) {
109
+ dataFiles.push(fileName);
110
+ archiveFiles.data = content;
111
+ }
112
+ else if (fileName === 'server.js') {
113
+ archiveFiles.server = content;
114
+ }
115
+ else if (fileName === 'style.css') {
116
+ archiveFiles.style = content;
117
+ }
118
+ else if (fileName === 'script.js') {
119
+ archiveFiles.script = content;
120
+ }
121
+ next();
122
+ });
123
+ stream.resume();
124
+ });
125
+ // Process the archive
126
+ await new Promise((resolve, reject) => {
127
+ extract.on('finish', () => {
128
+ // Check if archive exceeded size limit
129
+ if (totalBytesReceived > MAX_TOTAL_SIZE) {
130
+ reject(new Error(`Archive size exceeds maximum allowed size (${MAX_TOTAL_SIZE} bytes)`));
131
+ return;
132
+ }
133
+ if (validationError) {
134
+ reject(validationError);
135
+ }
136
+ else {
137
+ resolve();
138
+ }
139
+ });
140
+ extract.on('error', reject);
141
+ gunzip.on('error', reject);
142
+ stream.pipe(gunzip).pipe(extract);
143
+ });
144
+ // Validation
145
+ if (!archiveFiles.settings) {
146
+ throw new Error('Archive must contain settings.json');
147
+ }
148
+ if (contentFiles.length > 1) {
149
+ throw new Error(`Archive contains multiple content files: ${contentFiles.join(', ')}. Only one content file is allowed (either index.html or a content.* file).`);
150
+ }
151
+ // Additional validation: if index.html exists, ensure no content.* files exist
152
+ const hasIndexHtml = contentFiles.includes('index.html');
153
+ const hasContentFiles = contentFiles.some(f => f.startsWith('content.'));
154
+ if (hasIndexHtml && hasContentFiles) {
155
+ throw new Error('Archive cannot contain both index.html and content.* files. Use only one format.');
156
+ }
157
+ if (dataFiles.length > 1) {
158
+ throw new Error(`Archive contains multiple data files: ${dataFiles.join(', ')}`);
159
+ }
160
+ if (unrecognizedFiles.length > 0) {
161
+ const allowedList = [
162
+ 'settings.json',
163
+ 'content.* (any extension)',
164
+ 'index.html',
165
+ 'data.* (any extension)',
166
+ 'server.js',
167
+ 'style.css',
168
+ 'script.js',
169
+ ];
170
+ throw new Error(`Archive contains unrecognized files: ${unrecognizedFiles.join(', ')}\n` +
171
+ `Allowed files: ${allowedList.join(', ')}`);
172
+ }
173
+ // Parse settings.json
174
+ let settings;
175
+ try {
176
+ settings = JSON.parse(archiveFiles.settings);
177
+ }
178
+ catch (error) {
179
+ /* c8 ignore next */ // JSON.parse always throws Error objects, 'Unknown error' branch is unreachable
180
+ throw new Error('Failed to parse settings.json: ' + (error instanceof Error ? error.message : 'Unknown error'));
181
+ }
182
+ // Resolve slot_path to slot_id if provided
183
+ if (settings.slot_path && !settings.slot_id) {
184
+ const slotDoc = await findDocument(client, { path: settings.slot_path });
185
+ if (slotDoc) {
186
+ settings.slot_id = slotDoc.id;
187
+ }
188
+ // Remove the path field as it's not part of EditDocumentInput
189
+ delete settings.slot_path;
190
+ }
191
+ // Resolve template_path to template_id if provided
192
+ if (settings.template_path && !settings.template_id) {
193
+ const templateDoc = await findDocument(client, { path: settings.template_path });
194
+ if (templateDoc) {
195
+ settings.template_id = templateDoc.id;
196
+ }
197
+ // Remove the path field as it's not part of EditDocumentInput
198
+ delete settings.template_path;
199
+ }
200
+ // Convert query to object form for merging
201
+ const queryObj = typeof query === 'string' ? { path: query } : typeof query === 'number' ? { id: query } : query;
202
+ // Extract path from query object if it exists
203
+ const queryPath = typeof query === 'string'
204
+ ? query
205
+ : typeof query === 'object' && query !== null && 'path' in query
206
+ ? query.path
207
+ : undefined;
208
+ const docPath = settings.path ?? queryPath;
209
+ if (!docPath) {
210
+ throw new Error('Document path must be specified in either query or settings.json');
211
+ }
212
+ // Merge settings with file contents and query
213
+ // Using the single-parameter form of upsert which combines query and input
214
+ // Force published mode for archive uploads (not draft) - archive upload is a "publish" action
215
+ const documentInput = {
216
+ path: docPath,
217
+ ...settings,
218
+ draft: false, // Override any draft setting - archive upload publishes directly
219
+ published: true, // Ensure published is true
220
+ content: archiveFiles.content ?? settings.content,
221
+ data: archiveFiles.data ?? settings.data,
222
+ server: archiveFiles.server ?? settings.server,
223
+ style: archiveFiles.style ?? settings.style,
224
+ script: archiveFiles.script ?? settings.script,
225
+ };
226
+ // Upsert the document using combined form
227
+ await upsert(client, queryObj, documentInput);
228
+ };
229
+ //# sourceMappingURL=updateViaArchive.js.map