├── .gitignore
├── .vscode
└── settings.json
├── Procfile
├── README.md
├── client
├── .gitignore
├── index.html
├── package.json
├── pnpm-lock.yaml
├── postcss.config.cjs
├── public
│ └── vite.svg
├── src
│ ├── App.css
│ ├── App.jsx
│ ├── api
│ │ └── tasks.api.js
│ ├── assets
│ │ └── react.svg
│ ├── components
│ │ ├── Navigation.jsx
│ │ ├── TaskCard.jsx
│ │ └── TasksList.jsx
│ ├── index.css
│ ├── main.jsx
│ └── pages
│ │ ├── TaskFormPage.jsx
│ │ └── TasksPage.jsx
├── tailwind.config.cjs
└── vite.config.js
├── django_crud_api
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
├── manage.py
├── nixpacks.toml
├── requirements.txt
├── runtime.txt
└── tasks
├── __init__.py
├── admin.py
├── apps.py
├── migrations
├── 0001_initial.py
└── __init__.py
├── models.py
├── serializer.py
├── tests.py
├── urls.py
└── views.py
/.gitignore:
--------------------------------------------------------------------------------
1 | db.sqlite3
2 | venv
3 | __pycache__
4 | staticfiles/
5 |
6 | # environment variables
7 | .env.local
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.formatting.provider": "yapf"
3 | }
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: cd client && npm install && npm run build && cd .. && python manage.py migrate && python manage.py collectstatic && gunicorn django_crud_api.wsgi
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Django React CRUD
2 |
3 | This is a simple Django React CRUD application.
4 |
5 | # Environment variables
6 |
7 | - VITE_BACKEND_URL, this is neccessary in production, it should be the url of the backend server
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "axios": "^1.3.4",
13 | "react": "^18.2.0",
14 | "react-dom": "^18.2.0",
15 | "react-hook-form": "^7.43.5",
16 | "react-hot-toast": "^2.4.0",
17 | "react-router-dom": "^6.9.0"
18 | },
19 | "devDependencies": {
20 | "@types/react": "^18.0.27",
21 | "@types/react-dom": "^18.0.10",
22 | "@vitejs/plugin-react": "^3.1.0",
23 | "autoprefixer": "^10.4.14",
24 | "postcss": "^8.4.21",
25 | "tailwindcss": "^3.2.7",
26 | "vite": "^4.1.0"
27 | }
28 | }
--------------------------------------------------------------------------------
/client/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.4
2 |
3 | specifiers:
4 | '@types/react': ^18.0.27
5 | '@types/react-dom': ^18.0.10
6 | '@vitejs/plugin-react': ^3.1.0
7 | autoprefixer: ^10.4.14
8 | axios: ^1.3.4
9 | postcss: ^8.4.21
10 | react: ^18.2.0
11 | react-dom: ^18.2.0
12 | react-hook-form: ^7.43.5
13 | react-hot-toast: ^2.4.0
14 | react-router-dom: ^6.9.0
15 | tailwindcss: ^3.2.7
16 | vite: ^4.1.0
17 |
18 | dependencies:
19 | axios: 1.3.4
20 | react: 18.2.0
21 | react-dom: 18.2.0_react@18.2.0
22 | react-hook-form: 7.43.5_react@18.2.0
23 | react-hot-toast: 2.4.0_biqbaboplfbrettd7655fr4n2y
24 | react-router-dom: 6.9.0_biqbaboplfbrettd7655fr4n2y
25 |
26 | devDependencies:
27 | '@types/react': 18.0.28
28 | '@types/react-dom': 18.0.11
29 | '@vitejs/plugin-react': 3.1.0_vite@4.1.4
30 | autoprefixer: 10.4.14_postcss@8.4.21
31 | postcss: 8.4.21
32 | tailwindcss: 3.2.7_postcss@8.4.21
33 | vite: 4.1.4
34 |
35 | packages:
36 |
37 | /@ampproject/remapping/2.2.0:
38 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
39 | engines: {node: '>=6.0.0'}
40 | dependencies:
41 | '@jridgewell/gen-mapping': 0.1.1
42 | '@jridgewell/trace-mapping': 0.3.17
43 | dev: true
44 |
45 | /@babel/code-frame/7.18.6:
46 | resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
47 | engines: {node: '>=6.9.0'}
48 | dependencies:
49 | '@babel/highlight': 7.18.6
50 | dev: true
51 |
52 | /@babel/compat-data/7.21.0:
53 | resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==}
54 | engines: {node: '>=6.9.0'}
55 | dev: true
56 |
57 | /@babel/core/7.21.0:
58 | resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==}
59 | engines: {node: '>=6.9.0'}
60 | dependencies:
61 | '@ampproject/remapping': 2.2.0
62 | '@babel/code-frame': 7.18.6
63 | '@babel/generator': 7.21.1
64 | '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0
65 | '@babel/helper-module-transforms': 7.21.2
66 | '@babel/helpers': 7.21.0
67 | '@babel/parser': 7.21.2
68 | '@babel/template': 7.20.7
69 | '@babel/traverse': 7.21.2
70 | '@babel/types': 7.21.2
71 | convert-source-map: 1.9.0
72 | debug: 4.3.4
73 | gensync: 1.0.0-beta.2
74 | json5: 2.2.3
75 | semver: 6.3.0
76 | transitivePeerDependencies:
77 | - supports-color
78 | dev: true
79 |
80 | /@babel/generator/7.21.1:
81 | resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==}
82 | engines: {node: '>=6.9.0'}
83 | dependencies:
84 | '@babel/types': 7.21.2
85 | '@jridgewell/gen-mapping': 0.3.2
86 | '@jridgewell/trace-mapping': 0.3.17
87 | jsesc: 2.5.2
88 | dev: true
89 |
90 | /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0:
91 | resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
92 | engines: {node: '>=6.9.0'}
93 | peerDependencies:
94 | '@babel/core': ^7.0.0
95 | dependencies:
96 | '@babel/compat-data': 7.21.0
97 | '@babel/core': 7.21.0
98 | '@babel/helper-validator-option': 7.21.0
99 | browserslist: 4.21.5
100 | lru-cache: 5.1.1
101 | semver: 6.3.0
102 | dev: true
103 |
104 | /@babel/helper-environment-visitor/7.18.9:
105 | resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
106 | engines: {node: '>=6.9.0'}
107 | dev: true
108 |
109 | /@babel/helper-function-name/7.21.0:
110 | resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
111 | engines: {node: '>=6.9.0'}
112 | dependencies:
113 | '@babel/template': 7.20.7
114 | '@babel/types': 7.21.2
115 | dev: true
116 |
117 | /@babel/helper-hoist-variables/7.18.6:
118 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
119 | engines: {node: '>=6.9.0'}
120 | dependencies:
121 | '@babel/types': 7.21.2
122 | dev: true
123 |
124 | /@babel/helper-module-imports/7.18.6:
125 | resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
126 | engines: {node: '>=6.9.0'}
127 | dependencies:
128 | '@babel/types': 7.21.2
129 | dev: true
130 |
131 | /@babel/helper-module-transforms/7.21.2:
132 | resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==}
133 | engines: {node: '>=6.9.0'}
134 | dependencies:
135 | '@babel/helper-environment-visitor': 7.18.9
136 | '@babel/helper-module-imports': 7.18.6
137 | '@babel/helper-simple-access': 7.20.2
138 | '@babel/helper-split-export-declaration': 7.18.6
139 | '@babel/helper-validator-identifier': 7.19.1
140 | '@babel/template': 7.20.7
141 | '@babel/traverse': 7.21.2
142 | '@babel/types': 7.21.2
143 | transitivePeerDependencies:
144 | - supports-color
145 | dev: true
146 |
147 | /@babel/helper-plugin-utils/7.20.2:
148 | resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
149 | engines: {node: '>=6.9.0'}
150 | dev: true
151 |
152 | /@babel/helper-simple-access/7.20.2:
153 | resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
154 | engines: {node: '>=6.9.0'}
155 | dependencies:
156 | '@babel/types': 7.21.2
157 | dev: true
158 |
159 | /@babel/helper-split-export-declaration/7.18.6:
160 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
161 | engines: {node: '>=6.9.0'}
162 | dependencies:
163 | '@babel/types': 7.21.2
164 | dev: true
165 |
166 | /@babel/helper-string-parser/7.19.4:
167 | resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
168 | engines: {node: '>=6.9.0'}
169 | dev: true
170 |
171 | /@babel/helper-validator-identifier/7.19.1:
172 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
173 | engines: {node: '>=6.9.0'}
174 | dev: true
175 |
176 | /@babel/helper-validator-option/7.21.0:
177 | resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
178 | engines: {node: '>=6.9.0'}
179 | dev: true
180 |
181 | /@babel/helpers/7.21.0:
182 | resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==}
183 | engines: {node: '>=6.9.0'}
184 | dependencies:
185 | '@babel/template': 7.20.7
186 | '@babel/traverse': 7.21.2
187 | '@babel/types': 7.21.2
188 | transitivePeerDependencies:
189 | - supports-color
190 | dev: true
191 |
192 | /@babel/highlight/7.18.6:
193 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
194 | engines: {node: '>=6.9.0'}
195 | dependencies:
196 | '@babel/helper-validator-identifier': 7.19.1
197 | chalk: 2.4.2
198 | js-tokens: 4.0.0
199 | dev: true
200 |
201 | /@babel/parser/7.21.2:
202 | resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==}
203 | engines: {node: '>=6.0.0'}
204 | hasBin: true
205 | dependencies:
206 | '@babel/types': 7.21.2
207 | dev: true
208 |
209 | /@babel/plugin-transform-react-jsx-self/7.21.0_@babel+core@7.21.0:
210 | resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==}
211 | engines: {node: '>=6.9.0'}
212 | peerDependencies:
213 | '@babel/core': ^7.0.0-0
214 | dependencies:
215 | '@babel/core': 7.21.0
216 | '@babel/helper-plugin-utils': 7.20.2
217 | dev: true
218 |
219 | /@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.21.0:
220 | resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==}
221 | engines: {node: '>=6.9.0'}
222 | peerDependencies:
223 | '@babel/core': ^7.0.0-0
224 | dependencies:
225 | '@babel/core': 7.21.0
226 | '@babel/helper-plugin-utils': 7.20.2
227 | dev: true
228 |
229 | /@babel/template/7.20.7:
230 | resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
231 | engines: {node: '>=6.9.0'}
232 | dependencies:
233 | '@babel/code-frame': 7.18.6
234 | '@babel/parser': 7.21.2
235 | '@babel/types': 7.21.2
236 | dev: true
237 |
238 | /@babel/traverse/7.21.2:
239 | resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==}
240 | engines: {node: '>=6.9.0'}
241 | dependencies:
242 | '@babel/code-frame': 7.18.6
243 | '@babel/generator': 7.21.1
244 | '@babel/helper-environment-visitor': 7.18.9
245 | '@babel/helper-function-name': 7.21.0
246 | '@babel/helper-hoist-variables': 7.18.6
247 | '@babel/helper-split-export-declaration': 7.18.6
248 | '@babel/parser': 7.21.2
249 | '@babel/types': 7.21.2
250 | debug: 4.3.4
251 | globals: 11.12.0
252 | transitivePeerDependencies:
253 | - supports-color
254 | dev: true
255 |
256 | /@babel/types/7.21.2:
257 | resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==}
258 | engines: {node: '>=6.9.0'}
259 | dependencies:
260 | '@babel/helper-string-parser': 7.19.4
261 | '@babel/helper-validator-identifier': 7.19.1
262 | to-fast-properties: 2.0.0
263 | dev: true
264 |
265 | /@esbuild/android-arm/0.16.17:
266 | resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
267 | engines: {node: '>=12'}
268 | cpu: [arm]
269 | os: [android]
270 | requiresBuild: true
271 | dev: true
272 | optional: true
273 |
274 | /@esbuild/android-arm64/0.16.17:
275 | resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
276 | engines: {node: '>=12'}
277 | cpu: [arm64]
278 | os: [android]
279 | requiresBuild: true
280 | dev: true
281 | optional: true
282 |
283 | /@esbuild/android-x64/0.16.17:
284 | resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
285 | engines: {node: '>=12'}
286 | cpu: [x64]
287 | os: [android]
288 | requiresBuild: true
289 | dev: true
290 | optional: true
291 |
292 | /@esbuild/darwin-arm64/0.16.17:
293 | resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
294 | engines: {node: '>=12'}
295 | cpu: [arm64]
296 | os: [darwin]
297 | requiresBuild: true
298 | dev: true
299 | optional: true
300 |
301 | /@esbuild/darwin-x64/0.16.17:
302 | resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
303 | engines: {node: '>=12'}
304 | cpu: [x64]
305 | os: [darwin]
306 | requiresBuild: true
307 | dev: true
308 | optional: true
309 |
310 | /@esbuild/freebsd-arm64/0.16.17:
311 | resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
312 | engines: {node: '>=12'}
313 | cpu: [arm64]
314 | os: [freebsd]
315 | requiresBuild: true
316 | dev: true
317 | optional: true
318 |
319 | /@esbuild/freebsd-x64/0.16.17:
320 | resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
321 | engines: {node: '>=12'}
322 | cpu: [x64]
323 | os: [freebsd]
324 | requiresBuild: true
325 | dev: true
326 | optional: true
327 |
328 | /@esbuild/linux-arm/0.16.17:
329 | resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
330 | engines: {node: '>=12'}
331 | cpu: [arm]
332 | os: [linux]
333 | requiresBuild: true
334 | dev: true
335 | optional: true
336 |
337 | /@esbuild/linux-arm64/0.16.17:
338 | resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
339 | engines: {node: '>=12'}
340 | cpu: [arm64]
341 | os: [linux]
342 | requiresBuild: true
343 | dev: true
344 | optional: true
345 |
346 | /@esbuild/linux-ia32/0.16.17:
347 | resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
348 | engines: {node: '>=12'}
349 | cpu: [ia32]
350 | os: [linux]
351 | requiresBuild: true
352 | dev: true
353 | optional: true
354 |
355 | /@esbuild/linux-loong64/0.16.17:
356 | resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
357 | engines: {node: '>=12'}
358 | cpu: [loong64]
359 | os: [linux]
360 | requiresBuild: true
361 | dev: true
362 | optional: true
363 |
364 | /@esbuild/linux-mips64el/0.16.17:
365 | resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
366 | engines: {node: '>=12'}
367 | cpu: [mips64el]
368 | os: [linux]
369 | requiresBuild: true
370 | dev: true
371 | optional: true
372 |
373 | /@esbuild/linux-ppc64/0.16.17:
374 | resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
375 | engines: {node: '>=12'}
376 | cpu: [ppc64]
377 | os: [linux]
378 | requiresBuild: true
379 | dev: true
380 | optional: true
381 |
382 | /@esbuild/linux-riscv64/0.16.17:
383 | resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
384 | engines: {node: '>=12'}
385 | cpu: [riscv64]
386 | os: [linux]
387 | requiresBuild: true
388 | dev: true
389 | optional: true
390 |
391 | /@esbuild/linux-s390x/0.16.17:
392 | resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
393 | engines: {node: '>=12'}
394 | cpu: [s390x]
395 | os: [linux]
396 | requiresBuild: true
397 | dev: true
398 | optional: true
399 |
400 | /@esbuild/linux-x64/0.16.17:
401 | resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
402 | engines: {node: '>=12'}
403 | cpu: [x64]
404 | os: [linux]
405 | requiresBuild: true
406 | dev: true
407 | optional: true
408 |
409 | /@esbuild/netbsd-x64/0.16.17:
410 | resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
411 | engines: {node: '>=12'}
412 | cpu: [x64]
413 | os: [netbsd]
414 | requiresBuild: true
415 | dev: true
416 | optional: true
417 |
418 | /@esbuild/openbsd-x64/0.16.17:
419 | resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
420 | engines: {node: '>=12'}
421 | cpu: [x64]
422 | os: [openbsd]
423 | requiresBuild: true
424 | dev: true
425 | optional: true
426 |
427 | /@esbuild/sunos-x64/0.16.17:
428 | resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
429 | engines: {node: '>=12'}
430 | cpu: [x64]
431 | os: [sunos]
432 | requiresBuild: true
433 | dev: true
434 | optional: true
435 |
436 | /@esbuild/win32-arm64/0.16.17:
437 | resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
438 | engines: {node: '>=12'}
439 | cpu: [arm64]
440 | os: [win32]
441 | requiresBuild: true
442 | dev: true
443 | optional: true
444 |
445 | /@esbuild/win32-ia32/0.16.17:
446 | resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
447 | engines: {node: '>=12'}
448 | cpu: [ia32]
449 | os: [win32]
450 | requiresBuild: true
451 | dev: true
452 | optional: true
453 |
454 | /@esbuild/win32-x64/0.16.17:
455 | resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
456 | engines: {node: '>=12'}
457 | cpu: [x64]
458 | os: [win32]
459 | requiresBuild: true
460 | dev: true
461 | optional: true
462 |
463 | /@jridgewell/gen-mapping/0.1.1:
464 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
465 | engines: {node: '>=6.0.0'}
466 | dependencies:
467 | '@jridgewell/set-array': 1.1.2
468 | '@jridgewell/sourcemap-codec': 1.4.14
469 | dev: true
470 |
471 | /@jridgewell/gen-mapping/0.3.2:
472 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
473 | engines: {node: '>=6.0.0'}
474 | dependencies:
475 | '@jridgewell/set-array': 1.1.2
476 | '@jridgewell/sourcemap-codec': 1.4.14
477 | '@jridgewell/trace-mapping': 0.3.17
478 | dev: true
479 |
480 | /@jridgewell/resolve-uri/3.1.0:
481 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
482 | engines: {node: '>=6.0.0'}
483 | dev: true
484 |
485 | /@jridgewell/set-array/1.1.2:
486 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
487 | engines: {node: '>=6.0.0'}
488 | dev: true
489 |
490 | /@jridgewell/sourcemap-codec/1.4.14:
491 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
492 | dev: true
493 |
494 | /@jridgewell/trace-mapping/0.3.17:
495 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
496 | dependencies:
497 | '@jridgewell/resolve-uri': 3.1.0
498 | '@jridgewell/sourcemap-codec': 1.4.14
499 | dev: true
500 |
501 | /@nodelib/fs.scandir/2.1.5:
502 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
503 | engines: {node: '>= 8'}
504 | dependencies:
505 | '@nodelib/fs.stat': 2.0.5
506 | run-parallel: 1.2.0
507 | dev: true
508 |
509 | /@nodelib/fs.stat/2.0.5:
510 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
511 | engines: {node: '>= 8'}
512 | dev: true
513 |
514 | /@nodelib/fs.walk/1.2.8:
515 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
516 | engines: {node: '>= 8'}
517 | dependencies:
518 | '@nodelib/fs.scandir': 2.1.5
519 | fastq: 1.15.0
520 | dev: true
521 |
522 | /@remix-run/router/1.4.0:
523 | resolution: {integrity: sha512-BJ9SxXux8zAg991UmT8slpwpsd31K1dHHbD3Ba4VzD+liLQ4WAMSxQp2d2ZPRPfN0jN2NPRowcSSoM7lCaF08Q==}
524 | engines: {node: '>=14'}
525 | dev: false
526 |
527 | /@types/prop-types/15.7.5:
528 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
529 | dev: true
530 |
531 | /@types/react-dom/18.0.11:
532 | resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
533 | dependencies:
534 | '@types/react': 18.0.28
535 | dev: true
536 |
537 | /@types/react/18.0.28:
538 | resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==}
539 | dependencies:
540 | '@types/prop-types': 15.7.5
541 | '@types/scheduler': 0.16.2
542 | csstype: 3.1.1
543 | dev: true
544 |
545 | /@types/scheduler/0.16.2:
546 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
547 | dev: true
548 |
549 | /@vitejs/plugin-react/3.1.0_vite@4.1.4:
550 | resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==}
551 | engines: {node: ^14.18.0 || >=16.0.0}
552 | peerDependencies:
553 | vite: ^4.1.0-beta.0
554 | dependencies:
555 | '@babel/core': 7.21.0
556 | '@babel/plugin-transform-react-jsx-self': 7.21.0_@babel+core@7.21.0
557 | '@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.21.0
558 | magic-string: 0.27.0
559 | react-refresh: 0.14.0
560 | vite: 4.1.4
561 | transitivePeerDependencies:
562 | - supports-color
563 | dev: true
564 |
565 | /acorn-node/1.8.2:
566 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
567 | dependencies:
568 | acorn: 7.4.1
569 | acorn-walk: 7.2.0
570 | xtend: 4.0.2
571 | dev: true
572 |
573 | /acorn-walk/7.2.0:
574 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
575 | engines: {node: '>=0.4.0'}
576 | dev: true
577 |
578 | /acorn/7.4.1:
579 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
580 | engines: {node: '>=0.4.0'}
581 | hasBin: true
582 | dev: true
583 |
584 | /ansi-styles/3.2.1:
585 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
586 | engines: {node: '>=4'}
587 | dependencies:
588 | color-convert: 1.9.3
589 | dev: true
590 |
591 | /anymatch/3.1.3:
592 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
593 | engines: {node: '>= 8'}
594 | dependencies:
595 | normalize-path: 3.0.0
596 | picomatch: 2.3.1
597 | dev: true
598 |
599 | /arg/5.0.2:
600 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
601 | dev: true
602 |
603 | /asynckit/0.4.0:
604 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
605 | dev: false
606 |
607 | /autoprefixer/10.4.14_postcss@8.4.21:
608 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
609 | engines: {node: ^10 || ^12 || >=14}
610 | hasBin: true
611 | peerDependencies:
612 | postcss: ^8.1.0
613 | dependencies:
614 | browserslist: 4.21.5
615 | caniuse-lite: 1.0.30001464
616 | fraction.js: 4.2.0
617 | normalize-range: 0.1.2
618 | picocolors: 1.0.0
619 | postcss: 8.4.21
620 | postcss-value-parser: 4.2.0
621 | dev: true
622 |
623 | /axios/1.3.4:
624 | resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==}
625 | dependencies:
626 | follow-redirects: 1.15.2
627 | form-data: 4.0.0
628 | proxy-from-env: 1.1.0
629 | transitivePeerDependencies:
630 | - debug
631 | dev: false
632 |
633 | /binary-extensions/2.2.0:
634 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
635 | engines: {node: '>=8'}
636 | dev: true
637 |
638 | /braces/3.0.2:
639 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
640 | engines: {node: '>=8'}
641 | dependencies:
642 | fill-range: 7.0.1
643 | dev: true
644 |
645 | /browserslist/4.21.5:
646 | resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
647 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
648 | hasBin: true
649 | dependencies:
650 | caniuse-lite: 1.0.30001464
651 | electron-to-chromium: 1.4.328
652 | node-releases: 2.0.10
653 | update-browserslist-db: 1.0.10_browserslist@4.21.5
654 | dev: true
655 |
656 | /camelcase-css/2.0.1:
657 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
658 | engines: {node: '>= 6'}
659 | dev: true
660 |
661 | /caniuse-lite/1.0.30001464:
662 | resolution: {integrity: sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==}
663 | dev: true
664 |
665 | /chalk/2.4.2:
666 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
667 | engines: {node: '>=4'}
668 | dependencies:
669 | ansi-styles: 3.2.1
670 | escape-string-regexp: 1.0.5
671 | supports-color: 5.5.0
672 | dev: true
673 |
674 | /chokidar/3.5.3:
675 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
676 | engines: {node: '>= 8.10.0'}
677 | dependencies:
678 | anymatch: 3.1.3
679 | braces: 3.0.2
680 | glob-parent: 5.1.2
681 | is-binary-path: 2.1.0
682 | is-glob: 4.0.3
683 | normalize-path: 3.0.0
684 | readdirp: 3.6.0
685 | optionalDependencies:
686 | fsevents: 2.3.2
687 | dev: true
688 |
689 | /color-convert/1.9.3:
690 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
691 | dependencies:
692 | color-name: 1.1.3
693 | dev: true
694 |
695 | /color-name/1.1.3:
696 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
697 | dev: true
698 |
699 | /color-name/1.1.4:
700 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
701 | dev: true
702 |
703 | /combined-stream/1.0.8:
704 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
705 | engines: {node: '>= 0.8'}
706 | dependencies:
707 | delayed-stream: 1.0.0
708 | dev: false
709 |
710 | /convert-source-map/1.9.0:
711 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
712 | dev: true
713 |
714 | /cssesc/3.0.0:
715 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
716 | engines: {node: '>=4'}
717 | hasBin: true
718 | dev: true
719 |
720 | /csstype/3.1.1:
721 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
722 | dev: true
723 |
724 | /debug/4.3.4:
725 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
726 | engines: {node: '>=6.0'}
727 | peerDependencies:
728 | supports-color: '*'
729 | peerDependenciesMeta:
730 | supports-color:
731 | optional: true
732 | dependencies:
733 | ms: 2.1.2
734 | dev: true
735 |
736 | /defined/1.0.1:
737 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
738 | dev: true
739 |
740 | /delayed-stream/1.0.0:
741 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
742 | engines: {node: '>=0.4.0'}
743 | dev: false
744 |
745 | /detective/5.2.1:
746 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
747 | engines: {node: '>=0.8.0'}
748 | hasBin: true
749 | dependencies:
750 | acorn-node: 1.8.2
751 | defined: 1.0.1
752 | minimist: 1.2.8
753 | dev: true
754 |
755 | /didyoumean/1.2.2:
756 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
757 | dev: true
758 |
759 | /dlv/1.1.3:
760 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
761 | dev: true
762 |
763 | /electron-to-chromium/1.4.328:
764 | resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==}
765 | dev: true
766 |
767 | /esbuild/0.16.17:
768 | resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
769 | engines: {node: '>=12'}
770 | hasBin: true
771 | requiresBuild: true
772 | optionalDependencies:
773 | '@esbuild/android-arm': 0.16.17
774 | '@esbuild/android-arm64': 0.16.17
775 | '@esbuild/android-x64': 0.16.17
776 | '@esbuild/darwin-arm64': 0.16.17
777 | '@esbuild/darwin-x64': 0.16.17
778 | '@esbuild/freebsd-arm64': 0.16.17
779 | '@esbuild/freebsd-x64': 0.16.17
780 | '@esbuild/linux-arm': 0.16.17
781 | '@esbuild/linux-arm64': 0.16.17
782 | '@esbuild/linux-ia32': 0.16.17
783 | '@esbuild/linux-loong64': 0.16.17
784 | '@esbuild/linux-mips64el': 0.16.17
785 | '@esbuild/linux-ppc64': 0.16.17
786 | '@esbuild/linux-riscv64': 0.16.17
787 | '@esbuild/linux-s390x': 0.16.17
788 | '@esbuild/linux-x64': 0.16.17
789 | '@esbuild/netbsd-x64': 0.16.17
790 | '@esbuild/openbsd-x64': 0.16.17
791 | '@esbuild/sunos-x64': 0.16.17
792 | '@esbuild/win32-arm64': 0.16.17
793 | '@esbuild/win32-ia32': 0.16.17
794 | '@esbuild/win32-x64': 0.16.17
795 | dev: true
796 |
797 | /escalade/3.1.1:
798 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
799 | engines: {node: '>=6'}
800 | dev: true
801 |
802 | /escape-string-regexp/1.0.5:
803 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
804 | engines: {node: '>=0.8.0'}
805 | dev: true
806 |
807 | /fast-glob/3.2.12:
808 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
809 | engines: {node: '>=8.6.0'}
810 | dependencies:
811 | '@nodelib/fs.stat': 2.0.5
812 | '@nodelib/fs.walk': 1.2.8
813 | glob-parent: 5.1.2
814 | merge2: 1.4.1
815 | micromatch: 4.0.5
816 | dev: true
817 |
818 | /fastq/1.15.0:
819 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
820 | dependencies:
821 | reusify: 1.0.4
822 | dev: true
823 |
824 | /fill-range/7.0.1:
825 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
826 | engines: {node: '>=8'}
827 | dependencies:
828 | to-regex-range: 5.0.1
829 | dev: true
830 |
831 | /follow-redirects/1.15.2:
832 | resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
833 | engines: {node: '>=4.0'}
834 | peerDependencies:
835 | debug: '*'
836 | peerDependenciesMeta:
837 | debug:
838 | optional: true
839 | dev: false
840 |
841 | /form-data/4.0.0:
842 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
843 | engines: {node: '>= 6'}
844 | dependencies:
845 | asynckit: 0.4.0
846 | combined-stream: 1.0.8
847 | mime-types: 2.1.35
848 | dev: false
849 |
850 | /fraction.js/4.2.0:
851 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
852 | dev: true
853 |
854 | /fsevents/2.3.2:
855 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
856 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
857 | os: [darwin]
858 | requiresBuild: true
859 | dev: true
860 | optional: true
861 |
862 | /function-bind/1.1.1:
863 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
864 | dev: true
865 |
866 | /gensync/1.0.0-beta.2:
867 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
868 | engines: {node: '>=6.9.0'}
869 | dev: true
870 |
871 | /glob-parent/5.1.2:
872 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
873 | engines: {node: '>= 6'}
874 | dependencies:
875 | is-glob: 4.0.3
876 | dev: true
877 |
878 | /glob-parent/6.0.2:
879 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
880 | engines: {node: '>=10.13.0'}
881 | dependencies:
882 | is-glob: 4.0.3
883 | dev: true
884 |
885 | /globals/11.12.0:
886 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
887 | engines: {node: '>=4'}
888 | dev: true
889 |
890 | /goober/2.1.12:
891 | resolution: {integrity: sha512-yXHAvO08FU1JgTXX6Zn6sYCUFfB/OJSX8HHjDSgerZHZmFKAb08cykp5LBw5QnmyMcZyPRMqkdyHUSSzge788Q==}
892 | peerDependencies:
893 | csstype: ^3.0.10
894 | dev: false
895 |
896 | /has-flag/3.0.0:
897 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
898 | engines: {node: '>=4'}
899 | dev: true
900 |
901 | /has/1.0.3:
902 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
903 | engines: {node: '>= 0.4.0'}
904 | dependencies:
905 | function-bind: 1.1.1
906 | dev: true
907 |
908 | /is-binary-path/2.1.0:
909 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
910 | engines: {node: '>=8'}
911 | dependencies:
912 | binary-extensions: 2.2.0
913 | dev: true
914 |
915 | /is-core-module/2.11.0:
916 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
917 | dependencies:
918 | has: 1.0.3
919 | dev: true
920 |
921 | /is-extglob/2.1.1:
922 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
923 | engines: {node: '>=0.10.0'}
924 | dev: true
925 |
926 | /is-glob/4.0.3:
927 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
928 | engines: {node: '>=0.10.0'}
929 | dependencies:
930 | is-extglob: 2.1.1
931 | dev: true
932 |
933 | /is-number/7.0.0:
934 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
935 | engines: {node: '>=0.12.0'}
936 | dev: true
937 |
938 | /js-tokens/4.0.0:
939 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
940 |
941 | /jsesc/2.5.2:
942 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
943 | engines: {node: '>=4'}
944 | hasBin: true
945 | dev: true
946 |
947 | /json5/2.2.3:
948 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
949 | engines: {node: '>=6'}
950 | hasBin: true
951 | dev: true
952 |
953 | /lilconfig/2.1.0:
954 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
955 | engines: {node: '>=10'}
956 | dev: true
957 |
958 | /loose-envify/1.4.0:
959 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
960 | hasBin: true
961 | dependencies:
962 | js-tokens: 4.0.0
963 | dev: false
964 |
965 | /lru-cache/5.1.1:
966 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
967 | dependencies:
968 | yallist: 3.1.1
969 | dev: true
970 |
971 | /magic-string/0.27.0:
972 | resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
973 | engines: {node: '>=12'}
974 | dependencies:
975 | '@jridgewell/sourcemap-codec': 1.4.14
976 | dev: true
977 |
978 | /merge2/1.4.1:
979 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
980 | engines: {node: '>= 8'}
981 | dev: true
982 |
983 | /micromatch/4.0.5:
984 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
985 | engines: {node: '>=8.6'}
986 | dependencies:
987 | braces: 3.0.2
988 | picomatch: 2.3.1
989 | dev: true
990 |
991 | /mime-db/1.52.0:
992 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
993 | engines: {node: '>= 0.6'}
994 | dev: false
995 |
996 | /mime-types/2.1.35:
997 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
998 | engines: {node: '>= 0.6'}
999 | dependencies:
1000 | mime-db: 1.52.0
1001 | dev: false
1002 |
1003 | /minimist/1.2.8:
1004 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
1005 | dev: true
1006 |
1007 | /ms/2.1.2:
1008 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1009 | dev: true
1010 |
1011 | /nanoid/3.3.4:
1012 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
1013 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1014 | hasBin: true
1015 | dev: true
1016 |
1017 | /node-releases/2.0.10:
1018 | resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
1019 | dev: true
1020 |
1021 | /normalize-path/3.0.0:
1022 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1023 | engines: {node: '>=0.10.0'}
1024 | dev: true
1025 |
1026 | /normalize-range/0.1.2:
1027 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1028 | engines: {node: '>=0.10.0'}
1029 | dev: true
1030 |
1031 | /object-hash/3.0.0:
1032 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1033 | engines: {node: '>= 6'}
1034 | dev: true
1035 |
1036 | /path-parse/1.0.7:
1037 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1038 | dev: true
1039 |
1040 | /picocolors/1.0.0:
1041 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1042 | dev: true
1043 |
1044 | /picomatch/2.3.1:
1045 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1046 | engines: {node: '>=8.6'}
1047 | dev: true
1048 |
1049 | /pify/2.3.0:
1050 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1051 | engines: {node: '>=0.10.0'}
1052 | dev: true
1053 |
1054 | /postcss-import/14.1.0_postcss@8.4.21:
1055 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
1056 | engines: {node: '>=10.0.0'}
1057 | peerDependencies:
1058 | postcss: ^8.0.0
1059 | dependencies:
1060 | postcss: 8.4.21
1061 | postcss-value-parser: 4.2.0
1062 | read-cache: 1.0.0
1063 | resolve: 1.22.1
1064 | dev: true
1065 |
1066 | /postcss-js/4.0.1_postcss@8.4.21:
1067 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1068 | engines: {node: ^12 || ^14 || >= 16}
1069 | peerDependencies:
1070 | postcss: ^8.4.21
1071 | dependencies:
1072 | camelcase-css: 2.0.1
1073 | postcss: 8.4.21
1074 | dev: true
1075 |
1076 | /postcss-load-config/3.1.4_postcss@8.4.21:
1077 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
1078 | engines: {node: '>= 10'}
1079 | peerDependencies:
1080 | postcss: '>=8.0.9'
1081 | ts-node: '>=9.0.0'
1082 | peerDependenciesMeta:
1083 | postcss:
1084 | optional: true
1085 | ts-node:
1086 | optional: true
1087 | dependencies:
1088 | lilconfig: 2.1.0
1089 | postcss: 8.4.21
1090 | yaml: 1.10.2
1091 | dev: true
1092 |
1093 | /postcss-nested/6.0.0_postcss@8.4.21:
1094 | resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
1095 | engines: {node: '>=12.0'}
1096 | peerDependencies:
1097 | postcss: ^8.2.14
1098 | dependencies:
1099 | postcss: 8.4.21
1100 | postcss-selector-parser: 6.0.11
1101 | dev: true
1102 |
1103 | /postcss-selector-parser/6.0.11:
1104 | resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
1105 | engines: {node: '>=4'}
1106 | dependencies:
1107 | cssesc: 3.0.0
1108 | util-deprecate: 1.0.2
1109 | dev: true
1110 |
1111 | /postcss-value-parser/4.2.0:
1112 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1113 | dev: true
1114 |
1115 | /postcss/8.4.21:
1116 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==}
1117 | engines: {node: ^10 || ^12 || >=14}
1118 | dependencies:
1119 | nanoid: 3.3.4
1120 | picocolors: 1.0.0
1121 | source-map-js: 1.0.2
1122 | dev: true
1123 |
1124 | /proxy-from-env/1.1.0:
1125 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
1126 | dev: false
1127 |
1128 | /queue-microtask/1.2.3:
1129 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1130 | dev: true
1131 |
1132 | /quick-lru/5.1.1:
1133 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
1134 | engines: {node: '>=10'}
1135 | dev: true
1136 |
1137 | /react-dom/18.2.0_react@18.2.0:
1138 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
1139 | peerDependencies:
1140 | react: ^18.2.0
1141 | dependencies:
1142 | loose-envify: 1.4.0
1143 | react: 18.2.0
1144 | scheduler: 0.23.0
1145 | dev: false
1146 |
1147 | /react-hook-form/7.43.5_react@18.2.0:
1148 | resolution: {integrity: sha512-YcaXhuFHoOPipu5pC7ckxrLrialiOcU91pKu8P+isAcXZyMgByUK9PkI9j5fENO4+6XU5PwWXRGMIFlk9u9UBQ==}
1149 | engines: {node: '>=12.22.0'}
1150 | peerDependencies:
1151 | react: ^16.8.0 || ^17 || ^18
1152 | dependencies:
1153 | react: 18.2.0
1154 | dev: false
1155 |
1156 | /react-hot-toast/2.4.0_biqbaboplfbrettd7655fr4n2y:
1157 | resolution: {integrity: sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA==}
1158 | engines: {node: '>=10'}
1159 | peerDependencies:
1160 | react: '>=16'
1161 | react-dom: '>=16'
1162 | dependencies:
1163 | goober: 2.1.12
1164 | react: 18.2.0
1165 | react-dom: 18.2.0_react@18.2.0
1166 | transitivePeerDependencies:
1167 | - csstype
1168 | dev: false
1169 |
1170 | /react-refresh/0.14.0:
1171 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
1172 | engines: {node: '>=0.10.0'}
1173 | dev: true
1174 |
1175 | /react-router-dom/6.9.0_biqbaboplfbrettd7655fr4n2y:
1176 | resolution: {integrity: sha512-/seUAPY01VAuwkGyVBPCn1OXfVbaWGGu4QN9uj0kCPcTyNYgL1ldZpxZUpRU7BLheKQI4Twtl/OW2nHRF1u26Q==}
1177 | engines: {node: '>=14'}
1178 | peerDependencies:
1179 | react: '>=16.8'
1180 | react-dom: '>=16.8'
1181 | dependencies:
1182 | '@remix-run/router': 1.4.0
1183 | react: 18.2.0
1184 | react-dom: 18.2.0_react@18.2.0
1185 | react-router: 6.9.0_react@18.2.0
1186 | dev: false
1187 |
1188 | /react-router/6.9.0_react@18.2.0:
1189 | resolution: {integrity: sha512-51lKevGNUHrt6kLuX3e/ihrXoXCa9ixY/nVWRLlob4r/l0f45x3SzBvYJe3ctleLUQQ5fVa4RGgJOTH7D9Umhw==}
1190 | engines: {node: '>=14'}
1191 | peerDependencies:
1192 | react: '>=16.8'
1193 | dependencies:
1194 | '@remix-run/router': 1.4.0
1195 | react: 18.2.0
1196 | dev: false
1197 |
1198 | /react/18.2.0:
1199 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
1200 | engines: {node: '>=0.10.0'}
1201 | dependencies:
1202 | loose-envify: 1.4.0
1203 | dev: false
1204 |
1205 | /read-cache/1.0.0:
1206 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1207 | dependencies:
1208 | pify: 2.3.0
1209 | dev: true
1210 |
1211 | /readdirp/3.6.0:
1212 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1213 | engines: {node: '>=8.10.0'}
1214 | dependencies:
1215 | picomatch: 2.3.1
1216 | dev: true
1217 |
1218 | /resolve/1.22.1:
1219 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
1220 | hasBin: true
1221 | dependencies:
1222 | is-core-module: 2.11.0
1223 | path-parse: 1.0.7
1224 | supports-preserve-symlinks-flag: 1.0.0
1225 | dev: true
1226 |
1227 | /reusify/1.0.4:
1228 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1229 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1230 | dev: true
1231 |
1232 | /rollup/3.19.1:
1233 | resolution: {integrity: sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==}
1234 | engines: {node: '>=14.18.0', npm: '>=8.0.0'}
1235 | hasBin: true
1236 | optionalDependencies:
1237 | fsevents: 2.3.2
1238 | dev: true
1239 |
1240 | /run-parallel/1.2.0:
1241 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1242 | dependencies:
1243 | queue-microtask: 1.2.3
1244 | dev: true
1245 |
1246 | /scheduler/0.23.0:
1247 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
1248 | dependencies:
1249 | loose-envify: 1.4.0
1250 | dev: false
1251 |
1252 | /semver/6.3.0:
1253 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
1254 | hasBin: true
1255 | dev: true
1256 |
1257 | /source-map-js/1.0.2:
1258 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1259 | engines: {node: '>=0.10.0'}
1260 | dev: true
1261 |
1262 | /supports-color/5.5.0:
1263 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1264 | engines: {node: '>=4'}
1265 | dependencies:
1266 | has-flag: 3.0.0
1267 | dev: true
1268 |
1269 | /supports-preserve-symlinks-flag/1.0.0:
1270 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1271 | engines: {node: '>= 0.4'}
1272 | dev: true
1273 |
1274 | /tailwindcss/3.2.7_postcss@8.4.21:
1275 | resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==}
1276 | engines: {node: '>=12.13.0'}
1277 | hasBin: true
1278 | peerDependencies:
1279 | postcss: ^8.0.9
1280 | dependencies:
1281 | arg: 5.0.2
1282 | chokidar: 3.5.3
1283 | color-name: 1.1.4
1284 | detective: 5.2.1
1285 | didyoumean: 1.2.2
1286 | dlv: 1.1.3
1287 | fast-glob: 3.2.12
1288 | glob-parent: 6.0.2
1289 | is-glob: 4.0.3
1290 | lilconfig: 2.1.0
1291 | micromatch: 4.0.5
1292 | normalize-path: 3.0.0
1293 | object-hash: 3.0.0
1294 | picocolors: 1.0.0
1295 | postcss: 8.4.21
1296 | postcss-import: 14.1.0_postcss@8.4.21
1297 | postcss-js: 4.0.1_postcss@8.4.21
1298 | postcss-load-config: 3.1.4_postcss@8.4.21
1299 | postcss-nested: 6.0.0_postcss@8.4.21
1300 | postcss-selector-parser: 6.0.11
1301 | postcss-value-parser: 4.2.0
1302 | quick-lru: 5.1.1
1303 | resolve: 1.22.1
1304 | transitivePeerDependencies:
1305 | - ts-node
1306 | dev: true
1307 |
1308 | /to-fast-properties/2.0.0:
1309 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1310 | engines: {node: '>=4'}
1311 | dev: true
1312 |
1313 | /to-regex-range/5.0.1:
1314 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1315 | engines: {node: '>=8.0'}
1316 | dependencies:
1317 | is-number: 7.0.0
1318 | dev: true
1319 |
1320 | /update-browserslist-db/1.0.10_browserslist@4.21.5:
1321 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
1322 | hasBin: true
1323 | peerDependencies:
1324 | browserslist: '>= 4.21.0'
1325 | dependencies:
1326 | browserslist: 4.21.5
1327 | escalade: 3.1.1
1328 | picocolors: 1.0.0
1329 | dev: true
1330 |
1331 | /util-deprecate/1.0.2:
1332 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1333 | dev: true
1334 |
1335 | /vite/4.1.4:
1336 | resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==}
1337 | engines: {node: ^14.18.0 || >=16.0.0}
1338 | hasBin: true
1339 | peerDependencies:
1340 | '@types/node': '>= 14'
1341 | less: '*'
1342 | sass: '*'
1343 | stylus: '*'
1344 | sugarss: '*'
1345 | terser: ^5.4.0
1346 | peerDependenciesMeta:
1347 | '@types/node':
1348 | optional: true
1349 | less:
1350 | optional: true
1351 | sass:
1352 | optional: true
1353 | stylus:
1354 | optional: true
1355 | sugarss:
1356 | optional: true
1357 | terser:
1358 | optional: true
1359 | dependencies:
1360 | esbuild: 0.16.17
1361 | postcss: 8.4.21
1362 | resolve: 1.22.1
1363 | rollup: 3.19.1
1364 | optionalDependencies:
1365 | fsevents: 2.3.2
1366 | dev: true
1367 |
1368 | /xtend/4.0.2:
1369 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1370 | engines: {node: '>=0.4'}
1371 | dev: true
1372 |
1373 | /yallist/3.1.1:
1374 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1375 | dev: true
1376 |
1377 | /yaml/1.10.2:
1378 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
1379 | engines: {node: '>= 6'}
1380 | dev: true
1381 |
--------------------------------------------------------------------------------
/client/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/client/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
1 | #root {
2 | max-width: 1280px;
3 | margin: 0 auto;
4 | padding: 2rem;
5 | text-align: center;
6 | }
7 |
8 | .logo {
9 | height: 6em;
10 | padding: 1.5em;
11 | will-change: filter;
12 | transition: filter 300ms;
13 | }
14 | .logo:hover {
15 | filter: drop-shadow(0 0 2em #646cffaa);
16 | }
17 | .logo.react:hover {
18 | filter: drop-shadow(0 0 2em #61dafbaa);
19 | }
20 |
21 | @keyframes logo-spin {
22 | from {
23 | transform: rotate(0deg);
24 | }
25 | to {
26 | transform: rotate(360deg);
27 | }
28 | }
29 |
30 | @media (prefers-reduced-motion: no-preference) {
31 | a:nth-of-type(2) .logo {
32 | animation: logo-spin infinite 20s linear;
33 | }
34 | }
35 |
36 | .card {
37 | padding: 2em;
38 | }
39 |
40 | .read-the-docs {
41 | color: #888;
42 | }
43 |
--------------------------------------------------------------------------------
/client/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
2 | import { Navigation } from "./components/Navigation";
3 | import { TaskFormPage } from "./pages/TaskFormPage";
4 | import { TasksPage } from "./pages/TasksPage";
5 | import { Toaster } from "react-hot-toast";
6 |
7 | function App() {
8 | return (
9 |
10 |
11 |
12 |
13 | {/* redirect to tasks */}
14 | } />
15 | } />
16 | } />
17 | } />
18 |
19 |
20 |
21 |
22 | );
23 | }
24 |
25 | export default App;
26 |
--------------------------------------------------------------------------------
/client/src/api/tasks.api.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 |
3 | const URL =
4 | process.env.NODE_ENV === "production"
5 | ? import.meta.env.VITE_BACKEND_URL
6 | : "http://localhost:8000";
7 |
8 | console.log(URL);
9 | const tasksApi = axios.create({
10 | baseURL: `${URL}/tasks/api/v1/tasks`,
11 | });
12 |
13 | export const getAllTasks = () => tasksApi.get("/");
14 |
15 | export const getTask = (id) => tasksApi.get(`/${id}`);
16 |
17 | export const createTask = (task) => tasksApi.post("/", task);
18 |
19 | export const updateTask = (id, task) => tasksApi.put(`/${id}/`, task);
20 |
21 | export const deleteTask = (id) => tasksApi.delete(`/${id}`);
22 |
--------------------------------------------------------------------------------
/client/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/components/Navigation.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | export function Navigation() {
4 | return (
5 |
6 |
7 |
Tasks App
8 |
9 |
12 |
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/client/src/components/TaskCard.jsx:
--------------------------------------------------------------------------------
1 | import { useNavigate } from "react-router-dom";
2 |
3 | export function TaskCard({ task }) {
4 | const navigate = useNavigate();
5 |
6 | return (
7 | {
10 | navigate(`/tasks/${task.id}`);
11 | }}
12 | >
13 |
14 | {task.title}
15 |
16 |
{task.description}
17 |
18 | );
19 | }
20 |
--------------------------------------------------------------------------------
/client/src/components/TasksList.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 | import { getAllTasks } from "../api/tasks.api";
3 | import { TaskCard } from "./TaskCard";
4 |
5 | export function TasksList() {
6 | const [tasks, setTasks] = useState([]);
7 |
8 | useEffect(() => {
9 | async function loadTasks() {
10 | const res = await getAllTasks();
11 | setTasks(res.data);
12 | }
13 | loadTasks();
14 | }, []);
15 |
16 | return (
17 |
18 | {tasks.map((task) => (
19 |
20 | ))}
21 |
22 | );
23 | }
24 |
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | body {
6 | background-color: #202020;
7 | color: aliceblue;
8 | }
--------------------------------------------------------------------------------
/client/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App'
4 | import './index.css'
5 |
6 | ReactDOM.createRoot(document.getElementById('root')).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/client/src/pages/TaskFormPage.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { useForm } from "react-hook-form";
3 | import { useNavigate, useParams } from "react-router-dom";
4 | import { createTask, deleteTask, getTask, updateTask } from "../api/tasks.api";
5 | import { toast } from "react-hot-toast";
6 |
7 | export function TaskFormPage() {
8 | const {
9 | register,
10 | handleSubmit,
11 | formState: { errors },
12 | setValue,
13 | } = useForm();
14 | const navigate = useNavigate();
15 | const params = useParams();
16 |
17 | const onSubmit = handleSubmit(async (data) => {
18 | if (params.id) {
19 | await updateTask(params.id, data);
20 | toast.success("Task updated", {
21 | position: "bottom-right",
22 | style: {
23 | background: "#101010",
24 | color: "#fff",
25 | },
26 | });
27 | } else {
28 | await createTask(data);
29 | toast.success("New Task Added", {
30 | position: "bottom-right",
31 | style: {
32 | background: "#101010",
33 | color: "#fff",
34 | },
35 | });
36 | }
37 |
38 | navigate("/tasks");
39 | });
40 |
41 | useEffect(() => {
42 | async function loadTask() {
43 | if (params.id) {
44 | const { data } = await getTask(params.id);
45 | setValue("title", data.title);
46 | setValue("description", data.description);
47 | }
48 | }
49 | loadTask();
50 | }, []);
51 |
52 | return (
53 |
54 |
77 |
78 | {params.id && (
79 |
80 |
99 |
100 | )}
101 |
102 | );
103 | }
104 |
--------------------------------------------------------------------------------
/client/src/pages/TasksPage.jsx:
--------------------------------------------------------------------------------
1 | import { TasksList } from "../components/TasksList";
2 |
3 | export function TasksPage() {
4 | return ;
5 | }
6 |
--------------------------------------------------------------------------------
/client/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/client/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | base: process.env.NODE_ENV === 'production' ? '/static/' : '/',
8 | })
9 |
--------------------------------------------------------------------------------
/django_crud_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/django-react-crud/057b14356231c526b7858203e93272122cfb4b6c/django_crud_api/__init__.py
--------------------------------------------------------------------------------
/django_crud_api/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for django_crud_api project.
3 |
4 | It exposes the ASGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.asgi import get_asgi_application
13 |
14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_crud_api.settings")
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/django_crud_api/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for django_crud_api project.
3 |
4 | Generated by 'django-admin startproject' using Django 4.1.7.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/4.1/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/4.1/ref/settings/
11 | """
12 |
13 | from pathlib import Path
14 | import dj_database_url
15 | import os
16 |
17 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
18 | BASE_DIR = Path(__file__).resolve().parent.parent
19 |
20 | # Quick-start development settings - unsuitable for production
21 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
22 |
23 | # SECURITY WARNING: keep the secret key used in production secret!
24 | SECRET_KEY = "django-insecure-klqc^ujfaoz4e!n&7r28(j$6uit36szf+%w#jvx@1i=6wcp21q"
25 |
26 | # SECURITY WARNING: don't run with debug turned on in production!
27 | DEBUG = True
28 |
29 | ALLOWED_HOSTS = ["*"]
30 |
31 | # Application definition
32 |
33 | INSTALLED_APPS = [
34 | "django.contrib.admin", "django.contrib.auth",
35 | "django.contrib.contenttypes", "django.contrib.sessions",
36 | "django.contrib.messages", "django.contrib.staticfiles",
37 | 'whitenoise.runserver_nostatic', "corsheaders", "rest_framework",
38 | "coreapi", "tasks"
39 | ]
40 |
41 | MIDDLEWARE = [
42 | "django.middleware.security.SecurityMiddleware",
43 | "whitenoise.middleware.WhiteNoiseMiddleware",
44 | "django.contrib.sessions.middleware.SessionMiddleware",
45 | "corsheaders.middleware.CorsMiddleware",
46 | "django.middleware.common.CommonMiddleware",
47 | "django.middleware.csrf.CsrfViewMiddleware",
48 | "django.contrib.auth.middleware.AuthenticationMiddleware",
49 | "django.contrib.messages.middleware.MessageMiddleware",
50 | "django.middleware.clickjacking.XFrameOptionsMiddleware",
51 | ]
52 |
53 | ROOT_URLCONF = "django_crud_api.urls"
54 |
55 | TEMPLATES = [
56 | {
57 | "BACKEND": "django.template.backends.django.DjangoTemplates",
58 | # Tell Django where to find Reacts index.html file
59 | "DIRS": [os.path.join(BASE_DIR, "client", "dist")],
60 | "APP_DIRS": True,
61 | "OPTIONS": {
62 | "context_processors": [
63 | "django.template.context_processors.debug",
64 | "django.template.context_processors.request",
65 | "django.contrib.auth.context_processors.auth",
66 | "django.contrib.messages.context_processors.messages",
67 | ],
68 | },
69 | },
70 | ]
71 |
72 | WSGI_APPLICATION = "django_crud_api.wsgi.application"
73 |
74 | # Database
75 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases
76 |
77 | # DATABASES = {
78 | # "default": {
79 | # "ENGINE": "django.db.backends.sqlite3",
80 | # "NAME": BASE_DIR / "db.sqlite3",
81 | # }
82 | # }
83 |
84 | DATABASES = {
85 | "default":
86 | dj_database_url.config(default="sqlite:///" +
87 | os.path.join(BASE_DIR, "db.sqlite3"))
88 | }
89 |
90 | # Password validation
91 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
92 |
93 | AUTH_PASSWORD_VALIDATORS = [
94 | {
95 | "NAME":
96 | "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
97 | },
98 | {
99 | "NAME":
100 | "django.contrib.auth.password_validation.MinimumLengthValidator",
101 | },
102 | {
103 | "NAME":
104 | "django.contrib.auth.password_validation.CommonPasswordValidator",
105 | },
106 | {
107 | "NAME":
108 | "django.contrib.auth.password_validation.NumericPasswordValidator",
109 | },
110 | ]
111 |
112 | # Internationalization
113 | # https://docs.djangoproject.com/en/4.1/topics/i18n/
114 |
115 | LANGUAGE_CODE = "en-us"
116 |
117 | TIME_ZONE = "UTC"
118 |
119 | USE_I18N = True
120 |
121 | USE_TZ = True
122 |
123 | # Static files (CSS, JavaScript, Images)
124 | # https://docs.djangoproject.com/en/4.1/howto/static-files/
125 |
126 | STATIC_URL = "static/"
127 |
128 | STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
129 |
130 | STATICFILES_DIRS = [
131 | # Tell Django where to look for React's static files (css, js)
132 | os.path.join(BASE_DIR, "client", "dist")
133 | ]
134 | STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
135 |
136 |
137 | # Default primary key field type
138 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
139 |
140 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
141 |
142 | CORS_ORIGIN_WHITELIST = ['http://localhost:5173']
143 |
144 | REST_FRAMEWORK = {
145 | 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
146 | }
147 |
--------------------------------------------------------------------------------
/django_crud_api/urls.py:
--------------------------------------------------------------------------------
1 | """django_crud_api URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path, include
18 | from django.conf.urls.static import static
19 | from django.views.generic import TemplateView
20 | from django.conf import settings
21 |
22 | urlpatterns = [
23 | path("admin/", admin.site.urls),
24 | path('tasks/', include('tasks.urls')),
25 | path('', TemplateView.as_view(template_name='index.html'), name='index'),
26 | ]
27 |
28 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
29 |
--------------------------------------------------------------------------------
/django_crud_api/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for django_crud_api project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_crud_api.settings")
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_crud_api.settings")
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == "__main__":
22 | main()
23 |
--------------------------------------------------------------------------------
/nixpacks.toml:
--------------------------------------------------------------------------------
1 | providers = ["node", "python"]
2 |
3 | [variables]
4 | NODE_ENV = 'production'
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | asgiref==3.6.0
2 | certifi==2022.12.7
3 | charset-normalizer==3.1.0
4 | coreapi==2.3.3
5 | coreschema==0.0.4
6 | dj-database-url==1.2.0
7 | Django==4.1.7
8 | django-cors-headers==3.14.0
9 | djangorestframework==3.14.0
10 | gunicorn==20.1.0
11 | idna==3.4
12 | itypes==1.2.0
13 | Jinja2==3.1.2
14 | MarkupSafe==2.1.2
15 | pytz==2022.7.1
16 | requests==2.28.2
17 | sqlparse==0.4.3
18 | uritemplate==4.1.1
19 | urllib3==1.26.15
20 | whitenoise==6.4.0
21 | yapf==0.32.0
22 |
--------------------------------------------------------------------------------
/runtime.txt:
--------------------------------------------------------------------------------
1 | 3.9.13
--------------------------------------------------------------------------------
/tasks/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/django-react-crud/057b14356231c526b7858203e93272122cfb4b6c/tasks/__init__.py
--------------------------------------------------------------------------------
/tasks/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/tasks/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class TasksConfig(AppConfig):
5 | default_auto_field = "django.db.models.BigAutoField"
6 | name = "tasks"
7 |
--------------------------------------------------------------------------------
/tasks/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.7 on 2023-03-11 15:55
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | initial = True
9 |
10 | dependencies = []
11 |
12 | operations = [
13 | migrations.CreateModel(
14 | name="Task",
15 | fields=[
16 | (
17 | "id",
18 | models.BigAutoField(
19 | auto_created=True,
20 | primary_key=True,
21 | serialize=False,
22 | verbose_name="ID",
23 | ),
24 | ),
25 | ("title", models.CharField(max_length=200)),
26 | ("description", models.TextField(blank=True)),
27 | ("done", models.BooleanField(default=False)),
28 | ],
29 | ),
30 | ]
31 |
--------------------------------------------------------------------------------
/tasks/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/django-react-crud/057b14356231c526b7858203e93272122cfb4b6c/tasks/migrations/__init__.py
--------------------------------------------------------------------------------
/tasks/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 | # Create your models here.
4 | class Task(models.Model):
5 | title = models.CharField(max_length=200)
6 | description = models.TextField(blank=True)
7 | done = models.BooleanField(default=False)
8 |
9 | def __str__(self):
10 | return self.title
--------------------------------------------------------------------------------
/tasks/serializer.py:
--------------------------------------------------------------------------------
1 | from rest_framework import serializers
2 | from .models import Task
3 |
4 | class TaskSerializer(serializers.ModelSerializer):
5 | class Meta:
6 | model = Task
7 | # fields = ('id', 'title', 'description', 'done')
8 | fields = '__all__'
--------------------------------------------------------------------------------
/tasks/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/tasks/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import include, path
2 | from rest_framework import routers
3 | from rest_framework.documentation import include_docs_urls
4 | from tasks import views
5 |
6 | router = routers.DefaultRouter()
7 | router.register(r"tasks", views.TaskView, "tasks")
8 |
9 | urlpatterns = [
10 | path("api/v1/", include(router.urls)),
11 | path('docs/', include_docs_urls(title='Tasks API')),
12 | ]
--------------------------------------------------------------------------------
/tasks/views.py:
--------------------------------------------------------------------------------
1 | from rest_framework import viewsets
2 | from .serializer import TaskSerializer
3 | from .models import Task
4 |
5 | # Create your views here.
6 | class TaskView(viewsets.ModelViewSet):
7 | serializer_class = TaskSerializer
8 | queryset = Task.objects.all()
--------------------------------------------------------------------------------