diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index a5dc7c6bf..a0d6d87cf 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -157,8 +157,5 @@ jobs: eas update --branch="${{ needs.getprnumber.outputs.PR }}" --non-interactive --auto echo "${{ env.BACKEND_SERVER_URL }} and ${{ needs.getprnumber.outputs.PR }}" env: - BACKEND_SERVER_URL: "${{ github.event.deployment_status.environment_url }}" - ROLLBAR_ACCESS_TOKEN: "1a19e5da05b2435b802d5a81aba2bbd7" - SENTRY_PROJECT_NAME: "tn-staging" - SENTRY_DSN: "https://a7cea97f07ac42fa9e28800b037997c9@o4504899535962112.ingest.sentry.io/4504906332897280" - SENTRY_AUTH_TOKEN: "${{ secrets.SENTRY_AUTH_TOKEN }}" + EXPO_PUBLIC_BACKEND_SERVER_URL: "${{ github.event.deployment_status.environment_url }}" + EXPO_PUBLIC_ROLLBAR_ACCESS_TOKEN: "1a19e5da05b2435b802d5a81aba2bbd7" \ No newline at end of file diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 452b09687..a8540e91e 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -9,8 +9,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - run: pipenv install --dev --deploy - name: Run Black run: pipenv run black --check --exclude \{\{cookiecutter . @@ -21,8 +21,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - run: pipenv install --dev --deploy - name: Run flake8 run: pipenv run flake8 --extend-exclude server @@ -36,8 +36,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - name: 🐍 Install python dependencies run: pipenv install --dev --deploy - run: | @@ -58,8 +58,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - name: 🐍 Install python dependencies run: pipenv install --dev --deploy - run: | @@ -80,8 +80,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - name: 🐍 Install python dependencies run: pipenv install --dev --deploy - run: | @@ -90,14 +90,18 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 18 - - name: 📦 Install client dependencies + - name: 📦 Install dependencies env: NPM_CONFIG_PRODUCTION: false working-directory: ./my_project/client - run: npm install - - name: Run ESLint + run: | + npm install + - name: 🆎 TypeCheck working-directory: ./my_project/client - run: npx eslint --ext .js,.ts,.vue,.jsx,.tsx src + run: npm run tslint + - name: 🚧 ESLint + working-directory: ./my_project/client + run: npm run eslint Lint_Mobile: runs-on: ubuntu-latest steps: @@ -106,8 +110,8 @@ jobs: - run: pipx install pipenv - uses: actions/setup-python@v5 with: - python-version: '3.10' - cache: 'pipenv' + python-version: "3.10" + cache: "pipenv" - name: 🐍 Install python dependencies run: pipenv install --dev --deploy - run: | @@ -119,10 +123,10 @@ jobs: node-version: 18.x - name: 📦 Install dependencies working-directory: ./my_project/mobile - run: yarn install + run: npm install - name: 🆎 TypeCheck working-directory: ./my_project/mobile - run: yarn run tslint + run: npm run lint:tslint - name: 🚧 ESLint working-directory: ./my_project/mobile - run: yarn run eslint + run: npm run lint:eslint diff --git a/Pipfile b/Pipfile index 5c72b7f9b..bacfbd13b 100644 --- a/Pipfile +++ b/Pipfile @@ -18,6 +18,7 @@ pytest-instafail = "==0.4.2" PyYAML = "==6.0.1" PyGithub = "==1.55" Jinja2 = "==3.0.1" +jinja2-time = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index db266a7f0..c863cf9ba 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3c02ac2e9b7299816568e55a5e3c6743ab5eb72515b74c0f00577a50f8105a08" + "sha256": "7edf08a5a1f3deb5b32e4ef8e2be3f940bab4365bb0760123c19e3447b7df41e" }, "pipfile-spec": 6, "requires": { @@ -18,19 +18,19 @@ "default": { "arrow": { "hashes": [ - "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1", - "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2" + "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", + "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" ], - "markers": "python_version >= '3.6'", - "version": "==1.2.3" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "binaryornot": { "hashes": [ @@ -67,92 +67,82 @@ "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d" ], "index": "pypi", + "markers": "python_full_version >= '3.6.2'", "version": "==22.3.0" }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2024.6.2" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "python_version >= '3.8'", + "version": "==1.16.0" }, "cfgv": { "hashes": [ - "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426", - "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736" + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" ], - "markers": "python_full_version >= '3.6.1'", - "version": "==3.3.1" + "markers": "python_version >= '3.8'", + "version": "==3.4.0" }, "chardet": { "hashes": [ @@ -164,92 +154,107 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.2.0" + "version": "==3.3.2" }, "click": { "hashes": [ - "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", - "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.6" + "version": "==8.1.7" }, "cookiecutter": { "hashes": [ @@ -257,6 +262,7 @@ "sha256:f3982be8d9c53dac1261864013fdec7f83afd2e42ede6f6dd069c5e149c540d5" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.1.1" }, "deprecated": { @@ -269,18 +275,18 @@ }, "distlib": { "hashes": [ - "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", - "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" + "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", + "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" ], - "version": "==0.3.7" + "version": "==0.3.8" }, "filelock": { "hashes": [ - "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", - "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec" + "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f", + "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a" ], - "markers": "python_version >= '3.7'", - "version": "==3.12.2" + "markers": "python_version >= '3.8'", + "version": "==3.14.0" }, "flake8": { "hashes": [ @@ -288,6 +294,7 @@ "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==3.9.2" }, "flake8-isort": { @@ -300,19 +307,19 @@ }, "identify": { "hashes": [ - "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f", - "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54" + "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa", + "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d" ], "markers": "python_version >= '3.8'", - "version": "==2.5.26" + "version": "==2.5.36" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.7" }, "iniconfig": { "hashes": [ @@ -328,6 +335,7 @@ "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2" ], "index": "pypi", + "markers": "python_version < '4.0' and python_full_version >= '3.6.1'", "version": "==5.9.3" }, "jinja2": { @@ -336,6 +344,7 @@ "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==3.0.1" }, "jinja2-time": { @@ -343,63 +352,74 @@ "sha256:d14eaa4d315e7688daa4969f616f226614350c48730bfa1692d2caebd8c90d40", "sha256:d3eab6605e3ec8b7a0863df09cc1d23714908fa61aa6986a845c20ba488b4efa" ], + "index": "pypi", "version": "==0.2.0" }, "markupsafe": { "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", - "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", - "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", - "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", - "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", - "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", - "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", - "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", - "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", - "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", - "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", - "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", - "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", - "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", - "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", - "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", - "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", - "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" ], "markers": "python_version >= '3.7'", - "version": "==2.1.3" + "version": "==2.1.5" }, "mccabe": { "hashes": [ @@ -418,35 +438,35 @@ }, "nodeenv": { "hashes": [ - "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", - "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", + "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.8.0" + "version": "==1.9.1" }, "packaging": { "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" ], - "markers": "python_version >= '3.7'", - "version": "==23.1" + "markers": "python_version >= '3.8'", + "version": "==24.1" }, "pathspec": { "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "platformdirs": { "hashes": [ - "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", - "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], - "markers": "python_version >= '3.7'", - "version": "==3.10.0" + "markers": "python_version >= '3.8'", + "version": "==4.2.2" }, "pluggy": { "hashes": [ @@ -462,6 +482,7 @@ "sha256:b679d0fddd5b9d6d98783ae5f10fd0c4c59954f375b70a58cbe1ce9bcf9809a4" ], "index": "pypi", + "markers": "python_full_version >= '3.6.1'", "version": "==2.13.0" }, "py": { @@ -482,10 +503,11 @@ }, "pycparser": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" ], - "version": "==2.21" + "markers": "python_version >= '3.8'", + "version": "==2.22" }, "pyflakes": { "hashes": [ @@ -501,6 +523,7 @@ "sha256:2caf0054ea079b71e539741ae56c5a95e073b81fa472ce222e81667381b9601b" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==1.55" }, "pyjwt": { @@ -533,6 +556,7 @@ "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==6.2.4" }, "pytest-cookies": { @@ -541,6 +565,7 @@ "sha256:94c41ad914d420b57bc31d58ab2c0b103322c11d07d13b8d245c85fa9b069714" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==0.6.1" }, "pytest-instafail": { @@ -549,27 +574,30 @@ "sha256:1ec440a177be89a9ed2759dade8e1f7a2b95bac74ae81dc91318d309bf4ebd4f" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==0.4.2" }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "python-slugify": { "hashes": [ - "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395", - "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27" + "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", + "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856" ], "markers": "python_version >= '3.7'", - "version": "==8.0.1" + "version": "==8.0.4" }, "pyyaml": { "hashes": [ + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", @@ -577,7 +605,10 @@ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", @@ -585,11 +616,15 @@ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", @@ -602,7 +637,9 @@ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", @@ -611,23 +648,16 @@ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], - "markers": "python_version >= '3.7'", - "version": "==2.31.0" - }, - "setuptools": { - "hashes": [ - "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f", - "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235" - ], - "markers": "python_version >= '3.7'", - "version": "==68.0.0" + "markers": "python_version >= '3.8'", + "version": "==2.32.3" }, "six": { "hashes": [ @@ -673,104 +703,108 @@ "sha256:c990028355f0d0b681e3db9baa89dd9f839a6e999c320029339f6a6b36160591" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==3.24.0" }, + "types-python-dateutil": { + "hashes": [ + "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202", + "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + ], + "markers": "python_version >= '3.8'", + "version": "==2.9.0.20240316" + }, "urllib3": { "hashes": [ - "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", - "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", + "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19" ], - "markers": "python_version >= '3.7'", - "version": "==2.0.4" + "markers": "python_version >= '3.8'", + "version": "==2.2.1" }, "virtualenv": { "hashes": [ - "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff", - "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0" + "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c", + "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b" ], "markers": "python_version >= '3.7'", - "version": "==20.24.2" + "version": "==20.26.2" }, "wrapt": { "hashes": [ - "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0", - "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420", - "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a", - "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c", - "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079", - "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923", - "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f", - "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1", - "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8", - "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86", - "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0", - "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364", - "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e", - "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c", - "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e", - "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c", - "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727", - "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff", - "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e", - "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29", - "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7", - "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72", - "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475", - "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a", - "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317", - "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2", - "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd", - "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640", - "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98", - "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248", - "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e", - "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d", - "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec", - "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1", - "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e", - "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9", - "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92", - "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb", - "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094", - "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46", - "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", - "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd", - "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705", - "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8", - "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975", - "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb", - "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e", - "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b", - "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418", - "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019", - "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1", - "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba", - "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6", - "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2", - "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3", - "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7", - "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752", - "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416", - "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f", - "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1", - "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc", - "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145", - "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee", - "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a", - "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7", - "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b", - "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653", - "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0", - "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90", - "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29", - "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6", - "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034", - "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09", - "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559", - "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639" + "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", + "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", + "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", + "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", + "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", + "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", + "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", + "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", + "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", + "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", + "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", + "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", + "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", + "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", + "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", + "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", + "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", + "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", + "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", + "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", + "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", + "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", + "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", + "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", + "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", + "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", + "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", + "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", + "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", + "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", + "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", + "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", + "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", + "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", + "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", + "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", + "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", + "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", + "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", + "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", + "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", + "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", + "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", + "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", + "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", + "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", + "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", + "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", + "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", + "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", + "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", + "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", + "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", + "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", + "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", + "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", + "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", + "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", + "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", + "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", + "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", + "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", + "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", + "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", + "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.15.0" + "markers": "python_version >= '3.6'", + "version": "==1.16.0" } }, "develop": {} diff --git a/app.json b/app.json index cbdac9aa9..5ce5ddb8c 100644 --- a/app.json +++ b/app.json @@ -32,7 +32,7 @@ "addons": ["heroku-postgresql:standard-0"], "environments": { "review": { - "addons": ["heroku-postgresql:mini"] + "addons": ["heroku-postgresql:essential-0"] } }, "buildpacks": [ diff --git a/resources/app-bs.config.js b/resources/app-bs.config.js index 0fcef68b3..2bf29231e 100644 --- a/resources/app-bs.config.js +++ b/resources/app-bs.config.js @@ -17,20 +17,18 @@ module.exports = { fallbackToCacheTimeout: 0, url: 'https://u.expo.dev/ec1b86e2-2582-48cf-8a7a-c6d2772ba4f2', // uuid of app }, - plugins: ['sentry-expo'], - hooks: { - postPublish: [ + plugins: [ + [ + '@sentry/react-native/expo', { - // this set up assumes you are using one application with multiple projects in sentry - file: 'sentry-expo/upload-sourcemaps', - config: { - organization: 'tn-bootstrapper', - project: process.env.SENTRY_PROJECT_NAME, - authToken: process.env.SENTRY_AUTH_TOKEN, // defined in expo secrets - }, - }, + organization: 'tn-bootstrapper', // replace with org in sentry + project: process.env.SENTRY_PROJECT_NAME, // see readme for these variables + } ], - }, + 'expo-build-properties', + 'expo-localization', + 'expo-font', + ], ios: { supportsTablet: true, bundleIdentifier: 'org.thinknimble.expo.bootstrapper', diff --git a/{{cookiecutter.project_slug}}/.env.example b/{{cookiecutter.project_slug}}/.env.example index ac6c93d30..78bef4911 100644 --- a/{{cookiecutter.project_slug}}/.env.example +++ b/{{cookiecutter.project_slug}}/.env.example @@ -117,8 +117,8 @@ USE_AWS_STORAGE='False' # AWS_SECRET_ACCESS_KEY IAM User's Secret Access Key from the AWS dashboard. # AWS_STORAGE_BUCKET_NAME The name of the S3 bucket to use for storage. # AWS_LOCATION Folder location inside of the S3 storage bucket. -# AWS_S3_REGION_NAME Region name (ex: 'us-east-2') required in order to receive correct -# query authorization mechanism parameters for private URLs. +# AWS_S3_REGION_NAME Region name (ex: 'us-east-2') required in order to receive correct +# query authorization mechanism parameters for private URLs. # AWS_ACCESS_KEY_ID='' AWS_SECRET_ACCESS_KEY='' diff --git a/{{cookiecutter.project_slug}}/.github/workflows/expo-main.yml b/{{cookiecutter.project_slug}}/.github/workflows/expo-main.yml index e04f4474a..c88a064cb 100644 --- a/{{cookiecutter.project_slug}}/.github/workflows/expo-main.yml +++ b/{{cookiecutter.project_slug}}/.github/workflows/expo-main.yml @@ -70,7 +70,7 @@ jobs: run: cd mobile && eas update --branch=staging --non-interactive --auto env: # Since expo update replaces code OTA these variables should match the staging variables in eas.json - BACKEND_SERVER_URL: "" - ROLLBAR_ACCESS_TOKEN: "" + EXPO_PUBLIC_BACKEND_SERVER_URL: "" + EXPO_PUBLIC_ROLLBAR_ACCESS_TOKEN: "" diff --git a/{{cookiecutter.project_slug}}/.github/workflows/expo-pr.yml b/{{cookiecutter.project_slug}}/.github/workflows/expo-pr.yml index ac3c4cb0d..fd7dff43f 100644 --- a/{{cookiecutter.project_slug}}/.github/workflows/expo-pr.yml +++ b/{{cookiecutter.project_slug}}/.github/workflows/expo-pr.yml @@ -46,7 +46,8 @@ jobs: - name: 🚀 Publish preview run: | cd mobile && eas update --branch={{ "${{ needs.setup.outputs.PR }}" }} --non-interactive --auto - echo "{{ "${{ env.BACKEND_SERVER_URL }}" }} and {{ "${{ needs.setup.outputs.PR }}" }}" + echo "{{ "${{ env.EXPO_PUBLIC_BACKEND_SERVER_URL }}" }} and {{ "${{ needs.setup.outputs.PR }}" }}" env: - BACKEND_SERVER_URL: {{ "${{ github.event.deployment_status.environment_url }}" }} - ROLLBAR_ACCESS_TOKEN: "" + EXPO_PUBLIC_BACKEND_SERVER_URL: {{ "${{ github.event.deployment_status.environment_url }}" }} + EXPO_PUBLIC_ROLLBAR_ACCESS_TOKEN: "" + diff --git a/{{cookiecutter.project_slug}}/.github/workflows/linting.yml b/{{cookiecutter.project_slug}}/.github/workflows/linting.yml index c236a91ce..d6d8b88cd 100644 --- a/{{cookiecutter.project_slug}}/.github/workflows/linting.yml +++ b/{{cookiecutter.project_slug}}/.github/workflows/linting.yml @@ -62,10 +62,10 @@ jobs: run: npm install - name: 🆎 TypeCheck working-directory: ./mobile - run: npm run tslint + run: npm run lint:tslint - name: 🚧 ESLint working-directory: ./mobile - run: npm run eslint + run: npm run lint:eslint - name: 🎨 Prettier working-directory: ./mobile run: npm run format:check diff --git a/{{cookiecutter.project_slug}}/Pipfile b/{{cookiecutter.project_slug}}/Pipfile index e28ec9081..18c5ee73a 100644 --- a/{{cookiecutter.project_slug}}/Pipfile +++ b/{{cookiecutter.project_slug}}/Pipfile @@ -4,33 +4,33 @@ verify_ssl = true name = "pypi" [packages] -Django = "==3.2.6" -django-extensions = "==3.1.3" +Django = "==4.2.*" +django-extensions = "==3.2.3" django-filter = "==2.4.0" django-nose = "==1.4.7" dj-rest-auth = "*" dj-database-url = "==0.5.0" django-storages = "==1.11.1" # https://github.com/jschneier/django-storages boto3 = "==1.18.26" -djangorestframework = "==3.13.*" +djangorestframework = "==3.15.*" gunicorn = "==20.1.0" python-decouple = "*" pytz = "==2021.1" requests = "==2.*" whitenoise = "==5.3.0" -psycopg2-binary = "==2.9.1" +psycopg2-binary = "==2.9.*" django-cors-headers = "==3.8.0" django-model-utils = "==4.1.1" -drf-yasg = "==1.20.0" django-multiselectfield = "==0.1.12" drf-writable-nested = "==0.6.3" python-slugify = "==5.0.2" Pillow = "==9.0" -django-currentuser = "==0.5.3" +django-currentuser = "==0.7.0" drf-nested-routers = "==0.93.3" django-anymail = "==8.4" # https://github.com/anymail/django-anymail rollbar = "==0.16.2" premailer = "*" +drf-spectacular = "*" [requires] python_version = "3.10" diff --git a/{{cookiecutter.project_slug}}/app.json b/{{cookiecutter.project_slug}}/app.json index 5bbff3805..9a8281135 100644 --- a/{{cookiecutter.project_slug}}/app.json +++ b/{{cookiecutter.project_slug}}/app.json @@ -31,13 +31,13 @@ }, "addons": [ "heroku-postgresql:standard-0", - "papertrail:Choklad" + "papertrail:choklad" ], "environments": { "review": { "addons": [ - "heroku-postgresql:mini", - "papertrail:Choklad" + "heroku-postgresql:essential-0", + "papertrail:choklad" ] } }, diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.env.example b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.env.example index 4312d8e99..0780da3b3 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.env.example +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.env.example @@ -1,7 +1,5 @@ # These variables are available only when running locally +# You can use this file to override them by prefixing with `EXPO_PUBLIC_` -# BACKEND_SERVER_URL="https://{{ cookiecutter.project_slug }}-staging.herokuapp.com" -# ROLLBAR_ACCESS_TOKEN='' -# SENTRY_PROJECT_NAME='' -# SENTRY_DSN="" -# SENTRY_AUTH_TOKEN="" +# EXPO_PUBLIC_BACKEND_SERVER_URL="https://{{ cookiecutter.project_slug }}-staging.herokuapp.com" +# EXPO_PUBLIC_ROLLBAR_ACCESS_TOKEN='' diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.eslintrc.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.eslintrc.js index 292c7e14c..cf30932f9 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.eslintrc.js +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.eslintrc.js @@ -12,4 +12,5 @@ module.exports = { 'react/react-in-jsx-scope': 'off', '@typescript-eslint/no-unused-vars': 'warn', }, + ignorePatterns: ['tailwind.config.js', 'metro.config.js'], } diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.gitignore b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.gitignore index 1fa45a63a..ca8bbaf1f 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/.gitignore +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/.gitignore @@ -22,7 +22,6 @@ media/ # will be generated after `expo run:ios` or `expo run:android` ios/ android/ -metro.config.js react-native.config.js index.js diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/App.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/App.tsx index 400685275..eb4910bda 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/App.tsx +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/App.tsx @@ -1,4 +1,5 @@ import { AppRoot } from '@screens/routes' +import * as Sentry from '@sentry/react-native' import { useAuth } from '@stores/auth' import { QueryClientProvider } from '@tanstack/react-query' import { customFonts } from '@utils/fonts' @@ -13,6 +14,7 @@ import React, { useCallback, useEffect, useState } from 'react' import { flushSync } from 'react-dom' import { LogBox, StyleSheet } from 'react-native' import { GestureHandlerRootView } from 'react-native-gesture-handler' +import './global.css' LogBox.ignoreLogs(['Require']) @@ -34,7 +36,7 @@ const styles = StyleSheet.create({ SplashScreen.preventAutoHideAsync() -export default (): JSX.Element => { +export default Sentry.wrap((): JSX.Element => { const [ready, setReady] = useState(false) const hasLocalStorageHydratedState = useAuth.use.hasHydrated() @@ -60,4 +62,4 @@ export default (): JSX.Element => { ) -} +}) diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.d.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.d.ts index 25b1dded7..369f9bca2 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.d.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.d.ts @@ -4,6 +4,7 @@ declare const Config: { backendServerUrl: string logger: Logger['logger'] sentryDSN: string + isExpoGo?: boolean } export default Config diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.js index a70c12ec2..65194934f 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.js +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/Config.js @@ -1,30 +1,36 @@ -import Logger from './logger' -import { BACKEND_SERVER_URL, ROLLBAR_ACCESS_TOKEN, SENTRY_DSN } from '@env' +import Constants, { ExecutionEnvironment } from 'expo-constants' import { Platform } from 'react-native' -import Constants from 'expo-constants' +import Logger from './logger' +const BACKEND_SERVER_URL = process.env.EXPO_PUBLIC_BACKEND_SERVER_URL +const SENTRY_DSN = process.env.EXPO_PUBLIC_SENTRY_DSN +const ROLLBAR_ACCESS_TOKEN = process.env.EXPO_PUBLIC_ROLLBAR_ACCESS_TOKEN -const { backendServerUrl, buildEnv, rollbarAccessToken, sentryDSN } = Constants?.expoConfig?.extra +const { backendServerUrl, rollbarAccessToken, sentryDSN } = Constants?.expoConfig?.extra +const isExpoGo = Constants.executionEnvironment === ExecutionEnvironment.StoreClient const isAndroid = Platform.OS === 'android' -let rollbarToken = isAndroid ? undefined : ROLLBAR_ACCESS_TOKEN const ENV = () => { - if (buildEnv) { - rollbarToken = rollbarAccessToken + if (!isExpoGo) { + let rollbarToken = isAndroid ? undefined : rollbarAccessToken + const logger = new Logger(rollbarToken).logger return { - backendServerUrl: backendServerUrl, - logger: new Logger(rollbarToken).logger, - sentryDSN: sentryDSN, + backendServerUrl, + logger, + sentryDSN, } } + + let rollbarToken = isAndroid ? undefined : ROLLBAR_ACCESS_TOKEN + const logger = new Logger(rollbarToken).logger return { backendServerUrl: BACKEND_SERVER_URL, - logger: new Logger(rollbarToken).logger, + logger, sentryDSN: SENTRY_DSN, + isExpoGo, } } -Config = { ...ENV() } - -export default Config +const Config = { ...ENV() } +export default Config \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/app.config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/app.config.js index 0f1974f32..bab869d2c 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/app.config.js +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/app.config.js @@ -17,33 +17,18 @@ module.exports = { fallbackToCacheTimeout: 0, url: 'https://u.expo.dev/', // uuid of app }, - plugins: ['sentry-expo', 'expo-build-properties', 'expo-localization', 'expo-font'], - hooks: { - postPublish: [ + plugins: [ + [ + '@sentry/react-native/expo', { - // this set up assumes you are using one application with multiple projects in sentry - file: 'sentry-expo/upload-sourcemaps', - config: { - organization: '', // replace with org in sentry - project: process.env.SENTRY_PROJECT_NAME, // see readme for this variables - /** - * TL;DR This variable is mentioned here for documentation and not required to be explicitly set - * - * This variable is retrieved from the global environment variables available at build time - * It is not required to be explicitly set here, - * uncommenting this line results in warnings from expo - * These warnings can be safely ignored - * If building locally you can pass the variable in the build command - * - * source .env && SENTRY_PROJECT=${SENTRY_PROJECT_NAME}\ - * SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN} expo prebuild - * - */ - // authToken: process.env.SENTRY_AUTH_TOKEN, - }, + organization: '', // replace with org in sentry + project: process.env.SENTRY_PROJECT_NAME, // see readme for these variables }, ], - }, + 'expo-build-properties', + 'expo-localization', + 'expo-font', + ], ios: { supportsTablet: true, bundleIdentifier: '', // CHANGE TO BUNDLE ID diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/babel.config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/babel.config.js index ff83229db..f408a1cba 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/babel.config.js +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/babel.config.js @@ -1,26 +1,6 @@ module.exports = function (api) { api.cache(true) return { - presets: ['babel-preset-expo'], - plugins: [ - 'react-native-reanimated/plugin', - 'nativewind/babel', - 'module:react-native-dotenv', - [ - 'module-resolver', - { - alias: { - '@components': './src/components', - '@screens': './src/screens', - '@stores': './src/stores', - '@assets': './assets', - '@services': './src/services', - '@utils': './src/utils', - '@src': './src', - }, - extensions: ['.js', '.jsx', '.ts', '.tsx'], - }, - ], - ], + presets: [['babel-preset-expo', { jsxImportSource: 'nativewind' }], 'nativewind/babel'], } } diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.css b/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.d.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.d.ts index a13e3136b..7059a3128 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.d.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/global.d.ts @@ -1 +1,13 @@ /// + +import { ScrollViewProps } from 'react-native' +import { BounceableProps } from 'rn-bounceable' +declare global { + // Extend the existing BounceableProps type + export interface ExtendedBounceableProps extends BounceableProps { + contentContainerClassName?: string + } + export interface ExtendedScrollViewProps extends ScrollViewProps { + contentContainerClassName?: string + } +} \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/metro.config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/metro.config.js new file mode 100644 index 000000000..6692ed959 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/metro.config.js @@ -0,0 +1,6 @@ +const { getSentryExpoConfig } = require('@sentry/react-native/metro') +const { withNativeWind } = require('nativewind/metro') + +const config = getSentryExpoConfig(__dirname, { isCSSEnabled: true }) + +module.exports = withNativeWind(config, { input: './global.css' }) diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/package.json b/{{cookiecutter.project_slug}}/clients/mobile/react-native/package.json index fe71ee2a0..5ef044083 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/package.json +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/package.json @@ -21,13 +21,13 @@ "pub:web": "npx expo export:web && cd web-build && vercel --prod && cd ..", "format:check": "prettier --check ./src", "format:write": "prettier --write ./src", - "tslint": "tsc --skipLibCheck", - "eslint": "eslint --ext .js,.ts,.jsx,.tsx --max-warnings=0 src" + "lint:tslint": "tsc --skipLibCheck", + "lint:eslint": "eslint --ext .js,.ts,.jsx,.tsx --max-warnings=0 src" }, "dependencies": { - "@react-native-async-storage/async-storage": "1.21.0", + "@react-native-async-storage/async-storage": "1.23.1", "@react-native-community/masked-view": "^0.1.11", - "@react-native-picker/picker": "2.6.1", + "@react-native-picker/picker": "2.7.5", "@react-navigation/bottom-tabs": "^6.4.0", "@react-navigation/drawer": "^6.5.8", "@react-navigation/material-top-tabs": "^6.5.3", @@ -35,59 +35,56 @@ "@react-navigation/native-stack": "^6.9.0", "@react-navigation/stack": "^6.3.0", "@react-spring/native": "^9.7.3", - "@sentry/react-native": "5.17.0", - "@shopify/flash-list": "1.6.3", + "@sentry/react-native": "~5.22.0", + "@shopify/flash-list": "1.6.4", "@tanstack/react-query": "^5.15.0", "@thinknimble/tn-forms": "^3.1.3", "@thinknimble/tn-forms-react": "^1.0.3", - "@thinknimble/tn-models": "^2.1.1", + "@thinknimble/tn-models": "^3.0.0", "axios": "^1.3.2", "date-fns": "^2.29.3", "eslint-plugin-flowtype": "^8.0.3", - "expo": "^50.0.6", - "expo-application": "~5.8.3", - "expo-build-properties": "~0.11.1", - "expo-dev-client": "~3.3.8", - "expo-device": "~5.9.3", - "expo-font": "~11.10.2", - "expo-linear-gradient": "~12.7.1", - "expo-localization": "~14.8.3", - "expo-notifications": "~0.27.6", - "expo-splash-screen": "~0.26.4", - "expo-status-bar": "~1.11.1", - "expo-updates": "~0.24.10", - "expo-web-browser": "~12.8.2", - "nativewind": "^2.0.11", + "expo": "~51.0.8", + "expo-application": "~5.9.1", + "expo-build-properties": "~0.12.1", + "expo-dev-client": "~4.0.14", + "expo-device": "~6.0.2", + "expo-font": "~12.0.5", + "expo-linear-gradient": "~13.0.2", + "expo-localization": "~15.0.3", + "expo-notifications": "~0.28.3", + "expo-splash-screen": "~0.27.4", + "expo-status-bar": "~1.12.1", + "expo-updates": "~0.25.14", + "expo-web-browser": "~13.0.3", + "nativewind": "^4.0.36", "react": "18.2.0", "react-dom": "18.2.0", - "react-native": "0.73.4", - "react-native-dotenv": "^3.4.8", - "react-native-gesture-handler": "~2.14.0", - "react-native-pager-view": "6.2.3", - "react-native-reanimated": "~3.6.2", - "react-native-safe-area-context": "4.8.2", - "react-native-screens": "~3.29.0", - "react-native-svg": "^14.1.0", + "react-native": "0.74.1", + "react-native-gesture-handler": "~2.16.1", + "react-native-pager-view": "6.3.0", + "react-native-reanimated": "~3.10.1", + "react-native-safe-area-context": "4.10.1", + "react-native-screens": "3.31.1", + "react-native-svg": "15.2.0", "react-native-tab-view": "^3.3.4", "react-native-web": "~0.19.6", "rn-bounceable": "^1.2.0", "rn-navio": "0.0.6", "rollbar-react-native": "^0.9.3", - "sentry-expo": "~7.1.0", "zod": "3.21.4", "zustand": "^4.3.3" }, "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-typescript": "^7.18.6", - "@expo/config-plugins": "~7.2.2", - "@expo/webpack-config": "^19.0.0", + "@expo/config-plugins": "~8.0.0", "@react-native-community/eslint-config": "2.0.0", - "@tanstack/eslint-plugin-query": "^5.17.20", + "@tanstack/eslint-plugin-query": "5.35.6", "@types/i18n-js": "^3.8.3", "@types/lodash": "^4.14.185", "@types/react": "~18.2.14", - "@types/react-dom": "~18.0.10", + "@types/react-dom": "~18.2.25", "@typescript-eslint/eslint-plugin": "^5.37.0", "@typescript-eslint/parser": "^5.37.0", "babel-plugin-module-resolver": "^5.0.0", @@ -97,8 +94,8 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react-native": "^4.1.0", "prettier": "^2.7.1", - "tailwindcss": "3.3.0", - "typescript": "^5.3.3" + "tailwindcss": "^3.4.1", + "typescript": "~5.3.3" }, "resolutions": { "@types/react": "18.0.0", diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/Button.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/Button.tsx new file mode 100644 index 000000000..a4a4f2ba1 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/Button.tsx @@ -0,0 +1,107 @@ +import React, { useMemo } from 'react' +import { + ActivityIndicator, + Platform, + StyleProp, + View, + ViewStyle, + TouchableNativeFeedback, +} from 'react-native' +import { BounceableProps } from 'rn-bounceable' +import { Text } from './text' +import colors from '@utils/colors' +import { BounceableWind } from './styled' + +export type BButtonVariant = 'primary' | 'primary-transparent' | 'secondary' + +type Props = { + label?: string + onPress?: PureFunc + variant?: BButtonVariant + buttonProps?: BounceableProps + /** + * Override the default style of the button + */ + buttonContainerStyle?: StyleProp + className?: string + containerClassName?: string + isLoading?: boolean + children?: React.ReactNode + /* + * Bounceable doesn't work well inside a modal on Android, so we can replace it with TouchableNativeFeedback + */ + replaceTouchableComponent?: boolean + textClassName?: string + leftIcon?: React.ReactNode + rightIcon?: React.ReactNode +} + +const mapButtonVariantToStyle: Record< + BButtonVariant, + { background: string; disabled: string; text: string } +> = { + primary: { + background: 'bg-orange-160', + disabled: 'bg-orange-60', + text: 'text-white text-lg text-center', + }, + 'primary-transparent': { + background: 'bg-transparent border border-primary-orange', + disabled: 'opacity-50', + text: 'text-primary-orange text-lg text-center', + }, + secondary: { + background: 'bg-transparent border border-grey-280', + disabled: 'opacity-50', + text: 'text-grey-280 text-lg text-center', + }, +} + +export const BButton: React.FC = ({ + label, + onPress, + buttonProps, + variant = 'primary', + buttonContainerStyle = undefined, + containerClassName = '', + isLoading = false, + children, + replaceTouchableComponent, + textClassName, + leftIcon, + rightIcon, +}) => { + const variantStyle = useMemo(() => { + return mapButtonVariantToStyle[variant] + }, [variant]) + + const TouchComponent = + Platform.OS === 'android' && replaceTouchableComponent + ? TouchableNativeFeedback + : BounceableWind + + return ( + + + {isLoading ? ( + + ) : children ? ( + children + ) : ( + + {leftIcon} + {label} + {rightIcon} + + )} + + + ) +} \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/styled.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/styled.tsx index 3347e1bc8..d43cb4103 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/styled.tsx +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/components/styled.tsx @@ -1,22 +1,9 @@ -import { styled } from 'nativewind' -import { KeyboardAvoidingView, ScrollView } from 'react-native' +import { cssInterop } from 'nativewind' +import type { FC } from 'react' import { Bounceable } from 'rn-bounceable' -export const ScrollViewWind = styled(ScrollView, { - props: { - contentContainerStyle: true, - }, +cssInterop(Bounceable, { + contentContainerClassName: 'contentContainerStyle', }) -export const BounceableWind = styled(Bounceable, { - props: { - contentContainerStyle: true, - }, -}) - -export const KeyboardAvoidingViewWind = styled(KeyboardAvoidingView, { - props: { - style: true, - contentContainerStyle: true, - }, -}) +export const BounceableWind = Bounceable as FC diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/index.d.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/index.d.ts index b8bae3ed2..8a8510f3b 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/index.d.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/index.d.ts @@ -1 +1,2 @@ -declare module '*.png'; \ No newline at end of file +declare module '*.png' +declare module '@utils/colors' \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/ComponentsPreview.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/ComponentsPreview.tsx new file mode 100644 index 000000000..151ebfacd --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/ComponentsPreview.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import {View } from 'react-native' + +import { Text } from '@components/text' +import { MultiPlatformSafeAreaView } from '@components/multi-platform-safe-area-view' +import { BButton } from '@components/Button' + + +export function ComponentsPreview(){ + return ( + + + + Components Preview + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/login.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/login.tsx index 6b872e4f2..c56be3f4a 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/login.tsx +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/login.tsx @@ -1,21 +1,13 @@ import { MultiPlatformSafeAreaView } from '@components/multi-platform-safe-area-view' -import { ScrollViewWind } from '@components/styled' +import { BounceableWind } from '@components/styled' import { Text } from '@components/text' import { TextFormField } from '@components/text-form-field' import { LoginForm, LoginFormInputs, TLoginForm, userApi } from '@services/user' import { useAuth } from '@stores/auth' import { FormProvider, useTnForm } from '@thinknimble/tn-forms-react' -import { styled } from 'nativewind' -import { View } from 'react-native' -import { Bounceable } from 'rn-bounceable' +import { ScrollView, View } from 'react-native' import { getNavio } from '../routes' -const BounceableWind = styled(Bounceable, { - props: { - contentContainerStyle: true, - }, -}) - const LoginInner = () => { const { form, overrideForm } = useTnForm() const { changeToken, changeUserId } = useAuth.use.actions() @@ -46,12 +38,12 @@ const LoginInner = () => { Log in - + - + diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/sign-up.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/sign-up.tsx index 5fcf7afe2..77090d754 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/sign-up.tsx +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/auth/sign-up.tsx @@ -1,5 +1,5 @@ import { MultiPlatformSafeAreaView } from '@components/multi-platform-safe-area-view' -import { ScrollViewWind } from '@components/styled' +import { BounceableWind } from '@components/styled' import { Text } from '@components/text' import { TextFormField } from '@components/text-form-field' import { userApi } from '@services/user' @@ -8,17 +8,9 @@ import { useAuth } from '@stores/auth' import { useMutation } from '@tanstack/react-query' import { MustMatchValidator } from '@thinknimble/tn-forms' import { FormProvider, useTnForm } from '@thinknimble/tn-forms-react' -import { styled } from 'nativewind' -import { View } from 'react-native' -import { Bounceable } from 'rn-bounceable' +import { ScrollView, View } from 'react-native' import { getNavio } from '../routes' -const BounceableWind = styled(Bounceable, { - props: { - contentContainerStyle: true, - }, -}) - const InnerForm = () => { //TODO: match bootstrapper style for signup and hit backend const { form } = useTnForm() @@ -59,14 +51,14 @@ const InnerForm = () => { Sign up - + - - + + Sign Up diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/dashboard.tsx b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/dashboard.tsx index c45e5ce16..1d18f5aa0 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/dashboard.tsx +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/dashboard.tsx @@ -4,7 +4,7 @@ import React from 'react' export const DashboardScreen = () => { return ( - Dashboard + Welcom to the Dash ) } diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/routes.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/routes.ts index 7cf0524e5..b823529be 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/routes.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/screens/routes.ts @@ -6,6 +6,7 @@ import { Login, SignUp } from '@screens/auth' import { Main } from '@screens/main' import { Auth } from '@screens/auth/auth' import { DashboardScreen } from '@screens/dashboard' +import { ComponentsPreview } from '@screens/ComponentsPreview' // Default options - forcing a mobile trigger export const screenDefaultOptions = (): NativeStackNavigationOptions => ({ @@ -28,10 +29,15 @@ export const tabDefaultOptions = (): BottomTabNavigationOptions => ({ }) // NAVIO export const navio = Navio.build({ - screens: { Auth, Login, SignUp, Main, DashboardScreen }, + screens: { Auth, Login, SignUp, Main, DashboardScreen, ComponentsPreview }, stacks: { AuthStack: ['Auth'], MainStack: ['DashboardScreen'], + /** + * Set me as the root to see the components preview + */ + PreviewStack: ['ComponentsPreview'], + }, root: 'AuthStack', defaultOptions: { diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/axios-instance.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/axios-instance.ts index 797b59a4b..f79ef7f39 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/axios-instance.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/axios-instance.ts @@ -2,10 +2,14 @@ import axios, { AxiosError } from 'axios' import { useAuth } from '@stores/auth' import Config from '../../Config' +const baseUrl = + Config?.backendServerUrl && Config?.backendServerUrl.endsWith('/') + ? Config?.backendServerUrl.substring(0, Config?.backendServerUrl.length - 1) + : `${Config?.backendServerUrl}` export const axiosInstance = axios.create({ - baseURL: `${Config?.backendServerUrl}/api`, + baseURL: `${baseUrl}/api`, }) - +console.log('axiosInstance', `${baseUrl}/api`) axiosInstance.interceptors.request.use( async (config) => { const { token } = useAuth.getState() diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/user/api.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/user/api.ts index 51362e78f..5481e9267 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/user/api.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/services/user/api.ts @@ -3,51 +3,43 @@ import { z } from 'zod' import { axiosInstance } from '../axios-instance' import { forgotPasswordShape, loginShape, userCreateShape, userShape } from './models' -const login = createCustomServiceCall( - { - inputShape: loginShape, - outputShape: userShape, - }, - async ({ client, input, utils }) => { +const login = createCustomServiceCall({ + inputShape: loginShape, + outputShape: userShape, + cb: async ({ client, input, utils }) => { const res = await client.post('/login/', utils.toApi(input)) return utils.fromApi(res.data) }, -) +}) -const requestPasswordResetCode = createCustomServiceCall( - { - inputShape: forgotPasswordShape, - }, - async ({ client, input }) => { +const requestPasswordResetCode = createCustomServiceCall({ + inputShape: forgotPasswordShape, + cb: async ({ client, input }) => { await client.get(`/password/reset/code/${input.email}/`) }, -) +}) -const resetPassword = createCustomServiceCall( - { - inputShape: { email: z.string().email(), code: z.string(), password: z.string() }, - outputShape: userShape, - }, - async ({ client, input, utils }) => { +const resetPassword = createCustomServiceCall({ + inputShape: { email: z.string().email(), code: z.string(), password: z.string() }, + outputShape: userShape, + cb: async ({ client, input, utils }) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { email, ...rest } = utils.toApi(input) const res = await client.post(`/password/reset/code/confirm/${input.email}/`, rest) return utils.fromApi(res.data) }, -) +}) const logout = createCustomServiceCall(async ({ client }) => { return client.post(`/logout/`) }) -export const userApi = createApi( - { - client: axiosInstance, - baseUri: '/users/', - models: { - create: userCreateShape, - entity: userShape, - }, +export const userApi = createApi({ + client: axiosInstance, + baseUri: '/users/', + models: { + create: userCreateShape, + entity: userShape, }, - { login, requestPasswordResetCode, resetPassword ,logout }, -) + customCalls: { login, requestPasswordResetCode, resetPassword, logout }, +}) diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/colors.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/colors.ts new file mode 100644 index 000000000..9b82605c5 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/colors.ts @@ -0,0 +1,73 @@ +const colors = { + primary: { + sage: '#C9DDC9', + orange: '#F68F58', + yellow: '#FFDA41', + green: '#D0EB62', + grey: '#F4F2EE', + }, + orange: { + 40: '#FEE7E0', + 60: '#FDC3B2', + 80: '#FB9F83', + 100: '#F68F58', + 120: '#F7694A', + 140: '#E83C07', + 160: '#B93006', + 180: '#8B2404', + 200: '#5D1803', + 220: '#2E0C01', + }, + sage: { + 80: '#E4EEE4', + 100: '#D2E2D0', + 120: '#AFCDAD', + 140: '#94BC92', + 160: '#79AB77', + 180: '#5E955C', + 200: '#4C784A', + 220: '#395A37', + 240: '#263C25', + 260: '#131E12', + }, + yellow: { + 0: '#FFF6CF', + 20: '#FFEC9F', + 40: '#FFE36F', + 60: '#FFDA41', + 80: '#FFD114', + 100: '#F0BC0F', + 120: '#B79300', + 140: '#997802', + 160: '#5C4A00', + 180: '#2E2500', + }, + green: { + 40: '#F4FFCF', + 60: '#E8F5B1', + 80: '#DCF089', + 100: '#D0EB62', + 120: '#C3E638', + 140: '#AFD31B', + 160: '#8CA916', + 180: '#697F10', + 200: '#46540B', + 220: '#232A05', + }, + grey: { + 100: '#F4F2EE', + 120: '#F4F2EE', + 140: '#E2DDD3', + 160: '#D6D5C8', + 180: '#B7B2A9', + 200: '#9F9890', + 220: '#79766F', + 240: '#585651', + 260: '#3D3A37', + 280: '#1E1D1A', + }, + white: '#FFFFFF', + black: '#000000', + } + + module.exports = colors \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/sentry.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/sentry.ts index ea27fe80c..9b7eb0a4f 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/sentry.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/sentry.ts @@ -1,12 +1,11 @@ -import * as Sentry from 'sentry-expo' +import * as Sentry from '@sentry/react-native' import Config from '../../Config' export const initSentry = () => { Sentry.init({ dsn: Config.sentryDSN, - enableInExpoDevelopment: true, debug: true, // If `true`, Sentry will try to print out useful debugging information if something goes wrong with sending the event. Set it to `false` in production }) - Sentry.Native.captureException('Sentry Exception') + Sentry.captureException('Sentry Exception') } diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/types/index.d.ts b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/types/index.d.ts index caf3e4deb..f866e5606 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/types/index.d.ts +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/src/utils/types/index.d.ts @@ -1,26 +1,26 @@ // `stores` layer interface IStore { - hydrate?: () => PVoid; + hydrate?: () => PVoid } -type StoreDefaultKeys = 'set' | 'setMany' | 'hydrate'; -type StoreKeysOf = keyof Omit; +type StoreDefaultKeys = 'set' | 'setMany' | 'hydrate' +type StoreKeysOf = keyof Omit // `services` layer interface IService { - init: () => PVoid; + init: () => PVoid } // System -type PVoid = Promise; -type AnyObj = Record; -type PureFunc = () => void; -type PureFuncAsync = () => PVoid; -type PureFuncArg = (value?: T) => void; +type PVoid = Promise +type AnyObj = Record +type PureFunc = () => void +type PureFuncAsync = () => PVoid +type PureFuncArg = (value?: T) => void // Design system type ThemeColors = { - textColor: string; - bgColor: string; - bg2Color: string; -}; + textColor: string + bgColor: string + bg2Color: string +} \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/tailwind.config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/tailwind.config.js index 4b05569cb..2955ac39e 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/tailwind.config.js +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/tailwind.config.js @@ -1,12 +1,12 @@ /** @type {import('tailwindcss').Config} */ +const colors = require('./src/utils/colors') module.exports = { content: ['./App.{js,jsx,ts,tsx}', './src/**/*.{js,jsx,ts,tsx}'], + presets: [require('nativewind/preset')], theme: { extend: { - colors: { - primary: 'rgb(217,58,0)', - }, + colors, }, }, plugins: [], diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/tsconfig.json b/{{cookiecutter.project_slug}}/clients/mobile/react-native/tsconfig.json index b1452c724..1bc52e85a 100644 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/tsconfig.json +++ b/{{cookiecutter.project_slug}}/clients/mobile/react-native/tsconfig.json @@ -28,7 +28,6 @@ "babel.config.js", "metro.config.js", "jest.config.js", - "webpack.config.js" ], "extends": "expo/tsconfig.base" } diff --git a/{{cookiecutter.project_slug}}/clients/mobile/react-native/webpack.config.js b/{{cookiecutter.project_slug}}/clients/mobile/react-native/webpack.config.js deleted file mode 100644 index 4164a37c4..000000000 --- a/{{cookiecutter.project_slug}}/clients/mobile/react-native/webpack.config.js +++ /dev/null @@ -1,13 +0,0 @@ -const createExpoWebpackConfigAsync = require('@expo/webpack-config'); - -module.exports = async function (env, argv) { - const config = await createExpoWebpackConfigAsync( - { - ...env, - babel: {dangerouslyAddModulePathsToTranspile: ['rn-bounceable']}, - }, - argv, - ); - - return config; -}; diff --git a/{{cookiecutter.project_slug}}/clients/web/react/package.json b/{{cookiecutter.project_slug}}/clients/web/react/package.json index 4f1a15e56..1e9b4c404 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/package.json +++ b/{{cookiecutter.project_slug}}/clients/web/react/package.json @@ -19,7 +19,7 @@ "@tanstack/react-query": "^5.15.0", "@thinknimble/tn-forms": "^3.1.8", "@thinknimble/tn-forms-react": "^1.0.3", - "@thinknimble/tn-models": "^2.3.0", + "@thinknimble/tn-models": "^3.0.0", "axios": "^1.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -29,7 +29,7 @@ "zustand": "^4.4.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.17.7", + "@tanstack/eslint-plugin-query": "5.35.6", "@testing-library/jest-dom": "^6.2.0", "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.4.3", diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/pages/sign-up.tsx b/{{cookiecutter.project_slug}}/clients/web/react/src/pages/sign-up.tsx index 708d0003c..c12a993ba 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/pages/sign-up.tsx +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/pages/sign-up.tsx @@ -4,14 +4,16 @@ import { FormProvider, useTnForm } from '@thinknimble/tn-forms-react' import { FormEvent, useState } from 'react' import { Link, useNavigate } from 'react-router-dom' import { Button } from 'src/components/button' -import { ErrorsList } from 'src/components/errors' +import { ErrorMessage, ErrorsList } from 'src/components/errors' import { Input } from 'src/components/input' import { userApi } from 'src/services/user' import { AccountForm, AccountFormInputs, TAccountForm } from 'src/services/user/forms' +import { isAxiosError } from 'axios' +import { GENERIC_REQUEST_ERROR } from 'src/utils/constants' import { useAuth } from 'src/stores/auth' function SignUpInner() { - const [error, setError] = useState('') + const [errors, setErrors] = useState([]) const { changeToken, changeUserId } = useAuth.use.actions() const { form, createFormFieldChangeHandler, validate } = useTnForm() const navigate = useNavigate() @@ -25,8 +27,17 @@ function SignUpInner() { navigate('/home') }, onError(e: any) { - if (e?.message === 'Please enter valid credentials') { - console.log(e) + console.error(e) + if (isAxiosError(e)) { + if (e.response?.data && typeof e.response.data === 'object') { + setErrors(Object.values(e.response.data)) + return + } + if (e.message) { + setErrors([e.message]) + } else { + setErrors([GENERIC_REQUEST_ERROR]) + } } }, }) @@ -105,7 +116,9 @@ function SignUpInner() { - + {errors.length + ? errors.map((e, idx) => {e}) + : null}

Already have an account?

diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/api.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/api.ts index 347742bc3..7a5d5bacc 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/api.ts +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/api.ts @@ -9,61 +9,51 @@ import { userShapeWithToken, } from './models' -const login = createCustomServiceCall( - { - inputShape: loginShape, - outputShape: userShapeWithToken, - }, - async ({ client, input, utils }) => { +const login = createCustomServiceCall({ + inputShape: loginShape, + outputShape: userShapeWithToken, + cb: async ({ client, input, utils }) => { const res = await client.post('/login/', utils.toApi(input)) return utils.fromApi(res.data) }, -) +}) -const signup = createCustomServiceCall( - { - inputShape: userCreateShape, - outputShape: userShapeWithToken, - }, - async ({ client, input, utils }) => { +const signup = createCustomServiceCall({ + inputShape: userCreateShape, + outputShape: userShapeWithToken, + cb: async ({ client, input, utils }) => { const res = await client.post('/users/', utils.toApi(input)) return utils.fromApi(res.data) }, -) +}) const logout = createCustomServiceCall(async ({ client }) => { return client.post(`/logout/`) }) -const requestPasswordReset = createCustomServiceCall( - { - inputShape: forgotPasswordShape, - }, - async ({ client, input }) => { +const requestPasswordReset = createCustomServiceCall({ + inputShape: forgotPasswordShape, + cb: async ({ client, input }) => { await client.post(`/password/reset/`, input) }, -) +}) -const resetPassword = createCustomServiceCall( - { - inputShape: { userId: z.string(), token: z.string(), password: z.string() }, - outputShape: userShape, - }, - async ({ client, input, utils }) => { +const resetPassword = createCustomServiceCall({ + inputShape: { userId: z.string(), token: z.string(), password: z.string() }, + outputShape: userShape, + cb: async ({ client, input, utils }) => { const { token, user_id, ...rest } = utils.toApi(input) const res = await client.post(`/password/reset/confirm/${user_id}/${token}/`, rest) return utils.fromApi(res.data) }, -) +}) -export const userApi = createApi( - { - client: axiosInstance, - baseUri: '/users/', - models: { - create: userCreateShape, - entity: userShape, - }, - }, - { login, logout, requestPasswordReset, resetPassword, signup }, -) +export const userApi = createApi({ + client: axiosInstance, + baseUri: '/users/', + models: { + create: userCreateShape, + entity: userShape, + }, + customCalls: { login, logout, requestPasswordReset, resetPassword, signup }, +}) diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/hooks.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/hooks.ts index 080999880..29ad7a0e1 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/hooks.ts +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/hooks.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query' import { useAuth } from 'src/stores/auth' -import { userApi } from './api' import { useEffect } from 'react' import { HttpStatusCode, isAxiosError } from 'axios' import { useNavigate } from 'react-router-dom' +import { userQueries } from './queries' export const useUser = () => { const { clearAuth } = useAuth.use.actions() @@ -11,14 +11,7 @@ export const useUser = () => { const { writeUserInStorage } = useAuth.use.actions() const navigate = useNavigate() - const query = useQuery({ - queryKey: ['user', userId], - queryFn: async () => { - const user = await userApi.retrieve(userId) - return user - }, - enabled: Boolean(userId), - }) + const query = useQuery(userQueries.retrieve(userId)) useEffect(() => { //sync with localStorage diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/index.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/index.ts index 7310c6f4d..43a250bac 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/index.ts +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/index.ts @@ -2,3 +2,4 @@ export * from './forms' export * from './api' export * from './models' export * from './hooks' +export * from './queries' \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/queries.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/queries.ts new file mode 100644 index 000000000..1b5155f89 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/services/user/queries.ts @@ -0,0 +1,18 @@ +import { queryOptions } from '@tanstack/react-query' +import { userApi } from './api' + +/** + * @link https://tkdodo.eu/blog/the-query-options-api?ck_subscriber_id=1819338276 + * Create query factories for a more type safe solution of the queries across the app. This way whichever invalidation that has to happen in the resource can be done with `queryClient.invalidateQueries(userQueries.all())` or any other of the query factory's functions. + * In this case we do have a very simple example for the user query but depending on the resource we may want to add more query factories + */ + +export const userQueries = { + all: () => ['users'], + retrieve: (id: string) => + queryOptions({ + queryKey: [...userQueries.all(), id], + queryFn: () => userApi.retrieve(id), + enabled: Boolean(id), + }), +} diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/stores/auth.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/stores/auth.ts index 7bf4617f7..b618e410d 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/stores/auth.ts +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/stores/auth.ts @@ -1,6 +1,6 @@ import { create } from 'zustand' import { persist } from 'zustand/middleware' -import { User, userApi } from '../services/user' +import { User, userApi, userQueries } from '../services/user' import { queryClient } from '../utils/query-client' import { createSelectors } from './utils' @@ -93,5 +93,5 @@ export const logout = async () => { console.error } useAuth.getState().actions.clearAuth() - queryClient.invalidateQueries({ queryKey: ['user'] }) + queryClient.invalidateQueries({ queryKey: userQueries.all() }) } diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/utils/constants.ts b/{{cookiecutter.project_slug}}/clients/web/react/src/utils/constants.ts new file mode 100644 index 000000000..07516a308 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/utils/constants.ts @@ -0,0 +1 @@ +export const GENERIC_REQUEST_ERROR = 'Something went wrong. Please try again later' \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/web/react/src/utils/routes.tsx b/{{cookiecutter.project_slug}}/clients/web/react/src/utils/routes.tsx index 0eeb4ac29..5fff19ba2 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/src/utils/routes.tsx +++ b/{{cookiecutter.project_slug}}/clients/web/react/src/utils/routes.tsx @@ -21,7 +21,7 @@ const AuthRoutes = () => { } /> } /> } /> - } /> + } /> } /> diff --git a/{{cookiecutter.project_slug}}/clients/web/react/tsconfig.json b/{{cookiecutter.project_slug}}/clients/web/react/tsconfig.json index d5eb69d49..6b33553df 100644 --- a/{{cookiecutter.project_slug}}/clients/web/react/tsconfig.json +++ b/{{cookiecutter.project_slug}}/clients/web/react/tsconfig.json @@ -29,7 +29,8 @@ ], "exclude": [ "node_modules", - "tests" + "tests", + "vite.config.ts" ], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/{{cookiecutter.project_slug}}/clients/web/vue3/.eslintrc.cjs b/{{cookiecutter.project_slug}}/clients/web/vue3/.eslintrc.cjs index 4d32be1c0..0bdb1c1cf 100644 --- a/{{cookiecutter.project_slug}}/clients/web/vue3/.eslintrc.cjs +++ b/{{cookiecutter.project_slug}}/clients/web/vue3/.eslintrc.cjs @@ -35,5 +35,6 @@ module.exports = { 'vue/no-v-model-argument': process.env.NODE_ENV ? 'warn' : 'off', 'vue/multi-word-component-names': process.env.NODE_ENV ? 'warn' : 'off', '@typescript-eslint/no-unused-vars': 'warn', + 'prettier/prettier': 'off' }, } diff --git a/{{cookiecutter.project_slug}}/clients/web/vue3/global.d.ts b/{{cookiecutter.project_slug}}/clients/web/vue3/global.d.ts new file mode 100644 index 000000000..a399b8741 --- /dev/null +++ b/{{cookiecutter.project_slug}}/clients/web/vue3/global.d.ts @@ -0,0 +1,7 @@ +declare module '@thinknimble/vue3-alert-alert'; +declare module "vuex" { + export * from "vuex/types/index.d.ts"; + export * from "vuex/types/helpers.d.ts"; + export * from "vuex/types/logger.d.ts"; + export * from "vuex/types/vue.d.ts"; + } \ No newline at end of file diff --git a/{{cookiecutter.project_slug}}/clients/web/vue3/package.json b/{{cookiecutter.project_slug}}/clients/web/vue3/package.json index d05e6a0d4..1d298483e 100644 --- a/{{cookiecutter.project_slug}}/clients/web/vue3/package.json +++ b/{{cookiecutter.project_slug}}/clients/web/vue3/package.json @@ -22,8 +22,10 @@ "@headlessui/vue": "1.7.16", "@heroicons/vue": "2.0.18", "@thinknimble/tn-forms": "3.1.8", - "@thinknimble/tn-models": "2.2.0", + "@thinknimble/tn-models": "^3.0.0", "@thinknimble/tn-utils": "2.0.1", + "@tanstack/vue-query": "^5.28.9", + "@thinknimble/vue3-alert-alert": "^0.0.8", "axios": "1.5.0", "js-cookie": "3.0.5", "vue": "^3.3.4", diff --git a/{{cookiecutter.project_slug}}/clients/web/vue3/src/App.vue b/{{cookiecutter.project_slug}}/clients/web/vue3/src/App.vue index 5f7316b52..428ea4464 100644 --- a/{{cookiecutter.project_slug}}/clients/web/vue3/src/App.vue +++ b/{{cookiecutter.project_slug}}/clients/web/vue3/src/App.vue @@ -1,16 +1,19 @@