decap-server 3.3.0 → 3.4.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/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.4.0](https://github.com/decaporg/decap-cms/compare/decap-server@3.3.1...decap-server@3.4.0) (2025-11-04)
7
+
8
+ ### Features
9
+
10
+ - **decap-server:** Allow the server to be run securely ([#7579](https://github.com/decaporg/decap-cms/issues/7579)) ([eb9e8c5](https://github.com/decaporg/decap-cms/commit/eb9e8c514b1783842953e6b1e5fd05377e000dae))
11
+
12
+ ## [3.3.1](https://github.com/decaporg/decap-cms/compare/decap-server@3.3.0...decap-server@3.3.1) (2025-07-31)
13
+
14
+ **Note:** Version bump only for package decap-server
15
+
6
16
  # [3.3.0](https://github.com/decaporg/decap-cms/compare/decap-server@3.2.0...decap-server@3.3.0) (2025-06-26)
7
17
 
8
18
  **Note:** Version bump only for package decap-server
package/README.md CHANGED
@@ -27,4 +27,8 @@ backend:
27
27
  GIT_REPO_DIRECTORY=FULL_PATH_TO_LOCAL_GIT_REPO
28
28
  # optional, defaults to 8081
29
29
  PORT=CUSTOM_PORT
30
+ # optional, only listen for incoming connections on a specific IP address
31
+ BIND_HOST=127.0.0.1
32
+ # optional, restrict API requests to a specific origin
33
+ ORIGIN=https://example.com
30
34
  ```
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- (()=>{"use strict";var e={96:e=>{e.exports=require("morgan")},123:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.readMediaFile=t.entriesFromFiles=void 0;const i=r(a(982)),n=r(a(928)),s=a(896);function o(e){return i.default.createHash("sha256").update(e).digest("hex")}function l(e){return e.replace(/\\/g,"/")}t.entriesFromFiles=async function(e,t){return Promise.all(t.map(async t=>{try{const a=await s.promises.readFile(n.default.join(e,t.path));return{data:a.toString(),file:{path:l(t.path),label:t.label,id:o(a)}}}catch(e){return{data:null,file:{path:l(t.path),label:t.label,id:null}}}}))},t.readMediaFile=async function(e,t){const a="base64",r=await s.promises.readFile(n.default.join(e,t));return{id:o(r),content:r.toString(a),encoding:a,path:l(t),name:n.default.basename(t)}}},124:e=>{e.exports=require("winston")},161:(e,t)=>{function a(e){return e||"decap-cms/"}Object.defineProperty(t,"__esModule",{value:!0}),t.branchFromContentKey=t.contentKeyFromBranch=t.parseContentKey=t.generateContentKey=t.statusToLabel=t.labelToStatus=t.isCMSLabel=t.MERGE_COMMIT_MESSAGE=t.DEFAULT_PR_BODY=t.CMS_BRANCH_PREFIX=void 0,t.CMS_BRANCH_PREFIX="cms",t.DEFAULT_PR_BODY="Automatically generated by Decap CMS",t.MERGE_COMMIT_MESSAGE="Automatically generated. Merged on Decap CMS.",t.isCMSLabel=function(e,t){return e.startsWith(a(t))},t.labelToStatus=function(e,t){return e.slice(a(t).length)},t.statusToLabel=function(e,t){return`${a(t)}${e}`},t.generateContentKey=function(e,t){return`${e}/${t}`},t.parseContentKey=function(e){const t=e.indexOf("/");return{collection:e.slice(0,t),slug:e.slice(t+1)}},t.contentKeyFromBranch=function(e){return e.slice(`${t.CMS_BRANCH_PREFIX}/`.length)},t.branchFromContentKey=function(e){return`${t.CMS_BRANCH_PREFIX}/${e}`}},252:e=>{e.exports=require("express")},280:e=>{e.exports=require("what-the-diff")},354:e=>{e.exports=require("async-mutex")},476:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getUpdateDate=t.move=t.deleteFile=t.writeFile=t.listRepoFiles=void 0;const i=r(a(928)),n=a(896);async function s(e,t,a){if(a<=0)return[];try{const r=await n.promises.readdir(e,{withFileTypes:!0}),o=await Promise.all(r.map(r=>{const n=i.default.join(e,r.name);return r.isDirectory()?s(n,t,a-1):[n].filter(e=>e.endsWith(t))}));return[].concat(...o)}catch(e){return[]}}async function o(e,t){await n.promises.mkdir(i.default.dirname(t),{recursive:!0}),await n.promises.rename(e,t)}t.listRepoFiles=async function(e,t,a,r){return(await s(i.default.join(e,t),a,r)).map(t=>t.slice(e.length+1))},t.writeFile=async function(e,t){await n.promises.mkdir(i.default.dirname(e),{recursive:!0}),await n.promises.writeFile(e,t)},t.deleteFile=async function(e,t){await n.promises.unlink(i.default.join(e,t)).catch(()=>{})},t.move=async function(e,t){await o(e,t);const a=i.default.dirname(e),r=i.default.dirname(t),n=await s(a,"",100);await Promise.all(n.map(e=>o(e,e.replace(a,r))))},t.getUpdateDate=async function(e,t){return n.promises.stat(i.default.join(e,t)).then(e=>e.mtime).catch(()=>new Date)}},577:e=>{e.exports=require("cors")},669:e=>{e.exports=require("@hapi/joi")},778:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.pathTraversal=void 0;const i=r(a(669)),n=r(a(928));t.pathTraversal=function(e){return i.default.extend({type:"path",base:i.default.string().required(),messages:{"path.invalid":"{{#label}} must resolve to a path under the configured repository"},validate(t,a){if(!n.default.join(e,t).startsWith(e))return{value:t,errors:a.error("path.invalid")}}}).path()}},783:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),a(818).config();const i=r(a(252)),n=a(827),s=a(971),o=a(786),l=a(943),c=(0,i.default)(),u=process.env.PORT||8081,d=process.env.LOG_LEVEL||"info";(async()=>{const e=(0,l.createLogger)({level:d}),t={logger:e};(0,n.registerCommonMiddlewares)(c,t);try{const e=process.env.MODE||"fs";if("fs"===e)(0,o.registerMiddleware)(c,t);else{if("git"!==e)throw new Error(`Unknown proxy mode '${e}'`);(0,s.registerMiddleware)(c,t)}}catch(t){e.error(t instanceof Error?t.message:"Unknown error"),process.exit(1)}c.listen(u,()=>{e.info(`Decap CMS Proxy Server listening on port ${u}`)})})()},786:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.getSchema=t.localFsMiddleware=void 0;const i=r(a(928)),n=a(964),s=a(778),o=a(476),l=a(123);function c({repoPath:e,logger:t}){return async function(a,r){try{const{body:t}=a;switch(t.action){case"info":r.json({repo:i.default.basename(e),publish_modes:["simple"],type:"local_fs"});break;case"entriesByFolder":{const a=t.params,{folder:i,extension:n,depth:s}=a,c=await(0,o.listRepoFiles)(e,i,n,s).then(t=>(0,l.entriesFromFiles)(e,t.map(e=>({path:e}))));r.json(c);break}case"entriesByFiles":{const a=t.params,i=await(0,l.entriesFromFiles)(e,a.files);r.json(i);break}case"getEntry":{const a=t.params,[i]=await(0,l.entriesFromFiles)(e,[{path:a.path}]);r.json(i);break}case"persistEntry":{const{entry:a,dataFiles:n=[a],assets:s}=t.params;await Promise.all(n.map(t=>(0,o.writeFile)(i.default.join(e,t.path),t.raw))),await Promise.all(s.map(t=>(0,o.writeFile)(i.default.join(e,t.path),Buffer.from(t.content,t.encoding)))),n.every(e=>e.newPath)&&n.forEach(async t=>{await(0,o.move)(i.default.join(e,t.path),i.default.join(e,t.newPath))}),r.json({message:"entry persisted"});break}case"getMedia":{const{mediaFolder:a}=t.params,i=await(0,o.listRepoFiles)(e,a,"",1),n=await Promise.all(i.map(t=>(0,l.readMediaFile)(e,t)));r.json(n);break}case"getMediaFile":{const{path:a}=t.params,i=await(0,l.readMediaFile)(e,a);r.json(i);break}case"persistMedia":{const{asset:a}=t.params;await(0,o.writeFile)(i.default.join(e,a.path),Buffer.from(a.content,a.encoding));const n=await(0,l.readMediaFile)(e,a.path);r.json(n);break}case"deleteFile":{const{path:a}=t.params;await(0,o.deleteFile)(e,a),r.json({message:`deleted file ${a}`});break}case"deleteFiles":{const{paths:a}=t.params;await Promise.all(a.map(t=>(0,o.deleteFile)(e,t))),r.json({message:`deleted files ${a.join(", ")}`});break}case"getDeployPreview":r.json(null);break;default:{const e=`Unknown action ${t.action}`;r.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(a.body)}: ${e instanceof Error?e.message:"Unknown error"}`),r.status(500).json({error:"Unknown error"})}}}function u({repoPath:e}){return(0,n.defaultSchema)({path:(0,s.pathTraversal)(e)})}t.localFsMiddleware=c,t.getSchema=u,t.registerMiddleware=async function(e,t){const{logger:a}=t,r=i.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());e.post("/api/v1",(0,n.joi)(u({repoPath:r}))),e.post("/api/v1",c({repoPath:r,logger:a})),a.info(`Decap CMS File System Proxy Server configured with ${r}`)}},807:e=>{e.exports=require("simple-git")},818:e=>{e.exports=require("dotenv")},827:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerCommonMiddlewares=void 0;const i=r(a(252)),n=r(a(96)),s=r(a(577));t.registerCommonMiddlewares=function(e,t){const{logger:a}=t,r={write:e=>{a.debug(String(e).trim())}};e.use((0,n.default)("combined",{stream:r})),e.use((0,s.default)()),e.use(i.default.json({limit:"50mb"}))}},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")},943:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=void 0;const i=r(a(124)),{combine:n,colorize:s,simple:o}=i.default.format;t.createLogger=function({level:e}){return i.default.createLogger({level:e,format:n(s(),o()),transports:[new i.default.transports.Console]})}},964:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.joi=t.defaultSchema=void 0;const i=r(a(669)),n=["info","entriesByFolder","entriesByFiles","getEntry","unpublishedEntries","unpublishedEntry","unpublishedEntryDataFile","unpublishedEntryMediaFile","deleteUnpublishedEntry","persistEntry","updateUnpublishedEntryStatus","publishUnpublishedEntry","getMedia","getMediaFile","persistMedia","deleteFile","deleteFiles","getDeployPreview"],s=i.default.string().required(),o=i.default.number().required(),l=i.default.bool().required(),c=s,u=s;t.defaultSchema=function({path:e=s}={}){const t=i.default.object({branch:s}),a=i.default.object({path:e,content:s,encoding:s.valid("base64")}),r=i.default.object({slug:s,path:e,raw:s,newPath:e.optional()}),d=i.default.when("action",{switch:[{is:"info",then:i.default.allow()},{is:"entriesByFolder",then:t.keys({folder:e,extension:s,depth:o}).required()},{is:"entriesByFiles",then:t.keys({files:i.default.array().items(i.default.object({path:e,label:i.default.string()})).required()})},{is:"getEntry",then:t.keys({path:e}).required()},{is:"unpublishedEntries",then:t.keys({branch:s}).required()},{is:"unpublishedEntry",then:t.keys({id:i.default.string().optional(),collection:i.default.string().optional(),slug:i.default.string().optional(),cmsLabelPrefix:i.default.string().optional()}).required()},{is:"unpublishedEntryDataFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"unpublishedEntryMediaFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"deleteUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"persistEntry",then:t.keys({cmsLabelPrefix:i.default.string().optional(),entry:r,dataFiles:i.default.array().items(r),assets:i.default.array().items(a).required(),options:i.default.object({collectionName:i.default.string(),commitMessage:s,useWorkflow:l,status:s}).required()}).xor("entry","dataFiles").required()},{is:"updateUnpublishedEntryStatus",then:t.keys({collection:c,slug:u,newStatus:s,cmsLabelPrefix:i.default.string().optional()}).required()},{is:"publishUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"getMedia",then:t.keys({mediaFolder:e}).required()},{is:"getMediaFile",then:t.keys({path:e}).required()},{is:"persistMedia",then:t.keys({asset:a.required(),options:i.default.object({commitMessage:s}).required()}).required()},{is:"deleteFile",then:t.keys({path:e,options:i.default.object({commitMessage:s}).required()}).required()},{is:"deleteFiles",then:t.keys({paths:i.default.array().items(e).min(1).required(),options:i.default.object({commitMessage:s}).required()}).required()},{is:"getDeployPreview",then:t.keys({collection:c,slug:u}).required()}],otherwise:i.default.forbidden()});return i.default.object({action:i.default.valid(...n).required(),params:d})},t.joi=function(e){return(t,a,r)=>{const{error:i}=e.validate(t.body,{allowUnknown:!0});if(i){const{details:e}=i,t=e.map(e=>e.message).join(",");a.status(422).json({error:t})}else r()}}},971:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.localGitMiddleware=t.getSchema=t.validateRepo=void 0;const i=r(a(928)),n=a(896),s=a(161),o=a(280),l=r(a(807)),c=a(354),u=a(964),d=a(778),p=a(476),f=a(123);async function m(e,t){await e.add("."),await e.commit(t,void 0,{"--no-verify":null,"--no-gpg-sign":null})}async function h(e){return await e.branchLocal().then(e=>e.current)}async function g(e,t,a){const r=await h(e);try{return r!==t&&await e.checkout(t),await a()}finally{await e.checkout(r)}}function y(e){return`branch.${e}.description`}async function w(e,t,a,r,n){await Promise.all(a.map(e=>(0,p.writeFile)(i.default.join(t,e.path),e.raw))),await Promise.all(r.map(e=>(0,p.writeFile)(i.default.join(t,e.path),Buffer.from(e.content,e.encoding)))),a.every(e=>e.newPath)&&a.forEach(async e=>{await(0,p.move)(i.default.join(t,e.path),i.default.join(t,e.newPath))}),await m(e,n)}async function b(e,t){return await e.branchLocal().then(({all:e})=>e.includes(t))}async function F(e,t,a){const r=await e.diff([t,a]);return(0,o.parse)(r).map(e=>{var t,a;const r=(null===(t=e.oldPath)||void 0===t?void 0:t.replace(/b\//,""))||"",i=(null===(a=e.newPath)||void 0===a?void 0:a.replace(/b\//,""))||"",n=i||r;return{oldPath:r,newPath:i,status:e.status,newFile:"added"===e.status,path:n,id:n,binary:e.binary||/.svg$/.test(n)}})}async function v({repoPath:e}){const t=(0,l.default)(e);if(!await t.checkIsRepo())throw Error(`${e} is not a valid git repository`)}function M({repoPath:e}){return(0,u.defaultSchema)({path:(0,d.pathTraversal)(e)})}function _({repoPath:e,logger:t}){const a=(0,l.default)(e),r=(0,c.withTimeout)(new c.Mutex,3e3,new Error("Request timed out"));return async function(o,l){let c;try{c=await r.acquire();const{body:t}=o;if("info"===t.action)return void l.json({repo:i.default.basename(e),publish_modes:["simple","editorial_workflow"],type:"local_git"});const{branch:u}=t.params;if(!await b(a,u)){const e=`Default branch '${u}' doesn't exist`;return void l.status(422).json({error:e})}switch(t.action){case"entriesByFolder":{const r=t.params,{folder:i,extension:n,depth:s}=r,o=await g(a,u,()=>(0,p.listRepoFiles)(e,i,n,s).then(t=>(0,f.entriesFromFiles)(e,t.map(e=>({path:e})))));l.json(o);break}case"entriesByFiles":{const r=t.params,i=await g(a,u,()=>(0,f.entriesFromFiles)(e,r.files));l.json(i);break}case"getEntry":{const r=t.params,[i]=await g(a,u,()=>(0,f.entriesFromFiles)(e,[{path:r.path}]));l.json(i);break}case"unpublishedEntries":{const e=await a.branchLocal().then(e=>e.all.filter(e=>e.startsWith(`${s.CMS_BRANCH_PREFIX}/`)));l.json(e.map(s.contentKeyFromBranch));break}case"unpublishedEntry":{let{id:r,collection:i,slug:n,cmsLabelPrefix:o}=t.params;r&&({collection:i,slug:n}=(0,s.parseContentKey)(r));const c=(0,s.generateContentKey)(i,n),d=(0,s.branchFromContentKey)(c);if(!await b(a,d))return l.status(404).json({message:"Not Found"});{const t=await F(a,u,d),r=await a.raw(["config",y(d)]),c=r&&(0,s.labelToStatus)(r.trim(),o||""),f=t.length>=0?await g(a,d,async()=>(await Promise.all(t.map(({newPath:t})=>(0,p.getUpdateDate)(e,t)))).reduce((e,t)=>e>t?e:t)):new Date,m={collection:i,slug:n,status:c,diffs:t,updatedAt:f};l.json(m)}break}case"unpublishedEntryDataFile":{const{path:r,collection:i,slug:n}=t.params,o=(0,s.generateContentKey)(i,n),c=(0,s.branchFromContentKey)(o),[u]=await g(a,c,()=>(0,f.entriesFromFiles)(e,[{path:r}]));l.json({data:u.data});break}case"unpublishedEntryMediaFile":{const{path:r,collection:i,slug:n}=t.params,o=(0,s.generateContentKey)(i,n),c=(0,s.branchFromContentKey)(o),u=await g(a,c,()=>(0,f.readMediaFile)(e,r));l.json(u);break}case"deleteUnpublishedEntry":{const{collection:e,slug:r}=t.params,i=(0,s.generateContentKey)(e,r),n=(0,s.branchFromContentKey)(i);await h(a)===n&&await a.checkoutLocalBranch(u),await a.branch(["-D",n]),l.json({message:`deleted branch: ${n}`});break}case"persistEntry":{const{cmsLabelPrefix:r,entry:o,dataFiles:c=[o],assets:d,options:p}=t.params;if(p.useWorkflow){const t=c[0].slug,o=p.collectionName,l=(0,s.generateContentKey)(o,t),f=(0,s.branchFromContentKey)(l);await g(a,u,async()=>{const t=await b(a,f);t?await a.checkout(f):await a.checkoutLocalBranch(f),await async function(e,t){const a=await e.raw(["config","commit.gpgsign"]);try{"true"===a&&await e.addConfig("commit.gpgsign","false"),await e.rebase([t,"--no-verify"])}finally{"true"===a&&await e.addConfig("commit.gpgsign",a)}}(a,u);const o=(await F(a,u,f)).filter(e=>e.binary&&!d.map(e=>e.path).includes(e.path));if(await Promise.all(o.map(t=>n.promises.unlink(i.default.join(e,t.path)))),await w(a,e,c,d,p.commitMessage),!t){const e=(0,s.statusToLabel)(p.status,r||"");await a.addConfig(y(f),e)}})}else await g(a,u,async()=>{await w(a,e,c,d,p.commitMessage)});l.json({message:"entry persisted"});break}case"updateUnpublishedEntryStatus":{const{collection:e,slug:r,newStatus:i,cmsLabelPrefix:n}=t.params,o=(0,s.generateContentKey)(e,r),c=(0,s.branchFromContentKey)(o),d=(0,s.statusToLabel)(i,n||"");await a.addConfig(y(c),d),l.json({message:`${u} description was updated to ${d}`});break}case"publishUnpublishedEntry":{const{collection:e,slug:r}=t.params,i=(0,s.generateContentKey)(e,r),n=(0,s.branchFromContentKey)(i);await async function(e,t,a){const r=await e.raw(["config","commit.gpgsign"]);try{"true"===r&&await e.addConfig("commit.gpgsign","false"),await e.mergeFromTo(t,a)}finally{"true"===r&&await e.addConfig("commit.gpgsign",r)}}(a,n,u),await a.deleteLocalBranch(n),l.json({message:`branch ${n} merged to ${u}`});break}case"getMedia":{const{mediaFolder:r}=t.params,i=await g(a,u,async()=>{const t=await(0,p.listRepoFiles)(e,r,"",1);return await Promise.all(t.map(t=>(0,f.readMediaFile)(e,t)))});l.json(i);break}case"getMediaFile":{const{path:r}=t.params,i=await g(a,u,()=>(0,f.readMediaFile)(e,r));l.json(i);break}case"persistMedia":{const{asset:r,options:{commitMessage:n}}=t.params,s=await g(a,u,async()=>(await(0,p.writeFile)(i.default.join(e,r.path),Buffer.from(r.content,r.encoding)),await m(a,n),(0,f.readMediaFile)(e,r.path)));l.json(s);break}case"deleteFile":{const{path:r,options:{commitMessage:i}}=t.params;await g(a,u,async()=>{await(0,p.deleteFile)(e,r),await m(a,i)}),l.json({message:`deleted file ${r}`});break}case"deleteFiles":{const{paths:r,options:{commitMessage:i}}=t.params;await g(a,u,async()=>{await Promise.all(r.map(t=>(0,p.deleteFile)(e,t))),await m(a,i)}),l.json({message:`deleted files ${r.join(", ")}`});break}case"getDeployPreview":l.json(null);break;default:{const e=`Unknown action ${t.action}`;l.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(o.body)}: ${e instanceof Error?e.message:"Unknown error"}`),l.status(500).json({error:"Unknown error"})}finally{c&&c()}}}t.validateRepo=v,t.getSchema=M,t.localGitMiddleware=_,t.registerMiddleware=async function(e,t){const{logger:a}=t,r=i.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());await v({repoPath:r}),e.post("/api/v1",(0,u.joi)(M({repoPath:r}))),e.post("/api/v1",_({repoPath:r,logger:a})),a.info(`Decap CMS Git Proxy Server configured with ${r}`)}},982:e=>{e.exports=require("crypto")}},t={},a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var n=t[r]={exports:{}};return e[r].call(n.exports,n,n.exports,a),n.exports}(783);module.exports=a})();
2
+ (()=>{"use strict";var e={96:e=>{e.exports=require("morgan")},123:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.readMediaFile=t.entriesFromFiles=void 0;const i=r(a(982)),n=r(a(928)),s=a(896);function o(e){return i.default.createHash("sha256").update(e).digest("hex")}function l(e){return e.replace(/\\/g,"/")}t.entriesFromFiles=async function(e,t){return Promise.all(t.map(async t=>{try{const a=await s.promises.readFile(n.default.join(e,t.path));return{data:a.toString(),file:{path:l(t.path),label:t.label,id:o(a)}}}catch(e){return{data:null,file:{path:l(t.path),label:t.label,id:null}}}}))},t.readMediaFile=async function(e,t){const a="base64",r=await s.promises.readFile(n.default.join(e,t));return{id:o(r),content:r.toString(a),encoding:a,path:l(t),name:n.default.basename(t)}}},124:e=>{e.exports=require("winston")},161:(e,t)=>{function a(e){return e||"decap-cms/"}Object.defineProperty(t,"__esModule",{value:!0}),t.branchFromContentKey=t.contentKeyFromBranch=t.parseContentKey=t.generateContentKey=t.statusToLabel=t.labelToStatus=t.isCMSLabel=t.MERGE_COMMIT_MESSAGE=t.DEFAULT_PR_BODY=t.CMS_BRANCH_PREFIX=void 0,t.CMS_BRANCH_PREFIX="cms",t.DEFAULT_PR_BODY="Automatically generated by Decap CMS",t.MERGE_COMMIT_MESSAGE="Automatically generated. Merged on Decap CMS.",t.isCMSLabel=function(e,t){return e.startsWith(a(t))},t.labelToStatus=function(e,t){return e.slice(a(t).length)},t.statusToLabel=function(e,t){return`${a(t)}${e}`},t.generateContentKey=function(e,t){return`${e}/${t}`},t.parseContentKey=function(e){const t=e.indexOf("/");return{collection:e.slice(0,t),slug:e.slice(t+1)}},t.contentKeyFromBranch=function(e){return e.slice(`${t.CMS_BRANCH_PREFIX}/`.length)},t.branchFromContentKey=function(e){return`${t.CMS_BRANCH_PREFIX}/${e}`}},252:e=>{e.exports=require("express")},280:e=>{e.exports=require("what-the-diff")},354:e=>{e.exports=require("async-mutex")},476:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getUpdateDate=t.move=t.deleteFile=t.writeFile=t.listRepoFiles=void 0;const i=r(a(928)),n=a(896);async function s(e,t,a){if(a<=0)return[];try{const r=await n.promises.readdir(e,{withFileTypes:!0}),o=await Promise.all(r.map(r=>{const n=i.default.join(e,r.name);return r.isDirectory()?s(n,t,a-1):[n].filter(e=>e.endsWith(t))}));return[].concat(...o)}catch(e){return[]}}async function o(e,t){await n.promises.mkdir(i.default.dirname(t),{recursive:!0}),await n.promises.rename(e,t)}t.listRepoFiles=async function(e,t,a,r){return(await s(i.default.join(e,t),a,r)).map(t=>t.slice(e.length+1))},t.writeFile=async function(e,t){await n.promises.mkdir(i.default.dirname(e),{recursive:!0}),await n.promises.writeFile(e,t)},t.deleteFile=async function(e,t){await n.promises.unlink(i.default.join(e,t)).catch(()=>{})},t.move=async function(e,t){await o(e,t);const a=i.default.dirname(e),r=i.default.dirname(t),n=await s(a,"",100);await Promise.all(n.map(e=>o(e,e.replace(a,r))))},t.getUpdateDate=async function(e,t){return n.promises.stat(i.default.join(e,t)).then(e=>e.mtime).catch(()=>new Date)}},577:e=>{e.exports=require("cors")},669:e=>{e.exports=require("@hapi/joi")},778:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.pathTraversal=void 0;const i=r(a(669)),n=r(a(928));t.pathTraversal=function(e){return i.default.extend({type:"path",base:i.default.string().required(),messages:{"path.invalid":"{{#label}} must resolve to a path under the configured repository"},validate(t,a){if(!n.default.join(e,t).startsWith(e))return{value:t,errors:a.error("path.invalid")}}}).path()}},783:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),a(818).config();const i=r(a(252)),n=a(827),s=a(971),o=a(786),l=a(943),c=(0,i.default)(),u=parseInt(process.env.PORT||"8081",10),d=process.env.BIND_HOST,p=process.env.LOG_LEVEL||"info";(async()=>{const e=(0,l.createLogger)({level:p}),t={logger:e};(0,n.registerCommonMiddlewares)(c,t);try{const e=process.env.MODE||"fs";if("fs"===e)(0,o.registerMiddleware)(c,t);else{if("git"!==e)throw new Error(`Unknown proxy mode '${e}'`);(0,s.registerMiddleware)(c,t)}}catch(t){e.error(t instanceof Error?t.message:"Unknown error"),process.exit(1)}d?c.listen(u,d,()=>{e.info(`Decap CMS Proxy Server listening on ${d}:${u}`)}):c.listen(u,()=>{e.info(`Decap CMS Proxy Server listening on port ${u}`)})})()},786:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.getSchema=t.localFsMiddleware=void 0;const i=r(a(928)),n=a(964),s=a(778),o=a(476),l=a(123);function c({repoPath:e,logger:t}){return async function(a,r){try{const{body:t}=a;switch(t.action){case"info":r.json({repo:i.default.basename(e),publish_modes:["simple"],type:"local_fs"});break;case"entriesByFolder":{const a=t.params,{folder:i,extension:n,depth:s}=a,c=await(0,o.listRepoFiles)(e,i,n,s).then(t=>(0,l.entriesFromFiles)(e,t.map(e=>({path:e}))));r.json(c);break}case"entriesByFiles":{const a=t.params,i=await(0,l.entriesFromFiles)(e,a.files);r.json(i);break}case"getEntry":{const a=t.params,[i]=await(0,l.entriesFromFiles)(e,[{path:a.path}]);r.json(i);break}case"persistEntry":{const{entry:a,dataFiles:n=[a],assets:s}=t.params;await Promise.all(n.map(t=>(0,o.writeFile)(i.default.join(e,t.path),t.raw))),await Promise.all(s.map(t=>(0,o.writeFile)(i.default.join(e,t.path),Buffer.from(t.content,t.encoding)))),n.every(e=>e.newPath)&&n.forEach(async t=>{await(0,o.move)(i.default.join(e,t.path),i.default.join(e,t.newPath))}),r.json({message:"entry persisted"});break}case"getMedia":{const{mediaFolder:a}=t.params,i=await(0,o.listRepoFiles)(e,a,"",1),n=await Promise.all(i.map(t=>(0,l.readMediaFile)(e,t)));r.json(n);break}case"getMediaFile":{const{path:a}=t.params,i=await(0,l.readMediaFile)(e,a);r.json(i);break}case"persistMedia":{const{asset:a}=t.params;await(0,o.writeFile)(i.default.join(e,a.path),Buffer.from(a.content,a.encoding));const n=await(0,l.readMediaFile)(e,a.path);r.json(n);break}case"deleteFile":{const{path:a}=t.params;await(0,o.deleteFile)(e,a),r.json({message:`deleted file ${a}`});break}case"deleteFiles":{const{paths:a}=t.params;await Promise.all(a.map(t=>(0,o.deleteFile)(e,t))),r.json({message:`deleted files ${a.join(", ")}`});break}case"getDeployPreview":r.json(null);break;default:{const e=`Unknown action ${t.action}`;r.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(a.body)}: ${e instanceof Error?e.message:"Unknown error"}`),r.status(500).json({error:"Unknown error"})}}}function u({repoPath:e}){return(0,n.defaultSchema)({path:(0,s.pathTraversal)(e)})}t.localFsMiddleware=c,t.getSchema=u,t.registerMiddleware=async function(e,t){const{logger:a}=t,r=i.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());e.post("/api/v1",(0,n.joi)(u({repoPath:r}))),e.post("/api/v1",c({repoPath:r,logger:a})),a.info(`Decap CMS File System Proxy Server configured with ${r}`)}},807:e=>{e.exports=require("simple-git")},818:e=>{e.exports=require("dotenv")},827:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerCommonMiddlewares=void 0;const i=r(a(252)),n=r(a(96)),s=r(a(577));t.registerCommonMiddlewares=function(e,t){const{logger:a}=t,r={write:e=>{a.debug(String(e).trim())}};e.use((0,n.default)("combined",{stream:r})),e.use((0,s.default)({origin:process.env.ORIGIN||"*"})),e.use(i.default.json({limit:"50mb"}))}},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")},943:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=void 0;const i=r(a(124)),{combine:n,colorize:s,simple:o}=i.default.format;t.createLogger=function({level:e}){return i.default.createLogger({level:e,format:n(s(),o()),transports:[new i.default.transports.Console]})}},964:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.joi=t.defaultSchema=void 0;const i=r(a(669)),n=["info","entriesByFolder","entriesByFiles","getEntry","unpublishedEntries","unpublishedEntry","unpublishedEntryDataFile","unpublishedEntryMediaFile","deleteUnpublishedEntry","persistEntry","updateUnpublishedEntryStatus","publishUnpublishedEntry","getMedia","getMediaFile","persistMedia","deleteFile","deleteFiles","getDeployPreview"],s=i.default.string().required(),o=i.default.number().required(),l=i.default.bool().required(),c=s,u=s;t.defaultSchema=function({path:e=s}={}){const t=i.default.object({branch:s}),a=i.default.object({path:e,content:s,encoding:s.valid("base64")}),r=i.default.object({slug:s,path:e,raw:s,newPath:e.optional()}),d=i.default.when("action",{switch:[{is:"info",then:i.default.allow()},{is:"entriesByFolder",then:t.keys({folder:e,extension:s,depth:o}).required()},{is:"entriesByFiles",then:t.keys({files:i.default.array().items(i.default.object({path:e,label:i.default.string()})).required()})},{is:"getEntry",then:t.keys({path:e}).required()},{is:"unpublishedEntries",then:t.keys({branch:s}).required()},{is:"unpublishedEntry",then:t.keys({id:i.default.string().optional(),collection:i.default.string().optional(),slug:i.default.string().optional(),cmsLabelPrefix:i.default.string().optional()}).required()},{is:"unpublishedEntryDataFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"unpublishedEntryMediaFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"deleteUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"persistEntry",then:t.keys({cmsLabelPrefix:i.default.string().optional(),entry:r,dataFiles:i.default.array().items(r),assets:i.default.array().items(a).required(),options:i.default.object({collectionName:i.default.string(),commitMessage:s,useWorkflow:l,status:s}).required()}).xor("entry","dataFiles").required()},{is:"updateUnpublishedEntryStatus",then:t.keys({collection:c,slug:u,newStatus:s,cmsLabelPrefix:i.default.string().optional()}).required()},{is:"publishUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"getMedia",then:t.keys({mediaFolder:e}).required()},{is:"getMediaFile",then:t.keys({path:e}).required()},{is:"persistMedia",then:t.keys({asset:a.required(),options:i.default.object({commitMessage:s}).required()}).required()},{is:"deleteFile",then:t.keys({path:e,options:i.default.object({commitMessage:s}).required()}).required()},{is:"deleteFiles",then:t.keys({paths:i.default.array().items(e).min(1).required(),options:i.default.object({commitMessage:s}).required()}).required()},{is:"getDeployPreview",then:t.keys({collection:c,slug:u}).required()}],otherwise:i.default.forbidden()});return i.default.object({action:i.default.valid(...n).required(),params:d})},t.joi=function(e){return(t,a,r)=>{const{error:i}=e.validate(t.body,{allowUnknown:!0});if(i){const{details:e}=i,t=e.map(e=>e.message).join(",");a.status(422).json({error:t})}else r()}}},971:function(e,t,a){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.localGitMiddleware=t.getSchema=t.validateRepo=void 0;const i=r(a(928)),n=a(896),s=a(161),o=a(280),l=r(a(807)),c=a(354),u=a(964),d=a(778),p=a(476),f=a(123);async function m(e,t){await e.add("."),await e.commit(t,void 0,{"--no-verify":null,"--no-gpg-sign":null})}async function h(e){return await e.branchLocal().then(e=>e.current)}async function g(e,t,a){const r=await h(e);try{return r!==t&&await e.checkout(t),await a()}finally{await e.checkout(r)}}function y(e){return`branch.${e}.description`}async function w(e,t,a,r,n){await Promise.all(a.map(e=>(0,p.writeFile)(i.default.join(t,e.path),e.raw))),await Promise.all(r.map(e=>(0,p.writeFile)(i.default.join(t,e.path),Buffer.from(e.content,e.encoding)))),a.every(e=>e.newPath)&&a.forEach(async e=>{await(0,p.move)(i.default.join(t,e.path),i.default.join(t,e.newPath))}),await m(e,n)}async function b(e,t){return await e.branchLocal().then(({all:e})=>e.includes(t))}async function F(e,t,a){const r=await e.diff([t,a]);return(0,o.parse)(r).map(e=>{var t,a;const r=(null===(t=e.oldPath)||void 0===t?void 0:t.replace(/b\//,""))||"",i=(null===(a=e.newPath)||void 0===a?void 0:a.replace(/b\//,""))||"",n=i||r;return{oldPath:r,newPath:i,status:e.status,newFile:"added"===e.status,path:n,id:n,binary:e.binary||/.svg$/.test(n)}})}async function v({repoPath:e}){const t=(0,l.default)(e);if(!await t.checkIsRepo())throw Error(`${e} is not a valid git repository`)}function M({repoPath:e}){return(0,u.defaultSchema)({path:(0,d.pathTraversal)(e)})}function _({repoPath:e,logger:t}){const a=(0,l.default)(e),r=(0,c.withTimeout)(new c.Mutex,3e3,new Error("Request timed out"));return async function(o,l){let c;try{c=await r.acquire();const{body:t}=o;if("info"===t.action)return void l.json({repo:i.default.basename(e),publish_modes:["simple","editorial_workflow"],type:"local_git"});const{branch:u}=t.params;if(!await b(a,u)){const e=`Default branch '${u}' doesn't exist`;return void l.status(422).json({error:e})}switch(t.action){case"entriesByFolder":{const r=t.params,{folder:i,extension:n,depth:s}=r,o=await g(a,u,()=>(0,p.listRepoFiles)(e,i,n,s).then(t=>(0,f.entriesFromFiles)(e,t.map(e=>({path:e})))));l.json(o);break}case"entriesByFiles":{const r=t.params,i=await g(a,u,()=>(0,f.entriesFromFiles)(e,r.files));l.json(i);break}case"getEntry":{const r=t.params,[i]=await g(a,u,()=>(0,f.entriesFromFiles)(e,[{path:r.path}]));l.json(i);break}case"unpublishedEntries":{const e=await a.branchLocal().then(e=>e.all.filter(e=>e.startsWith(`${s.CMS_BRANCH_PREFIX}/`)));l.json(e.map(s.contentKeyFromBranch));break}case"unpublishedEntry":{let{id:r,collection:i,slug:n,cmsLabelPrefix:o}=t.params;r&&({collection:i,slug:n}=(0,s.parseContentKey)(r));const c=(0,s.generateContentKey)(i,n),d=(0,s.branchFromContentKey)(c);if(!await b(a,d))return l.status(404).json({message:"Not Found"});{const t=await F(a,u,d),r=await a.raw(["config",y(d)]),c=r&&(0,s.labelToStatus)(r.trim(),o||""),f=t.length>=0?await g(a,d,async()=>(await Promise.all(t.map(({newPath:t})=>(0,p.getUpdateDate)(e,t)))).reduce((e,t)=>e>t?e:t)):new Date,m={collection:i,slug:n,status:c,diffs:t,updatedAt:f};l.json(m)}break}case"unpublishedEntryDataFile":{const{path:r,collection:i,slug:n}=t.params,o=(0,s.generateContentKey)(i,n),c=(0,s.branchFromContentKey)(o),[u]=await g(a,c,()=>(0,f.entriesFromFiles)(e,[{path:r}]));l.json({data:u.data});break}case"unpublishedEntryMediaFile":{const{path:r,collection:i,slug:n}=t.params,o=(0,s.generateContentKey)(i,n),c=(0,s.branchFromContentKey)(o),u=await g(a,c,()=>(0,f.readMediaFile)(e,r));l.json(u);break}case"deleteUnpublishedEntry":{const{collection:e,slug:r}=t.params,i=(0,s.generateContentKey)(e,r),n=(0,s.branchFromContentKey)(i);await h(a)===n&&await a.checkoutLocalBranch(u),await a.branch(["-D",n]),l.json({message:`deleted branch: ${n}`});break}case"persistEntry":{const{cmsLabelPrefix:r,entry:o,dataFiles:c=[o],assets:d,options:p}=t.params;if(p.useWorkflow){const t=c[0].slug,o=p.collectionName,l=(0,s.generateContentKey)(o,t),f=(0,s.branchFromContentKey)(l);await g(a,u,async()=>{const t=await b(a,f);t?await a.checkout(f):await a.checkoutLocalBranch(f),await async function(e,t){const a=await e.raw(["config","commit.gpgsign"]);try{"true"===a&&await e.addConfig("commit.gpgsign","false"),await e.rebase([t,"--no-verify"])}finally{"true"===a&&await e.addConfig("commit.gpgsign",a)}}(a,u);const o=(await F(a,u,f)).filter(e=>e.binary&&!d.map(e=>e.path).includes(e.path));if(await Promise.all(o.map(t=>n.promises.unlink(i.default.join(e,t.path)))),await w(a,e,c,d,p.commitMessage),!t){const e=(0,s.statusToLabel)(p.status,r||"");await a.addConfig(y(f),e)}})}else await g(a,u,async()=>{await w(a,e,c,d,p.commitMessage)});l.json({message:"entry persisted"});break}case"updateUnpublishedEntryStatus":{const{collection:e,slug:r,newStatus:i,cmsLabelPrefix:n}=t.params,o=(0,s.generateContentKey)(e,r),c=(0,s.branchFromContentKey)(o),d=(0,s.statusToLabel)(i,n||"");await a.addConfig(y(c),d),l.json({message:`${u} description was updated to ${d}`});break}case"publishUnpublishedEntry":{const{collection:e,slug:r}=t.params,i=(0,s.generateContentKey)(e,r),n=(0,s.branchFromContentKey)(i);await async function(e,t,a){const r=await e.raw(["config","commit.gpgsign"]);try{"true"===r&&await e.addConfig("commit.gpgsign","false"),await e.mergeFromTo(t,a)}finally{"true"===r&&await e.addConfig("commit.gpgsign",r)}}(a,n,u),await a.deleteLocalBranch(n),l.json({message:`branch ${n} merged to ${u}`});break}case"getMedia":{const{mediaFolder:r}=t.params,i=await g(a,u,async()=>{const t=await(0,p.listRepoFiles)(e,r,"",1);return await Promise.all(t.map(t=>(0,f.readMediaFile)(e,t)))});l.json(i);break}case"getMediaFile":{const{path:r}=t.params,i=await g(a,u,()=>(0,f.readMediaFile)(e,r));l.json(i);break}case"persistMedia":{const{asset:r,options:{commitMessage:n}}=t.params,s=await g(a,u,async()=>(await(0,p.writeFile)(i.default.join(e,r.path),Buffer.from(r.content,r.encoding)),await m(a,n),(0,f.readMediaFile)(e,r.path)));l.json(s);break}case"deleteFile":{const{path:r,options:{commitMessage:i}}=t.params;await g(a,u,async()=>{await(0,p.deleteFile)(e,r),await m(a,i)}),l.json({message:`deleted file ${r}`});break}case"deleteFiles":{const{paths:r,options:{commitMessage:i}}=t.params;await g(a,u,async()=>{await Promise.all(r.map(t=>(0,p.deleteFile)(e,t))),await m(a,i)}),l.json({message:`deleted files ${r.join(", ")}`});break}case"getDeployPreview":l.json(null);break;default:{const e=`Unknown action ${t.action}`;l.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(o.body)}: ${e instanceof Error?e.message:"Unknown error"}`),l.status(500).json({error:"Unknown error"})}finally{c&&c()}}}t.validateRepo=v,t.getSchema=M,t.localGitMiddleware=_,t.registerMiddleware=async function(e,t){const{logger:a}=t,r=i.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());await v({repoPath:r}),e.post("/api/v1",(0,u.joi)(M({repoPath:r}))),e.post("/api/v1",_({repoPath:r,logger:a})),a.info(`Decap CMS Git Proxy Server configured with ${r}`)}},982:e=>{e.exports=require("crypto")}},t={},a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var n=t[r]={exports:{}};return e[r].call(n.exports,n,n.exports,a),n.exports}(783);module.exports=a})();
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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","sources":["webpack://decap-server/external commonjs \"morgan\"","webpack://decap-server/./src/middlewares/utils/entries.ts","webpack://decap-server/external commonjs \"winston\"","webpack://decap-server/../decap-cms-lib-util/src/APIUtils.ts","webpack://decap-server/external commonjs \"express\"","webpack://decap-server/external commonjs \"what-the-diff\"","webpack://decap-server/external commonjs \"async-mutex\"","webpack://decap-server/./src/middlewares/utils/fs.ts","webpack://decap-server/external commonjs \"cors\"","webpack://decap-server/external commonjs \"@hapi/joi\"","webpack://decap-server/./src/middlewares/joi/customValidators.ts","webpack://decap-server/./src/index.ts","webpack://decap-server/./src/middlewares/localFs/index.ts","webpack://decap-server/external commonjs \"simple-git\"","webpack://decap-server/external commonjs \"dotenv\"","webpack://decap-server/./src/middlewares/common/index.ts","webpack://decap-server/external node-commonjs \"fs\"","webpack://decap-server/external node-commonjs \"path\"","webpack://decap-server/./src/logger.ts","webpack://decap-server/./src/middlewares/joi/index.ts","webpack://decap-server/./src/middlewares/localGit/index.ts","webpack://decap-server/external node-commonjs \"crypto\"","webpack://decap-server/webpack/bootstrap","webpack://decap-server/webpack/startup"],"sourcesContent":["module.exports = require(\"morgan\");","import crypto from 'crypto';\nimport path from 'path';\nimport { promises as fs } from 'fs';\n\nfunction sha256(buffer: Buffer) {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n}\n\n// normalize windows os path format\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nexport async function entriesFromFiles(\n repoPath: string,\n files: { path: string; label?: string }[],\n) {\n return Promise.all(\n files.map(async file => {\n try {\n const content = await fs.readFile(path.join(repoPath, file.path));\n return {\n data: content.toString(),\n file: { path: normalizePath(file.path), label: file.label, id: sha256(content) },\n };\n } catch (e) {\n return {\n data: null,\n file: { path: normalizePath(file.path), label: file.label, id: null },\n };\n }\n }),\n );\n}\n\nexport async function readMediaFile(repoPath: string, file: string) {\n const encoding = 'base64';\n const buffer = await fs.readFile(path.join(repoPath, file));\n const id = sha256(buffer);\n\n return {\n id,\n content: buffer.toString(encoding),\n encoding,\n path: normalizePath(file),\n name: path.basename(file),\n };\n}\n","module.exports = require(\"winston\");","export const CMS_BRANCH_PREFIX = 'cms';\nexport const DEFAULT_PR_BODY = 'Automatically generated by Decap CMS';\nexport const MERGE_COMMIT_MESSAGE = 'Automatically generated. Merged on Decap CMS.';\n\nconst DEFAULT_DECAP_CMS_LABEL_PREFIX = 'decap-cms/';\n\nfunction getLabelPrefix(labelPrefix: string) {\n return labelPrefix || DEFAULT_DECAP_CMS_LABEL_PREFIX;\n}\n\nexport function isCMSLabel(label: string, labelPrefix: string) {\n return label.startsWith(getLabelPrefix(labelPrefix));\n}\n\nexport function labelToStatus(label: string, labelPrefix: string) {\n return label.slice(getLabelPrefix(labelPrefix).length);\n}\n\nexport function statusToLabel(status: string, labelPrefix: string) {\n return `${getLabelPrefix(labelPrefix)}${status}`;\n}\n\nexport function generateContentKey(collectionName: string, slug: string) {\n return `${collectionName}/${slug}`;\n}\n\nexport function parseContentKey(contentKey: string) {\n const index = contentKey.indexOf('/');\n return { collection: contentKey.slice(0, index), slug: contentKey.slice(index + 1) };\n}\n\nexport function contentKeyFromBranch(branch: string) {\n return branch.slice(`${CMS_BRANCH_PREFIX}/`.length);\n}\n\nexport function branchFromContentKey(contentKey: string) {\n return `${CMS_BRANCH_PREFIX}/${contentKey}`;\n}\n","module.exports = require(\"express\");","module.exports = require(\"what-the-diff\");","module.exports = require(\"async-mutex\");","import path from 'path';\nimport { promises as fs } from 'fs';\n\nasync function listFiles(dir: string, extension: string, depth: number): Promise<string[]> {\n if (depth <= 0) {\n return [];\n }\n\n try {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n dirents.map(dirent => {\n const res = path.join(dir, dirent.name);\n return dirent.isDirectory()\n ? listFiles(res, extension, depth - 1)\n : [res].filter(f => f.endsWith(extension));\n }),\n );\n return ([] as string[]).concat(...files);\n } catch (e) {\n return [];\n }\n}\n\nexport async function listRepoFiles(\n repoPath: string,\n folder: string,\n extension: string,\n depth: number,\n) {\n const files = await listFiles(path.join(repoPath, folder), extension, depth);\n return files.map(f => f.slice(repoPath.length + 1));\n}\n\nexport async function writeFile(filePath: string, content: Buffer | string) {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\nexport async function deleteFile(repoPath: string, filePath: string) {\n await fs.unlink(path.join(repoPath, filePath)).catch(() => undefined);\n}\n\nasync function moveFile(from: string, to: string) {\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.rename(from, to);\n}\n\nexport async function move(from: string, to: string) {\n // move file\n await moveFile(from, to);\n\n // move children\n const sourceDir = path.dirname(from);\n const destDir = path.dirname(to);\n const allFiles = await listFiles(sourceDir, '', 100);\n await Promise.all(allFiles.map(file => moveFile(file, file.replace(sourceDir, destDir))));\n}\n\nexport async function getUpdateDate(repoPath: string, filePath: string) {\n return fs\n .stat(path.join(repoPath, filePath))\n .then(stat => stat.mtime)\n .catch(() => new Date());\n}\n","module.exports = require(\"cors\");","module.exports = require(\"@hapi/joi\");","import Joi from '@hapi/joi';\nimport path from 'path';\n\nexport function pathTraversal(repoPath: string) {\n return Joi.extend({\n type: 'path',\n base: Joi.string().required(),\n messages: {\n 'path.invalid': '{{#label}} must resolve to a path under the configured repository',\n },\n validate(value, helpers) {\n const resolvedPath = path.join(repoPath, value);\n if (!resolvedPath.startsWith(repoPath)) {\n return { value, errors: helpers.error('path.invalid') };\n }\n },\n }).path();\n}\n","// eslint-disable-next-line @typescript-eslint/no-var-requires\nrequire('dotenv').config();\nimport express from 'express';\n\nimport { registerCommonMiddlewares } from './middlewares/common';\nimport { registerMiddleware as registerLocalGit } from './middlewares/localGit';\nimport { registerMiddleware as registerLocalFs } from './middlewares/localFs';\nimport { createLogger } from './logger';\n\nconst app = express();\nconst port = process.env.PORT || 8081;\nconst level = process.env.LOG_LEVEL || 'info';\n\n(async () => {\n const logger = createLogger({ level });\n const options = {\n logger,\n };\n\n registerCommonMiddlewares(app, options);\n\n try {\n const mode = process.env.MODE || 'fs';\n if (mode === 'fs') {\n registerLocalFs(app, options);\n } else if (mode === 'git') {\n registerLocalGit(app, options);\n } else {\n throw new Error(`Unknown proxy mode '${mode}'`);\n }\n } catch (e) {\n logger.error(e instanceof Error ? e.message : 'Unknown error');\n process.exit(1);\n }\n\n return app.listen(port, () => {\n logger.info(`Decap CMS Proxy Server listening on port ${port}`);\n });\n})();\n","import path from 'path';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, deleteFile, writeFile, move } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n PersistEntryParams,\n GetMediaParams,\n GetMediaFileParams,\n PersistMediaParams,\n DeleteFileParams,\n DeleteFilesParams,\n DataFile,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\n\ntype FsOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nexport function localFsMiddleware({ repoPath, logger }: FsOptions) {\n return async function (req: express.Request, res: express.Response) {\n try {\n const { body } = req;\n\n switch (body.action) {\n case 'info': {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple'],\n type: 'local_fs',\n });\n break;\n }\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await entriesFromFiles(repoPath, payload.files);\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await entriesFromFiles(repoPath, [{ path: payload.path }]);\n res.json(entry);\n break;\n }\n case 'persistEntry': {\n const {\n entry,\n dataFiles = [entry as DataFile],\n assets,\n } = body.params as PersistEntryParams;\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a =>\n writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding)),\n ),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(\n path.join(repoPath, dataFile.path),\n path.join(repoPath, dataFile.newPath!),\n );\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const mediaFiles = await Promise.all(files.map(file => readMediaFile(repoPath, file)));\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await readMediaFile(repoPath, path);\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const { asset } = body.params as PersistMediaParams;\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n const file = await readMediaFile(repoPath, asset.path);\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const { path: filePath } = body.params as DeleteFileParams;\n await deleteFile(repoPath, filePath);\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const { paths } = body.params as DeleteFilesParams;\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n }\n };\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localFsMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS File System Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"simple-git\");","module.exports = require(\"dotenv\");","import express from 'express';\nimport morgan from 'morgan';\nimport cors from 'cors';\n\nimport type winston from 'winston';\n\nexport type Options = {\n logger: winston.Logger;\n};\n\nexport function registerCommonMiddlewares(app: express.Express, options: Options) {\n const { logger } = options;\n const stream = {\n write: (message: string) => {\n logger.debug(String(message).trim());\n },\n };\n app.use(morgan('combined', { stream }));\n app.use(cors());\n app.use(express.json({ limit: '50mb' }));\n}\n","module.exports = require(\"fs\");","module.exports = require(\"path\");","import winston from 'winston';\n\nconst { combine, colorize, simple } = winston.format;\n\ntype LogOptions = {\n level: string;\n};\n\nexport function createLogger({ level }: LogOptions) {\n return winston.createLogger({\n level,\n format: combine(colorize(), simple()),\n transports: [new winston.transports.Console()],\n });\n}\n","import Joi from '@hapi/joi';\n\nimport type express from 'express';\n\nconst allowedActions = [\n 'info',\n 'entriesByFolder',\n 'entriesByFiles',\n 'getEntry',\n 'unpublishedEntries',\n 'unpublishedEntry',\n 'unpublishedEntryDataFile',\n 'unpublishedEntryMediaFile',\n 'deleteUnpublishedEntry',\n 'persistEntry',\n 'updateUnpublishedEntryStatus',\n 'publishUnpublishedEntry',\n 'getMedia',\n 'getMediaFile',\n 'persistMedia',\n 'deleteFile',\n 'deleteFiles',\n 'getDeployPreview',\n];\n\nconst requiredString = Joi.string().required();\nconst requiredNumber = Joi.number().required();\nconst requiredBool = Joi.bool().required();\n\nconst collection = requiredString;\nconst slug = requiredString;\n\nexport function defaultSchema({ path = requiredString } = {}) {\n const defaultParams = Joi.object({\n branch: requiredString,\n });\n\n const asset = Joi.object({\n path,\n content: requiredString,\n encoding: requiredString.valid('base64'),\n });\n\n const dataFile = Joi.object({\n slug: requiredString,\n path,\n raw: requiredString,\n newPath: path.optional(),\n });\n\n const params = Joi.when('action', {\n switch: [\n {\n is: 'info',\n then: Joi.allow(),\n },\n {\n is: 'entriesByFolder',\n then: defaultParams\n .keys({\n folder: path,\n extension: requiredString,\n depth: requiredNumber,\n })\n .required(),\n },\n {\n is: 'entriesByFiles',\n then: defaultParams.keys({\n files: Joi.array()\n .items(Joi.object({ path, label: Joi.string() }))\n .required(),\n }),\n },\n {\n is: 'getEntry',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'unpublishedEntries',\n then: defaultParams.keys({ branch: requiredString }).required(),\n },\n {\n is: 'unpublishedEntry',\n then: defaultParams\n .keys({\n id: Joi.string().optional(),\n collection: Joi.string().optional(),\n slug: Joi.string().optional(),\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'unpublishedEntryDataFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'unpublishedEntryMediaFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'deleteUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'persistEntry',\n then: defaultParams\n .keys({\n cmsLabelPrefix: Joi.string().optional(),\n entry: dataFile, // entry is kept for backwards compatibility\n dataFiles: Joi.array().items(dataFile),\n assets: Joi.array().items(asset).required(),\n options: Joi.object({\n collectionName: Joi.string(),\n commitMessage: requiredString,\n useWorkflow: requiredBool,\n status: requiredString,\n }).required(),\n })\n .xor('entry', 'dataFiles')\n .required(),\n },\n {\n is: 'updateUnpublishedEntryStatus',\n then: defaultParams\n .keys({\n collection,\n slug,\n newStatus: requiredString,\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'publishUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'getMedia',\n then: defaultParams\n .keys({\n mediaFolder: path,\n })\n .required(),\n },\n {\n is: 'getMediaFile',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'persistMedia',\n then: defaultParams\n .keys({\n asset: asset.required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFile',\n then: defaultParams\n .keys({\n path,\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFiles',\n then: defaultParams\n .keys({\n paths: Joi.array().items(path).min(1).required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'getDeployPreview',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n ],\n otherwise: Joi.forbidden(),\n });\n\n return Joi.object({\n action: Joi.valid(...allowedActions).required(),\n params,\n });\n}\n\nexport function joi(schema: Joi.Schema) {\n return (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const { error } = schema.validate(req.body, { allowUnknown: true });\n if (error) {\n const { details } = error;\n const message = details.map(i => i.message).join(',');\n res.status(422).json({ error: message });\n } else {\n next();\n }\n };\n}\n","import path from 'path';\nimport { promises as fs } from 'fs';\nimport {\n branchFromContentKey,\n generateContentKey,\n contentKeyFromBranch,\n CMS_BRANCH_PREFIX,\n statusToLabel,\n labelToStatus,\n parseContentKey,\n} from 'decap-cms-lib-util/src/APIUtils';\nimport { parse } from 'what-the-diff';\n// eslint-disable-next-line import/no-named-as-default\nimport simpleGit from 'simple-git';\nimport { Mutex, withTimeout } from 'async-mutex';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, writeFile, move, deleteFile, getUpdateDate } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n DefaultParams,\n UnpublishedEntryParams,\n PersistEntryParams,\n GetMediaParams,\n Asset,\n PublishUnpublishedEntryParams,\n PersistMediaParams,\n DeleteFileParams,\n UpdateUnpublishedEntryStatusParams,\n DataFile,\n GetMediaFileParams,\n DeleteEntryParams,\n DeleteFilesParams,\n UnpublishedEntryDataFileParams,\n UnpublishedEntryMediaFileParams,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\nimport type { SimpleGit } from 'simple-git';\n\nasync function commit(git: SimpleGit, commitMessage: string) {\n await git.add('.');\n await git.commit(commitMessage, undefined, {\n // setting the value to a string passes name=value\n // any other value passes just the key\n '--no-verify': null,\n '--no-gpg-sign': null,\n });\n}\n\nasync function getCurrentBranch(git: SimpleGit) {\n const currentBranch = await git.branchLocal().then(summary => summary.current);\n return currentBranch;\n}\n\nasync function runOnBranch<T>(git: SimpleGit, branch: string, func: () => Promise<T>) {\n const currentBranch = await getCurrentBranch(git);\n try {\n if (currentBranch !== branch) {\n await git.checkout(branch);\n }\n const result = await func();\n return result;\n } finally {\n await git.checkout(currentBranch);\n }\n}\n\nfunction branchDescription(branch: string) {\n return `branch.${branch}.description`;\n}\n\ntype GitOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nasync function commitEntry(\n git: SimpleGit,\n repoPath: string,\n dataFiles: DataFile[],\n assets: Asset[],\n commitMessage: string,\n) {\n // save entry content\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a => writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding))),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(path.join(repoPath, dataFile.path), path.join(repoPath, dataFile.newPath!));\n });\n }\n\n // commits files\n await commit(git, commitMessage);\n}\n\nasync function rebase(git: SimpleGit, branch: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.rebase([branch, '--no-verify']);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function merge(git: SimpleGit, from: string, to: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.mergeFromTo(from, to);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function isBranchExists(git: SimpleGit, branch: string) {\n const branchExists = await git.branchLocal().then(({ all }) => all.includes(branch));\n return branchExists;\n}\n\nasync function getDiffs(git: SimpleGit, source: string, dest: string) {\n const rawDiff = await git.diff([source, dest]);\n const diffs = parse(rawDiff).map(d => {\n const oldPath = d.oldPath?.replace(/b\\//, '') || '';\n const newPath = d.newPath?.replace(/b\\//, '') || '';\n const path = newPath || (oldPath as string);\n return {\n oldPath,\n newPath,\n status: d.status,\n newFile: d.status === 'added',\n path,\n id: path,\n binary: d.binary || /.svg$/.test(path),\n };\n });\n return diffs;\n}\n\nexport async function validateRepo({ repoPath }: { repoPath: string }) {\n const git = simpleGit(repoPath);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n throw Error(`${repoPath} is not a valid git repository`);\n }\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\nexport function localGitMiddleware({ repoPath, logger }: GitOptions) {\n const git = simpleGit(repoPath);\n\n // we can only perform a single git operation at any given time\n const mutex = withTimeout(new Mutex(), 3000, new Error('Request timed out'));\n\n return async function (req: express.Request, res: express.Response) {\n let release;\n try {\n release = await mutex.acquire();\n const { body } = req;\n if (body.action === 'info') {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple', 'editorial_workflow'],\n type: 'local_git',\n });\n return;\n }\n const { branch } = body.params as DefaultParams;\n\n const branchExists = await isBranchExists(git, branch);\n if (!branchExists) {\n const message = `Default branch '${branch}' doesn't exist`;\n res.status(422).json({ error: message });\n return;\n }\n\n switch (body.action) {\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await runOnBranch(git, branch, () =>\n listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, payload.files),\n );\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, [{ path: payload.path }]),\n );\n res.json(entry);\n break;\n }\n case 'unpublishedEntries': {\n const cmsBranches = await git\n .branchLocal()\n .then(result => result.all.filter(b => b.startsWith(`${CMS_BRANCH_PREFIX}/`)));\n res.json(cmsBranches.map(contentKeyFromBranch));\n break;\n }\n case 'unpublishedEntry': {\n let { id, collection, slug, cmsLabelPrefix } = body.params as UnpublishedEntryParams;\n if (id) {\n ({ collection, slug } = parseContentKey(id));\n }\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n const diffs = await getDiffs(git, branch, cmsBranch);\n const label = await git.raw(['config', branchDescription(cmsBranch)]);\n const status = label && labelToStatus(label.trim(), cmsLabelPrefix || '');\n const updatedAt =\n diffs.length >= 0\n ? await runOnBranch(git, cmsBranch, async () => {\n const dates = await Promise.all(\n diffs.map(({ newPath }) => getUpdateDate(repoPath, newPath)),\n );\n return dates.reduce((a, b) => {\n return a > b ? a : b;\n });\n })\n : new Date();\n const unpublishedEntry = {\n collection,\n slug,\n status,\n diffs,\n updatedAt,\n };\n res.json(unpublishedEntry);\n } else {\n return res.status(404).json({ message: 'Not Found' });\n }\n break;\n }\n case 'unpublishedEntryDataFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryDataFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const [entry] = await runOnBranch(git, cmsBranch, () =>\n entriesFromFiles(repoPath, [{ path }]),\n );\n res.json({ data: entry.data });\n break;\n }\n case 'unpublishedEntryMediaFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryMediaFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const file = await runOnBranch(git, cmsBranch, () => readMediaFile(repoPath, path));\n res.json(file);\n break;\n }\n case 'deleteUnpublishedEntry': {\n const { collection, slug } = body.params as DeleteEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const currentBranch = await getCurrentBranch(git);\n if (currentBranch === cmsBranch) {\n await git.checkoutLocalBranch(branch);\n }\n await git.branch(['-D', cmsBranch]);\n res.json({ message: `deleted branch: ${cmsBranch}` });\n break;\n }\n case 'persistEntry': {\n const {\n cmsLabelPrefix,\n entry,\n dataFiles = [entry as DataFile],\n assets,\n options,\n } = body.params as PersistEntryParams;\n\n if (!options.useWorkflow) {\n await runOnBranch(git, branch, async () => {\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n });\n } else {\n const slug = dataFiles[0].slug;\n const collection = options.collectionName as string;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await runOnBranch(git, branch, async () => {\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n await git.checkout(cmsBranch);\n } else {\n await git.checkoutLocalBranch(cmsBranch);\n }\n await rebase(git, branch);\n const diffs = await getDiffs(git, branch, cmsBranch);\n // delete media files that have been removed from the entry\n const toDelete = diffs.filter(\n d => d.binary && !assets.map(a => a.path).includes(d.path),\n );\n await Promise.all(toDelete.map(f => fs.unlink(path.join(repoPath, f.path))));\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n\n // add status for new entries\n if (!branchExists) {\n const description = statusToLabel(options.status, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n }\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'updateUnpublishedEntryStatus': {\n const { collection, slug, newStatus, cmsLabelPrefix } =\n body.params as UpdateUnpublishedEntryStatusParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const description = statusToLabel(newStatus, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n res.json({ message: `${branch} description was updated to ${description}` });\n break;\n }\n case 'publishUnpublishedEntry': {\n const { collection, slug } = body.params as PublishUnpublishedEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await merge(git, cmsBranch, branch);\n await git.deleteLocalBranch(cmsBranch);\n res.json({ message: `branch ${cmsBranch} merged to ${branch}` });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const mediaFiles = await runOnBranch(git, branch, async () => {\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const serializedFiles = await Promise.all(\n files.map(file => readMediaFile(repoPath, file)),\n );\n return serializedFiles;\n });\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await runOnBranch(git, branch, () => {\n return readMediaFile(repoPath, path);\n });\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const {\n asset,\n options: { commitMessage },\n } = body.params as PersistMediaParams;\n\n const file = await runOnBranch(git, branch, async () => {\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n await commit(git, commitMessage);\n return readMediaFile(repoPath, asset.path);\n });\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const {\n path: filePath,\n options: { commitMessage },\n } = body.params as DeleteFileParams;\n await runOnBranch(git, branch, async () => {\n await deleteFile(repoPath, filePath);\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const {\n paths,\n options: { commitMessage },\n } = body.params as DeleteFilesParams;\n await runOnBranch(git, branch, async () => {\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n } finally {\n release && release();\n }\n };\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n await validateRepo({ repoPath });\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localGitMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS Git Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"crypto\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(783);\n"],"names":["module","exports","require","sha256","buffer","createHash","update","digest","normalizePath","path","replace","async","repoPath","files","Promise","all","map","file","content","readFile","join","data","toString","label","id","e","encoding","name","basename","getLabelPrefix","labelPrefix","CMS_BRANCH_PREFIX","DEFAULT_PR_BODY","MERGE_COMMIT_MESSAGE","startsWith","slice","length","status","collectionName","slug","contentKey","index","indexOf","collection","branch","listFiles","dir","extension","depth","dirents","readdir","withFileTypes","dirent","res","isDirectory","filter","f","endsWith","concat","moveFile","from","to","mkdir","dirname","recursive","rename","folder","filePath","writeFile","unlink","catch","sourceDir","destDir","allFiles","stat","then","mtime","Date","extend","type","base","string","required","messages","validate","value","helpers","errors","error","app","port","process","env","PORT","level","LOG_LEVEL","logger","createLogger","options","registerCommonMiddlewares","mode","MODE","Error","message","exit","listen","info","localFsMiddleware","req","body","action","json","repo","publish_modes","payload","params","entries","listRepoFiles","entriesFromFiles","entry","dataFiles","assets","dataFile","raw","a","Buffer","every","newPath","forEach","move","mediaFolder","mediaFiles","readMediaFile","mediaFile","asset","deleteFile","paths","JSON","stringify","getSchema","defaultSchema","pathTraversal","resolve","GIT_REPO_DIRECTORY","cwd","post","joi","stream","write","debug","String","trim","use","limit","combine","colorize","simple","format","transports","Console","allowedActions","requiredString","requiredNumber","number","requiredBool","bool","defaultParams","object","valid","optional","when","switch","is","allow","keys","array","items","cmsLabelPrefix","commitMessage","useWorkflow","xor","newStatus","min","otherwise","forbidden","schema","next","allowUnknown","details","i","commit","git","add","undefined","getCurrentBranch","branchLocal","summary","current","runOnBranch","func","currentBranch","checkout","branchDescription","commitEntry","isBranchExists","includes","getDiffs","source","dest","rawDiff","diff","parse","d","oldPath","newFile","binary","test","validateRepo","checkIsRepo","localGitMiddleware","mutex","withTimeout","Mutex","release","acquire","cmsBranches","result","b","contentKeyFromBranch","parseContentKey","generateContentKey","cmsBranch","branchFromContentKey","diffs","labelToStatus","updatedAt","getUpdateDate","reduce","unpublishedEntry","checkoutLocalBranch","branchExists","gpgSign","addConfig","rebase","toDelete","description","statusToLabel","mergeFromTo","merge","deleteLocalBranch","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://decap-server/external commonjs \"morgan\"","webpack://decap-server/./src/middlewares/utils/entries.ts","webpack://decap-server/external commonjs \"winston\"","webpack://decap-server/../decap-cms-lib-util/src/APIUtils.ts","webpack://decap-server/external commonjs \"express\"","webpack://decap-server/external commonjs \"what-the-diff\"","webpack://decap-server/external commonjs \"async-mutex\"","webpack://decap-server/./src/middlewares/utils/fs.ts","webpack://decap-server/external commonjs \"cors\"","webpack://decap-server/external commonjs \"@hapi/joi\"","webpack://decap-server/./src/middlewares/joi/customValidators.ts","webpack://decap-server/./src/index.ts","webpack://decap-server/./src/middlewares/localFs/index.ts","webpack://decap-server/external commonjs \"simple-git\"","webpack://decap-server/external commonjs \"dotenv\"","webpack://decap-server/./src/middlewares/common/index.ts","webpack://decap-server/external node-commonjs \"fs\"","webpack://decap-server/external node-commonjs \"path\"","webpack://decap-server/./src/logger.ts","webpack://decap-server/./src/middlewares/joi/index.ts","webpack://decap-server/./src/middlewares/localGit/index.ts","webpack://decap-server/external node-commonjs \"crypto\"","webpack://decap-server/webpack/bootstrap","webpack://decap-server/webpack/startup"],"sourcesContent":["module.exports = require(\"morgan\");","import crypto from 'crypto';\nimport path from 'path';\nimport { promises as fs } from 'fs';\n\nfunction sha256(buffer: Buffer) {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n}\n\n// normalize windows os path format\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nexport async function entriesFromFiles(\n repoPath: string,\n files: { path: string; label?: string }[],\n) {\n return Promise.all(\n files.map(async file => {\n try {\n const content = await fs.readFile(path.join(repoPath, file.path));\n return {\n data: content.toString(),\n file: { path: normalizePath(file.path), label: file.label, id: sha256(content) },\n };\n } catch (e) {\n return {\n data: null,\n file: { path: normalizePath(file.path), label: file.label, id: null },\n };\n }\n }),\n );\n}\n\nexport async function readMediaFile(repoPath: string, file: string) {\n const encoding = 'base64';\n const buffer = await fs.readFile(path.join(repoPath, file));\n const id = sha256(buffer);\n\n return {\n id,\n content: buffer.toString(encoding),\n encoding,\n path: normalizePath(file),\n name: path.basename(file),\n };\n}\n","module.exports = require(\"winston\");","export const CMS_BRANCH_PREFIX = 'cms';\nexport const DEFAULT_PR_BODY = 'Automatically generated by Decap CMS';\nexport const MERGE_COMMIT_MESSAGE = 'Automatically generated. Merged on Decap CMS.';\n\nconst DEFAULT_DECAP_CMS_LABEL_PREFIX = 'decap-cms/';\n\nfunction getLabelPrefix(labelPrefix: string) {\n return labelPrefix || DEFAULT_DECAP_CMS_LABEL_PREFIX;\n}\n\nexport function isCMSLabel(label: string, labelPrefix: string) {\n return label.startsWith(getLabelPrefix(labelPrefix));\n}\n\nexport function labelToStatus(label: string, labelPrefix: string) {\n return label.slice(getLabelPrefix(labelPrefix).length);\n}\n\nexport function statusToLabel(status: string, labelPrefix: string) {\n return `${getLabelPrefix(labelPrefix)}${status}`;\n}\n\nexport function generateContentKey(collectionName: string, slug: string) {\n return `${collectionName}/${slug}`;\n}\n\nexport function parseContentKey(contentKey: string) {\n const index = contentKey.indexOf('/');\n return { collection: contentKey.slice(0, index), slug: contentKey.slice(index + 1) };\n}\n\nexport function contentKeyFromBranch(branch: string) {\n return branch.slice(`${CMS_BRANCH_PREFIX}/`.length);\n}\n\nexport function branchFromContentKey(contentKey: string) {\n return `${CMS_BRANCH_PREFIX}/${contentKey}`;\n}\n","module.exports = require(\"express\");","module.exports = require(\"what-the-diff\");","module.exports = require(\"async-mutex\");","import path from 'path';\nimport { promises as fs } from 'fs';\n\nasync function listFiles(dir: string, extension: string, depth: number): Promise<string[]> {\n if (depth <= 0) {\n return [];\n }\n\n try {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n dirents.map(dirent => {\n const res = path.join(dir, dirent.name);\n return dirent.isDirectory()\n ? listFiles(res, extension, depth - 1)\n : [res].filter(f => f.endsWith(extension));\n }),\n );\n return ([] as string[]).concat(...files);\n } catch (e) {\n return [];\n }\n}\n\nexport async function listRepoFiles(\n repoPath: string,\n folder: string,\n extension: string,\n depth: number,\n) {\n const files = await listFiles(path.join(repoPath, folder), extension, depth);\n return files.map(f => f.slice(repoPath.length + 1));\n}\n\nexport async function writeFile(filePath: string, content: Buffer | string) {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\nexport async function deleteFile(repoPath: string, filePath: string) {\n await fs.unlink(path.join(repoPath, filePath)).catch(() => undefined);\n}\n\nasync function moveFile(from: string, to: string) {\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.rename(from, to);\n}\n\nexport async function move(from: string, to: string) {\n // move file\n await moveFile(from, to);\n\n // move children\n const sourceDir = path.dirname(from);\n const destDir = path.dirname(to);\n const allFiles = await listFiles(sourceDir, '', 100);\n await Promise.all(allFiles.map(file => moveFile(file, file.replace(sourceDir, destDir))));\n}\n\nexport async function getUpdateDate(repoPath: string, filePath: string) {\n return fs\n .stat(path.join(repoPath, filePath))\n .then(stat => stat.mtime)\n .catch(() => new Date());\n}\n","module.exports = require(\"cors\");","module.exports = require(\"@hapi/joi\");","import Joi from '@hapi/joi';\nimport path from 'path';\n\nexport function pathTraversal(repoPath: string) {\n return Joi.extend({\n type: 'path',\n base: Joi.string().required(),\n messages: {\n 'path.invalid': '{{#label}} must resolve to a path under the configured repository',\n },\n validate(value, helpers) {\n const resolvedPath = path.join(repoPath, value);\n if (!resolvedPath.startsWith(repoPath)) {\n return { value, errors: helpers.error('path.invalid') };\n }\n },\n }).path();\n}\n","// eslint-disable-next-line @typescript-eslint/no-var-requires\nrequire('dotenv').config();\nimport express from 'express';\n\nimport { registerCommonMiddlewares } from './middlewares/common';\nimport { registerMiddleware as registerLocalGit } from './middlewares/localGit';\nimport { registerMiddleware as registerLocalFs } from './middlewares/localFs';\nimport { createLogger } from './logger';\n\nconst app = express();\nconst port = parseInt(process.env.PORT || '8081', 10);\nconst host = process.env.BIND_HOST;\nconst level = process.env.LOG_LEVEL || 'info';\n\n(async () => {\n const logger = createLogger({ level });\n const options = {\n logger,\n };\n\n registerCommonMiddlewares(app, options);\n\n try {\n const mode = process.env.MODE || 'fs';\n if (mode === 'fs') {\n registerLocalFs(app, options);\n } else if (mode === 'git') {\n registerLocalGit(app, options);\n } else {\n throw new Error(`Unknown proxy mode '${mode}'`);\n }\n } catch (e) {\n logger.error(e instanceof Error ? e.message : 'Unknown error');\n process.exit(1);\n }\n\n if (host) {\n return app.listen(port, host, () => {\n logger.info(`Decap CMS Proxy Server listening on ${host}:${port}`);\n });\n } else {\n return app.listen(port, () => {\n logger.info(`Decap CMS Proxy Server listening on port ${port}`);\n });\n }\n})();\n","import path from 'path';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, deleteFile, writeFile, move } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n PersistEntryParams,\n GetMediaParams,\n GetMediaFileParams,\n PersistMediaParams,\n DeleteFileParams,\n DeleteFilesParams,\n DataFile,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\n\ntype FsOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nexport function localFsMiddleware({ repoPath, logger }: FsOptions) {\n return async function (req: express.Request, res: express.Response) {\n try {\n const { body } = req;\n\n switch (body.action) {\n case 'info': {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple'],\n type: 'local_fs',\n });\n break;\n }\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await entriesFromFiles(repoPath, payload.files);\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await entriesFromFiles(repoPath, [{ path: payload.path }]);\n res.json(entry);\n break;\n }\n case 'persistEntry': {\n const {\n entry,\n dataFiles = [entry as DataFile],\n assets,\n } = body.params as PersistEntryParams;\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a =>\n writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding)),\n ),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(\n path.join(repoPath, dataFile.path),\n path.join(repoPath, dataFile.newPath!),\n );\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const mediaFiles = await Promise.all(files.map(file => readMediaFile(repoPath, file)));\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await readMediaFile(repoPath, path);\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const { asset } = body.params as PersistMediaParams;\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n const file = await readMediaFile(repoPath, asset.path);\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const { path: filePath } = body.params as DeleteFileParams;\n await deleteFile(repoPath, filePath);\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const { paths } = body.params as DeleteFilesParams;\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n }\n };\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localFsMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS File System Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"simple-git\");","module.exports = require(\"dotenv\");","import express from 'express';\nimport morgan from 'morgan';\nimport cors from 'cors';\n\nimport type winston from 'winston';\n\nexport type Options = {\n logger: winston.Logger;\n};\n\nexport function registerCommonMiddlewares(app: express.Express, options: Options) {\n const { logger } = options;\n const stream = {\n write: (message: string) => {\n logger.debug(String(message).trim());\n },\n };\n app.use(morgan('combined', { stream }));\n app.use(\n cors({\n origin: process.env.ORIGIN || '*',\n }),\n );\n app.use(express.json({ limit: '50mb' }));\n}\n","module.exports = require(\"fs\");","module.exports = require(\"path\");","import winston from 'winston';\n\nconst { combine, colorize, simple } = winston.format;\n\ntype LogOptions = {\n level: string;\n};\n\nexport function createLogger({ level }: LogOptions) {\n return winston.createLogger({\n level,\n format: combine(colorize(), simple()),\n transports: [new winston.transports.Console()],\n });\n}\n","import Joi from '@hapi/joi';\n\nimport type express from 'express';\n\nconst allowedActions = [\n 'info',\n 'entriesByFolder',\n 'entriesByFiles',\n 'getEntry',\n 'unpublishedEntries',\n 'unpublishedEntry',\n 'unpublishedEntryDataFile',\n 'unpublishedEntryMediaFile',\n 'deleteUnpublishedEntry',\n 'persistEntry',\n 'updateUnpublishedEntryStatus',\n 'publishUnpublishedEntry',\n 'getMedia',\n 'getMediaFile',\n 'persistMedia',\n 'deleteFile',\n 'deleteFiles',\n 'getDeployPreview',\n];\n\nconst requiredString = Joi.string().required();\nconst requiredNumber = Joi.number().required();\nconst requiredBool = Joi.bool().required();\n\nconst collection = requiredString;\nconst slug = requiredString;\n\nexport function defaultSchema({ path = requiredString } = {}) {\n const defaultParams = Joi.object({\n branch: requiredString,\n });\n\n const asset = Joi.object({\n path,\n content: requiredString,\n encoding: requiredString.valid('base64'),\n });\n\n const dataFile = Joi.object({\n slug: requiredString,\n path,\n raw: requiredString,\n newPath: path.optional(),\n });\n\n const params = Joi.when('action', {\n switch: [\n {\n is: 'info',\n then: Joi.allow(),\n },\n {\n is: 'entriesByFolder',\n then: defaultParams\n .keys({\n folder: path,\n extension: requiredString,\n depth: requiredNumber,\n })\n .required(),\n },\n {\n is: 'entriesByFiles',\n then: defaultParams.keys({\n files: Joi.array()\n .items(Joi.object({ path, label: Joi.string() }))\n .required(),\n }),\n },\n {\n is: 'getEntry',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'unpublishedEntries',\n then: defaultParams.keys({ branch: requiredString }).required(),\n },\n {\n is: 'unpublishedEntry',\n then: defaultParams\n .keys({\n id: Joi.string().optional(),\n collection: Joi.string().optional(),\n slug: Joi.string().optional(),\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'unpublishedEntryDataFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'unpublishedEntryMediaFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'deleteUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'persistEntry',\n then: defaultParams\n .keys({\n cmsLabelPrefix: Joi.string().optional(),\n entry: dataFile, // entry is kept for backwards compatibility\n dataFiles: Joi.array().items(dataFile),\n assets: Joi.array().items(asset).required(),\n options: Joi.object({\n collectionName: Joi.string(),\n commitMessage: requiredString,\n useWorkflow: requiredBool,\n status: requiredString,\n }).required(),\n })\n .xor('entry', 'dataFiles')\n .required(),\n },\n {\n is: 'updateUnpublishedEntryStatus',\n then: defaultParams\n .keys({\n collection,\n slug,\n newStatus: requiredString,\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'publishUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'getMedia',\n then: defaultParams\n .keys({\n mediaFolder: path,\n })\n .required(),\n },\n {\n is: 'getMediaFile',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'persistMedia',\n then: defaultParams\n .keys({\n asset: asset.required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFile',\n then: defaultParams\n .keys({\n path,\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFiles',\n then: defaultParams\n .keys({\n paths: Joi.array().items(path).min(1).required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'getDeployPreview',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n ],\n otherwise: Joi.forbidden(),\n });\n\n return Joi.object({\n action: Joi.valid(...allowedActions).required(),\n params,\n });\n}\n\nexport function joi(schema: Joi.Schema) {\n return (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const { error } = schema.validate(req.body, { allowUnknown: true });\n if (error) {\n const { details } = error;\n const message = details.map(i => i.message).join(',');\n res.status(422).json({ error: message });\n } else {\n next();\n }\n };\n}\n","import path from 'path';\nimport { promises as fs } from 'fs';\nimport {\n branchFromContentKey,\n generateContentKey,\n contentKeyFromBranch,\n CMS_BRANCH_PREFIX,\n statusToLabel,\n labelToStatus,\n parseContentKey,\n} from 'decap-cms-lib-util/src/APIUtils';\nimport { parse } from 'what-the-diff';\n// eslint-disable-next-line import/no-named-as-default\nimport simpleGit from 'simple-git';\nimport { Mutex, withTimeout } from 'async-mutex';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, writeFile, move, deleteFile, getUpdateDate } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n DefaultParams,\n UnpublishedEntryParams,\n PersistEntryParams,\n GetMediaParams,\n Asset,\n PublishUnpublishedEntryParams,\n PersistMediaParams,\n DeleteFileParams,\n UpdateUnpublishedEntryStatusParams,\n DataFile,\n GetMediaFileParams,\n DeleteEntryParams,\n DeleteFilesParams,\n UnpublishedEntryDataFileParams,\n UnpublishedEntryMediaFileParams,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\nimport type { SimpleGit } from 'simple-git';\n\nasync function commit(git: SimpleGit, commitMessage: string) {\n await git.add('.');\n await git.commit(commitMessage, undefined, {\n // setting the value to a string passes name=value\n // any other value passes just the key\n '--no-verify': null,\n '--no-gpg-sign': null,\n });\n}\n\nasync function getCurrentBranch(git: SimpleGit) {\n const currentBranch = await git.branchLocal().then(summary => summary.current);\n return currentBranch;\n}\n\nasync function runOnBranch<T>(git: SimpleGit, branch: string, func: () => Promise<T>) {\n const currentBranch = await getCurrentBranch(git);\n try {\n if (currentBranch !== branch) {\n await git.checkout(branch);\n }\n const result = await func();\n return result;\n } finally {\n await git.checkout(currentBranch);\n }\n}\n\nfunction branchDescription(branch: string) {\n return `branch.${branch}.description`;\n}\n\ntype GitOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nasync function commitEntry(\n git: SimpleGit,\n repoPath: string,\n dataFiles: DataFile[],\n assets: Asset[],\n commitMessage: string,\n) {\n // save entry content\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a => writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding))),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(path.join(repoPath, dataFile.path), path.join(repoPath, dataFile.newPath!));\n });\n }\n\n // commits files\n await commit(git, commitMessage);\n}\n\nasync function rebase(git: SimpleGit, branch: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.rebase([branch, '--no-verify']);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function merge(git: SimpleGit, from: string, to: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.mergeFromTo(from, to);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function isBranchExists(git: SimpleGit, branch: string) {\n const branchExists = await git.branchLocal().then(({ all }) => all.includes(branch));\n return branchExists;\n}\n\nasync function getDiffs(git: SimpleGit, source: string, dest: string) {\n const rawDiff = await git.diff([source, dest]);\n const diffs = parse(rawDiff).map(d => {\n const oldPath = d.oldPath?.replace(/b\\//, '') || '';\n const newPath = d.newPath?.replace(/b\\//, '') || '';\n const path = newPath || (oldPath as string);\n return {\n oldPath,\n newPath,\n status: d.status,\n newFile: d.status === 'added',\n path,\n id: path,\n binary: d.binary || /.svg$/.test(path),\n };\n });\n return diffs;\n}\n\nexport async function validateRepo({ repoPath }: { repoPath: string }) {\n const git = simpleGit(repoPath);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n throw Error(`${repoPath} is not a valid git repository`);\n }\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\nexport function localGitMiddleware({ repoPath, logger }: GitOptions) {\n const git = simpleGit(repoPath);\n\n // we can only perform a single git operation at any given time\n const mutex = withTimeout(new Mutex(), 3000, new Error('Request timed out'));\n\n return async function (req: express.Request, res: express.Response) {\n let release;\n try {\n release = await mutex.acquire();\n const { body } = req;\n if (body.action === 'info') {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple', 'editorial_workflow'],\n type: 'local_git',\n });\n return;\n }\n const { branch } = body.params as DefaultParams;\n\n const branchExists = await isBranchExists(git, branch);\n if (!branchExists) {\n const message = `Default branch '${branch}' doesn't exist`;\n res.status(422).json({ error: message });\n return;\n }\n\n switch (body.action) {\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await runOnBranch(git, branch, () =>\n listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, payload.files),\n );\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, [{ path: payload.path }]),\n );\n res.json(entry);\n break;\n }\n case 'unpublishedEntries': {\n const cmsBranches = await git\n .branchLocal()\n .then(result => result.all.filter(b => b.startsWith(`${CMS_BRANCH_PREFIX}/`)));\n res.json(cmsBranches.map(contentKeyFromBranch));\n break;\n }\n case 'unpublishedEntry': {\n let { id, collection, slug, cmsLabelPrefix } = body.params as UnpublishedEntryParams;\n if (id) {\n ({ collection, slug } = parseContentKey(id));\n }\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n const diffs = await getDiffs(git, branch, cmsBranch);\n const label = await git.raw(['config', branchDescription(cmsBranch)]);\n const status = label && labelToStatus(label.trim(), cmsLabelPrefix || '');\n const updatedAt =\n diffs.length >= 0\n ? await runOnBranch(git, cmsBranch, async () => {\n const dates = await Promise.all(\n diffs.map(({ newPath }) => getUpdateDate(repoPath, newPath)),\n );\n return dates.reduce((a, b) => {\n return a > b ? a : b;\n });\n })\n : new Date();\n const unpublishedEntry = {\n collection,\n slug,\n status,\n diffs,\n updatedAt,\n };\n res.json(unpublishedEntry);\n } else {\n return res.status(404).json({ message: 'Not Found' });\n }\n break;\n }\n case 'unpublishedEntryDataFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryDataFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const [entry] = await runOnBranch(git, cmsBranch, () =>\n entriesFromFiles(repoPath, [{ path }]),\n );\n res.json({ data: entry.data });\n break;\n }\n case 'unpublishedEntryMediaFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryMediaFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const file = await runOnBranch(git, cmsBranch, () => readMediaFile(repoPath, path));\n res.json(file);\n break;\n }\n case 'deleteUnpublishedEntry': {\n const { collection, slug } = body.params as DeleteEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const currentBranch = await getCurrentBranch(git);\n if (currentBranch === cmsBranch) {\n await git.checkoutLocalBranch(branch);\n }\n await git.branch(['-D', cmsBranch]);\n res.json({ message: `deleted branch: ${cmsBranch}` });\n break;\n }\n case 'persistEntry': {\n const {\n cmsLabelPrefix,\n entry,\n dataFiles = [entry as DataFile],\n assets,\n options,\n } = body.params as PersistEntryParams;\n\n if (!options.useWorkflow) {\n await runOnBranch(git, branch, async () => {\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n });\n } else {\n const slug = dataFiles[0].slug;\n const collection = options.collectionName as string;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await runOnBranch(git, branch, async () => {\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n await git.checkout(cmsBranch);\n } else {\n await git.checkoutLocalBranch(cmsBranch);\n }\n await rebase(git, branch);\n const diffs = await getDiffs(git, branch, cmsBranch);\n // delete media files that have been removed from the entry\n const toDelete = diffs.filter(\n d => d.binary && !assets.map(a => a.path).includes(d.path),\n );\n await Promise.all(toDelete.map(f => fs.unlink(path.join(repoPath, f.path))));\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n\n // add status for new entries\n if (!branchExists) {\n const description = statusToLabel(options.status, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n }\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'updateUnpublishedEntryStatus': {\n const { collection, slug, newStatus, cmsLabelPrefix } =\n body.params as UpdateUnpublishedEntryStatusParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const description = statusToLabel(newStatus, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n res.json({ message: `${branch} description was updated to ${description}` });\n break;\n }\n case 'publishUnpublishedEntry': {\n const { collection, slug } = body.params as PublishUnpublishedEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await merge(git, cmsBranch, branch);\n await git.deleteLocalBranch(cmsBranch);\n res.json({ message: `branch ${cmsBranch} merged to ${branch}` });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const mediaFiles = await runOnBranch(git, branch, async () => {\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const serializedFiles = await Promise.all(\n files.map(file => readMediaFile(repoPath, file)),\n );\n return serializedFiles;\n });\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await runOnBranch(git, branch, () => {\n return readMediaFile(repoPath, path);\n });\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const {\n asset,\n options: { commitMessage },\n } = body.params as PersistMediaParams;\n\n const file = await runOnBranch(git, branch, async () => {\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n await commit(git, commitMessage);\n return readMediaFile(repoPath, asset.path);\n });\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const {\n path: filePath,\n options: { commitMessage },\n } = body.params as DeleteFileParams;\n await runOnBranch(git, branch, async () => {\n await deleteFile(repoPath, filePath);\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const {\n paths,\n options: { commitMessage },\n } = body.params as DeleteFilesParams;\n await runOnBranch(git, branch, async () => {\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n } finally {\n release && release();\n }\n };\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n await validateRepo({ repoPath });\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localGitMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS Git Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"crypto\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(783);\n"],"names":["module","exports","require","sha256","buffer","createHash","update","digest","normalizePath","path","replace","async","repoPath","files","Promise","all","map","file","content","readFile","join","data","toString","label","id","e","encoding","name","basename","getLabelPrefix","labelPrefix","CMS_BRANCH_PREFIX","DEFAULT_PR_BODY","MERGE_COMMIT_MESSAGE","startsWith","slice","length","status","collectionName","slug","contentKey","index","indexOf","collection","branch","listFiles","dir","extension","depth","dirents","readdir","withFileTypes","dirent","res","isDirectory","filter","f","endsWith","concat","moveFile","from","to","mkdir","dirname","recursive","rename","folder","filePath","writeFile","unlink","catch","sourceDir","destDir","allFiles","stat","then","mtime","Date","extend","type","base","string","required","messages","validate","value","helpers","errors","error","app","port","parseInt","process","env","PORT","host","BIND_HOST","level","LOG_LEVEL","logger","createLogger","options","registerCommonMiddlewares","mode","MODE","Error","message","exit","listen","info","localFsMiddleware","req","body","action","json","repo","publish_modes","payload","params","entries","listRepoFiles","entriesFromFiles","entry","dataFiles","assets","dataFile","raw","a","Buffer","every","newPath","forEach","move","mediaFolder","mediaFiles","readMediaFile","mediaFile","asset","deleteFile","paths","JSON","stringify","getSchema","defaultSchema","pathTraversal","resolve","GIT_REPO_DIRECTORY","cwd","post","joi","stream","write","debug","String","trim","use","origin","ORIGIN","limit","combine","colorize","simple","format","transports","Console","allowedActions","requiredString","requiredNumber","number","requiredBool","bool","defaultParams","object","valid","optional","when","switch","is","allow","keys","array","items","cmsLabelPrefix","commitMessage","useWorkflow","xor","newStatus","min","otherwise","forbidden","schema","next","allowUnknown","details","i","commit","git","add","undefined","getCurrentBranch","branchLocal","summary","current","runOnBranch","func","currentBranch","checkout","branchDescription","commitEntry","isBranchExists","includes","getDiffs","source","dest","rawDiff","diff","parse","d","oldPath","newFile","binary","test","validateRepo","checkIsRepo","localGitMiddleware","mutex","withTimeout","Mutex","release","acquire","cmsBranches","result","b","contentKeyFromBranch","parseContentKey","generateContentKey","cmsBranch","branchFromContentKey","diffs","labelToStatus","updatedAt","getUpdateDate","reduce","unpublishedEntry","checkoutLocalBranch","branchExists","gpgSign","addConfig","rebase","toDelete","description","statusToLabel","mergeFromTo","merge","deleteLocalBranch","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- (()=>{"use strict";var e={96:e=>{e.exports=require("morgan")},123:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.readMediaFile=t.entriesFromFiles=void 0;const r=i(a(982)),n=i(a(928)),s=a(896);function o(e){return r.default.createHash("sha256").update(e).digest("hex")}function l(e){return e.replace(/\\/g,"/")}t.entriesFromFiles=async function(e,t){return Promise.all(t.map(async t=>{try{const a=await s.promises.readFile(n.default.join(e,t.path));return{data:a.toString(),file:{path:l(t.path),label:t.label,id:o(a)}}}catch(e){return{data:null,file:{path:l(t.path),label:t.label,id:null}}}}))},t.readMediaFile=async function(e,t){const a="base64",i=await s.promises.readFile(n.default.join(e,t));return{id:o(i),content:i.toString(a),encoding:a,path:l(t),name:n.default.basename(t)}}},124:e=>{e.exports=require("winston")},161:(e,t)=>{function a(e){return e||"decap-cms/"}Object.defineProperty(t,"__esModule",{value:!0}),t.branchFromContentKey=t.contentKeyFromBranch=t.parseContentKey=t.generateContentKey=t.statusToLabel=t.labelToStatus=t.isCMSLabel=t.MERGE_COMMIT_MESSAGE=t.DEFAULT_PR_BODY=t.CMS_BRANCH_PREFIX=void 0,t.CMS_BRANCH_PREFIX="cms",t.DEFAULT_PR_BODY="Automatically generated by Decap CMS",t.MERGE_COMMIT_MESSAGE="Automatically generated. Merged on Decap CMS.",t.isCMSLabel=function(e,t){return e.startsWith(a(t))},t.labelToStatus=function(e,t){return e.slice(a(t).length)},t.statusToLabel=function(e,t){return`${a(t)}${e}`},t.generateContentKey=function(e,t){return`${e}/${t}`},t.parseContentKey=function(e){const t=e.indexOf("/");return{collection:e.slice(0,t),slug:e.slice(t+1)}},t.contentKeyFromBranch=function(e){return e.slice(`${t.CMS_BRANCH_PREFIX}/`.length)},t.branchFromContentKey=function(e){return`${t.CMS_BRANCH_PREFIX}/${e}`}},252:e=>{e.exports=require("express")},280:e=>{e.exports=require("what-the-diff")},354:e=>{e.exports=require("async-mutex")},476:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getUpdateDate=t.move=t.deleteFile=t.writeFile=t.listRepoFiles=void 0;const r=i(a(928)),n=a(896);async function s(e,t,a){if(a<=0)return[];try{const i=await n.promises.readdir(e,{withFileTypes:!0}),o=await Promise.all(i.map(i=>{const n=r.default.join(e,i.name);return i.isDirectory()?s(n,t,a-1):[n].filter(e=>e.endsWith(t))}));return[].concat(...o)}catch(e){return[]}}async function o(e,t){await n.promises.mkdir(r.default.dirname(t),{recursive:!0}),await n.promises.rename(e,t)}t.listRepoFiles=async function(e,t,a,i){return(await s(r.default.join(e,t),a,i)).map(t=>t.slice(e.length+1))},t.writeFile=async function(e,t){await n.promises.mkdir(r.default.dirname(e),{recursive:!0}),await n.promises.writeFile(e,t)},t.deleteFile=async function(e,t){await n.promises.unlink(r.default.join(e,t)).catch(()=>{})},t.move=async function(e,t){await o(e,t);const a=r.default.dirname(e),i=r.default.dirname(t),n=await s(a,"",100);await Promise.all(n.map(e=>o(e,e.replace(a,i))))},t.getUpdateDate=async function(e,t){return n.promises.stat(r.default.join(e,t)).then(e=>e.mtime).catch(()=>new Date)}},577:e=>{e.exports=require("cors")},669:e=>{e.exports=require("@hapi/joi")},778:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.pathTraversal=void 0;const r=i(a(669)),n=i(a(928));t.pathTraversal=function(e){return r.default.extend({type:"path",base:r.default.string().required(),messages:{"path.invalid":"{{#label}} must resolve to a path under the configured repository"},validate(t,a){if(!n.default.join(e,t).startsWith(e))return{value:t,errors:a.error("path.invalid")}}}).path()}},786:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.getSchema=t.localFsMiddleware=void 0;const r=i(a(928)),n=a(964),s=a(778),o=a(476),l=a(123);function c({repoPath:e,logger:t}){return async function(a,i){try{const{body:t}=a;switch(t.action){case"info":i.json({repo:r.default.basename(e),publish_modes:["simple"],type:"local_fs"});break;case"entriesByFolder":{const a=t.params,{folder:r,extension:n,depth:s}=a,c=await(0,o.listRepoFiles)(e,r,n,s).then(t=>(0,l.entriesFromFiles)(e,t.map(e=>({path:e}))));i.json(c);break}case"entriesByFiles":{const a=t.params,r=await(0,l.entriesFromFiles)(e,a.files);i.json(r);break}case"getEntry":{const a=t.params,[r]=await(0,l.entriesFromFiles)(e,[{path:a.path}]);i.json(r);break}case"persistEntry":{const{entry:a,dataFiles:n=[a],assets:s}=t.params;await Promise.all(n.map(t=>(0,o.writeFile)(r.default.join(e,t.path),t.raw))),await Promise.all(s.map(t=>(0,o.writeFile)(r.default.join(e,t.path),Buffer.from(t.content,t.encoding)))),n.every(e=>e.newPath)&&n.forEach(async t=>{await(0,o.move)(r.default.join(e,t.path),r.default.join(e,t.newPath))}),i.json({message:"entry persisted"});break}case"getMedia":{const{mediaFolder:a}=t.params,r=await(0,o.listRepoFiles)(e,a,"",1),n=await Promise.all(r.map(t=>(0,l.readMediaFile)(e,t)));i.json(n);break}case"getMediaFile":{const{path:a}=t.params,r=await(0,l.readMediaFile)(e,a);i.json(r);break}case"persistMedia":{const{asset:a}=t.params;await(0,o.writeFile)(r.default.join(e,a.path),Buffer.from(a.content,a.encoding));const n=await(0,l.readMediaFile)(e,a.path);i.json(n);break}case"deleteFile":{const{path:a}=t.params;await(0,o.deleteFile)(e,a),i.json({message:`deleted file ${a}`});break}case"deleteFiles":{const{paths:a}=t.params;await Promise.all(a.map(t=>(0,o.deleteFile)(e,t))),i.json({message:`deleted files ${a.join(", ")}`});break}case"getDeployPreview":i.json(null);break;default:{const e=`Unknown action ${t.action}`;i.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(a.body)}: ${e instanceof Error?e.message:"Unknown error"}`),i.status(500).json({error:"Unknown error"})}}}function u({repoPath:e}){return(0,n.defaultSchema)({path:(0,s.pathTraversal)(e)})}t.localFsMiddleware=c,t.getSchema=u,t.registerMiddleware=async function(e,t){const{logger:a}=t,i=r.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());e.post("/api/v1",(0,n.joi)(u({repoPath:i}))),e.post("/api/v1",c({repoPath:i,logger:a})),a.info(`Decap CMS File System Proxy Server configured with ${i}`)}},807:e=>{e.exports=require("simple-git")},827:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerCommonMiddlewares=void 0;const r=i(a(252)),n=i(a(96)),s=i(a(577));t.registerCommonMiddlewares=function(e,t){const{logger:a}=t,i={write:e=>{a.debug(String(e).trim())}};e.use((0,n.default)("combined",{stream:i})),e.use((0,s.default)()),e.use(r.default.json({limit:"50mb"}))}},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")},943:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=void 0;const r=i(a(124)),{combine:n,colorize:s,simple:o}=r.default.format;t.createLogger=function({level:e}){return r.default.createLogger({level:e,format:n(s(),o()),transports:[new r.default.transports.Console]})}},964:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.joi=t.defaultSchema=void 0;const r=i(a(669)),n=["info","entriesByFolder","entriesByFiles","getEntry","unpublishedEntries","unpublishedEntry","unpublishedEntryDataFile","unpublishedEntryMediaFile","deleteUnpublishedEntry","persistEntry","updateUnpublishedEntryStatus","publishUnpublishedEntry","getMedia","getMediaFile","persistMedia","deleteFile","deleteFiles","getDeployPreview"],s=r.default.string().required(),o=r.default.number().required(),l=r.default.bool().required(),c=s,u=s;t.defaultSchema=function({path:e=s}={}){const t=r.default.object({branch:s}),a=r.default.object({path:e,content:s,encoding:s.valid("base64")}),i=r.default.object({slug:s,path:e,raw:s,newPath:e.optional()}),d=r.default.when("action",{switch:[{is:"info",then:r.default.allow()},{is:"entriesByFolder",then:t.keys({folder:e,extension:s,depth:o}).required()},{is:"entriesByFiles",then:t.keys({files:r.default.array().items(r.default.object({path:e,label:r.default.string()})).required()})},{is:"getEntry",then:t.keys({path:e}).required()},{is:"unpublishedEntries",then:t.keys({branch:s}).required()},{is:"unpublishedEntry",then:t.keys({id:r.default.string().optional(),collection:r.default.string().optional(),slug:r.default.string().optional(),cmsLabelPrefix:r.default.string().optional()}).required()},{is:"unpublishedEntryDataFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"unpublishedEntryMediaFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"deleteUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"persistEntry",then:t.keys({cmsLabelPrefix:r.default.string().optional(),entry:i,dataFiles:r.default.array().items(i),assets:r.default.array().items(a).required(),options:r.default.object({collectionName:r.default.string(),commitMessage:s,useWorkflow:l,status:s}).required()}).xor("entry","dataFiles").required()},{is:"updateUnpublishedEntryStatus",then:t.keys({collection:c,slug:u,newStatus:s,cmsLabelPrefix:r.default.string().optional()}).required()},{is:"publishUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"getMedia",then:t.keys({mediaFolder:e}).required()},{is:"getMediaFile",then:t.keys({path:e}).required()},{is:"persistMedia",then:t.keys({asset:a.required(),options:r.default.object({commitMessage:s}).required()}).required()},{is:"deleteFile",then:t.keys({path:e,options:r.default.object({commitMessage:s}).required()}).required()},{is:"deleteFiles",then:t.keys({paths:r.default.array().items(e).min(1).required(),options:r.default.object({commitMessage:s}).required()}).required()},{is:"getDeployPreview",then:t.keys({collection:c,slug:u}).required()}],otherwise:r.default.forbidden()});return r.default.object({action:r.default.valid(...n).required(),params:d})},t.joi=function(e){return(t,a,i)=>{const{error:r}=e.validate(t.body,{allowUnknown:!0});if(r){const{details:e}=r,t=e.map(e=>e.message).join(",");a.status(422).json({error:t})}else i()}}},971:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.localGitMiddleware=t.getSchema=t.validateRepo=void 0;const r=i(a(928)),n=a(896),s=a(161),o=a(280),l=i(a(807)),c=a(354),u=a(964),d=a(778),p=a(476),f=a(123);async function m(e,t){await e.add("."),await e.commit(t,void 0,{"--no-verify":null,"--no-gpg-sign":null})}async function h(e){return await e.branchLocal().then(e=>e.current)}async function g(e,t,a){const i=await h(e);try{return i!==t&&await e.checkout(t),await a()}finally{await e.checkout(i)}}function y(e){return`branch.${e}.description`}async function w(e,t,a,i,n){await Promise.all(a.map(e=>(0,p.writeFile)(r.default.join(t,e.path),e.raw))),await Promise.all(i.map(e=>(0,p.writeFile)(r.default.join(t,e.path),Buffer.from(e.content,e.encoding)))),a.every(e=>e.newPath)&&a.forEach(async e=>{await(0,p.move)(r.default.join(t,e.path),r.default.join(t,e.newPath))}),await m(e,n)}async function b(e,t){return await e.branchLocal().then(({all:e})=>e.includes(t))}async function F(e,t,a){const i=await e.diff([t,a]);return(0,o.parse)(i).map(e=>{var t,a;const i=(null===(t=e.oldPath)||void 0===t?void 0:t.replace(/b\//,""))||"",r=(null===(a=e.newPath)||void 0===a?void 0:a.replace(/b\//,""))||"",n=r||i;return{oldPath:i,newPath:r,status:e.status,newFile:"added"===e.status,path:n,id:n,binary:e.binary||/.svg$/.test(n)}})}async function v({repoPath:e}){const t=(0,l.default)(e);if(!await t.checkIsRepo())throw Error(`${e} is not a valid git repository`)}function M({repoPath:e}){return(0,u.defaultSchema)({path:(0,d.pathTraversal)(e)})}function j({repoPath:e,logger:t}){const a=(0,l.default)(e),i=(0,c.withTimeout)(new c.Mutex,3e3,new Error("Request timed out"));return async function(o,l){let c;try{c=await i.acquire();const{body:t}=o;if("info"===t.action)return void l.json({repo:r.default.basename(e),publish_modes:["simple","editorial_workflow"],type:"local_git"});const{branch:u}=t.params;if(!await b(a,u)){const e=`Default branch '${u}' doesn't exist`;return void l.status(422).json({error:e})}switch(t.action){case"entriesByFolder":{const i=t.params,{folder:r,extension:n,depth:s}=i,o=await g(a,u,()=>(0,p.listRepoFiles)(e,r,n,s).then(t=>(0,f.entriesFromFiles)(e,t.map(e=>({path:e})))));l.json(o);break}case"entriesByFiles":{const i=t.params,r=await g(a,u,()=>(0,f.entriesFromFiles)(e,i.files));l.json(r);break}case"getEntry":{const i=t.params,[r]=await g(a,u,()=>(0,f.entriesFromFiles)(e,[{path:i.path}]));l.json(r);break}case"unpublishedEntries":{const e=await a.branchLocal().then(e=>e.all.filter(e=>e.startsWith(`${s.CMS_BRANCH_PREFIX}/`)));l.json(e.map(s.contentKeyFromBranch));break}case"unpublishedEntry":{let{id:i,collection:r,slug:n,cmsLabelPrefix:o}=t.params;i&&({collection:r,slug:n}=(0,s.parseContentKey)(i));const c=(0,s.generateContentKey)(r,n),d=(0,s.branchFromContentKey)(c);if(!await b(a,d))return l.status(404).json({message:"Not Found"});{const t=await F(a,u,d),i=await a.raw(["config",y(d)]),c=i&&(0,s.labelToStatus)(i.trim(),o||""),f=t.length>=0?await g(a,d,async()=>(await Promise.all(t.map(({newPath:t})=>(0,p.getUpdateDate)(e,t)))).reduce((e,t)=>e>t?e:t)):new Date,m={collection:r,slug:n,status:c,diffs:t,updatedAt:f};l.json(m)}break}case"unpublishedEntryDataFile":{const{path:i,collection:r,slug:n}=t.params,o=(0,s.generateContentKey)(r,n),c=(0,s.branchFromContentKey)(o),[u]=await g(a,c,()=>(0,f.entriesFromFiles)(e,[{path:i}]));l.json({data:u.data});break}case"unpublishedEntryMediaFile":{const{path:i,collection:r,slug:n}=t.params,o=(0,s.generateContentKey)(r,n),c=(0,s.branchFromContentKey)(o),u=await g(a,c,()=>(0,f.readMediaFile)(e,i));l.json(u);break}case"deleteUnpublishedEntry":{const{collection:e,slug:i}=t.params,r=(0,s.generateContentKey)(e,i),n=(0,s.branchFromContentKey)(r);await h(a)===n&&await a.checkoutLocalBranch(u),await a.branch(["-D",n]),l.json({message:`deleted branch: ${n}`});break}case"persistEntry":{const{cmsLabelPrefix:i,entry:o,dataFiles:c=[o],assets:d,options:p}=t.params;if(p.useWorkflow){const t=c[0].slug,o=p.collectionName,l=(0,s.generateContentKey)(o,t),f=(0,s.branchFromContentKey)(l);await g(a,u,async()=>{const t=await b(a,f);t?await a.checkout(f):await a.checkoutLocalBranch(f),await async function(e,t){const a=await e.raw(["config","commit.gpgsign"]);try{"true"===a&&await e.addConfig("commit.gpgsign","false"),await e.rebase([t,"--no-verify"])}finally{"true"===a&&await e.addConfig("commit.gpgsign",a)}}(a,u);const o=(await F(a,u,f)).filter(e=>e.binary&&!d.map(e=>e.path).includes(e.path));if(await Promise.all(o.map(t=>n.promises.unlink(r.default.join(e,t.path)))),await w(a,e,c,d,p.commitMessage),!t){const e=(0,s.statusToLabel)(p.status,i||"");await a.addConfig(y(f),e)}})}else await g(a,u,async()=>{await w(a,e,c,d,p.commitMessage)});l.json({message:"entry persisted"});break}case"updateUnpublishedEntryStatus":{const{collection:e,slug:i,newStatus:r,cmsLabelPrefix:n}=t.params,o=(0,s.generateContentKey)(e,i),c=(0,s.branchFromContentKey)(o),d=(0,s.statusToLabel)(r,n||"");await a.addConfig(y(c),d),l.json({message:`${u} description was updated to ${d}`});break}case"publishUnpublishedEntry":{const{collection:e,slug:i}=t.params,r=(0,s.generateContentKey)(e,i),n=(0,s.branchFromContentKey)(r);await async function(e,t,a){const i=await e.raw(["config","commit.gpgsign"]);try{"true"===i&&await e.addConfig("commit.gpgsign","false"),await e.mergeFromTo(t,a)}finally{"true"===i&&await e.addConfig("commit.gpgsign",i)}}(a,n,u),await a.deleteLocalBranch(n),l.json({message:`branch ${n} merged to ${u}`});break}case"getMedia":{const{mediaFolder:i}=t.params,r=await g(a,u,async()=>{const t=await(0,p.listRepoFiles)(e,i,"",1);return await Promise.all(t.map(t=>(0,f.readMediaFile)(e,t)))});l.json(r);break}case"getMediaFile":{const{path:i}=t.params,r=await g(a,u,()=>(0,f.readMediaFile)(e,i));l.json(r);break}case"persistMedia":{const{asset:i,options:{commitMessage:n}}=t.params,s=await g(a,u,async()=>(await(0,p.writeFile)(r.default.join(e,i.path),Buffer.from(i.content,i.encoding)),await m(a,n),(0,f.readMediaFile)(e,i.path)));l.json(s);break}case"deleteFile":{const{path:i,options:{commitMessage:r}}=t.params;await g(a,u,async()=>{await(0,p.deleteFile)(e,i),await m(a,r)}),l.json({message:`deleted file ${i}`});break}case"deleteFiles":{const{paths:i,options:{commitMessage:r}}=t.params;await g(a,u,async()=>{await Promise.all(i.map(t=>(0,p.deleteFile)(e,t))),await m(a,r)}),l.json({message:`deleted files ${i.join(", ")}`});break}case"getDeployPreview":l.json(null);break;default:{const e=`Unknown action ${t.action}`;l.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(o.body)}: ${e instanceof Error?e.message:"Unknown error"}`),l.status(500).json({error:"Unknown error"})}finally{c&&c()}}}t.validateRepo=v,t.getSchema=M,t.localGitMiddleware=j,t.registerMiddleware=async function(e,t){const{logger:a}=t,i=r.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());await v({repoPath:i}),e.post("/api/v1",(0,u.joi)(M({repoPath:i}))),e.post("/api/v1",j({repoPath:i,logger:a})),a.info(`Decap CMS Git Proxy Server configured with ${i}`)}},982:e=>{e.exports=require("crypto")}},t={};function a(i){var r=t[i];if(void 0!==r)return r.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,a),n.exports}var i={};(()=>{var e=i;Object.defineProperty(e,"__esModule",{value:!0}),e.registerLocalFs=e.registerLocalGit=void 0;const t=a(827),r=a(971),n=a(786),s=a(943);function o(e){return{logger:(0,s.createLogger)({level:e.logLevel||"info"})}}e.registerLocalGit=async function(e,a={}){const i=o(a);(0,t.registerCommonMiddlewares)(e,i),await(0,r.registerMiddleware)(e,i)},e.registerLocalFs=async function(e,a={}){const i=o(a);(0,t.registerCommonMiddlewares)(e,i),await(0,n.registerMiddleware)(e,i)}})(),module.exports=i})();
2
+ (()=>{"use strict";var e={96:e=>{e.exports=require("morgan")},123:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.readMediaFile=t.entriesFromFiles=void 0;const r=i(a(982)),n=i(a(928)),s=a(896);function o(e){return r.default.createHash("sha256").update(e).digest("hex")}function l(e){return e.replace(/\\/g,"/")}t.entriesFromFiles=async function(e,t){return Promise.all(t.map(async t=>{try{const a=await s.promises.readFile(n.default.join(e,t.path));return{data:a.toString(),file:{path:l(t.path),label:t.label,id:o(a)}}}catch(e){return{data:null,file:{path:l(t.path),label:t.label,id:null}}}}))},t.readMediaFile=async function(e,t){const a="base64",i=await s.promises.readFile(n.default.join(e,t));return{id:o(i),content:i.toString(a),encoding:a,path:l(t),name:n.default.basename(t)}}},124:e=>{e.exports=require("winston")},161:(e,t)=>{function a(e){return e||"decap-cms/"}Object.defineProperty(t,"__esModule",{value:!0}),t.branchFromContentKey=t.contentKeyFromBranch=t.parseContentKey=t.generateContentKey=t.statusToLabel=t.labelToStatus=t.isCMSLabel=t.MERGE_COMMIT_MESSAGE=t.DEFAULT_PR_BODY=t.CMS_BRANCH_PREFIX=void 0,t.CMS_BRANCH_PREFIX="cms",t.DEFAULT_PR_BODY="Automatically generated by Decap CMS",t.MERGE_COMMIT_MESSAGE="Automatically generated. Merged on Decap CMS.",t.isCMSLabel=function(e,t){return e.startsWith(a(t))},t.labelToStatus=function(e,t){return e.slice(a(t).length)},t.statusToLabel=function(e,t){return`${a(t)}${e}`},t.generateContentKey=function(e,t){return`${e}/${t}`},t.parseContentKey=function(e){const t=e.indexOf("/");return{collection:e.slice(0,t),slug:e.slice(t+1)}},t.contentKeyFromBranch=function(e){return e.slice(`${t.CMS_BRANCH_PREFIX}/`.length)},t.branchFromContentKey=function(e){return`${t.CMS_BRANCH_PREFIX}/${e}`}},252:e=>{e.exports=require("express")},280:e=>{e.exports=require("what-the-diff")},354:e=>{e.exports=require("async-mutex")},476:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getUpdateDate=t.move=t.deleteFile=t.writeFile=t.listRepoFiles=void 0;const r=i(a(928)),n=a(896);async function s(e,t,a){if(a<=0)return[];try{const i=await n.promises.readdir(e,{withFileTypes:!0}),o=await Promise.all(i.map(i=>{const n=r.default.join(e,i.name);return i.isDirectory()?s(n,t,a-1):[n].filter(e=>e.endsWith(t))}));return[].concat(...o)}catch(e){return[]}}async function o(e,t){await n.promises.mkdir(r.default.dirname(t),{recursive:!0}),await n.promises.rename(e,t)}t.listRepoFiles=async function(e,t,a,i){return(await s(r.default.join(e,t),a,i)).map(t=>t.slice(e.length+1))},t.writeFile=async function(e,t){await n.promises.mkdir(r.default.dirname(e),{recursive:!0}),await n.promises.writeFile(e,t)},t.deleteFile=async function(e,t){await n.promises.unlink(r.default.join(e,t)).catch(()=>{})},t.move=async function(e,t){await o(e,t);const a=r.default.dirname(e),i=r.default.dirname(t),n=await s(a,"",100);await Promise.all(n.map(e=>o(e,e.replace(a,i))))},t.getUpdateDate=async function(e,t){return n.promises.stat(r.default.join(e,t)).then(e=>e.mtime).catch(()=>new Date)}},577:e=>{e.exports=require("cors")},669:e=>{e.exports=require("@hapi/joi")},778:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.pathTraversal=void 0;const r=i(a(669)),n=i(a(928));t.pathTraversal=function(e){return r.default.extend({type:"path",base:r.default.string().required(),messages:{"path.invalid":"{{#label}} must resolve to a path under the configured repository"},validate(t,a){if(!n.default.join(e,t).startsWith(e))return{value:t,errors:a.error("path.invalid")}}}).path()}},786:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.getSchema=t.localFsMiddleware=void 0;const r=i(a(928)),n=a(964),s=a(778),o=a(476),l=a(123);function c({repoPath:e,logger:t}){return async function(a,i){try{const{body:t}=a;switch(t.action){case"info":i.json({repo:r.default.basename(e),publish_modes:["simple"],type:"local_fs"});break;case"entriesByFolder":{const a=t.params,{folder:r,extension:n,depth:s}=a,c=await(0,o.listRepoFiles)(e,r,n,s).then(t=>(0,l.entriesFromFiles)(e,t.map(e=>({path:e}))));i.json(c);break}case"entriesByFiles":{const a=t.params,r=await(0,l.entriesFromFiles)(e,a.files);i.json(r);break}case"getEntry":{const a=t.params,[r]=await(0,l.entriesFromFiles)(e,[{path:a.path}]);i.json(r);break}case"persistEntry":{const{entry:a,dataFiles:n=[a],assets:s}=t.params;await Promise.all(n.map(t=>(0,o.writeFile)(r.default.join(e,t.path),t.raw))),await Promise.all(s.map(t=>(0,o.writeFile)(r.default.join(e,t.path),Buffer.from(t.content,t.encoding)))),n.every(e=>e.newPath)&&n.forEach(async t=>{await(0,o.move)(r.default.join(e,t.path),r.default.join(e,t.newPath))}),i.json({message:"entry persisted"});break}case"getMedia":{const{mediaFolder:a}=t.params,r=await(0,o.listRepoFiles)(e,a,"",1),n=await Promise.all(r.map(t=>(0,l.readMediaFile)(e,t)));i.json(n);break}case"getMediaFile":{const{path:a}=t.params,r=await(0,l.readMediaFile)(e,a);i.json(r);break}case"persistMedia":{const{asset:a}=t.params;await(0,o.writeFile)(r.default.join(e,a.path),Buffer.from(a.content,a.encoding));const n=await(0,l.readMediaFile)(e,a.path);i.json(n);break}case"deleteFile":{const{path:a}=t.params;await(0,o.deleteFile)(e,a),i.json({message:`deleted file ${a}`});break}case"deleteFiles":{const{paths:a}=t.params;await Promise.all(a.map(t=>(0,o.deleteFile)(e,t))),i.json({message:`deleted files ${a.join(", ")}`});break}case"getDeployPreview":i.json(null);break;default:{const e=`Unknown action ${t.action}`;i.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(a.body)}: ${e instanceof Error?e.message:"Unknown error"}`),i.status(500).json({error:"Unknown error"})}}}function u({repoPath:e}){return(0,n.defaultSchema)({path:(0,s.pathTraversal)(e)})}t.localFsMiddleware=c,t.getSchema=u,t.registerMiddleware=async function(e,t){const{logger:a}=t,i=r.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());e.post("/api/v1",(0,n.joi)(u({repoPath:i}))),e.post("/api/v1",c({repoPath:i,logger:a})),a.info(`Decap CMS File System Proxy Server configured with ${i}`)}},807:e=>{e.exports=require("simple-git")},827:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerCommonMiddlewares=void 0;const r=i(a(252)),n=i(a(96)),s=i(a(577));t.registerCommonMiddlewares=function(e,t){const{logger:a}=t,i={write:e=>{a.debug(String(e).trim())}};e.use((0,n.default)("combined",{stream:i})),e.use((0,s.default)({origin:process.env.ORIGIN||"*"})),e.use(r.default.json({limit:"50mb"}))}},896:e=>{e.exports=require("fs")},928:e=>{e.exports=require("path")},943:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=void 0;const r=i(a(124)),{combine:n,colorize:s,simple:o}=r.default.format;t.createLogger=function({level:e}){return r.default.createLogger({level:e,format:n(s(),o()),transports:[new r.default.transports.Console]})}},964:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.joi=t.defaultSchema=void 0;const r=i(a(669)),n=["info","entriesByFolder","entriesByFiles","getEntry","unpublishedEntries","unpublishedEntry","unpublishedEntryDataFile","unpublishedEntryMediaFile","deleteUnpublishedEntry","persistEntry","updateUnpublishedEntryStatus","publishUnpublishedEntry","getMedia","getMediaFile","persistMedia","deleteFile","deleteFiles","getDeployPreview"],s=r.default.string().required(),o=r.default.number().required(),l=r.default.bool().required(),c=s,u=s;t.defaultSchema=function({path:e=s}={}){const t=r.default.object({branch:s}),a=r.default.object({path:e,content:s,encoding:s.valid("base64")}),i=r.default.object({slug:s,path:e,raw:s,newPath:e.optional()}),d=r.default.when("action",{switch:[{is:"info",then:r.default.allow()},{is:"entriesByFolder",then:t.keys({folder:e,extension:s,depth:o}).required()},{is:"entriesByFiles",then:t.keys({files:r.default.array().items(r.default.object({path:e,label:r.default.string()})).required()})},{is:"getEntry",then:t.keys({path:e}).required()},{is:"unpublishedEntries",then:t.keys({branch:s}).required()},{is:"unpublishedEntry",then:t.keys({id:r.default.string().optional(),collection:r.default.string().optional(),slug:r.default.string().optional(),cmsLabelPrefix:r.default.string().optional()}).required()},{is:"unpublishedEntryDataFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"unpublishedEntryMediaFile",then:t.keys({collection:c,slug:u,id:s,path:s}).required()},{is:"deleteUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"persistEntry",then:t.keys({cmsLabelPrefix:r.default.string().optional(),entry:i,dataFiles:r.default.array().items(i),assets:r.default.array().items(a).required(),options:r.default.object({collectionName:r.default.string(),commitMessage:s,useWorkflow:l,status:s}).required()}).xor("entry","dataFiles").required()},{is:"updateUnpublishedEntryStatus",then:t.keys({collection:c,slug:u,newStatus:s,cmsLabelPrefix:r.default.string().optional()}).required()},{is:"publishUnpublishedEntry",then:t.keys({collection:c,slug:u}).required()},{is:"getMedia",then:t.keys({mediaFolder:e}).required()},{is:"getMediaFile",then:t.keys({path:e}).required()},{is:"persistMedia",then:t.keys({asset:a.required(),options:r.default.object({commitMessage:s}).required()}).required()},{is:"deleteFile",then:t.keys({path:e,options:r.default.object({commitMessage:s}).required()}).required()},{is:"deleteFiles",then:t.keys({paths:r.default.array().items(e).min(1).required(),options:r.default.object({commitMessage:s}).required()}).required()},{is:"getDeployPreview",then:t.keys({collection:c,slug:u}).required()}],otherwise:r.default.forbidden()});return r.default.object({action:r.default.valid(...n).required(),params:d})},t.joi=function(e){return(t,a,i)=>{const{error:r}=e.validate(t.body,{allowUnknown:!0});if(r){const{details:e}=r,t=e.map(e=>e.message).join(",");a.status(422).json({error:t})}else i()}}},971:function(e,t,a){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.registerMiddleware=t.localGitMiddleware=t.getSchema=t.validateRepo=void 0;const r=i(a(928)),n=a(896),s=a(161),o=a(280),l=i(a(807)),c=a(354),u=a(964),d=a(778),p=a(476),f=a(123);async function m(e,t){await e.add("."),await e.commit(t,void 0,{"--no-verify":null,"--no-gpg-sign":null})}async function h(e){return await e.branchLocal().then(e=>e.current)}async function g(e,t,a){const i=await h(e);try{return i!==t&&await e.checkout(t),await a()}finally{await e.checkout(i)}}function y(e){return`branch.${e}.description`}async function w(e,t,a,i,n){await Promise.all(a.map(e=>(0,p.writeFile)(r.default.join(t,e.path),e.raw))),await Promise.all(i.map(e=>(0,p.writeFile)(r.default.join(t,e.path),Buffer.from(e.content,e.encoding)))),a.every(e=>e.newPath)&&a.forEach(async e=>{await(0,p.move)(r.default.join(t,e.path),r.default.join(t,e.newPath))}),await m(e,n)}async function b(e,t){return await e.branchLocal().then(({all:e})=>e.includes(t))}async function F(e,t,a){const i=await e.diff([t,a]);return(0,o.parse)(i).map(e=>{var t,a;const i=(null===(t=e.oldPath)||void 0===t?void 0:t.replace(/b\//,""))||"",r=(null===(a=e.newPath)||void 0===a?void 0:a.replace(/b\//,""))||"",n=r||i;return{oldPath:i,newPath:r,status:e.status,newFile:"added"===e.status,path:n,id:n,binary:e.binary||/.svg$/.test(n)}})}async function v({repoPath:e}){const t=(0,l.default)(e);if(!await t.checkIsRepo())throw Error(`${e} is not a valid git repository`)}function M({repoPath:e}){return(0,u.defaultSchema)({path:(0,d.pathTraversal)(e)})}function j({repoPath:e,logger:t}){const a=(0,l.default)(e),i=(0,c.withTimeout)(new c.Mutex,3e3,new Error("Request timed out"));return async function(o,l){let c;try{c=await i.acquire();const{body:t}=o;if("info"===t.action)return void l.json({repo:r.default.basename(e),publish_modes:["simple","editorial_workflow"],type:"local_git"});const{branch:u}=t.params;if(!await b(a,u)){const e=`Default branch '${u}' doesn't exist`;return void l.status(422).json({error:e})}switch(t.action){case"entriesByFolder":{const i=t.params,{folder:r,extension:n,depth:s}=i,o=await g(a,u,()=>(0,p.listRepoFiles)(e,r,n,s).then(t=>(0,f.entriesFromFiles)(e,t.map(e=>({path:e})))));l.json(o);break}case"entriesByFiles":{const i=t.params,r=await g(a,u,()=>(0,f.entriesFromFiles)(e,i.files));l.json(r);break}case"getEntry":{const i=t.params,[r]=await g(a,u,()=>(0,f.entriesFromFiles)(e,[{path:i.path}]));l.json(r);break}case"unpublishedEntries":{const e=await a.branchLocal().then(e=>e.all.filter(e=>e.startsWith(`${s.CMS_BRANCH_PREFIX}/`)));l.json(e.map(s.contentKeyFromBranch));break}case"unpublishedEntry":{let{id:i,collection:r,slug:n,cmsLabelPrefix:o}=t.params;i&&({collection:r,slug:n}=(0,s.parseContentKey)(i));const c=(0,s.generateContentKey)(r,n),d=(0,s.branchFromContentKey)(c);if(!await b(a,d))return l.status(404).json({message:"Not Found"});{const t=await F(a,u,d),i=await a.raw(["config",y(d)]),c=i&&(0,s.labelToStatus)(i.trim(),o||""),f=t.length>=0?await g(a,d,async()=>(await Promise.all(t.map(({newPath:t})=>(0,p.getUpdateDate)(e,t)))).reduce((e,t)=>e>t?e:t)):new Date,m={collection:r,slug:n,status:c,diffs:t,updatedAt:f};l.json(m)}break}case"unpublishedEntryDataFile":{const{path:i,collection:r,slug:n}=t.params,o=(0,s.generateContentKey)(r,n),c=(0,s.branchFromContentKey)(o),[u]=await g(a,c,()=>(0,f.entriesFromFiles)(e,[{path:i}]));l.json({data:u.data});break}case"unpublishedEntryMediaFile":{const{path:i,collection:r,slug:n}=t.params,o=(0,s.generateContentKey)(r,n),c=(0,s.branchFromContentKey)(o),u=await g(a,c,()=>(0,f.readMediaFile)(e,i));l.json(u);break}case"deleteUnpublishedEntry":{const{collection:e,slug:i}=t.params,r=(0,s.generateContentKey)(e,i),n=(0,s.branchFromContentKey)(r);await h(a)===n&&await a.checkoutLocalBranch(u),await a.branch(["-D",n]),l.json({message:`deleted branch: ${n}`});break}case"persistEntry":{const{cmsLabelPrefix:i,entry:o,dataFiles:c=[o],assets:d,options:p}=t.params;if(p.useWorkflow){const t=c[0].slug,o=p.collectionName,l=(0,s.generateContentKey)(o,t),f=(0,s.branchFromContentKey)(l);await g(a,u,async()=>{const t=await b(a,f);t?await a.checkout(f):await a.checkoutLocalBranch(f),await async function(e,t){const a=await e.raw(["config","commit.gpgsign"]);try{"true"===a&&await e.addConfig("commit.gpgsign","false"),await e.rebase([t,"--no-verify"])}finally{"true"===a&&await e.addConfig("commit.gpgsign",a)}}(a,u);const o=(await F(a,u,f)).filter(e=>e.binary&&!d.map(e=>e.path).includes(e.path));if(await Promise.all(o.map(t=>n.promises.unlink(r.default.join(e,t.path)))),await w(a,e,c,d,p.commitMessage),!t){const e=(0,s.statusToLabel)(p.status,i||"");await a.addConfig(y(f),e)}})}else await g(a,u,async()=>{await w(a,e,c,d,p.commitMessage)});l.json({message:"entry persisted"});break}case"updateUnpublishedEntryStatus":{const{collection:e,slug:i,newStatus:r,cmsLabelPrefix:n}=t.params,o=(0,s.generateContentKey)(e,i),c=(0,s.branchFromContentKey)(o),d=(0,s.statusToLabel)(r,n||"");await a.addConfig(y(c),d),l.json({message:`${u} description was updated to ${d}`});break}case"publishUnpublishedEntry":{const{collection:e,slug:i}=t.params,r=(0,s.generateContentKey)(e,i),n=(0,s.branchFromContentKey)(r);await async function(e,t,a){const i=await e.raw(["config","commit.gpgsign"]);try{"true"===i&&await e.addConfig("commit.gpgsign","false"),await e.mergeFromTo(t,a)}finally{"true"===i&&await e.addConfig("commit.gpgsign",i)}}(a,n,u),await a.deleteLocalBranch(n),l.json({message:`branch ${n} merged to ${u}`});break}case"getMedia":{const{mediaFolder:i}=t.params,r=await g(a,u,async()=>{const t=await(0,p.listRepoFiles)(e,i,"",1);return await Promise.all(t.map(t=>(0,f.readMediaFile)(e,t)))});l.json(r);break}case"getMediaFile":{const{path:i}=t.params,r=await g(a,u,()=>(0,f.readMediaFile)(e,i));l.json(r);break}case"persistMedia":{const{asset:i,options:{commitMessage:n}}=t.params,s=await g(a,u,async()=>(await(0,p.writeFile)(r.default.join(e,i.path),Buffer.from(i.content,i.encoding)),await m(a,n),(0,f.readMediaFile)(e,i.path)));l.json(s);break}case"deleteFile":{const{path:i,options:{commitMessage:r}}=t.params;await g(a,u,async()=>{await(0,p.deleteFile)(e,i),await m(a,r)}),l.json({message:`deleted file ${i}`});break}case"deleteFiles":{const{paths:i,options:{commitMessage:r}}=t.params;await g(a,u,async()=>{await Promise.all(i.map(t=>(0,p.deleteFile)(e,t))),await m(a,r)}),l.json({message:`deleted files ${i.join(", ")}`});break}case"getDeployPreview":l.json(null);break;default:{const e=`Unknown action ${t.action}`;l.status(422).json({error:e});break}}}catch(e){t.error(`Error handling ${JSON.stringify(o.body)}: ${e instanceof Error?e.message:"Unknown error"}`),l.status(500).json({error:"Unknown error"})}finally{c&&c()}}}t.validateRepo=v,t.getSchema=M,t.localGitMiddleware=j,t.registerMiddleware=async function(e,t){const{logger:a}=t,i=r.default.resolve(process.env.GIT_REPO_DIRECTORY||process.cwd());await v({repoPath:i}),e.post("/api/v1",(0,u.joi)(M({repoPath:i}))),e.post("/api/v1",j({repoPath:i,logger:a})),a.info(`Decap CMS Git Proxy Server configured with ${i}`)}},982:e=>{e.exports=require("crypto")}},t={};function a(i){var r=t[i];if(void 0!==r)return r.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,a),n.exports}var i={};(()=>{var e=i;Object.defineProperty(e,"__esModule",{value:!0}),e.registerLocalFs=e.registerLocalGit=void 0;const t=a(827),r=a(971),n=a(786),s=a(943);function o(e){return{logger:(0,s.createLogger)({level:e.logLevel||"info"})}}e.registerLocalGit=async function(e,a={}){const i=o(a);(0,t.registerCommonMiddlewares)(e,i),await(0,r.registerMiddleware)(e,i)},e.registerLocalFs=async function(e,a={}){const i=o(a);(0,t.registerCommonMiddlewares)(e,i),await(0,n.registerMiddleware)(e,i)}})(),module.exports=i})();
3
3
  //# sourceMappingURL=middlewares.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middlewares.js","mappings":";iCAAAA,EAAOC,QAAUC,QAAQ,S,qMCAzB,kBACA,YACA,SAEA,SAASC,EAAOC,GACd,OAAO,UAAOC,WAAW,UAAUC,OAAOF,GAAQG,OAAO,MAC3D,CAGA,SAASC,EAAcC,GACrB,OAAOA,EAAKC,QAAQ,MAAO,IAC7B,CAEA,mBAAOC,eACLC,EACAC,GAEA,OAAOC,QAAQC,IACbF,EAAMG,IAAIL,MAAMM,IACd,IACE,MAAMC,QAAgB,WAAGC,SAAS,UAAKC,KAAKR,EAAUK,EAAKR,OAC3D,MAAO,CACLY,KAAMH,EAAQI,WACdL,KAAM,CAAER,KAAMD,EAAcS,EAAKR,MAAOc,MAAON,EAAKM,MAAOC,GAAIrB,EAAOe,I,CAExE,MAAOO,GACP,MAAO,CACLJ,KAAM,KACNJ,KAAM,CAAER,KAAMD,EAAcS,EAAKR,MAAOc,MAAON,EAAKM,MAAOC,GAAI,M,IAKzE,EAEA,gBAAOb,eAA6BC,EAAkBK,GACpD,MAAMS,EAAW,SACXtB,QAAe,WAAGe,SAAS,UAAKC,KAAKR,EAAUK,IAGrD,MAAO,CACLO,GAHSrB,EAAOC,GAIhBc,QAASd,EAAOkB,SAASI,GACzBA,WACAjB,KAAMD,EAAcS,GACpBU,KAAM,UAAKC,SAASX,GAExB,C,UC/CAjB,EAAOC,QAAUC,QAAQ,U,cCMzB,SAAS2B,EAAeC,GACtB,OAAOA,GAH8B,YAIvC,C,uPARa,EAAAC,kBAAoB,MACpB,EAAAC,gBAAkB,uCAClB,EAAAC,qBAAuB,gDAQpC,sBAA2BV,EAAeO,GACxC,OAAOP,EAAMW,WAAWL,EAAeC,GACzC,EAEA,yBAA8BP,EAAeO,GAC3C,OAAOP,EAAMY,MAAMN,EAAeC,GAAaM,OACjD,EAEA,yBAA8BC,EAAgBP,GAC5C,MAAO,GAAGD,EAAeC,KAAeO,GAC1C,EAEA,8BAAmCC,EAAwBC,GACzD,MAAO,GAAGD,KAAkBC,GAC9B,EAEA,2BAAgCC,GAC9B,MAAMC,EAAQD,EAAWE,QAAQ,KACjC,MAAO,CAAEC,WAAYH,EAAWL,MAAM,EAAGM,GAAQF,KAAMC,EAAWL,MAAMM,EAAQ,GAClF,EAEA,gCAAqCG,GACnC,OAAOA,EAAOT,MAAM,GAAG,EAAAJ,qBAAqBK,OAC9C,EAEA,gCAAqCI,GACnC,MAAO,GAAG,EAAAT,qBAAqBS,GACjC,C,UCrCAxC,EAAOC,QAAUC,QAAQ,U,UCAzBF,EAAOC,QAAUC,QAAQ,gB,UCAzBF,EAAOC,QAAUC,QAAQ,c,kOCAzB,kBACA,SAEAS,eAAekC,EAAUC,EAAaC,EAAmBC,GACvD,GAAIA,GAAS,EACX,MAAO,GAGT,IACE,MAAMC,QAAgB,WAAGC,QAAQJ,EAAK,CAAEK,eAAe,IACjDtC,QAAcC,QAAQC,IAC1BkC,EAAQjC,IAAIoC,IACV,MAAMC,EAAM,UAAKjC,KAAK0B,EAAKM,EAAOzB,MAClC,OAAOyB,EAAOE,cACVT,EAAUQ,EAAKN,EAAWC,EAAQ,GAClC,CAACK,GAAKE,OAAOC,GAAKA,EAAEC,SAASV,OAGrC,MAAQ,GAAgBW,UAAU7C,E,CAClC,MAAOY,GACP,MAAO,E,CAEX,CAqBAd,eAAegD,EAASC,EAAcC,SAC9B,WAAGC,MAAM,UAAKC,QAAQF,GAAK,CAAEG,WAAW,UACxC,WAAGC,OAAOL,EAAMC,EACxB,CAtBA,gBAAOlD,eACLC,EACAsD,EACAnB,EACAC,GAGA,aADoBH,EAAU,UAAKzB,KAAKR,EAAUsD,GAASnB,EAAWC,IACzDhC,IAAIwC,GAAKA,EAAErB,MAAMvB,EAASwB,OAAS,GAClD,EAEA,YAAOzB,eAAyBwD,EAAkBjD,SAC1C,WAAG4C,MAAM,UAAKC,QAAQI,GAAW,CAAEH,WAAW,UAC9C,WAAGI,UAAUD,EAAUjD,EAC/B,EAEA,aAAOP,eAA0BC,EAAkBuD,SAC3C,WAAGE,OAAO,UAAKjD,KAAKR,EAAUuD,IAAWG,MAAM,OACvD,EAOA,OAAO3D,eAAoBiD,EAAcC,SAEjCF,EAASC,EAAMC,GAGrB,MAAMU,EAAY,UAAKR,QAAQH,GACzBY,EAAU,UAAKT,QAAQF,GACvBY,QAAiB5B,EAAU0B,EAAW,GAAI,WAC1CzD,QAAQC,IAAI0D,EAASzD,IAAIC,GAAQ0C,EAAS1C,EAAMA,EAAKP,QAAQ6D,EAAWC,KAChF,EAEA,gBAAO7D,eAA6BC,EAAkBuD,GACpD,OAAO,WACJO,KAAK,UAAKtD,KAAKR,EAAUuD,IACzBQ,KAAKD,GAAQA,EAAKE,OAClBN,MAAM,IAAM,IAAIO,KACrB,C,UChEA7E,EAAOC,QAAUC,QAAQ,O,UCAzBF,EAAOC,QAAUC,QAAQ,Y,kLCAzB,kBACA,YAEA,yBAA8BU,GAC5B,OAAO,UAAIkE,OAAO,CAChBC,KAAM,OACNC,KAAM,UAAIC,SAASC,WACnBC,SAAU,CACR,eAAgB,qEAElB,QAAAC,CAASC,EAAOC,GAEd,IADqB,UAAKlE,KAAKR,EAAUyE,GACvBnD,WAAWtB,GAC3B,MAAO,CAAEyE,QAAOE,OAAQD,EAAQE,MAAM,gBAE1C,IACC/E,MACL,C,uNCjBA,kBAEA,SACA,SACA,SACA,SAsBA,SAAgBgF,GAAkB,SAAE7E,EAAQ,OAAE8E,IAC5C,OAAO/E,eAAgBgF,EAAsBtC,GAC3C,IACE,MAAM,KAAEuC,GAASD,EAEjB,OAAQC,EAAKC,QACX,IAAK,OACHxC,EAAIyC,KAAK,CACPC,KAAM,UAAKnE,SAAShB,GACpBoF,cAAe,CAAC,UAChBjB,KAAM,aAER,MAEF,IAAK,kBAAmB,CACtB,MAAMkB,EAAUL,EAAKM,QACf,OAAEhC,EAAM,UAAEnB,EAAS,MAAEC,GAAUiD,EAC/BE,QAAgB,IAAAC,eAAcxF,EAAUsD,EAAQnB,EAAWC,GAAO2B,KAAK9D,IAC3E,IAAAwF,kBACEzF,EACAC,EAAMG,IAAIC,IAAQ,CAAGR,KAAMQ,OAG/BoC,EAAIyC,KAAKK,GACT,K,CAEF,IAAK,iBAAkB,CACrB,MAAMF,EAAUL,EAAKM,OACfC,QAAgB,IAAAE,kBAAiBzF,EAAUqF,EAAQpF,OACzDwC,EAAIyC,KAAKK,GACT,K,CAEF,IAAK,WAAY,CACf,MAAMF,EAAUL,EAAKM,QACdI,SAAe,IAAAD,kBAAiBzF,EAAU,CAAC,CAAEH,KAAMwF,EAAQxF,QAClE4C,EAAIyC,KAAKQ,GACT,K,CAEF,IAAK,eAAgB,CACnB,MAAM,MACJA,EAAK,UACLC,EAAY,CAACD,GAAkB,OAC/BE,GACEZ,EAAKM,aACHpF,QAAQC,IACZwF,EAAUvF,IAAIyF,IAAY,IAAArC,WAAU,UAAKhD,KAAKR,EAAU6F,EAAShG,MAAOgG,EAASC,aAG7E5F,QAAQC,IACZyF,EAAOxF,IAAI2F,IACT,IAAAvC,WAAU,UAAKhD,KAAKR,EAAU+F,EAAElG,MAAOmG,OAAOhD,KAAK+C,EAAEzF,QAASyF,EAAEjF,aAGhE6E,EAAUM,MAAMJ,GAAYA,EAASK,UACvCP,EAAUQ,QAAQpG,MAAM8F,UAChB,IAAAO,MACJ,UAAK5F,KAAKR,EAAU6F,EAAShG,MAC7B,UAAKW,KAAKR,EAAU6F,EAASK,YAInCzD,EAAIyC,KAAK,CAAEmB,QAAS,oBACpB,K,CAEF,IAAK,WAAY,CACf,MAAM,YAAEC,GAAgBtB,EAAKM,OACvBrF,QAAc,IAAAuF,eAAcxF,EAAUsG,EAAa,GAAI,GACvDC,QAAmBrG,QAAQC,IAAIF,EAAMG,IAAIC,IAAQ,IAAAmG,eAAcxG,EAAUK,KAC/EoC,EAAIyC,KAAKqB,GACT,K,CAEF,IAAK,eAAgB,CACnB,MAAM,KAAE1G,GAASmF,EAAKM,OAChBmB,QAAkB,IAAAD,eAAcxG,EAAUH,GAChD4C,EAAIyC,KAAKuB,GACT,K,CAEF,IAAK,eAAgB,CACnB,MAAM,MAAEC,GAAU1B,EAAKM,aACjB,IAAA9B,WACJ,UAAKhD,KAAKR,EAAU0G,EAAM7G,MAC1BmG,OAAOhD,KAAK0D,EAAMpG,QAASoG,EAAM5F,WAEnC,MAAMT,QAAa,IAAAmG,eAAcxG,EAAU0G,EAAM7G,MACjD4C,EAAIyC,KAAK7E,GACT,K,CAEF,IAAK,aAAc,CACjB,MAAQR,KAAM0D,GAAayB,EAAKM,aAC1B,IAAAqB,YAAW3G,EAAUuD,GAC3Bd,EAAIyC,KAAK,CAAEmB,QAAS,gBAAgB9C,MACpC,K,CAEF,IAAK,cAAe,CAClB,MAAM,MAAEqD,GAAU5B,EAAKM,aACjBpF,QAAQC,IAAIyG,EAAMxG,IAAImD,IAAY,IAAAoD,YAAW3G,EAAUuD,KAC7Dd,EAAIyC,KAAK,CAAEmB,QAAS,iBAAiBO,EAAMpG,KAAK,UAChD,K,CAEF,IAAK,mBACHiC,EAAIyC,KAAK,MACT,MAEF,QAAS,CACP,MAAMmB,EAAU,kBAAkBrB,EAAKC,SACvCxC,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAOyB,IAC9B,K,GAGJ,MAAOxF,GACPiE,EAAOF,MACL,kBAAkBiC,KAAKC,UAAU/B,EAAIC,UACnCnE,aAAakG,MAAQlG,EAAEwF,QAAU,mBAGrC5D,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAO,iB,CAElC,CACF,CAEA,SAAgBoC,GAAU,SAAEhH,IAE1B,OADe,IAAAiH,eAAc,CAAEpH,MAAM,IAAAqH,eAAclH,IAErD,CA3HA,sBAwHA,cASA,qBAAOD,eAAkCoH,EAAsBC,GAC7D,MAAM,OAAEtC,GAAWsC,EACbpH,EAAW,UAAKqH,QAAQC,QAAQC,IAAIC,oBAAsBF,QAAQG,OACxEN,EAAIO,KAAK,WAAW,IAAAC,KAAIX,EAAU,CAAEhH,eACpCmH,EAAIO,KAAK,UAAW7C,EAAkB,CAAE7E,WAAU8E,YAClDA,EAAO8C,KAAK,sDAAsD5H,IACpE,C,UClKAZ,EAAOC,QAAUC,QAAQ,a,8LCAzB,kBACA,WACA,YAQA,qCAA0C6H,EAAsBC,GAC9D,MAAM,OAAEtC,GAAWsC,EACbS,EAAS,CACbC,MAAQzB,IACNvB,EAAOiD,MAAMC,OAAO3B,GAAS4B,UAGjCd,EAAIe,KAAI,aAAO,WAAY,CAAEL,YAC7BV,EAAIe,KAAI,gBACRf,EAAIe,IAAI,UAAQhD,KAAK,CAAEiD,MAAO,SAChC,C,UCpBA/I,EAAOC,QAAUC,QAAQ,K,UCAzBF,EAAOC,QAAUC,QAAQ,O,iLCAzB,mBAEM,QAAE8I,EAAO,SAAEC,EAAQ,OAAEC,GAAW,UAAQC,OAM9C,yBAA6B,MAAEC,IAC7B,OAAO,UAAQC,aAAa,CAC1BD,QACAD,OAAQH,EAAQC,IAAYC,KAC5BI,WAAY,CAAC,IAAI,UAAQA,WAAWC,UAExC,C,wLCdA,kBAIMC,EAAiB,CACrB,OACA,kBACA,iBACA,WACA,qBACA,mBACA,2BACA,4BACA,yBACA,eACA,+BACA,0BACA,WACA,eACA,eACA,aACA,cACA,oBAGIC,EAAiB,UAAIxE,SAASC,WAC9BwE,EAAiB,UAAIC,SAASzE,WAC9B0E,EAAe,UAAIC,OAAO3E,WAE1BvC,EAAa8G,EACblH,EAAOkH,EAEb,0BAA8B,KAAEhJ,EAAOgJ,GAAmB,CAAC,GACzD,MAAMK,EAAgB,UAAIC,OAAO,CAC/BnH,OAAQ6G,IAGJnC,EAAQ,UAAIyC,OAAO,CACvBtJ,OACAS,QAASuI,EACT/H,SAAU+H,EAAeO,MAAM,YAG3BvD,EAAW,UAAIsD,OAAO,CAC1BxH,KAAMkH,EACNhJ,OACAiG,IAAK+C,EACL3C,QAASrG,EAAKwJ,aAGV/D,EAAS,UAAIgE,KAAK,SAAU,CAChCC,OAAQ,CACN,CACEC,GAAI,OACJzF,KAAM,UAAI0F,SAEZ,CACED,GAAI,kBACJzF,KAAMmF,EACHQ,KAAK,CACJpG,OAAQzD,EACRsC,UAAW0G,EACXzG,MAAO0G,IAERxE,YAEL,CACEkF,GAAI,iBACJzF,KAAMmF,EAAcQ,KAAK,CACvBzJ,MAAO,UAAI0J,QACRC,MAAM,UAAIT,OAAO,CAAEtJ,OAAMc,MAAO,UAAI0D,YACpCC,cAGP,CACEkF,GAAI,WACJzF,KAAMmF,EACHQ,KAAK,CACJ7J,SAEDyE,YAEL,CACEkF,GAAI,qBACJzF,KAAMmF,EAAcQ,KAAK,CAAE1H,OAAQ6G,IAAkBvE,YAEvD,CACEkF,GAAI,mBACJzF,KAAMmF,EACHQ,KAAK,CACJ9I,GAAI,UAAIyD,SAASgF,WACjBtH,WAAY,UAAIsC,SAASgF,WACzB1H,KAAM,UAAI0C,SAASgF,WACnBQ,eAAgB,UAAIxF,SAASgF,aAE9B/E,YAEL,CACEkF,GAAI,2BACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,OACAf,GAAIiI,EACJhJ,KAAMgJ,IAEPvE,YAEL,CACEkF,GAAI,4BACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,OACAf,GAAIiI,EACJhJ,KAAMgJ,IAEPvE,YAEL,CACEkF,GAAI,yBACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,SAED2C,YAEL,CACEkF,GAAI,eACJzF,KAAMmF,EACHQ,KAAK,CACJG,eAAgB,UAAIxF,SAASgF,WAC7B3D,MAAOG,EACPF,UAAW,UAAIgE,QAAQC,MAAM/D,GAC7BD,OAAQ,UAAI+D,QAAQC,MAAMlD,GAAOpC,WACjC8C,QAAS,UAAI+B,OAAO,CAClBzH,eAAgB,UAAI2C,SACpByF,cAAejB,EACfkB,YAAaf,EACbvH,OAAQoH,IACPvE,aAEJ0F,IAAI,QAAS,aACb1F,YAEL,CACEkF,GAAI,+BACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,OACAsI,UAAWpB,EACXgB,eAAgB,UAAIxF,SAASgF,aAE9B/E,YAEL,CACEkF,GAAI,0BACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,SAED2C,YAEL,CACEkF,GAAI,WACJzF,KAAMmF,EACHQ,KAAK,CACJpD,YAAazG,IAEdyE,YAEL,CACEkF,GAAI,eACJzF,KAAMmF,EACHQ,KAAK,CACJ7J,SAEDyE,YAEL,CACEkF,GAAI,eACJzF,KAAMmF,EACHQ,KAAK,CACJhD,MAAOA,EAAMpC,WACb8C,QAAS,UAAI+B,OAAO,CAClBW,cAAejB,IACdvE,aAEJA,YAEL,CACEkF,GAAI,aACJzF,KAAMmF,EACHQ,KAAK,CACJ7J,OACAuH,QAAS,UAAI+B,OAAO,CAClBW,cAAejB,IACdvE,aAEJA,YAEL,CACEkF,GAAI,cACJzF,KAAMmF,EACHQ,KAAK,CACJ9C,MAAO,UAAI+C,QAAQC,MAAM/J,GAAMqK,IAAI,GAAG5F,WACtC8C,QAAS,UAAI+B,OAAO,CAClBW,cAAejB,IACdvE,aAEJA,YAEL,CACEkF,GAAI,mBACJzF,KAAMmF,EACHQ,KAAK,CACJ3H,aACAJ,SAED2C,aAGP6F,UAAW,UAAIC,cAGjB,OAAO,UAAIjB,OAAO,CAChBlE,OAAQ,UAAImE,SAASR,GAAgBtE,WACrCgB,UAEJ,EAEA,eAAoB+E,GAClB,MAAO,CAACtF,EAAsBtC,EAAuB6H,KACnD,MAAM,MAAE1F,GAAUyF,EAAO7F,SAASO,EAAIC,KAAM,CAAEuF,cAAc,IAC5D,GAAI3F,EAAO,CACT,MAAM,QAAE4F,GAAY5F,EACdyB,EAAUmE,EAAQpK,IAAIqK,GAAKA,EAAEpE,SAAS7F,KAAK,KACjDiC,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAOyB,G,MAE9BiE,IAGN,C,uOCrPA,kBACA,SACA,SASA,SAEA,YACA,SAEA,SACA,SACA,SACA,SA0BAvK,eAAe2K,EAAOC,EAAgBb,SAC9Ba,EAAIC,IAAI,WACRD,EAAID,OAAOZ,OAAee,EAAW,CAGzC,cAAe,KACf,gBAAiB,MAErB,CAEA9K,eAAe+K,EAAiBH,GAE9B,aAD4BA,EAAII,cAAchH,KAAKiH,GAAWA,EAAQC,QAExE,CAEAlL,eAAemL,EAAeP,EAAgB3I,EAAgBmJ,GAC5D,MAAMC,QAAsBN,EAAiBH,GAC7C,IAKE,OAJIS,IAAkBpJ,SACd2I,EAAIU,SAASrJ,SAEAmJ,G,eAGfR,EAAIU,SAASD,E,CAEvB,CAEA,SAASE,EAAkBtJ,GACzB,MAAO,UAAUA,eACnB,CAOAjC,eAAewL,EACbZ,EACA3K,EACA2F,EACAC,EACAkE,SAGM5J,QAAQC,IACZwF,EAAUvF,IAAIyF,IAAY,IAAArC,WAAU,UAAKhD,KAAKR,EAAU6F,EAAShG,MAAOgG,EAASC,aAG7E5F,QAAQC,IACZyF,EAAOxF,IAAI2F,IAAK,IAAAvC,WAAU,UAAKhD,KAAKR,EAAU+F,EAAElG,MAAOmG,OAAOhD,KAAK+C,EAAEzF,QAASyF,EAAEjF,aAE9E6E,EAAUM,MAAMJ,GAAYA,EAASK,UACvCP,EAAUQ,QAAQpG,MAAM8F,UAChB,IAAAO,MAAK,UAAK5F,KAAKR,EAAU6F,EAAShG,MAAO,UAAKW,KAAKR,EAAU6F,EAASK,kBAK1EwE,EAAOC,EAAKb,EACpB,CA8BA/J,eAAeyL,EAAeb,EAAgB3I,GAE5C,aAD2B2I,EAAII,cAAchH,KAAK,EAAG5D,SAAUA,EAAIsL,SAASzJ,GAE9E,CAEAjC,eAAe2L,EAASf,EAAgBgB,EAAgBC,GACtD,MAAMC,QAAgBlB,EAAImB,KAAK,CAACH,EAAQC,IAexC,OAdc,IAAAG,OAAMF,GAASzL,IAAI4L,I,QAC/B,MAAMC,GAAmB,QAAT,EAAAD,EAAEC,eAAO,eAAEnM,QAAQ,MAAO,MAAO,GAC3CoG,GAAmB,QAAT,EAAA8F,EAAE9F,eAAO,eAAEpG,QAAQ,MAAO,MAAO,GAC3CD,EAAOqG,GAAY+F,EACzB,MAAO,CACLA,UACA/F,UACAzE,OAAQuK,EAAEvK,OACVyK,QAAsB,UAAbF,EAAEvK,OACX5B,OACAe,GAAIf,EACJsM,OAAQH,EAAEG,QAAU,QAAQC,KAAKvM,KAIvC,CAEOE,eAAesM,GAAa,SAAErM,IACnC,MAAM2K,GAAM,aAAU3K,GAEtB,UADqB2K,EAAI2B,cAEvB,MAAMvF,MAAM,GAAG/G,kCAEnB,CAEA,SAAgBgH,GAAU,SAAEhH,IAE1B,OADe,IAAAiH,eAAc,CAAEpH,MAAM,IAAAqH,eAAclH,IAErD,CAEA,SAAgBuM,GAAmB,SAAEvM,EAAQ,OAAE8E,IAC7C,MAAM6F,GAAM,aAAU3K,GAGhBwM,GAAQ,IAAAC,aAAY,IAAI,EAAAC,MAAS,IAAM,IAAI3F,MAAM,sBAEvD,OAAOhH,eAAgBgF,EAAsBtC,GAC3C,IAAIkK,EACJ,IACEA,QAAgBH,EAAMI,UACtB,MAAM,KAAE5H,GAASD,EACjB,GAAoB,SAAhBC,EAAKC,OAMP,YALAxC,EAAIyC,KAAK,CACPC,KAAM,UAAKnE,SAAShB,GACpBoF,cAAe,CAAC,SAAU,sBAC1BjB,KAAM,cAIV,MAAM,OAAEnC,GAAWgD,EAAKM,OAGxB,UAD2BkG,EAAeb,EAAK3I,GAC5B,CACjB,MAAMqE,EAAU,mBAAmBrE,mBAEnC,YADAS,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAOyB,G,CAIhC,OAAQrB,EAAKC,QACX,IAAK,kBAAmB,CACtB,MAAMI,EAAUL,EAAKM,QACf,OAAEhC,EAAM,UAAEnB,EAAS,MAAEC,GAAUiD,EAC/BE,QAAgB2F,EAAYP,EAAK3I,EAAQ,KAC7C,IAAAwD,eAAcxF,EAAUsD,EAAQnB,EAAWC,GAAO2B,KAAK9D,IACrD,IAAAwF,kBACEzF,EACAC,EAAMG,IAAIC,IAAQ,CAAGR,KAAMQ,QAIjCoC,EAAIyC,KAAKK,GACT,K,CAEF,IAAK,iBAAkB,CACrB,MAAMF,EAAUL,EAAKM,OACfC,QAAgB2F,EAAYP,EAAK3I,EAAQ,KAC7C,IAAAyD,kBAAiBzF,EAAUqF,EAAQpF,QAErCwC,EAAIyC,KAAKK,GACT,K,CAEF,IAAK,WAAY,CACf,MAAMF,EAAUL,EAAKM,QACdI,SAAewF,EAAYP,EAAK3I,EAAQ,KAC7C,IAAAyD,kBAAiBzF,EAAU,CAAC,CAAEH,KAAMwF,EAAQxF,SAE9C4C,EAAIyC,KAAKQ,GACT,K,CAEF,IAAK,qBAAsB,CACzB,MAAMmH,QAAoBlC,EACvBI,cACAhH,KAAK+I,GAAUA,EAAO3M,IAAIwC,OAAOoK,GAAKA,EAAEzL,WAAW,GAAG,EAAAH,wBACzDsB,EAAIyC,KAAK2H,EAAYzM,IAAI,EAAA4M,uBACzB,K,CAEF,IAAK,mBAAoB,CACvB,IAAI,GAAEpM,EAAE,WAAEmB,EAAU,KAAEJ,EAAI,eAAEkI,GAAmB7E,EAAKM,OAChD1E,KACCmB,aAAYJ,SAAS,IAAAsL,iBAAgBrM,IAE1C,MAAMgB,GAAa,IAAAsL,oBAAmBnL,EAAsBJ,GACtDwL,GAAY,IAAAC,sBAAqBxL,GAEvC,UAD2B4J,EAAeb,EAAKwC,GAyB7C,OAAO1K,EAAIhB,OAAO,KAAKyD,KAAK,CAAEmB,QAAS,cAxBvB,CAChB,MAAMgH,QAAc3B,EAASf,EAAK3I,EAAQmL,GACpCxM,QAAcgK,EAAI7E,IAAI,CAAC,SAAUwF,EAAkB6B,KACnD1L,EAASd,IAAS,IAAA2M,eAAc3M,EAAMsH,OAAQ4B,GAAkB,IAChE0D,EACJF,EAAM7L,QAAU,QACN0J,EAAYP,EAAKwC,EAAWpN,gBACZG,QAAQC,IAC1BkN,EAAMjN,IAAI,EAAG8F,cAAc,IAAAsH,eAAcxN,EAAUkG,MAExCuH,OAAO,CAAC1H,EAAGgH,IACfhH,EAAIgH,EAAIhH,EAAIgH,IAGvB,IAAI9I,KACJyJ,EAAmB,CACvB3L,aACAJ,OACAF,SACA4L,QACAE,aAEF9K,EAAIyC,KAAKwI,E,CAIX,K,CAEF,IAAK,2BAA4B,CAC/B,MAAM,KAAE7N,EAAI,WAAEkC,EAAU,KAAEJ,GAASqD,EAAKM,OAClC1D,GAAa,IAAAsL,oBAAmBnL,EAAsBJ,GACtDwL,GAAY,IAAAC,sBAAqBxL,IAChC8D,SAAewF,EAAYP,EAAKwC,EAAW,KAChD,IAAA1H,kBAAiBzF,EAAU,CAAC,CAAEH,WAEhC4C,EAAIyC,KAAK,CAAEzE,KAAMiF,EAAMjF,OACvB,K,CAEF,IAAK,4BAA6B,CAChC,MAAM,KAAEZ,EAAI,WAAEkC,EAAU,KAAEJ,GAASqD,EAAKM,OAClC1D,GAAa,IAAAsL,oBAAmBnL,EAAsBJ,GACtDwL,GAAY,IAAAC,sBAAqBxL,GACjCvB,QAAa6K,EAAYP,EAAKwC,EAAW,KAAM,IAAA3G,eAAcxG,EAAUH,IAC7E4C,EAAIyC,KAAK7E,GACT,K,CAEF,IAAK,yBAA0B,CAC7B,MAAM,WAAE0B,EAAU,KAAEJ,GAASqD,EAAKM,OAC5B1D,GAAa,IAAAsL,oBAAmBnL,EAAYJ,GAC5CwL,GAAY,IAAAC,sBAAqBxL,SACXkJ,EAAiBH,KACvBwC,SACdxC,EAAIgD,oBAAoB3L,SAE1B2I,EAAI3I,OAAO,CAAC,KAAMmL,IACxB1K,EAAIyC,KAAK,CAAEmB,QAAS,mBAAmB8G,MACvC,K,CAEF,IAAK,eAAgB,CACnB,MAAM,eACJtD,EAAc,MACdnE,EAAK,UACLC,EAAY,CAACD,GAAkB,OAC/BE,EAAM,QACNwB,GACEpC,EAAKM,OAET,GAAK8B,EAAQ2C,YAIN,CACL,MAAMpI,EAAOgE,EAAU,GAAGhE,KACpBI,EAAaqF,EAAQ1F,eACrBE,GAAa,IAAAsL,oBAAmBnL,EAAYJ,GAC5CwL,GAAY,IAAAC,sBAAqBxL,SACjCsJ,EAAYP,EAAK3I,EAAQjC,UAC7B,MAAM6N,QAAqBpC,EAAeb,EAAKwC,GAC3CS,QACIjD,EAAIU,SAAS8B,SAEbxC,EAAIgD,oBAAoBR,SA5N9CpN,eAAsB4K,EAAgB3I,GACpC,MAAM6L,QAAgBlD,EAAI7E,IAAI,CAAC,SAAU,mBACzC,IACkB,SAAZ+H,SACIlD,EAAImD,UAAU,iBAAkB,eAElCnD,EAAIoD,OAAO,CAAC/L,EAAQ,e,SAEV,SAAZ6L,SACIlD,EAAImD,UAAU,iBAAkBD,E,CAG5C,CAkNoBE,CAAOpD,EAAK3I,GAClB,MAEMgM,SAFctC,EAASf,EAAK3I,EAAQmL,IAEnBxK,OACrBqJ,GAAKA,EAAEG,SAAWvG,EAAOxF,IAAI2F,GAAKA,EAAElG,MAAM4L,SAASO,EAAEnM,OAMvD,SAJMK,QAAQC,IAAI6N,EAAS5N,IAAIwC,GAAK,WAAGa,OAAO,UAAKjD,KAAKR,EAAU4C,EAAE/C,eAC9D0L,EAAYZ,EAAK3K,EAAU2F,EAAWC,EAAQwB,EAAQ0C,gBAGvD8D,EAAc,CACjB,MAAMK,GAAc,IAAAC,eAAc9G,EAAQ3F,OAAQoI,GAAkB,UAC9Dc,EAAImD,UAAUxC,EAAkB6B,GAAYc,E,eA3BhD/C,EAAYP,EAAK3I,EAAQjC,gBACvBwL,EAAYZ,EAAK3K,EAAU2F,EAAWC,EAAQwB,EAAQ0C,iBA8BhErH,EAAIyC,KAAK,CAAEmB,QAAS,oBACpB,K,CAEF,IAAK,+BAAgC,CACnC,MAAM,WAAEtE,EAAU,KAAEJ,EAAI,UAAEsI,EAAS,eAAEJ,GACnC7E,EAAKM,OACD1D,GAAa,IAAAsL,oBAAmBnL,EAAYJ,GAC5CwL,GAAY,IAAAC,sBAAqBxL,GACjCqM,GAAc,IAAAC,eAAcjE,EAAWJ,GAAkB,UACzDc,EAAImD,UAAUxC,EAAkB6B,GAAYc,GAClDxL,EAAIyC,KAAK,CAAEmB,QAAS,GAAGrE,gCAAqCiM,MAC5D,K,CAEF,IAAK,0BAA2B,CAC9B,MAAM,WAAElM,EAAU,KAAEJ,GAASqD,EAAKM,OAC5B1D,GAAa,IAAAsL,oBAAmBnL,EAAYJ,GAC5CwL,GAAY,IAAAC,sBAAqBxL,SAhPjD7B,eAAqB4K,EAAgB3H,EAAcC,GACjD,MAAM4K,QAAgBlD,EAAI7E,IAAI,CAAC,SAAU,mBACzC,IACkB,SAAZ+H,SACIlD,EAAImD,UAAU,iBAAkB,eAElCnD,EAAIwD,YAAYnL,EAAMC,E,SAEZ,SAAZ4K,SACIlD,EAAImD,UAAU,iBAAkBD,E,CAG5C,CAqOgBO,CAAMzD,EAAKwC,EAAWnL,SACtB2I,EAAI0D,kBAAkBlB,GAC5B1K,EAAIyC,KAAK,CAAEmB,QAAS,UAAU8G,eAAuBnL,MACrD,K,CAEF,IAAK,WAAY,CACf,MAAM,YAAEsE,GAAgBtB,EAAKM,OACvBiB,QAAmB2E,EAAYP,EAAK3I,EAAQjC,UAChD,MAAME,QAAc,IAAAuF,eAAcxF,EAAUsG,EAAa,GAAI,GAI7D,aAH8BpG,QAAQC,IACpCF,EAAMG,IAAIC,IAAQ,IAAAmG,eAAcxG,EAAUK,OAI9CoC,EAAIyC,KAAKqB,GACT,K,CAEF,IAAK,eAAgB,CACnB,MAAM,KAAE1G,GAASmF,EAAKM,OAChBmB,QAAkByE,EAAYP,EAAK3I,EAAQ,KACxC,IAAAwE,eAAcxG,EAAUH,IAEjC4C,EAAIyC,KAAKuB,GACT,K,CAEF,IAAK,eAAgB,CACnB,MAAM,MACJC,EACAU,SAAS,cAAE0C,IACT9E,EAAKM,OAEHjF,QAAa6K,EAAYP,EAAK3I,EAAQjC,gBACpC,IAAAyD,WACJ,UAAKhD,KAAKR,EAAU0G,EAAM7G,MAC1BmG,OAAOhD,KAAK0D,EAAMpG,QAASoG,EAAM5F,iBAE7B4J,EAAOC,EAAKb,IACX,IAAAtD,eAAcxG,EAAU0G,EAAM7G,QAEvC4C,EAAIyC,KAAK7E,GACT,K,CAEF,IAAK,aAAc,CACjB,MACER,KAAM0D,EACN6D,SAAS,cAAE0C,IACT9E,EAAKM,aACH4F,EAAYP,EAAK3I,EAAQjC,gBACvB,IAAA4G,YAAW3G,EAAUuD,SACrBmH,EAAOC,EAAKb,KAEpBrH,EAAIyC,KAAK,CAAEmB,QAAS,gBAAgB9C,MACpC,K,CAEF,IAAK,cAAe,CAClB,MAAM,MACJqD,EACAQ,SAAS,cAAE0C,IACT9E,EAAKM,aACH4F,EAAYP,EAAK3I,EAAQjC,gBACvBG,QAAQC,IAAIyG,EAAMxG,IAAImD,IAAY,IAAAoD,YAAW3G,EAAUuD,WACvDmH,EAAOC,EAAKb,KAEpBrH,EAAIyC,KAAK,CAAEmB,QAAS,iBAAiBO,EAAMpG,KAAK,UAChD,K,CAEF,IAAK,mBACHiC,EAAIyC,KAAK,MACT,MAEF,QAAS,CACP,MAAMmB,EAAU,kBAAkBrB,EAAKC,SACvCxC,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAOyB,IAC9B,K,GAGJ,MAAOxF,GACPiE,EAAOF,MACL,kBAAkBiC,KAAKC,UAAU/B,EAAIC,UACnCnE,aAAakG,MAAQlG,EAAEwF,QAAU,mBAGrC5D,EAAIhB,OAAO,KAAKyD,KAAK,CAAEN,MAAO,iB,SAE9B+H,GAAWA,G,CAEf,CACF,CAlSA,iBAQA,cAKA,uBA2RA,qBAAO5M,eAAkCoH,EAAsBC,GAC7D,MAAM,OAAEtC,GAAWsC,EACbpH,EAAW,UAAKqH,QAAQC,QAAQC,IAAIC,oBAAsBF,QAAQG,aAClE4E,EAAa,CAAErM,aACrBmH,EAAIO,KAAK,WAAW,IAAAC,KAAIX,EAAU,CAAEhH,eACpCmH,EAAIO,KAAK,UAAW6E,EAAmB,CAAEvM,WAAU8E,YACnDA,EAAO8C,KAAK,8CAA8C5H,IAC5D,C,UC9cAZ,EAAOC,QAAUC,QAAQ,S,GCCrBgP,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB3D,IAAjB4D,EACH,OAAOA,EAAapP,QAGrB,IAAID,EAASkP,EAAyBE,GAAY,CAGjDnP,QAAS,CAAC,GAOX,OAHAqP,EAAoBF,GAAUG,KAAKvP,EAAOC,QAASD,EAAQA,EAAOC,QAASkP,GAGpEnP,EAAOC,OACf,C,oHCtBA,eACA,SACA,SACA,SAQA,SAASuP,EAAcxH,GACrB,MAAO,CACLtC,QAAQ,IAAA2D,cAAa,CAAED,MAAOpB,EAAQyH,UAAY,SAEtD,CAEA,mBAAO9O,eAAgCoH,EAAsBC,EAAmB,CAAC,GAC/E,MAAM0H,EAAOF,EAAcxH,IAC3B,IAAA2H,2BAA0B5H,EAAK2H,SACzB,wBAAS3H,EAAK2H,EACtB,EAEA,kBAAO/O,eAA+BoH,EAAsBC,EAAmB,CAAC,GAC9E,MAAM0H,EAAOF,EAAcxH,IAC3B,IAAA2H,2BAA0B5H,EAAK2H,SACzB,wBAAQ3H,EAAK2H,EACrB,C","sources":["webpack://decap-server/external commonjs \"morgan\"","webpack://decap-server/./src/middlewares/utils/entries.ts","webpack://decap-server/external commonjs \"winston\"","webpack://decap-server/../decap-cms-lib-util/src/APIUtils.ts","webpack://decap-server/external commonjs \"express\"","webpack://decap-server/external commonjs \"what-the-diff\"","webpack://decap-server/external commonjs \"async-mutex\"","webpack://decap-server/./src/middlewares/utils/fs.ts","webpack://decap-server/external commonjs \"cors\"","webpack://decap-server/external commonjs \"@hapi/joi\"","webpack://decap-server/./src/middlewares/joi/customValidators.ts","webpack://decap-server/./src/middlewares/localFs/index.ts","webpack://decap-server/external commonjs \"simple-git\"","webpack://decap-server/./src/middlewares/common/index.ts","webpack://decap-server/external node-commonjs \"fs\"","webpack://decap-server/external node-commonjs \"path\"","webpack://decap-server/./src/logger.ts","webpack://decap-server/./src/middlewares/joi/index.ts","webpack://decap-server/./src/middlewares/localGit/index.ts","webpack://decap-server/external node-commonjs \"crypto\"","webpack://decap-server/webpack/bootstrap","webpack://decap-server/./src/middlewares.ts"],"sourcesContent":["module.exports = require(\"morgan\");","import crypto from 'crypto';\nimport path from 'path';\nimport { promises as fs } from 'fs';\n\nfunction sha256(buffer: Buffer) {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n}\n\n// normalize windows os path format\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nexport async function entriesFromFiles(\n repoPath: string,\n files: { path: string; label?: string }[],\n) {\n return Promise.all(\n files.map(async file => {\n try {\n const content = await fs.readFile(path.join(repoPath, file.path));\n return {\n data: content.toString(),\n file: { path: normalizePath(file.path), label: file.label, id: sha256(content) },\n };\n } catch (e) {\n return {\n data: null,\n file: { path: normalizePath(file.path), label: file.label, id: null },\n };\n }\n }),\n );\n}\n\nexport async function readMediaFile(repoPath: string, file: string) {\n const encoding = 'base64';\n const buffer = await fs.readFile(path.join(repoPath, file));\n const id = sha256(buffer);\n\n return {\n id,\n content: buffer.toString(encoding),\n encoding,\n path: normalizePath(file),\n name: path.basename(file),\n };\n}\n","module.exports = require(\"winston\");","export const CMS_BRANCH_PREFIX = 'cms';\nexport const DEFAULT_PR_BODY = 'Automatically generated by Decap CMS';\nexport const MERGE_COMMIT_MESSAGE = 'Automatically generated. Merged on Decap CMS.';\n\nconst DEFAULT_DECAP_CMS_LABEL_PREFIX = 'decap-cms/';\n\nfunction getLabelPrefix(labelPrefix: string) {\n return labelPrefix || DEFAULT_DECAP_CMS_LABEL_PREFIX;\n}\n\nexport function isCMSLabel(label: string, labelPrefix: string) {\n return label.startsWith(getLabelPrefix(labelPrefix));\n}\n\nexport function labelToStatus(label: string, labelPrefix: string) {\n return label.slice(getLabelPrefix(labelPrefix).length);\n}\n\nexport function statusToLabel(status: string, labelPrefix: string) {\n return `${getLabelPrefix(labelPrefix)}${status}`;\n}\n\nexport function generateContentKey(collectionName: string, slug: string) {\n return `${collectionName}/${slug}`;\n}\n\nexport function parseContentKey(contentKey: string) {\n const index = contentKey.indexOf('/');\n return { collection: contentKey.slice(0, index), slug: contentKey.slice(index + 1) };\n}\n\nexport function contentKeyFromBranch(branch: string) {\n return branch.slice(`${CMS_BRANCH_PREFIX}/`.length);\n}\n\nexport function branchFromContentKey(contentKey: string) {\n return `${CMS_BRANCH_PREFIX}/${contentKey}`;\n}\n","module.exports = require(\"express\");","module.exports = require(\"what-the-diff\");","module.exports = require(\"async-mutex\");","import path from 'path';\nimport { promises as fs } from 'fs';\n\nasync function listFiles(dir: string, extension: string, depth: number): Promise<string[]> {\n if (depth <= 0) {\n return [];\n }\n\n try {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n dirents.map(dirent => {\n const res = path.join(dir, dirent.name);\n return dirent.isDirectory()\n ? listFiles(res, extension, depth - 1)\n : [res].filter(f => f.endsWith(extension));\n }),\n );\n return ([] as string[]).concat(...files);\n } catch (e) {\n return [];\n }\n}\n\nexport async function listRepoFiles(\n repoPath: string,\n folder: string,\n extension: string,\n depth: number,\n) {\n const files = await listFiles(path.join(repoPath, folder), extension, depth);\n return files.map(f => f.slice(repoPath.length + 1));\n}\n\nexport async function writeFile(filePath: string, content: Buffer | string) {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\nexport async function deleteFile(repoPath: string, filePath: string) {\n await fs.unlink(path.join(repoPath, filePath)).catch(() => undefined);\n}\n\nasync function moveFile(from: string, to: string) {\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.rename(from, to);\n}\n\nexport async function move(from: string, to: string) {\n // move file\n await moveFile(from, to);\n\n // move children\n const sourceDir = path.dirname(from);\n const destDir = path.dirname(to);\n const allFiles = await listFiles(sourceDir, '', 100);\n await Promise.all(allFiles.map(file => moveFile(file, file.replace(sourceDir, destDir))));\n}\n\nexport async function getUpdateDate(repoPath: string, filePath: string) {\n return fs\n .stat(path.join(repoPath, filePath))\n .then(stat => stat.mtime)\n .catch(() => new Date());\n}\n","module.exports = require(\"cors\");","module.exports = require(\"@hapi/joi\");","import Joi from '@hapi/joi';\nimport path from 'path';\n\nexport function pathTraversal(repoPath: string) {\n return Joi.extend({\n type: 'path',\n base: Joi.string().required(),\n messages: {\n 'path.invalid': '{{#label}} must resolve to a path under the configured repository',\n },\n validate(value, helpers) {\n const resolvedPath = path.join(repoPath, value);\n if (!resolvedPath.startsWith(repoPath)) {\n return { value, errors: helpers.error('path.invalid') };\n }\n },\n }).path();\n}\n","import path from 'path';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, deleteFile, writeFile, move } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n PersistEntryParams,\n GetMediaParams,\n GetMediaFileParams,\n PersistMediaParams,\n DeleteFileParams,\n DeleteFilesParams,\n DataFile,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\n\ntype FsOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nexport function localFsMiddleware({ repoPath, logger }: FsOptions) {\n return async function (req: express.Request, res: express.Response) {\n try {\n const { body } = req;\n\n switch (body.action) {\n case 'info': {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple'],\n type: 'local_fs',\n });\n break;\n }\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await entriesFromFiles(repoPath, payload.files);\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await entriesFromFiles(repoPath, [{ path: payload.path }]);\n res.json(entry);\n break;\n }\n case 'persistEntry': {\n const {\n entry,\n dataFiles = [entry as DataFile],\n assets,\n } = body.params as PersistEntryParams;\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a =>\n writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding)),\n ),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(\n path.join(repoPath, dataFile.path),\n path.join(repoPath, dataFile.newPath!),\n );\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const mediaFiles = await Promise.all(files.map(file => readMediaFile(repoPath, file)));\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await readMediaFile(repoPath, path);\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const { asset } = body.params as PersistMediaParams;\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n const file = await readMediaFile(repoPath, asset.path);\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const { path: filePath } = body.params as DeleteFileParams;\n await deleteFile(repoPath, filePath);\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const { paths } = body.params as DeleteFilesParams;\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n }\n };\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localFsMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS File System Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"simple-git\");","import express from 'express';\nimport morgan from 'morgan';\nimport cors from 'cors';\n\nimport type winston from 'winston';\n\nexport type Options = {\n logger: winston.Logger;\n};\n\nexport function registerCommonMiddlewares(app: express.Express, options: Options) {\n const { logger } = options;\n const stream = {\n write: (message: string) => {\n logger.debug(String(message).trim());\n },\n };\n app.use(morgan('combined', { stream }));\n app.use(cors());\n app.use(express.json({ limit: '50mb' }));\n}\n","module.exports = require(\"fs\");","module.exports = require(\"path\");","import winston from 'winston';\n\nconst { combine, colorize, simple } = winston.format;\n\ntype LogOptions = {\n level: string;\n};\n\nexport function createLogger({ level }: LogOptions) {\n return winston.createLogger({\n level,\n format: combine(colorize(), simple()),\n transports: [new winston.transports.Console()],\n });\n}\n","import Joi from '@hapi/joi';\n\nimport type express from 'express';\n\nconst allowedActions = [\n 'info',\n 'entriesByFolder',\n 'entriesByFiles',\n 'getEntry',\n 'unpublishedEntries',\n 'unpublishedEntry',\n 'unpublishedEntryDataFile',\n 'unpublishedEntryMediaFile',\n 'deleteUnpublishedEntry',\n 'persistEntry',\n 'updateUnpublishedEntryStatus',\n 'publishUnpublishedEntry',\n 'getMedia',\n 'getMediaFile',\n 'persistMedia',\n 'deleteFile',\n 'deleteFiles',\n 'getDeployPreview',\n];\n\nconst requiredString = Joi.string().required();\nconst requiredNumber = Joi.number().required();\nconst requiredBool = Joi.bool().required();\n\nconst collection = requiredString;\nconst slug = requiredString;\n\nexport function defaultSchema({ path = requiredString } = {}) {\n const defaultParams = Joi.object({\n branch: requiredString,\n });\n\n const asset = Joi.object({\n path,\n content: requiredString,\n encoding: requiredString.valid('base64'),\n });\n\n const dataFile = Joi.object({\n slug: requiredString,\n path,\n raw: requiredString,\n newPath: path.optional(),\n });\n\n const params = Joi.when('action', {\n switch: [\n {\n is: 'info',\n then: Joi.allow(),\n },\n {\n is: 'entriesByFolder',\n then: defaultParams\n .keys({\n folder: path,\n extension: requiredString,\n depth: requiredNumber,\n })\n .required(),\n },\n {\n is: 'entriesByFiles',\n then: defaultParams.keys({\n files: Joi.array()\n .items(Joi.object({ path, label: Joi.string() }))\n .required(),\n }),\n },\n {\n is: 'getEntry',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'unpublishedEntries',\n then: defaultParams.keys({ branch: requiredString }).required(),\n },\n {\n is: 'unpublishedEntry',\n then: defaultParams\n .keys({\n id: Joi.string().optional(),\n collection: Joi.string().optional(),\n slug: Joi.string().optional(),\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'unpublishedEntryDataFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'unpublishedEntryMediaFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'deleteUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'persistEntry',\n then: defaultParams\n .keys({\n cmsLabelPrefix: Joi.string().optional(),\n entry: dataFile, // entry is kept for backwards compatibility\n dataFiles: Joi.array().items(dataFile),\n assets: Joi.array().items(asset).required(),\n options: Joi.object({\n collectionName: Joi.string(),\n commitMessage: requiredString,\n useWorkflow: requiredBool,\n status: requiredString,\n }).required(),\n })\n .xor('entry', 'dataFiles')\n .required(),\n },\n {\n is: 'updateUnpublishedEntryStatus',\n then: defaultParams\n .keys({\n collection,\n slug,\n newStatus: requiredString,\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'publishUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'getMedia',\n then: defaultParams\n .keys({\n mediaFolder: path,\n })\n .required(),\n },\n {\n is: 'getMediaFile',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'persistMedia',\n then: defaultParams\n .keys({\n asset: asset.required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFile',\n then: defaultParams\n .keys({\n path,\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFiles',\n then: defaultParams\n .keys({\n paths: Joi.array().items(path).min(1).required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'getDeployPreview',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n ],\n otherwise: Joi.forbidden(),\n });\n\n return Joi.object({\n action: Joi.valid(...allowedActions).required(),\n params,\n });\n}\n\nexport function joi(schema: Joi.Schema) {\n return (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const { error } = schema.validate(req.body, { allowUnknown: true });\n if (error) {\n const { details } = error;\n const message = details.map(i => i.message).join(',');\n res.status(422).json({ error: message });\n } else {\n next();\n }\n };\n}\n","import path from 'path';\nimport { promises as fs } from 'fs';\nimport {\n branchFromContentKey,\n generateContentKey,\n contentKeyFromBranch,\n CMS_BRANCH_PREFIX,\n statusToLabel,\n labelToStatus,\n parseContentKey,\n} from 'decap-cms-lib-util/src/APIUtils';\nimport { parse } from 'what-the-diff';\n// eslint-disable-next-line import/no-named-as-default\nimport simpleGit from 'simple-git';\nimport { Mutex, withTimeout } from 'async-mutex';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, writeFile, move, deleteFile, getUpdateDate } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n DefaultParams,\n UnpublishedEntryParams,\n PersistEntryParams,\n GetMediaParams,\n Asset,\n PublishUnpublishedEntryParams,\n PersistMediaParams,\n DeleteFileParams,\n UpdateUnpublishedEntryStatusParams,\n DataFile,\n GetMediaFileParams,\n DeleteEntryParams,\n DeleteFilesParams,\n UnpublishedEntryDataFileParams,\n UnpublishedEntryMediaFileParams,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\nimport type { SimpleGit } from 'simple-git';\n\nasync function commit(git: SimpleGit, commitMessage: string) {\n await git.add('.');\n await git.commit(commitMessage, undefined, {\n // setting the value to a string passes name=value\n // any other value passes just the key\n '--no-verify': null,\n '--no-gpg-sign': null,\n });\n}\n\nasync function getCurrentBranch(git: SimpleGit) {\n const currentBranch = await git.branchLocal().then(summary => summary.current);\n return currentBranch;\n}\n\nasync function runOnBranch<T>(git: SimpleGit, branch: string, func: () => Promise<T>) {\n const currentBranch = await getCurrentBranch(git);\n try {\n if (currentBranch !== branch) {\n await git.checkout(branch);\n }\n const result = await func();\n return result;\n } finally {\n await git.checkout(currentBranch);\n }\n}\n\nfunction branchDescription(branch: string) {\n return `branch.${branch}.description`;\n}\n\ntype GitOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nasync function commitEntry(\n git: SimpleGit,\n repoPath: string,\n dataFiles: DataFile[],\n assets: Asset[],\n commitMessage: string,\n) {\n // save entry content\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a => writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding))),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(path.join(repoPath, dataFile.path), path.join(repoPath, dataFile.newPath!));\n });\n }\n\n // commits files\n await commit(git, commitMessage);\n}\n\nasync function rebase(git: SimpleGit, branch: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.rebase([branch, '--no-verify']);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function merge(git: SimpleGit, from: string, to: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.mergeFromTo(from, to);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function isBranchExists(git: SimpleGit, branch: string) {\n const branchExists = await git.branchLocal().then(({ all }) => all.includes(branch));\n return branchExists;\n}\n\nasync function getDiffs(git: SimpleGit, source: string, dest: string) {\n const rawDiff = await git.diff([source, dest]);\n const diffs = parse(rawDiff).map(d => {\n const oldPath = d.oldPath?.replace(/b\\//, '') || '';\n const newPath = d.newPath?.replace(/b\\//, '') || '';\n const path = newPath || (oldPath as string);\n return {\n oldPath,\n newPath,\n status: d.status,\n newFile: d.status === 'added',\n path,\n id: path,\n binary: d.binary || /.svg$/.test(path),\n };\n });\n return diffs;\n}\n\nexport async function validateRepo({ repoPath }: { repoPath: string }) {\n const git = simpleGit(repoPath);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n throw Error(`${repoPath} is not a valid git repository`);\n }\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\nexport function localGitMiddleware({ repoPath, logger }: GitOptions) {\n const git = simpleGit(repoPath);\n\n // we can only perform a single git operation at any given time\n const mutex = withTimeout(new Mutex(), 3000, new Error('Request timed out'));\n\n return async function (req: express.Request, res: express.Response) {\n let release;\n try {\n release = await mutex.acquire();\n const { body } = req;\n if (body.action === 'info') {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple', 'editorial_workflow'],\n type: 'local_git',\n });\n return;\n }\n const { branch } = body.params as DefaultParams;\n\n const branchExists = await isBranchExists(git, branch);\n if (!branchExists) {\n const message = `Default branch '${branch}' doesn't exist`;\n res.status(422).json({ error: message });\n return;\n }\n\n switch (body.action) {\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await runOnBranch(git, branch, () =>\n listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, payload.files),\n );\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, [{ path: payload.path }]),\n );\n res.json(entry);\n break;\n }\n case 'unpublishedEntries': {\n const cmsBranches = await git\n .branchLocal()\n .then(result => result.all.filter(b => b.startsWith(`${CMS_BRANCH_PREFIX}/`)));\n res.json(cmsBranches.map(contentKeyFromBranch));\n break;\n }\n case 'unpublishedEntry': {\n let { id, collection, slug, cmsLabelPrefix } = body.params as UnpublishedEntryParams;\n if (id) {\n ({ collection, slug } = parseContentKey(id));\n }\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n const diffs = await getDiffs(git, branch, cmsBranch);\n const label = await git.raw(['config', branchDescription(cmsBranch)]);\n const status = label && labelToStatus(label.trim(), cmsLabelPrefix || '');\n const updatedAt =\n diffs.length >= 0\n ? await runOnBranch(git, cmsBranch, async () => {\n const dates = await Promise.all(\n diffs.map(({ newPath }) => getUpdateDate(repoPath, newPath)),\n );\n return dates.reduce((a, b) => {\n return a > b ? a : b;\n });\n })\n : new Date();\n const unpublishedEntry = {\n collection,\n slug,\n status,\n diffs,\n updatedAt,\n };\n res.json(unpublishedEntry);\n } else {\n return res.status(404).json({ message: 'Not Found' });\n }\n break;\n }\n case 'unpublishedEntryDataFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryDataFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const [entry] = await runOnBranch(git, cmsBranch, () =>\n entriesFromFiles(repoPath, [{ path }]),\n );\n res.json({ data: entry.data });\n break;\n }\n case 'unpublishedEntryMediaFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryMediaFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const file = await runOnBranch(git, cmsBranch, () => readMediaFile(repoPath, path));\n res.json(file);\n break;\n }\n case 'deleteUnpublishedEntry': {\n const { collection, slug } = body.params as DeleteEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const currentBranch = await getCurrentBranch(git);\n if (currentBranch === cmsBranch) {\n await git.checkoutLocalBranch(branch);\n }\n await git.branch(['-D', cmsBranch]);\n res.json({ message: `deleted branch: ${cmsBranch}` });\n break;\n }\n case 'persistEntry': {\n const {\n cmsLabelPrefix,\n entry,\n dataFiles = [entry as DataFile],\n assets,\n options,\n } = body.params as PersistEntryParams;\n\n if (!options.useWorkflow) {\n await runOnBranch(git, branch, async () => {\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n });\n } else {\n const slug = dataFiles[0].slug;\n const collection = options.collectionName as string;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await runOnBranch(git, branch, async () => {\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n await git.checkout(cmsBranch);\n } else {\n await git.checkoutLocalBranch(cmsBranch);\n }\n await rebase(git, branch);\n const diffs = await getDiffs(git, branch, cmsBranch);\n // delete media files that have been removed from the entry\n const toDelete = diffs.filter(\n d => d.binary && !assets.map(a => a.path).includes(d.path),\n );\n await Promise.all(toDelete.map(f => fs.unlink(path.join(repoPath, f.path))));\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n\n // add status for new entries\n if (!branchExists) {\n const description = statusToLabel(options.status, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n }\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'updateUnpublishedEntryStatus': {\n const { collection, slug, newStatus, cmsLabelPrefix } =\n body.params as UpdateUnpublishedEntryStatusParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const description = statusToLabel(newStatus, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n res.json({ message: `${branch} description was updated to ${description}` });\n break;\n }\n case 'publishUnpublishedEntry': {\n const { collection, slug } = body.params as PublishUnpublishedEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await merge(git, cmsBranch, branch);\n await git.deleteLocalBranch(cmsBranch);\n res.json({ message: `branch ${cmsBranch} merged to ${branch}` });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const mediaFiles = await runOnBranch(git, branch, async () => {\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const serializedFiles = await Promise.all(\n files.map(file => readMediaFile(repoPath, file)),\n );\n return serializedFiles;\n });\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await runOnBranch(git, branch, () => {\n return readMediaFile(repoPath, path);\n });\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const {\n asset,\n options: { commitMessage },\n } = body.params as PersistMediaParams;\n\n const file = await runOnBranch(git, branch, async () => {\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n await commit(git, commitMessage);\n return readMediaFile(repoPath, asset.path);\n });\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const {\n path: filePath,\n options: { commitMessage },\n } = body.params as DeleteFileParams;\n await runOnBranch(git, branch, async () => {\n await deleteFile(repoPath, filePath);\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const {\n paths,\n options: { commitMessage },\n } = body.params as DeleteFilesParams;\n await runOnBranch(git, branch, async () => {\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n } finally {\n release && release();\n }\n };\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n await validateRepo({ repoPath });\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localGitMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS Git Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"crypto\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { registerCommonMiddlewares } from './middlewares/common';\nimport { registerMiddleware as localGit } from './middlewares/localGit';\nimport { registerMiddleware as localFs } from './middlewares/localFs';\nimport { createLogger } from './logger';\n\nimport type express from 'express';\n\ntype Options = {\n logLevel?: string;\n};\n\nfunction createOptions(options: Options) {\n return {\n logger: createLogger({ level: options.logLevel || 'info' }),\n };\n}\n\nexport async function registerLocalGit(app: express.Express, options: Options = {}) {\n const opts = createOptions(options);\n registerCommonMiddlewares(app, opts);\n await localGit(app, opts);\n}\n\nexport async function registerLocalFs(app: express.Express, options: Options = {}) {\n const opts = createOptions(options);\n registerCommonMiddlewares(app, opts);\n await localFs(app, opts);\n}\n"],"names":["module","exports","require","sha256","buffer","createHash","update","digest","normalizePath","path","replace","async","repoPath","files","Promise","all","map","file","content","readFile","join","data","toString","label","id","e","encoding","name","basename","getLabelPrefix","labelPrefix","CMS_BRANCH_PREFIX","DEFAULT_PR_BODY","MERGE_COMMIT_MESSAGE","startsWith","slice","length","status","collectionName","slug","contentKey","index","indexOf","collection","branch","listFiles","dir","extension","depth","dirents","readdir","withFileTypes","dirent","res","isDirectory","filter","f","endsWith","concat","moveFile","from","to","mkdir","dirname","recursive","rename","folder","filePath","writeFile","unlink","catch","sourceDir","destDir","allFiles","stat","then","mtime","Date","extend","type","base","string","required","messages","validate","value","helpers","errors","error","localFsMiddleware","logger","req","body","action","json","repo","publish_modes","payload","params","entries","listRepoFiles","entriesFromFiles","entry","dataFiles","assets","dataFile","raw","a","Buffer","every","newPath","forEach","move","message","mediaFolder","mediaFiles","readMediaFile","mediaFile","asset","deleteFile","paths","JSON","stringify","Error","getSchema","defaultSchema","pathTraversal","app","options","resolve","process","env","GIT_REPO_DIRECTORY","cwd","post","joi","info","stream","write","debug","String","trim","use","limit","combine","colorize","simple","format","level","createLogger","transports","Console","allowedActions","requiredString","requiredNumber","number","requiredBool","bool","defaultParams","object","valid","optional","when","switch","is","allow","keys","array","items","cmsLabelPrefix","commitMessage","useWorkflow","xor","newStatus","min","otherwise","forbidden","schema","next","allowUnknown","details","i","commit","git","add","undefined","getCurrentBranch","branchLocal","summary","current","runOnBranch","func","currentBranch","checkout","branchDescription","commitEntry","isBranchExists","includes","getDiffs","source","dest","rawDiff","diff","parse","d","oldPath","newFile","binary","test","validateRepo","checkIsRepo","localGitMiddleware","mutex","withTimeout","Mutex","release","acquire","cmsBranches","result","b","contentKeyFromBranch","parseContentKey","generateContentKey","cmsBranch","branchFromContentKey","diffs","labelToStatus","updatedAt","getUpdateDate","reduce","unpublishedEntry","checkoutLocalBranch","branchExists","gpgSign","addConfig","rebase","toDelete","description","statusToLabel","mergeFromTo","merge","deleteLocalBranch","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","createOptions","logLevel","opts","registerCommonMiddlewares"],"sourceRoot":""}
1
+ {"version":3,"file":"middlewares.js","mappings":"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","sources":["webpack://decap-server/external commonjs \"morgan\"","webpack://decap-server/./src/middlewares/utils/entries.ts","webpack://decap-server/external commonjs \"winston\"","webpack://decap-server/../decap-cms-lib-util/src/APIUtils.ts","webpack://decap-server/external commonjs \"express\"","webpack://decap-server/external commonjs \"what-the-diff\"","webpack://decap-server/external commonjs \"async-mutex\"","webpack://decap-server/./src/middlewares/utils/fs.ts","webpack://decap-server/external commonjs \"cors\"","webpack://decap-server/external commonjs \"@hapi/joi\"","webpack://decap-server/./src/middlewares/joi/customValidators.ts","webpack://decap-server/./src/middlewares/localFs/index.ts","webpack://decap-server/external commonjs \"simple-git\"","webpack://decap-server/./src/middlewares/common/index.ts","webpack://decap-server/external node-commonjs \"fs\"","webpack://decap-server/external node-commonjs \"path\"","webpack://decap-server/./src/logger.ts","webpack://decap-server/./src/middlewares/joi/index.ts","webpack://decap-server/./src/middlewares/localGit/index.ts","webpack://decap-server/external node-commonjs \"crypto\"","webpack://decap-server/webpack/bootstrap","webpack://decap-server/./src/middlewares.ts"],"sourcesContent":["module.exports = require(\"morgan\");","import crypto from 'crypto';\nimport path from 'path';\nimport { promises as fs } from 'fs';\n\nfunction sha256(buffer: Buffer) {\n return crypto.createHash('sha256').update(buffer).digest('hex');\n}\n\n// normalize windows os path format\nfunction normalizePath(path: string) {\n return path.replace(/\\\\/g, '/');\n}\n\nexport async function entriesFromFiles(\n repoPath: string,\n files: { path: string; label?: string }[],\n) {\n return Promise.all(\n files.map(async file => {\n try {\n const content = await fs.readFile(path.join(repoPath, file.path));\n return {\n data: content.toString(),\n file: { path: normalizePath(file.path), label: file.label, id: sha256(content) },\n };\n } catch (e) {\n return {\n data: null,\n file: { path: normalizePath(file.path), label: file.label, id: null },\n };\n }\n }),\n );\n}\n\nexport async function readMediaFile(repoPath: string, file: string) {\n const encoding = 'base64';\n const buffer = await fs.readFile(path.join(repoPath, file));\n const id = sha256(buffer);\n\n return {\n id,\n content: buffer.toString(encoding),\n encoding,\n path: normalizePath(file),\n name: path.basename(file),\n };\n}\n","module.exports = require(\"winston\");","export const CMS_BRANCH_PREFIX = 'cms';\nexport const DEFAULT_PR_BODY = 'Automatically generated by Decap CMS';\nexport const MERGE_COMMIT_MESSAGE = 'Automatically generated. Merged on Decap CMS.';\n\nconst DEFAULT_DECAP_CMS_LABEL_PREFIX = 'decap-cms/';\n\nfunction getLabelPrefix(labelPrefix: string) {\n return labelPrefix || DEFAULT_DECAP_CMS_LABEL_PREFIX;\n}\n\nexport function isCMSLabel(label: string, labelPrefix: string) {\n return label.startsWith(getLabelPrefix(labelPrefix));\n}\n\nexport function labelToStatus(label: string, labelPrefix: string) {\n return label.slice(getLabelPrefix(labelPrefix).length);\n}\n\nexport function statusToLabel(status: string, labelPrefix: string) {\n return `${getLabelPrefix(labelPrefix)}${status}`;\n}\n\nexport function generateContentKey(collectionName: string, slug: string) {\n return `${collectionName}/${slug}`;\n}\n\nexport function parseContentKey(contentKey: string) {\n const index = contentKey.indexOf('/');\n return { collection: contentKey.slice(0, index), slug: contentKey.slice(index + 1) };\n}\n\nexport function contentKeyFromBranch(branch: string) {\n return branch.slice(`${CMS_BRANCH_PREFIX}/`.length);\n}\n\nexport function branchFromContentKey(contentKey: string) {\n return `${CMS_BRANCH_PREFIX}/${contentKey}`;\n}\n","module.exports = require(\"express\");","module.exports = require(\"what-the-diff\");","module.exports = require(\"async-mutex\");","import path from 'path';\nimport { promises as fs } from 'fs';\n\nasync function listFiles(dir: string, extension: string, depth: number): Promise<string[]> {\n if (depth <= 0) {\n return [];\n }\n\n try {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n const files = await Promise.all(\n dirents.map(dirent => {\n const res = path.join(dir, dirent.name);\n return dirent.isDirectory()\n ? listFiles(res, extension, depth - 1)\n : [res].filter(f => f.endsWith(extension));\n }),\n );\n return ([] as string[]).concat(...files);\n } catch (e) {\n return [];\n }\n}\n\nexport async function listRepoFiles(\n repoPath: string,\n folder: string,\n extension: string,\n depth: number,\n) {\n const files = await listFiles(path.join(repoPath, folder), extension, depth);\n return files.map(f => f.slice(repoPath.length + 1));\n}\n\nexport async function writeFile(filePath: string, content: Buffer | string) {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content);\n}\n\nexport async function deleteFile(repoPath: string, filePath: string) {\n await fs.unlink(path.join(repoPath, filePath)).catch(() => undefined);\n}\n\nasync function moveFile(from: string, to: string) {\n await fs.mkdir(path.dirname(to), { recursive: true });\n await fs.rename(from, to);\n}\n\nexport async function move(from: string, to: string) {\n // move file\n await moveFile(from, to);\n\n // move children\n const sourceDir = path.dirname(from);\n const destDir = path.dirname(to);\n const allFiles = await listFiles(sourceDir, '', 100);\n await Promise.all(allFiles.map(file => moveFile(file, file.replace(sourceDir, destDir))));\n}\n\nexport async function getUpdateDate(repoPath: string, filePath: string) {\n return fs\n .stat(path.join(repoPath, filePath))\n .then(stat => stat.mtime)\n .catch(() => new Date());\n}\n","module.exports = require(\"cors\");","module.exports = require(\"@hapi/joi\");","import Joi from '@hapi/joi';\nimport path from 'path';\n\nexport function pathTraversal(repoPath: string) {\n return Joi.extend({\n type: 'path',\n base: Joi.string().required(),\n messages: {\n 'path.invalid': '{{#label}} must resolve to a path under the configured repository',\n },\n validate(value, helpers) {\n const resolvedPath = path.join(repoPath, value);\n if (!resolvedPath.startsWith(repoPath)) {\n return { value, errors: helpers.error('path.invalid') };\n }\n },\n }).path();\n}\n","import path from 'path';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, deleteFile, writeFile, move } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n PersistEntryParams,\n GetMediaParams,\n GetMediaFileParams,\n PersistMediaParams,\n DeleteFileParams,\n DeleteFilesParams,\n DataFile,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\n\ntype FsOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nexport function localFsMiddleware({ repoPath, logger }: FsOptions) {\n return async function (req: express.Request, res: express.Response) {\n try {\n const { body } = req;\n\n switch (body.action) {\n case 'info': {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple'],\n type: 'local_fs',\n });\n break;\n }\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await entriesFromFiles(repoPath, payload.files);\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await entriesFromFiles(repoPath, [{ path: payload.path }]);\n res.json(entry);\n break;\n }\n case 'persistEntry': {\n const {\n entry,\n dataFiles = [entry as DataFile],\n assets,\n } = body.params as PersistEntryParams;\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a =>\n writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding)),\n ),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(\n path.join(repoPath, dataFile.path),\n path.join(repoPath, dataFile.newPath!),\n );\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const mediaFiles = await Promise.all(files.map(file => readMediaFile(repoPath, file)));\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await readMediaFile(repoPath, path);\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const { asset } = body.params as PersistMediaParams;\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n const file = await readMediaFile(repoPath, asset.path);\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const { path: filePath } = body.params as DeleteFileParams;\n await deleteFile(repoPath, filePath);\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const { paths } = body.params as DeleteFilesParams;\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n }\n };\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localFsMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS File System Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"simple-git\");","import express from 'express';\nimport morgan from 'morgan';\nimport cors from 'cors';\n\nimport type winston from 'winston';\n\nexport type Options = {\n logger: winston.Logger;\n};\n\nexport function registerCommonMiddlewares(app: express.Express, options: Options) {\n const { logger } = options;\n const stream = {\n write: (message: string) => {\n logger.debug(String(message).trim());\n },\n };\n app.use(morgan('combined', { stream }));\n app.use(\n cors({\n origin: process.env.ORIGIN || '*',\n }),\n );\n app.use(express.json({ limit: '50mb' }));\n}\n","module.exports = require(\"fs\");","module.exports = require(\"path\");","import winston from 'winston';\n\nconst { combine, colorize, simple } = winston.format;\n\ntype LogOptions = {\n level: string;\n};\n\nexport function createLogger({ level }: LogOptions) {\n return winston.createLogger({\n level,\n format: combine(colorize(), simple()),\n transports: [new winston.transports.Console()],\n });\n}\n","import Joi from '@hapi/joi';\n\nimport type express from 'express';\n\nconst allowedActions = [\n 'info',\n 'entriesByFolder',\n 'entriesByFiles',\n 'getEntry',\n 'unpublishedEntries',\n 'unpublishedEntry',\n 'unpublishedEntryDataFile',\n 'unpublishedEntryMediaFile',\n 'deleteUnpublishedEntry',\n 'persistEntry',\n 'updateUnpublishedEntryStatus',\n 'publishUnpublishedEntry',\n 'getMedia',\n 'getMediaFile',\n 'persistMedia',\n 'deleteFile',\n 'deleteFiles',\n 'getDeployPreview',\n];\n\nconst requiredString = Joi.string().required();\nconst requiredNumber = Joi.number().required();\nconst requiredBool = Joi.bool().required();\n\nconst collection = requiredString;\nconst slug = requiredString;\n\nexport function defaultSchema({ path = requiredString } = {}) {\n const defaultParams = Joi.object({\n branch: requiredString,\n });\n\n const asset = Joi.object({\n path,\n content: requiredString,\n encoding: requiredString.valid('base64'),\n });\n\n const dataFile = Joi.object({\n slug: requiredString,\n path,\n raw: requiredString,\n newPath: path.optional(),\n });\n\n const params = Joi.when('action', {\n switch: [\n {\n is: 'info',\n then: Joi.allow(),\n },\n {\n is: 'entriesByFolder',\n then: defaultParams\n .keys({\n folder: path,\n extension: requiredString,\n depth: requiredNumber,\n })\n .required(),\n },\n {\n is: 'entriesByFiles',\n then: defaultParams.keys({\n files: Joi.array()\n .items(Joi.object({ path, label: Joi.string() }))\n .required(),\n }),\n },\n {\n is: 'getEntry',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'unpublishedEntries',\n then: defaultParams.keys({ branch: requiredString }).required(),\n },\n {\n is: 'unpublishedEntry',\n then: defaultParams\n .keys({\n id: Joi.string().optional(),\n collection: Joi.string().optional(),\n slug: Joi.string().optional(),\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'unpublishedEntryDataFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'unpublishedEntryMediaFile',\n then: defaultParams\n .keys({\n collection,\n slug,\n id: requiredString,\n path: requiredString,\n })\n .required(),\n },\n {\n is: 'deleteUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'persistEntry',\n then: defaultParams\n .keys({\n cmsLabelPrefix: Joi.string().optional(),\n entry: dataFile, // entry is kept for backwards compatibility\n dataFiles: Joi.array().items(dataFile),\n assets: Joi.array().items(asset).required(),\n options: Joi.object({\n collectionName: Joi.string(),\n commitMessage: requiredString,\n useWorkflow: requiredBool,\n status: requiredString,\n }).required(),\n })\n .xor('entry', 'dataFiles')\n .required(),\n },\n {\n is: 'updateUnpublishedEntryStatus',\n then: defaultParams\n .keys({\n collection,\n slug,\n newStatus: requiredString,\n cmsLabelPrefix: Joi.string().optional(),\n })\n .required(),\n },\n {\n is: 'publishUnpublishedEntry',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n {\n is: 'getMedia',\n then: defaultParams\n .keys({\n mediaFolder: path,\n })\n .required(),\n },\n {\n is: 'getMediaFile',\n then: defaultParams\n .keys({\n path,\n })\n .required(),\n },\n {\n is: 'persistMedia',\n then: defaultParams\n .keys({\n asset: asset.required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFile',\n then: defaultParams\n .keys({\n path,\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'deleteFiles',\n then: defaultParams\n .keys({\n paths: Joi.array().items(path).min(1).required(),\n options: Joi.object({\n commitMessage: requiredString,\n }).required(),\n })\n .required(),\n },\n {\n is: 'getDeployPreview',\n then: defaultParams\n .keys({\n collection,\n slug,\n })\n .required(),\n },\n ],\n otherwise: Joi.forbidden(),\n });\n\n return Joi.object({\n action: Joi.valid(...allowedActions).required(),\n params,\n });\n}\n\nexport function joi(schema: Joi.Schema) {\n return (req: express.Request, res: express.Response, next: express.NextFunction) => {\n const { error } = schema.validate(req.body, { allowUnknown: true });\n if (error) {\n const { details } = error;\n const message = details.map(i => i.message).join(',');\n res.status(422).json({ error: message });\n } else {\n next();\n }\n };\n}\n","import path from 'path';\nimport { promises as fs } from 'fs';\nimport {\n branchFromContentKey,\n generateContentKey,\n contentKeyFromBranch,\n CMS_BRANCH_PREFIX,\n statusToLabel,\n labelToStatus,\n parseContentKey,\n} from 'decap-cms-lib-util/src/APIUtils';\nimport { parse } from 'what-the-diff';\n// eslint-disable-next-line import/no-named-as-default\nimport simpleGit from 'simple-git';\nimport { Mutex, withTimeout } from 'async-mutex';\n\nimport { defaultSchema, joi } from '../joi';\nimport { pathTraversal } from '../joi/customValidators';\nimport { listRepoFiles, writeFile, move, deleteFile, getUpdateDate } from '../utils/fs';\nimport { entriesFromFiles, readMediaFile } from '../utils/entries';\n\nimport type {\n EntriesByFolderParams,\n EntriesByFilesParams,\n GetEntryParams,\n DefaultParams,\n UnpublishedEntryParams,\n PersistEntryParams,\n GetMediaParams,\n Asset,\n PublishUnpublishedEntryParams,\n PersistMediaParams,\n DeleteFileParams,\n UpdateUnpublishedEntryStatusParams,\n DataFile,\n GetMediaFileParams,\n DeleteEntryParams,\n DeleteFilesParams,\n UnpublishedEntryDataFileParams,\n UnpublishedEntryMediaFileParams,\n} from '../types';\nimport type express from 'express';\nimport type winston from 'winston';\nimport type { SimpleGit } from 'simple-git';\n\nasync function commit(git: SimpleGit, commitMessage: string) {\n await git.add('.');\n await git.commit(commitMessage, undefined, {\n // setting the value to a string passes name=value\n // any other value passes just the key\n '--no-verify': null,\n '--no-gpg-sign': null,\n });\n}\n\nasync function getCurrentBranch(git: SimpleGit) {\n const currentBranch = await git.branchLocal().then(summary => summary.current);\n return currentBranch;\n}\n\nasync function runOnBranch<T>(git: SimpleGit, branch: string, func: () => Promise<T>) {\n const currentBranch = await getCurrentBranch(git);\n try {\n if (currentBranch !== branch) {\n await git.checkout(branch);\n }\n const result = await func();\n return result;\n } finally {\n await git.checkout(currentBranch);\n }\n}\n\nfunction branchDescription(branch: string) {\n return `branch.${branch}.description`;\n}\n\ntype GitOptions = {\n repoPath: string;\n logger: winston.Logger;\n};\n\nasync function commitEntry(\n git: SimpleGit,\n repoPath: string,\n dataFiles: DataFile[],\n assets: Asset[],\n commitMessage: string,\n) {\n // save entry content\n await Promise.all(\n dataFiles.map(dataFile => writeFile(path.join(repoPath, dataFile.path), dataFile.raw)),\n );\n // save assets\n await Promise.all(\n assets.map(a => writeFile(path.join(repoPath, a.path), Buffer.from(a.content, a.encoding))),\n );\n if (dataFiles.every(dataFile => dataFile.newPath)) {\n dataFiles.forEach(async dataFile => {\n await move(path.join(repoPath, dataFile.path), path.join(repoPath, dataFile.newPath!));\n });\n }\n\n // commits files\n await commit(git, commitMessage);\n}\n\nasync function rebase(git: SimpleGit, branch: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.rebase([branch, '--no-verify']);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function merge(git: SimpleGit, from: string, to: string) {\n const gpgSign = await git.raw(['config', 'commit.gpgsign']);\n try {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', 'false');\n }\n await git.mergeFromTo(from, to);\n } finally {\n if (gpgSign === 'true') {\n await git.addConfig('commit.gpgsign', gpgSign);\n }\n }\n}\n\nasync function isBranchExists(git: SimpleGit, branch: string) {\n const branchExists = await git.branchLocal().then(({ all }) => all.includes(branch));\n return branchExists;\n}\n\nasync function getDiffs(git: SimpleGit, source: string, dest: string) {\n const rawDiff = await git.diff([source, dest]);\n const diffs = parse(rawDiff).map(d => {\n const oldPath = d.oldPath?.replace(/b\\//, '') || '';\n const newPath = d.newPath?.replace(/b\\//, '') || '';\n const path = newPath || (oldPath as string);\n return {\n oldPath,\n newPath,\n status: d.status,\n newFile: d.status === 'added',\n path,\n id: path,\n binary: d.binary || /.svg$/.test(path),\n };\n });\n return diffs;\n}\n\nexport async function validateRepo({ repoPath }: { repoPath: string }) {\n const git = simpleGit(repoPath);\n const isRepo = await git.checkIsRepo();\n if (!isRepo) {\n throw Error(`${repoPath} is not a valid git repository`);\n }\n}\n\nexport function getSchema({ repoPath }: { repoPath: string }) {\n const schema = defaultSchema({ path: pathTraversal(repoPath) });\n return schema;\n}\n\nexport function localGitMiddleware({ repoPath, logger }: GitOptions) {\n const git = simpleGit(repoPath);\n\n // we can only perform a single git operation at any given time\n const mutex = withTimeout(new Mutex(), 3000, new Error('Request timed out'));\n\n return async function (req: express.Request, res: express.Response) {\n let release;\n try {\n release = await mutex.acquire();\n const { body } = req;\n if (body.action === 'info') {\n res.json({\n repo: path.basename(repoPath),\n publish_modes: ['simple', 'editorial_workflow'],\n type: 'local_git',\n });\n return;\n }\n const { branch } = body.params as DefaultParams;\n\n const branchExists = await isBranchExists(git, branch);\n if (!branchExists) {\n const message = `Default branch '${branch}' doesn't exist`;\n res.status(422).json({ error: message });\n return;\n }\n\n switch (body.action) {\n case 'entriesByFolder': {\n const payload = body.params as EntriesByFolderParams;\n const { folder, extension, depth } = payload;\n const entries = await runOnBranch(git, branch, () =>\n listRepoFiles(repoPath, folder, extension, depth).then(files =>\n entriesFromFiles(\n repoPath,\n files.map(file => ({ path: file })),\n ),\n ),\n );\n res.json(entries);\n break;\n }\n case 'entriesByFiles': {\n const payload = body.params as EntriesByFilesParams;\n const entries = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, payload.files),\n );\n res.json(entries);\n break;\n }\n case 'getEntry': {\n const payload = body.params as GetEntryParams;\n const [entry] = await runOnBranch(git, branch, () =>\n entriesFromFiles(repoPath, [{ path: payload.path }]),\n );\n res.json(entry);\n break;\n }\n case 'unpublishedEntries': {\n const cmsBranches = await git\n .branchLocal()\n .then(result => result.all.filter(b => b.startsWith(`${CMS_BRANCH_PREFIX}/`)));\n res.json(cmsBranches.map(contentKeyFromBranch));\n break;\n }\n case 'unpublishedEntry': {\n let { id, collection, slug, cmsLabelPrefix } = body.params as UnpublishedEntryParams;\n if (id) {\n ({ collection, slug } = parseContentKey(id));\n }\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n const diffs = await getDiffs(git, branch, cmsBranch);\n const label = await git.raw(['config', branchDescription(cmsBranch)]);\n const status = label && labelToStatus(label.trim(), cmsLabelPrefix || '');\n const updatedAt =\n diffs.length >= 0\n ? await runOnBranch(git, cmsBranch, async () => {\n const dates = await Promise.all(\n diffs.map(({ newPath }) => getUpdateDate(repoPath, newPath)),\n );\n return dates.reduce((a, b) => {\n return a > b ? a : b;\n });\n })\n : new Date();\n const unpublishedEntry = {\n collection,\n slug,\n status,\n diffs,\n updatedAt,\n };\n res.json(unpublishedEntry);\n } else {\n return res.status(404).json({ message: 'Not Found' });\n }\n break;\n }\n case 'unpublishedEntryDataFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryDataFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const [entry] = await runOnBranch(git, cmsBranch, () =>\n entriesFromFiles(repoPath, [{ path }]),\n );\n res.json({ data: entry.data });\n break;\n }\n case 'unpublishedEntryMediaFile': {\n const { path, collection, slug } = body.params as UnpublishedEntryMediaFileParams;\n const contentKey = generateContentKey(collection as string, slug as string);\n const cmsBranch = branchFromContentKey(contentKey);\n const file = await runOnBranch(git, cmsBranch, () => readMediaFile(repoPath, path));\n res.json(file);\n break;\n }\n case 'deleteUnpublishedEntry': {\n const { collection, slug } = body.params as DeleteEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const currentBranch = await getCurrentBranch(git);\n if (currentBranch === cmsBranch) {\n await git.checkoutLocalBranch(branch);\n }\n await git.branch(['-D', cmsBranch]);\n res.json({ message: `deleted branch: ${cmsBranch}` });\n break;\n }\n case 'persistEntry': {\n const {\n cmsLabelPrefix,\n entry,\n dataFiles = [entry as DataFile],\n assets,\n options,\n } = body.params as PersistEntryParams;\n\n if (!options.useWorkflow) {\n await runOnBranch(git, branch, async () => {\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n });\n } else {\n const slug = dataFiles[0].slug;\n const collection = options.collectionName as string;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await runOnBranch(git, branch, async () => {\n const branchExists = await isBranchExists(git, cmsBranch);\n if (branchExists) {\n await git.checkout(cmsBranch);\n } else {\n await git.checkoutLocalBranch(cmsBranch);\n }\n await rebase(git, branch);\n const diffs = await getDiffs(git, branch, cmsBranch);\n // delete media files that have been removed from the entry\n const toDelete = diffs.filter(\n d => d.binary && !assets.map(a => a.path).includes(d.path),\n );\n await Promise.all(toDelete.map(f => fs.unlink(path.join(repoPath, f.path))));\n await commitEntry(git, repoPath, dataFiles, assets, options.commitMessage);\n\n // add status for new entries\n if (!branchExists) {\n const description = statusToLabel(options.status, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n }\n });\n }\n res.json({ message: 'entry persisted' });\n break;\n }\n case 'updateUnpublishedEntryStatus': {\n const { collection, slug, newStatus, cmsLabelPrefix } =\n body.params as UpdateUnpublishedEntryStatusParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n const description = statusToLabel(newStatus, cmsLabelPrefix || '');\n await git.addConfig(branchDescription(cmsBranch), description);\n res.json({ message: `${branch} description was updated to ${description}` });\n break;\n }\n case 'publishUnpublishedEntry': {\n const { collection, slug } = body.params as PublishUnpublishedEntryParams;\n const contentKey = generateContentKey(collection, slug);\n const cmsBranch = branchFromContentKey(contentKey);\n await merge(git, cmsBranch, branch);\n await git.deleteLocalBranch(cmsBranch);\n res.json({ message: `branch ${cmsBranch} merged to ${branch}` });\n break;\n }\n case 'getMedia': {\n const { mediaFolder } = body.params as GetMediaParams;\n const mediaFiles = await runOnBranch(git, branch, async () => {\n const files = await listRepoFiles(repoPath, mediaFolder, '', 1);\n const serializedFiles = await Promise.all(\n files.map(file => readMediaFile(repoPath, file)),\n );\n return serializedFiles;\n });\n res.json(mediaFiles);\n break;\n }\n case 'getMediaFile': {\n const { path } = body.params as GetMediaFileParams;\n const mediaFile = await runOnBranch(git, branch, () => {\n return readMediaFile(repoPath, path);\n });\n res.json(mediaFile);\n break;\n }\n case 'persistMedia': {\n const {\n asset,\n options: { commitMessage },\n } = body.params as PersistMediaParams;\n\n const file = await runOnBranch(git, branch, async () => {\n await writeFile(\n path.join(repoPath, asset.path),\n Buffer.from(asset.content, asset.encoding),\n );\n await commit(git, commitMessage);\n return readMediaFile(repoPath, asset.path);\n });\n res.json(file);\n break;\n }\n case 'deleteFile': {\n const {\n path: filePath,\n options: { commitMessage },\n } = body.params as DeleteFileParams;\n await runOnBranch(git, branch, async () => {\n await deleteFile(repoPath, filePath);\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted file ${filePath}` });\n break;\n }\n case 'deleteFiles': {\n const {\n paths,\n options: { commitMessage },\n } = body.params as DeleteFilesParams;\n await runOnBranch(git, branch, async () => {\n await Promise.all(paths.map(filePath => deleteFile(repoPath, filePath)));\n await commit(git, commitMessage);\n });\n res.json({ message: `deleted files ${paths.join(', ')}` });\n break;\n }\n case 'getDeployPreview': {\n res.json(null);\n break;\n }\n default: {\n const message = `Unknown action ${body.action}`;\n res.status(422).json({ error: message });\n break;\n }\n }\n } catch (e) {\n logger.error(\n `Error handling ${JSON.stringify(req.body)}: ${\n e instanceof Error ? e.message : 'Unknown error'\n }`,\n );\n res.status(500).json({ error: 'Unknown error' });\n } finally {\n release && release();\n }\n };\n}\n\ntype Options = {\n logger: winston.Logger;\n};\n\nexport async function registerMiddleware(app: express.Express, options: Options) {\n const { logger } = options;\n const repoPath = path.resolve(process.env.GIT_REPO_DIRECTORY || process.cwd());\n await validateRepo({ repoPath });\n app.post('/api/v1', joi(getSchema({ repoPath })));\n app.post('/api/v1', localGitMiddleware({ repoPath, logger }));\n logger.info(`Decap CMS Git Proxy Server configured with ${repoPath}`);\n}\n","module.exports = require(\"crypto\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { registerCommonMiddlewares } from './middlewares/common';\nimport { registerMiddleware as localGit } from './middlewares/localGit';\nimport { registerMiddleware as localFs } from './middlewares/localFs';\nimport { createLogger } from './logger';\n\nimport type express from 'express';\n\ntype Options = {\n logLevel?: string;\n};\n\nfunction createOptions(options: Options) {\n return {\n logger: createLogger({ level: options.logLevel || 'info' }),\n };\n}\n\nexport async function registerLocalGit(app: express.Express, options: Options = {}) {\n const opts = createOptions(options);\n registerCommonMiddlewares(app, opts);\n await localGit(app, opts);\n}\n\nexport async function registerLocalFs(app: express.Express, options: Options = {}) {\n const opts = createOptions(options);\n registerCommonMiddlewares(app, opts);\n await localFs(app, opts);\n}\n"],"names":["module","exports","require","sha256","buffer","createHash","update","digest","normalizePath","path","replace","async","repoPath","files","Promise","all","map","file","content","readFile","join","data","toString","label","id","e","encoding","name","basename","getLabelPrefix","labelPrefix","CMS_BRANCH_PREFIX","DEFAULT_PR_BODY","MERGE_COMMIT_MESSAGE","startsWith","slice","length","status","collectionName","slug","contentKey","index","indexOf","collection","branch","listFiles","dir","extension","depth","dirents","readdir","withFileTypes","dirent","res","isDirectory","filter","f","endsWith","concat","moveFile","from","to","mkdir","dirname","recursive","rename","folder","filePath","writeFile","unlink","catch","sourceDir","destDir","allFiles","stat","then","mtime","Date","extend","type","base","string","required","messages","validate","value","helpers","errors","error","localFsMiddleware","logger","req","body","action","json","repo","publish_modes","payload","params","entries","listRepoFiles","entriesFromFiles","entry","dataFiles","assets","dataFile","raw","a","Buffer","every","newPath","forEach","move","message","mediaFolder","mediaFiles","readMediaFile","mediaFile","asset","deleteFile","paths","JSON","stringify","Error","getSchema","defaultSchema","pathTraversal","app","options","resolve","process","env","GIT_REPO_DIRECTORY","cwd","post","joi","info","stream","write","debug","String","trim","use","origin","ORIGIN","limit","combine","colorize","simple","format","level","createLogger","transports","Console","allowedActions","requiredString","requiredNumber","number","requiredBool","bool","defaultParams","object","valid","optional","when","switch","is","allow","keys","array","items","cmsLabelPrefix","commitMessage","useWorkflow","xor","newStatus","min","otherwise","forbidden","schema","next","allowUnknown","details","i","commit","git","add","undefined","getCurrentBranch","branchLocal","summary","current","runOnBranch","func","currentBranch","checkout","branchDescription","commitEntry","isBranchExists","includes","getDiffs","source","dest","rawDiff","diff","parse","d","oldPath","newFile","binary","test","validateRepo","checkIsRepo","localGitMiddleware","mutex","withTimeout","Mutex","release","acquire","cmsBranches","result","b","contentKeyFromBranch","parseContentKey","generateContentKey","cmsBranch","branchFromContentKey","diffs","labelToStatus","updatedAt","getUpdateDate","reduce","unpublishedEntry","checkoutLocalBranch","branchExists","gpgSign","addConfig","rebase","toDelete","description","statusToLabel","mergeFromTo","merge","deleteLocalBranch","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","createOptions","logLevel","opts","registerCommonMiddlewares"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "decap-server",
3
3
  "description": "Proxy server to be used with Decap CMS proxy backend",
4
- "version": "3.3.0",
4
+ "version": "3.4.0",
5
5
  "repository": "https://github.com/decaporg/decap-cms/tree/main/packages/decap-server",
6
6
  "bugs": "https://github.com/decaporg/decap-cms/issues",
7
7
  "license": "MIT",
@@ -39,7 +39,7 @@
39
39
  "@types/morgan": "^1.7.37",
40
40
  "@types/node": "^16.0.0",
41
41
  "@types/vfile-message": "^2.0.0",
42
- "decap-cms-lib-util": "^3.3.0",
42
+ "decap-cms-lib-util": "^3.3.1",
43
43
  "jest": "^27.0.0",
44
44
  "nodemon": "^2.0.2",
45
45
  "ts-jest": "^27.0.0",
@@ -55,5 +55,5 @@
55
55
  "bin": {
56
56
  "decap-server": "./dist/index.js"
57
57
  },
58
- "gitHead": "ed7e99318007b83f4c57f3237bf92b931676820a"
58
+ "gitHead": "826a300143ead63bd7515db66938a6b9ff8319ce"
59
59
  }
package/src/index.ts CHANGED
@@ -8,7 +8,8 @@ import { registerMiddleware as registerLocalFs } from './middlewares/localFs';
8
8
  import { createLogger } from './logger';
9
9
 
10
10
  const app = express();
11
- const port = process.env.PORT || 8081;
11
+ const port = parseInt(process.env.PORT || '8081', 10);
12
+ const host = process.env.BIND_HOST;
12
13
  const level = process.env.LOG_LEVEL || 'info';
13
14
 
14
15
  (async () => {
@@ -33,7 +34,13 @@ const level = process.env.LOG_LEVEL || 'info';
33
34
  process.exit(1);
34
35
  }
35
36
 
36
- return app.listen(port, () => {
37
- logger.info(`Decap CMS Proxy Server listening on port ${port}`);
38
- });
37
+ if (host) {
38
+ return app.listen(port, host, () => {
39
+ logger.info(`Decap CMS Proxy Server listening on ${host}:${port}`);
40
+ });
41
+ } else {
42
+ return app.listen(port, () => {
43
+ logger.info(`Decap CMS Proxy Server listening on port ${port}`);
44
+ });
45
+ }
39
46
  })();
@@ -16,6 +16,10 @@ export function registerCommonMiddlewares(app: express.Express, options: Options
16
16
  },
17
17
  };
18
18
  app.use(morgan('combined', { stream }));
19
- app.use(cors());
19
+ app.use(
20
+ cors({
21
+ origin: process.env.ORIGIN || '*',
22
+ }),
23
+ );
20
24
  app.use(express.json({ limit: '50mb' }));
21
25
  }