diff --git a/Dockerfile b/Dockerfile index d008b60..bc3de3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM node:18-bullseye +# -------------------------- Dev --------------------------------------- + +FROM node:18-bullseye as dev RUN apt-get update -y \ && apt-get install -y --no-install-recommends \ @@ -8,3 +10,13 @@ RUN apt-get update -y \ WORKDIR /code RUN git config --global --add safe.directory /code + + +# -------------------------- Builder --------------------------------------- +FROM dev AS builder + +COPY ./package.json ./yarn.lock /code/ +RUN yarn install --frozen-lockfile --check-files --cache-folder .ycache && \ + rm -rf .ycache + +COPY . /code/ diff --git a/backend b/backend index 59794d8..5f81a2b 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit 59794d8d6afcee80a88c4532fd9205b6bbd5959b +Subproject commit 5f81a2bfb617f7eeefc3cff2579d5ef1635c7064 diff --git a/deploy-docker-compose.yml b/deploy-docker-compose.yml new file mode 100644 index 0000000..5d9ca06 --- /dev/null +++ b/deploy-docker-compose.yml @@ -0,0 +1,208 @@ +x-logging-options: + options: &logging_options + awslogs-region: ${AWS_LOGGING_REGION?err} + awslogs-group: ${AWS_LOGGING_GROUP?err} + + +x-server: &base_server_setup + image: qber-backend:${LOCAL_BACKEND_TAG:?error} + build: + context: ./backend/ + tty: true + environment: &base_server_environment + APP_ENVIRONMENT: ${APP_ENVIRONMENT?err} + DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY?err} + # To overwrite this values. set the values in .env + DJANGO_DEBUG: ${DJANGO_DEBUG:-False} + APP_DOMAIN: ${APP_DOMAIN?err} + DJANGO_CORS_ORIGIN_REGEX_WHITELIST: ${DJANGO_CORS_ORIGIN_REGEX_WHITELIST?err} + APP_HTTP_PROTOCOL: ${APP_HTTP_PROTOCOL:-https} + APP_FRONTEND_HOST: ${APP_FRONTEND_HOST?err} + SESSION_COOKIE_DOMAIN: ${SESSION_COOKIE_DOMAIN?err} + CSRF_COOKIE_DOMAIN: ${CSRF_COOKIE_DOMAIN?err} + DJANGO_ALLOWED_HOST: ${DJANGO_ALLOWED_HOST?err} + DJANGO_DB_NAME: ${DJANGO_DB_NAME:-qber} + DJANGO_DB_USER: ${DJANGO_DB_USER:-postgres} + DJANGO_DB_PASSWORD: ${DJANGO_DB_PASSWORD:-postgres} + DJANGO_DB_PORT: ${DJANGO_DB_PORT:-5432} + DJANGO_DB_HOST: ${DJANGO_DB_HOST:-db} + # EMAIL + EMAIL_FROM: ${EMAIL_FROM?err} + # Enketo + ENKETO_DOMAIN: ${ENKETO_DOMAIN?err} + # Redis + CELERY_REDIS_URL: ${CELERY_REDIS_URL:-redis://redis:6379/1} + DJANGO_CACHE_REDIS_URL: ${DJANGO_CACHE_REDIS_URL:-redis://redis:6379/2} + TEST_DJANGO_CACHE_REDIS_URL: ${TEST_DJANGO_CACHE_REDIS_URL:-redis://redis:6379/12} + # Sentry + SENTRY_DSN: ${DJANGO_SENTRY_DSN?err} + SENTRY_SAMPLE_RATE: ${DJANGO_SENTRY_SAMPLE_RATE:-0.2} + env_file: + # Provide additional environment variables using .env file + - .env + volumes: + - ipython_data_local:/root/.ipython/profile_default # persist ipython data, including ipython history + restart: unless-stopped + depends_on: + - db + - redis + + +services: + react: + tty: true + build: + context: . + target: builder + environment: + APP_TITLE: ${APP_TITLE:-Questionnaire Builder} + APP_STATIC_ENDPOINT: ${APP_STATIC_ENDPOINT?err} + APP_GRAPHQL_ENDPOINT: ${APP_GRAPHQL_ENDPOINT?err} + NODE_OPTIONS: "--max_old_space_size=1024" + env_file: + - .env + command: | + sh -c 'yarn generate && yarn build && rm -rf /client-build/* ; cp -r build/* /client-build/' + volumes: + - client-static:/client-build/ + profiles: [frontend] + + db: + image: postgis/postgis:15-master + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: qber + restart: unless-stopped + volumes: + - postgres-data15:/var/lib/postgresql/data + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "db" + + redis: + image: redis:latest + volumes: + - redis-data:/data + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "redis-cli ping"] + interval: 10s + timeout: 5s + retries: 5 + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "redis" + + api: + <<: *base_server_setup + environment: + <<: *base_server_environment + APP_TYPE: web + command: ./deploy/run_web.sh + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "api" + + worker: + <<: *base_server_setup + environment: + <<: *base_server_environment + APP_TYPE: worker + command: ./deploy/run_worker.sh + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "worker" + + enketo_redis_main: + image: redis:7.0 + volumes: + - enketo_redis_main-data:/data + restart: unless-stopped + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "enketo-redis" + + enketo_redis_cache: + image: redis:7.0 + volumes: + - enketo_redis_cache-data:/data + restart: unless-stopped + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "enketo-redis-cache" + + enketo: + image: ghcr.io/enketo/enketo-express:6.2.2 + depends_on: + - enketo_redis_main + - enketo_redis_cache + environment: + ENKETO_PORT: 8005 + SUPPORT_EMAIL: ${SUPPORT_EMAIL?err} + ENKETO_REDIS_MAIN_URL: redis://redis:redis@enketo_redis_main:6379 + ENKETO_REDIS_CACHE_URL: redis://redis:redis@enketo_redis_cache:6379 + ENKETO_API_KEY: ${ENKETO_API_KEY?err} + ENKETO_ENCRYPTION_KEY: ${ENKETO_API_KEY?err} + command: bash -c "cd $${ENKETO_SRC_DIR}/ && pm2-runtime app.js -n enketo" + restart: unless-stopped + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "enketo" + + caddy: + image: caddy:2 + restart: always + volumes: + # Static files + - client-static:/app-assests/client-static:ro + # Caddy config + - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro + # Caddy data volumes + - caddy_data:/data + - caddy_config:/config + environment: + CADDY_EMAIL: ${SUPPORT_EMAIL?err} + CADDY_BACKEND_HOST: ${CADDY_BACKEND_HOST?err} + CADDY_CLIENT_HOST: ${CADDY_CLIENT_HOST?err} + CADDY_CLIENT_ENKETO_HOST: ${CADDY_CLIENT_ENKETO_HOST?err} + ports: + - 80:80 + - 443:443 + depends_on: + - api + - enketo + logging: + driver: awslogs + options: + <<: *logging_options + awslogs-stream: "caddy" + + +volumes: + # Static files + client-static: + # DB + postgres-data15: + redis-data: + enketo_redis_main-data: + enketo_redis_cache-data: + # Shell history + ipython_data_local: + # Caddy + caddy_data: + caddy_config: diff --git a/deploy/Caddyfile b/deploy/Caddyfile new file mode 100644 index 0000000..c4d8343 --- /dev/null +++ b/deploy/Caddyfile @@ -0,0 +1,18 @@ +{ + email {$CADDY_EMAIL} +} + +{$CADDY_BACKEND_HOST} { + reverse_proxy http://api:80 +} + +{$CADDY_CLIENT_ENKETO_HOST} { + reverse_proxy http://enketo:8005 +} + +{$CADDY_CLIENT_HOST} { + encode gzip + try_files {path} /index.html + root * /app-assests/client-static + file_server +} diff --git a/docker-compose.yml b/docker-compose.yml index 3dbaec2..8467942 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,3 @@ -version: '3.2' - - x-server: &base_server_setup image: ghcr.io/the-deep/qber-backend:${DOCKER_BACKEND_TAG:-latest} build: @@ -49,7 +46,9 @@ x-server: &base_server_setup services: react: tty: true - build: . + build: + context: . + target: dev environment: APP_TITLE: ${APP_TITLE:-Questionnaire Builder} APP_STATIC_ENDPOINT: ${APP_STATIC_ENDPOINT:-http://localhost:8311} diff --git a/patches/vite-plugin-webfont-dl+3.7.6.patch b/patches/vite-plugin-webfont-dl+3.7.6.patch deleted file mode 100644 index f1c4004..0000000 --- a/patches/vite-plugin-webfont-dl+3.7.6.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/node_modules/vite-plugin-webfont-dl/dist/index.js b/node_modules/vite-plugin-webfont-dl/dist/index.js -index ec2c4ba..85922ee 100644 ---- a/node_modules/vite-plugin-webfont-dl/dist/index.js -+++ b/node_modules/vite-plugin-webfont-dl/dist/index.js -@@ -6,9 +6,9 @@ $1`)}injectAsync(e,t,s){return e.replace(/([ \t]*)<\/head>/,`$1$1 - $1`)}injectSync(e,t,s){return e.replace(/([ \t]*)<\/head>/,`$1$1 - $1$1 --$1`)}};var U=class{transform(e,t){for(let s in t){let n=t[s];e=e.replaceAll(n.url,n.localPath)}return e}};var q=require("axios"),pe=require("http"),he=require("https"),W=D(require("picocolors"));var K=class{constructor(e,t){this.options=e;this.logger=t;this.userAgentWoff2="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36";this.maxTries=3;this.timeout=2500;this.waitBeforeRetry=[25,2500];this.axios=new q.Axios({timeout:this.timeout,proxy:this.options.proxy,httpAgent:new pe.Agent({keepAlive:!0,family:4}),httpsAgent:new he.Agent({keepAlive:!0,family:4})})}download(e,t,s=1){return d(this,null,function*(){try{let n=yield this.toRequest(e,t);return s>1&&this.logger.info(W.default.green(`\u2713 ${e}`)+" "+W.default.dim(`(try #${s})`)),n}catch(n){if(this.logger.error(W.default.red(`\u2717 ${e}`)+" "+W.default.dim(`(try #${s})`)+": "+((0,q.isAxiosError)(n)?n.message:n)),ssetTimeout(a,this.randomWaitInterval())),this.download(e,t,s+1);throw n}})}toRequest(e,t){return this.axios.get(e,{headers:{"User-Agent":this.userAgentWoff2},responseType:t||"arraybuffer"})}randomWaitInterval(){return Math.floor(Math.random()*(this.waitBeforeRetry[0]-this.waitBeforeRetry[1]+1)+this.waitBeforeRetry[1])}};var N=class{constructor(e,t,s){this.logger=e;this.downloader=t;this.fileCache=s}load(e){return d(this,null,function*(){this.logger.flashLine(e);let t=this.fileCache.get("font",e);if(t)return t;let s=yield this.downloader.download(e);return this.fileCache.save("font",e,s.data),s.data})}};var M=D(require("flat-cache")),V=class{constructor(e){this.enabled=!0;this.hits={css:0,font:0};e.cache===!1&&(this.enabled=!1),this.storeCss=M.default.create("vite-plugin-webfont-dl__css"),this.storeFont=M.default.create("vite-plugin-webfont-dl__font"),this.enabled||this.clear()}get(e,t){if(!this.enabled)return;let s=e==="css"?this.storeCss.getKey(t):this.storeFont.getKey(t);if(s)return e==="css"?this.hits.css++:this.hits.font++,s.type!==void 0?Buffer.from(s.data):s}save(e,t,s){this.enabled&&(e==="css"?(this.storeCss.setKey(t,s),this.storeCss.save(!0)):(this.storeFont.setKey(t,s),this.storeFont.save(!0)))}clear(){M.default.clearCacheById("vite-plugin-webfont-dl__css"),M.default.clearCacheById("vite-plugin-webfont-dl__font")}};var X=class{constructor(){this.webfontRegexes=[/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/fonts\.googleapis\.com[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/fonts\.googleapis\.com[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/fonts\.bunny\.net[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/fonts\.bunny\.net[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/api\.fontshare\.com[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/api\.fontshare\.com[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/cdn\.jsdelivr\.net[^'">]+\.css)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/cdn\.jsdelivr\.net[^'">]+\.css)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/rsms\.me[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/rsms\.me[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g];this.preconnectRegexes=[/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.googleapis\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.googleapis\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.gstatic\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.gstatic\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.bunny\.net['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.bunny\.net['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/api\.fontshare\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/api\.fontshare\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/rsms\.me['"]?[^>]*>/,/]+href=['"]?https:\/\/rsms\.me['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/]}parse(e){let t=new Set;for(let s of this.webfontRegexes){let n=e.matchAll(s);if(n)for(let a of n)t.add(a[1])}return t}removeTags(e){return e=this.removePreconnectTags(e),e=this.removeWebfontTags(e),e}removePreconnectTags(e){for(let t of this.preconnectRegexes){let s=new RegExp("[ ]*"+t.source+`(\r -+$1`)}};var U=class{transform(e,t){for(let s in t){let n=t[s];e=e.replaceAll(n.url,n.localPath)}return e}};var q=require("axios"),pe=require("http"),he=require("https"),W=D(require("picocolors"));var K=class{constructor(e,t){this.options=e;this.logger=t;this.userAgentWoff2="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36";this.maxTries=3;this.timeout=5000;this.waitBeforeRetry=[25,5000];this.axios=new q.Axios({timeout:this.timeout,proxy:this.options.proxy,httpAgent:new pe.Agent({keepAlive:!0,family:4}),httpsAgent:new he.Agent({keepAlive:!0,family:4})})}download(e,t,s=1){return d(this,null,function*(){try{let n=yield this.toRequest(e,t);return s>1&&this.logger.info(W.default.green(`\u2713 ${e}`)+" "+W.default.dim(`(try #${s})`)),n}catch(n){if(this.logger.error(W.default.red(`\u2717 ${e}`)+" "+W.default.dim(`(try #${s})`)+": "+((0,q.isAxiosError)(n)?n.message:n)),ssetTimeout(a,this.randomWaitInterval())),this.download(e,t,s+1);throw n}})}toRequest(e,t){return this.axios.get(e,{headers:{"User-Agent":this.userAgentWoff2},responseType:t||"arraybuffer"})}randomWaitInterval(){return Math.floor(Math.random()*(this.waitBeforeRetry[0]-this.waitBeforeRetry[1]+1)+this.waitBeforeRetry[1])}};var N=class{constructor(e,t,s){this.logger=e;this.downloader=t;this.fileCache=s}load(e){return d(this,null,function*(){this.logger.flashLine(e);let t=this.fileCache.get("font",e);if(t)return t;let s=yield this.downloader.download(e);return this.fileCache.save("font",e,s.data),s.data})}};var M=D(require("flat-cache")),V=class{constructor(e){this.enabled=!0;this.hits={css:0,font:0};e.cache===!1&&(this.enabled=!1),this.storeCss=M.default.create("vite-plugin-webfont-dl__css"),this.storeFont=M.default.create("vite-plugin-webfont-dl__font"),this.enabled||this.clear()}get(e,t){if(!this.enabled)return;let s=e==="css"?this.storeCss.getKey(t):this.storeFont.getKey(t);if(s)return e==="css"?this.hits.css++:this.hits.font++,s.type!==void 0?Buffer.from(s.data):s}save(e,t,s){this.enabled&&(e==="css"?(this.storeCss.setKey(t,s),this.storeCss.save(!0)):(this.storeFont.setKey(t,s),this.storeFont.save(!0)))}clear(){M.default.clearCacheById("vite-plugin-webfont-dl__css"),M.default.clearCacheById("vite-plugin-webfont-dl__font")}};var X=class{constructor(){this.webfontRegexes=[/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/fonts\.googleapis\.com[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/fonts\.googleapis\.com[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/fonts\.bunny\.net[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/fonts\.bunny\.net[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/api\.fontshare\.com[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/api\.fontshare\.com[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/cdn\.jsdelivr\.net[^'">]+\.css)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/cdn\.jsdelivr\.net[^'">]+\.css)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g,/]+rel=['"]?stylesheet['"]?[^>]+href=['"]?(https:\/\/rsms\.me[^'">]+)['"]?[^>]*>/g,/]+href=['"]?(https:\/\/rsms\.me[^'">]+)['"]?[^>]+rel=['"]?stylesheet['"]?[^>]*>/g];this.preconnectRegexes=[/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.googleapis\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.googleapis\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.gstatic\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.gstatic\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/fonts\.bunny\.net['"]?[^>]*>/,/]+href=['"]?https:\/\/fonts\.bunny\.net['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/api\.fontshare\.com['"]?[^>]*>/,/]+href=['"]?https:\/\/api\.fontshare\.com['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/,/]+rel=['"]?preconnect['"]?[^>]+href=['"]?https:\/\/rsms\.me['"]?[^>]*>/,/]+href=['"]?https:\/\/rsms\.me['"]?[^>]+rel=['"]?preconnect['"]?[^>]*>/]}parse(e){let t=new Set;for(let s of this.webfontRegexes){let n=e.matchAll(s);if(n)for(let a of n)t.add(a[1])}return t}removeTags(e){return e=this.removePreconnectTags(e),e=this.removeWebfontTags(e),e}removePreconnectTags(e){for(let t of this.preconnectRegexes){let s=new RegExp("[ ]*"+t.source+`(\r - |\r| - )?`,"g");e=e.replace(s,"")}return e}removeWebfontTags(e){for(let t of this.webfontRegexes){let s=new RegExp("[ ]*"+t.source+`(\r - |\r| - )?`,"g");e=e.replace(s,"")}return e}};var b=require("process"),me=D(require("picocolors")),_=class{setResolvedLogger(e){this.resolvedLogger=e}isTty(){return b.stdout.isTTY&&!b.env.CI}info(e,t=!0){var s;this.clearLine(),(s=this.resolvedLogger)==null||s.info((t?this.prefix():"")+e)}error(e,t=!0){var s;this.clearLine(),(s=this.resolvedLogger)==null||s.error((t?this.prefix():"")+e)}clearLine(){this.isTty()&&(b.stdout.clearLine(0),b.stdout.cursorTo(0))}flashLine(e,t=!0){this.isTty()?(this.clearLine(),e=(t?this.prefix():"")+e,e.length{this.clearLine()},500)):this.info(e,t)}prefix(){return me.default.dim("[webfont-dl] ")}};var Oe={injectAsStyleTag:!0,minifyCss:!0,async:!0,cache:!0,proxy:!1},de=(r={})=>F(F({},Oe),r);var ve=require("axios");function Be(r,e){!Array.isArray(r)&&typeof r!="string"&&(r=[]),typeof r=="string"&&r!==""&&(r=[r]);let t=new Set(r||[]),s=new Set([]),n=new Set([]),a=de(e),l={},u="webfonts.css",p=new Map,f=new _,C=new K(a,f),h=new V(a),w=new z(a,f,C,h),A=new H,j=new U,k=new I(a),E=new N(f,C,h),G=new X,x,Y,L,$,S,y="",O,B=new Map,J=o=>{for(let i of G.parse(o))s.add(i)},ye=()=>{s.clear(),B.forEach(o=>{J(o)})},we=o=>{n.clear();for(let i in o)if(i.match(/\.css$/)){let g=o[i].source.toString(),m=A.parseBundleCss(g,$,S);m.matchedCssParts.length&&(l=F(F({},l),m.fonts),m.webfontUrlsCss.forEach(c=>{n.add(c)}),m.matchedCssParts.forEach(c=>{g=g.replaceAll(c,""),y+=c+` --`}),o[i].source=g,y=w.formatCss(y,!!x))}},Q=()=>d(this,null,function*(){y="";let o=Date.now(),i=new Set([...t,...s,...n]);return i.size&&(y+=yield w.loadAll(i,!!x)),x||f.info(v.default.green("\u2713")+" "+i.size.toString()+" webfont css downloaded. "+v.default.dim("("+v.default.bold(re(o))+", "+(a.cache!==!1?`cache hit: ${v.default.bold(oe(h.hits.css,i.size))}`:"cache disabled")+")"),!1),y}),Z=o=>{l=F(F({},l),A.parse(o,$,S))},ee=()=>{y=j.transform(y,l)},be=()=>d(this,null,function*(){let o=Date.now();for(let i in l){let g=l[i],m=yield E.load(g.url);g.localPath=$+te(i,m)}f.info(v.default.green("\u2713")+" "+Object.keys(l).length.toString()+" webfonts downloaded. "+v.default.dim("("+v.default.bold(re(o))+", "+(a.cache!==!1?`cache hit: ${v.default.bold(oe(h.hits.font,Object.keys(l).length))}`:"cache disabled")+")"),!1)}),Ce=o=>d(this,null,function*(){let i=E.load(o);return f.clearLine(),i}),xe=()=>d(this,null,function*(){Z(yield Q()),ee(),p.clear();for(let o in l){let i=l[o];p.set(i.localPath,i.url)}}),Fe=()=>{O=te(u,y)},te=(o,i)=>{let g=Y.emitFile({name:o,type:"asset",source:i});return Y.getFileName(g)},se=(o,i)=>x||a.injectAsStyleTag===!1?k.injectAsStylesheet(o,$,O):k.injectAsStyleTag(o,i),re=o=>(Date.now()-o).toLocaleString()+" ms",oe=(o,i)=>(Math.round(o/i*100*100)/100).toFixed(2)+"%";return{name:"vite-plugin-webfont-dl",enforce:"post",configResolved(o){L=o,$=L.base,S=L.build.assetsDir,O=S+"/"+u,L.build.minify===!1&&(e==null?void 0:e.minifyCss)!==!0&&(a.minifyCss=!1),f.setResolvedLogger(L.logger)},configureServer(o){x=o,S="@webfonts",O=S+"/"+u;let i=(m,c)=>{d(this,null,function*(){c.setHeader("Content-Type","text/css");try{yield xe(),c.end(y)}catch(R){f.error(v.default.red(R.message)),c.statusCode=502,c.setHeader("X-Error",R.message.replace(/^Error: /,"")),c.end()}})},g=(m,c)=>{d(this,null,function*(){var T;let R=(T=m.originalUrl)==null?void 0:T.replace(/[?#].*$/,"");c.setHeader("Access-Control-Allow-Origin","*"),c.end(yield Ce(p.get(R)))})};x.middlewares.use($+O,i),x.middlewares.use($+u,i),x.middlewares.use((m,c,R)=>{var ne;let T=(ne=m.originalUrl)==null?void 0:ne.replace(/[?#].*$/,"");if(!T)return R();T.match(/\.(?:woff2?|eot|ttf|otf|svg)$/)&&p.has(T)?g(m,c):R()})},transformIndexHtml(o,i){return B.set(i.path.replace(/^\//,""),o),x&&(s.clear(),J(o),o=G.removeTags(o),o=se(o)),o},generateBundle(o,i){return d(this,null,function*(){Y=this,ye(),we(i);try{Z(yield Q()),yield be(),ee(),(a.injectAsStyleTag===!1||!B.size)&&Fe(),B.forEach((g,m)=>{let c=i[m];c!==void 0&&(c.source=G.removeTags(c.source),c.source=se(c.source,y),B.set(m,c.source))})}catch(g){f.error(v.default.red(g.message)),g instanceof ve.AxiosError&&g.request instanceof ue.ClientRequest&&f.error(v.default.red(`${g.request.method} ${g.request.protocol}//${g.request.host}${g.request.path}`))}})}}}0&&(module.exports={ViteWebfontDownload,viteWebfontDl,viteWebfontDownload,webfontDl,webfontDownload}); -+`}),o[i].source=g,y=w.formatCss(y,!!x))}},Q=()=>d(this,null,function*(){y="";let o=Date.now(),i=new Set([...t,...s,...n]);return i.size&&(y+=yield w.loadAll(i,!!x)),x||f.info(v.default.green("\u2713")+" "+i.size.toString()+" webfont css downloaded. "+v.default.dim("("+v.default.bold(re(o))+", "+(a.cache!==!1?`https://github.com/IFRCGo/go-web-app/pull/58cache hit: ${v.default.bold(oe(h.hits.css,i.size))}`:"cache disabled")+")"),!1),y}),Z=o=>{l=F(F({},l),A.parse(o,$,S))},ee=()=>{y=j.transform(y,l)},be=()=>d(this,null,function*(){let o=Date.now();for(let i in l){let g=l[i],m=yield E.load(g.url);g.localPath=$+te(i,m)}f.info(v.default.green("\u2713")+" "+Object.keys(l).length.toString()+" webfonts downloaded. "+v.default.dim("("+v.default.bold(re(o))+", "+(a.cache!==!1?`cache hit: ${v.default.bold(oe(h.hits.font,Object.keys(l).length))}`:"cache disabled")+")"),!1)}),Ce=o=>d(this,null,function*(){let i=E.load(o);return f.clearLine(),i}),xe=()=>d(this,null,function*(){Z(yield Q()),ee(),p.clear();for(let o in l){let i=l[o];p.set(i.localPath,i.url)}}),Fe=()=>{O=te(u,y)},te=(o,i)=>{let g=Y.emitFile({name:o,type:"asset",source:i});return Y.getFileName(g)},se=(o,i)=>x||a.injectAsStyleTag===!1?k.injectAsStylesheet(o,$,O):k.injectAsStyleTag(o,i),re=o=>(Date.now()-o).toLocaleString()+" ms",oe=(o,i)=>(Math.round(o/i*100*100)/100).toFixed(2)+"%";return{name:"vite-plugin-webfont-dl",enforce:"post",configResolved(o){L=o,$=L.base,S=L.build.assetsDir,O=S+"/"+u,L.build.minify===!1&&(e==null?void 0:e.minifyCss)!==!0&&(a.minifyCss=!1),f.setResolvedLogger(L.logger)},configureServer(o){x=o,S="@webfonts",O=S+"/"+u;let i=(m,c)=>{d(this,null,function*(){c.setHeader("Content-Type","text/css");try{yield xe(),c.end(y)}catch(R){f.error(v.default.red(R.message)),c.statusCode=502,c.setHeader("X-Error",R.message.replace(/^Error: /,"")),c.end()}})},g=(m,c)=>{d(this,null,function*(){var T;let R=(T=m.originalUrl)==null?void 0:T.replace(/[?#].*$/,"");c.setHeader("Access-Control-Allow-Origin","*"),c.end(yield Ce(p.get(R)))})};x.middlewares.use($+O,i),x.middlewares.use($+u,i),x.middlewares.use((m,c,R)=>{var ne;let T=(ne=m.originalUrl)==null?void 0:ne.replace(/[?#].*$/,"");if(!T)return R();T.match(/\.(?:woff2?|eot|ttf|otf|svg)$/)&&p.has(T)?g(m,c):R()})},transformIndexHtml(o,i){return B.set(i.path.replace(/^\//,""),o),x&&(s.clear(),J(o),o=G.removeTags(o),o=se(o)),o},generateBundle(o,i){return d(this,null,function*(){Y=this,ye(),we(i);try{Z(yield Q()),yield be(),ee(),(a.injectAsStyleTag===!1||!B.size)&&Fe(),B.forEach((g,m)=>{let c=i[m];c!==void 0&&(c.source=G.removeTags(c.source),c.source=se(c.source,y),B.set(m,c.source))})}catch(g){f.error(v.default.red(g.message)),g instanceof ve.AxiosError&&g.request instanceof ue.ClientRequest&&f.error(v.default.red(`${g.request.method} ${g.request.protocol}//${g.request.host}${g.request.path}`))}})}}}0&&(module.exports={ViteWebfontDownload,viteWebfontDl,viteWebfontDownload,webfontDl,webfontDownload}); diff --git a/src/views/About/index.tsx b/src/views/About/index.tsx index 0443ac8..bb3a30e 100644 --- a/src/views/About/index.tsx +++ b/src/views/About/index.tsx @@ -229,6 +229,7 @@ function SubDimension(props: SubDimensionProps) {