@opengis/cms 0.0.13 → 0.0.15
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/dist/assets/ArticlesPage-BveM4q3g.js +11 -0
- package/dist/assets/CollectionsPage-D5td-UBm.js +1 -0
- package/dist/assets/ContentBlock.vue_vue_type_script_setup_true_lang-BwF6D-yB.js +30 -0
- package/dist/assets/CreateCollectionPage-Cu0RW5ui.js +76 -0
- package/dist/assets/Dashboard-faSjwmB8.js +11 -0
- package/dist/assets/EditCollectionPage-K5oPPzCd.js +1 -0
- package/dist/assets/MediaPage-BoW3aWgN.js +1 -0
- package/dist/assets/PermissionsPage-DGy5fha2.js +1 -0
- package/dist/assets/SingletonsPage-C1X2xkQE.js +1 -0
- package/dist/assets/UniversalTable.vue_vue_type_script_setup_true_lang-DUqfWJcy.js +6 -0
- package/dist/assets/calendar-hsWc4yH-.js +6 -0
- package/dist/assets/contentForm-DMVC4vho.js +1 -0
- package/dist/assets/database-BTxZQzYy.js +6 -0
- package/dist/assets/index-9GY17iSP.css +1 -0
- package/dist/assets/index-DYyZmLWO.js +2138 -0
- package/dist/assets/index-xsH4HHeE.js +6 -0
- package/dist/assets/logo-Cct5WB26.png +0 -0
- package/dist/assets/plus-D9etvrM2.js +6 -0
- package/dist/assets/save-C2B6th9J.js +11 -0
- package/dist/assets/search-BI-hqhq6.js +6 -0
- package/dist/assets/settings-DbyDiH2g.js +6 -0
- package/dist/assets/square-pen-61CkyXzK.js +6 -0
- package/dist/assets/trash-2-CJSl_r88.js +6 -0
- package/dist/assets/vue.-sixQ7xP-DwXf3zRn.js +1 -0
- package/dist/assets/x-BNquQe5y.js +6 -0
- package/dist/assets/x-circle-C3q70RMH.js +16 -0
- package/dist/images/logo.png +0 -0
- package/dist/index.html +30 -0
- package/package.json +38 -32
- package/server/app.js +32 -10
- package/server/index.js +3 -3
- package/server/migrations/site.sql +26 -8
- package/server/plugins/adminHook.js +78 -0
- package/server/plugins/hook.js +54 -78
- package/server/plugins/vite.js +13 -9
- package/server/routes/cms/controllers/deleteContent.js +60 -0
- package/server/routes/{site → cms}/controllers/deleteMedia.js +46 -46
- package/server/routes/{site → cms}/controllers/downloadMedia.js +48 -48
- package/server/routes/cms/controllers/getContent.js +96 -0
- package/server/routes/{site → cms}/controllers/getPermissions.js +15 -15
- package/server/routes/cms/controllers/insertContent.js +69 -0
- package/server/routes/{site → cms}/controllers/listMedia.js +72 -72
- package/server/routes/{site → cms}/controllers/metadataMedia.js +37 -37
- package/server/routes/{site → cms}/controllers/setPermissions.js +49 -49
- package/server/routes/cms/controllers/updateContent.js +112 -0
- package/server/routes/{site → cms}/controllers/uploadMedia.js +65 -65
- package/server/routes/cms/index.mjs +45 -0
- package/server/routes/contentType/controllers/cms.type.delete.js +22 -0
- package/server/routes/contentType/controllers/cms.type.get.js +22 -0
- package/server/routes/contentType/controllers/cms.type.list.js +25 -0
- package/server/routes/contentType/controllers/cms.type.post.js +22 -0
- package/server/routes/contentType/controllers/cms.type.put.js +24 -0
- package/server/routes/contentType/index.mjs +25 -0
- package/server/routes/contentType/utils/builderCache.js +58 -0
- package/server/routes/fileContent/data/deleteContent.js +34 -0
- package/server/routes/fileContent/data/deleteMedia.js +28 -0
- package/server/routes/fileContent/data/downloadMedia.js +41 -0
- package/server/routes/fileContent/data/getContent.js +32 -0
- package/server/routes/fileContent/data/insertContent.js +37 -0
- package/server/routes/fileContent/data/listMedia.js +47 -0
- package/server/routes/fileContent/data/metadataMedia.js +38 -0
- package/server/routes/fileContent/data/updateContent.js +40 -0
- package/server/routes/fileContent/data/uploadMedia.js +49 -0
- package/server/routes/fileContent/index.mjs +54 -0
- package/server/routes/fileContent/type/contentTypeList.js +7 -0
- package/server/routes/fileContent/type/createContentType.js +31 -0
- package/server/routes/fileContent/type/deleteContentType.js +29 -0
- package/server/routes/fileContent/type/getContentType.js +15 -0
- package/server/routes/fileContent/type/updateContentType.js +40 -0
- package/server/routes/fileContent/utils/astroBuilderCache.js +47 -0
- package/server/routes/fileContent/utils/contentDir.js +12 -0
- package/server/routes/fileContent/utils/contentTypeExists.js +15 -0
- package/server/routes/root.mjs +0 -7
- package/dist/cms.js +0 -6727
- package/dist/cms.umd.cjs +0 -19
- package/dist/style.css +0 -1
- package/server/routes/builder/controllers/cms.builder.delete.js +0 -21
- package/server/routes/builder/controllers/cms.builder.get.js +0 -17
- package/server/routes/builder/controllers/cms.builder.list.js +0 -16
- package/server/routes/builder/controllers/cms.builder.post.js +0 -21
- package/server/routes/builder/controllers/cms.builder.put.js +0 -23
- package/server/routes/builder/index.mjs +0 -22
- package/server/routes/manager/controllers/cms.manager.delete.js +0 -22
- package/server/routes/manager/controllers/cms.manager.get.js +0 -21
- package/server/routes/manager/controllers/cms.manager.list.js +0 -31
- package/server/routes/manager/controllers/cms.manager.post.js +0 -28
- package/server/routes/manager/controllers/cms.manager.put.js +0 -23
- package/server/routes/manager/index.mjs +0 -22
- package/server/routes/media/controllers/delete.js +0 -59
- package/server/routes/media/controllers/edit.js +0 -94
- package/server/routes/media/controllers/list.js +0 -74
- package/server/routes/media/controllers/metadata.js +0 -51
- package/server/routes/media/controllers/preview.js +0 -47
- package/server/routes/media/controllers/upload.js +0 -79
- package/server/routes/media/index.mjs +0 -16
- package/server/routes/site/index.mjs +0 -34
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
function xe(e,t){return function(){return e.apply(t,arguments)}}const{toString:Qe}=Object.prototype,{getPrototypeOf:le}=Object,{iterator:K,toStringTag:Ce}=Symbol,v=(e=>t=>{const n=Qe.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),C=e=>(e=e.toLowerCase(),t=>v(t)===e),X=e=>t=>typeof t===e,{isArray:D}=Array,q=X("undefined");function Ze(e){return e!==null&&!q(e)&&e.constructor!==null&&!q(e.constructor)&&A(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Ne=C("ArrayBuffer");function Ye(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Ne(e.buffer),t}const et=X("string"),A=X("function"),Pe=X("number"),G=e=>e!==null&&typeof e=="object",tt=e=>e===!0||e===!1,z=e=>{if(v(e)!=="object")return!1;const t=le(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Ce in e)&&!(K in e)},nt=C("Date"),rt=C("File"),st=C("Blob"),ot=C("FileList"),it=e=>G(e)&&A(e.pipe),at=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||A(e.append)&&((t=v(e))==="formdata"||t==="object"&&A(e.toString)&&e.toString()==="[object FormData]"))},ct=C("URLSearchParams"),[lt,ut,ft,dt]=["ReadableStream","Request","Response","Headers"].map(C),pt=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function H(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,s;if(typeof e!="object"&&(e=[e]),D(e))for(r=0,s=e.length;r<s;r++)t.call(null,e[r],r,e);else{const o=n?Object.getOwnPropertyNames(e):Object.keys(e),i=o.length;let c;for(r=0;r<i;r++)c=o[r],t.call(null,e[c],c,e)}}function Fe(e,t){t=t.toLowerCase();const n=Object.keys(e);let r=n.length,s;for(;r-- >0;)if(s=n[r],t===s.toLowerCase())return s;return null}const U=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,_e=e=>!q(e)&&e!==U;function re(){const{caseless:e}=_e(this)&&this||{},t={},n=(r,s)=>{const o=e&&Fe(t,s)||s;z(t[o])&&z(r)?t[o]=re(t[o],r):z(r)?t[o]=re({},r):D(r)?t[o]=r.slice():t[o]=r};for(let r=0,s=arguments.length;r<s;r++)arguments[r]&&H(arguments[r],n);return t}const ht=(e,t,n,{allOwnKeys:r}={})=>(H(t,(s,o)=>{n&&A(s)?e[o]=xe(s,n):e[o]=s},{allOwnKeys:r}),e),mt=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),yt=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},bt=(e,t,n,r)=>{let s,o,i;const c={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),o=s.length;o-- >0;)i=s[o],(!r||r(i,e,t))&&!c[i]&&(t[i]=e[i],c[i]=!0);e=n!==!1&&le(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},wt=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},Et=e=>{if(!e)return null;if(D(e))return e;let t=e.length;if(!Pe(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},Rt=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&le(Uint8Array)),St=(e,t)=>{const r=(e&&e[K]).call(e);let s;for(;(s=r.next())&&!s.done;){const o=s.value;t.call(e,o[0],o[1])}},gt=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},Ot=C("HTMLFormElement"),Tt=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,s){return r.toUpperCase()+s}),pe=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),At=C("RegExp"),Ue=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};H(n,(s,o)=>{let i;(i=t(s,o,e))!==!1&&(r[o]=i||s)}),Object.defineProperties(e,r)},xt=e=>{Ue(e,(t,n)=>{if(A(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(A(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},Ct=(e,t)=>{const n={},r=s=>{s.forEach(o=>{n[o]=!0})};return D(e)?r(e):r(String(e).split(t)),n},Nt=()=>{},Pt=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function Ft(e){return!!(e&&A(e.append)&&e[Ce]==="FormData"&&e[K])}const _t=e=>{const t=new Array(10),n=(r,s)=>{if(G(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[s]=r;const o=D(r)?[]:{};return H(r,(i,c)=>{const f=n(i,s+1);!q(f)&&(o[c]=f)}),t[s]=void 0,o}}return r};return n(e,0)},Ut=C("AsyncFunction"),Lt=e=>e&&(G(e)||A(e))&&A(e.then)&&A(e.catch),Le=((e,t)=>e?setImmediate:t?((n,r)=>(U.addEventListener("message",({source:s,data:o})=>{s===U&&o===n&&r.length&&r.shift()()},!1),s=>{r.push(s),U.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",A(U.postMessage)),Bt=typeof queueMicrotask<"u"?queueMicrotask.bind(U):typeof process<"u"&&process.nextTick||Le,Dt=e=>e!=null&&A(e[K]),a={isArray:D,isArrayBuffer:Ne,isBuffer:Ze,isFormData:at,isArrayBufferView:Ye,isString:et,isNumber:Pe,isBoolean:tt,isObject:G,isPlainObject:z,isReadableStream:lt,isRequest:ut,isResponse:ft,isHeaders:dt,isUndefined:q,isDate:nt,isFile:rt,isBlob:st,isRegExp:At,isFunction:A,isStream:it,isURLSearchParams:ct,isTypedArray:Rt,isFileList:ot,forEach:H,merge:re,extend:ht,trim:pt,stripBOM:mt,inherits:yt,toFlatObject:bt,kindOf:v,kindOfTest:C,endsWith:wt,toArray:Et,forEachEntry:St,matchAll:gt,isHTMLForm:Ot,hasOwnProperty:pe,hasOwnProp:pe,reduceDescriptors:Ue,freezeMethods:xt,toObjectSet:Ct,toCamelCase:Tt,noop:Nt,toFiniteNumber:Pt,findKey:Fe,global:U,isContextDefined:_e,isSpecCompliantForm:Ft,toJSONObject:_t,isAsyncFn:Ut,isThenable:Lt,setImmediate:Le,asap:Bt,isIterable:Dt};function m(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s,this.status=s.status?s.status:null)}a.inherits(m,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:a.toJSONObject(this.config),code:this.code,status:this.status}}});const Be=m.prototype,De={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{De[e]={value:e}});Object.defineProperties(m,De);Object.defineProperty(Be,"isAxiosError",{value:!0});m.from=(e,t,n,r,s,o)=>{const i=Object.create(Be);return a.toFlatObject(e,i,function(f){return f!==Error.prototype},c=>c!=="isAxiosError"),m.call(i,e.message,t,n,r,s),i.cause=e,i.name=e.name,o&&Object.assign(i,o),i};const kt=null;function se(e){return a.isPlainObject(e)||a.isArray(e)}function ke(e){return a.endsWith(e,"[]")?e.slice(0,-2):e}function he(e,t,n){return e?e.concat(t).map(function(s,o){return s=ke(s),!n&&o?"["+s+"]":s}).join(n?".":""):t}function jt(e){return a.isArray(e)&&!e.some(se)}const qt=a.toFlatObject(a,{},null,function(t){return/^is[A-Z]/.test(t)});function Q(e,t,n){if(!a.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=a.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,h){return!a.isUndefined(h[y])});const r=n.metaTokens,s=n.visitor||u,o=n.dots,i=n.indexes,f=(n.Blob||typeof Blob<"u"&&Blob)&&a.isSpecCompliantForm(t);if(!a.isFunction(s))throw new TypeError("visitor must be a function");function l(p){if(p===null)return"";if(a.isDate(p))return p.toISOString();if(!f&&a.isBlob(p))throw new m("Blob is not supported. Use a Buffer instead.");return a.isArrayBuffer(p)||a.isTypedArray(p)?f&&typeof Blob=="function"?new Blob([p]):Buffer.from(p):p}function u(p,y,h){let w=p;if(p&&!h&&typeof p=="object"){if(a.endsWith(y,"{}"))y=r?y:y.slice(0,-2),p=JSON.stringify(p);else if(a.isArray(p)&&jt(p)||(a.isFileList(p)||a.endsWith(y,"[]"))&&(w=a.toArray(p)))return y=ke(y),w.forEach(function(g,P){!(a.isUndefined(g)||g===null)&&t.append(i===!0?he([y],P,o):i===null?y:y+"[]",l(g))}),!1}return se(p)?!0:(t.append(he(h,y,o),l(p)),!1)}const d=[],b=Object.assign(qt,{defaultVisitor:u,convertValue:l,isVisitable:se});function R(p,y){if(!a.isUndefined(p)){if(d.indexOf(p)!==-1)throw Error("Circular reference detected in "+y.join("."));d.push(p),a.forEach(p,function(w,S){(!(a.isUndefined(w)||w===null)&&s.call(t,w,a.isString(S)?S.trim():S,y,b))===!0&&R(w,y?y.concat(S):[S])}),d.pop()}}if(!a.isObject(e))throw new TypeError("data must be an object");return R(e),t}function me(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function ue(e,t){this._pairs=[],e&&Q(e,this,t)}const je=ue.prototype;je.append=function(t,n){this._pairs.push([t,n])};je.toString=function(t){const n=t?function(r){return t.call(this,r,me)}:me;return this._pairs.map(function(s){return n(s[0])+"="+n(s[1])},"").join("&")};function Ht(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function qe(e,t,n){if(!t)return e;const r=n&&n.encode||Ht;a.isFunction(n)&&(n={serialize:n});const s=n&&n.serialize;let o;if(s?o=s(t,n):o=a.isURLSearchParams(t)?t.toString():new ue(t,n).toString(r),o){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+o}return e}class ye{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){a.forEach(this.handlers,function(r){r!==null&&t(r)})}}const He={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},It=typeof URLSearchParams<"u"?URLSearchParams:ue,Mt=typeof FormData<"u"?FormData:null,zt=typeof Blob<"u"?Blob:null,$t={isBrowser:!0,classes:{URLSearchParams:It,FormData:Mt,Blob:zt},protocols:["http","https","file","blob","url","data"]},fe=typeof window<"u"&&typeof document<"u",oe=typeof navigator=="object"&&navigator||void 0,Jt=fe&&(!oe||["ReactNative","NativeScript","NS"].indexOf(oe.product)<0),Vt=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Wt=fe&&window.location.href||"http://localhost",Kt=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:fe,hasStandardBrowserEnv:Jt,hasStandardBrowserWebWorkerEnv:Vt,navigator:oe,origin:Wt},Symbol.toStringTag,{value:"Module"})),O={...Kt,...$t};function vt(e,t){return Q(e,new O.classes.URLSearchParams,Object.assign({visitor:function(n,r,s,o){return O.isNode&&a.isBuffer(n)?(this.append(r,n.toString("base64")),!1):o.defaultVisitor.apply(this,arguments)}},t))}function Xt(e){return a.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function Gt(e){const t={},n=Object.keys(e);let r;const s=n.length;let o;for(r=0;r<s;r++)o=n[r],t[o]=e[o];return t}function Ie(e){function t(n,r,s,o){let i=n[o++];if(i==="__proto__")return!0;const c=Number.isFinite(+i),f=o>=n.length;return i=!i&&a.isArray(s)?s.length:i,f?(a.hasOwnProp(s,i)?s[i]=[s[i],r]:s[i]=r,!c):((!s[i]||!a.isObject(s[i]))&&(s[i]=[]),t(n,r,s[i],o)&&a.isArray(s[i])&&(s[i]=Gt(s[i])),!c)}if(a.isFormData(e)&&a.isFunction(e.entries)){const n={};return a.forEachEntry(e,(r,s)=>{t(Xt(r),s,n,0)}),n}return null}function Qt(e,t,n){if(a.isString(e))try{return(t||JSON.parse)(e),a.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const I={transitional:He,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",s=r.indexOf("application/json")>-1,o=a.isObject(t);if(o&&a.isHTMLForm(t)&&(t=new FormData(t)),a.isFormData(t))return s?JSON.stringify(Ie(t)):t;if(a.isArrayBuffer(t)||a.isBuffer(t)||a.isStream(t)||a.isFile(t)||a.isBlob(t)||a.isReadableStream(t))return t;if(a.isArrayBufferView(t))return t.buffer;if(a.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let c;if(o){if(r.indexOf("application/x-www-form-urlencoded")>-1)return vt(t,this.formSerializer).toString();if((c=a.isFileList(t))||r.indexOf("multipart/form-data")>-1){const f=this.env&&this.env.FormData;return Q(c?{"files[]":t}:t,f&&new f,this.formSerializer)}}return o||s?(n.setContentType("application/json",!1),Qt(t)):t}],transformResponse:[function(t){const n=this.transitional||I.transitional,r=n&&n.forcedJSONParsing,s=this.responseType==="json";if(a.isResponse(t)||a.isReadableStream(t))return t;if(t&&a.isString(t)&&(r&&!this.responseType||s)){const i=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t)}catch(c){if(i)throw c.name==="SyntaxError"?m.from(c,m.ERR_BAD_RESPONSE,this,null,this.response):c}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:O.classes.FormData,Blob:O.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};a.forEach(["delete","get","head","post","put","patch"],e=>{I.headers[e]={}});const Zt=a.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Yt=e=>{const t={};let n,r,s;return e&&e.split(`
|
|
2
|
+
`).forEach(function(i){s=i.indexOf(":"),n=i.substring(0,s).trim().toLowerCase(),r=i.substring(s+1).trim(),!(!n||t[n]&&Zt[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},be=Symbol("internals");function j(e){return e&&String(e).trim().toLowerCase()}function $(e){return e===!1||e==null?e:a.isArray(e)?e.map($):String(e)}function en(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const tn=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function ee(e,t,n,r,s){if(a.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!a.isString(t)){if(a.isString(r))return t.indexOf(r)!==-1;if(a.isRegExp(r))return r.test(t)}}function nn(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function rn(e,t){const n=a.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,o,i){return this[r].call(this,t,s,o,i)},configurable:!0})})}let x=class{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function o(c,f,l){const u=j(f);if(!u)throw new Error("header name must be a non-empty string");const d=a.findKey(s,u);(!d||s[d]===void 0||l===!0||l===void 0&&s[d]!==!1)&&(s[d||f]=$(c))}const i=(c,f)=>a.forEach(c,(l,u)=>o(l,u,f));if(a.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(a.isString(t)&&(t=t.trim())&&!tn(t))i(Yt(t),n);else if(a.isObject(t)&&a.isIterable(t)){let c={},f,l;for(const u of t){if(!a.isArray(u))throw TypeError("Object iterator must return a key-value pair");c[l=u[0]]=(f=c[l])?a.isArray(f)?[...f,u[1]]:[f,u[1]]:u[1]}i(c,n)}else t!=null&&o(n,t,r);return this}get(t,n){if(t=j(t),t){const r=a.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return en(s);if(a.isFunction(n))return n.call(this,s,r);if(a.isRegExp(n))return n.exec(s);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=j(t),t){const r=a.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||ee(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function o(i){if(i=j(i),i){const c=a.findKey(r,i);c&&(!n||ee(r,r[c],c,n))&&(delete r[c],s=!0)}}return a.isArray(t)?t.forEach(o):o(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const o=n[r];(!t||ee(this,this[o],o,t,!0))&&(delete this[o],s=!0)}return s}normalize(t){const n=this,r={};return a.forEach(this,(s,o)=>{const i=a.findKey(r,o);if(i){n[i]=$(s),delete n[o];return}const c=t?nn(o):String(o).trim();c!==o&&delete n[o],n[c]=$(s),r[c]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return a.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&a.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(`
|
|
3
|
+
`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[be]=this[be]={accessors:{}}).accessors,s=this.prototype;function o(i){const c=j(i);r[c]||(rn(s,i),r[c]=!0)}return a.isArray(t)?t.forEach(o):o(t),this}};x.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);a.reduceDescriptors(x.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});a.freezeMethods(x);function te(e,t){const n=this||I,r=t||n,s=x.from(r.headers);let o=r.data;return a.forEach(e,function(c){o=c.call(n,o,s.normalize(),t?t.status:void 0)}),s.normalize(),o}function Me(e){return!!(e&&e.__CANCEL__)}function k(e,t,n){m.call(this,e??"canceled",m.ERR_CANCELED,t,n),this.name="CanceledError"}a.inherits(k,m,{__CANCEL__:!0});function ze(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new m("Request failed with status code "+n.status,[m.ERR_BAD_REQUEST,m.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function sn(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function on(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,o=0,i;return t=t!==void 0?t:1e3,function(f){const l=Date.now(),u=r[o];i||(i=l),n[s]=f,r[s]=l;let d=o,b=0;for(;d!==s;)b+=n[d++],d=d%e;if(s=(s+1)%e,s===o&&(o=(o+1)%e),l-i<t)return;const R=u&&l-u;return R?Math.round(b*1e3/R):void 0}}function an(e,t){let n=0,r=1e3/t,s,o;const i=(l,u=Date.now())=>{n=u,s=null,o&&(clearTimeout(o),o=null),e.apply(null,l)};return[(...l)=>{const u=Date.now(),d=u-n;d>=r?i(l,u):(s=l,o||(o=setTimeout(()=>{o=null,i(s)},r-d)))},()=>s&&i(s)]}const V=(e,t,n=3)=>{let r=0;const s=on(50,250);return an(o=>{const i=o.loaded,c=o.lengthComputable?o.total:void 0,f=i-r,l=s(f),u=i<=c;r=i;const d={loaded:i,total:c,progress:c?i/c:void 0,bytes:f,rate:l||void 0,estimated:l&&c&&u?(c-i)/l:void 0,event:o,lengthComputable:c!=null,[t?"download":"upload"]:!0};e(d)},n)},we=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Ee=e=>(...t)=>a.asap(()=>e(...t)),cn=O.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,O.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(O.origin),O.navigator&&/(msie|trident)/i.test(O.navigator.userAgent)):()=>!0,ln=O.hasStandardBrowserEnv?{write(e,t,n,r,s,o){const i=[e+"="+encodeURIComponent(t)];a.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),a.isString(r)&&i.push("path="+r),a.isString(s)&&i.push("domain="+s),o===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function un(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function fn(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function $e(e,t,n){let r=!un(t);return e&&(r||n==!1)?fn(e,t):t}const Re=e=>e instanceof x?{...e}:e;function B(e,t){t=t||{};const n={};function r(l,u,d,b){return a.isPlainObject(l)&&a.isPlainObject(u)?a.merge.call({caseless:b},l,u):a.isPlainObject(u)?a.merge({},u):a.isArray(u)?u.slice():u}function s(l,u,d,b){if(a.isUndefined(u)){if(!a.isUndefined(l))return r(void 0,l,d,b)}else return r(l,u,d,b)}function o(l,u){if(!a.isUndefined(u))return r(void 0,u)}function i(l,u){if(a.isUndefined(u)){if(!a.isUndefined(l))return r(void 0,l)}else return r(void 0,u)}function c(l,u,d){if(d in t)return r(l,u);if(d in e)return r(void 0,l)}const f={url:o,method:o,data:o,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:c,headers:(l,u,d)=>s(Re(l),Re(u),d,!0)};return a.forEach(Object.keys(Object.assign({},e,t)),function(u){const d=f[u]||s,b=d(e[u],t[u],u);a.isUndefined(b)&&d!==c||(n[u]=b)}),n}const Je=e=>{const t=B({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:s,xsrfCookieName:o,headers:i,auth:c}=t;t.headers=i=x.from(i),t.url=qe($e(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),c&&i.set("Authorization","Basic "+btoa((c.username||"")+":"+(c.password?unescape(encodeURIComponent(c.password)):"")));let f;if(a.isFormData(n)){if(O.hasStandardBrowserEnv||O.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((f=i.getContentType())!==!1){const[l,...u]=f?f.split(";").map(d=>d.trim()).filter(Boolean):[];i.setContentType([l||"multipart/form-data",...u].join("; "))}}if(O.hasStandardBrowserEnv&&(r&&a.isFunction(r)&&(r=r(t)),r||r!==!1&&cn(t.url))){const l=s&&o&&ln.read(o);l&&i.set(s,l)}return t},dn=typeof XMLHttpRequest<"u",pn=dn&&function(e){return new Promise(function(n,r){const s=Je(e);let o=s.data;const i=x.from(s.headers).normalize();let{responseType:c,onUploadProgress:f,onDownloadProgress:l}=s,u,d,b,R,p;function y(){R&&R(),p&&p(),s.cancelToken&&s.cancelToken.unsubscribe(u),s.signal&&s.signal.removeEventListener("abort",u)}let h=new XMLHttpRequest;h.open(s.method.toUpperCase(),s.url,!0),h.timeout=s.timeout;function w(){if(!h)return;const g=x.from("getAllResponseHeaders"in h&&h.getAllResponseHeaders()),T={data:!c||c==="text"||c==="json"?h.responseText:h.response,status:h.status,statusText:h.statusText,headers:g,config:e,request:h};ze(function(_){n(_),y()},function(_){r(_),y()},T),h=null}"onloadend"in h?h.onloadend=w:h.onreadystatechange=function(){!h||h.readyState!==4||h.status===0&&!(h.responseURL&&h.responseURL.indexOf("file:")===0)||setTimeout(w)},h.onabort=function(){h&&(r(new m("Request aborted",m.ECONNABORTED,e,h)),h=null)},h.onerror=function(){r(new m("Network Error",m.ERR_NETWORK,e,h)),h=null},h.ontimeout=function(){let P=s.timeout?"timeout of "+s.timeout+"ms exceeded":"timeout exceeded";const T=s.transitional||He;s.timeoutErrorMessage&&(P=s.timeoutErrorMessage),r(new m(P,T.clarifyTimeoutError?m.ETIMEDOUT:m.ECONNABORTED,e,h)),h=null},o===void 0&&i.setContentType(null),"setRequestHeader"in h&&a.forEach(i.toJSON(),function(P,T){h.setRequestHeader(T,P)}),a.isUndefined(s.withCredentials)||(h.withCredentials=!!s.withCredentials),c&&c!=="json"&&(h.responseType=s.responseType),l&&([b,p]=V(l,!0),h.addEventListener("progress",b)),f&&h.upload&&([d,R]=V(f),h.upload.addEventListener("progress",d),h.upload.addEventListener("loadend",R)),(s.cancelToken||s.signal)&&(u=g=>{h&&(r(!g||g.type?new k(null,e,h):g),h.abort(),h=null)},s.cancelToken&&s.cancelToken.subscribe(u),s.signal&&(s.signal.aborted?u():s.signal.addEventListener("abort",u)));const S=sn(s.url);if(S&&O.protocols.indexOf(S)===-1){r(new m("Unsupported protocol "+S+":",m.ERR_BAD_REQUEST,e));return}h.send(o||null)})},hn=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,s;const o=function(l){if(!s){s=!0,c();const u=l instanceof Error?l:this.reason;r.abort(u instanceof m?u:new k(u instanceof Error?u.message:u))}};let i=t&&setTimeout(()=>{i=null,o(new m(`timeout ${t} of ms exceeded`,m.ETIMEDOUT))},t);const c=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(l=>{l.unsubscribe?l.unsubscribe(o):l.removeEventListener("abort",o)}),e=null)};e.forEach(l=>l.addEventListener("abort",o));const{signal:f}=r;return f.unsubscribe=()=>a.asap(c),f}},mn=function*(e,t){let n=e.byteLength;if(n<t){yield e;return}let r=0,s;for(;r<n;)s=r+t,yield e.slice(r,s),r=s},yn=async function*(e,t){for await(const n of bn(e))yield*mn(n,t)},bn=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:n,value:r}=await t.read();if(n)break;yield r}}finally{await t.cancel()}},Se=(e,t,n,r)=>{const s=yn(e,t);let o=0,i,c=f=>{i||(i=!0,r&&r(f))};return new ReadableStream({async pull(f){try{const{done:l,value:u}=await s.next();if(l){c(),f.close();return}let d=u.byteLength;if(n){let b=o+=d;n(b)}f.enqueue(new Uint8Array(u))}catch(l){throw c(l),l}},cancel(f){return c(f),s.return()}},{highWaterMark:2})},Z=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Ve=Z&&typeof ReadableStream=="function",wn=Z&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),We=(e,...t)=>{try{return!!e(...t)}catch{return!1}},En=Ve&&We(()=>{let e=!1;const t=new Request(O.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),ge=64*1024,ie=Ve&&We(()=>a.isReadableStream(new Response("").body)),W={stream:ie&&(e=>e.body)};Z&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!W[t]&&(W[t]=a.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new m(`Response type '${t}' is not supported`,m.ERR_NOT_SUPPORT,r)})})})(new Response);const Rn=async e=>{if(e==null)return 0;if(a.isBlob(e))return e.size;if(a.isSpecCompliantForm(e))return(await new Request(O.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(a.isArrayBufferView(e)||a.isArrayBuffer(e))return e.byteLength;if(a.isURLSearchParams(e)&&(e=e+""),a.isString(e))return(await wn(e)).byteLength},Sn=async(e,t)=>{const n=a.toFiniteNumber(e.getContentLength());return n??Rn(t)},gn=Z&&(async e=>{let{url:t,method:n,data:r,signal:s,cancelToken:o,timeout:i,onDownloadProgress:c,onUploadProgress:f,responseType:l,headers:u,withCredentials:d="same-origin",fetchOptions:b}=Je(e);l=l?(l+"").toLowerCase():"text";let R=hn([s,o&&o.toAbortSignal()],i),p;const y=R&&R.unsubscribe&&(()=>{R.unsubscribe()});let h;try{if(f&&En&&n!=="get"&&n!=="head"&&(h=await Sn(u,r))!==0){let T=new Request(t,{method:"POST",body:r,duplex:"half"}),F;if(a.isFormData(r)&&(F=T.headers.get("content-type"))&&u.setContentType(F),T.body){const[_,M]=we(h,V(Ee(f)));r=Se(T.body,ge,_,M)}}a.isString(d)||(d=d?"include":"omit");const w="credentials"in Request.prototype;p=new Request(t,{...b,signal:R,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:"half",credentials:w?d:void 0});let S=await fetch(p);const g=ie&&(l==="stream"||l==="response");if(ie&&(c||g&&y)){const T={};["status","statusText","headers"].forEach(de=>{T[de]=S[de]});const F=a.toFiniteNumber(S.headers.get("content-length")),[_,M]=c&&we(F,V(Ee(c),!0))||[];S=new Response(Se(S.body,ge,_,()=>{M&&M(),y&&y()}),T)}l=l||"text";let P=await W[a.findKey(W,l)||"text"](S,e);return!g&&y&&y(),await new Promise((T,F)=>{ze(T,F,{data:P,headers:x.from(S.headers),status:S.status,statusText:S.statusText,config:e,request:p})})}catch(w){throw y&&y(),w&&w.name==="TypeError"&&/Load failed|fetch/i.test(w.message)?Object.assign(new m("Network Error",m.ERR_NETWORK,e,p),{cause:w.cause||w}):m.from(w,w&&w.code,e,p)}}),ae={http:kt,xhr:pn,fetch:gn};a.forEach(ae,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Oe=e=>`- ${e}`,On=e=>a.isFunction(e)||e===null||e===!1,Ke={getAdapter:e=>{e=a.isArray(e)?e:[e];const{length:t}=e;let n,r;const s={};for(let o=0;o<t;o++){n=e[o];let i;if(r=n,!On(n)&&(r=ae[(i=String(n)).toLowerCase()],r===void 0))throw new m(`Unknown adapter '${i}'`);if(r)break;s[i||"#"+o]=r}if(!r){const o=Object.entries(s).map(([c,f])=>`adapter ${c} `+(f===!1?"is not supported by the environment":"is not available in the build"));let i=t?o.length>1?`since :
|
|
4
|
+
`+o.map(Oe).join(`
|
|
5
|
+
`):" "+Oe(o[0]):"as no adapter specified";throw new m("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:ae};function ne(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new k(null,e)}function Te(e){return ne(e),e.headers=x.from(e.headers),e.data=te.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Ke.getAdapter(e.adapter||I.adapter)(e).then(function(r){return ne(e),r.data=te.call(e,e.transformResponse,r),r.headers=x.from(r.headers),r},function(r){return Me(r)||(ne(e),r&&r.response&&(r.response.data=te.call(e,e.transformResponse,r.response),r.response.headers=x.from(r.response.headers))),Promise.reject(r)})}const ve="1.9.0",Y={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Y[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Ae={};Y.transitional=function(t,n,r){function s(o,i){return"[Axios v"+ve+"] Transitional option '"+o+"'"+i+(r?". "+r:"")}return(o,i,c)=>{if(t===!1)throw new m(s(i," has been removed"+(n?" in "+n:"")),m.ERR_DEPRECATED);return n&&!Ae[i]&&(Ae[i]=!0,console.warn(s(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(o,i,c):!0}};Y.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function Tn(e,t,n){if(typeof e!="object")throw new m("options must be an object",m.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const o=r[s],i=t[o];if(i){const c=e[o],f=c===void 0||i(c,o,e);if(f!==!0)throw new m("option "+o+" must be "+f,m.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new m("Unknown option "+o,m.ERR_BAD_OPTION)}}const J={assertOptions:Tn,validators:Y},N=J.validators;let L=class{constructor(t){this.defaults=t||{},this.interceptors={request:new ye,response:new ye}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const o=s.stack?s.stack.replace(/^.+\n/,""):"";try{r.stack?o&&!String(r.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(r.stack+=`
|
|
6
|
+
`+o):r.stack=o}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=B(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:o}=n;r!==void 0&&J.assertOptions(r,{silentJSONParsing:N.transitional(N.boolean),forcedJSONParsing:N.transitional(N.boolean),clarifyTimeoutError:N.transitional(N.boolean)},!1),s!=null&&(a.isFunction(s)?n.paramsSerializer={serialize:s}:J.assertOptions(s,{encode:N.function,serialize:N.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),J.assertOptions(n,{baseUrl:N.spelling("baseURL"),withXsrfToken:N.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=o&&a.merge(o.common,o[n.method]);o&&a.forEach(["delete","get","head","post","put","patch","common"],p=>{delete o[p]}),n.headers=x.concat(i,o);const c=[];let f=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(n)===!1||(f=f&&y.synchronous,c.unshift(y.fulfilled,y.rejected))});const l=[];this.interceptors.response.forEach(function(y){l.push(y.fulfilled,y.rejected)});let u,d=0,b;if(!f){const p=[Te.bind(this),void 0];for(p.unshift.apply(p,c),p.push.apply(p,l),b=p.length,u=Promise.resolve(n);d<b;)u=u.then(p[d++],p[d++]);return u}b=c.length;let R=n;for(d=0;d<b;){const p=c[d++],y=c[d++];try{R=p(R)}catch(h){y.call(this,h);break}}try{u=Te.call(this,R)}catch(p){return Promise.reject(p)}for(d=0,b=l.length;d<b;)u=u.then(l[d++],l[d++]);return u}getUri(t){t=B(this.defaults,t);const n=$e(t.baseURL,t.url,t.allowAbsoluteUrls);return qe(n,t.params,t.paramsSerializer)}};a.forEach(["delete","get","head","options"],function(t){L.prototype[t]=function(n,r){return this.request(B(r||{},{method:t,url:n,data:(r||{}).data}))}});a.forEach(["post","put","patch"],function(t){function n(r){return function(o,i,c){return this.request(B(c||{},{method:t,headers:r?{"Content-Type":"multipart/form-data"}:{},url:o,data:i}))}}L.prototype[t]=n(),L.prototype[t+"Form"]=n(!0)});let An=class Xe{constructor(t){if(typeof t!="function")throw new TypeError("executor must be a function.");let n;this.promise=new Promise(function(o){n=o});const r=this;this.promise.then(s=>{if(!r._listeners)return;let o=r._listeners.length;for(;o-- >0;)r._listeners[o](s);r._listeners=null}),this.promise.then=s=>{let o;const i=new Promise(c=>{r.subscribe(c),o=c}).then(s);return i.cancel=function(){r.unsubscribe(o)},i},t(function(o,i,c){r.reason||(r.reason=new k(o,i,c),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Xe(function(s){t=s}),cancel:t}}};function xn(e){return function(n){return e.apply(null,n)}}function Cn(e){return a.isObject(e)&&e.isAxiosError===!0}const ce={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(ce).forEach(([e,t])=>{ce[t]=e});function Ge(e){const t=new L(e),n=xe(L.prototype.request,t);return a.extend(n,L.prototype,t,{allOwnKeys:!0}),a.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return Ge(B(e,s))},n}const E=Ge(I);E.Axios=L;E.CanceledError=k;E.CancelToken=An;E.isCancel=Me;E.VERSION=ve;E.toFormData=Q;E.AxiosError=m;E.Cancel=E.CanceledError;E.all=function(t){return Promise.all(t)};E.spread=xn;E.isAxiosError=Cn;E.mergeConfig=B;E.AxiosHeaders=x;E.formToJSON=e=>Ie(a.isHTMLForm(e)?new FormData(e):e);E.getAdapter=Ke.getAdapter;E.HttpStatusCode=ce;E.default=E;const{Axios:Fn,AxiosError:_n,CanceledError:Un,isCancel:Ln,CancelToken:Bn,VERSION:Dn,all:kn,Cancel:jn,isAxiosError:qn,spread:Hn,toFormData:In,AxiosHeaders:Mn,HttpStatusCode:zn,formToJSON:$n,getAdapter:Jn,mergeConfig:Vn}=E;export{E as a};
|
|
Binary file
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as e}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const a=e("PlusIcon",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);export{a as P};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{c as o}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const a=o("ArrowLeftIcon",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/**
|
|
7
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const n=o("SaveIcon",[["path",{d:"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z",key:"1owoqh"}],["polyline",{points:"17 21 17 13 7 13 7 21",key:"1md35c"}],["polyline",{points:"7 3 7 8 15 8",key:"8nz8an"}]]);export{a as A,n as S};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const r=c("SearchIcon",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);export{r as S};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as a}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const c=a("SettingsIcon",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);export{c as S};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as a}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const o=a("SquarePenIcon",[["path",{d:"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",key:"1m0v6g"}],["path",{d:"M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z",key:"1lpok0"}]]);export{o as S};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as e}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const a=e("Trash2Icon",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);export{a as T};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Q as d,m as f,r as i,R as p,p as h,S as v,T as y,V as m,W as b}from"./index-DYyZmLWO.js";let g;function w(){return g}function _(e){return typeof e=="function"?e():f(e)}function s(e){if(e instanceof Promise||e instanceof Date||e instanceof RegExp)return e;const n=_(e);if(!e||!n)return n;if(Array.isArray(n))return n.map(t=>s(t));if(typeof n=="object"){const t={};for(const o in n)if(Object.prototype.hasOwnProperty.call(n,o)){if(o==="titleTemplate"||o[0]==="o"&&o[1]==="n"){t[o]=f(n[o]);continue}t[o]=s(n[o])}return t}return n}const H="usehead",c=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},u="__unhead_injection_handler__";function j(){return u in c?c[u]():d(H)||w()}function I(e,n={}){const t=n.head||j();if(t)return t.ssr?t.push(e,n):A(t,e,n)}function A(e,n,t={}){const o=i(!1),a=i({});p(()=>{a.value=o.value?{}:s(n)});const r=e.push(a.value,t);return h(a,l=>{r.patch(l)}),b()&&(v(()=>{r.dispose()}),y(()=>{o.value=!0}),m(()=>{o.value=!1})),r}export{I as u};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const o=c("XIcon",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);export{o as X};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{c}from"./index-DYyZmLWO.js";/**
|
|
2
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const r=c("CheckCircleIcon",[["path",{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14",key:"g774vq"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/**
|
|
7
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const a=c("EyeIcon",[["path",{d:"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z",key:"rwhkz3"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/**
|
|
12
|
+
* @license lucide-vue-next v0.344.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const y=c("XCircleIcon",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]]);export{r as C,a as E,y as X};
|
|
Binary file
|
package/dist/index.html
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<link rel="icon" type="image/svg+xml" href="/images/logo.png" />
|
|
7
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
+
<title>User Profile</title>
|
|
9
|
+
<script>
|
|
10
|
+
(function() {
|
|
11
|
+
try {
|
|
12
|
+
var theme = localStorage.getItem('theme');
|
|
13
|
+
if (theme === 'light' || theme === 'dark') {
|
|
14
|
+
document.documentElement.classList.add(theme);
|
|
15
|
+
} else {
|
|
16
|
+
document.documentElement.classList.add('dark');
|
|
17
|
+
}
|
|
18
|
+
} catch (e) {
|
|
19
|
+
document.documentElement.classList.add('dark');
|
|
20
|
+
}
|
|
21
|
+
})();
|
|
22
|
+
</script>
|
|
23
|
+
<script type="module" crossorigin src="/assets/index-DYyZmLWO.js"></script>
|
|
24
|
+
<link rel="stylesheet" crossorigin href="/assets/index-9GY17iSP.css">
|
|
25
|
+
</head>
|
|
26
|
+
<body>
|
|
27
|
+
<div id="app"></div>
|
|
28
|
+
<div id="modal"></div>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opengis/cms",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "cms",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Softpro",
|
|
@@ -17,39 +17,45 @@
|
|
|
17
17
|
"build": "cross-env APP=true vite build",
|
|
18
18
|
"build-npm": "vite build",
|
|
19
19
|
"start": "node server",
|
|
20
|
-
"prod": "cross-env NODE_ENV=production
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"docs:preview": "vitepress preview docs"
|
|
20
|
+
"prod": "cross-env NODE_ENV=production node server --cms=cms/softpro",
|
|
21
|
+
"prod-ip": "cross-env NODE_ENV=production node server --cms=cms/ip",
|
|
22
|
+
"dev": "node server --cms=cms/softpro"
|
|
24
23
|
},
|
|
25
24
|
"dependencies": {
|
|
26
|
-
"@opengis/
|
|
27
|
-
"@opengis/fastify-
|
|
28
|
-
"@opengis/fastify-
|
|
29
|
-
"@opengis/
|
|
30
|
-
"@opengis/v3-
|
|
31
|
-
"@
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"vue-
|
|
25
|
+
"@opengis/admin": "0.3.109",
|
|
26
|
+
"@opengis/fastify-auth": "1.1.0",
|
|
27
|
+
"@opengis/fastify-file": "1.1.1",
|
|
28
|
+
"@opengis/fastify-table": "1.4.1",
|
|
29
|
+
"@opengis/v3-core": "0.3.190",
|
|
30
|
+
"@opengis/v3-filter": "0.0.74",
|
|
31
|
+
"@vitejs/plugin-vue": "5.0.4",
|
|
32
|
+
"@vueuse/core": "10.9.0",
|
|
33
|
+
"@vueuse/head": "2.0.0",
|
|
34
|
+
"cross-env": "7.0.3",
|
|
35
|
+
"fastify": "5.3.3",
|
|
36
|
+
"fastify-plugin": "5.0.1",
|
|
37
|
+
"lucide-vue-next": "0.344.0",
|
|
38
|
+
"moment": "2.30.1",
|
|
39
|
+
"pinia": "3.0.2",
|
|
40
|
+
"vite": "5.1.4",
|
|
41
|
+
"vue": "3.5.13",
|
|
42
|
+
"vue-i18n": "11.1.5",
|
|
43
|
+
"vue-router": "4.4.3"
|
|
39
44
|
},
|
|
40
45
|
"devDependencies": {
|
|
41
|
-
"@
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
46
|
+
"@parcel/watcher": "2.4.1",
|
|
47
|
+
"@tailwindcss/typography": "0.5.10",
|
|
48
|
+
"@types/node": "20.11.25",
|
|
49
|
+
"@vitejs/plugin-vue": "5.0.4",
|
|
50
|
+
"autoprefixer": "10.4.18",
|
|
51
|
+
"eslint": "8.49.0",
|
|
52
|
+
"eslint-config-airbnb": "19.0.4",
|
|
53
|
+
"eslint-plugin-import": "2.25.3",
|
|
54
|
+
"eslint-plugin-vue": "9.17.0",
|
|
55
|
+
"postcss": "8.4.35",
|
|
56
|
+
"tailwindcss": "3.4.1",
|
|
57
|
+
"typescript": "5.2.2",
|
|
58
|
+
"vite": "5.1.4",
|
|
59
|
+
"vue-tsc": "1.8.27"
|
|
54
60
|
}
|
|
55
|
-
}
|
|
61
|
+
}
|
package/server/app.js
CHANGED
|
@@ -1,28 +1,50 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'url';
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
4
|
|
|
4
|
-
import { config, execMigrations } from '@opengis/fastify-table/utils.js';
|
|
5
|
+
import { config, pgClients, execMigrations, getPGAsync } from '@opengis/fastify-table/utils.js';
|
|
6
|
+
|
|
7
|
+
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
|
|
9
|
+
// cross-env cms=cms/softpro npm start
|
|
10
|
+
if (process.argv.find(el => el.includes('--cms'))) {
|
|
11
|
+
const subdir = process.argv.find(el => el.includes('--cms')).substring(6);
|
|
12
|
+
const cmsDir = path.join(dirname, '..', subdir).replace(/\\/g, '/'); // from app.js
|
|
13
|
+
|
|
14
|
+
const cmsConfig = existsSync(path.join(cmsDir, 'setting.json'))
|
|
15
|
+
? JSON.parse(readFileSync(path.join(cmsDir, 'setting.json'), 'utf8'))
|
|
16
|
+
: {};
|
|
17
|
+
|
|
18
|
+
config.auth = config.auth || cmsConfig.auth;
|
|
19
|
+
config.pg = cmsConfig.pg;
|
|
20
|
+
config.cms = cmsConfig.cms || {};
|
|
21
|
+
config.cms.root = cmsDir;
|
|
22
|
+
config.folder = path.posix.join(config.folder || '', config.cms.folder || subdir);
|
|
23
|
+
}
|
|
5
24
|
|
|
6
25
|
config.prefix = config.prefix || '/api';
|
|
7
26
|
const { prefix } = config;
|
|
8
27
|
|
|
9
|
-
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
-
|
|
11
28
|
export default async function (fastify) {
|
|
12
29
|
// core
|
|
30
|
+
fastify.register(import('./plugins/adminHook.js'));
|
|
13
31
|
fastify.register(import('./plugins/hook.js'));
|
|
14
32
|
|
|
15
33
|
fastify.register(import('@opengis/fastify-table'), config);
|
|
16
|
-
fastify.register(import('@opengis/fastify-auth'), config);
|
|
34
|
+
// fastify.register(import('@opengis/fastify-auth'), config);
|
|
17
35
|
fastify.register(import('@opengis/fastify-file'), config);
|
|
18
36
|
|
|
19
37
|
fastify.register(import('./plugins/vite.js'));
|
|
20
38
|
// API
|
|
21
39
|
fastify.register(import('./routes/root.mjs'));
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
40
|
+
|
|
41
|
+
if (!config.pg || config.cms?.provider === 'file') {
|
|
42
|
+
fastify.register(import('./routes/fileContent/index.mjs'), { prefix });
|
|
43
|
+
} else {
|
|
44
|
+
fastify.register(import('./routes/cms/index.mjs'), { prefix });
|
|
45
|
+
fastify.register(import('./routes/contentType/index.mjs'), { prefix });
|
|
46
|
+
fastify.register(import('./routes/category/index.mjs'), { prefix });
|
|
47
|
+
const pg = await getPGAsync(config.pg);
|
|
48
|
+
execMigrations(path.join(dirname, 'migrations'), pg).catch(err => console.log(err));
|
|
49
|
+
}
|
|
28
50
|
}
|
package/server/index.js
CHANGED
|
@@ -2,12 +2,11 @@ import Fastify from 'fastify';
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
import appService from './app.js';
|
|
5
|
-
import config from './config.js';
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
import { config, logger } from '@opengis/fastify-table/utils.js';
|
|
8
7
|
|
|
9
8
|
// Instantiate Fastify with some config
|
|
10
|
-
const app = Fastify({
|
|
9
|
+
const app = Fastify({ loggerInstance: logger });
|
|
11
10
|
|
|
12
11
|
// Register your application as a normal plugin.
|
|
13
12
|
|
|
@@ -17,6 +16,7 @@ process.env.PORT = process.env.PORT || config.port || 3000;
|
|
|
17
16
|
// Start listening.
|
|
18
17
|
app.listen({ host: '0.0.0.0', port: process.env.PORT }, (err) => {
|
|
19
18
|
if (err) {
|
|
19
|
+
console.error(err.toString());
|
|
20
20
|
app.log.error(err);
|
|
21
21
|
process.exit(1);
|
|
22
22
|
}
|
|
@@ -2,11 +2,19 @@ create schema if not exists admin;
|
|
|
2
2
|
create table if not exists admin.users (uid text primary key default next_id());
|
|
3
3
|
|
|
4
4
|
create schema if not exists site;
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
-- drop table if exists site.categories cascade;
|
|
7
|
+
create table if not exists site.categories (
|
|
8
|
+
category_id text primary key default next_id(),
|
|
9
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
10
|
+
updated_at TIMESTAMP DEFAULT NOW(),
|
|
11
|
+
created_by text REFERENCES admin.users(uid),
|
|
12
|
+
updated_by text REFERENCES admin.users(uid)
|
|
13
|
+
);
|
|
6
14
|
|
|
7
15
|
-- drop table if exists site.articles cascade;
|
|
8
16
|
CREATE TABLE if not exists site.articles (
|
|
9
|
-
|
|
17
|
+
articles_id text PRIMARY KEY default next_id(),
|
|
10
18
|
title VARCHAR (100) NOT NULL,
|
|
11
19
|
slug VARCHAR (50) UNIQUE,
|
|
12
20
|
content TEXT,
|
|
@@ -24,6 +32,10 @@ CREATE TABLE if not exists site.articles (
|
|
|
24
32
|
category_id text REFERENCES site.categories(category_id) ON DELETE SET NULL
|
|
25
33
|
);
|
|
26
34
|
|
|
35
|
+
alter table site.articles add column if not exists category_id text REFERENCES site.categories(category_id) ON DELETE SET NULL;
|
|
36
|
+
alter table site.articles add column if not exists meta_title VARCHAR;
|
|
37
|
+
alter table site.articles add column if not exists meta_description TEXT;
|
|
38
|
+
|
|
27
39
|
CREATE INDEX if not exists idx_published_articles ON site.articles(published_at) WHERE status = 'published';
|
|
28
40
|
CREATE INDEX if not exists idx_articles_status ON site.articles(status);
|
|
29
41
|
CREATE INDEX if not exists idx_articles_category_id ON site.articles(category_id);
|
|
@@ -32,7 +44,7 @@ CREATE INDEX if not exists idx_articles_is_visible ON site.articles(is_visible);
|
|
|
32
44
|
CREATE INDEX if not exists idx_articles_published_at ON site.articles(published_at);
|
|
33
45
|
|
|
34
46
|
COMMENT ON TABLE site.articles IS 'Articles for the site, including content, metadata, status, and authorship.';
|
|
35
|
-
COMMENT ON COLUMN site.articles.
|
|
47
|
+
COMMENT ON COLUMN site.articles.articles_id IS 'Primary key for the article, generated via next_id().';
|
|
36
48
|
COMMENT ON COLUMN site.articles.title IS 'Title of the article.';
|
|
37
49
|
COMMENT ON COLUMN site.articles.slug IS 'URL-friendly unique identifier for the article.';
|
|
38
50
|
COMMENT ON COLUMN site.articles.content IS 'Full body content of the article.';
|
|
@@ -91,12 +103,16 @@ CREATE INDEX if not exists idx_media_updated_by ON site.media(updated_by);
|
|
|
91
103
|
|
|
92
104
|
-- drop table if exists site.article_media cascade;
|
|
93
105
|
CREATE TABLE if not exists site.article_media (
|
|
94
|
-
article_id text not null REFERENCES site.articles(
|
|
106
|
+
article_id text not null REFERENCES site.articles(articles_id) ON DELETE CASCADE,
|
|
95
107
|
media_id text not null REFERENCES site.media(media_id) ON DELETE CASCADE,
|
|
96
108
|
related_id text NOT NULL,
|
|
97
109
|
related_type VARCHAR(50) NOT NULL,
|
|
98
110
|
field VARCHAR(50) NOT NULL,
|
|
99
111
|
order_index INTEGER DEFAULT 0,
|
|
112
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
113
|
+
updated_at TIMESTAMP DEFAULT NOW(),
|
|
114
|
+
created_by text REFERENCES admin.users(uid),
|
|
115
|
+
updated_by text REFERENCES admin.users(uid),
|
|
100
116
|
PRIMARY KEY (article_id, media_id, field)
|
|
101
117
|
);
|
|
102
118
|
|
|
@@ -115,8 +131,10 @@ CREATE INDEX if not exists idx_article_media_ordering ON site.article_media(arti
|
|
|
115
131
|
CREATE TABLE if not exists site.content_types (
|
|
116
132
|
content_type_id text PRIMARY KEY default next_id(),
|
|
117
133
|
name VARCHAR (50) NOT NULL UNIQUE,
|
|
118
|
-
|
|
119
|
-
|
|
134
|
+
title VARCHAR (50) NOT NULL,
|
|
135
|
+
slug VARCHAR (50) NOT NULL UNIQUE,
|
|
136
|
+
table_name VARCHAR(50),
|
|
137
|
+
columns json,
|
|
120
138
|
status VARCHAR (20) DEFAULT 'draft' CHECK (status::text = ANY (ARRAY['draft', 'published', 'archived']::text[])),
|
|
121
139
|
visible BOOLEAN DEFAULT TRUE,
|
|
122
140
|
localized BOOLEAN DEFAULT FALSE,
|
|
@@ -134,7 +152,7 @@ CREATE TABLE if not exists site.content_types (
|
|
|
134
152
|
COMMENT ON TABLE site.content_types IS 'Defines reusable content structures for dynamic content management.';
|
|
135
153
|
COMMENT ON COLUMN site.content_types.content_type_id IS 'Unique identifier for the content type.';
|
|
136
154
|
COMMENT ON COLUMN site.content_types.name IS 'Internal name used in the system (must be unique).';
|
|
137
|
-
COMMENT ON COLUMN site.content_types.
|
|
155
|
+
COMMENT ON COLUMN site.content_types.name IS 'Title';
|
|
138
156
|
COMMENT ON COLUMN site.content_types.table_name IS 'Physical table where entries of this type are stored.';
|
|
139
157
|
COMMENT ON COLUMN site.content_types.status IS 'Status of the content type (draft, published, archived).';
|
|
140
158
|
COMMENT ON COLUMN site.content_types.visible IS 'Controls whether this content type appears in admin UI.';
|
|
@@ -207,7 +225,7 @@ CREATE INDEX if not exists idx_attributes_type ON site.content_attributes(type);
|
|
|
207
225
|
-- drop table if exists site.article_translations cascade;
|
|
208
226
|
CREATE TABLE if not exists site.article_translations (
|
|
209
227
|
article_translation_id text PRIMARY KEY default next_id(),
|
|
210
|
-
article_id text REFERENCES site.articles(
|
|
228
|
+
article_id text REFERENCES site.articles(articles_id) ON DELETE CASCADE,
|
|
211
229
|
locale VARCHAR(10) NOT NULL,
|
|
212
230
|
title VARCHAR (100) NOT NULL,
|
|
213
231
|
content TEXT,
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fp from 'fastify-plugin';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
|
|
4
|
+
async function plugin(fastify) {
|
|
5
|
+
// preSerialization
|
|
6
|
+
fastify.addHook('preSerialization', async (req, reply, payload) => {
|
|
7
|
+
if (req.url.includes('/suggest/') && !req.query.json) {
|
|
8
|
+
return payload?.data;
|
|
9
|
+
}
|
|
10
|
+
/* if (payload.redirect) {
|
|
11
|
+
return reply.redirect(payload.redirect);
|
|
12
|
+
}*/
|
|
13
|
+
if (reply.sent) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (!payload) {
|
|
17
|
+
return payload;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (['200', '400', '500', '403', '404'].includes(payload.status)) {
|
|
21
|
+
reply.status(payload.status);
|
|
22
|
+
}
|
|
23
|
+
/* if (payload.headers) {
|
|
24
|
+
reply.headers(payload.headers);
|
|
25
|
+
} */
|
|
26
|
+
if (payload.buffer) {
|
|
27
|
+
return payload.buffer;
|
|
28
|
+
}
|
|
29
|
+
if (payload.file) {
|
|
30
|
+
// const buffer = await readFile(payload.file);
|
|
31
|
+
// return reply.send(buffer);
|
|
32
|
+
const stream = createReadStream(payload.file);
|
|
33
|
+
return stream;
|
|
34
|
+
// return reply.send(stream);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (payload.message) {
|
|
38
|
+
return payload.message;
|
|
39
|
+
}
|
|
40
|
+
return payload;
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// preValidation
|
|
44
|
+
fastify.addHook('preValidation', async (req) => {
|
|
45
|
+
const parseRawBody = ['POST', 'PUT'].includes(req.method) && req.body && typeof req.body === 'string'
|
|
46
|
+
&& req.body.trim(/\r\n/g).startsWith('{')
|
|
47
|
+
&& req.body.trim(/\r\n/g).endsWith('}');
|
|
48
|
+
if (parseRawBody) {
|
|
49
|
+
try {
|
|
50
|
+
req.body = JSON.parse(req.body || '{}');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
// throw new Error('invalid body');
|
|
54
|
+
// return { error: 'invalid body', status: 400 };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// allow upload file
|
|
60
|
+
const kIsMultipart = Symbol.for('[FastifyMultipart.isMultipart]');
|
|
61
|
+
fastify.addContentTypeParser('multipart', (request, _, done) => {
|
|
62
|
+
request[kIsMultipart] = true;
|
|
63
|
+
done(null);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// parse Body
|
|
67
|
+
function contentParser(req, body, done) {
|
|
68
|
+
const parseBody = decodeURIComponent(body.toString()).split('&').reduce((acc, el) => {
|
|
69
|
+
const [key, val] = el.split('=');
|
|
70
|
+
return { ...acc, [key]: val };
|
|
71
|
+
}, {});
|
|
72
|
+
done(null, parseBody);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fastify.addContentTypeParser('application/x-www-form-urlencoded', { parseAs: 'buffer' }, contentParser);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default fp(plugin);
|