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.
- package/LICENSE +16 -0
- package/README.md +852 -0
- package/dist/cli/commands/host.d.ts +6 -0
- package/dist/cli/commands/host.d.ts.map +1 -0
- package/dist/cli/commands/host.js +52 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/init.d.ts +15 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +207 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +18 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +152 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +15 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +62 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +19 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +44 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +9 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +49 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/removeServer.d.ts +9 -0
- package/dist/cli/commands/removeServer.d.ts.map +1 -0
- package/dist/cli/commands/removeServer.js +55 -0
- package/dist/cli/commands/removeServer.js.map +1 -0
- package/dist/cli/commands/render.d.ts +6 -0
- package/dist/cli/commands/render.d.ts.map +1 -0
- package/dist/cli/commands/render.js +11 -0
- package/dist/cli/commands/render.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +55 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/sessions.d.ts +6 -0
- package/dist/cli/commands/sessions.d.ts.map +1 -0
- package/dist/cli/commands/sessions.js +24 -0
- package/dist/cli/commands/sessions.js.map +1 -0
- package/dist/cli/commands/settings.d.ts +10 -0
- package/dist/cli/commands/settings.d.ts.map +1 -0
- package/dist/cli/commands/settings.js +69 -0
- package/dist/cli/commands/settings.js.map +1 -0
- package/dist/cli/commands/switchServer.d.ts +9 -0
- package/dist/cli/commands/switchServer.d.ts.map +1 -0
- package/dist/cli/commands/switchServer.js +52 -0
- package/dist/cli/commands/switchServer.js.map +1 -0
- package/dist/cli/commands/vscodeInit.d.ts +13 -0
- package/dist/cli/commands/vscodeInit.d.ts.map +1 -0
- package/dist/cli/commands/vscodeInit.js +152 -0
- package/dist/cli/commands/vscodeInit.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +6 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +67 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/middleware/checkDuplicatePath.d.ts +19 -0
- package/dist/cli/middleware/checkDuplicatePath.d.ts.map +1 -0
- package/dist/cli/middleware/checkDuplicatePath.js +45 -0
- package/dist/cli/middleware/checkDuplicatePath.js.map +1 -0
- package/dist/cli/middleware/redirectRoot.d.ts +18 -0
- package/dist/cli/middleware/redirectRoot.d.ts.map +1 -0
- package/dist/cli/middleware/redirectRoot.js +44 -0
- package/dist/cli/middleware/redirectRoot.js.map +1 -0
- package/dist/cli/middleware/serveDocument.d.ts +10 -0
- package/dist/cli/middleware/serveDocument.d.ts.map +1 -0
- package/dist/cli/middleware/serveDocument.js +104 -0
- package/dist/cli/middleware/serveDocument.js.map +1 -0
- package/dist/cli/middleware/serveUploads.d.ts +20 -0
- package/dist/cli/middleware/serveUploads.d.ts.map +1 -0
- package/dist/cli/middleware/serveUploads.js +93 -0
- package/dist/cli/middleware/serveUploads.js.map +1 -0
- package/dist/cli/middleware/types.d.ts +43 -0
- package/dist/cli/middleware/types.d.ts.map +1 -0
- package/dist/cli/middleware/types.js +2 -0
- package/dist/cli/middleware/types.js.map +1 -0
- package/dist/cli/pathOperations/deletePathUploads.d.ts +6 -0
- package/dist/cli/pathOperations/deletePathUploads.d.ts.map +1 -0
- package/dist/cli/pathOperations/deletePathUploads.js +68 -0
- package/dist/cli/pathOperations/deletePathUploads.js.map +1 -0
- package/dist/cli/pathOperations/downloadPathUploads.d.ts +6 -0
- package/dist/cli/pathOperations/downloadPathUploads.d.ts.map +1 -0
- package/dist/cli/pathOperations/downloadPathUploads.js +156 -0
- package/dist/cli/pathOperations/downloadPathUploads.js.map +1 -0
- package/dist/cli/pathOperations/pullPathViaGit.d.ts +9 -0
- package/dist/cli/pathOperations/pullPathViaGit.d.ts.map +1 -0
- package/dist/cli/pathOperations/pullPathViaGit.js +86 -0
- package/dist/cli/pathOperations/pullPathViaGit.js.map +1 -0
- package/dist/cli/pathOperations/pullPathViaTar.d.ts +14 -0
- package/dist/cli/pathOperations/pullPathViaTar.d.ts.map +1 -0
- package/dist/cli/pathOperations/pullPathViaTar.js +252 -0
- package/dist/cli/pathOperations/pullPathViaTar.js.map +1 -0
- package/dist/cli/pathOperations/pushPathViaGit.d.ts +9 -0
- package/dist/cli/pathOperations/pushPathViaGit.d.ts.map +1 -0
- package/dist/cli/pathOperations/pushPathViaGit.js +49 -0
- package/dist/cli/pathOperations/pushPathViaGit.js.map +1 -0
- package/dist/cli/pathOperations/pushPathViaTar.d.ts +6 -0
- package/dist/cli/pathOperations/pushPathViaTar.d.ts.map +1 -0
- package/dist/cli/pathOperations/pushPathViaTar.js +63 -0
- package/dist/cli/pathOperations/pushPathViaTar.js.map +1 -0
- package/dist/cli/pathOperations/uploadPathUploads.d.ts +6 -0
- package/dist/cli/pathOperations/uploadPathUploads.d.ts.map +1 -0
- package/dist/cli/pathOperations/uploadPathUploads.js +114 -0
- package/dist/cli/pathOperations/uploadPathUploads.js.map +1 -0
- package/dist/cli/pathOperations/validatePathSettings.d.ts +14 -0
- package/dist/cli/pathOperations/validatePathSettings.d.ts.map +1 -0
- package/dist/cli/pathOperations/validatePathSettings.js +191 -0
- package/dist/cli/pathOperations/validatePathSettings.js.map +1 -0
- package/dist/cli/utils/assemble.d.ts +22 -0
- package/dist/cli/utils/assemble.d.ts.map +1 -0
- package/dist/cli/utils/assemble.js +219 -0
- package/dist/cli/utils/assemble.js.map +1 -0
- package/dist/cli/utils/cliName.d.ts +3 -0
- package/dist/cli/utils/cliName.d.ts.map +1 -0
- package/dist/cli/utils/cliName.js +17 -0
- package/dist/cli/utils/cliName.js.map +1 -0
- package/dist/cli/utils/codeWorkspace.d.ts +13 -0
- package/dist/cli/utils/codeWorkspace.d.ts.map +1 -0
- package/dist/cli/utils/codeWorkspace.js +20 -0
- package/dist/cli/utils/codeWorkspace.js.map +1 -0
- package/dist/cli/utils/colors.d.ts +14 -0
- package/dist/cli/utils/colors.d.ts.map +1 -0
- package/dist/cli/utils/colors.js +22 -0
- package/dist/cli/utils/colors.js.map +1 -0
- package/dist/cli/utils/config.d.ts +35 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +95 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/copilotInstructions.d.ts +5 -0
- package/dist/cli/utils/copilotInstructions.d.ts.map +1 -0
- package/dist/cli/utils/copilotInstructions.js +101 -0
- package/dist/cli/utils/copilotInstructions.js.map +1 -0
- package/dist/cli/utils/createLoggedFs.d.ts +17 -0
- package/dist/cli/utils/createLoggedFs.d.ts.map +1 -0
- package/dist/cli/utils/createLoggedFs.js +106 -0
- package/dist/cli/utils/createLoggedFs.js.map +1 -0
- package/dist/cli/utils/credentials.d.ts +38 -0
- package/dist/cli/utils/credentials.d.ts.map +1 -0
- package/dist/cli/utils/credentials.js +400 -0
- package/dist/cli/utils/credentials.js.map +1 -0
- package/dist/cli/utils/discover.d.ts +26 -0
- package/dist/cli/utils/discover.d.ts.map +1 -0
- package/dist/cli/utils/discover.js +209 -0
- package/dist/cli/utils/discover.js.map +1 -0
- package/dist/cli/utils/formatPlan.d.ts +40 -0
- package/dist/cli/utils/formatPlan.d.ts.map +1 -0
- package/dist/cli/utils/formatPlan.js +148 -0
- package/dist/cli/utils/formatPlan.js.map +1 -0
- package/dist/cli/utils/git.d.ts +17 -0
- package/dist/cli/utils/git.d.ts.map +1 -0
- package/dist/cli/utils/git.js +57 -0
- package/dist/cli/utils/git.js.map +1 -0
- package/dist/cli/utils/gitUrl.d.ts +7 -0
- package/dist/cli/utils/gitUrl.d.ts.map +1 -0
- package/dist/cli/utils/gitUrl.js +23 -0
- package/dist/cli/utils/gitUrl.js.map +1 -0
- package/dist/cli/utils/log.d.ts +22 -0
- package/dist/cli/utils/log.d.ts.map +1 -0
- package/dist/cli/utils/log.js +31 -0
- package/dist/cli/utils/log.js.map +1 -0
- package/dist/cli/utils/logData.d.ts +5 -0
- package/dist/cli/utils/logData.d.ts.map +1 -0
- package/dist/cli/utils/logData.js +65 -0
- package/dist/cli/utils/logData.js.map +1 -0
- package/dist/cli/utils/loggedFetch.d.ts +4 -0
- package/dist/cli/utils/loggedFetch.d.ts.map +1 -0
- package/dist/cli/utils/loggedFetch.js +15 -0
- package/dist/cli/utils/loggedFetch.js.map +1 -0
- package/dist/cli/utils/pageContext.d.ts +50 -0
- package/dist/cli/utils/pageContext.d.ts.map +1 -0
- package/dist/cli/utils/pageContext.js +86 -0
- package/dist/cli/utils/pageContext.js.map +1 -0
- package/dist/cli/utils/parseDocumentPath.d.ts +13 -0
- package/dist/cli/utils/parseDocumentPath.d.ts.map +1 -0
- package/dist/cli/utils/parseDocumentPath.js +35 -0
- package/dist/cli/utils/parseDocumentPath.js.map +1 -0
- package/dist/cli/utils/populateCache.d.ts +12 -0
- package/dist/cli/utils/populateCache.d.ts.map +1 -0
- package/dist/cli/utils/populateCache.js +21 -0
- package/dist/cli/utils/populateCache.js.map +1 -0
- package/dist/cli/utils/prefixLog.d.ts +21 -0
- package/dist/cli/utils/prefixLog.d.ts.map +1 -0
- package/dist/cli/utils/prefixLog.js +73 -0
- package/dist/cli/utils/prefixLog.js.map +1 -0
- package/dist/cli/utils/program.d.ts +7 -0
- package/dist/cli/utils/program.d.ts.map +1 -0
- package/dist/cli/utils/program.js +266 -0
- package/dist/cli/utils/program.js.map +1 -0
- package/dist/cli/utils/promptExec.d.ts +27 -0
- package/dist/cli/utils/promptExec.d.ts.map +1 -0
- package/dist/cli/utils/promptExec.js +47 -0
- package/dist/cli/utils/promptExec.js.map +1 -0
- package/dist/cli/utils/pullHarness.d.ts +15 -0
- package/dist/cli/utils/pullHarness.d.ts.map +1 -0
- package/dist/cli/utils/pullHarness.js +101 -0
- package/dist/cli/utils/pullHarness.js.map +1 -0
- package/dist/cli/utils/pullViaGit.d.ts +6 -0
- package/dist/cli/utils/pullViaGit.d.ts.map +1 -0
- package/dist/cli/utils/pullViaGit.js +13 -0
- package/dist/cli/utils/pullViaGit.js.map +1 -0
- package/dist/cli/utils/pullViaTar.d.ts +10 -0
- package/dist/cli/utils/pullViaTar.d.ts.map +1 -0
- package/dist/cli/utils/pullViaTar.js +15 -0
- package/dist/cli/utils/pullViaTar.js.map +1 -0
- package/dist/cli/utils/pushHarness.d.ts +24 -0
- package/dist/cli/utils/pushHarness.d.ts.map +1 -0
- package/dist/cli/utils/pushHarness.js +82 -0
- package/dist/cli/utils/pushHarness.js.map +1 -0
- package/dist/cli/utils/pushViaGit.d.ts +6 -0
- package/dist/cli/utils/pushViaGit.d.ts.map +1 -0
- package/dist/cli/utils/pushViaGit.js +16 -0
- package/dist/cli/utils/pushViaGit.js.map +1 -0
- package/dist/cli/utils/pushViaTar.d.ts +6 -0
- package/dist/cli/utils/pushViaTar.d.ts.map +1 -0
- package/dist/cli/utils/pushViaTar.js +9 -0
- package/dist/cli/utils/pushViaTar.js.map +1 -0
- package/dist/cli/utils/resolveTarget.d.ts +23 -0
- package/dist/cli/utils/resolveTarget.d.ts.map +1 -0
- package/dist/cli/utils/resolveTarget.js +43 -0
- package/dist/cli/utils/resolveTarget.js.map +1 -0
- package/dist/cli/utils/settingsValidation.d.ts +23 -0
- package/dist/cli/utils/settingsValidation.d.ts.map +1 -0
- package/dist/cli/utils/settingsValidation.js +176 -0
- package/dist/cli/utils/settingsValidation.js.map +1 -0
- package/dist/cli/utils/types.d.ts +33 -0
- package/dist/cli/utils/types.d.ts.map +1 -0
- package/dist/cli/utils/types.js +2 -0
- package/dist/cli/utils/types.js.map +1 -0
- package/dist/cli/utils/validateAndGetFilesFromDir.d.ts +10 -0
- package/dist/cli/utils/validateAndGetFilesFromDir.d.ts.map +1 -0
- package/dist/cli/utils/validateAndGetFilesFromDir.js +74 -0
- package/dist/cli/utils/validateAndGetFilesFromDir.js.map +1 -0
- package/dist/cli/utils/watchForChanges.d.ts +7 -0
- package/dist/cli/utils/watchForChanges.d.ts.map +1 -0
- package/dist/cli/utils/watchForChanges.js +44 -0
- package/dist/cli/utils/watchForChanges.js.map +1 -0
- package/dist/db/index.d.ts +5 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +23 -0
- package/dist/db/index.js.map +1 -0
- package/dist/editor.bundle.dev.js +30823 -0
- package/dist/editor.bundle.dev.js.map +7 -0
- package/dist/editor.bundle.js +30347 -0
- package/dist/editor.bundle.js.map +7 -0
- package/dist/editor.bundle.prod.js +1373 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/addRedirect.d.ts +20 -0
- package/dist/operations/addRedirect.d.ts.map +1 -0
- package/dist/operations/addRedirect.js +46 -0
- package/dist/operations/addRedirect.js.map +1 -0
- package/dist/operations/addUpload.d.ts +29 -0
- package/dist/operations/addUpload.d.ts.map +1 -0
- package/dist/operations/addUpload.js +96 -0
- package/dist/operations/addUpload.js.map +1 -0
- package/dist/operations/addUploadsFromContent.d.ts +27 -0
- package/dist/operations/addUploadsFromContent.d.ts.map +1 -0
- package/dist/operations/addUploadsFromContent.js +311 -0
- package/dist/operations/addUploadsFromContent.js.map +1 -0
- package/dist/operations/clearDraft.d.ts +17 -0
- package/dist/operations/clearDraft.d.ts.map +1 -0
- package/dist/operations/clearDraft.js +56 -0
- package/dist/operations/clearDraft.js.map +1 -0
- package/dist/operations/createDocumentRecord.d.ts +11 -0
- package/dist/operations/createDocumentRecord.d.ts.map +1 -0
- package/dist/operations/createDocumentRecord.js +100 -0
- package/dist/operations/createDocumentRecord.js.map +1 -0
- package/dist/operations/createRoute.d.ts +6 -0
- package/dist/operations/createRoute.d.ts.map +1 -0
- package/dist/operations/createRoute.js +10 -0
- package/dist/operations/createRoute.js.map +1 -0
- package/dist/operations/createSession.d.ts +21 -0
- package/dist/operations/createSession.d.ts.map +1 -0
- package/dist/operations/createSession.js +27 -0
- package/dist/operations/createSession.js.map +1 -0
- package/dist/operations/deleteSession.d.ts +13 -0
- package/dist/operations/deleteSession.d.ts.map +1 -0
- package/dist/operations/deleteSession.js +15 -0
- package/dist/operations/deleteSession.js.map +1 -0
- package/dist/operations/findDocument.d.ts +18 -0
- package/dist/operations/findDocument.d.ts.map +1 -0
- package/dist/operations/findDocument.js +53 -0
- package/dist/operations/findDocument.js.map +1 -0
- package/dist/operations/getAllUploadsForDocument.d.ts +11 -0
- package/dist/operations/getAllUploadsForDocument.d.ts.map +1 -0
- package/dist/operations/getAllUploadsForDocument.js +15 -0
- package/dist/operations/getAllUploadsForDocument.js.map +1 -0
- package/dist/operations/getDocumentClientState.d.ts +30 -0
- package/dist/operations/getDocumentClientState.d.ts.map +1 -0
- package/dist/operations/getDocumentClientState.js +246 -0
- package/dist/operations/getDocumentClientState.js.map +1 -0
- package/dist/operations/getDocumentInstance.d.ts +7 -0
- package/dist/operations/getDocumentInstance.d.ts.map +1 -0
- package/dist/operations/getDocumentInstance.js +32 -0
- package/dist/operations/getDocumentInstance.js.map +1 -0
- package/dist/operations/getDocumentRecord.d.ts +6 -0
- package/dist/operations/getDocumentRecord.d.ts.map +1 -0
- package/dist/operations/getDocumentRecord.js +8 -0
- package/dist/operations/getDocumentRecord.js.map +1 -0
- package/dist/operations/getDualDocument.d.ts +28 -0
- package/dist/operations/getDualDocument.d.ts.map +1 -0
- package/dist/operations/getDualDocument.js +81 -0
- package/dist/operations/getDualDocument.js.map +1 -0
- package/dist/operations/getDualDocuments.d.ts +26 -0
- package/dist/operations/getDualDocuments.d.ts.map +1 -0
- package/dist/operations/getDualDocuments.js +130 -0
- package/dist/operations/getDualDocuments.js.map +1 -0
- package/dist/operations/getOptimisticDocument.d.ts +6 -0
- package/dist/operations/getOptimisticDocument.d.ts.map +1 -0
- package/dist/operations/getOptimisticDocument.js +30 -0
- package/dist/operations/getOptimisticDocument.js.map +1 -0
- package/dist/operations/getPage.d.ts +18 -0
- package/dist/operations/getPage.d.ts.map +1 -0
- package/dist/operations/getPage.js +31 -0
- package/dist/operations/getPage.js.map +1 -0
- package/dist/operations/getPages.d.ts +18 -0
- package/dist/operations/getPages.d.ts.map +1 -0
- package/dist/operations/getPages.js +30 -0
- package/dist/operations/getPages.js.map +1 -0
- package/dist/operations/getRedirects.d.ts +13 -0
- package/dist/operations/getRedirects.d.ts.map +1 -0
- package/dist/operations/getRedirects.js +30 -0
- package/dist/operations/getRedirects.js.map +1 -0
- package/dist/operations/getRenderDocument.d.ts +18 -0
- package/dist/operations/getRenderDocument.d.ts.map +1 -0
- package/dist/operations/getRenderDocument.js +27 -0
- package/dist/operations/getRenderDocument.js.map +1 -0
- package/dist/operations/getRenderDocumentWithAssociations.d.ts +15 -0
- package/dist/operations/getRenderDocumentWithAssociations.d.ts.map +1 -0
- package/dist/operations/getRenderDocumentWithAssociations.js +64 -0
- package/dist/operations/getRenderDocumentWithAssociations.js.map +1 -0
- package/dist/operations/getRenderDocuments.d.ts +16 -0
- package/dist/operations/getRenderDocuments.d.ts.map +1 -0
- package/dist/operations/getRenderDocuments.js +25 -0
- package/dist/operations/getRenderDocuments.js.map +1 -0
- package/dist/operations/getUpload.d.ts +25 -0
- package/dist/operations/getUpload.d.ts.map +1 -0
- package/dist/operations/getUpload.js +37 -0
- package/dist/operations/getUpload.js.map +1 -0
- package/dist/operations/getUploads.d.ts +25 -0
- package/dist/operations/getUploads.d.ts.map +1 -0
- package/dist/operations/getUploads.js +76 -0
- package/dist/operations/getUploads.js.map +1 -0
- package/dist/operations/getUsersCount.d.ts +12 -0
- package/dist/operations/getUsersCount.d.ts.map +1 -0
- package/dist/operations/getUsersCount.js +12 -0
- package/dist/operations/getUsersCount.js.map +1 -0
- package/dist/operations/login.d.ts +20 -0
- package/dist/operations/login.d.ts.map +1 -0
- package/dist/operations/login.js +38 -0
- package/dist/operations/login.js.map +1 -0
- package/dist/operations/removeDocument.d.ts +19 -0
- package/dist/operations/removeDocument.d.ts.map +1 -0
- package/dist/operations/removeDocument.js +54 -0
- package/dist/operations/removeDocument.js.map +1 -0
- package/dist/operations/removeRedirect.d.ts +15 -0
- package/dist/operations/removeRedirect.d.ts.map +1 -0
- package/dist/operations/removeRedirect.js +71 -0
- package/dist/operations/removeRedirect.js.map +1 -0
- package/dist/operations/removeUpload.d.ts +21 -0
- package/dist/operations/removeUpload.d.ts.map +1 -0
- package/dist/operations/removeUpload.js +49 -0
- package/dist/operations/removeUpload.js.map +1 -0
- package/dist/operations/search.d.ts +19 -0
- package/dist/operations/search.d.ts.map +1 -0
- package/dist/operations/search.js +109 -0
- package/dist/operations/search.js.map +1 -0
- package/dist/operations/seedIfEmpty.d.ts +7 -0
- package/dist/operations/seedIfEmpty.d.ts.map +1 -0
- package/dist/operations/seedIfEmpty.js +100 -0
- package/dist/operations/seedIfEmpty.js.map +1 -0
- package/dist/operations/signup.d.ts +21 -0
- package/dist/operations/signup.d.ts.map +1 -0
- package/dist/operations/signup.js +45 -0
- package/dist/operations/signup.js.map +1 -0
- package/dist/operations/types.d.ts +223 -0
- package/dist/operations/types.d.ts.map +1 -0
- package/dist/operations/types.js +2 -0
- package/dist/operations/types.js.map +1 -0
- package/dist/operations/updateUpload.d.ts +27 -0
- package/dist/operations/updateUpload.d.ts.map +1 -0
- package/dist/operations/updateUpload.js +78 -0
- package/dist/operations/updateUpload.js.map +1 -0
- package/dist/operations/updateViaArchive.d.ts +23 -0
- package/dist/operations/updateViaArchive.d.ts.map +1 -0
- package/dist/operations/updateViaArchive.js +229 -0
- package/dist/operations/updateViaArchive.js.map +1 -0
- package/dist/operations/upsert.d.ts +26 -0
- package/dist/operations/upsert.d.ts.map +1 -0
- package/dist/operations/upsert.js +257 -0
- package/dist/operations/upsert.js.map +1 -0
- package/dist/operations/utils/common.d.ts +2 -0
- package/dist/operations/utils/common.d.ts.map +1 -0
- package/dist/operations/utils/common.js +2 -0
- package/dist/operations/utils/common.js.map +1 -0
- package/dist/operations/utils/contentType.d.ts +2 -0
- package/dist/operations/utils/contentType.d.ts.map +1 -0
- package/dist/operations/utils/contentType.js +66 -0
- package/dist/operations/utils/contentType.js.map +1 -0
- package/dist/operations/utils/dataType.d.ts +7 -0
- package/dist/operations/utils/dataType.d.ts.map +1 -0
- package/dist/operations/utils/dataType.js +35 -0
- package/dist/operations/utils/dataType.js.map +1 -0
- package/dist/operations/utils/generateUniqueFilename.d.ts +7 -0
- package/dist/operations/utils/generateUniqueFilename.d.ts.map +1 -0
- package/dist/operations/utils/generateUniqueFilename.js +38 -0
- package/dist/operations/utils/generateUniqueFilename.js.map +1 -0
- package/dist/operations/utils/hasEtaTemplates.d.ts +2 -0
- package/dist/operations/utils/hasEtaTemplates.d.ts.map +1 -0
- package/dist/operations/utils/hasEtaTemplates.js +10 -0
- package/dist/operations/utils/hasEtaTemplates.js.map +1 -0
- package/dist/operations/utils/normalizeDocumentQuery.d.ts +12 -0
- package/dist/operations/utils/normalizeDocumentQuery.d.ts.map +1 -0
- package/dist/operations/utils/normalizeDocumentQuery.js +45 -0
- package/dist/operations/utils/normalizeDocumentQuery.js.map +1 -0
- package/dist/operations/utils/utils.d.ts +4 -0
- package/dist/operations/utils/utils.d.ts.map +1 -0
- package/dist/operations/utils/utils.js +4 -0
- package/dist/operations/utils/utils.js.map +1 -0
- package/dist/operations/validateSession.d.ts +17 -0
- package/dist/operations/validateSession.d.ts.map +1 -0
- package/dist/operations/validateSession.js +27 -0
- package/dist/operations/validateSession.js.map +1 -0
- package/dist/render/index.d.ts +9 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +347 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/utils/base.d.ts +74 -0
- package/dist/render/utils/base.d.ts.map +1 -0
- package/dist/render/utils/base.js +290 -0
- package/dist/render/utils/base.js.map +1 -0
- package/dist/render/utils/extractRawBlocks.d.ts +10 -0
- package/dist/render/utils/extractRawBlocks.d.ts.map +1 -0
- package/dist/render/utils/extractRawBlocks.js +28 -0
- package/dist/render/utils/extractRawBlocks.js.map +1 -0
- package/dist/render/utils/rawBlocks.d.ts +10 -0
- package/dist/render/utils/rawBlocks.d.ts.map +1 -0
- package/dist/render/utils/rawBlocks.js +28 -0
- package/dist/render/utils/rawBlocks.js.map +1 -0
- package/dist/render/utils/usageTracker.d.ts +10 -0
- package/dist/render/utils/usageTracker.d.ts.map +1 -0
- package/dist/render/utils/usageTracker.js +87 -0
- package/dist/render/utils/usageTracker.js.map +1 -0
- package/dist/responder/index.d.ts +34 -0
- package/dist/responder/index.d.ts.map +1 -0
- package/dist/responder/index.js +546 -0
- package/dist/responder/index.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +54 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/authorize.d.ts +3 -0
- package/dist/server/middleware/authorize.d.ts.map +1 -0
- package/dist/server/middleware/authorize.js +15 -0
- package/dist/server/middleware/authorize.js.map +1 -0
- package/dist/server/middleware/establishAuth.d.ts +3 -0
- package/dist/server/middleware/establishAuth.d.ts.map +1 -0
- package/dist/server/middleware/establishAuth.js +45 -0
- package/dist/server/middleware/establishAuth.js.map +1 -0
- package/dist/server/middleware/log.d.ts +3 -0
- package/dist/server/middleware/log.d.ts.map +1 -0
- package/dist/server/middleware/log.js +12 -0
- package/dist/server/middleware/log.js.map +1 -0
- package/dist/server/middleware/requirePathMatch.d.ts +3 -0
- package/dist/server/middleware/requirePathMatch.d.ts.map +1 -0
- package/dist/server/middleware/requirePathMatch.js +25 -0
- package/dist/server/middleware/requirePathMatch.js.map +1 -0
- package/dist/server/middleware/requireQuery.d.ts +3 -0
- package/dist/server/middleware/requireQuery.d.ts.map +1 -0
- package/dist/server/middleware/requireQuery.js +24 -0
- package/dist/server/middleware/requireQuery.js.map +1 -0
- package/dist/server/middleware/withDb.d.ts +4 -0
- package/dist/server/middleware/withDb.d.ts.map +1 -0
- package/dist/server/middleware/withDb.js +7 -0
- package/dist/server/middleware/withDb.js.map +1 -0
- package/dist/server/routes/assets.d.ts +4 -0
- package/dist/server/routes/assets.d.ts.map +1 -0
- package/dist/server/routes/assets.js +178 -0
- package/dist/server/routes/assets.js.map +1 -0
- package/dist/server/routes/documents.d.ts +4 -0
- package/dist/server/routes/documents.d.ts.map +1 -0
- package/dist/server/routes/documents.js +40 -0
- package/dist/server/routes/documents.js.map +1 -0
- package/dist/server/routes/edit.d.ts +22 -0
- package/dist/server/routes/edit.d.ts.map +1 -0
- package/dist/server/routes/edit.js +494 -0
- package/dist/server/routes/edit.js.map +1 -0
- package/dist/server/routes/git.d.ts +4 -0
- package/dist/server/routes/git.d.ts.map +1 -0
- package/dist/server/routes/git.js +612 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/readUpload.d.ts +4 -0
- package/dist/server/routes/readUpload.d.ts.map +1 -0
- package/dist/server/routes/readUpload.js +57 -0
- package/dist/server/routes/readUpload.js.map +1 -0
- package/dist/server/utils/NotFoundError.d.ts +9 -0
- package/dist/server/utils/NotFoundError.d.ts.map +1 -0
- package/dist/server/utils/NotFoundError.js +16 -0
- package/dist/server/utils/NotFoundError.js.map +1 -0
- package/dist/server/utils/editor.css +1535 -0
- package/dist/server/utils/htmlEditorPage.d.ts +6 -0
- package/dist/server/utils/htmlEditorPage.d.ts.map +1 -0
- package/dist/server/utils/htmlEditorPage.js +518 -0
- package/dist/server/utils/htmlEditorPage.js.map +1 -0
- package/dist/server/utils/htmlLoginPage.d.ts +6 -0
- package/dist/server/utils/htmlLoginPage.d.ts.map +1 -0
- package/dist/server/utils/htmlLoginPage.js +134 -0
- package/dist/server/utils/htmlLoginPage.js.map +1 -0
- package/dist/server/utils/layout.css +153 -0
- package/dist/server/utils/types.d.ts +18 -0
- package/dist/server/utils/types.d.ts.map +1 -0
- package/dist/server/utils/types.js +2 -0
- package/dist/server/utils/types.js.map +1 -0
- package/dist/server-bin/index.d.ts +2 -0
- package/dist/server-bin/index.d.ts.map +1 -0
- package/dist/server-bin/index.js +26 -0
- package/dist/server-bin/index.js.map +1 -0
- package/dist/utils/functionContext.d.ts +12 -0
- package/dist/utils/functionContext.d.ts.map +1 -0
- package/dist/utils/functionContext.js +19 -0
- package/dist/utils/functionContext.js.map +1 -0
- package/dist/utils/functionContextClient.d.ts +23 -0
- package/dist/utils/functionContextClient.d.ts.map +1 -0
- package/dist/utils/functionContextClient.js +93 -0
- package/dist/utils/functionContextClient.js.map +1 -0
- package/dist/utils/stringifyData.d.ts +2 -0
- package/dist/utils/stringifyData.d.ts.map +1 -0
- package/dist/utils/stringifyData.js +23 -0
- package/dist/utils/stringifyData.js.map +1 -0
- package/dist/utils/stripImageExif.d.ts +14 -0
- package/dist/utils/stripImageExif.d.ts.map +1 -0
- package/dist/utils/stripImageExif.js +112 -0
- package/dist/utils/stripImageExif.js.map +1 -0
- package/dist/utils/types.d.ts +81 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/migrations/1770796673000_initial-schema.js +178 -0
- package/package.json +97 -0
- package/pages/skywriter/.github/copilot-instructions.md +94 -0
- package/pages/skywriter/content.md +862 -0
- package/pages/skywriter/data.json +1 -0
- package/pages/skywriter/doc.code-workspace +15 -0
- package/pages/skywriter/script.js +1 -0
- package/pages/skywriter/server.js +1 -0
- package/pages/skywriter/settings.json +11 -0
- package/pages/skywriter/style.css +167 -0
- package/pages/skywriter/template/content.eta +55 -0
- package/pages/skywriter/template/data.json +1 -0
- package/pages/skywriter/template/script.js +512 -0
- package/pages/skywriter/template/server.js +27 -0
- package/pages/skywriter/template/settings.json +11 -0
- 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 @@
|
|
|
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
|