├── .editorconfig ├── .env.example ├── .gitignore ├── .husky └── commit-msg ├── .idea ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── geese.iml ├── inspectionProfiles │ └── Project_Default.xml ├── jsLinters │ └── eslint.xml ├── modules.xml ├── prettier.xml └── vcs.xml ├── .yarn ├── plugins │ └── @yarnpkg │ │ └── plugin-workspace-tools.cjs └── releases │ └── yarn-3.2.3.cjs ├── .yarnrc.yml ├── README.md ├── commitlint.config.js ├── package.json ├── packages ├── backend │ ├── __init__.py │ ├── __main__.py │ ├── app.py │ ├── nodemon.json │ ├── package.json │ └── requirements.txt ├── chrome │ ├── background.js │ ├── icons │ │ ├── icon-128.png │ │ ├── icon-16.png │ │ ├── icon-256.png │ │ ├── icon-32.png │ │ ├── icon-512.png │ │ ├── icon-64.png │ │ ├── icon-72.png │ │ └── icon.png │ ├── injection │ │ ├── injection.css │ │ └── injection.js │ ├── manifest.json │ ├── package.json │ └── popup.html ├── frontend │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── components │ │ └── Layout │ │ │ ├── MyHeading.tsx │ │ │ └── PageLayout.tsx │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── api │ │ │ ├── [...nextauth].js │ │ │ └── hello.ts │ │ └── index.tsx │ ├── public │ │ ├── favicon.ico │ │ └── vercel.svg │ ├── theme.ts │ ├── tsconfig.eslint.json │ └── tsconfig.json ├── infra │ ├── Caddyfile │ ├── nodemon.json │ └── package.json ├── io │ ├── .prettierrc.js │ ├── nodemon.json │ ├── package.json │ ├── src │ │ └── app.ts │ └── tsconfig.json └── mobile │ ├── .gitattributes │ ├── .gitignore │ ├── App.js │ ├── android │ ├── .gitignore │ ├── app │ │ ├── build.gradle │ │ ├── debug.keystore │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── minihacks │ │ │ │ └── geese │ │ │ │ └── ReactNativeFlipper.java │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── minihacks │ │ │ │ │ └── geese │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ └── MainApplication.java │ │ │ └── res │ │ │ │ ├── drawable │ │ │ │ ├── rn_edit_text_material.xml │ │ │ │ └── splashscreen.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ │ └── values │ │ │ │ ├── colors.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ └── release │ │ │ └── java │ │ │ └── com │ │ │ └── minihacks │ │ │ └── geese │ │ │ └── ReactNativeFlipper.java │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle │ ├── app.json │ ├── babel.config.js │ ├── index.js │ ├── ios │ ├── .gitignore │ ├── .xcode.env │ ├── Podfile │ ├── Podfile.lock │ ├── Podfile.properties.json │ ├── mobile.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── mobile.xcscheme │ ├── mobile.xcworkspace │ │ └── contents.xcworkspacedata │ └── mobile │ │ ├── AppDelegate.h │ │ ├── AppDelegate.mm │ │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── SplashScreenBackground.imageset │ │ │ ├── Contents.json │ │ │ └── image.png │ │ ├── Info.plist │ │ ├── SplashScreen.storyboard │ │ ├── Supporting │ │ └── Expo.plist │ │ ├── main.m │ │ ├── mobile.entitlements │ │ └── noop-file.swift │ ├── metro.config.js │ ├── package.json │ └── screens │ ├── HomeScreen.js │ └── SettingsScreen.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | [*.{js,json,yml}] 8 | charset = utf-8 9 | indent_style = space 10 | indent_size = 2 11 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | MONGO=mongodb://localhost:27017 2 | GOOGLE_ID= 3 | GOOGLE_SECRET= 4 | SECRET= 5 | NEXTAUTH_URL=http://localhost:3000 6 | NEXT_PUBLIC_GOOGLE_CLIENT_ID= 7 | NEXT_PUBLIC_GOOGLE_API_KEY= 8 | 9 | IO_PORT=9131 10 | FRONTEND_PORT=3000 11 | BACKEND_PORT=8000 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | **/node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | **/.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | 36 | # yarn 37 | .yarn/* 38 | !.yarn/patches 39 | !.yarn/releases 40 | !.yarn/plugins 41 | !.yarn/sdks 42 | !.yarn/versions 43 | .pnp.* 44 | 45 | **/.yarn/* 46 | !**/.yarn/patches 47 | !**/.yarn/releases 48 | !**/.yarn/plugins 49 | !**/.yarn/sdks 50 | !**/.yarn/versions 51 | .env 52 | 53 | # don't ignore all of .idea 54 | .idea/libraries 55 | .idea/workspace.xml 56 | 57 | # python 58 | venv 59 | *.pyc 60 | __pycache__ 61 | 62 | packages/io/dist/ 63 | **/dist/** 64 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx --no -- commitlint --edit "$1" 5 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 15 | 16 | 23 | 24 | 27 | 28 | 35 | 36 | 43 | 44 | 51 | 52 | 57 | 58 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/geese.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/jsLinters/eslint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/prettier.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | //prettier-ignore 3 | module.exports = { 4 | name: "@yarnpkg/plugin-workspace-tools", 5 | factory: function (require) { 6 | var plugin=(()=>{var wr=Object.create,me=Object.defineProperty,Sr=Object.defineProperties,vr=Object.getOwnPropertyDescriptor,Hr=Object.getOwnPropertyDescriptors,$r=Object.getOwnPropertyNames,et=Object.getOwnPropertySymbols,kr=Object.getPrototypeOf,tt=Object.prototype.hasOwnProperty,Tr=Object.prototype.propertyIsEnumerable;var rt=(e,t,r)=>t in e?me(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,B=(e,t)=>{for(var r in t||(t={}))tt.call(t,r)&&rt(e,r,t[r]);if(et)for(var r of et(t))Tr.call(t,r)&&rt(e,r,t[r]);return e},Q=(e,t)=>Sr(e,Hr(t)),Lr=e=>me(e,"__esModule",{value:!0});var K=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Or=(e,t)=>{for(var r in t)me(e,r,{get:t[r],enumerable:!0})},Nr=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $r(t))!tt.call(e,n)&&n!=="default"&&me(e,n,{get:()=>t[n],enumerable:!(r=vr(t,n))||r.enumerable});return e},X=e=>Nr(Lr(me(e!=null?wr(kr(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var $e=K(te=>{"use strict";te.isInteger=e=>typeof e=="number"?Number.isInteger(e):typeof e=="string"&&e.trim()!==""?Number.isInteger(Number(e)):!1;te.find=(e,t)=>e.nodes.find(r=>r.type===t);te.exceedsLimit=(e,t,r=1,n)=>n===!1||!te.isInteger(e)||!te.isInteger(t)?!1:(Number(t)-Number(e))/Number(r)>=n;te.escapeNode=(e,t=0,r)=>{let n=e.nodes[t];!n||(r&&n.type===r||n.type==="open"||n.type==="close")&&n.escaped!==!0&&(n.value="\\"+n.value,n.escaped=!0)};te.encloseBrace=e=>e.type!=="brace"?!1:e.commas>>0+e.ranges>>0==0?(e.invalid=!0,!0):!1;te.isInvalidBrace=e=>e.type!=="brace"?!1:e.invalid===!0||e.dollar?!0:e.commas>>0+e.ranges>>0==0||e.open!==!0||e.close!==!0?(e.invalid=!0,!0):!1;te.isOpenOrClose=e=>e.type==="open"||e.type==="close"?!0:e.open===!0||e.close===!0;te.reduce=e=>e.reduce((t,r)=>(r.type==="text"&&t.push(r.value),r.type==="range"&&(r.type="text"),t),[]);te.flatten=(...e)=>{let t=[],r=n=>{for(let s=0;s{"use strict";var it=$e();at.exports=(e,t={})=>{let r=(n,s={})=>{let a=t.escapeInvalid&&it.isInvalidBrace(s),i=n.invalid===!0&&t.escapeInvalid===!0,o="";if(n.value)return(a||i)&&it.isOpenOrClose(n)?"\\"+n.value:n.value;if(n.value)return n.value;if(n.nodes)for(let h of n.nodes)o+=r(h);return o};return r(e)}});var ct=K((os,ot)=>{"use strict";ot.exports=function(e){return typeof e=="number"?e-e==0:typeof e=="string"&&e.trim()!==""?Number.isFinite?Number.isFinite(+e):isFinite(+e):!1}});var At=K((cs,ut)=>{"use strict";var lt=ct(),pe=(e,t,r)=>{if(lt(e)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(t===void 0||e===t)return String(e);if(lt(t)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let n=B({relaxZeros:!0},r);typeof n.strictZeros=="boolean"&&(n.relaxZeros=n.strictZeros===!1);let s=String(n.relaxZeros),a=String(n.shorthand),i=String(n.capture),o=String(n.wrap),h=e+":"+t+"="+s+a+i+o;if(pe.cache.hasOwnProperty(h))return pe.cache[h].result;let g=Math.min(e,t),f=Math.max(e,t);if(Math.abs(g-f)===1){let R=e+"|"+t;return n.capture?`(${R})`:n.wrap===!1?R:`(?:${R})`}let A=ft(e)||ft(t),p={min:e,max:t,a:g,b:f},k=[],y=[];if(A&&(p.isPadded=A,p.maxLen=String(p.max).length),g<0){let R=f<0?Math.abs(f):1;y=pt(R,Math.abs(g),p,n),g=p.a=0}return f>=0&&(k=pt(g,f,p,n)),p.negatives=y,p.positives=k,p.result=Ir(y,k,n),n.capture===!0?p.result=`(${p.result})`:n.wrap!==!1&&k.length+y.length>1&&(p.result=`(?:${p.result})`),pe.cache[h]=p,p.result};function Ir(e,t,r){let n=Pe(e,t,"-",!1,r)||[],s=Pe(t,e,"",!1,r)||[],a=Pe(e,t,"-?",!0,r)||[];return n.concat(a).concat(s).join("|")}function Mr(e,t){let r=1,n=1,s=ht(e,r),a=new Set([t]);for(;e<=s&&s<=t;)a.add(s),r+=1,s=ht(e,r);for(s=dt(t+1,n)-1;e1&&o.count.pop(),o.count.push(f.count[0]),o.string=o.pattern+gt(o.count),i=g+1;continue}r.isPadded&&(A=Gr(g,r,n)),f.string=A+f.pattern+gt(f.count),a.push(f),i=g+1,o=f}return a}function Pe(e,t,r,n,s){let a=[];for(let i of e){let{string:o}=i;!n&&!mt(t,"string",o)&&a.push(r+o),n&&mt(t,"string",o)&&a.push(r+o)}return a}function Pr(e,t){let r=[];for(let n=0;nt?1:t>e?-1:0}function mt(e,t,r){return e.some(n=>n[t]===r)}function ht(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function dt(e,t){return e-e%Math.pow(10,t)}function gt(e){let[t=0,r=""]=e;return r||t>1?`{${t+(r?","+r:"")}}`:""}function Dr(e,t,r){return`[${e}${t-e==1?"":"-"}${t}]`}function ft(e){return/^-?(0+)\d/.test(e)}function Gr(e,t,r){if(!t.isPadded)return e;let n=Math.abs(t.maxLen-String(e).length),s=r.relaxZeros!==!1;switch(n){case 0:return"";case 1:return s?"0?":"0";case 2:return s?"0{0,2}":"00";default:return s?`0{0,${n}}`:`0{${n}}`}}pe.cache={};pe.clearCache=()=>pe.cache={};ut.exports=pe});var Ge=K((us,Rt)=>{"use strict";var qr=require("util"),yt=At(),bt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),Kr=e=>t=>e===!0?Number(t):String(t),De=e=>typeof e=="number"||typeof e=="string"&&e!=="",Re=e=>Number.isInteger(+e),Ue=e=>{let t=`${e}`,r=-1;if(t[0]==="-"&&(t=t.slice(1)),t==="0")return!1;for(;t[++r]==="0";);return r>0},Wr=(e,t,r)=>typeof e=="string"||typeof t=="string"?!0:r.stringify===!0,jr=(e,t,r)=>{if(t>0){let n=e[0]==="-"?"-":"";n&&(e=e.slice(1)),e=n+e.padStart(n?t-1:t,"0")}return r===!1?String(e):e},_t=(e,t)=>{let r=e[0]==="-"?"-":"";for(r&&(e=e.slice(1),t--);e.length{e.negatives.sort((i,o)=>io?1:0),e.positives.sort((i,o)=>io?1:0);let r=t.capture?"":"?:",n="",s="",a;return e.positives.length&&(n=e.positives.join("|")),e.negatives.length&&(s=`-(${r}${e.negatives.join("|")})`),n&&s?a=`${n}|${s}`:a=n||s,t.wrap?`(${r}${a})`:a},Et=(e,t,r,n)=>{if(r)return yt(e,t,B({wrap:!1},n));let s=String.fromCharCode(e);if(e===t)return s;let a=String.fromCharCode(t);return`[${s}-${a}]`},xt=(e,t,r)=>{if(Array.isArray(e)){let n=r.wrap===!0,s=r.capture?"":"?:";return n?`(${s}${e.join("|")})`:e.join("|")}return yt(e,t,r)},Ct=(...e)=>new RangeError("Invalid range arguments: "+qr.inspect(...e)),wt=(e,t,r)=>{if(r.strictRanges===!0)throw Ct([e,t]);return[]},Qr=(e,t)=>{if(t.strictRanges===!0)throw new TypeError(`Expected step "${e}" to be a number`);return[]},Xr=(e,t,r=1,n={})=>{let s=Number(e),a=Number(t);if(!Number.isInteger(s)||!Number.isInteger(a)){if(n.strictRanges===!0)throw Ct([e,t]);return[]}s===0&&(s=0),a===0&&(a=0);let i=s>a,o=String(e),h=String(t),g=String(r);r=Math.max(Math.abs(r),1);let f=Ue(o)||Ue(h)||Ue(g),A=f?Math.max(o.length,h.length,g.length):0,p=f===!1&&Wr(e,t,n)===!1,k=n.transform||Kr(p);if(n.toRegex&&r===1)return Et(_t(e,A),_t(t,A),!0,n);let y={negatives:[],positives:[]},R=T=>y[T<0?"negatives":"positives"].push(Math.abs(T)),_=[],x=0;for(;i?s>=a:s<=a;)n.toRegex===!0&&r>1?R(s):_.push(jr(k(s,x),A,p)),s=i?s-r:s+r,x++;return n.toRegex===!0?r>1?Fr(y,n):xt(_,null,B({wrap:!1},n)):_},Zr=(e,t,r=1,n={})=>{if(!Re(e)&&e.length>1||!Re(t)&&t.length>1)return wt(e,t,n);let s=n.transform||(p=>String.fromCharCode(p)),a=`${e}`.charCodeAt(0),i=`${t}`.charCodeAt(0),o=a>i,h=Math.min(a,i),g=Math.max(a,i);if(n.toRegex&&r===1)return Et(h,g,!1,n);let f=[],A=0;for(;o?a>=i:a<=i;)f.push(s(a,A)),a=o?a-r:a+r,A++;return n.toRegex===!0?xt(f,null,{wrap:!1,options:n}):f},Te=(e,t,r,n={})=>{if(t==null&&De(e))return[e];if(!De(e)||!De(t))return wt(e,t,n);if(typeof r=="function")return Te(e,t,1,{transform:r});if(bt(r))return Te(e,t,0,r);let s=B({},n);return s.capture===!0&&(s.wrap=!0),r=r||s.step||1,Re(r)?Re(e)&&Re(t)?Xr(e,t,r,s):Zr(e,t,Math.max(Math.abs(r),1),s):r!=null&&!bt(r)?Qr(r,s):Te(e,t,1,r)};Rt.exports=Te});var Ht=K((ls,St)=>{"use strict";var Yr=Ge(),vt=$e(),zr=(e,t={})=>{let r=(n,s={})=>{let a=vt.isInvalidBrace(s),i=n.invalid===!0&&t.escapeInvalid===!0,o=a===!0||i===!0,h=t.escapeInvalid===!0?"\\":"",g="";if(n.isOpen===!0||n.isClose===!0)return h+n.value;if(n.type==="open")return o?h+n.value:"(";if(n.type==="close")return o?h+n.value:")";if(n.type==="comma")return n.prev.type==="comma"?"":o?n.value:"|";if(n.value)return n.value;if(n.nodes&&n.ranges>0){let f=vt.reduce(n.nodes),A=Yr(...f,Q(B({},t),{wrap:!1,toRegex:!0}));if(A.length!==0)return f.length>1&&A.length>1?`(${A})`:A}if(n.nodes)for(let f of n.nodes)g+=r(f,n);return g};return r(e)};St.exports=zr});var Tt=K((ps,$t)=>{"use strict";var Vr=Ge(),kt=ke(),he=$e(),fe=(e="",t="",r=!1)=>{let n=[];if(e=[].concat(e),t=[].concat(t),!t.length)return e;if(!e.length)return r?he.flatten(t).map(s=>`{${s}}`):t;for(let s of e)if(Array.isArray(s))for(let a of s)n.push(fe(a,t,r));else for(let a of t)r===!0&&typeof a=="string"&&(a=`{${a}}`),n.push(Array.isArray(a)?fe(s,a,r):s+a);return he.flatten(n)},Jr=(e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit,n=(s,a={})=>{s.queue=[];let i=a,o=a.queue;for(;i.type!=="brace"&&i.type!=="root"&&i.parent;)i=i.parent,o=i.queue;if(s.invalid||s.dollar){o.push(fe(o.pop(),kt(s,t)));return}if(s.type==="brace"&&s.invalid!==!0&&s.nodes.length===2){o.push(fe(o.pop(),["{}"]));return}if(s.nodes&&s.ranges>0){let A=he.reduce(s.nodes);if(he.exceedsLimit(...A,t.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let p=Vr(...A,t);p.length===0&&(p=kt(s,t)),o.push(fe(o.pop(),p)),s.nodes=[];return}let h=he.encloseBrace(s),g=s.queue,f=s;for(;f.type!=="brace"&&f.type!=="root"&&f.parent;)f=f.parent,g=f.queue;for(let A=0;A{"use strict";Lt.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` 7 | `,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var Pt=K((hs,Nt)=>{"use strict";var en=ke(),{MAX_LENGTH:It,CHAR_BACKSLASH:qe,CHAR_BACKTICK:tn,CHAR_COMMA:rn,CHAR_DOT:nn,CHAR_LEFT_PARENTHESES:sn,CHAR_RIGHT_PARENTHESES:an,CHAR_LEFT_CURLY_BRACE:on,CHAR_RIGHT_CURLY_BRACE:cn,CHAR_LEFT_SQUARE_BRACKET:Bt,CHAR_RIGHT_SQUARE_BRACKET:Mt,CHAR_DOUBLE_QUOTE:un,CHAR_SINGLE_QUOTE:ln,CHAR_NO_BREAK_SPACE:pn,CHAR_ZERO_WIDTH_NOBREAK_SPACE:fn}=Ot(),hn=(e,t={})=>{if(typeof e!="string")throw new TypeError("Expected a string");let r=t||{},n=typeof r.maxLength=="number"?Math.min(It,r.maxLength):It;if(e.length>n)throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${n})`);let s={type:"root",input:e,nodes:[]},a=[s],i=s,o=s,h=0,g=e.length,f=0,A=0,p,k={},y=()=>e[f++],R=_=>{if(_.type==="text"&&o.type==="dot"&&(o.type="text"),o&&o.type==="text"&&_.type==="text"){o.value+=_.value;return}return i.nodes.push(_),_.parent=i,_.prev=o,o=_,_};for(R({type:"bos"});f0){if(i.ranges>0){i.ranges=0;let _=i.nodes.shift();i.nodes=[_,{type:"text",value:en(i)}]}R({type:"comma",value:p}),i.commas++;continue}if(p===nn&&A>0&&i.commas===0){let _=i.nodes;if(A===0||_.length===0){R({type:"text",value:p});continue}if(o.type==="dot"){if(i.range=[],o.value+=p,o.type="range",i.nodes.length!==3&&i.nodes.length!==5){i.invalid=!0,i.ranges=0,o.type="text";continue}i.ranges++,i.args=[];continue}if(o.type==="range"){_.pop();let x=_[_.length-1];x.value+=o.value+p,o=x,i.ranges--;continue}R({type:"dot",value:p});continue}R({type:"text",value:p})}do if(i=a.pop(),i.type!=="root"){i.nodes.forEach(T=>{T.nodes||(T.type==="open"&&(T.isOpen=!0),T.type==="close"&&(T.isClose=!0),T.nodes||(T.type="text"),T.invalid=!0)});let _=a[a.length-1],x=_.nodes.indexOf(i);_.nodes.splice(x,1,...i.nodes)}while(a.length>0);return R({type:"eos"}),s};Nt.exports=hn});var Gt=K((ds,Dt)=>{"use strict";var Ut=ke(),dn=Ht(),gn=Tt(),mn=Pt(),V=(e,t={})=>{let r=[];if(Array.isArray(e))for(let n of e){let s=V.create(n,t);Array.isArray(s)?r.push(...s):r.push(s)}else r=[].concat(V.create(e,t));return t&&t.expand===!0&&t.nodupes===!0&&(r=[...new Set(r)]),r};V.parse=(e,t={})=>mn(e,t);V.stringify=(e,t={})=>typeof e=="string"?Ut(V.parse(e,t),t):Ut(e,t);V.compile=(e,t={})=>(typeof e=="string"&&(e=V.parse(e,t)),dn(e,t));V.expand=(e,t={})=>{typeof e=="string"&&(e=V.parse(e,t));let r=gn(e,t);return t.noempty===!0&&(r=r.filter(Boolean)),t.nodupes===!0&&(r=[...new Set(r)]),r};V.create=(e,t={})=>e===""||e.length<3?[e]:t.expand!==!0?V.compile(e,t):V.expand(e,t);Dt.exports=V});var ye=K((gs,qt)=>{"use strict";var An=require("path"),ie="\\\\/",Kt=`[^${ie}]`,ce="\\.",Rn="\\+",yn="\\?",Le="\\/",bn="(?=.)",Wt="[^/]",Ke=`(?:${Le}|$)`,jt=`(?:^|${Le})`,We=`${ce}{1,2}${Ke}`,_n=`(?!${ce})`,En=`(?!${jt}${We})`,xn=`(?!${ce}{0,1}${Ke})`,Cn=`(?!${We})`,wn=`[^.${Le}]`,Sn=`${Wt}*?`,Ft={DOT_LITERAL:ce,PLUS_LITERAL:Rn,QMARK_LITERAL:yn,SLASH_LITERAL:Le,ONE_CHAR:bn,QMARK:Wt,END_ANCHOR:Ke,DOTS_SLASH:We,NO_DOT:_n,NO_DOTS:En,NO_DOT_SLASH:xn,NO_DOTS_SLASH:Cn,QMARK_NO_DOT:wn,STAR:Sn,START_ANCHOR:jt},vn=Q(B({},Ft),{SLASH_LITERAL:`[${ie}]`,QMARK:Kt,STAR:`${Kt}*?`,DOTS_SLASH:`${ce}{1,2}(?:[${ie}]|$)`,NO_DOT:`(?!${ce})`,NO_DOTS:`(?!(?:^|[${ie}])${ce}{1,2}(?:[${ie}]|$))`,NO_DOT_SLASH:`(?!${ce}{0,1}(?:[${ie}]|$))`,NO_DOTS_SLASH:`(?!${ce}{1,2}(?:[${ie}]|$))`,QMARK_NO_DOT:`[^.${ie}]`,START_ANCHOR:`(?:^|[${ie}])`,END_ANCHOR:`(?:[${ie}]|$)`}),Hn={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};qt.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:Hn,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:An.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===!0?vn:Ft}}});var be=K(Z=>{"use strict";var $n=require("path"),kn=process.platform==="win32",{REGEX_BACKSLASH:Tn,REGEX_REMOVE_BACKSLASH:Ln,REGEX_SPECIAL_CHARS:On,REGEX_SPECIAL_CHARS_GLOBAL:Nn}=ye();Z.isObject=e=>e!==null&&typeof e=="object"&&!Array.isArray(e);Z.hasRegexChars=e=>On.test(e);Z.isRegexChar=e=>e.length===1&&Z.hasRegexChars(e);Z.escapeRegex=e=>e.replace(Nn,"\\$1");Z.toPosixSlashes=e=>e.replace(Tn,"/");Z.removeBackslashes=e=>e.replace(Ln,t=>t==="\\"?"":t);Z.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".").map(Number);return e.length===3&&e[0]>=9||e[0]===8&&e[1]>=10};Z.isWindows=e=>e&&typeof e.windows=="boolean"?e.windows:kn===!0||$n.sep==="\\";Z.escapeLast=(e,t,r)=>{let n=e.lastIndexOf(t,r);return n===-1?e:e[n-1]==="\\"?Z.escapeLast(e,t,n-1):`${e.slice(0,n)}\\${e.slice(n)}`};Z.removePrefix=(e,t={})=>{let r=e;return r.startsWith("./")&&(r=r.slice(2),t.prefix="./"),r};Z.wrapOutput=(e,t={},r={})=>{let n=r.contains?"":"^",s=r.contains?"":"$",a=`${n}(?:${e})${s}`;return t.negated===!0&&(a=`(?:^(?!${a}).*$)`),a}});var er=K((As,Qt)=>{"use strict";var Xt=be(),{CHAR_ASTERISK:je,CHAR_AT:In,CHAR_BACKWARD_SLASH:_e,CHAR_COMMA:Bn,CHAR_DOT:Fe,CHAR_EXCLAMATION_MARK:Qe,CHAR_FORWARD_SLASH:Zt,CHAR_LEFT_CURLY_BRACE:Xe,CHAR_LEFT_PARENTHESES:Ze,CHAR_LEFT_SQUARE_BRACKET:Mn,CHAR_PLUS:Pn,CHAR_QUESTION_MARK:Yt,CHAR_RIGHT_CURLY_BRACE:Dn,CHAR_RIGHT_PARENTHESES:zt,CHAR_RIGHT_SQUARE_BRACKET:Un}=ye(),Vt=e=>e===Zt||e===_e,Jt=e=>{e.isPrefix!==!0&&(e.depth=e.isGlobstar?Infinity:1)},Gn=(e,t)=>{let r=t||{},n=e.length-1,s=r.parts===!0||r.scanToEnd===!0,a=[],i=[],o=[],h=e,g=-1,f=0,A=0,p=!1,k=!1,y=!1,R=!1,_=!1,x=!1,T=!1,O=!1,W=!1,G=!1,ne=0,E,b,C={value:"",depth:0,isGlob:!1},M=()=>g>=n,l=()=>h.charCodeAt(g+1),H=()=>(E=b,h.charCodeAt(++g));for(;g0&&(j=h.slice(0,f),h=h.slice(f),A-=f),w&&y===!0&&A>0?(w=h.slice(0,A),c=h.slice(A)):y===!0?(w="",c=h):w=h,w&&w!==""&&w!=="/"&&w!==h&&Vt(w.charCodeAt(w.length-1))&&(w=w.slice(0,-1)),r.unescape===!0&&(c&&(c=Xt.removeBackslashes(c)),w&&T===!0&&(w=Xt.removeBackslashes(w)));let u={prefix:j,input:e,start:f,base:w,glob:c,isBrace:p,isBracket:k,isGlob:y,isExtglob:R,isGlobstar:_,negated:O,negatedExtglob:W};if(r.tokens===!0&&(u.maxDepth=0,Vt(b)||i.push(C),u.tokens=i),r.parts===!0||r.tokens===!0){let I;for(let $=0;${"use strict";var Oe=ye(),J=be(),{MAX_LENGTH:Ne,POSIX_REGEX_SOURCE:qn,REGEX_NON_SPECIAL_CHARS:Kn,REGEX_SPECIAL_CHARS_BACKREF:Wn,REPLACEMENTS:rr}=Oe,jn=(e,t)=>{if(typeof t.expandRange=="function")return t.expandRange(...e,t);e.sort();let r=`[${e.join("-")}]`;try{new RegExp(r)}catch(n){return e.map(s=>J.escapeRegex(s)).join("..")}return r},de=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`,nr=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");e=rr[e]||e;let r=B({},t),n=typeof r.maxLength=="number"?Math.min(Ne,r.maxLength):Ne,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);let a={type:"bos",value:"",output:r.prepend||""},i=[a],o=r.capture?"":"?:",h=J.isWindows(t),g=Oe.globChars(h),f=Oe.extglobChars(g),{DOT_LITERAL:A,PLUS_LITERAL:p,SLASH_LITERAL:k,ONE_CHAR:y,DOTS_SLASH:R,NO_DOT:_,NO_DOT_SLASH:x,NO_DOTS_SLASH:T,QMARK:O,QMARK_NO_DOT:W,STAR:G,START_ANCHOR:ne}=g,E=m=>`(${o}(?:(?!${ne}${m.dot?R:A}).)*?)`,b=r.dot?"":_,C=r.dot?O:W,M=r.bash===!0?E(r):G;r.capture&&(M=`(${M})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let l={input:e,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:i};e=J.removePrefix(e,l),s=e.length;let H=[],w=[],j=[],c=a,u,I=()=>l.index===s-1,$=l.peek=(m=1)=>e[l.index+m],ee=l.advance=()=>e[++l.index]||"",se=()=>e.slice(l.index+1),z=(m="",L=0)=>{l.consumed+=m,l.index+=L},Ce=m=>{l.output+=m.output!=null?m.output:m.value,z(m.value)},xr=()=>{let m=1;for(;$()==="!"&&($(2)!=="("||$(3)==="?");)ee(),l.start++,m++;return m%2==0?!1:(l.negated=!0,l.start++,!0)},we=m=>{l[m]++,j.push(m)},ue=m=>{l[m]--,j.pop()},v=m=>{if(c.type==="globstar"){let L=l.braces>0&&(m.type==="comma"||m.type==="brace"),d=m.extglob===!0||H.length&&(m.type==="pipe"||m.type==="paren");m.type!=="slash"&&m.type!=="paren"&&!L&&!d&&(l.output=l.output.slice(0,-c.output.length),c.type="star",c.value="*",c.output=M,l.output+=c.output)}if(H.length&&m.type!=="paren"&&(H[H.length-1].inner+=m.value),(m.value||m.output)&&Ce(m),c&&c.type==="text"&&m.type==="text"){c.value+=m.value,c.output=(c.output||"")+m.value;return}m.prev=c,i.push(m),c=m},Se=(m,L)=>{let d=Q(B({},f[L]),{conditions:1,inner:""});d.prev=c,d.parens=l.parens,d.output=l.output;let S=(r.capture?"(":"")+d.open;we("parens"),v({type:m,value:L,output:l.output?"":y}),v({type:"paren",extglob:!0,value:ee(),output:S}),H.push(d)},Cr=m=>{let L=m.close+(r.capture?")":""),d;if(m.type==="negate"){let S=M;m.inner&&m.inner.length>1&&m.inner.includes("/")&&(S=E(r)),(S!==M||I()||/^\)+$/.test(se()))&&(L=m.close=`)$))${S}`),m.inner.includes("*")&&(d=se())&&/^\.[^\\/.]+$/.test(d)&&(L=m.close=`)${d})${S})`),m.prev.type==="bos"&&(l.negatedExtglob=!0)}v({type:"paren",extglob:!0,value:u,output:L}),ue("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(e)){let m=!1,L=e.replace(Wn,(d,S,P,F,q,Me)=>F==="\\"?(m=!0,d):F==="?"?S?S+F+(q?O.repeat(q.length):""):Me===0?C+(q?O.repeat(q.length):""):O.repeat(P.length):F==="."?A.repeat(P.length):F==="*"?S?S+F+(q?M:""):M:S?d:`\\${d}`);return m===!0&&(r.unescape===!0?L=L.replace(/\\/g,""):L=L.replace(/\\+/g,d=>d.length%2==0?"\\\\":d?"\\":"")),L===e&&r.contains===!0?(l.output=e,l):(l.output=J.wrapOutput(L,l,t),l)}for(;!I();){if(u=ee(),u==="\0")continue;if(u==="\\"){let d=$();if(d==="/"&&r.bash!==!0||d==="."||d===";")continue;if(!d){u+="\\",v({type:"text",value:u});continue}let S=/^\\+/.exec(se()),P=0;if(S&&S[0].length>2&&(P=S[0].length,l.index+=P,P%2!=0&&(u+="\\")),r.unescape===!0?u=ee():u+=ee(),l.brackets===0){v({type:"text",value:u});continue}}if(l.brackets>0&&(u!=="]"||c.value==="["||c.value==="[^")){if(r.posix!==!1&&u===":"){let d=c.value.slice(1);if(d.includes("[")&&(c.posix=!0,d.includes(":"))){let S=c.value.lastIndexOf("["),P=c.value.slice(0,S),F=c.value.slice(S+2),q=qn[F];if(q){c.value=P+q,l.backtrack=!0,ee(),!a.output&&i.indexOf(c)===1&&(a.output=y);continue}}}(u==="["&&$()!==":"||u==="-"&&$()==="]")&&(u=`\\${u}`),u==="]"&&(c.value==="["||c.value==="[^")&&(u=`\\${u}`),r.posix===!0&&u==="!"&&c.value==="["&&(u="^"),c.value+=u,Ce({value:u});continue}if(l.quotes===1&&u!=='"'){u=J.escapeRegex(u),c.value+=u,Ce({value:u});continue}if(u==='"'){l.quotes=l.quotes===1?0:1,r.keepQuotes===!0&&v({type:"text",value:u});continue}if(u==="("){we("parens"),v({type:"paren",value:u});continue}if(u===")"){if(l.parens===0&&r.strictBrackets===!0)throw new SyntaxError(de("opening","("));let d=H[H.length-1];if(d&&l.parens===d.parens+1){Cr(H.pop());continue}v({type:"paren",value:u,output:l.parens?")":"\\)"}),ue("parens");continue}if(u==="["){if(r.nobracket===!0||!se().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(de("closing","]"));u=`\\${u}`}else we("brackets");v({type:"bracket",value:u});continue}if(u==="]"){if(r.nobracket===!0||c&&c.type==="bracket"&&c.value.length===1){v({type:"text",value:u,output:`\\${u}`});continue}if(l.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(de("opening","["));v({type:"text",value:u,output:`\\${u}`});continue}ue("brackets");let d=c.value.slice(1);if(c.posix!==!0&&d[0]==="^"&&!d.includes("/")&&(u=`/${u}`),c.value+=u,Ce({value:u}),r.literalBrackets===!1||J.hasRegexChars(d))continue;let S=J.escapeRegex(c.value);if(l.output=l.output.slice(0,-c.value.length),r.literalBrackets===!0){l.output+=S,c.value=S;continue}c.value=`(${o}${S}|${c.value})`,l.output+=c.value;continue}if(u==="{"&&r.nobrace!==!0){we("braces");let d={type:"brace",value:u,output:"(",outputIndex:l.output.length,tokensIndex:l.tokens.length};w.push(d),v(d);continue}if(u==="}"){let d=w[w.length-1];if(r.nobrace===!0||!d){v({type:"text",value:u,output:u});continue}let S=")";if(d.dots===!0){let P=i.slice(),F=[];for(let q=P.length-1;q>=0&&(i.pop(),P[q].type!=="brace");q--)P[q].type!=="dots"&&F.unshift(P[q].value);S=jn(F,r),l.backtrack=!0}if(d.comma!==!0&&d.dots!==!0){let P=l.output.slice(0,d.outputIndex),F=l.tokens.slice(d.tokensIndex);d.value=d.output="\\{",u=S="\\}",l.output=P;for(let q of F)l.output+=q.output||q.value}v({type:"brace",value:u,output:S}),ue("braces"),w.pop();continue}if(u==="|"){H.length>0&&H[H.length-1].conditions++,v({type:"text",value:u});continue}if(u===","){let d=u,S=w[w.length-1];S&&j[j.length-1]==="braces"&&(S.comma=!0,d="|"),v({type:"comma",value:u,output:d});continue}if(u==="/"){if(c.type==="dot"&&l.index===l.start+1){l.start=l.index+1,l.consumed="",l.output="",i.pop(),c=a;continue}v({type:"slash",value:u,output:k});continue}if(u==="."){if(l.braces>0&&c.type==="dot"){c.value==="."&&(c.output=A);let d=w[w.length-1];c.type="dots",c.output+=u,c.value+=u,d.dots=!0;continue}if(l.braces+l.parens===0&&c.type!=="bos"&&c.type!=="slash"){v({type:"text",value:u,output:A});continue}v({type:"dot",value:u,output:A});continue}if(u==="?"){if(!(c&&c.value==="(")&&r.noextglob!==!0&&$()==="("&&$(2)!=="?"){Se("qmark",u);continue}if(c&&c.type==="paren"){let S=$(),P=u;if(S==="<"&&!J.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(c.value==="("&&!/[!=<:]/.test(S)||S==="<"&&!/<([!=]|\w+>)/.test(se()))&&(P=`\\${u}`),v({type:"text",value:u,output:P});continue}if(r.dot!==!0&&(c.type==="slash"||c.type==="bos")){v({type:"qmark",value:u,output:W});continue}v({type:"qmark",value:u,output:O});continue}if(u==="!"){if(r.noextglob!==!0&&$()==="("&&($(2)!=="?"||!/[!=<:]/.test($(3)))){Se("negate",u);continue}if(r.nonegate!==!0&&l.index===0){xr();continue}}if(u==="+"){if(r.noextglob!==!0&&$()==="("&&$(2)!=="?"){Se("plus",u);continue}if(c&&c.value==="("||r.regex===!1){v({type:"plus",value:u,output:p});continue}if(c&&(c.type==="bracket"||c.type==="paren"||c.type==="brace")||l.parens>0){v({type:"plus",value:u});continue}v({type:"plus",value:p});continue}if(u==="@"){if(r.noextglob!==!0&&$()==="("&&$(2)!=="?"){v({type:"at",extglob:!0,value:u,output:""});continue}v({type:"text",value:u});continue}if(u!=="*"){(u==="$"||u==="^")&&(u=`\\${u}`);let d=Kn.exec(se());d&&(u+=d[0],l.index+=d[0].length),v({type:"text",value:u});continue}if(c&&(c.type==="globstar"||c.star===!0)){c.type="star",c.star=!0,c.value+=u,c.output=M,l.backtrack=!0,l.globstar=!0,z(u);continue}let m=se();if(r.noextglob!==!0&&/^\([^?]/.test(m)){Se("star",u);continue}if(c.type==="star"){if(r.noglobstar===!0){z(u);continue}let d=c.prev,S=d.prev,P=d.type==="slash"||d.type==="bos",F=S&&(S.type==="star"||S.type==="globstar");if(r.bash===!0&&(!P||m[0]&&m[0]!=="/")){v({type:"star",value:u,output:""});continue}let q=l.braces>0&&(d.type==="comma"||d.type==="brace"),Me=H.length&&(d.type==="pipe"||d.type==="paren");if(!P&&d.type!=="paren"&&!q&&!Me){v({type:"star",value:u,output:""});continue}for(;m.slice(0,3)==="/**";){let ve=e[l.index+4];if(ve&&ve!=="/")break;m=m.slice(3),z("/**",3)}if(d.type==="bos"&&I()){c.type="globstar",c.value+=u,c.output=E(r),l.output=c.output,l.globstar=!0,z(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&!F&&I()){l.output=l.output.slice(0,-(d.output+c.output).length),d.output=`(?:${d.output}`,c.type="globstar",c.output=E(r)+(r.strictSlashes?")":"|$)"),c.value+=u,l.globstar=!0,l.output+=d.output+c.output,z(u);continue}if(d.type==="slash"&&d.prev.type!=="bos"&&m[0]==="/"){let ve=m[1]!==void 0?"|$":"";l.output=l.output.slice(0,-(d.output+c.output).length),d.output=`(?:${d.output}`,c.type="globstar",c.output=`${E(r)}${k}|${k}${ve})`,c.value+=u,l.output+=d.output+c.output,l.globstar=!0,z(u+ee()),v({type:"slash",value:"/",output:""});continue}if(d.type==="bos"&&m[0]==="/"){c.type="globstar",c.value+=u,c.output=`(?:^|${k}|${E(r)}${k})`,l.output=c.output,l.globstar=!0,z(u+ee()),v({type:"slash",value:"/",output:""});continue}l.output=l.output.slice(0,-c.output.length),c.type="globstar",c.output=E(r),c.value+=u,l.output+=c.output,l.globstar=!0,z(u);continue}let L={type:"star",value:u,output:M};if(r.bash===!0){L.output=".*?",(c.type==="bos"||c.type==="slash")&&(L.output=b+L.output),v(L);continue}if(c&&(c.type==="bracket"||c.type==="paren")&&r.regex===!0){L.output=u,v(L);continue}(l.index===l.start||c.type==="slash"||c.type==="dot")&&(c.type==="dot"?(l.output+=x,c.output+=x):r.dot===!0?(l.output+=T,c.output+=T):(l.output+=b,c.output+=b),$()!=="*"&&(l.output+=y,c.output+=y)),v(L)}for(;l.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing","]"));l.output=J.escapeLast(l.output,"["),ue("brackets")}for(;l.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing",")"));l.output=J.escapeLast(l.output,"("),ue("parens")}for(;l.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(de("closing","}"));l.output=J.escapeLast(l.output,"{"),ue("braces")}if(r.strictSlashes!==!0&&(c.type==="star"||c.type==="bracket")&&v({type:"maybe_slash",value:"",output:`${k}?`}),l.backtrack===!0){l.output="";for(let m of l.tokens)l.output+=m.output!=null?m.output:m.value,m.suffix&&(l.output+=m.suffix)}return l};nr.fastpaths=(e,t)=>{let r=B({},t),n=typeof r.maxLength=="number"?Math.min(Ne,r.maxLength):Ne,s=e.length;if(s>n)throw new SyntaxError(`Input length: ${s}, exceeds maximum allowed length: ${n}`);e=rr[e]||e;let a=J.isWindows(t),{DOT_LITERAL:i,SLASH_LITERAL:o,ONE_CHAR:h,DOTS_SLASH:g,NO_DOT:f,NO_DOTS:A,NO_DOTS_SLASH:p,STAR:k,START_ANCHOR:y}=Oe.globChars(a),R=r.dot?A:f,_=r.dot?p:f,x=r.capture?"":"?:",T={negated:!1,prefix:""},O=r.bash===!0?".*?":k;r.capture&&(O=`(${O})`);let W=b=>b.noglobstar===!0?O:`(${x}(?:(?!${y}${b.dot?g:i}).)*?)`,G=b=>{switch(b){case"*":return`${R}${h}${O}`;case".*":return`${i}${h}${O}`;case"*.*":return`${R}${O}${i}${h}${O}`;case"*/*":return`${R}${O}${o}${h}${_}${O}`;case"**":return R+W(r);case"**/*":return`(?:${R}${W(r)}${o})?${_}${h}${O}`;case"**/*.*":return`(?:${R}${W(r)}${o})?${_}${O}${i}${h}${O}`;case"**/.*":return`(?:${R}${W(r)}${o})?${i}${h}${O}`;default:{let C=/^(.*?)\.(\w+)$/.exec(b);if(!C)return;let M=G(C[1]);return M?M+i+C[2]:void 0}}},ne=J.removePrefix(e,T),E=G(ne);return E&&r.strictSlashes!==!0&&(E+=`${o}?`),E};tr.exports=nr});var ir=K((ys,ar)=>{"use strict";var Fn=require("path"),Qn=er(),Ye=sr(),ze=be(),Xn=ye(),Zn=e=>e&&typeof e=="object"&&!Array.isArray(e),D=(e,t,r=!1)=>{if(Array.isArray(e)){let f=e.map(p=>D(p,t,r));return p=>{for(let k of f){let y=k(p);if(y)return y}return!1}}let n=Zn(e)&&e.tokens&&e.input;if(e===""||typeof e!="string"&&!n)throw new TypeError("Expected pattern to be a non-empty string");let s=t||{},a=ze.isWindows(t),i=n?D.compileRe(e,t):D.makeRe(e,t,!1,!0),o=i.state;delete i.state;let h=()=>!1;if(s.ignore){let f=Q(B({},t),{ignore:null,onMatch:null,onResult:null});h=D(s.ignore,f,r)}let g=(f,A=!1)=>{let{isMatch:p,match:k,output:y}=D.test(f,i,t,{glob:e,posix:a}),R={glob:e,state:o,regex:i,posix:a,input:f,output:y,match:k,isMatch:p};return typeof s.onResult=="function"&&s.onResult(R),p===!1?(R.isMatch=!1,A?R:!1):h(f)?(typeof s.onIgnore=="function"&&s.onIgnore(R),R.isMatch=!1,A?R:!1):(typeof s.onMatch=="function"&&s.onMatch(R),A?R:!0)};return r&&(g.state=o),g};D.test=(e,t,r,{glob:n,posix:s}={})=>{if(typeof e!="string")throw new TypeError("Expected input to be a string");if(e==="")return{isMatch:!1,output:""};let a=r||{},i=a.format||(s?ze.toPosixSlashes:null),o=e===n,h=o&&i?i(e):e;return o===!1&&(h=i?i(e):e,o=h===n),(o===!1||a.capture===!0)&&(a.matchBase===!0||a.basename===!0?o=D.matchBase(e,t,r,s):o=t.exec(h)),{isMatch:Boolean(o),match:o,output:h}};D.matchBase=(e,t,r,n=ze.isWindows(r))=>(t instanceof RegExp?t:D.makeRe(t,r)).test(Fn.basename(e));D.isMatch=(e,t,r)=>D(t,r)(e);D.parse=(e,t)=>Array.isArray(e)?e.map(r=>D.parse(r,t)):Ye(e,Q(B({},t),{fastpaths:!1}));D.scan=(e,t)=>Qn(e,t);D.compileRe=(e,t,r=!1,n=!1)=>{if(r===!0)return e.output;let s=t||{},a=s.contains?"":"^",i=s.contains?"":"$",o=`${a}(?:${e.output})${i}`;e&&e.negated===!0&&(o=`^(?!${o}).*$`);let h=D.toRegex(o,t);return n===!0&&(h.state=e),h};D.makeRe=(e,t={},r=!1,n=!1)=>{if(!e||typeof e!="string")throw new TypeError("Expected a non-empty string");let s={negated:!1,fastpaths:!0};return t.fastpaths!==!1&&(e[0]==="."||e[0]==="*")&&(s.output=Ye.fastpaths(e,t)),s.output||(s=Ye(e,t)),D.compileRe(s,t,r,n)};D.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(r){if(t&&t.debug===!0)throw r;return/$^/}};D.constants=Xn;ar.exports=D});var cr=K((bs,or)=>{"use strict";or.exports=ir()});var hr=K((_s,ur)=>{"use strict";var lr=require("util"),pr=Gt(),oe=cr(),Ve=be(),fr=e=>e===""||e==="./",N=(e,t,r)=>{t=[].concat(t),e=[].concat(e);let n=new Set,s=new Set,a=new Set,i=0,o=f=>{a.add(f.output),r&&r.onResult&&r.onResult(f)};for(let f=0;f!n.has(f));if(r&&g.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${t.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?t.map(f=>f.replace(/\\/g,"")):t}return g};N.match=N;N.matcher=(e,t)=>oe(e,t);N.isMatch=(e,t,r)=>oe(t,r)(e);N.any=N.isMatch;N.not=(e,t,r={})=>{t=[].concat(t).map(String);let n=new Set,s=[],a=o=>{r.onResult&&r.onResult(o),s.push(o.output)},i=N(e,t,Q(B({},r),{onResult:a}));for(let o of s)i.includes(o)||n.add(o);return[...n]};N.contains=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${lr.inspect(e)}"`);if(Array.isArray(t))return t.some(n=>N.contains(e,n,r));if(typeof t=="string"){if(fr(e)||fr(t))return!1;if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t))return!0}return N.isMatch(e,t,Q(B({},r),{contains:!0}))};N.matchKeys=(e,t,r)=>{if(!Ve.isObject(e))throw new TypeError("Expected the first argument to be an object");let n=N(Object.keys(e),t,r),s={};for(let a of n)s[a]=e[a];return s};N.some=(e,t,r)=>{let n=[].concat(e);for(let s of[].concat(t)){let a=oe(String(s),r);if(n.some(i=>a(i)))return!0}return!1};N.every=(e,t,r)=>{let n=[].concat(e);for(let s of[].concat(t)){let a=oe(String(s),r);if(!n.every(i=>a(i)))return!1}return!0};N.all=(e,t,r)=>{if(typeof e!="string")throw new TypeError(`Expected a string: "${lr.inspect(e)}"`);return[].concat(t).every(n=>oe(n,r)(e))};N.capture=(e,t,r)=>{let n=Ve.isWindows(r),a=oe.makeRe(String(e),Q(B({},r),{capture:!0})).exec(n?Ve.toPosixSlashes(t):t);if(a)return a.slice(1).map(i=>i===void 0?"":i)};N.makeRe=(...e)=>oe.makeRe(...e);N.scan=(...e)=>oe.scan(...e);N.parse=(e,t)=>{let r=[];for(let n of[].concat(e||[]))for(let s of pr(String(n),t))r.push(oe.parse(s,t));return r};N.braces=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return t&&t.nobrace===!0||!/\{.*\}/.test(e)?[e]:pr(e,t)};N.braceExpand=(e,t)=>{if(typeof e!="string")throw new TypeError("Expected a string");return N.braces(e,Q(B({},t),{expand:!0}))};ur.exports=N});var gr=K((Es,dr)=>{"use strict";dr.exports=(e,...t)=>new Promise(r=>{r(e(...t))})});var Ar=K((xs,Je)=>{"use strict";var Yn=gr(),mr=e=>{if(e<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let t=[],r=0,n=()=>{r--,t.length>0&&t.shift()()},s=(o,h,...g)=>{r++;let f=Yn(o,...g);h(f),f.then(n,n)},a=(o,h,...g)=>{rnew Promise(g=>a(o,g,...h));return Object.defineProperties(i,{activeCount:{get:()=>r},pendingCount:{get:()=>t.length}}),i};Je.exports=mr;Je.exports.default=mr});var Vn={};Or(Vn,{default:()=>es});var He=X(require("@yarnpkg/cli")),ae=X(require("@yarnpkg/core")),nt=X(require("@yarnpkg/core")),le=X(require("clipanion")),Ae=class extends He.BaseCommand{constructor(){super(...arguments);this.json=le.Option.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=le.Option.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=le.Option.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=le.Option.Rest()}async execute(){let t=await ae.Configuration.find(this.context.cwd,this.context.plugins),{project:r,workspace:n}=await ae.Project.find(t,this.context.cwd),s=await ae.Cache.find(t);await r.restoreInstallState({restoreResolutions:!1});let a;if(this.all)a=new Set(r.workspaces);else if(this.workspaces.length===0){if(!n)throw new He.WorkspaceRequiredError(r.cwd,this.context.cwd);a=new Set([n])}else a=new Set(this.workspaces.map(o=>r.getWorkspaceByIdent(nt.structUtils.parseIdent(o))));for(let o of a)for(let h of this.production?["dependencies"]:ae.Manifest.hardDependencies)for(let g of o.manifest.getForScope(h).values()){let f=r.tryWorkspaceByDescriptor(g);f!==null&&a.add(f)}for(let o of r.workspaces)a.has(o)?this.production&&o.manifest.devDependencies.clear():(o.manifest.installConfig=o.manifest.installConfig||{},o.manifest.installConfig.selfReferences=!1,o.manifest.dependencies.clear(),o.manifest.devDependencies.clear(),o.manifest.peerDependencies.clear(),o.manifest.scripts.clear());return(await ae.StreamReport.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!0},async o=>{await r.install({cache:s,report:o,persistProject:!1})})).exitCode()}};Ae.paths=[["workspaces","focus"]],Ae.usage=le.Command.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});var st=Ae;var Ie=X(require("@yarnpkg/cli")),ge=X(require("@yarnpkg/core")),Ee=X(require("@yarnpkg/core")),Y=X(require("@yarnpkg/core")),Rr=X(require("@yarnpkg/plugin-git")),U=X(require("clipanion")),Be=X(hr()),yr=X(require("os")),br=X(Ar()),re=X(require("typanion")),xe=class extends Ie.BaseCommand{constructor(){super(...arguments);this.recursive=U.Option.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.from=U.Option.Array("--from",[],{description:"An array of glob pattern idents from which to base any recursion"});this.all=U.Option.Boolean("-A,--all",!1,{description:"Run the command on all workspaces of a project"});this.verbose=U.Option.Boolean("-v,--verbose",!1,{description:"Prefix each output line with the name of the originating workspace"});this.parallel=U.Option.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=U.Option.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=U.Option.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:re.isOneOf([re.isEnum(["unlimited"]),re.applyCascade(re.isNumber(),[re.isInteger(),re.isAtLeast(1)])])});this.topological=U.Option.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=U.Option.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=U.Option.Array("--include",[],{description:"An array of glob pattern idents; only matching workspaces will be traversed"});this.exclude=U.Option.Array("--exclude",[],{description:"An array of glob pattern idents; matching workspaces won't be traversed"});this.publicOnly=U.Option.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=U.Option.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.commandName=U.Option.String();this.args=U.Option.Proxy()}async execute(){let t=await ge.Configuration.find(this.context.cwd,this.context.plugins),{project:r,workspace:n}=await ge.Project.find(t,this.context.cwd);if(!this.all&&!n)throw new Ie.WorkspaceRequiredError(r.cwd,this.context.cwd);await r.restoreInstallState();let s=this.cli.process([this.commandName,...this.args]),a=s.path.length===1&&s.path[0]==="run"&&typeof s.scriptName!="undefined"?s.scriptName:null;if(s.path.length===0)throw new U.UsageError("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let i=this.all?r.topLevelWorkspace:n,o=this.since?Array.from(await Rr.gitUtils.fetchChangedWorkspaces({ref:this.since,project:r})):[i,...this.from.length>0?i.getRecursiveWorkspaceChildren():[]],h=E=>Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.from),g=this.from.length>0?o.filter(h):o,f=new Set([...g,...g.map(E=>[...this.recursive?this.since?E.getRecursiveWorkspaceDependents():E.getRecursiveWorkspaceDependencies():E.getRecursiveWorkspaceChildren()]).flat()]),A=[],p=!1;if(a==null?void 0:a.includes(":")){for(let E of r.workspaces)if(E.manifest.scripts.has(a)&&(p=!p,p===!1))break}for(let E of f)a&&!E.manifest.scripts.has(a)&&!p&&!(await ge.scriptUtils.getWorkspaceAccessibleBinaries(E)).has(a)||a===process.env.npm_lifecycle_event&&E.cwd===n.cwd||this.include.length>0&&!Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.include)||this.exclude.length>0&&Be.default.isMatch(Y.structUtils.stringifyIdent(E.locator),this.exclude)||this.publicOnly&&E.manifest.private===!0||A.push(E);let k=this.parallel?this.jobs==="unlimited"?Infinity:Number(this.jobs)||Math.max(1,(0,yr.cpus)().length/2):1,y=k===1?!1:this.parallel,R=y?this.interlaced:!0,_=(0,br.default)(k),x=new Map,T=new Set,O=0,W=null,G=!1,ne=await Ee.StreamReport.start({configuration:t,stdout:this.context.stdout},async E=>{let b=async(C,{commandIndex:M})=>{if(G)return-1;!y&&this.verbose&&M>1&&E.reportSeparator();let l=zn(C,{configuration:t,verbose:this.verbose,commandIndex:M}),[H,w]=_r(E,{prefix:l,interlaced:R}),[j,c]=_r(E,{prefix:l,interlaced:R});try{this.verbose&&E.reportInfo(null,`${l} Process started`);let u=Date.now(),I=await this.cli.run([this.commandName,...this.args],{cwd:C.cwd,stdout:H,stderr:j})||0;H.end(),j.end(),await w,await c;let $=Date.now();if(this.verbose){let ee=t.get("enableTimers")?`, completed in ${Y.formatUtils.pretty(t,$-u,Y.formatUtils.Type.DURATION)}`:"";E.reportInfo(null,`${l} Process exited (exit code ${I})${ee}`)}return I===130&&(G=!0,W=I),I}catch(u){throw H.end(),j.end(),await w,await c,u}};for(let C of A)x.set(C.anchoredLocator.locatorHash,C);for(;x.size>0&&!E.hasErrors();){let C=[];for(let[H,w]of x){if(T.has(w.anchoredDescriptor.descriptorHash))continue;let j=!0;if(this.topological||this.topologicalDev){let c=this.topologicalDev?new Map([...w.manifest.dependencies,...w.manifest.devDependencies]):w.manifest.dependencies;for(let u of c.values()){let I=r.tryWorkspaceByDescriptor(u);if(j=I===null||!x.has(I.anchoredLocator.locatorHash),!j)break}}if(!!j&&(T.add(w.anchoredDescriptor.descriptorHash),C.push(_(async()=>{let c=await b(w,{commandIndex:++O});return x.delete(H),T.delete(w.anchoredDescriptor.descriptorHash),c})),!y))break}if(C.length===0){let H=Array.from(x.values()).map(w=>Y.structUtils.prettyLocator(t,w.anchoredLocator)).join(", ");E.reportError(Ee.MessageName.CYCLIC_DEPENDENCIES,`Dependency cycle detected (${H})`);return}let l=(await Promise.all(C)).find(H=>H!==0);W===null&&(W=typeof l!="undefined"?1:W),(this.topological||this.topologicalDev)&&typeof l!="undefined"&&E.reportError(Ee.MessageName.UNNAMED,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return W!==null?W:ne.exitCode()}};xe.paths=[["workspaces","foreach"]],xe.usage=U.Command.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project. By default yarn runs the command only on current and all its descendant workspaces.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n Adding the `-v,--verbose` flag will cause Yarn to print more information; in particular the name of the workspace that generated the output will be printed at the front of each line.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish current and all descendant packages","yarn workspaces foreach npm publish --tolerate-republish"],["Run build script on current and all descendant packages","yarn workspaces foreach run build"],["Run build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -pt run build"],["Run build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -ptR --from '{workspace-a,workspace-b}' run build"]]});var Er=xe;function _r(e,{prefix:t,interlaced:r}){let n=e.createStreamReporter(t),s=new Y.miscUtils.DefaultStream;s.pipe(n,{end:!1}),s.on("finish",()=>{n.end()});let a=new Promise(o=>{n.on("finish",()=>{o(s.active)})});if(r)return[s,a];let i=new Y.miscUtils.BufferStream;return i.pipe(s,{end:!1}),i.on("finish",()=>{s.end()}),[i,a]}function zn(e,{configuration:t,commandIndex:r,verbose:n}){if(!n)return null;let s=Y.structUtils.convertToIdent(e.locator),i=`[${Y.structUtils.stringifyIdent(s)}]:`,o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],h=o[r%o.length];return Y.formatUtils.pretty(t,i,h)}var Jn={commands:[st,Er]},es=Jn;return Vn;})(); 8 | /*! 9 | * fill-range 10 | * 11 | * Copyright (c) 2014-present, Jon Schlinkert. 12 | * Licensed under the MIT License. 13 | */ 14 | /*! 15 | * is-number 16 | * 17 | * Copyright (c) 2014-present, Jon Schlinkert. 18 | * Released under the MIT License. 19 | */ 20 | /*! 21 | * to-regex-range 22 | * 23 | * Copyright (c) 2015-present, Jon Schlinkert. 24 | * Released under the MIT License. 25 | */ 26 | return plugin; 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | enableMessageNames: false 2 | nmHoistingLimits: workspaces 3 | nodeLinker: node-modules 4 | plugins: 5 | - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs 6 | spec: "@yarnpkg/plugin-workspace-tools" 7 | yarnPath: .yarn/releases/yarn-3.2.3.cjs 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Geese: The Hackathon In A Box 2 | 3 | This is a boilerplate that we often use for our hackathons. Feel free to use this however you wish! 4 | 5 | It has no functionality, just allows us to get up and running to work on the actually interesting bits. 6 | 7 | No need to credit us if you use this for your own projects, but please make any PRs for any improvements :P 8 | 9 | Run this with the [GitHub CLI](https://cli.github.com/) and [Caddy](https://caddyserver.com/): 10 | 11 | ```bash 12 | 13 | gh repo create -p https://github.com/minihacks/geese --clone --public [name] 14 | 15 | # after cloning, make sure you have dependencies installed 16 | cp .env.example .env 17 | yarn install 18 | 19 | # then, run the project: 20 | yarn dev 21 | ``` 22 |
23 | If you have a team 24 | 25 | You can add it to a team directly by replacing `minihacks/geese` with your team/project name below: 26 | ```bash 27 | gh repo create -p https://github.com/minihacks/geese --clone --private minihacks/geese 28 | ``` 29 | 30 | To make the repo public, you can run 31 | ```bash 32 | gh repo edit --visibility public 33 | ``` 34 |
35 | 36 | 37 | 38 | ## Parts 39 | - Infrastructure 40 | - [x] Replace NGINX with Caddy 41 | - [x] Shared Directory 42 | - [x] Yarn workspaces 43 | - Frontend 44 | - [X] Latest NextJS Version 45 | - [x] NextAuth 46 | - Backend 47 | - [X] SocketIO 48 | - Python 49 | - [x] FastAPI 50 | - MongoDB 51 | - [ ] MongoDB 52 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: ["commitlint-plugin-function-rules"], 3 | rules: { 4 | "subject-empty": [2, "always"], 5 | "function-rules/header-case": [ 6 | 2, 7 | "always", 8 | (parsed) => { 9 | const { header } = parsed; 10 | const headerPattern = /^[^A-z0-9 ]/; 11 | const headerPatternMatch = headerPattern.test(header); 12 | if (!headerPatternMatch) { 13 | return [false, "ur commit msg needs to start w an emoji 💗 \n\n"]; 14 | } 15 | return [true]; 16 | }, 17 | ], 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geese", 3 | "packageManager": "yarn@3.2.3", 4 | "workspaces": [ 5 | "packages/*" 6 | ], 7 | "private": true, 8 | "husky": { 9 | "hooks": { 10 | "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" 11 | } 12 | }, 13 | "scripts": { 14 | "prepare": "yarn install; yarn workspaces foreach run prepare", 15 | "dev": "yarn env-cmd yarn workspaces foreach -pi run dev", 16 | "build": "yarn env-cmd yarn workspaces foreach -pi run build", 17 | "start": "yarn env-cmd yarn workspaces foreach -pi run start", 18 | "postinstall": "husky install", 19 | "test": "echo \"tests completed\"" 20 | }, 21 | "devDependencies": { 22 | "@commitlint/cli": "^17.4.4", 23 | "@commitlint/config-conventional": "^17.4.4", 24 | "@typescript-eslint/eslint-plugin": "^4.28.5", 25 | "@typescript-eslint/parser": "^4.28.5", 26 | "commitlint-plugin-function-rules": "^1.7.1", 27 | "env-cmd": "^10.1.0", 28 | "eslint": "^8.9.0", 29 | "eslint-config-airbnb": "^19.0.4", 30 | "eslint-config-airbnb-typescript": "^16.1.0", 31 | "eslint-config-next": "^12.0.10", 32 | "eslint-config-prettier": "^8.3.0", 33 | "eslint-plugin-import": "^2.25.4", 34 | "eslint-plugin-jsx-a11y": "^6.5.1", 35 | "eslint-plugin-only-warn": "^1.0.3", 36 | "eslint-plugin-prettier": "^3.4.0", 37 | "eslint-plugin-react": "^7.28.0", 38 | "eslint-plugin-react-hooks": "^4.3.0", 39 | "husky": "^8.0.0", 40 | "nodemon": "^2.0.19", 41 | "prettier": "^2.5.1" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /packages/backend/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/backend/__init__.py -------------------------------------------------------------------------------- /packages/backend/__main__.py: -------------------------------------------------------------------------------- 1 | import uvicorn 2 | import backend.app as app 3 | import os 4 | 5 | uvicorn.run(app.app, host="0.0.0.0", port=int(os.environ.get("BACKEND_PORT", 8000))) 6 | -------------------------------------------------------------------------------- /packages/backend/app.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI 2 | 3 | app = FastAPI() 4 | 5 | @app.get("/") 6 | async def root(): 7 | return {"message": "Hello World"} 8 | -------------------------------------------------------------------------------- /packages/backend/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "restartable": "rs", 3 | "quiet": true, 4 | "exec": "cd ..; python3.9 -m backend", 5 | "env": { 6 | "PYTHON_ENV": "development" 7 | }, 8 | "watch": ["*.py"], 9 | "ext": "py" 10 | } 11 | -------------------------------------------------------------------------------- /packages/backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "packageManager": "yarn@3.2.3", 4 | "scripts": { 5 | "dev": "nodemon ../", 6 | "prepare": "pip3 install -r requirements.txt --no-input", 7 | "build": "pip3 install -r requirements.txt --no-input", 8 | "start": "nodemon ../" 9 | }, 10 | "devDependencies": { 11 | "nodemon": "^2.0.19" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/backend/requirements.txt: -------------------------------------------------------------------------------- 1 | fastapi==0.74.0 2 | uvicorn[standard]==0.17.5 3 | -------------------------------------------------------------------------------- /packages/chrome/background.js: -------------------------------------------------------------------------------- 1 | chrome.action.onClicked.addListener((tab) => { 2 | chrome.tabs.create({ url: "https://schedulebuilder.umn.edu/" }); 3 | }); 4 | -------------------------------------------------------------------------------- /packages/chrome/icons/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-128.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-16.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-256.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-32.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-512.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-64.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon-72.png -------------------------------------------------------------------------------- /packages/chrome/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/chrome/icons/icon.png -------------------------------------------------------------------------------- /packages/chrome/injection/injection.css: -------------------------------------------------------------------------------- 1 | * { 2 | background-color: #ffffcc; 3 | } 4 | -------------------------------------------------------------------------------- /packages/chrome/injection/injection.js: -------------------------------------------------------------------------------- 1 | console.log("injection.js loaded"); 2 | -------------------------------------------------------------------------------- /packages/chrome/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geese manifest title!", 3 | "description": "template made by @minihacks/geese", 4 | "version": "1.2.0", 5 | "manifest_version": 3, 6 | "background": { 7 | "service_worker": "background.js" 8 | }, 9 | "omnibox": { 10 | "keyword": "gg" 11 | }, 12 | "content_scripts": [ 13 | { 14 | "matches": [ 15 | "https://*/*" 16 | ], 17 | "css": [ 18 | "injection/injection.css" 19 | ], 20 | "js": [ 21 | "injection/injection.js" 22 | ] 23 | } 24 | ], 25 | "action": { 26 | "default_title": "geese action title!", 27 | "default_icon": { 28 | "32": "icons/icon-32.png", 29 | "72": "icons/icon-72.png", 30 | "128": "icons/icon-128.png", 31 | "512": "icons/icon-512.png" 32 | }, 33 | "default_popup": "popup.html" 34 | }, 35 | "icons": { 36 | "32": "icons/icon-32.png", 37 | "72": "icons/icon-72.png", 38 | "128": "icons/icon-128.png", 39 | "512": "icons/icon-512.png" 40 | }, 41 | "permissions": [ 42 | "tabs", 43 | "scripting" 44 | ], 45 | "host_permissions": [ 46 | "https://*/*", 47 | "http://*/*" 48 | ] 49 | } 50 | -------------------------------------------------------------------------------- /packages/chrome/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chrome", 3 | "packageManager": "yarn@3.2.3", 4 | "devDependencies": { 5 | "@types/chrome": "^0.0.216" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/chrome/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | Geese 9 | 19 | 20 | 21 |

