From 08dcd7455f398ed96d0fc98235eef15b21d00cc1 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sat, 27 Apr 2024 20:00:46 +0200 Subject: [PATCH] feat: create content layout with emotion --- .babelrc | 3 + .editorconfig | 2 + app/constants/paths.ts | 34 +++ app/controllers/users_controller.ts | 11 +- inertia/app/app.tsx | 8 +- inertia/components/common/external_link.tsx | 18 ++ inertia/components/common/rounded_image.tsx | 11 + .../common/unstyled/unstyled_list.tsx | 12 + inertia/components/layouts/_base_layout.tsx | 14 + inertia/components/layouts/content_layout.tsx | 22 ++ inertia/components/navbar/navbar.tsx | 72 +++++ inertia/pages/home.tsx | 11 +- inertia/pages/login.tsx | 10 + inertia/styles/document.ts | 19 ++ inertia/styles/keyframes.ts | 10 + inertia/styles/reset.ts | 36 +++ inertia/styles/theme.ts | 44 +++ inertia/tsconfig.json | 8 +- inertia/types/emotion.d.ts | 37 +++ package-lock.json | 282 ++++++++++++++++-- package.json | 6 +- resources/views/inertia_layout.edge | 4 +- start/routes.ts | 8 +- 23 files changed, 630 insertions(+), 52 deletions(-) create mode 100644 .babelrc create mode 100644 app/constants/paths.ts create mode 100644 inertia/components/common/external_link.tsx create mode 100644 inertia/components/common/rounded_image.tsx create mode 100644 inertia/components/common/unstyled/unstyled_list.tsx create mode 100644 inertia/components/layouts/_base_layout.tsx create mode 100644 inertia/components/layouts/content_layout.tsx create mode 100644 inertia/components/navbar/navbar.tsx create mode 100644 inertia/pages/login.tsx create mode 100644 inertia/styles/document.ts create mode 100644 inertia/styles/keyframes.ts create mode 100644 inertia/styles/reset.ts create mode 100644 inertia/styles/theme.ts create mode 100644 inertia/types/emotion.d.ts diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..ebdb6f7 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["@emotion"] +} diff --git a/.editorconfig b/.editorconfig index f830f40..b2697c4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,7 @@ # http://editorconfig.org +root = true + [*] indent_style = space indent_size = 2 diff --git a/app/constants/paths.ts b/app/constants/paths.ts new file mode 100644 index 0000000..3bcaf1b --- /dev/null +++ b/app/constants/paths.ts @@ -0,0 +1,34 @@ +const PATHS = { + AUTH: { + LOGIN: '/login', + LOGOUT: '/auth/logout', + GOOGLE: '/auth/google', + }, + HOME: '/', + APP: '/app', + SHARED: '/shared', + PRIVACY: '/privacy', + TERMS: '/terms', + ADMIN: '/admin', + CATEGORY: { + CREATE: '/category/create', + EDIT: '/category/edit', + REMOVE: '/category/remove', + }, + LINK: { + CREATE: '/link/create', + EDIT: '/link/edit', + REMOVE: '/link/remove', + }, + API: { + CATEGORY: '/api/category', + LINK: '/api/link', + }, + NOT_FOUND: '/404', + SERVER_ERROR: '/505', + AUTHOR: 'https://www.sonny.dev/', + REPO_GITHUB: 'https://github.com/Sonny93/my-links', + EXTENSION: 'https://chromewebstore.google.com/detail/mylinks/agkmlplihacolkakgeccnbhphnepphma', +} as const; + +export default PATHS; diff --git a/app/controllers/users_controller.ts b/app/controllers/users_controller.ts index ee9c056..e3d3fd3 100644 --- a/app/controllers/users_controller.ts +++ b/app/controllers/users_controller.ts @@ -1,9 +1,14 @@ +import PATHS from '#constants/paths'; import User from '#models/user'; import type { HttpContext } from '@adonisjs/core/http'; import logger from '@adonisjs/core/services/logger'; export default class UsersController { - private redirectTo = '/'; + private redirectTo = PATHS.HOME; + + login({ inertia }: HttpContext) { + return inertia.render('login'); + } google = ({ ally }: HttpContext) => ally.use('google').redirect(); @@ -44,13 +49,13 @@ export default class UsersController { session.flash('flash', 'Successfully authenticated'); logger.info(`[${user.email}] auth success`); - response.redirect('/'); + response.redirect(this.redirectTo); } async logout({ auth, response, session }: HttpContext) { await auth.use('web').logout(); session.flash('flash', 'Successfully disconnected'); logger.info(`[${auth.user?.email}] disconnected successfully`); - response.redirect('/'); + response.redirect(this.redirectTo); } } diff --git a/inertia/app/app.tsx b/inertia/app/app.tsx index 6374b4b..c339a23 100644 --- a/inertia/app/app.tsx +++ b/inertia/app/app.tsx @@ -3,14 +3,14 @@ import { resolvePageComponent } from '@adonisjs/inertia/helpers'; import { createInertiaApp } from '@inertiajs/react'; import { hydrateRoot } from 'react-dom/client'; -import '../css/app.css'; +import { theme } from '~/styles/theme'; -const appName = import.meta.env.VITE_APP_NAME || 'AdonisJS'; +const appName = import.meta.env.VITE_APP_NAME || 'MyLinks'; createInertiaApp({ - progress: { color: '#5468FF' }, + progress: { color: theme.colors.primary }, - title: (title) => `${title} - ${appName}`, + title: (title) => `${appName}${title && ` - ${title}`}`, resolve: (name) => { return resolvePageComponent(`../pages/${name}.tsx`, import.meta.glob('../pages/**/*.tsx')); diff --git a/inertia/components/common/external_link.tsx b/inertia/components/common/external_link.tsx new file mode 100644 index 0000000..0f6e228 --- /dev/null +++ b/inertia/components/common/external_link.tsx @@ -0,0 +1,18 @@ +import { AnchorHTMLAttributes, CSSProperties, ReactNode } from 'react'; + +export default function ExternalLink({ + children, + title, + ...props +}: AnchorHTMLAttributes & { + children: ReactNode; + style?: CSSProperties; + title?: string; + className?: string; +}) { + return ( + + {children} + + ); +} diff --git a/inertia/components/common/rounded_image.tsx b/inertia/components/common/rounded_image.tsx new file mode 100644 index 0000000..3a27416 --- /dev/null +++ b/inertia/components/common/rounded_image.tsx @@ -0,0 +1,11 @@ +import styled from '@emotion/styled'; + +const RoundedImage = styled.img({ + 'borderRadius': '50%', + + '&:hover': { + boxShadow: '0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1)', + }, +}); + +export default RoundedImage; diff --git a/inertia/components/common/unstyled/unstyled_list.tsx b/inertia/components/common/unstyled/unstyled_list.tsx new file mode 100644 index 0000000..ba3d65c --- /dev/null +++ b/inertia/components/common/unstyled/unstyled_list.tsx @@ -0,0 +1,12 @@ +import styled from '@emotion/styled'; + +const UnstyledList = styled.ul({ + '&, & li': { + listStyleType: 'none', + margin: 0, + padding: 0, + border: 0, + }, +}); + +export default UnstyledList; diff --git a/inertia/components/layouts/_base_layout.tsx b/inertia/components/layouts/_base_layout.tsx new file mode 100644 index 0000000..b8a91df --- /dev/null +++ b/inertia/components/layouts/_base_layout.tsx @@ -0,0 +1,14 @@ +import { Global, ThemeProvider } from '@emotion/react'; +import { ReactNode } from 'react'; +import documentStyle from '~/styles/document'; +import { cssReset } from '~/styles/reset'; +import { theme } from '~/styles/theme'; + +export default function BaseLayout({ children }: { children: ReactNode }) { + return ( + <> + {children} + + + ); +} diff --git a/inertia/components/layouts/content_layout.tsx b/inertia/components/layouts/content_layout.tsx new file mode 100644 index 0000000..7dbdb1e --- /dev/null +++ b/inertia/components/layouts/content_layout.tsx @@ -0,0 +1,22 @@ +import styled from '@emotion/styled'; +import { ReactNode } from 'react'; +import Navbar from '../navbar/navbar'; +import BaseLayout from './_base_layout'; + +const ContentLayoutStyle = styled.div(({ theme }) => ({ + height: 'auto', + width: theme.media.small_desktop, + maxWidth: '100%', + padding: '1em', +})); + +const ContentLayout = ({ children }: { children: ReactNode }) => ( + + + +
{children}
+
+
+); + +export default ContentLayout; diff --git a/inertia/components/navbar/navbar.tsx b/inertia/components/navbar/navbar.tsx new file mode 100644 index 0000000..719fe84 --- /dev/null +++ b/inertia/components/navbar/navbar.tsx @@ -0,0 +1,72 @@ +import styled from '@emotion/styled'; +import { Link } from '@inertiajs/react'; +import ExternalLink from '~/components/common/external_link'; +import RoundedImage from '~/components/common/rounded_image'; +import UnstyledList from '~/components/common/unstyled/unstyled_list'; +import useUser from '~/hooks/use_user'; +import PATHS from '../../../app/constants/paths'; + +type NavbarListDirection = { + right?: boolean; +}; + +const Nav = styled.nav({ + width: '100%', + padding: '0.75em 0', + display: 'flex', + alignItems: 'center', +}); + +const NavList = styled(UnstyledList)(({ theme, right }) => ({ + display: 'flex', + flex: 1, + gap: '1.5em', + justifyContent: right ? 'flex-end' : 'flex-start', + transition: theme.transition.delay, +})); + +const UserCard = styled.div({ + display: 'flex', + gap: '0.35em', + alignItems: 'center', + justifyContent: 'center', +}); + +export default function Navbar() { + const { isAuthenticated, user } = useUser(); + return ( + + ); +} diff --git a/inertia/pages/home.tsx b/inertia/pages/home.tsx index b7260c2..93acd28 100644 --- a/inertia/pages/home.tsx +++ b/inertia/pages/home.tsx @@ -1,5 +1,5 @@ import { InferPageProps } from '@adonisjs/inertia/types'; -import { Head } from '@inertiajs/react'; +import ContentLayout from '~/components/layouts/content_layout'; import useUser from '~/hooks/use_user'; import type AppsController from '../../app/controllers/apps_controller'; @@ -7,9 +7,7 @@ export default function Home(_: InferPageProps) { const { isAuthenticated, user } = useUser(); return ( - <> - - +
AdonisJS x Inertia x React
@@ -19,11 +17,8 @@ export default function Home(_: InferPageProps) { {isAuthenticated ? 'Authenticated' : 'Not authenticated'} - - {isAuthenticated ? Logout : Login} -
{JSON.stringify(user, null, 2)}
- +
); } diff --git a/inertia/pages/login.tsx b/inertia/pages/login.tsx new file mode 100644 index 0000000..5fd5348 --- /dev/null +++ b/inertia/pages/login.tsx @@ -0,0 +1,10 @@ +import ContentLayout from '~/components/layouts/content_layout'; +import PATHS from '../../app/constants/paths'; + +export default function LoginPage() { + return ( + + Continue with Google + + ); +} diff --git a/inertia/styles/document.ts b/inertia/styles/document.ts new file mode 100644 index 0000000..efb1bd3 --- /dev/null +++ b/inertia/styles/document.ts @@ -0,0 +1,19 @@ +import { css } from '@emotion/react'; +import { theme } from './theme'; + +const documentStyle = css({ + 'html, body, #app': { + height: '100svh', + width: '100svw', + fontFamily: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif", + fontSize: '17px', + color: theme.colors.font, + backgroundColor: theme.colors.background, + display: 'flex', + alignItems: 'center', + flexDirection: 'column', + overflow: 'hidden', + }, +}); + +export default documentStyle; diff --git a/inertia/styles/keyframes.ts b/inertia/styles/keyframes.ts new file mode 100644 index 0000000..b5aa313 --- /dev/null +++ b/inertia/styles/keyframes.ts @@ -0,0 +1,10 @@ +import { keyframes } from '@emotion/react'; + +export const fadeIn = keyframes({ + '0%': { + opacity: 0, + }, + '100%': { + opacity: 1, + }, +}); diff --git a/inertia/styles/reset.ts b/inertia/styles/reset.ts new file mode 100644 index 0000000..10c103c --- /dev/null +++ b/inertia/styles/reset.ts @@ -0,0 +1,36 @@ +import { css } from '@emotion/react'; + +export const cssReset = css({ + '*': { + boxSizing: 'border-box', + outline: 0, + margin: 0, + padding: 0, + scrollBehavior: 'smooth', + }, + + '.reset': { + backgroundColor: 'inherit', + color: 'inherit', + padding: 0, + margin: 0, + border: 0, + }, + + 'a': { + width: 'fit-content', + color: '#3f88c5', + textDecoration: 'none', + borderBottom: '1px solid transparent', + }, + + 'b': { + fontWeight: 600, + letterSpacing: '0.5px', + }, + + 'h1, h2, h3, h4, h5, h6': { + fontWeight: '400', + margin: '1em 0', + }, +}); diff --git a/inertia/styles/theme.ts b/inertia/styles/theme.ts new file mode 100644 index 0000000..e77e537 --- /dev/null +++ b/inertia/styles/theme.ts @@ -0,0 +1,44 @@ +import { Theme } from '@emotion/react'; + +const lightBlack = '#555'; +const black = '#333'; +const darkBlack = '#111'; + +const white = '#fff'; +const gray = '#7c7c7c'; + +const blue = '#3f88c5'; + +export const theme: Theme = { + colors: { + font: black, + background: white, + primary: blue, + + lightBlack, + black, + darkBlack, + + white, + gray, + + blue, + }, + + border: { + radius: '5px', + }, + + media: { + mobile: '768px', + tablet: '1024px', + small_desktop: '1280px', + medium_desktop: '1440px', + large_desktop: '1920px', + xlarge_desktop: '2560px', + }, + + transition: { + delay: '0.15s', + }, +}; diff --git a/inertia/tsconfig.json b/inertia/tsconfig.json index fea12d3..601f895 100644 --- a/inertia/tsconfig.json +++ b/inertia/tsconfig.json @@ -2,11 +2,17 @@ "extends": "@adonisjs/tsconfig/tsconfig.client.json", "compilerOptions": { "baseUrl": ".", + "lib": ["DOM", "ESNext", "DOM.Iterable", "ES2020"], + "jsxImportSource": "@emotion/react", "module": "ESNext", + "moduleResolution": "Bundler", "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "paths": { "~/*": ["./*"] - } + }, + "types": ["vite/client", "@emotion/styled", "@emotion/react"] }, "include": ["./**/*.ts", "./**/*.tsx"] } diff --git a/inertia/types/emotion.d.ts b/inertia/types/emotion.d.ts new file mode 100644 index 0000000..006ccee --- /dev/null +++ b/inertia/types/emotion.d.ts @@ -0,0 +1,37 @@ +import '@emotion/react'; + +declare module '@emotion/react' { + export interface Theme extends theme { + colors: { + font: string; + background: string; + primary: string; + + lightBlack: string; + black: string; + darkBlack: string; + + white: string; + gray: string; + + blue: string; + }; + + border: { + radius: string; + }; + + media: { + mobile: string; + tablet: string; + small_desktop: string; + medium_desktop: string; + large_desktop: string; + xlarge_desktop: string; + }; + + transition: { + delay: string; + }; + } +} diff --git a/package-lock.json b/package-lock.json index cd2cfc5..720696e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,8 @@ "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", "@adonisjs/vite": "^3.0.0-11", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", "@inertiajs/react": "^1.0.16", "@vinejs/vine": "^2.0.0", "edge.js": "^6.0.2", @@ -33,6 +35,7 @@ "@adonisjs/assembler": "^7.5.1", "@adonisjs/eslint-config": "^1.3.0", "@adonisjs/tsconfig": "^1.3.0", + "@emotion/babel-plugin": "^11.11.0", "@japa/assert": "^3.0.0", "@japa/plugin-adonisjs": "^3.0.1", "@japa/runner": "^3.1.4", @@ -741,7 +744,6 @@ "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -913,7 +915,6 @@ "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, "dependencies": { "@babel/types": "^7.24.0" }, @@ -977,7 +978,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -986,7 +986,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -1018,7 +1017,6 @@ "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1033,7 +1031,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1045,7 +1042,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1059,7 +1055,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -1067,14 +1062,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -1083,7 +1076,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1133,6 +1125,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", @@ -1181,7 +1184,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1212,6 +1214,152 @@ "node": ">=12" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -2765,6 +2913,11 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "node_modules/@types/pluralize": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz", @@ -3481,6 +3634,20 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3700,7 +3867,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -4148,6 +4314,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cpy": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/cpy/-/cpy-11.0.1.tgz", @@ -4254,8 +4452,7 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/dag-map": { "version": "1.0.2", @@ -4683,7 +4880,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -4880,7 +5076,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -5448,6 +5643,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5966,7 +6166,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -6052,6 +6251,19 @@ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", "dev": true }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hosted-git-info": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", @@ -6183,7 +6395,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6297,8 +6508,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -6847,8 +7057,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-deref-sync": { "version": "0.14.0", @@ -7042,8 +7251,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/locate-path": { "version": "7.2.0", @@ -7769,7 +7977,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -7867,7 +8074,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "devOptional": true, "engines": { "node": ">=8" } @@ -8724,6 +8930,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/regexp-tree": { "version": "0.1.27", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", @@ -8797,7 +9008,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -9590,6 +9800,11 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/supports-color": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", @@ -9742,7 +9957,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -10398,6 +10612,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", diff --git a/package.json b/package.json index 38a64f5..9c67f7d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "#controllers/*": "./app/controllers/*.js", "#exceptions/*": "./app/exceptions/*.js", "#models/*": "./app/models/*.js", + "#constants/*": "./app/constants/*.js", "#mails/*": "./app/mails/*.js", "#services/*": "./app/services/*.js", "#listeners/*": "./app/listeners/*.js", @@ -35,6 +36,7 @@ "@adonisjs/assembler": "^7.5.1", "@adonisjs/eslint-config": "^1.3.0", "@adonisjs/tsconfig": "^1.3.0", + "@emotion/babel-plugin": "^11.11.0", "@japa/assert": "^3.0.0", "@japa/plugin-adonisjs": "^3.0.1", "@japa/runner": "^3.1.4", @@ -64,6 +66,8 @@ "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", "@adonisjs/vite": "^3.0.0-11", + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", "@inertiajs/react": "^1.0.16", "@vinejs/vine": "^2.0.0", "edge.js": "^6.0.2", @@ -93,4 +97,4 @@ "arrowParens": "always", "printWidth": 100 } -} +} \ No newline at end of file diff --git a/resources/views/inertia_layout.edge b/resources/views/inertia_layout.edge index 25f1bfe..4c18f5d 100644 --- a/resources/views/inertia_layout.edge +++ b/resources/views/inertia_layout.edge @@ -5,7 +5,7 @@ - AdonisJS x Inertia x React + MyLinks @viteReactRefresh() @inertiaHead() @@ -16,4 +16,4 @@ @inertia() - \ No newline at end of file + diff --git a/start/routes.ts b/start/routes.ts index 7b52ef3..8e27458 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -1,10 +1,12 @@ +import PATHS from '#constants/paths'; import router from '@adonisjs/core/services/router'; const UsersController = () => import('#controllers/users_controller'); const AppsController = () => import('#controllers/apps_controller'); -router.get('/', [AppsController, 'index']); +router.get(PATHS.HOME, [AppsController, 'index']); -router.get('/auth/login', [UsersController, 'google']); +router.get(PATHS.AUTH.LOGIN, [UsersController, 'login']); +router.get(PATHS.AUTH.GOOGLE, [UsersController, 'google']); router.get('/auth/callback', [UsersController, 'callbackAuth']); -router.get('/auth/logout', [UsersController, 'logout']); +router.get(PATHS.AUTH.LOGOUT, [UsersController, 'logout']);