we are cool geese

22 | 23 | 24 | -------------------------------------------------------------------------------- /packages/frontend/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true, 5 | "node": true 6 | }, 7 | "extends": [ 8 | "airbnb", 9 | "airbnb-typescript", 10 | "airbnb/hooks", 11 | "plugin:@next/next/recommended", 12 | "plugin:@typescript-eslint/recommended", 13 | "prettier" 14 | ], 15 | "globals": { 16 | "drift": "readonly", 17 | "process": true, 18 | "NodeJS": true 19 | }, 20 | "overrides": [ 21 | { 22 | "files": [ 23 | "packages/frontend/**/test-utils.js", 24 | "packages/frontend/**/*.test.{j,t}s?(x)" 25 | ], 26 | "env": { 27 | "jest": true 28 | }, 29 | "extends": [ 30 | "airbnb", 31 | "airbnb-typescript", 32 | "airbnb/hooks", 33 | "plugin:@next/next/recommended", 34 | "plugin:@typescript-eslint/recommended", 35 | "prettier" 36 | ], 37 | "rules": { 38 | "max-lines": "off", 39 | "max-lines-per-function": "off" 40 | } 41 | }, 42 | { 43 | "files": [ 44 | "packages/backend/**/*", 45 | "packages/io/**/*" 46 | ], 47 | "rules": { 48 | "@next/next/no-html-link-for-pages": "off" 49 | } 50 | }, 51 | { 52 | "files": [ 53 | "*.js", 54 | "*.jsx" 55 | ], 56 | "rules": { 57 | "@typescript-eslint/explicit-module-boundary-types": "off" 58 | } 59 | } 60 | ], 61 | "parser": "@typescript-eslint/parser", 62 | "parserOptions": { 63 | "sourceType": "module", 64 | "project": "./tsconfig.eslint.json" 65 | }, 66 | "plugins": [ 67 | "@typescript-eslint", 68 | "prettier" 69 | ], 70 | "root": true, 71 | "rules": { 72 | "@next/next/link-passhref": "off", 73 | "@next/next/next-script-for-ga": "error", 74 | "@next/next/no-html-link-for-pages": "error", 75 | "@next/next/no-img-element": "off", 76 | "@next/next/no-sync-scripts": "error", 77 | "@typescript-eslint/explicit-module-boundary-types": "warn", 78 | "@typescript-eslint/no-explicit-any": "error", 79 | "@typescript-eslint/no-unused-vars": "error", 80 | "@typescript-eslint/no-var-requires": "off", 81 | "arrow-body-style": "off", 82 | "import/no-import-module-exports": [ 83 | "error", 84 | { 85 | "exceptions": [ 86 | "**/*/store.js" 87 | ] 88 | } 89 | ], 90 | "import/prefer-default-export": "off", 91 | "no-alert": "error", 92 | "no-console": "error", 93 | "no-plusplus": [ 94 | "error", 95 | { 96 | "allowForLoopAfterthoughts": true 97 | } 98 | ], 99 | "no-underscore-dangle": "off", 100 | "prettier/prettier": "error", 101 | "react/function-component-definition": "off", 102 | "react/jsx-curly-brace-presence": [ 103 | "error", 104 | { 105 | "props": "always", 106 | "children": "never" 107 | } 108 | ], 109 | "react/jsx-filename-extension": [ 110 | 2, 111 | { 112 | "extensions": [ 113 | ".tsx", 114 | ".jsx" 115 | ] 116 | } 117 | ], 118 | "react/jsx-no-bind": "off", 119 | "react/jsx-props-no-spreading": "off", 120 | "react/no-danger": "error", 121 | "react/prop-types": "off", 122 | "react/react-in-jsx-scope": "off", 123 | "react/require-default-props": "off", 124 | "react-hooks/exhaustive-deps": "warn" 125 | }, 126 | "settings": { 127 | "next": { 128 | "rootDir": "packages/frontend/" 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /packages/frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /packages/frontend/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | ``` 12 | 13 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 14 | 15 | You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. 16 | 17 | [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. 18 | 19 | The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. 20 | 21 | ## Learn More 22 | 23 | To learn more about Next.js, take a look at the following resources: 24 | 25 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 26 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 27 | 28 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 29 | 30 | ## Deploy on Vercel 31 | 32 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 33 | 34 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 35 | -------------------------------------------------------------------------------- /packages/frontend/components/Layout/MyHeading.tsx: -------------------------------------------------------------------------------- 1 | import Head from "next/head"; 2 | 3 | const DEFAULT_TITLE = "MiniHacks Presents:"; 4 | const DEFAULT_DESC = "A Hackathon Project!"; 5 | 6 | export type MyHeadingProps = { 7 | title?: string; 8 | }; 9 | 10 | const MyHeading = ({ title }: MyHeadingProps): JSX.Element => ( 11 | 12 | {title || DEFAULT_TITLE} 13 | 14 | 15 | 16 | ); 17 | export default MyHeading; 18 | -------------------------------------------------------------------------------- /packages/frontend/components/Layout/PageLayout.tsx: -------------------------------------------------------------------------------- 1 | import { Box } from "@chakra-ui/react"; 2 | import { ReactNode } from "react"; 3 | import MyHeading, { MyHeadingProps } from "./MyHeading"; 4 | 5 | type PageLayoutProps = MyHeadingProps & { 6 | children: ReactNode; 7 | }; 8 | 9 | const PageLayout = ({ children, ...props }: PageLayoutProps): JSX.Element => ( 10 | 11 | 12 | {children} 13 | 14 | ); 15 | export default PageLayout; 16 | -------------------------------------------------------------------------------- /packages/frontend/next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | reactStrictMode: true, 4 | swcMinify: true, 5 | } 6 | 7 | module.exports = nextConfig 8 | -------------------------------------------------------------------------------- /packages/frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@chakra-ui/react": "^2.3.2", 13 | "@emotion/react": "^11", 14 | "@emotion/styled": "^11", 15 | "framer-motion": "^6", 16 | "next": "12.3.0", 17 | "next-auth": "^4.19.2", 18 | "react": "18.2.0", 19 | "react-dom": "18.2.0" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "18.7.18", 23 | "@types/react": "18.0.20", 24 | "@types/react-dom": "18.0.6", 25 | "@typescript-eslint/eslint-plugin": "^5.37.0", 26 | "@typescript-eslint/parser": "^5.37.0", 27 | "cross-env": "^7.0.3", 28 | "eslint": "8.23.1", 29 | "eslint-config-airbnb": "^19.0.4", 30 | "eslint-config-airbnb-typescript": "^16.1.0", 31 | "eslint-config-next": "12.3.0", 32 | "eslint-config-prettier": "^8.3.0", 33 | "eslint-plugin-import": "^2.25.4", 34 | "eslint-plugin-jsx-a11y": "^6.5.1", 35 | "eslint-plugin-only-warn": "^1.0.3", 36 | "eslint-plugin-prettier": "^3.4.0", 37 | "eslint-plugin-react": "^7.28.0", 38 | "eslint-plugin-react-hooks": "^4.3.0", 39 | "prettier": "^2.5.1", 40 | "typescript": "4.8.3" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /packages/frontend/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { ChakraProvider } from "@chakra-ui/react"; 2 | 3 | import type { AppProps } from "next/app"; 4 | import theme from "../theme"; 5 | 6 | function MyApp({ Component, pageProps }: AppProps): JSX.Element { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | 14 | export default MyApp; 15 | -------------------------------------------------------------------------------- /packages/frontend/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { ColorModeScript } from "@chakra-ui/react"; 2 | import { Head, Html, Main, NextScript } from "next/document"; 3 | import theme from "../theme"; 4 | 5 | export default function Document(): JSX.Element { 6 | return ( 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /packages/frontend/pages/api/[...nextauth].js: -------------------------------------------------------------------------------- 1 | import NextAuth from "next-auth" 2 | import GithubProvider from "next-auth/providers/github" 3 | 4 | export default NextAuth({ 5 | // Configure one or more authentication providers 6 | providers: [ 7 | GithubProvider({ 8 | clientId: process.env.GITHUB_ID, 9 | clientSecret: process.env.GITHUB_SECRET, 10 | }), 11 | // ...add more providers here 12 | ], 13 | }) -------------------------------------------------------------------------------- /packages/frontend/pages/api/hello.ts: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | import type { NextApiRequest, NextApiResponse } from 'next' 3 | 4 | type Data = { 5 | name: string 6 | } 7 | 8 | export default function handler( 9 | req: NextApiRequest, 10 | res: NextApiResponse 11 | ) { 12 | res.status(200).json({ name: 'John Doe' }) 13 | } 14 | -------------------------------------------------------------------------------- /packages/frontend/pages/index.tsx: -------------------------------------------------------------------------------- 1 | import type { NextPage } from "next"; 2 | import { Box, Heading } from "@chakra-ui/react"; 3 | import PageLayout from "../components/Layout/PageLayout"; 4 | 5 | const Home: NextPage = () => { 6 | return ( 7 | 8 | 9 | geese 10 | 11 | 12 | ); 13 | }; 14 | 15 | export default Home; 16 | -------------------------------------------------------------------------------- /packages/frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/frontend/public/favicon.ico -------------------------------------------------------------------------------- /packages/frontend/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /packages/frontend/theme.ts: -------------------------------------------------------------------------------- 1 | import { extendTheme } from "@chakra-ui/react"; 2 | 3 | export default extendTheme({ 4 | initialColorMode: "light", 5 | }); 6 | -------------------------------------------------------------------------------- /packages/frontend/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "**/**.tsx", 4 | "**/**.ts", 5 | "**/**.jsx", 6 | "**/**.js", 7 | "next-env.d.ts" 8 | ] 9 | } -------------------------------------------------------------------------------- /packages/frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true 17 | }, 18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /packages/infra/Caddyfile: -------------------------------------------------------------------------------- 1 | :8888 2 | 3 | handle_path {$IO_PATH}* { 4 | reverse_proxy 127.0.0.1:{$IO_PORT} 5 | } 6 | 7 | handle_path {$BACKEND_PATH}* { 8 | reverse_proxy 127.0.0.1:{$BACKEND_PORT} 9 | } 10 | 11 | reverse_proxy 127.0.0.1:{$PORT} 12 | -------------------------------------------------------------------------------- /packages/infra/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "restartable": "rs", 3 | "quiet": true, 4 | "exec": "caddy reload", 5 | "watch": ["Caddyfile"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/infra/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "infra", 3 | "packageManager": "yarn@3.2.3", 4 | "scripts": { 5 | "dev": "yarn env-cmd -f ../../.env nodemon Caddyfile", 6 | "start": "yarn env-cmd -f ../../.env nodemon Caddyfile" 7 | }, 8 | "devDependencies": { 9 | "env-cmd": "^10.1.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/io/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | printWidth: 110, 3 | tabWidth: 2, 4 | useTabs: false, 5 | semi: true, 6 | singleQuote: false, 7 | trailingComma: "es5", 8 | bracketSpacing: true, 9 | bracketSameLine: true, 10 | arrowParens: "always", 11 | requirePragma: false, 12 | insertPragma: false, 13 | proseWrap: "always", 14 | endOfLine: "auto", 15 | }; 16 | -------------------------------------------------------------------------------- /packages/io/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "restartable": "rs", 3 | "verbose": false, 4 | "quiet": true, 5 | "execMap": { 6 | "ts": "yarn esr --cache" 7 | }, 8 | "watch": [ 9 | "src/" 10 | ], 11 | "env": { 12 | "NODE_ENV": "development" 13 | }, 14 | "ext": "ts" 15 | } 16 | -------------------------------------------------------------------------------- /packages/io/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "io", 3 | "packageManager": "yarn@3.2.3", 4 | "scripts": { 5 | "dev": "yarn nodemon src/app.ts", 6 | "build": "yarn tsc", 7 | "start": "yarn node dist/app.js" 8 | }, 9 | "dependencies": { 10 | "express": "^4.18.1", 11 | "socket.io": "^4.5.2" 12 | }, 13 | "devDependencies": { 14 | "@types/express": "^4.17.14", 15 | "@typescript-eslint/parser": "^5.37.0", 16 | "esbuild": "^0.15.7", 17 | "esbuild-runner": "^2.2.1", 18 | "nodemon": "^2.0.19", 19 | "typescript": "^4.8.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/io/src/app.ts: -------------------------------------------------------------------------------- 1 | // dotenv 2 | const _l = console.log; 3 | console.log = (...params) => _l("\x1b[35m" + "[io]", ...params); 4 | 5 | import express, { Request, Response } from "express"; 6 | import { createServer } from "http"; 7 | import { Server } from "socket.io"; 8 | 9 | const app = express(); 10 | const server = createServer(app); 11 | 12 | const io = new Server(server); 13 | 14 | const PORT = +(process?.env?.IO_PORT ?? 5001); 15 | 16 | app.get("/", (req: Request, res: Response) => { 17 | res.send("hello world :)"); 18 | }); 19 | 20 | io.on("connection", (socket) => { 21 | console.log(`user ${socket.id} connected`); 22 | }); 23 | 24 | server.listen(PORT, () => { 25 | console.log(`io listening on http://localhost:${PORT}`); 26 | }); 27 | -------------------------------------------------------------------------------- /packages/io/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | 41 | /* JavaScript Support */ 42 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 43 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 44 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 45 | 46 | /* Emit */ 47 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 48 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 49 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 50 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 51 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 52 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 53 | // "removeComments": true, /* Disable emitting comments. */ 54 | // "noEmit": true, /* Disable emitting files from a compilation. */ 55 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 56 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 57 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 58 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 59 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 60 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 61 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 62 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 63 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 64 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 65 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 66 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 67 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 68 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 69 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 70 | 71 | /* Interop Constraints */ 72 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 73 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 74 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 75 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 76 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 77 | 78 | /* Type Checking */ 79 | "strict": true, /* Enable all strict type-checking options. */ 80 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 81 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 82 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 83 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 84 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 85 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 86 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 87 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 88 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 89 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 90 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 91 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 92 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 93 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 94 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 95 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 96 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 97 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 98 | 99 | /* Completeness */ 100 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 101 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /packages/mobile/.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /packages/mobile/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | *.hprof 33 | .cxx/ 34 | *.keystore 35 | !debug.keystore 36 | 37 | # node.js 38 | # 39 | node_modules/ 40 | npm-debug.log 41 | yarn-error.log 42 | 43 | # Bundle artifacts 44 | *.jsbundle 45 | 46 | # CocoaPods 47 | /ios/Pods/ 48 | 49 | # Temporary files created by Metro to check the health of the file watcher 50 | .metro-health-check* 51 | 52 | # Expo 53 | .expo/ 54 | web-build/ 55 | dist/ 56 | -------------------------------------------------------------------------------- /packages/mobile/App.js: -------------------------------------------------------------------------------- 1 | import { StatusBar } from "expo-status-bar"; 2 | import React from "react"; 3 | import { StyleSheet } from "react-native"; 4 | import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; 5 | import { MaterialCommunityIcons } from "@expo/vector-icons"; 6 | import { NavigationContainer } from "@react-navigation/native"; 7 | import SettingsScreen from "./screens/SettingsScreen"; 8 | import HomeScreen from "./screens/HomeScreen"; 9 | 10 | const Tab = createBottomTabNavigator(); 11 | 12 | function MyTabs() { 13 | return ( 14 | 21 | ( 27 | 28 | ), 29 | }} 30 | /> 31 | ( 37 | 38 | ), 39 | }} 40 | /> 41 | 42 | ); 43 | } 44 | 45 | export default function App() { 46 | return ( 47 | 48 | 49 | 50 | 51 | ); 52 | } 53 | 54 | const styles = StyleSheet.create({ 55 | container: { 56 | flex: 1, 57 | backgroundColor: "#fff", 58 | alignItems: "center", 59 | justifyContent: "center", 60 | }, 61 | }); 62 | -------------------------------------------------------------------------------- /packages/mobile/android/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Android/IntelliJ 6 | # 7 | build/ 8 | .idea 9 | .gradle 10 | local.properties 11 | *.iml 12 | *.hprof 13 | 14 | # Bundle artifacts 15 | *.jsbundle 16 | -------------------------------------------------------------------------------- /packages/mobile/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | apply plugin: "com.facebook.react" 3 | 4 | import com.android.build.OutputFile 5 | 6 | def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() 7 | def expoDebuggableVariants = ['debug'] 8 | // Override `debuggableVariants` for expo-updates debugging 9 | if (System.getenv('EX_UPDATES_NATIVE_DEBUG') == "1") { 10 | react { 11 | expoDebuggableVariants = [] 12 | } 13 | } 14 | 15 | 16 | /** 17 | * This is the configuration block to customize your React Native Android app. 18 | * By default you don't need to apply any configuration, just uncomment the lines you need. 19 | */ 20 | react { 21 | entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) 22 | reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() 23 | hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" 24 | debuggableVariants = expoDebuggableVariants 25 | 26 | /* Folders */ 27 | // The root of your project, i.e. where "package.json" lives. Default is '..' 28 | // root = file("../") 29 | // The folder where the react-native NPM package is. Default is ../node_modules/react-native 30 | // reactNativeDir = file("../node_modules/react-native") 31 | // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen 32 | // codegenDir = file("../node_modules/react-native-codegen") 33 | // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js 34 | // cliFile = file("../node_modules/react-native/cli.js") 35 | 36 | /* Variants */ 37 | // The list of variants to that are debuggable. For those we're going to 38 | // skip the bundling of the JS bundle and the assets. By default is just 'debug'. 39 | // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. 40 | // debuggableVariants = ["liteDebug", "prodDebug"] 41 | 42 | /* Bundling */ 43 | // A list containing the node command and its flags. Default is just 'node'. 44 | // nodeExecutableAndArgs = ["node"] 45 | // 46 | // The command to run when bundling. By default is 'bundle' 47 | // bundleCommand = "ram-bundle" 48 | // 49 | // The path to the CLI configuration file. Default is empty. 50 | // bundleConfig = file(../rn-cli.config.js) 51 | // 52 | // The name of the generated asset file containing your JS bundle 53 | // bundleAssetName = "MyApplication.android.bundle" 54 | // 55 | // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' 56 | // entryFile = file("../js/MyApplication.android.js") 57 | // 58 | // A list of extra flags to pass to the 'bundle' commands. 59 | // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle 60 | // extraPackagerArgs = [] 61 | 62 | /* Hermes Commands */ 63 | // The hermes compiler command to run. By default it is 'hermesc' 64 | // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" 65 | // 66 | // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" 67 | // hermesFlags = ["-O", "-output-source-map"] 68 | } 69 | 70 | // Override `hermesEnabled` by `expo.jsEngine` 71 | ext { 72 | hermesEnabled = (findProperty('expo.jsEngine') ?: "hermes") == "hermes" 73 | } 74 | 75 | /** 76 | * Set this to true to create four separate APKs instead of one, 77 | * one for each native architecture. This is useful if you don't 78 | * use App Bundles (https://developer.android.com/guide/app-bundle/) 79 | * and want to have separate APKs to upload to the Play Store. 80 | */ 81 | def enableSeparateBuildPerCPUArchitecture = false 82 | 83 | /** 84 | * Set this to true to Run Proguard on Release builds to minify the Java bytecode. 85 | */ 86 | def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() 87 | 88 | /** 89 | * The preferred build flavor of JavaScriptCore (JSC) 90 | * 91 | * For example, to use the international variant, you can use: 92 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 93 | * 94 | * The international variant includes ICU i18n library and necessary data 95 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 96 | * give correct results when using with locales other than en-US. Note that 97 | * this variant is about 6MiB larger per architecture than default. 98 | */ 99 | def jscFlavor = 'org.webkit:android-jsc:+' 100 | 101 | /** 102 | * Private function to get the list of Native Architectures you want to build. 103 | * This reads the value from reactNativeArchitectures in your gradle.properties 104 | * file and works together with the --active-arch-only flag of react-native run-android. 105 | */ 106 | def reactNativeArchitectures() { 107 | def value = project.getProperties().get("reactNativeArchitectures") 108 | return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] 109 | } 110 | 111 | android { 112 | ndkVersion rootProject.ext.ndkVersion 113 | 114 | compileSdkVersion rootProject.ext.compileSdkVersion 115 | 116 | namespace 'com.minihacks.geese' 117 | defaultConfig { 118 | applicationId 'com.minihacks.geese' 119 | minSdkVersion rootProject.ext.minSdkVersion 120 | targetSdkVersion rootProject.ext.targetSdkVersion 121 | versionCode 1 122 | versionName "1.0.0" 123 | } 124 | 125 | splits { 126 | abi { 127 | reset() 128 | enable enableSeparateBuildPerCPUArchitecture 129 | universalApk false // If true, also generate a universal APK 130 | include (*reactNativeArchitectures()) 131 | } 132 | } 133 | signingConfigs { 134 | debug { 135 | storeFile file('debug.keystore') 136 | storePassword 'android' 137 | keyAlias 'androiddebugkey' 138 | keyPassword 'android' 139 | } 140 | } 141 | buildTypes { 142 | debug { 143 | signingConfig signingConfigs.debug 144 | } 145 | release { 146 | // Caution! In production, you need to generate your own keystore file. 147 | // see https://reactnative.dev/docs/signed-apk-android. 148 | signingConfig signingConfigs.debug 149 | shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) 150 | minifyEnabled enableProguardInReleaseBuilds 151 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 152 | } 153 | } 154 | 155 | // applicationVariants are e.g. debug, release 156 | applicationVariants.all { variant -> 157 | variant.outputs.each { output -> 158 | // For each separate APK per architecture, set a unique version code as described here: 159 | // https://developer.android.com/studio/build/configure-apk-splits.html 160 | // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. 161 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] 162 | def abi = output.getFilter(OutputFile.ABI) 163 | if (abi != null) { // null for the universal-debug, universal-release variants 164 | output.versionCodeOverride = 165 | defaultConfig.versionCode * 1000 + versionCodes.get(abi) 166 | } 167 | 168 | } 169 | } 170 | } 171 | 172 | // Apply static values from `gradle.properties` to the `android.packagingOptions` 173 | // Accepts values in comma delimited lists, example: 174 | // android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini 175 | ["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> 176 | // Split option: 'foo,bar' -> ['foo', 'bar'] 177 | def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); 178 | // Trim all elements in place. 179 | for (i in 0.. 0) { 184 | println "android.packagingOptions.$prop += $options ($options.length)" 185 | // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' 186 | options.each { 187 | android.packagingOptions[prop] += it 188 | } 189 | } 190 | } 191 | 192 | dependencies { 193 | // The version of react-native is set by the React Native Gradle Plugin 194 | implementation("com.facebook.react:react-android") 195 | 196 | def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; 197 | def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; 198 | def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; 199 | def frescoVersion = rootProject.ext.frescoVersion 200 | 201 | // If your app supports Android versions before Ice Cream Sandwich (API level 14) 202 | if (isGifEnabled || isWebpEnabled) { 203 | implementation("com.facebook.fresco:fresco:${frescoVersion}") 204 | implementation("com.facebook.fresco:imagepipeline-okhttp3:${frescoVersion}") 205 | } 206 | 207 | if (isGifEnabled) { 208 | // For animated gif support 209 | implementation("com.facebook.fresco:animated-gif:${frescoVersion}") 210 | } 211 | 212 | if (isWebpEnabled) { 213 | // For webp support 214 | implementation("com.facebook.fresco:webpsupport:${frescoVersion}") 215 | if (isWebpAnimatedEnabled) { 216 | // Animated webp support 217 | implementation("com.facebook.fresco:animated-webp:${frescoVersion}") 218 | } 219 | } 220 | 221 | implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") 222 | 223 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") 224 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { 225 | exclude group:'com.squareup.okhttp3', module:'okhttp' 226 | } 227 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") 228 | 229 | if (hermesEnabled.toBoolean()) { 230 | implementation("com.facebook.react:hermes-android") 231 | } else { 232 | implementation jscFlavor 233 | } 234 | } 235 | 236 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 237 | applyNativeModulesAppBuildGradle(project) 238 | -------------------------------------------------------------------------------- /packages/mobile/android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/debug.keystore -------------------------------------------------------------------------------- /packages/mobile/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # react-native-reanimated 11 | -keep class com.swmansion.reanimated.** { *; } 12 | -keep class com.facebook.react.turbomodule.** { *; } 13 | 14 | # Add any project specific keep options here: 15 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/debug/java/com/minihacks/geese/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.minihacks.geese; 8 | 9 | import android.content.Context; 10 | import com.facebook.flipper.android.AndroidFlipperClient; 11 | import com.facebook.flipper.android.utils.FlipperUtils; 12 | import com.facebook.flipper.core.FlipperClient; 13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; 14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; 15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; 16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping; 17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; 19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; 20 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; 21 | import com.facebook.react.ReactInstanceEventListener; 22 | import com.facebook.react.ReactInstanceManager; 23 | import com.facebook.react.bridge.ReactContext; 24 | import com.facebook.react.modules.network.NetworkingModule; 25 | import okhttp3.OkHttpClient; 26 | 27 | /** 28 | * Class responsible of loading Flipper inside your React Native application. This is the debug 29 | * flavor of it. Here you can add your own plugins and customize the Flipper setup. 30 | */ 31 | public class ReactNativeFlipper { 32 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 33 | if (FlipperUtils.shouldEnableFlipper(context)) { 34 | final FlipperClient client = AndroidFlipperClient.getInstance(context); 35 | 36 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); 37 | client.addPlugin(new DatabasesFlipperPlugin(context)); 38 | client.addPlugin(new SharedPreferencesFlipperPlugin(context)); 39 | client.addPlugin(CrashReporterPlugin.getInstance()); 40 | 41 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); 42 | NetworkingModule.setCustomClientBuilder( 43 | new NetworkingModule.CustomClientBuilder() { 44 | @Override 45 | public void apply(OkHttpClient.Builder builder) { 46 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); 47 | } 48 | }); 49 | client.addPlugin(networkFlipperPlugin); 50 | client.start(); 51 | 52 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized 53 | // Hence we run if after all native modules have been initialized 54 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); 55 | if (reactContext == null) { 56 | reactInstanceManager.addReactInstanceEventListener( 57 | new ReactInstanceEventListener() { 58 | @Override 59 | public void onReactContextInitialized(ReactContext reactContext) { 60 | reactInstanceManager.removeReactInstanceEventListener(this); 61 | reactContext.runOnNativeModulesQueueThread( 62 | new Runnable() { 63 | @Override 64 | public void run() { 65 | client.addPlugin(new FrescoFlipperPlugin()); 66 | } 67 | }); 68 | } 69 | }); 70 | } else { 71 | client.addPlugin(new FrescoFlipperPlugin()); 72 | } 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/java/com/minihacks/geese/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.minihacks.geese; 2 | 3 | import android.os.Build; 4 | import android.os.Bundle; 5 | 6 | import com.facebook.react.ReactActivity; 7 | import com.facebook.react.ReactActivityDelegate; 8 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; 9 | import com.facebook.react.defaults.DefaultReactActivityDelegate; 10 | 11 | import expo.modules.ReactActivityDelegateWrapper; 12 | 13 | public class MainActivity extends ReactActivity { 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | // Set the theme to AppTheme BEFORE onCreate to support 17 | // coloring the background, status bar, and navigation bar. 18 | // This is required for expo-splash-screen. 19 | setTheme(R.style.AppTheme); 20 | super.onCreate(null); 21 | } 22 | 23 | /** 24 | * Returns the name of the main component registered from JavaScript. 25 | * This is used to schedule rendering of the component. 26 | */ 27 | @Override 28 | protected String getMainComponentName() { 29 | return "main"; 30 | } 31 | 32 | /** 33 | * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link 34 | * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React 35 | * (aka React 18) with two boolean flags. 36 | */ 37 | @Override 38 | protected ReactActivityDelegate createReactActivityDelegate() { 39 | return new ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, new DefaultReactActivityDelegate( 40 | this, 41 | getMainComponentName(), 42 | // If you opted-in for the New Architecture, we enable the Fabric Renderer. 43 | DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled 44 | // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). 45 | DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled 46 | )); 47 | } 48 | 49 | /** 50 | * Align the back button behavior with Android S 51 | * where moving root activities to background instead of finishing activities. 52 | * @see onBackPressed 53 | */ 54 | @Override 55 | public void invokeDefaultOnBackPressed() { 56 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { 57 | if (!moveTaskToBack(false)) { 58 | // For non-root activities, use the default implementation to finish them. 59 | super.invokeDefaultOnBackPressed(); 60 | } 61 | return; 62 | } 63 | 64 | // Use the default back button implementation on Android S 65 | // because it's doing more than {@link Activity#moveTaskToBack} in fact. 66 | super.invokeDefaultOnBackPressed(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/java/com/minihacks/geese/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.minihacks.geese; 2 | 3 | import android.app.Application; 4 | import android.content.res.Configuration; 5 | import androidx.annotation.NonNull; 6 | 7 | import com.facebook.react.PackageList; 8 | import com.facebook.react.ReactApplication; 9 | import com.facebook.react.ReactNativeHost; 10 | import com.facebook.react.ReactPackage; 11 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; 12 | import com.facebook.react.defaults.DefaultReactNativeHost; 13 | import com.facebook.soloader.SoLoader; 14 | 15 | import expo.modules.ApplicationLifecycleDispatcher; 16 | import expo.modules.ReactNativeHostWrapper; 17 | 18 | import java.util.List; 19 | 20 | public class MainApplication extends Application implements ReactApplication { 21 | 22 | private final ReactNativeHost mReactNativeHost = 23 | new ReactNativeHostWrapper(this, new DefaultReactNativeHost(this) { 24 | @Override 25 | public boolean getUseDeveloperSupport() { 26 | return BuildConfig.DEBUG; 27 | } 28 | 29 | @Override 30 | protected List getPackages() { 31 | @SuppressWarnings("UnnecessaryLocalVariable") 32 | List packages = new PackageList(this).getPackages(); 33 | // Packages that cannot be autolinked yet can be added manually here, for example: 34 | // packages.add(new MyReactNativePackage()); 35 | return packages; 36 | } 37 | 38 | @Override 39 | protected String getJSMainModuleName() { 40 | return "index"; 41 | } 42 | 43 | @Override 44 | protected boolean isNewArchEnabled() { 45 | return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; 46 | } 47 | 48 | @Override 49 | protected Boolean isHermesEnabled() { 50 | return BuildConfig.IS_HERMES_ENABLED; 51 | } 52 | }); 53 | 54 | @Override 55 | public ReactNativeHost getReactNativeHost() { 56 | return mReactNativeHost; 57 | } 58 | 59 | @Override 60 | public void onCreate() { 61 | super.onCreate(); 62 | SoLoader.init(this, /* native exopackage */ false); 63 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { 64 | // If you opted-in for the New Architecture, we load the native entry point for this app. 65 | DefaultNewArchitectureEntryPoint.load(); 66 | } 67 | ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 68 | ApplicationLifecycleDispatcher.onApplicationCreate(this); 69 | } 70 | 71 | @Override 72 | public void onConfigurationChanged(@NonNull Configuration newConfig) { 73 | super.onConfigurationChanged(newConfig); 74 | ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/drawable/rn_edit_text_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 21 | 22 | 23 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/drawable/splashscreen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #023c69 3 | #ffffff 4 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | mobile 3 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 14 | 17 | -------------------------------------------------------------------------------- /packages/mobile/android/app/src/release/java/com/minihacks/geese/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Meta Platforms, Inc. and affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.minihacks.geese; 8 | 9 | import android.content.Context; 10 | import com.facebook.react.ReactInstanceManager; 11 | 12 | /** 13 | * Class responsible of loading Flipper inside your React Native application. This is the release 14 | * flavor of it so it's empty as we don't want to load Flipper. 15 | */ 16 | public class ReactNativeFlipper { 17 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 18 | // Do nothing as we don't want to initialize Flipper on Release. 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/mobile/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = findProperty('android.buildToolsVersion') ?: '33.0.0' 6 | minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21') 7 | compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '33') 8 | targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '33') 9 | if (findProperty('android.kotlinVersion')) { 10 | kotlinVersion = findProperty('android.kotlinVersion') 11 | } 12 | frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0' 13 | 14 | // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. 15 | ndkVersion = "23.1.7779620" 16 | } 17 | repositories { 18 | google() 19 | mavenCentral() 20 | } 21 | dependencies { 22 | classpath('com.android.tools.build:gradle:7.4.1') 23 | classpath('com.facebook.react:react-native-gradle-plugin') 24 | } 25 | } 26 | 27 | allprojects { 28 | repositories { 29 | maven { 30 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 31 | url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) 32 | } 33 | maven { 34 | // Android JSC is installed from npm 35 | url(new File(['node', '--print', "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), '../dist')) 36 | } 37 | 38 | google() 39 | mavenCentral() 40 | maven { url 'https://www.jitpack.io' } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /packages/mobile/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m 13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | # AndroidX package structure to make it clearer which packages are bundled with the 21 | # Android operating system, and which are packaged with your app's APK 22 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 23 | android.useAndroidX=true 24 | 25 | # Automatically convert third-party libraries to use AndroidX 26 | android.enableJetifier=true 27 | 28 | # Version of flipper SDK to use with React Native 29 | FLIPPER_VERSION=0.125.0 30 | 31 | # Use this property to specify which architecture you want to build. 32 | # You can also override it from the CLI using 33 | # ./gradlew -PreactNativeArchitectures=x86_64 34 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 35 | 36 | # Use this property to enable support to the new architecture. 37 | # This will allow you to use TurboModules and the Fabric render in 38 | # your application. You should enable this flag either if you want 39 | # to write custom TurboModules/Fabric components OR use libraries that 40 | # are providing them. 41 | newArchEnabled=false 42 | 43 | # The hosted JavaScript engine 44 | # Supported values: expo.jsEngine = "hermes" | "jsc" 45 | expo.jsEngine=hermes 46 | 47 | # Enable GIF support in React Native images (~200 B increase) 48 | expo.gif.enabled=true 49 | # Enable webp support in React Native images (~85 KB increase) 50 | expo.webp.enabled=true 51 | # Enable animated webp support (~3.4 MB increase) 52 | # Disabled by default because iOS doesn't support animated webp 53 | expo.webp.animated=false 54 | -------------------------------------------------------------------------------- /packages/mobile/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /packages/mobile/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /packages/mobile/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 84 | 85 | APP_NAME="Gradle" 86 | APP_BASE_NAME=${0##*/} 87 | 88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 90 | 91 | # Use the maximum available, or set MAX_FD != -1 to use that value. 92 | MAX_FD=maximum 93 | 94 | warn () { 95 | echo "$*" 96 | } >&2 97 | 98 | die () { 99 | echo 100 | echo "$*" 101 | echo 102 | exit 1 103 | } >&2 104 | 105 | # OS specific support (must be 'true' or 'false'). 106 | cygwin=false 107 | msys=false 108 | darwin=false 109 | nonstop=false 110 | case "$( uname )" in #( 111 | CYGWIN* ) cygwin=true ;; #( 112 | Darwin* ) darwin=true ;; #( 113 | MSYS* | MINGW* ) msys=true ;; #( 114 | NONSTOP* ) nonstop=true ;; 115 | esac 116 | 117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 118 | 119 | 120 | # Determine the Java command to use to start the JVM. 121 | if [ -n "$JAVA_HOME" ] ; then 122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 123 | # IBM's JDK on AIX uses strange locations for the executables 124 | JAVACMD=$JAVA_HOME/jre/sh/java 125 | else 126 | JAVACMD=$JAVA_HOME/bin/java 127 | fi 128 | if [ ! -x "$JAVACMD" ] ; then 129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 130 | 131 | Please set the JAVA_HOME variable in your environment to match the 132 | location of your Java installation." 133 | fi 134 | else 135 | JAVACMD=java 136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | 142 | # Increase the maximum file descriptors if we can. 143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144 | case $MAX_FD in #( 145 | max*) 146 | MAX_FD=$( ulimit -H -n ) || 147 | warn "Could not query maximum file descriptor limit" 148 | esac 149 | case $MAX_FD in #( 150 | '' | soft) :;; #( 151 | *) 152 | ulimit -n "$MAX_FD" || 153 | warn "Could not set maximum file descriptor limit to $MAX_FD" 154 | esac 155 | fi 156 | 157 | # Collect all arguments for the java command, stacking in reverse order: 158 | # * args from the command line 159 | # * the main class name 160 | # * -classpath 161 | # * -D...appname settings 162 | # * --module-path (only if needed) 163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 164 | 165 | # For Cygwin or MSYS, switch paths to Windows format before running java 166 | if "$cygwin" || "$msys" ; then 167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 169 | 170 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 171 | 172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 173 | for arg do 174 | if 175 | case $arg in #( 176 | -*) false ;; # don't mess with options #( 177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 178 | [ -e "$t" ] ;; #( 179 | *) false ;; 180 | esac 181 | then 182 | arg=$( cygpath --path --ignore --mixed "$arg" ) 183 | fi 184 | # Roll the args list around exactly as many times as the number of 185 | # args, so each arg winds up back in the position where it started, but 186 | # possibly modified. 187 | # 188 | # NB: a `for` loop captures its iteration list before it begins, so 189 | # changing the positional parameters here affects neither the number of 190 | # iterations, nor the values presented in `arg`. 191 | shift # remove old arg 192 | set -- "$@" "$arg" # push replacement arg 193 | done 194 | fi 195 | 196 | # Collect all arguments for the java command; 197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 198 | # shell script including quotes and variable substitutions, so put them in 199 | # double quotes to make sure that they get re-expanded; and 200 | # * put everything else in single quotes, so that it's not re-expanded. 201 | 202 | set -- \ 203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 204 | -classpath "$CLASSPATH" \ 205 | org.gradle.wrapper.GradleWrapperMain \ 206 | "$@" 207 | 208 | # Stop when "xargs" is not available. 209 | if ! command -v xargs >/dev/null 2>&1 210 | then 211 | die "xargs is not available" 212 | fi 213 | 214 | # Use "xargs" to parse quoted args. 215 | # 216 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 217 | # 218 | # In Bash we could simply go: 219 | # 220 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 221 | # set -- "${ARGS[@]}" "$@" 222 | # 223 | # but POSIX shell has neither arrays nor command substitution, so instead we 224 | # post-process each arg (as a line of input to sed) to backslash-escape any 225 | # character that might be a shell metacharacter, then use eval to reverse 226 | # that process (while maintaining the separation between arguments), and wrap 227 | # the whole thing up as a single "set" statement. 228 | # 229 | # This will of course break if any of these variables contains a newline or 230 | # an unmatched quote. 231 | # 232 | 233 | eval "set -- $( 234 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 235 | xargs -n1 | 236 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 237 | tr '\n' ' ' 238 | )" '"$@"' 239 | 240 | exec "$JAVACMD" "$@" 241 | -------------------------------------------------------------------------------- /packages/mobile/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if %ERRORLEVEL% equ 0 goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if %ERRORLEVEL% equ 0 goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | set EXIT_CODE=%ERRORLEVEL% 84 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 85 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 86 | exit /b %EXIT_CODE% 87 | 88 | :mainEnd 89 | if "%OS%"=="Windows_NT" endlocal 90 | 91 | :omega 92 | -------------------------------------------------------------------------------- /packages/mobile/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'mobile' 2 | 3 | apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); 4 | useExpoModules() 5 | 6 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 7 | applyNativeModulesSettingsGradle(settings) 8 | 9 | include ':app' 10 | includeBuild(new File(["node", "--print", "require.resolve('react-native-gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile()) 11 | -------------------------------------------------------------------------------- /packages/mobile/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "mobile", 4 | "slug": "mobile", 5 | "version": "1.0.0", 6 | "assetBundlePatterns": [ 7 | "**/*" 8 | ], 9 | "android": { 10 | "package": "com.minihacks.geese" 11 | }, 12 | "ios": { 13 | "bundleIdentifier": "com.minihacks.geese" 14 | } 15 | }, 16 | "name": "mobile" 17 | } 18 | -------------------------------------------------------------------------------- /packages/mobile/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'] 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /packages/mobile/index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from 'expo'; 2 | 3 | import App from './App'; 4 | 5 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App); 6 | // It also ensures that whether you load the app in Expo Go or in a native build, 7 | // the environment is set up appropriately 8 | registerRootComponent(App); 9 | -------------------------------------------------------------------------------- /packages/mobile/ios/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | .xcode.env.local 25 | 26 | # Bundle artifacts 27 | *.jsbundle 28 | 29 | # CocoaPods 30 | /Pods/ 31 | -------------------------------------------------------------------------------- /packages/mobile/ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | 6 | # NODE_BINARY variable contains the PATH to the node executable. 7 | # 8 | # Customize the NODE_BINARY variable here. 9 | # For example, to use nvm with brew, add the following line 10 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 11 | export NODE_BINARY=$(command -v node) 12 | -------------------------------------------------------------------------------- /packages/mobile/ios/Podfile: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") 2 | require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") 3 | require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") 4 | 5 | require 'json' 6 | podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} 7 | 8 | ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' 9 | ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = '1' if podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] == 'true' 10 | 11 | platform :ios, podfile_properties['ios.deploymentTarget'] || '13.0' 12 | install! 'cocoapods', 13 | :deterministic_uuids => false 14 | 15 | prepare_react_native_project! 16 | 17 | # If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. 18 | # because `react-native-flipper` depends on (FlipperKit,...), which will be excluded. To fix this, 19 | # you can also exclude `react-native-flipper` in `react-native.config.js` 20 | # 21 | # ```js 22 | # module.exports = { 23 | # dependencies: { 24 | # ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), 25 | # } 26 | # } 27 | # ``` 28 | flipper_config = FlipperConfiguration.disabled 29 | if ENV['NO_FLIPPER'] == '1' then 30 | # Explicitly disabled through environment variables 31 | flipper_config = FlipperConfiguration.disabled 32 | elsif podfile_properties.key?('ios.flipper') then 33 | # Configure Flipper in Podfile.properties.json 34 | if podfile_properties['ios.flipper'] == 'true' then 35 | flipper_config = FlipperConfiguration.enabled(["Debug", "Release"]) 36 | elsif podfile_properties['ios.flipper'] != 'false' then 37 | flipper_config = FlipperConfiguration.enabled(["Debug", "Release"], { 'Flipper' => podfile_properties['ios.flipper'] }) 38 | end 39 | end 40 | 41 | target 'mobile' do 42 | use_expo_modules! 43 | config = use_native_modules! 44 | 45 | use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] 46 | use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] 47 | 48 | # Flags change depending on the env values. 49 | flags = get_default_flags() 50 | 51 | use_react_native!( 52 | :path => config[:reactNativePath], 53 | :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', 54 | :fabric_enabled => flags[:fabric_enabled], 55 | # An absolute path to your application root. 56 | :app_path => "#{Pod::Config.instance.installation_root}/..", 57 | # Note that if you have use_frameworks! enabled, Flipper will not work if enabled 58 | :flipper_configuration => flipper_config 59 | ) 60 | 61 | post_install do |installer| 62 | react_native_post_install( 63 | installer, 64 | config[:reactNativePath], 65 | # Set `mac_catalyst_enabled` to `true` in order to apply patches 66 | # necessary for Mac Catalyst builds 67 | :mac_catalyst_enabled => false 68 | ) 69 | __apply_Xcode_12_5_M1_post_install_workaround(installer) 70 | 71 | # This is necessary for Xcode 14, because it signs resource bundles by default 72 | # when building for devices. 73 | installer.target_installation_results.pod_target_installation_results 74 | .each do |pod_name, target_installation_result| 75 | target_installation_result.resource_bundle_targets.each do |resource_bundle_target| 76 | resource_bundle_target.build_configurations.each do |config| 77 | config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' 78 | end 79 | end 80 | end 81 | end 82 | 83 | post_integrate do |installer| 84 | begin 85 | expo_patch_react_imports!(installer) 86 | rescue => e 87 | Pod::UI.warn e 88 | end 89 | end 90 | end 91 | -------------------------------------------------------------------------------- /packages/mobile/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - boost (1.76.0) 3 | - DoubleConversion (1.1.6) 4 | - EXApplication (5.1.1): 5 | - ExpoModulesCore 6 | - EXConstants (14.2.1): 7 | - ExpoModulesCore 8 | - EXFileSystem (15.2.2): 9 | - ExpoModulesCore 10 | - EXFont (11.1.1): 11 | - ExpoModulesCore 12 | - Expo (48.0.11): 13 | - ExpoModulesCore 14 | - ExpoKeepAwake (12.0.1): 15 | - ExpoModulesCore 16 | - ExpoModulesCore (1.2.6): 17 | - React-Core 18 | - React-RCTAppDelegate 19 | - ReactCommon/turbomodule/core 20 | - EXSplashScreen (0.18.1): 21 | - ExpoModulesCore 22 | - React-Core 23 | - FBLazyVector (0.71.6) 24 | - FBReactNativeSpec (0.71.6): 25 | - RCT-Folly (= 2021.07.22.00) 26 | - RCTRequired (= 0.71.6) 27 | - RCTTypeSafety (= 0.71.6) 28 | - React-Core (= 0.71.6) 29 | - React-jsi (= 0.71.6) 30 | - ReactCommon/turbomodule/core (= 0.71.6) 31 | - fmt (6.2.1) 32 | - glog (0.3.5) 33 | - hermes-engine (0.71.6): 34 | - hermes-engine/Pre-built (= 0.71.6) 35 | - hermes-engine/Pre-built (0.71.6) 36 | - libevent (2.1.12) 37 | - RCT-Folly (2021.07.22.00): 38 | - boost 39 | - DoubleConversion 40 | - fmt (~> 6.2.1) 41 | - glog 42 | - RCT-Folly/Default (= 2021.07.22.00) 43 | - RCT-Folly/Default (2021.07.22.00): 44 | - boost 45 | - DoubleConversion 46 | - fmt (~> 6.2.1) 47 | - glog 48 | - RCT-Folly/Futures (2021.07.22.00): 49 | - boost 50 | - DoubleConversion 51 | - fmt (~> 6.2.1) 52 | - glog 53 | - libevent 54 | - RCTRequired (0.71.6) 55 | - RCTTypeSafety (0.71.6): 56 | - FBLazyVector (= 0.71.6) 57 | - RCTRequired (= 0.71.6) 58 | - React-Core (= 0.71.6) 59 | - React (0.71.6): 60 | - React-Core (= 0.71.6) 61 | - React-Core/DevSupport (= 0.71.6) 62 | - React-Core/RCTWebSocket (= 0.71.6) 63 | - React-RCTActionSheet (= 0.71.6) 64 | - React-RCTAnimation (= 0.71.6) 65 | - React-RCTBlob (= 0.71.6) 66 | - React-RCTImage (= 0.71.6) 67 | - React-RCTLinking (= 0.71.6) 68 | - React-RCTNetwork (= 0.71.6) 69 | - React-RCTSettings (= 0.71.6) 70 | - React-RCTText (= 0.71.6) 71 | - React-RCTVibration (= 0.71.6) 72 | - React-callinvoker (0.71.6) 73 | - React-Codegen (0.71.6): 74 | - FBReactNativeSpec 75 | - hermes-engine 76 | - RCT-Folly 77 | - RCTRequired 78 | - RCTTypeSafety 79 | - React-Core 80 | - React-jsi 81 | - React-jsiexecutor 82 | - ReactCommon/turbomodule/bridging 83 | - ReactCommon/turbomodule/core 84 | - React-Core (0.71.6): 85 | - glog 86 | - hermes-engine 87 | - RCT-Folly (= 2021.07.22.00) 88 | - React-Core/Default (= 0.71.6) 89 | - React-cxxreact (= 0.71.6) 90 | - React-hermes 91 | - React-jsi (= 0.71.6) 92 | - React-jsiexecutor (= 0.71.6) 93 | - React-perflogger (= 0.71.6) 94 | - Yoga 95 | - React-Core/CoreModulesHeaders (0.71.6): 96 | - glog 97 | - hermes-engine 98 | - RCT-Folly (= 2021.07.22.00) 99 | - React-Core/Default 100 | - React-cxxreact (= 0.71.6) 101 | - React-hermes 102 | - React-jsi (= 0.71.6) 103 | - React-jsiexecutor (= 0.71.6) 104 | - React-perflogger (= 0.71.6) 105 | - Yoga 106 | - React-Core/Default (0.71.6): 107 | - glog 108 | - hermes-engine 109 | - RCT-Folly (= 2021.07.22.00) 110 | - React-cxxreact (= 0.71.6) 111 | - React-hermes 112 | - React-jsi (= 0.71.6) 113 | - React-jsiexecutor (= 0.71.6) 114 | - React-perflogger (= 0.71.6) 115 | - Yoga 116 | - React-Core/DevSupport (0.71.6): 117 | - glog 118 | - hermes-engine 119 | - RCT-Folly (= 2021.07.22.00) 120 | - React-Core/Default (= 0.71.6) 121 | - React-Core/RCTWebSocket (= 0.71.6) 122 | - React-cxxreact (= 0.71.6) 123 | - React-hermes 124 | - React-jsi (= 0.71.6) 125 | - React-jsiexecutor (= 0.71.6) 126 | - React-jsinspector (= 0.71.6) 127 | - React-perflogger (= 0.71.6) 128 | - Yoga 129 | - React-Core/RCTActionSheetHeaders (0.71.6): 130 | - glog 131 | - hermes-engine 132 | - RCT-Folly (= 2021.07.22.00) 133 | - React-Core/Default 134 | - React-cxxreact (= 0.71.6) 135 | - React-hermes 136 | - React-jsi (= 0.71.6) 137 | - React-jsiexecutor (= 0.71.6) 138 | - React-perflogger (= 0.71.6) 139 | - Yoga 140 | - React-Core/RCTAnimationHeaders (0.71.6): 141 | - glog 142 | - hermes-engine 143 | - RCT-Folly (= 2021.07.22.00) 144 | - React-Core/Default 145 | - React-cxxreact (= 0.71.6) 146 | - React-hermes 147 | - React-jsi (= 0.71.6) 148 | - React-jsiexecutor (= 0.71.6) 149 | - React-perflogger (= 0.71.6) 150 | - Yoga 151 | - React-Core/RCTBlobHeaders (0.71.6): 152 | - glog 153 | - hermes-engine 154 | - RCT-Folly (= 2021.07.22.00) 155 | - React-Core/Default 156 | - React-cxxreact (= 0.71.6) 157 | - React-hermes 158 | - React-jsi (= 0.71.6) 159 | - React-jsiexecutor (= 0.71.6) 160 | - React-perflogger (= 0.71.6) 161 | - Yoga 162 | - React-Core/RCTImageHeaders (0.71.6): 163 | - glog 164 | - hermes-engine 165 | - RCT-Folly (= 2021.07.22.00) 166 | - React-Core/Default 167 | - React-cxxreact (= 0.71.6) 168 | - React-hermes 169 | - React-jsi (= 0.71.6) 170 | - React-jsiexecutor (= 0.71.6) 171 | - React-perflogger (= 0.71.6) 172 | - Yoga 173 | - React-Core/RCTLinkingHeaders (0.71.6): 174 | - glog 175 | - hermes-engine 176 | - RCT-Folly (= 2021.07.22.00) 177 | - React-Core/Default 178 | - React-cxxreact (= 0.71.6) 179 | - React-hermes 180 | - React-jsi (= 0.71.6) 181 | - React-jsiexecutor (= 0.71.6) 182 | - React-perflogger (= 0.71.6) 183 | - Yoga 184 | - React-Core/RCTNetworkHeaders (0.71.6): 185 | - glog 186 | - hermes-engine 187 | - RCT-Folly (= 2021.07.22.00) 188 | - React-Core/Default 189 | - React-cxxreact (= 0.71.6) 190 | - React-hermes 191 | - React-jsi (= 0.71.6) 192 | - React-jsiexecutor (= 0.71.6) 193 | - React-perflogger (= 0.71.6) 194 | - Yoga 195 | - React-Core/RCTSettingsHeaders (0.71.6): 196 | - glog 197 | - hermes-engine 198 | - RCT-Folly (= 2021.07.22.00) 199 | - React-Core/Default 200 | - React-cxxreact (= 0.71.6) 201 | - React-hermes 202 | - React-jsi (= 0.71.6) 203 | - React-jsiexecutor (= 0.71.6) 204 | - React-perflogger (= 0.71.6) 205 | - Yoga 206 | - React-Core/RCTTextHeaders (0.71.6): 207 | - glog 208 | - hermes-engine 209 | - RCT-Folly (= 2021.07.22.00) 210 | - React-Core/Default 211 | - React-cxxreact (= 0.71.6) 212 | - React-hermes 213 | - React-jsi (= 0.71.6) 214 | - React-jsiexecutor (= 0.71.6) 215 | - React-perflogger (= 0.71.6) 216 | - Yoga 217 | - React-Core/RCTVibrationHeaders (0.71.6): 218 | - glog 219 | - hermes-engine 220 | - RCT-Folly (= 2021.07.22.00) 221 | - React-Core/Default 222 | - React-cxxreact (= 0.71.6) 223 | - React-hermes 224 | - React-jsi (= 0.71.6) 225 | - React-jsiexecutor (= 0.71.6) 226 | - React-perflogger (= 0.71.6) 227 | - Yoga 228 | - React-Core/RCTWebSocket (0.71.6): 229 | - glog 230 | - hermes-engine 231 | - RCT-Folly (= 2021.07.22.00) 232 | - React-Core/Default (= 0.71.6) 233 | - React-cxxreact (= 0.71.6) 234 | - React-hermes 235 | - React-jsi (= 0.71.6) 236 | - React-jsiexecutor (= 0.71.6) 237 | - React-perflogger (= 0.71.6) 238 | - Yoga 239 | - React-CoreModules (0.71.6): 240 | - RCT-Folly (= 2021.07.22.00) 241 | - RCTTypeSafety (= 0.71.6) 242 | - React-Codegen (= 0.71.6) 243 | - React-Core/CoreModulesHeaders (= 0.71.6) 244 | - React-jsi (= 0.71.6) 245 | - React-RCTBlob 246 | - React-RCTImage (= 0.71.6) 247 | - ReactCommon/turbomodule/core (= 0.71.6) 248 | - React-cxxreact (0.71.6): 249 | - boost (= 1.76.0) 250 | - DoubleConversion 251 | - glog 252 | - hermes-engine 253 | - RCT-Folly (= 2021.07.22.00) 254 | - React-callinvoker (= 0.71.6) 255 | - React-jsi (= 0.71.6) 256 | - React-jsinspector (= 0.71.6) 257 | - React-logger (= 0.71.6) 258 | - React-perflogger (= 0.71.6) 259 | - React-runtimeexecutor (= 0.71.6) 260 | - React-hermes (0.71.6): 261 | - DoubleConversion 262 | - glog 263 | - hermes-engine 264 | - RCT-Folly (= 2021.07.22.00) 265 | - RCT-Folly/Futures (= 2021.07.22.00) 266 | - React-cxxreact (= 0.71.6) 267 | - React-jsi 268 | - React-jsiexecutor (= 0.71.6) 269 | - React-jsinspector (= 0.71.6) 270 | - React-perflogger (= 0.71.6) 271 | - React-jsi (0.71.6): 272 | - boost (= 1.76.0) 273 | - DoubleConversion 274 | - glog 275 | - hermes-engine 276 | - RCT-Folly (= 2021.07.22.00) 277 | - React-jsiexecutor (0.71.6): 278 | - DoubleConversion 279 | - glog 280 | - hermes-engine 281 | - RCT-Folly (= 2021.07.22.00) 282 | - React-cxxreact (= 0.71.6) 283 | - React-jsi (= 0.71.6) 284 | - React-perflogger (= 0.71.6) 285 | - React-jsinspector (0.71.6) 286 | - React-logger (0.71.6): 287 | - glog 288 | - react-native-safe-area-context (4.5.1): 289 | - RCT-Folly 290 | - RCTRequired 291 | - RCTTypeSafety 292 | - React-Core 293 | - ReactCommon/turbomodule/core 294 | - React-perflogger (0.71.6) 295 | - React-RCTActionSheet (0.71.6): 296 | - React-Core/RCTActionSheetHeaders (= 0.71.6) 297 | - React-RCTAnimation (0.71.6): 298 | - RCT-Folly (= 2021.07.22.00) 299 | - RCTTypeSafety (= 0.71.6) 300 | - React-Codegen (= 0.71.6) 301 | - React-Core/RCTAnimationHeaders (= 0.71.6) 302 | - React-jsi (= 0.71.6) 303 | - ReactCommon/turbomodule/core (= 0.71.6) 304 | - React-RCTAppDelegate (0.71.6): 305 | - RCT-Folly 306 | - RCTRequired 307 | - RCTTypeSafety 308 | - React-Core 309 | - ReactCommon/turbomodule/core 310 | - React-RCTBlob (0.71.6): 311 | - hermes-engine 312 | - RCT-Folly (= 2021.07.22.00) 313 | - React-Codegen (= 0.71.6) 314 | - React-Core/RCTBlobHeaders (= 0.71.6) 315 | - React-Core/RCTWebSocket (= 0.71.6) 316 | - React-jsi (= 0.71.6) 317 | - React-RCTNetwork (= 0.71.6) 318 | - ReactCommon/turbomodule/core (= 0.71.6) 319 | - React-RCTImage (0.71.6): 320 | - RCT-Folly (= 2021.07.22.00) 321 | - RCTTypeSafety (= 0.71.6) 322 | - React-Codegen (= 0.71.6) 323 | - React-Core/RCTImageHeaders (= 0.71.6) 324 | - React-jsi (= 0.71.6) 325 | - React-RCTNetwork (= 0.71.6) 326 | - ReactCommon/turbomodule/core (= 0.71.6) 327 | - React-RCTLinking (0.71.6): 328 | - React-Codegen (= 0.71.6) 329 | - React-Core/RCTLinkingHeaders (= 0.71.6) 330 | - React-jsi (= 0.71.6) 331 | - ReactCommon/turbomodule/core (= 0.71.6) 332 | - React-RCTNetwork (0.71.6): 333 | - RCT-Folly (= 2021.07.22.00) 334 | - RCTTypeSafety (= 0.71.6) 335 | - React-Codegen (= 0.71.6) 336 | - React-Core/RCTNetworkHeaders (= 0.71.6) 337 | - React-jsi (= 0.71.6) 338 | - ReactCommon/turbomodule/core (= 0.71.6) 339 | - React-RCTSettings (0.71.6): 340 | - RCT-Folly (= 2021.07.22.00) 341 | - RCTTypeSafety (= 0.71.6) 342 | - React-Codegen (= 0.71.6) 343 | - React-Core/RCTSettingsHeaders (= 0.71.6) 344 | - React-jsi (= 0.71.6) 345 | - ReactCommon/turbomodule/core (= 0.71.6) 346 | - React-RCTText (0.71.6): 347 | - React-Core/RCTTextHeaders (= 0.71.6) 348 | - React-RCTVibration (0.71.6): 349 | - RCT-Folly (= 2021.07.22.00) 350 | - React-Codegen (= 0.71.6) 351 | - React-Core/RCTVibrationHeaders (= 0.71.6) 352 | - React-jsi (= 0.71.6) 353 | - ReactCommon/turbomodule/core (= 0.71.6) 354 | - React-runtimeexecutor (0.71.6): 355 | - React-jsi (= 0.71.6) 356 | - ReactCommon/turbomodule/bridging (0.71.6): 357 | - DoubleConversion 358 | - glog 359 | - hermes-engine 360 | - RCT-Folly (= 2021.07.22.00) 361 | - React-callinvoker (= 0.71.6) 362 | - React-Core (= 0.71.6) 363 | - React-cxxreact (= 0.71.6) 364 | - React-jsi (= 0.71.6) 365 | - React-logger (= 0.71.6) 366 | - React-perflogger (= 0.71.6) 367 | - ReactCommon/turbomodule/core (0.71.6): 368 | - DoubleConversion 369 | - glog 370 | - hermes-engine 371 | - RCT-Folly (= 2021.07.22.00) 372 | - React-callinvoker (= 0.71.6) 373 | - React-Core (= 0.71.6) 374 | - React-cxxreact (= 0.71.6) 375 | - React-jsi (= 0.71.6) 376 | - React-logger (= 0.71.6) 377 | - React-perflogger (= 0.71.6) 378 | - Yoga (1.14.0) 379 | 380 | DEPENDENCIES: 381 | - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) 382 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 383 | - EXApplication (from `../node_modules/expo-application/ios`) 384 | - EXConstants (from `../node_modules/expo-constants/ios`) 385 | - EXFileSystem (from `../node_modules/expo-file-system/ios`) 386 | - EXFont (from `../node_modules/expo-font/ios`) 387 | - Expo (from `../node_modules/expo`) 388 | - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) 389 | - ExpoModulesCore (from `../node_modules/expo-modules-core`) 390 | - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) 391 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 392 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) 393 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 394 | - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) 395 | - libevent (~> 2.1.12) 396 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 397 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) 398 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 399 | - React (from `../node_modules/react-native/`) 400 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 401 | - React-Codegen (from `build/generated/ios`) 402 | - React-Core (from `../node_modules/react-native/`) 403 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 404 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 405 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 406 | - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) 407 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 408 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 409 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) 410 | - React-logger (from `../node_modules/react-native/ReactCommon/logger`) 411 | - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) 412 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 413 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 414 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 415 | - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) 416 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 417 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 418 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 419 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 420 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 421 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 422 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 423 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 424 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 425 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 426 | 427 | SPEC REPOS: 428 | trunk: 429 | - fmt 430 | - libevent 431 | 432 | EXTERNAL SOURCES: 433 | boost: 434 | :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" 435 | DoubleConversion: 436 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 437 | EXApplication: 438 | :path: "../node_modules/expo-application/ios" 439 | EXConstants: 440 | :path: "../node_modules/expo-constants/ios" 441 | EXFileSystem: 442 | :path: "../node_modules/expo-file-system/ios" 443 | EXFont: 444 | :path: "../node_modules/expo-font/ios" 445 | Expo: 446 | :path: "../node_modules/expo" 447 | ExpoKeepAwake: 448 | :path: "../node_modules/expo-keep-awake/ios" 449 | ExpoModulesCore: 450 | :path: "../node_modules/expo-modules-core" 451 | EXSplashScreen: 452 | :path: "../node_modules/expo-splash-screen/ios" 453 | FBLazyVector: 454 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 455 | FBReactNativeSpec: 456 | :path: "../node_modules/react-native/React/FBReactNativeSpec" 457 | glog: 458 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 459 | hermes-engine: 460 | :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" 461 | RCT-Folly: 462 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 463 | RCTRequired: 464 | :path: "../node_modules/react-native/Libraries/RCTRequired" 465 | RCTTypeSafety: 466 | :path: "../node_modules/react-native/Libraries/TypeSafety" 467 | React: 468 | :path: "../node_modules/react-native/" 469 | React-callinvoker: 470 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 471 | React-Codegen: 472 | :path: build/generated/ios 473 | React-Core: 474 | :path: "../node_modules/react-native/" 475 | React-CoreModules: 476 | :path: "../node_modules/react-native/React/CoreModules" 477 | React-cxxreact: 478 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 479 | React-hermes: 480 | :path: "../node_modules/react-native/ReactCommon/hermes" 481 | React-jsi: 482 | :path: "../node_modules/react-native/ReactCommon/jsi" 483 | React-jsiexecutor: 484 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 485 | React-jsinspector: 486 | :path: "../node_modules/react-native/ReactCommon/jsinspector" 487 | React-logger: 488 | :path: "../node_modules/react-native/ReactCommon/logger" 489 | react-native-safe-area-context: 490 | :path: "../node_modules/react-native-safe-area-context" 491 | React-perflogger: 492 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 493 | React-RCTActionSheet: 494 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 495 | React-RCTAnimation: 496 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 497 | React-RCTAppDelegate: 498 | :path: "../node_modules/react-native/Libraries/AppDelegate" 499 | React-RCTBlob: 500 | :path: "../node_modules/react-native/Libraries/Blob" 501 | React-RCTImage: 502 | :path: "../node_modules/react-native/Libraries/Image" 503 | React-RCTLinking: 504 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 505 | React-RCTNetwork: 506 | :path: "../node_modules/react-native/Libraries/Network" 507 | React-RCTSettings: 508 | :path: "../node_modules/react-native/Libraries/Settings" 509 | React-RCTText: 510 | :path: "../node_modules/react-native/Libraries/Text" 511 | React-RCTVibration: 512 | :path: "../node_modules/react-native/Libraries/Vibration" 513 | React-runtimeexecutor: 514 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 515 | ReactCommon: 516 | :path: "../node_modules/react-native/ReactCommon" 517 | Yoga: 518 | :path: "../node_modules/react-native/ReactCommon/yoga" 519 | 520 | SPEC CHECKSUMS: 521 | boost: 57d2868c099736d80fcd648bf211b4431e51a558 522 | DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 523 | EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 524 | EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 525 | EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d 526 | EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272 527 | Expo: 81418098ffb16914b2e190f54e06db923248e4a1 528 | ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a 529 | ExpoModulesCore: 6e0259511f4c4341b6b8357db393624df2280828 530 | EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca 531 | FBLazyVector: a83ceaa8a8581003a623facdb3c44f6d4f342ac5 532 | FBReactNativeSpec: 85eee79837cb797ab6176f0243a2b40511c09158 533 | fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 534 | glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b 535 | hermes-engine: b434cea529ad0152c56c7cb6486b0c4c0b23b5de 536 | libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 537 | RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 538 | RCTRequired: 5c6fd63b03abb06947d348dadac51c93e3485bd8 539 | RCTTypeSafety: 1c66daedd66f674e39ce9f40782f0d490c78b175 540 | React: e11ca7cdc7aa4ddd7e6a59278b808cfe17ebbd9f 541 | React-callinvoker: 77a82869505c96945c074b80bbdc8df919646d51 542 | React-Codegen: 9ee33090c38ab3da3c4dc029924d50fb649f0dfc 543 | React-Core: 44903e47b428a491f48fd0eae54caddb2ea05ebf 544 | React-CoreModules: 83d989defdfc82be1f7386f84a56b6509f54ac74 545 | React-cxxreact: 058e7e6349649eae9cfcdec5854e702b26298932 546 | React-hermes: ba19a405804b833c9b832c1f2061ad5038bb97f2 547 | React-jsi: 3fe6f589c9cafbef85ed5a4be7c6dc8edfb4ab54 548 | React-jsiexecutor: 7894956638ff3e00819dd3f9f6f4a84da38f2409 549 | React-jsinspector: d5ce2ef3eb8fd30c28389d0bc577918c70821bd6 550 | React-logger: 9332c3e7b4ef007a0211c0a9868253aac3e1da82 551 | react-native-safe-area-context: f5549f36508b1b7497434baa0cd97d7e470920d4 552 | React-perflogger: 43392072a5b867a504e2b4857606f8fc5a403d7f 553 | React-RCTActionSheet: c7b67c125bebeda9fb19fc7b200d85cb9d6899c4 554 | React-RCTAnimation: c2de79906f607986633a7114bee44854e4c7e2f5 555 | React-RCTAppDelegate: 96bc933c3228a549718a6475c4d3f9dd4bbae98d 556 | React-RCTBlob: cf72446957310e7da6627a4bdaadf970d3a8f232 557 | React-RCTImage: c6093f1bf3d67c0428d779b00390617d5bd90699 558 | React-RCTLinking: 5de47e37937889d22599af4b99d0552bad1b1c3c 559 | React-RCTNetwork: e7d7077e073b08e5dd486fba3fe87ccad90a9bc4 560 | React-RCTSettings: 72a04921b2e8fb832da7201a60ffffff2a7c62f7 561 | React-RCTText: 7123c70fef5367e2121fea37e65b9ad6d3747e54 562 | React-RCTVibration: 73d201599a64ea14b4e0b8f91b64970979fd92e6 563 | React-runtimeexecutor: 8692ac548bec648fa121980ccb4304afd136d584 564 | ReactCommon: 0c43eaeaaee231d7d8dc24fc5a6e4cf2b75bf196 565 | Yoga: ba09b6b11e6139e3df8229238aa794205ca6a02a 566 | 567 | PODFILE CHECKSUM: b056653db6e2cab8d864e110efbfb1746da57c22 568 | 569 | COCOAPODS: 1.12.0 570 | -------------------------------------------------------------------------------- /packages/mobile/ios/Podfile.properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo.jsEngine": "hermes" 3 | } 4 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 11 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 12 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 13 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; 14 | 96905EF65AED1B983A6B3ABC /* libPods-mobile.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobile.a */; }; 15 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; 16 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; 17 | E58A72E0C46F4C359289330C /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = F505389FEA6F48048F72D6CE /* noop-file.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 22 | 13B07F961A680F5B00A75B9A /* mobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mobile.app; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = mobile/AppDelegate.h; sourceTree = ""; }; 24 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = mobile/AppDelegate.mm; sourceTree = ""; }; 25 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = mobile/Images.xcassets; sourceTree = ""; }; 26 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = mobile/Info.plist; sourceTree = ""; }; 27 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = mobile/main.m; sourceTree = ""; }; 28 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobile.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-mobile.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 6C2E3173556A471DD304B334 /* Pods-mobile.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile.debug.xcconfig"; path = "Target Support Files/Pods-mobile/Pods-mobile.debug.xcconfig"; sourceTree = ""; }; 30 | 7A4D352CD337FB3A3BF06240 /* Pods-mobile.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobile.release.xcconfig"; path = "Target Support Files/Pods-mobile/Pods-mobile.release.xcconfig"; sourceTree = ""; }; 31 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = mobile/SplashScreen.storyboard; sourceTree = ""; }; 32 | BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; 33 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 34 | F505389FEA6F48048F72D6CE /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "mobile/noop-file.swift"; sourceTree = ""; }; 35 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-mobile/ExpoModulesProvider.swift"; sourceTree = ""; }; 36 | /* End PBXFileReference section */ 37 | 38 | /* Begin PBXFrameworksBuildPhase section */ 39 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 40 | isa = PBXFrameworksBuildPhase; 41 | buildActionMask = 2147483647; 42 | files = ( 43 | 96905EF65AED1B983A6B3ABC /* libPods-mobile.a in Frameworks */, 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | 13B07FAE1A68108700A75B9A /* mobile */ = { 51 | isa = PBXGroup; 52 | children = ( 53 | BB2F792B24A3F905000567C9 /* Supporting */, 54 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 55 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 56 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */, 57 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 58 | 13B07FB61A68108700A75B9A /* Info.plist */, 59 | 13B07FB71A68108700A75B9A /* main.m */, 60 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, 61 | F505389FEA6F48048F72D6CE /* noop-file.swift */, 62 | ); 63 | name = mobile; 64 | sourceTree = ""; 65 | }; 66 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 70 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobile.a */, 71 | ); 72 | name = Frameworks; 73 | sourceTree = ""; 74 | }; 75 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | ); 79 | name = Libraries; 80 | sourceTree = ""; 81 | }; 82 | 83CBB9F61A601CBA00E9B192 = { 83 | isa = PBXGroup; 84 | children = ( 85 | 13B07FAE1A68108700A75B9A /* mobile */, 86 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 87 | 83CBBA001A601CBA00E9B192 /* Products */, 88 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 89 | D65327D7A22EEC0BE12398D9 /* Pods */, 90 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, 91 | ); 92 | indentWidth = 2; 93 | sourceTree = ""; 94 | tabWidth = 2; 95 | usesTabs = 0; 96 | }; 97 | 83CBBA001A601CBA00E9B192 /* Products */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 13B07F961A680F5B00A75B9A /* mobile.app */, 101 | ); 102 | name = Products; 103 | sourceTree = ""; 104 | }; 105 | 92DBD88DE9BF7D494EA9DA96 /* mobile */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, 109 | ); 110 | name = mobile; 111 | sourceTree = ""; 112 | }; 113 | BB2F792B24A3F905000567C9 /* Supporting */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | BB2F792C24A3F905000567C9 /* Expo.plist */, 117 | ); 118 | name = Supporting; 119 | path = mobile/Supporting; 120 | sourceTree = ""; 121 | }; 122 | D65327D7A22EEC0BE12398D9 /* Pods */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 6C2E3173556A471DD304B334 /* Pods-mobile.debug.xcconfig */, 126 | 7A4D352CD337FB3A3BF06240 /* Pods-mobile.release.xcconfig */, 127 | ); 128 | path = Pods; 129 | sourceTree = ""; 130 | }; 131 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 92DBD88DE9BF7D494EA9DA96 /* mobile */, 135 | ); 136 | name = ExpoModulesProviders; 137 | sourceTree = ""; 138 | }; 139 | /* End PBXGroup section */ 140 | 141 | /* Begin PBXNativeTarget section */ 142 | 13B07F861A680F5B00A75B9A /* mobile */ = { 143 | isa = PBXNativeTarget; 144 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "mobile" */; 145 | buildPhases = ( 146 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, 147 | FD10A7F022414F080027D42C /* Start Packager */, 148 | 13B07F871A680F5B00A75B9A /* Sources */, 149 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 150 | 13B07F8E1A680F5B00A75B9A /* Resources */, 151 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 152 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, 153 | F7945C893938CA168F685CCA /* [CP] Embed Pods Frameworks */, 154 | ); 155 | buildRules = ( 156 | ); 157 | dependencies = ( 158 | ); 159 | name = mobile; 160 | productName = mobile; 161 | productReference = 13B07F961A680F5B00A75B9A /* mobile.app */; 162 | productType = "com.apple.product-type.application"; 163 | }; 164 | /* End PBXNativeTarget section */ 165 | 166 | /* Begin PBXProject section */ 167 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 168 | isa = PBXProject; 169 | attributes = { 170 | LastUpgradeCheck = 1130; 171 | TargetAttributes = { 172 | 13B07F861A680F5B00A75B9A = { 173 | LastSwiftMigration = 1250; 174 | }; 175 | }; 176 | }; 177 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "mobile" */; 178 | compatibilityVersion = "Xcode 3.2"; 179 | developmentRegion = en; 180 | hasScannedForEncodings = 0; 181 | knownRegions = ( 182 | en, 183 | Base, 184 | ); 185 | mainGroup = 83CBB9F61A601CBA00E9B192; 186 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 187 | projectDirPath = ""; 188 | projectRoot = ""; 189 | targets = ( 190 | 13B07F861A680F5B00A75B9A /* mobile */, 191 | ); 192 | }; 193 | /* End PBXProject section */ 194 | 195 | /* Begin PBXResourcesBuildPhase section */ 196 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 197 | isa = PBXResourcesBuildPhase; 198 | buildActionMask = 2147483647; 199 | files = ( 200 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, 201 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 202 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, 203 | ); 204 | runOnlyForDeploymentPostprocessing = 0; 205 | }; 206 | /* End PBXResourcesBuildPhase section */ 207 | 208 | /* Begin PBXShellScriptBuildPhase section */ 209 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 210 | isa = PBXShellScriptBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | ); 214 | inputPaths = ( 215 | ); 216 | name = "Bundle React Native code and images"; 217 | outputPaths = ( 218 | ); 219 | runOnlyForDeploymentPostprocessing = 0; 220 | shellPath = /bin/sh; 221 | shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" $PROJECT_ROOT ios relative | tail -n 1)\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; 222 | }; 223 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { 224 | isa = PBXShellScriptBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | ); 228 | inputFileListPaths = ( 229 | ); 230 | inputPaths = ( 231 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 232 | "${PODS_ROOT}/Manifest.lock", 233 | ); 234 | name = "[CP] Check Pods Manifest.lock"; 235 | outputFileListPaths = ( 236 | ); 237 | outputPaths = ( 238 | "$(DERIVED_FILE_DIR)/Pods-mobile-checkManifestLockResult.txt", 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | shellPath = /bin/sh; 242 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 243 | showEnvVarsInLog = 0; 244 | }; 245 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { 246 | isa = PBXShellScriptBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | ); 250 | inputPaths = ( 251 | "${PODS_ROOT}/Target Support Files/Pods-mobile/Pods-mobile-resources.sh", 252 | "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", 253 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", 254 | ); 255 | name = "[CP] Copy Pods Resources"; 256 | outputPaths = ( 257 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", 258 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | shellPath = /bin/sh; 262 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-mobile/Pods-mobile-resources.sh\"\n"; 263 | showEnvVarsInLog = 0; 264 | }; 265 | F7945C893938CA168F685CCA /* [CP] Embed Pods Frameworks */ = { 266 | isa = PBXShellScriptBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | ); 270 | inputPaths = ( 271 | "${PODS_ROOT}/Target Support Files/Pods-mobile/Pods-mobile-frameworks.sh", 272 | "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", 273 | ); 274 | name = "[CP] Embed Pods Frameworks"; 275 | outputPaths = ( 276 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | shellPath = /bin/sh; 280 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-mobile/Pods-mobile-frameworks.sh\"\n"; 281 | showEnvVarsInLog = 0; 282 | }; 283 | FD10A7F022414F080027D42C /* Start Packager */ = { 284 | isa = PBXShellScriptBuildPhase; 285 | buildActionMask = 2147483647; 286 | files = ( 287 | ); 288 | inputFileListPaths = ( 289 | ); 290 | inputPaths = ( 291 | ); 292 | name = "Start Packager"; 293 | outputFileListPaths = ( 294 | ); 295 | outputPaths = ( 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; 300 | showEnvVarsInLog = 0; 301 | }; 302 | /* End PBXShellScriptBuildPhase section */ 303 | 304 | /* Begin PBXSourcesBuildPhase section */ 305 | 13B07F871A680F5B00A75B9A /* Sources */ = { 306 | isa = PBXSourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, 310 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 311 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, 312 | E58A72E0C46F4C359289330C /* noop-file.swift in Sources */, 313 | ); 314 | runOnlyForDeploymentPostprocessing = 0; 315 | }; 316 | /* End PBXSourcesBuildPhase section */ 317 | 318 | /* Begin XCBuildConfiguration section */ 319 | 13B07F941A680F5B00A75B9A /* Debug */ = { 320 | isa = XCBuildConfiguration; 321 | baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-mobile.debug.xcconfig */; 322 | buildSettings = { 323 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 324 | CLANG_ENABLE_MODULES = YES; 325 | CODE_SIGN_ENTITLEMENTS = mobile/mobile.entitlements; 326 | CURRENT_PROJECT_VERSION = 1; 327 | ENABLE_BITCODE = NO; 328 | GCC_PREPROCESSOR_DEFINITIONS = ( 329 | "$(inherited)", 330 | "FB_SONARKIT_ENABLED=1", 331 | ); 332 | INFOPLIST_FILE = mobile/Info.plist; 333 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 334 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 335 | MARKETING_VERSION = 1.0; 336 | OTHER_LDFLAGS = ( 337 | "$(inherited)", 338 | "-ObjC", 339 | "-lc++", 340 | ); 341 | OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; 342 | PRODUCT_BUNDLE_IDENTIFIER = com.minihacks.geese; 343 | PRODUCT_NAME = mobile; 344 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 345 | SWIFT_VERSION = 5.0; 346 | TARGETED_DEVICE_FAMILY = 1; 347 | VERSIONING_SYSTEM = "apple-generic"; 348 | }; 349 | name = Debug; 350 | }; 351 | 13B07F951A680F5B00A75B9A /* Release */ = { 352 | isa = XCBuildConfiguration; 353 | baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-mobile.release.xcconfig */; 354 | buildSettings = { 355 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 356 | CLANG_ENABLE_MODULES = YES; 357 | CODE_SIGN_ENTITLEMENTS = mobile/mobile.entitlements; 358 | CURRENT_PROJECT_VERSION = 1; 359 | INFOPLIST_FILE = mobile/Info.plist; 360 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 361 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 362 | MARKETING_VERSION = 1.0; 363 | OTHER_LDFLAGS = ( 364 | "$(inherited)", 365 | "-ObjC", 366 | "-lc++", 367 | ); 368 | OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; 369 | PRODUCT_BUNDLE_IDENTIFIER = com.minihacks.geese; 370 | PRODUCT_NAME = mobile; 371 | SWIFT_VERSION = 5.0; 372 | TARGETED_DEVICE_FAMILY = 1; 373 | VERSIONING_SYSTEM = "apple-generic"; 374 | }; 375 | name = Release; 376 | }; 377 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 382 | CLANG_CXX_LANGUAGE_STANDARD = "c++17"; 383 | CLANG_CXX_LIBRARY = "libc++"; 384 | CLANG_ENABLE_MODULES = YES; 385 | CLANG_ENABLE_OBJC_ARC = YES; 386 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 387 | CLANG_WARN_BOOL_CONVERSION = YES; 388 | CLANG_WARN_COMMA = YES; 389 | CLANG_WARN_CONSTANT_CONVERSION = YES; 390 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 391 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 392 | CLANG_WARN_EMPTY_BODY = YES; 393 | CLANG_WARN_ENUM_CONVERSION = YES; 394 | CLANG_WARN_INFINITE_RECURSION = YES; 395 | CLANG_WARN_INT_CONVERSION = YES; 396 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 397 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 398 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 399 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 400 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 401 | CLANG_WARN_STRICT_PROTOTYPES = YES; 402 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 403 | CLANG_WARN_UNREACHABLE_CODE = YES; 404 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 405 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 406 | COPY_PHASE_STRIP = NO; 407 | ENABLE_STRICT_OBJC_MSGSEND = YES; 408 | ENABLE_TESTABILITY = YES; 409 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; 410 | GCC_C_LANGUAGE_STANDARD = gnu99; 411 | GCC_DYNAMIC_NO_PIC = NO; 412 | GCC_NO_COMMON_BLOCKS = YES; 413 | GCC_OPTIMIZATION_LEVEL = 0; 414 | GCC_PREPROCESSOR_DEFINITIONS = ( 415 | "DEBUG=1", 416 | "$(inherited)", 417 | ); 418 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 426 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 427 | LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; 428 | MTL_ENABLE_DEBUG_INFO = YES; 429 | ONLY_ACTIVE_ARCH = YES; 430 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; 431 | SDKROOT = iphoneos; 432 | }; 433 | name = Debug; 434 | }; 435 | 83CBBA211A601CBA00E9B192 /* Release */ = { 436 | isa = XCBuildConfiguration; 437 | buildSettings = { 438 | ALWAYS_SEARCH_USER_PATHS = NO; 439 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 440 | CLANG_CXX_LANGUAGE_STANDARD = "c++17"; 441 | CLANG_CXX_LIBRARY = "libc++"; 442 | CLANG_ENABLE_MODULES = YES; 443 | CLANG_ENABLE_OBJC_ARC = YES; 444 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 445 | CLANG_WARN_BOOL_CONVERSION = YES; 446 | CLANG_WARN_COMMA = YES; 447 | CLANG_WARN_CONSTANT_CONVERSION = YES; 448 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 449 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 450 | CLANG_WARN_EMPTY_BODY = YES; 451 | CLANG_WARN_ENUM_CONVERSION = YES; 452 | CLANG_WARN_INFINITE_RECURSION = YES; 453 | CLANG_WARN_INT_CONVERSION = YES; 454 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 455 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 456 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 457 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 458 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 459 | CLANG_WARN_STRICT_PROTOTYPES = YES; 460 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 461 | CLANG_WARN_UNREACHABLE_CODE = YES; 462 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 463 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 464 | COPY_PHASE_STRIP = YES; 465 | ENABLE_NS_ASSERTIONS = NO; 466 | ENABLE_STRICT_OBJC_MSGSEND = YES; 467 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; 468 | GCC_C_LANGUAGE_STANDARD = gnu99; 469 | GCC_NO_COMMON_BLOCKS = YES; 470 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 471 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 472 | GCC_WARN_UNDECLARED_SELECTOR = YES; 473 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 474 | GCC_WARN_UNUSED_FUNCTION = YES; 475 | GCC_WARN_UNUSED_VARIABLE = YES; 476 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 477 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 478 | LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; 479 | MTL_ENABLE_DEBUG_INFO = NO; 480 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; 481 | SDKROOT = iphoneos; 482 | VALIDATE_PRODUCT = YES; 483 | }; 484 | name = Release; 485 | }; 486 | /* End XCBuildConfiguration section */ 487 | 488 | /* Begin XCConfigurationList section */ 489 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "mobile" */ = { 490 | isa = XCConfigurationList; 491 | buildConfigurations = ( 492 | 13B07F941A680F5B00A75B9A /* Debug */, 493 | 13B07F951A680F5B00A75B9A /* Release */, 494 | ); 495 | defaultConfigurationIsVisible = 0; 496 | defaultConfigurationName = Release; 497 | }; 498 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "mobile" */ = { 499 | isa = XCConfigurationList; 500 | buildConfigurations = ( 501 | 83CBBA201A601CBA00E9B192 /* Debug */, 502 | 83CBBA211A601CBA00E9B192 /* Release */, 503 | ); 504 | defaultConfigurationIsVisible = 0; 505 | defaultConfigurationName = Release; 506 | }; 507 | /* End XCConfigurationList section */ 508 | }; 509 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 510 | } 511 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile.xcodeproj/xcshareddata/xcschemes/mobile.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | @interface AppDelegate : EXAppDelegateWrapper 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/AppDelegate.mm: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | #import 4 | #import 5 | 6 | @implementation AppDelegate 7 | 8 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 9 | { 10 | self.moduleName = @"main"; 11 | 12 | // You can add your custom initial props in the dictionary below. 13 | // They will be passed down to the ViewController used by React Native. 14 | self.initialProps = @{}; 15 | 16 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 17 | } 18 | 19 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge 20 | { 21 | #if DEBUG 22 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; 23 | #else 24 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 25 | #endif 26 | } 27 | 28 | /// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. 29 | /// 30 | /// @see: https://reactjs.org/blog/2022/03/29/react-v18.html 31 | /// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). 32 | /// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. 33 | - (BOOL)concurrentRootEnabled 34 | { 35 | return true; 36 | } 37 | 38 | // Linking API 39 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { 40 | return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; 41 | } 42 | 43 | // Universal Links 44 | - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { 45 | BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; 46 | return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; 47 | } 48 | 49 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 50 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 51 | { 52 | return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; 53 | } 54 | 55 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 56 | - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 57 | { 58 | return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; 59 | } 60 | 61 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 62 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 63 | { 64 | return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; 65 | } 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "expo" 37 | } 38 | } -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "expo" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Images.xcassets/SplashScreenBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "image.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "expo" 20 | } 21 | } -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Images.xcassets/SplashScreenBackground.imageset/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MiniHacks/geese/68579dad1d3a9cfe3e7c498de5f55c477404dd0d/packages/mobile/ios/mobile/Images.xcassets/SplashScreenBackground.imageset/image.png -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | mobile 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleURLTypes 24 | 25 | 26 | CFBundleURLSchemes 27 | 28 | com.minihacks.geese 29 | 30 | 31 | 32 | CFBundleVersion 33 | 1 34 | LSRequiresIPhoneOS 35 | 36 | NSAppTransportSecurity 37 | 38 | NSAllowsArbitraryLoads 39 | 40 | NSExceptionDomains 41 | 42 | localhost 43 | 44 | NSExceptionAllowsInsecureHTTPLoads 45 | 46 | 47 | 48 | 49 | UILaunchStoryboardName 50 | SplashScreen 51 | UIRequiredDeviceCapabilities 52 | 53 | armv7 54 | 55 | UIRequiresFullScreen 56 | 57 | UIStatusBarStyle 58 | UIStatusBarStyleDefault 59 | UISupportedInterfaceOrientations 60 | 61 | UIInterfaceOrientationPortrait 62 | UIInterfaceOrientationPortraitUpsideDown 63 | UIInterfaceOrientationLandscapeLeft 64 | UIInterfaceOrientationLandscapeRight 65 | 66 | UISupportedInterfaceOrientations~ipad 67 | 68 | UIInterfaceOrientationPortrait 69 | UIInterfaceOrientationPortraitUpsideDown 70 | UIInterfaceOrientationLandscapeLeft 71 | UIInterfaceOrientationLandscapeRight 72 | 73 | UIUserInterfaceStyle 74 | Light 75 | UIViewControllerBasedStatusBarAppearance 76 | 77 | 78 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/SplashScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/Supporting/Expo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EXUpdatesCheckOnLaunch 6 | ALWAYS 7 | EXUpdatesEnabled 8 | 9 | EXUpdatesLaunchWaitMs 10 | 0 11 | EXUpdatesSDKVersion 12 | 48.0.0 13 | EXUpdatesURL 14 | https://exp.host/@anonymous/mobile 15 | 16 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char * argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/mobile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | -------------------------------------------------------------------------------- /packages/mobile/ios/mobile/noop-file.swift: -------------------------------------------------------------------------------- 1 | // 2 | // @generated 3 | // A blank Swift file must be created for native modules with Swift files to work correctly. 4 | // 5 | -------------------------------------------------------------------------------- /packages/mobile/metro.config.js: -------------------------------------------------------------------------------- 1 | // Learn more https://docs.expo.io/guides/customizing-metro 2 | const { getDefaultConfig } = require('expo/metro-config'); 3 | 4 | module.exports = getDefaultConfig(__dirname); 5 | -------------------------------------------------------------------------------- /packages/mobile/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mobile", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "expo start --dev-client", 7 | "android": "expo run:android", 8 | "ios": "expo run:ios", 9 | "web": "expo start --web", 10 | "studio": "studio android", 11 | "xcode": "open ios/*.xcworkspace", 12 | "clean": "npx react-native-clean-project" 13 | }, 14 | "dependencies": { 15 | "@react-navigation/bottom-tabs": "^6.5.7", 16 | "@react-navigation/native": "^6.1.6", 17 | "expo": "~48.0.11", 18 | "expo-splash-screen": "~0.18.1", 19 | "expo-status-bar": "^1.4.4", 20 | "react": "18.2.0", 21 | "react-native": "0.71.6", 22 | "react-native-safe-area-context": "^4.5.1" 23 | }, 24 | "devDependencies": { 25 | "@babel/core": "^7.20.0" 26 | }, 27 | "private": true 28 | } 29 | -------------------------------------------------------------------------------- /packages/mobile/screens/HomeScreen.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Text, View } from "react-native"; 3 | 4 | export default function HomeScreen() { 5 | return ( 6 | 13 | Home 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /packages/mobile/screens/SettingsScreen.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Text, View } from "react-native"; 3 | 4 | export default function SettingsScreen() { 5 | return ( 6 | 7 | Settings 8 | 9 | ); 10 | } 11 | --------------------------------------------------------------------------------