From 747847c7ddf45a34d4499f21d542bc1112b42e85 Mon Sep 17 00:00:00 2001 From: Kelvin Oghenerhoro Omereshone Date: Fri, 20 Sep 2024 18:19:52 +0100 Subject: [PATCH] [feat] Add mellow react (#114) * chore(mellow-react): update dependencies * feat(mellow-react): add routes * feat(mellow-react): add actions * feat(mellow-react): add helpers * feat(mellow-react): add custom hook * feat(mellow-react): add sails mail * feat(mellow-react): add mail config * feat(mellow-vue): use integer id * fix(mellow-react): add url back * feat(mellow-react): add User model * feat(mellow-react): add policies * feat(mellow-react): register policy mappings * feat(mellow-react): add test * feat(mellow-react): update jsconfig * feat(mellow-react): add progressbar color * feat(mellow-react): add GoogleButton * feat(mellow-react): add homepage * feat(mellow-react): setup tailwindcss * chore(mellow-vue): revert to earliest version of prettier * feat(mellow-react): add GoogleButton.jsx * chore(mellow-react): update prettier-config.js * chore(mellow-react): remove typedoc * chore(mellow-vue): remove trailing space * chore(mellow-vue): remove jsdoc * chore(mellow-vue): prettier * chore(mellow-react): prettier * chore(mellow-react): prettier * feat(mellow-react): work on InputBase component * feat(mellow-react): add InputText Co-authored-by: Bayode Emmanuel * feat(mellow-react): add InputBase * feat(mellow-react): add AppLayout * feat(mellow-react): update homepage * feat(mellow-react): rename to testing env * fix(mellow-react): update environment * fix(mellow-vue): update type in InputEmail * feat(mellow-react): add InputEmail component * feat(mellow-react): add InputPassword * feat(mellow-react): add InputButton * fix(mellow-react): remove unneeded markups * fix(mellow-react): use ternary * fix(mellow-react): passing in props * fix(mellow-vue): spread props * fix(mellow-react): remove manual value and onChange props * fix(mellow-react): fix not passing the input value * fix(mellow-react): resolve issue with check box * feat(mellow-react): submit login form * feat(mellow-react): add signup page * feat(mellow-react): add check-email page * feat(mellow-react): add success page * feat(mellow-react): add link-expired page * feat(mellow-vue): abstract style for inputs in input base * feat(mellow-vue): use components in forgot-password page * feat(mellow-react): add forgot-password page * fix(mellow-vue): add email error * feat(mellow-react): add forgot-password page * fix(mellow-react): fix wrong endpoint * feat(mellow-vue): proper usage of components * feat(mellow-react): add and use label prop * feat(mellow-react): add forms css * feat(mellow-react): add rest password page * fix(mellow-react): remove wrong function call * chore(mellow-react): remove component that no longer exist * feat(mellow-react): add dashboard * feat(mellow-vue): move profile to dashboard * fix(mellow-vue): fix deprecation for back redirect usage * chore(mellow-react): install sails-hook-organics * feat(mellow-react): fix depreaction warning for redirect usage * fix(mellow-react): rename dashboard to index * feat(mellow-react): add custom configs * feat(mellow-react): add email templates * feat(mellow-vue): go to dashboard/profile * feat(mellow-vue): remove user/profile.vue * feat(mellow-vue): remove unused config * feat(mellow-vue): use confirmPassword instead of passwordConfirmation * fix(mellow-react): use confirmPassword not passwordConfirmation * feat(mellow-react): use 'dashboard/profile' * fix(mellow-react): make it easy to merge classes * feat(mellow-react): add profile page * feat(mellow-react): fix issues with updating fields * fix(mellow-react): changed to undefined for forms * feat(mellow-vue): remove accessing user details with .value --- .../api/controllers/auth/callback.js | 91 + .../api/controllers/auth/forgot-password.js | 53 + .../api/controllers/auth/login.js | 81 + .../api/controllers/auth/redirect.js | 22 + .../api/controllers/auth/resend-link.js | 44 + .../api/controllers/auth/reset-password.js | 58 + .../api/controllers/auth/signup.js | 88 + .../api/controllers/auth/verify-email.js | 82 + .../api/controllers/auth/view-check-email.js | 21 + .../controllers/auth/view-forgot-password.js | 15 + .../api/controllers/auth/view-link-expired.js | 15 + .../api/controllers/auth/view-login.js | 15 + .../controllers/auth/view-reset-password.js | 33 + .../api/controllers/auth/view-signup.js | 14 + .../api/controllers/auth/view-success.js | 38 + .../controllers/dashboard/view-dashboard.js | 15 + .../api/controllers/example/index.js | 22 - .../home/{index.js => view-home.js} | 7 +- .../api/controllers/user/delete-profile.js | 52 + .../api/controllers/user/logout.js | 19 + .../api/controllers/user/update-profile.js | 106 + .../api/controllers/user/view-profile.js | 15 + .../mellow-react/api/helpers/capitalize.js | 26 + .../api/helpers/get-user-initials.js | 30 + .../mellow-react/api/hooks/custom/index.js | 46 + templates/mellow-react/api/models/User.js | 140 + .../api/policies/is-authenticated.js | 4 + .../mellow-react/api/policies/is-guest.js | 6 + .../mellow-react/api/responses/badRequest.js | 2 +- .../api/responses/inertiaRedirect.js | 4 + templates/mellow-react/assets/css/forms.css | 3 + .../mellow-react/assets/css/homepage.css | 25 + templates/mellow-react/assets/js/app.js | 3 + .../assets/js/components/Counter.jsx | 12 - .../assets/js/components/GoogleButton.jsx | 38 + .../assets/js/components/InputBase.jsx | 27 + .../assets/js/components/InputButton.jsx | 47 + .../assets/js/components/InputEmail.jsx | 26 + .../assets/js/components/InputPassword.jsx | 103 + .../assets/js/components/InputText.jsx | 37 + .../assets/js/layouts/AppLayout.jsx | 100 + .../assets/js/pages/auth/check-email.jsx | 71 + .../assets/js/pages/auth/forgot-password.jsx | 92 + .../assets/js/pages/auth/link-expired.jsx | 65 + .../assets/js/pages/auth/login.jsx | 112 + .../assets/js/pages/auth/reset-password.jsx | 168 + .../assets/js/pages/auth/signup.jsx | 178 ++ .../assets/js/pages/auth/success.jsx | 51 + .../assets/js/pages/dashboard/index.jsx | 30 + .../assets/js/pages/dashboard/profile.jsx | 173 ++ .../mellow-react/assets/js/pages/example.jsx | 11 - .../mellow-react/assets/js/pages/index.jsx | 191 +- templates/mellow-react/config/blueprints.js | 2 +- templates/mellow-react/config/custom.js | 33 + templates/mellow-react/config/env/testing.js | 27 + templates/mellow-react/config/mail.js | 60 + templates/mellow-react/config/policies.js | 5 +- templates/mellow-react/config/routes.js | 35 +- templates/mellow-react/jsconfig.json | 10 +- templates/mellow-react/package-lock.json | 2712 ++++++++++------- templates/mellow-react/package.json | 45 +- templates/mellow-react/prettier.config.js | 3 +- templates/mellow-react/tailwind.config.js | 63 +- .../mellow-react/tests/unit/helpers.test.js | 83 + templates/mellow-react/types/index.d.ts | 173 -- .../views/emails/email-reset-password.ejs | 33 + .../views/emails/email-verify-account.ejs | 9 + .../views/emails/email-verify-new-email.ejs | 57 + .../views/layouts/layout-email.ejs | 12 + .../api/controllers/auth/callback.js | 1 - .../api/controllers/user/update-profile.js | 6 +- .../api/controllers/user/view-profile.js | 2 +- templates/mellow-vue/api/models/User.js | 1 - .../mellow-vue/api/responses/badRequest.js | 2 +- .../assets/js/components/InputBase.vue | 5 + .../assets/js/components/InputEmail.vue | 2 +- .../assets/js/pages/auth/forgot-password.vue | 65 +- .../mellow-vue/assets/js/pages/auth/login.vue | 8 +- .../assets/js/pages/auth/reset-password.vue | 235 +- .../assets/js/pages/auth/signup.vue | 3 +- .../js/pages/{user => dashboard}/profile.vue | 13 +- .../mellow-vue/assets/js/pages/index.vue | 2 +- templates/mellow-vue/config/blueprints.js | 2 +- templates/mellow-vue/config/custom.js | 5 +- templates/mellow-vue/config/models.js | 2 +- templates/mellow-vue/package-lock.json | 46 +- templates/mellow-vue/package.json | 4 +- 87 files changed, 4830 insertions(+), 1663 deletions(-) create mode 100644 templates/mellow-react/api/controllers/auth/callback.js create mode 100644 templates/mellow-react/api/controllers/auth/forgot-password.js create mode 100644 templates/mellow-react/api/controllers/auth/login.js create mode 100644 templates/mellow-react/api/controllers/auth/redirect.js create mode 100644 templates/mellow-react/api/controllers/auth/resend-link.js create mode 100644 templates/mellow-react/api/controllers/auth/reset-password.js create mode 100644 templates/mellow-react/api/controllers/auth/signup.js create mode 100644 templates/mellow-react/api/controllers/auth/verify-email.js create mode 100644 templates/mellow-react/api/controllers/auth/view-check-email.js create mode 100644 templates/mellow-react/api/controllers/auth/view-forgot-password.js create mode 100644 templates/mellow-react/api/controllers/auth/view-link-expired.js create mode 100644 templates/mellow-react/api/controllers/auth/view-login.js create mode 100644 templates/mellow-react/api/controllers/auth/view-reset-password.js create mode 100644 templates/mellow-react/api/controllers/auth/view-signup.js create mode 100644 templates/mellow-react/api/controllers/auth/view-success.js create mode 100644 templates/mellow-react/api/controllers/dashboard/view-dashboard.js delete mode 100644 templates/mellow-react/api/controllers/example/index.js rename templates/mellow-react/api/controllers/home/{index.js => view-home.js} (68%) create mode 100644 templates/mellow-react/api/controllers/user/delete-profile.js create mode 100644 templates/mellow-react/api/controllers/user/logout.js create mode 100644 templates/mellow-react/api/controllers/user/update-profile.js create mode 100644 templates/mellow-react/api/controllers/user/view-profile.js create mode 100644 templates/mellow-react/api/helpers/capitalize.js create mode 100644 templates/mellow-react/api/helpers/get-user-initials.js create mode 100644 templates/mellow-react/api/hooks/custom/index.js create mode 100644 templates/mellow-react/api/models/User.js create mode 100644 templates/mellow-react/api/policies/is-authenticated.js create mode 100644 templates/mellow-react/api/policies/is-guest.js create mode 100644 templates/mellow-react/assets/css/forms.css create mode 100644 templates/mellow-react/assets/css/homepage.css delete mode 100644 templates/mellow-react/assets/js/components/Counter.jsx create mode 100644 templates/mellow-react/assets/js/components/GoogleButton.jsx create mode 100644 templates/mellow-react/assets/js/components/InputBase.jsx create mode 100644 templates/mellow-react/assets/js/components/InputButton.jsx create mode 100644 templates/mellow-react/assets/js/components/InputEmail.jsx create mode 100644 templates/mellow-react/assets/js/components/InputPassword.jsx create mode 100644 templates/mellow-react/assets/js/components/InputText.jsx create mode 100644 templates/mellow-react/assets/js/layouts/AppLayout.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/check-email.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/forgot-password.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/link-expired.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/login.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/reset-password.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/signup.jsx create mode 100644 templates/mellow-react/assets/js/pages/auth/success.jsx create mode 100644 templates/mellow-react/assets/js/pages/dashboard/index.jsx create mode 100644 templates/mellow-react/assets/js/pages/dashboard/profile.jsx delete mode 100644 templates/mellow-react/assets/js/pages/example.jsx create mode 100644 templates/mellow-react/config/env/testing.js create mode 100644 templates/mellow-react/config/mail.js create mode 100644 templates/mellow-react/tests/unit/helpers.test.js delete mode 100644 templates/mellow-react/types/index.d.ts create mode 100644 templates/mellow-react/views/emails/email-reset-password.ejs create mode 100644 templates/mellow-react/views/emails/email-verify-account.ejs create mode 100644 templates/mellow-react/views/emails/email-verify-new-email.ejs create mode 100644 templates/mellow-react/views/layouts/layout-email.ejs rename templates/mellow-vue/assets/js/pages/{user => dashboard}/profile.vue (94%) diff --git a/templates/mellow-react/api/controllers/auth/callback.js b/templates/mellow-react/api/controllers/auth/callback.js new file mode 100644 index 00000000..167022f9 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/callback.js @@ -0,0 +1,91 @@ +module.exports = { + friendlyName: 'Callback', + + description: 'Callback auth.', + + inputs: { + provider: { + isIn: ['google'], + required: true + }, + code: { + type: 'string', + required: true + } + }, + + exits: { + success: { + responseType: 'redirect' + } + }, + fn: async function ({ code, provider }, exits) { + const req = this.req + const googleUser = await sails.wish.provider(provider).user(code) + + User.findOrCreate( + { or: [{ googleId: googleUser.id }, { email: googleUser.email }] }, + { + googleId: googleUser.id, + email: googleUser.email, + fullName: googleUser.name, + googleAvatarUrl: googleUser.picture, + googleAccessToken: googleUser.accessToken, + googleIdToken: googleUser.idToken, + emailStatus: googleUser.verified_email ? 'verified' : 'unverified' + } + ).exec(async (error, user, wasCreated) => { + if (error) throw error + + if (!wasCreated && googleUser.verified_email) { + await User.updateOne({ id: user.id }).set({ + emailStatus: 'verified' + }) + } + if (!wasCreated && user.googleId !== googleUser.id) { + // Checks if the user email has changed since last log in + // And then update the email change candidate which will be used be used to prompt the user to update their email + await User.updateOne({ id: user.id }).set({ + emailChangeCandidate: googleUser.email + }) + } + if (!wasCreated && user.email !== googleUser.email) { + // Checks if the user email has changed since last log in + // And then update the email change candidate which will be used be used to prompt the user to update their email + await User.updateOne({ id: user.id }).set({ + emailChangeCandidate: googleUser.email + }) + } + + // Checks if the user name has changed since last log in + // And then update the name if changed + if (!wasCreated && user.fullName !== googleUser.name) { + await User.updateOne({ id: user.id }).set({ + fullName: googleUser.name + }) + } + + if (!wasCreated && user.googleAvatarUrl !== googleUser.picture) { + await User.updateOne({ id: user.id }).set({ + googleAvatarUrl: googleUser.picture + }) + } + + if (!wasCreated && user.googleAccessToken !== googleUser.accessToken) { + await User.updateOne({ id: user.id }).set({ + googleAccessToken: googleUser.accessToken + }) + } + + if (!wasCreated && user.googleIdToken !== googleUser.idToken) { + await User.updateOne({ id: user.id }).set({ + googleIdToken: googleUser.idToken + }) + } + + req.session.userId = user.id + const urlToRedirectTo = '/dashboard' + return exits.success(urlToRedirectTo) + }) + } +} diff --git a/templates/mellow-react/api/controllers/auth/forgot-password.js b/templates/mellow-react/api/controllers/auth/forgot-password.js new file mode 100644 index 00000000..5ba541dd --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/forgot-password.js @@ -0,0 +1,53 @@ +module.exports = { + friendlyName: 'Forgot password', + + description: + 'Send a password recovery notification to the user with the specified email address.', + + inputs: { + email: { + description: + 'The email address of the alleged user who wants to recover their password.', + example: 'kelvin@boringstack.com', + type: 'string', + required: true, + isEmail: true + } + }, + + exits: { + success: { + description: + 'The email address might have matched a user in the database. (If so, a recovery email was sent.)', + responseType: 'redirect' + } + }, + + fn: async function ({ email }) { + const userExists = await User.count({ email: this.req.session.userEmail }) + if (!userExists) { + return '/check-email' + } + + const token = await sails.helpers.strings.random('url-friendly') + + const user = await User.updateOne({ email }).set({ + passwordResetToken: token, + passwordResetTokenExpiresAt: + Date.now() + sails.config.custom.passwordResetTokenTTL + }) + + await sails.helpers.mail.send.with({ + to: user.email, + subject: 'Password reset instructions', + template: 'email-reset-password', + templateData: { + fullName: user.fullName, + token + } + }) + + this.req.session.userEmail = user.email + return '/check-email' + } +} diff --git a/templates/mellow-react/api/controllers/auth/login.js b/templates/mellow-react/api/controllers/auth/login.js new file mode 100644 index 00000000..b088f7de --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/login.js @@ -0,0 +1,81 @@ +module.exports = { + friendlyName: 'Login', + + description: 'Log in using the provided email and password combination.', + + extendedDescription: `This action attempts to look up the user record in the database with the +specified email address. Then, if such a user exists, it uses +bcrypt to compare the hashed password from the database with the provided +password attempt.`, + + inputs: { + email: { + description: 'The email to try in this attempt, e.g. "irl@example.com".', + type: 'string', + isEmail: true, + required: true + }, + + password: { + description: + 'The unencrypted password to try in this attempt, e.g. "passwordlol".', + type: 'string', + required: true + }, + + rememberMe: { + description: "Whether to extend the lifetime of the user's session.", + type: 'boolean' + } + }, + + exits: { + success: { + description: 'The requesting user agent has been successfully logged in.', + extendedDescription: `Under the covers, this stores the id of the logged-in user in the session +as the \`userId\` key. The next time this user agent sends a request, assuming +it includes a cookie (like a web browser), Sails will automatically make this +user id available as req.session.userId in the corresponding action. (Also note +that, thanks to the included "custom" hook, when a relevant request is received +from a logged-in user, that user's entire record from the database will be fetched +and exposed as a shared data via loggedInUser prop.)`, + responseType: 'redirect' + }, + badCombo: { + responseType: 'badRequest' + } + }, + + fn: async function ({ email, password, rememberMe }) { + const user = await User.findOne({ + email: email.toLowerCase() + }) + + if (!user) { + throw { + badCombo: { + problems: [{ login: 'Wrong email/password.' }] + } + } + } + + try { + await sails.helpers.passwords.checkPassword(password, user.password) + } catch (e) { + sails.log.error(e.message) + throw { + badCombo: { + problems: [{ login: 'Wrong email/password.' }] + } + } + } + + if (rememberMe) { + this.req.session.cookie.maxAge = + sails.config.custom.rememberMeCookieMaxAge + } + + this.req.session.userId = user.id + return '/dashboard' + } +} diff --git a/templates/mellow-react/api/controllers/auth/redirect.js b/templates/mellow-react/api/controllers/auth/redirect.js new file mode 100644 index 00000000..f8ce7637 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/redirect.js @@ -0,0 +1,22 @@ +module.exports = { + friendlyName: 'Redirect', + + description: 'Redirect auth.', + + inputs: { + provider: { + isIn: ['google'], + required: true + } + }, + + exits: { + success: { + responseType: 'redirect' + } + }, + + fn: async function ({ provider }) { + return sails.wish.provider(provider).redirect() + } +} diff --git a/templates/mellow-react/api/controllers/auth/resend-link.js b/templates/mellow-react/api/controllers/auth/resend-link.js new file mode 100644 index 00000000..9e29ad72 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/resend-link.js @@ -0,0 +1,44 @@ +module.exports = { + friendlyName: 'Resend link', + + description: '', + + inputs: {}, + + exits: { + success: { + responseType: 'redirect' + }, + userNotFound: { + responseType: 'notFound' + } + }, + + fn: async function () { + const userExists = await User.count({ email: this.req.session.userEmail }) + if (!userExists) { + return '/check-email' + } + const unverifiedUser = await User.updateOne(this.req.session.userEmail).set( + { + emailStatus: 'unverified', + emailProofToken: sails.helpers.strings.random('url-friendly'), + emailProofTokenExpiresAt: + Date.now() + sails.config.custom.emailProofTokenTTL + } + ) + + this.req.session.userId = unverifiedUser.id + + await sails.helpers.mail.send.with({ + subject: 'Verify your email', + template: 'email-verify-account', + to: unverifiedUser.email, + templateData: { + token: unverifiedUser.emailProofToken, + fullName: unverifiedUser.fullName + } + }) + return '/check-email' + } +} diff --git a/templates/mellow-react/api/controllers/auth/reset-password.js b/templates/mellow-react/api/controllers/auth/reset-password.js new file mode 100644 index 00000000..c66f9a9e --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/reset-password.js @@ -0,0 +1,58 @@ +module.exports = { + friendlyName: 'Reset password', + + description: '', + + inputs: { + token: { + description: 'The verification token from the email.', + example: 'lyCap0N9i8wKYz7rhrEPog' + }, + password: { + type: 'string', + required: true, + minLength: 8 + } + }, + + exits: { + success: { + responseType: 'redirect' + }, + invalidOrExpiredToken: { + responseType: 'expired', + description: 'The provided token is expired, invalid, or already used up.' + }, + badSignupRequest: { + responseType: 'badRequest', + description: + 'The provided fullName, password and/or email address are invalid.', + extendedDescription: + 'If this request was sent from a graphical user interface, the request ' + + 'parameters should have been validated/coerced _before_ they were sent.' + } + }, + + fn: async function ({ token, password }) { + if (!token) { + throw 'invalidOrExpiredToken' + } + + const user = await User.findOne({ passwordResetToken: token }) + + if (!user || user.passwordResetTokenExpiresAt <= Date.now()) { + throw 'invalidOrExpiredToken' + } + await User.updateOne({ id: user.id }).set({ + password, + passwordResetToken: '', + passwordResetTokenExpiresAt: 0 + }) + + this.req.session.userId = user.id + + delete this.req.session.userEmail + + return '/reset-password/success' + } +} diff --git a/templates/mellow-react/api/controllers/auth/signup.js b/templates/mellow-react/api/controllers/auth/signup.js new file mode 100644 index 00000000..10d329f1 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/signup.js @@ -0,0 +1,88 @@ +module.exports = { + friendlyName: 'Register', + + description: 'Register auth.', + + inputs: { + fullName: { + type: 'string', + maxLength: 120, + required: true + }, + email: { + type: 'string', + isEmail: true, + required: true + }, + password: { + type: 'string', + required: true, + minLength: 8 + } + }, + + exits: { + badSignupRequest: { + responseType: 'badRequest', + description: + 'The provided fullName, password and/or email address are invalid.', + extendedDescription: + 'If this request was sent from a graphical user interface, the request ' + + 'parameters should have been validated/coerced _before_ they were sent.' + }, + success: { + responseType: 'redirect' + } + }, + + fn: async function ({ fullName, email: userEmail, password }) { + const email = userEmail.toLowerCase() + const emailProofToken = await sails.helpers.strings.random('url-friendly') + try { + unverifiedUser = await User.create({ + email, + password, + fullName, + tosAcceptedByIp: this.req.ip, + emailProofToken, + emailProofTokenExpiresAt: + Date.now() + sails.config.custom.emailProofTokenTTL + }).fetch() + } catch (error) { + if (error.code === 'E_UNIQUE') { + throw { + badSignupRequest: { + problems: [ + { + email: 'An account with this email address already exists.' + } + ] + } + } + } else if (error.name === 'UsageError') { + throw { + badSignupRequest: { + problems: [ + { + signup: + 'Apologies, but something went wrong with signing you up. Please try again.' + } + ] + } + } + } + } + + await sails.helpers.mail.send.with({ + subject: 'Verify your email', + template: 'email-verify-account', + to: unverifiedUser.email, + templateData: { + token: unverifiedUser.emailProofToken, + fullName: unverifiedUser.fullName + } + }) + this.req.session.userEmail = unverifiedUser.email + return '/check-email' + } +} diff --git a/templates/mellow-react/api/controllers/auth/verify-email.js b/templates/mellow-react/api/controllers/auth/verify-email.js new file mode 100644 index 00000000..c3a04e52 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/verify-email.js @@ -0,0 +1,82 @@ +module.exports = { + friendlyName: 'Verify email', + + description: `Confirm a new user's email address, or an existing user's request for an email address change, + then redirect to either a special landing page (for newly-signed up users), or the account page + (for existing users who just changed their email address).`, + + inputs: { + token: { + description: 'The verification token from the email.', + example: 'lyCap0N9i8wKYz7rhrEPog' + } + }, + + exits: { + success: { + description: + 'Email address confirmed and requesting user logged in. Since this looks like a browser, redirecting...', + responseType: 'redirect' + }, + invalidOrExpiredToken: { + responseType: 'expired', + description: 'The provided token is expired, invalid, or already used up.' + }, + emailAlreadyInUse: { + statusCode: 409, + viewTemplatePath: '500', + description: 'The email address is no longer available.', + extendedDescription: + 'This is an edge case that is not always anticipated by websites and APIs. Since it is pretty rare, the 500 server error page is used as a simple catch-all. If this becomes important in the future, this could easily be expanded into a custom error page or resolution flow. But for context: this behavior of showing the 500 server error page mimics how popular apps like Slack behave under the same circumstances.' + } + }, + + fn: async function ({ token }) { + if (!token) { + throw 'invalidOrExpiredToken' + } + + const user = await User.findOne({ emailProofToken: token }) + + if (!user || user.emailProofTokenExpiresAt <= Date.now()) { + throw 'invalidOrExpiredToken' + } + + if (user.emailStatus == 'unverified') { + await User.updateOne({ id: user.id }).set({ + emailStatus: 'verified', + emailProofToken: '', + emailProofTokenExpiresAt: 0 + }) + + this.req.session.userId = user.id + delete this.req.session.userEmail + + return '/verify-email/success' + } else if (user.emailStatus == 'change-requested') { + if (!user.emailChangeCandidate) { + throw new Error( + `Consistency violation: Could not update user because this user record's emailChangeCandidate ("${user.emailChangeCandidate}") is missing. (This should never happen.)` + ) + } + + if ((await User.count({ email: user.emailChangeCandidate })) > 0) { + throw 'emailAlreadyInUse' + } + + await User.updateOne({ id: user.id }).set({ + emailStatus: 'confirmed', + emailProofToken: '', + emailProofTokenExpiresAt: 0, + email: user.emailChangeCandidate, + emailChangeCandidate: '' + }) + this.req.session.userId = user.id + return '/' + } else { + throw new Error( + `Consistency violation: User ${user.id} has an email proof token, but somehow also has an emailStatus of "${user.emailStatus}"! (This should never happen.)` + ) + } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-check-email.js b/templates/mellow-react/api/controllers/auth/view-check-email.js new file mode 100644 index 00000000..025df714 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-check-email.js @@ -0,0 +1,21 @@ +module.exports = { + friendlyName: 'View verify email', + + description: 'Display "Verify email" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + let message = `We sent a link to the email address you provided. Please check your inbox and follow the instructions.` + return { + page: 'auth/check-email', + props: { + message + } + } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-forgot-password.js b/templates/mellow-react/api/controllers/auth/view-forgot-password.js new file mode 100644 index 00000000..c56d150d --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-forgot-password.js @@ -0,0 +1,15 @@ +module.exports = { + friendlyName: 'View forgot password', + + description: 'Display "Forgot password" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'auth/forgot-password' } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-link-expired.js b/templates/mellow-react/api/controllers/auth/view-link-expired.js new file mode 100644 index 00000000..a82cf1e3 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-link-expired.js @@ -0,0 +1,15 @@ +module.exports = { + friendlyName: 'View link expired', + + description: 'Display "Link expired" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'link-expired' } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-login.js b/templates/mellow-react/api/controllers/auth/view-login.js new file mode 100644 index 00000000..55acb996 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-login.js @@ -0,0 +1,15 @@ +module.exports = { + friendlyName: 'View login', + + description: 'Display "Login" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'auth/login' } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-reset-password.js b/templates/mellow-react/api/controllers/auth/view-reset-password.js new file mode 100644 index 00000000..2b565f4b --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-reset-password.js @@ -0,0 +1,33 @@ +module.exports = { + friendlyName: 'View reset password', + + description: 'Display "Reset password" page.', + + inputs: { + token: { + description: 'The reset token from the email.', + example: 'lyCap0N9i8wKYz7rhrEPog' + } + }, + exits: { + success: { + responseType: 'inertia' + }, + invalidOrExpiredToken: { + responseType: 'expired', + description: 'The provided token is expired, invalid, or already used up.' + } + }, + + fn: async function ({ token }) { + if (!token) { + throw 'invalidOrExpiredToken' + } + const user = await User.findOne({ passwordResetToken: token }) + + if (!user || user.passwordResetTokenExpiresAt <= Date.now()) { + throw 'invalidOrExpiredToken' + } + return { page: 'auth/reset-password', props: { token } } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-signup.js b/templates/mellow-react/api/controllers/auth/view-signup.js new file mode 100644 index 00000000..c63f6846 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-signup.js @@ -0,0 +1,14 @@ +module.exports = { + friendlyName: 'View signup', + + description: 'Display "Signup" page.', + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'auth/signup' } + } +} diff --git a/templates/mellow-react/api/controllers/auth/view-success.js b/templates/mellow-react/api/controllers/auth/view-success.js new file mode 100644 index 00000000..eec6ef54 --- /dev/null +++ b/templates/mellow-react/api/controllers/auth/view-success.js @@ -0,0 +1,38 @@ +module.exports = { + friendlyName: 'View success email', + + description: 'Display "Success" page.', + inputs: { + operation: { + isIn: ['verify-email', 'reset-password'] + } + }, + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function ({ operation }) { + let message + const pageTitle = `${sails.helpers.capitalize(operation)}` + let pageHeading + switch (operation) { + case 'verify-email': + message = 'Email has been successfully verified' + pageHeading = 'Email verification successful' + break + case 'reset-password': + message = 'Password has been successful reset' + pageHeading = 'Password reset successful' + } + return { + page: 'auth/success', + props: { + pageTitle, + pageHeading, + message + } + } + } +} diff --git a/templates/mellow-react/api/controllers/dashboard/view-dashboard.js b/templates/mellow-react/api/controllers/dashboard/view-dashboard.js new file mode 100644 index 00000000..c1420876 --- /dev/null +++ b/templates/mellow-react/api/controllers/dashboard/view-dashboard.js @@ -0,0 +1,15 @@ +module.exports = { + friendlyName: 'View dashboard', + + description: 'Display "Dashboard" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'dashboard/index' } + } +} diff --git a/templates/mellow-react/api/controllers/example/index.js b/templates/mellow-react/api/controllers/example/index.js deleted file mode 100644 index 118af332..00000000 --- a/templates/mellow-react/api/controllers/example/index.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - friendlyName: 'Example', - - description: 'Example index.', - - inputs: {}, - - exits: { - success: { - responseType: 'inertia' - } - }, - - fn: async function () { - return { - page: 'example', - props: { - quote: "You can shine no matter what you're made of - Bigweld" - } - } - } -} diff --git a/templates/mellow-react/api/controllers/home/index.js b/templates/mellow-react/api/controllers/home/view-home.js similarity index 68% rename from templates/mellow-react/api/controllers/home/index.js rename to templates/mellow-react/api/controllers/home/view-home.js index 5aee250e..93bdb1d5 100644 --- a/templates/mellow-react/api/controllers/home/index.js +++ b/templates/mellow-react/api/controllers/home/view-home.js @@ -12,11 +12,6 @@ module.exports = { }, fn: async function () { - return { - page: 'index', - props: { - name: 'Inertia' - } - } + return { page: 'index' } } } diff --git a/templates/mellow-react/api/controllers/user/delete-profile.js b/templates/mellow-react/api/controllers/user/delete-profile.js new file mode 100644 index 00000000..51448e7d --- /dev/null +++ b/templates/mellow-react/api/controllers/user/delete-profile.js @@ -0,0 +1,52 @@ +module.exports = { + friendlyName: 'Delete profile', + + description: + "Delete the logged-in user's account after verifying the password.", + + inputs: { + password: { + type: 'string', + required: true, + description: 'The current password of the user to verify before deletion.' + } + }, + + exits: { + success: { + responseType: 'inertiaRedirect', + description: 'User account deleted successfully.' + }, + unauthorized: { + responseType: 'inertiaRedirect', + description: 'User is not logged in.' + } + }, + + fn: async function ({ password }) { + const userId = this.req.session.userId + const user = await User.findOne({ id: userId }).intercept( + 'notFound', + () => { + delete this.req.session.userId + return { unauthorized: '/login' } + } + ) + + const passwordMatch = await sails.helpers.passwords + .checkPassword(password, user.password) + .intercept('incorrect', () => { + delete this.req.session.userId + return { unauthorized: '/login' } + }) + + await User.destroy({ id: userId }).intercept('error', (err) => { + sails.log.error('Error deleting account:', err) + throw 'error' + }) + + delete this.req.session.userId + + return '/login' + } +} diff --git a/templates/mellow-react/api/controllers/user/logout.js b/templates/mellow-react/api/controllers/user/logout.js new file mode 100644 index 00000000..73dcb67e --- /dev/null +++ b/templates/mellow-react/api/controllers/user/logout.js @@ -0,0 +1,19 @@ +module.exports = { + friendlyName: 'Logout', + + description: 'Logout user.', + + inputs: {}, + + exits: { + success: { + responseType: 'inertiaRedirect' + } + }, + + fn: async function () { + sails.inertia.flushShared('loggedInUser') + delete this.req.session.userId + return '/login' + } +} diff --git a/templates/mellow-react/api/controllers/user/update-profile.js b/templates/mellow-react/api/controllers/user/update-profile.js new file mode 100644 index 00000000..67aac57e --- /dev/null +++ b/templates/mellow-react/api/controllers/user/update-profile.js @@ -0,0 +1,106 @@ +module.exports = { + friendlyName: 'Update profile', + + description: 'Update the profile information of the logged-in user.', + + inputs: { + fullName: { + type: 'string', + required: true, + description: 'The full name of the user.' + }, + email: { + type: 'string', + required: true, + isEmail: true, + description: 'The email address of the user.' + }, + currentPassword: { + type: 'string', + description: 'The current password of the user.', + allowNull: true + }, + password: { + type: 'string', + allowNull: true, + description: 'The new password of the user.' + }, + confirmPassword: { + type: 'string', + description: 'The confirmation of the new password.', + allowNull: true + } + }, + + exits: { + success: { + responseType: 'inertiaRedirect', + description: 'Profile updated successfully.' + }, + invalid: { + responseType: 'badRequest', + description: 'The provided inputs are invalid.' + }, + unauthorized: { + responseType: 'inertiaRedirect', + description: 'The provided current password is incorrect.' + } + }, + + fn: async function ({ + fullName, + email, + currentPassword, + password, + confirmPassword + }) { + const userId = this.req.session.userId + const user = await User.findOne({ id: userId }).select([ + 'password', + 'email' + ]) + + if (currentPassword) { + await sails.helpers.passwords + .checkPassword(currentPassword, user.password) + .intercept('incorrect', () => { + delete this.req.session.userId + return { unauthorized: '/login' } + }) + } + + const updatedData = { + fullName + } + if (email !== user.email) { + updatedData.emailChangeCandidate = email + updatedData.emailStatus = 'change-requested' + const emailProofToken = sails.helpers.strings.random('url-friendly') + + await sails.helpers.mail.send.with({ + to: email, + subject: 'Confirm your new email address', + template: 'email-verify-new-email', + templateData: { + fullName, + token: emailProofToken + } + }) + } + + if (password) { + if (password !== confirmPassword) { + throw { + invalid: { + problems: [{ password: 'Password confirmation does not match.' }] + } + } + } + updatedData.password = password + } + + await User.updateOne({ id: userId }).set(updatedData) + + return 'back' + } +} diff --git a/templates/mellow-react/api/controllers/user/view-profile.js b/templates/mellow-react/api/controllers/user/view-profile.js new file mode 100644 index 00000000..8d1727ea --- /dev/null +++ b/templates/mellow-react/api/controllers/user/view-profile.js @@ -0,0 +1,15 @@ +module.exports = { + friendlyName: 'View profile', + + description: 'Display "Profile" page.', + + exits: { + success: { + responseType: 'inertia' + } + }, + + fn: async function () { + return { page: 'dashboard/profile' } + } +} diff --git a/templates/mellow-react/api/helpers/capitalize.js b/templates/mellow-react/api/helpers/capitalize.js new file mode 100644 index 00000000..db6b242b --- /dev/null +++ b/templates/mellow-react/api/helpers/capitalize.js @@ -0,0 +1,26 @@ +module.exports = { + friendlyName: 'Capitalize Words', + description: + 'Capitalizes the first letter of each word in a hyphen-separated string.', + sync: true, + inputs: { + inputString: { + type: 'string', + required: true, + description: 'The input string to be formatted.' + } + }, + exits: { + success: { + description: 'Returns the formatted string.' + } + }, + fn: function (inputs, exits) { + const words = inputs.inputString.split('-') + const capitalizedWords = words.map( + (word) => word.charAt(0).toUpperCase() + word.slice(1) + ) + const formattedString = capitalizedWords.join(' ') + return exits.success(formattedString) + } +} diff --git a/templates/mellow-react/api/helpers/get-user-initials.js b/templates/mellow-react/api/helpers/get-user-initials.js new file mode 100644 index 00000000..5e2886aa --- /dev/null +++ b/templates/mellow-react/api/helpers/get-user-initials.js @@ -0,0 +1,30 @@ +module.exports = { + friendlyName: 'Get user initials', + sync: true, + description: + "Extracting initials from user's fullName. Needed to show on the user avatar", + + inputs: { + fullName: { + type: 'string', + required: true + } + }, + + exits: { + success: { + outputFriendlyName: 'User initials' + } + }, + + fn: function ({ fullName }) { + // Get user initials. + const [firstName, lastName] = fullName.split(' ') + + const userInitials = lastName + ? `${firstName.charAt(0)}${lastName.charAt(0)}` + : `${firstName.slice(0, 2)}` + + return userInitials.toUpperCase() + } +} diff --git a/templates/mellow-react/api/hooks/custom/index.js b/templates/mellow-react/api/hooks/custom/index.js new file mode 100644 index 00000000..f40662e6 --- /dev/null +++ b/templates/mellow-react/api/hooks/custom/index.js @@ -0,0 +1,46 @@ +/** + * custom hook + * + * @description :: A hook definition. Extends Sails by adding shadow routes, implicit actions, and/or initialization logic. + * @docs :: https://sailsjs.com/docs/concepts/extending-sails/hooks + */ + +module.exports = function defineCustomHook(sails) { + return { + /** + * Runs when this Sails app loads/lifts. + */ + initialize: async function () { + sails.log.info('Initializing custom hook (`custom`)') + }, + routes: { + before: { + 'GET /*': { + skipAssets: true, + fn: async function (req, res, next) { + if (req.session.userId) { + const loggedInUser = await User.findOne({ + id: req.session.userId + }).select(['email', 'fullName', 'googleAvatarUrl', 'initials']) + if (!loggedInUser) { + sails.log.warn( + 'Somehow, the user record for the logged-in user (`' + + req.session.userId + + '`) has gone missing....' + ) + delete req.session.userId + return res.redirect('/login') + } + sails.inertia.share('loggedInUser', loggedInUser) + res.setHeader('Cache-Control', 'no-cache, no-store') + return next() + } else { + sails.inertia.flushShared('loggedInUser') + } + return next() + } + } + } + } + } +} diff --git a/templates/mellow-react/api/models/User.js b/templates/mellow-react/api/models/User.js new file mode 100644 index 00000000..15b68476 --- /dev/null +++ b/templates/mellow-react/api/models/User.js @@ -0,0 +1,140 @@ +/** + * User.js + * + * @description :: A model definition represents a database table/collection. + * @docs :: https://sailsjs.com/docs/concepts/models-and-orm/models + */ + +module.exports = { + attributes: { + // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗ + // ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗ + // ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝ + fullName: { + type: 'string', + required: true, + description: "The user's full name.", + maxLength: 120, + example: 'Mike McNeil', + columnName: 'full_name' + }, + initials: { + type: 'string' + }, + email: { + type: 'string', + required: true, + unique: true, + isEmail: true, + maxLength: 200, + example: 'mike@sailsjs.com', + columnName: 'email' + }, + emailStatus: { + type: 'string', + isIn: ['unverified', 'verified', 'change-requested'], + defaultsTo: 'unverified', + description: "The verification status of the user's email address.", + extendedDescription: `Users might be created as "unverified" (e.g. normal signup) or as "verified" (e.g. hard-coded admin users or OAuth flow). If a user signs up via an OAuth provider, this should be set to "verified" if the email has been verified by the OAuth provider`, + columnName: 'email_status' + }, + emailChangeCandidate: { + type: 'string', + isEmail: true, + description: + 'A still-unverified email address that this user wants to change to', + columnName: 'email_change_candidate' + }, + password: { + type: 'string', + description: + "Securely hashed representation of the user's login password", + protect: true, + minLength: 8, + example: '$2a$12$ymX0WdZU9vc0nM3ftCxGn.6p3aIFvI4haSrr/Y8ByW2BfnzqI1M0y' + }, + passwordResetToken: { + type: 'string', + description: + "A unique token used to verify the user's identity when recovering a password. Expires after 1 use, or after a set amount of time has elapsed.", + columnName: 'password_reset_token' + }, + passwordResetTokenExpiresAt: { + type: 'number', + description: + "A JS timestamp (epoch ms) representing the moment when this user's `passwordResetToken` will expire (or 0 if the user currently has no such token).", + example: 1502844074211, + columnName: 'password_reset_token_expires_at' + }, + emailProofToken: { + type: 'string', + description: + 'A pseudorandom, probabilistically-unique token for use in our account verification emails.', + columnName: 'email_proof_token' + }, + emailProofTokenExpiresAt: { + type: 'number', + description: + "A JS timestamp (epoch ms) representing the moment when this user's `emailProofToken` will expire (or 0 if the user currently has no such token).", + example: 1502844074211, + columnName: 'email_proof_token_expires_at' + }, + googleId: { + type: 'string', + description: + 'The unique ID of a user that signs in or register with their Google account.', + columnName: 'google_id' + }, + googleAccessToken: { + type: 'string', + description: 'Access token provided by Google for an OAuth user.', + columnName: 'google_access_token' + }, + googleIdToken: { + type: 'string', + description: 'The ID token provided by Google for an OAuth user.', + columnName: 'google_id_token' + }, + googleAvatarUrl: { + type: 'string', + description: 'The picture URL provided by Google for an OAuth user.', + columnName: 'google_avatar_url' + } + }, + customToJSON: function () { + return Object.keys(this).reduce((result, key) => { + if ( + ![ + 'googleIdToken', + 'googleUserId', + 'googleAccessToken', + 'password', + 'passwordResetTokenExpiresAt', + 'emailProofToken', + 'emailProofTokenExpiresAt' + ].includes(key) + ) { + result[key] = this[key] + } + return result + }, {}) + }, + beforeCreate: async function (valuesToSet, proceed) { + valuesToSet.initials = sails.helpers.getUserInitials(valuesToSet.fullName) + if (valuesToSet.password) { + valuesToSet.password = await sails.helpers.passwords.hashPassword( + valuesToSet.password + ) + } + + return proceed() + }, + beforeUpdate: async function (valuesToSet, proceed) { + if (valuesToSet.password) { + valuesToSet.password = await sails.helpers.passwords.hashPassword( + valuesToSet.password + ) + } + return proceed() + } +} diff --git a/templates/mellow-react/api/policies/is-authenticated.js b/templates/mellow-react/api/policies/is-authenticated.js new file mode 100644 index 00000000..13bc1e87 --- /dev/null +++ b/templates/mellow-react/api/policies/is-authenticated.js @@ -0,0 +1,4 @@ +module.exports = async function (req, res, proceed) { + if (req.session.userId) return proceed() + return res.redirect('/login') +} diff --git a/templates/mellow-react/api/policies/is-guest.js b/templates/mellow-react/api/policies/is-guest.js new file mode 100644 index 00000000..a51ae58f --- /dev/null +++ b/templates/mellow-react/api/policies/is-guest.js @@ -0,0 +1,6 @@ +module.exports = async function (req, res, proceed) { + if (!req.session.userId) { + return proceed() + } + return res.redirect('/') +} diff --git a/templates/mellow-react/api/responses/badRequest.js b/templates/mellow-react/api/responses/badRequest.js index 142fcd6b..0c9aa420 100644 --- a/templates/mellow-react/api/responses/badRequest.js +++ b/templates/mellow-react/api/responses/badRequest.js @@ -68,7 +68,7 @@ module.exports = function badRequest(optionalData) { } }) req.session.errors = errors - return res.redirect(303, 'back') + return res.redirect(303, req.get('Referrer') || '/') } } diff --git a/templates/mellow-react/api/responses/inertiaRedirect.js b/templates/mellow-react/api/responses/inertiaRedirect.js index dc44d1f2..662b1a62 100644 --- a/templates/mellow-react/api/responses/inertiaRedirect.js +++ b/templates/mellow-react/api/responses/inertiaRedirect.js @@ -9,6 +9,10 @@ module.exports = function inertiaRedirect(url) { const req = this.req const res = this.res + if (url === 'back') { + url = req.get('referer') || '/' + } + if (req.get(inertiaHeaders.INERTIA)) { res.set(inertiaHeaders.LOCATION, url) } diff --git a/templates/mellow-react/assets/css/forms.css b/templates/mellow-react/assets/css/forms.css new file mode 100644 index 00000000..f6f9a954 --- /dev/null +++ b/templates/mellow-react/assets/css/forms.css @@ -0,0 +1,3 @@ +::-ms-reveal { + display: none; +} diff --git a/templates/mellow-react/assets/css/homepage.css b/templates/mellow-react/assets/css/homepage.css new file mode 100644 index 00000000..16842622 --- /dev/null +++ b/templates/mellow-react/assets/css/homepage.css @@ -0,0 +1,25 @@ +details > summary { + list-style: none; +} +summary::-webkit-details-marker { + display: none; +} + +summary::after { + position: absolute; + right: 0px; + content: ' +'; +} +@keyframes details-show { + from { + opacity: 0; + transform: var(--details-translate, translateY(-0.5em)); + } +} + +details[open] > *:not(summary) { + animation: details-show 150ms ease-in-out; +} +details[open] summary:after { + content: ' −'; +} diff --git a/templates/mellow-react/assets/js/app.js b/templates/mellow-react/assets/js/app.js index e2d30bca..69706bb6 100644 --- a/templates/mellow-react/assets/js/app.js +++ b/templates/mellow-react/assets/js/app.js @@ -6,5 +6,8 @@ createInertiaApp({ resolve: (name) => require(`./pages/${name}`), setup({ el, App, props }) { createRoot(el).render() + }, + progress: { + color: '#6C25C1' } }) diff --git a/templates/mellow-react/assets/js/components/Counter.jsx b/templates/mellow-react/assets/js/components/Counter.jsx deleted file mode 100644 index b0fcd51f..00000000 --- a/templates/mellow-react/assets/js/components/Counter.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useState } from 'react' -export default function Counter(props) { - const [count, setCount] = useState(0) - return ( - - ) -} diff --git a/templates/mellow-react/assets/js/components/GoogleButton.jsx b/templates/mellow-react/assets/js/components/GoogleButton.jsx new file mode 100644 index 00000000..19c04c0e --- /dev/null +++ b/templates/mellow-react/assets/js/components/GoogleButton.jsx @@ -0,0 +1,38 @@ +export default function GoogleButton() { + return ( + + + + + + + + + + + + + + Continue with Google + + ) +} diff --git a/templates/mellow-react/assets/js/components/InputBase.jsx b/templates/mellow-react/assets/js/components/InputBase.jsx new file mode 100644 index 00000000..7b94c63e --- /dev/null +++ b/templates/mellow-react/assets/js/components/InputBase.jsx @@ -0,0 +1,27 @@ +import '~/css/forms.css' + +export default function InputBase({ + name, + label, + id, + icon, + suffix, + type, + placeholder, + ...props +}) { + return ( + + ) +} diff --git a/templates/mellow-react/assets/js/components/InputButton.jsx b/templates/mellow-react/assets/js/components/InputButton.jsx new file mode 100644 index 00000000..84efd02f --- /dev/null +++ b/templates/mellow-react/assets/js/components/InputButton.jsx @@ -0,0 +1,47 @@ +const mergeClasses = (...classes) => { + return classes.filter(Boolean).join(' ') +} +export default function InputButton({ + processing, + className, + label, + ...props +}) { + return ( + + ) +} diff --git a/templates/mellow-react/assets/js/components/InputEmail.jsx b/templates/mellow-react/assets/js/components/InputEmail.jsx new file mode 100644 index 00000000..11f1d471 --- /dev/null +++ b/templates/mellow-react/assets/js/components/InputEmail.jsx @@ -0,0 +1,26 @@ +import InputBase from '@/components/InputBase' + +export default function InputEmail(props) { + return ( + + + + } + {...props} + /> + ) +} diff --git a/templates/mellow-react/assets/js/components/InputPassword.jsx b/templates/mellow-react/assets/js/components/InputPassword.jsx new file mode 100644 index 00000000..e1249cc9 --- /dev/null +++ b/templates/mellow-react/assets/js/components/InputPassword.jsx @@ -0,0 +1,103 @@ +import { useState } from 'react' +import InputBase from '@/components/InputBase' + +export default function InputPassword(props) { + const [showPassword, setShowPassword] = useState(false) + + function toggleShowPassword() { + setShowPassword(!showPassword) + } + + return ( + + + + + + + + + + + + } + suffix={ + + + + } + {...props} + /> + ) +} diff --git a/templates/mellow-react/assets/js/components/InputText.jsx b/templates/mellow-react/assets/js/components/InputText.jsx new file mode 100644 index 00000000..ecf4373d --- /dev/null +++ b/templates/mellow-react/assets/js/components/InputText.jsx @@ -0,0 +1,37 @@ +import InputBase from '@/components/InputBase' + +export default function InputText(props) { + return ( + + + + + + + + + + + + } + {...props} + /> + ) +} diff --git a/templates/mellow-react/assets/js/layouts/AppLayout.jsx b/templates/mellow-react/assets/js/layouts/AppLayout.jsx new file mode 100644 index 00000000..a601b311 --- /dev/null +++ b/templates/mellow-react/assets/js/layouts/AppLayout.jsx @@ -0,0 +1,100 @@ +import { Link, usePage } from '@inertiajs/react' + +export default function AppLayout({ children }) { + const { loggedInUser } = usePage().props + + return ( +
+
+ +
+ +
{children}
+ +
+ + + + + + +

+ Made with love 💚 by + + Kelvin Omereshone + + in Nigeria 🇳🇬 and contributors all over the world 🌍 +

+
+
+ ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/check-email.jsx b/templates/mellow-react/assets/js/pages/auth/check-email.jsx new file mode 100644 index 00000000..aa8619d4 --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/check-email.jsx @@ -0,0 +1,71 @@ +import { Link, Head } from '@inertiajs/react' + +export default function CheckEmail({ message }) { + return ( + <> + +
+
+
+ + + + + + + + + + + + +

Check your email

+ {message &&

{message}

} + + +

+ Didn't receive email? + + Resend + +

+
+
+
+ + + + + Back to sign up + +
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/forgot-password.jsx b/templates/mellow-react/assets/js/pages/auth/forgot-password.jsx new file mode 100644 index 00000000..27c0aa5f --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/forgot-password.jsx @@ -0,0 +1,92 @@ +import { Link, Head, useForm } from '@inertiajs/react' +import InputEmail from '@/components/InputEmail' +import InputButton from '@/components/InputButton' +import { useMemo } from 'react' +export default function ForgotPassword() { + const { data, setData, ...form } = useForm({ + email: '' + }) + + const disableForgetPasswordButton = useMemo(() => { + const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/ + const isEmailValid = emailRegex.test(data.email) + if (!isEmailValid) return true + if (form.processing) return true + return false + }) + + function submit(e) { + e.preventDefault() + form.post('/forgot-password') + } + + return ( + <> + +
+
+
+ + + + + + + + + + + + +

Forgot password?

+

+ We'll send reset instructions to your email +

+
+
+ setData('email', e.target.value)} + /> + {form.errors.email && ( +

{form.errors.email}

+ )} + + +
+
+ + + + + Back to login + +
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/link-expired.jsx b/templates/mellow-react/assets/js/pages/auth/link-expired.jsx new file mode 100644 index 00000000..28c60bdd --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/link-expired.jsx @@ -0,0 +1,65 @@ +import { Link, Head } from '@inertiajs/react' +export default function LinkExpired() { + return ( + <> + +
+
+
+ + + + + + + + + + + + +

Token expired

+

+ The token sent to your email has expired or been used. +

+ + Resend link + +
+
+
+ + + + + Back to sign up + +
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/login.jsx b/templates/mellow-react/assets/js/pages/auth/login.jsx new file mode 100644 index 00000000..ec386ddd --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/login.jsx @@ -0,0 +1,112 @@ +import { Link, Head, useForm } from '@inertiajs/react' +import { useState, useMemo } from 'react' + +import InputEmail from '@/components/InputEmail' +import InputPassword from '@/components/InputPassword' +import InputButton from '@/components/InputButton' +import GoogleButton from '@/components/GoogleButton' + +export default function Login() { + const { data, setData, ...form } = useForm({ + email: '', + password: '', + rememberMe: false + }) + + const disableLoginButton = useMemo(() => { + if (!data.email) return true + if (!data.password) return true + if (form.processing) return true + return false + }, [data.email, data.password, form.processing]) + + function submit(e) { + e.preventDefault() + form.post('/login') + } + return ( + <> + +
+
+
+ + + + + + +

Log into your account

+

+ Welcome back, please enter your details +

+ {form.errors.email || + (form.errors.login && ( +

+ {form.errors.login || form.errors.email} +

+ ))} +
+
+ setData('email', e.target.value)} + /> + setData('password', e.target.value)} + /> +
+ + + + Forgot Password + +
+ + + +
+
+

+ Don't have an account yet? + + Sign up + +

+
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/reset-password.jsx b/templates/mellow-react/assets/js/pages/auth/reset-password.jsx new file mode 100644 index 00000000..12f19691 --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/reset-password.jsx @@ -0,0 +1,168 @@ +import { Link, Head, useForm } from '@inertiajs/react' +import { useMemo } from 'react' +import InputPassword from '@/components/InputPassword' +import InputButton from '@/components/InputButton' +export default function ResetPassword({ token }) { + const { data, setData, ...form } = useForm({ + token, + password: '', + confirmPassword: '' + }) + + const containsSpecialChars = useMemo(() => { + const specialChars = /[`!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/ + return specialChars.test(data.password) + }, [data.password]) + + const passwordIsValid = useMemo(() => { + return data.password?.length >= 8 + }) + + const disableResetPasswordButton = useMemo(() => { + if (!passwordIsValid) return true + if (!containsSpecialChars) return true + if (form.processing) return true + if (data.password != data.confirmPassword) return true + return false + }, [data.password, data.confirmPassword, form.processing]) + + function submit(e) { + e.preventDefault() + form.post('/reset-password') + } + + return ( + <> + +
+
+
+ + + + + + + + + + + + + +

Create a new password

+

Set a new password

+
+
+ setData('password', e.target.value)} + /> + {form.errors.password && ( +

{form.errors.password}

+ )} + setData('confirmPassword', e.target.value)} + /> + {form.errors.password && ( +

{form.errors.password}

+ )} +
    +
  • + + + + + + + + + + + At least 8 characters +
  • +
  • + + + + + + + + + + + At least 1 special characters +
  • +
+ + + +
+
+ + + + + Back to login + +
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/signup.jsx b/templates/mellow-react/assets/js/pages/auth/signup.jsx new file mode 100644 index 00000000..728d4817 --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/signup.jsx @@ -0,0 +1,178 @@ +import { Link, Head, useForm } from '@inertiajs/react' +import { useMemo } from 'react' + +import InputText from '@/components/InputText' +import InputEmail from '@/components/InputEmail' +import InputPassword from '@/components/InputPassword' +import InputButton from '@/components/InputButton' +import GoogleButton from '@/components/GoogleButton' + +export default function Signup() { + const { data, setData, ...form } = useForm({ + fullName: '', + email: '', + password: '' + }) + + const containsSpecialChars = useMemo(() => { + const specialChars = /[`!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/ + return specialChars.test(data.password) + }, [data.password]) + + const passwordIsValid = useMemo(() => { + return data.password?.length >= 8 + }) + + const disableSignupButton = useMemo(() => { + if (!passwordIsValid) return true + if (!containsSpecialChars) return true + if (form.processing) return true + return false + }) + + function submit(e) { + e.preventDefault() + form.post('/signup') + } + return ( + <> + +
+
+
+ + + + + + + +

Create your account

+

+ Welcome! Please enter your details to sign up +

+
+ {form.errors.signup && ( +

+ {form.errors?.signup} +

+ )} + +
+ setData('fullName', e.target.value)} + /> + + {form.errors.fullName && ( +

+ {form.errors.fullName} +

+ )} + setData('email', e.target.value)} + /> + {form.errors.email && ( +

{form.errors.email}

+ )} + setData('password', e.target.value)} + /> + {form.errors.password && ( +

{form.errors.password}

+ )} +
    +
  • + + + + + + + + + + + At least 8 characters +
  • +
  • + + + + + + + + + + + At least 1 special characters +
  • +
+

+ You agree to our + + Terms Of Use + + and + + Privacy Policy + +

+ + + +
+
+

+ Already have an account? + + Login + +

+
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/auth/success.jsx b/templates/mellow-react/assets/js/pages/auth/success.jsx new file mode 100644 index 00000000..83091d56 --- /dev/null +++ b/templates/mellow-react/assets/js/pages/auth/success.jsx @@ -0,0 +1,51 @@ +import { Link, Head } from '@inertiajs/react' + +export default function Success({ pageTitle, pageHeading, message }) { + return ( + <> + +
+
+
+ + + + + + + + + + + + +

{pageHeading}

+

+ {message}. Click continue to go to the homepage +

+ + Continue + +
+
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/dashboard/index.jsx b/templates/mellow-react/assets/js/pages/dashboard/index.jsx new file mode 100644 index 00000000..dcbd565f --- /dev/null +++ b/templates/mellow-react/assets/js/pages/dashboard/index.jsx @@ -0,0 +1,30 @@ +import { Link, Head, usePage } from '@inertiajs/react' +import AppLayout from '@/layouts/AppLayout' + +Dashboard.layout = (page) => +export default function Dashboard() { + const page = usePage() + const loggedInUser = page.props.loggedInUser + + return ( + <> + +
+
+

+ Welcome, {loggedInUser.fullName} +

+

+ You are logged in as {loggedInUser.email} +

+ + Edit Profile + +
+
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/dashboard/profile.jsx b/templates/mellow-react/assets/js/pages/dashboard/profile.jsx new file mode 100644 index 00000000..5855e7d6 --- /dev/null +++ b/templates/mellow-react/assets/js/pages/dashboard/profile.jsx @@ -0,0 +1,173 @@ +import { Link, Head, usePage, useForm, router } from '@inertiajs/react' + +import AppLayout from '@/layouts/AppLayout' + +import InputText from '@/components/InputText' +import InputPassword from '@/components/InputPassword' +import InputEmail from '@/components/InputEmail' +import InputButton from '@/components/InputButton' + +Profile.layout = (page) => +export default function Profile() { + const loggedInUser = usePage().props.loggedInUser + const { data, setData, ...form } = useForm({ + email: loggedInUser.email, + fullName: loggedInUser.fullName, + currentPassword: undefined, + password: undefined, + confirmPassword: undefined + }) + + const { + data: deleteAccountData, + setData: setDeleteAccountData, + ...deleteAccountForm + } = useForm({ + password: undefined + }) + + function updateProfile(e) { + e.preventDefault() + form.patch(`/profile`, { + preserveScroll: true, + preserveState: true, + onError: (errors) => { + console.error('Update failed:', errors) + } + }) + } + + function deleteAccount(e) { + e.preventDefault() + if ( + confirm( + 'Are you sure you want to delete your account? This action cannot be undone.' + ) + ) { + deleteAccountForm.delete('/profile') + } + } + + return ( + <> + +
+
+
+

Profile Information

+

+ Update your account's profile information and email address. +

+
+ +
+ setData('fullName', e.target.value)} + /> + setData('email', e.target.value)} + /> +
+ +
+ {form.recentlySuccessful && ( +

+ Profile updated successfully! +

+ )} + +
+ +
+
+

Change Password

+

+ Ensure your account is using a long, random password to stay + secure. +

+
+ +
+ setData('currentPassword', e.target.value)} + placeholder="Current Password" + /> + setData('password', e.target.value)} + placeholder="New Password" + /> + setData('confirmPassword', e.target.value)} + /> + {form.errors.password && ( +

+ {form.errors.password} +

+ )} +
+ +
+ {form.recentlySuccessful && ( +

+ Profile updated successfully! +

+ )} + +
+ +
+
+

Delete Account

+

+ Once your account is deleted, all of its resources and data will + be permanently deleted. Before deleting your account, please + download any data or information that you wish to retain. +

+
+ +
+ setDeleteAccountData('password', e.target.value)} + /> +
+ +
+ +
+ + router.delete('/logout')} + className="w-full border-red-600 bg-red-600" + label="Logout" + /> +
+ + ) +} diff --git a/templates/mellow-react/assets/js/pages/example.jsx b/templates/mellow-react/assets/js/pages/example.jsx deleted file mode 100644 index ecb81c27..00000000 --- a/templates/mellow-react/assets/js/pages/example.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Link } from '@inertiajs/react' -export default function Hello({ quote }) { - return ( -
-

{quote}

- - Back to Home - -
- ) -} diff --git a/templates/mellow-react/assets/js/pages/index.jsx b/templates/mellow-react/assets/js/pages/index.jsx index 788c907e..e8877062 100644 --- a/templates/mellow-react/assets/js/pages/index.jsx +++ b/templates/mellow-react/assets/js/pages/index.jsx @@ -1,57 +1,176 @@ -import Counter from '@/components/Counter' -import { Link } from '@inertiajs/react' +import { Link, Head } from '@inertiajs/react' +import AppLayout from '@/layouts/AppLayout' +import '~/css/homepage.css' -export default function Index({ name }) { +Index.layout = (page) => + +export default function Index() { return ( -
-

- A brand new - {name} app - on Sails -

- + <> + +
+

+ Simplify Authentication, Focus on Shipping 🚀 +

+

+ Mellow handles user management, so you can build what matters. +

+
+
+ +
+ +
+
+

+ Productivity +

+

+ Let Mellow be the starting point of your next SPA. With + authentication and profile management taken care of, you can focus + on your core business logic +

+
+
+

+ Seamless authentication +

+

+ Experience effortless user authentication and simplified profile + management with Mellow, creating a seamless user journey for + developers and users. +

+
+
+

+ Profile management +

+

+ Let users manage their profiles with ease using Mellow. It offers a + simple and secure way to update their name, email address, and + password. +

+
+
+
+

+ Frequently asked questions +

+
+
+ What is Mellow? +

+ Mellow is the default starter template for The Boring JavaScript + Stack. It provides authentication and profile management out of + the box. +

+
+
+ + How do I get started with Mellow? + +

+ Chances are you already have scaffolded a new project using Mellow + if you are seeing this. Just open up the project in your editor + and start coding away. +

+
+
+ + Can I customize Mellow? + +

+ For sure! All the code in Mellow is open source so you can copy + and paste and customize to your heart's content. +

+
+
+
+ ) } diff --git a/templates/mellow-react/config/blueprints.js b/templates/mellow-react/config/blueprints.js index c9c82b58..9966546a 100644 --- a/templates/mellow-react/config/blueprints.js +++ b/templates/mellow-react/config/blueprints.js @@ -28,5 +28,5 @@ module.exports.blueprints = { * (These are enabled by default in development only.) * * * ***************************************************************************/ - shortcuts: false, + shortcuts: false } diff --git a/templates/mellow-react/config/custom.js b/templates/mellow-react/config/custom.js index 3bb077da..0a668dbf 100644 --- a/templates/mellow-react/config/custom.js +++ b/templates/mellow-react/config/custom.js @@ -9,6 +9,39 @@ */ module.exports.custom = { + /************************************************************************** + * * + * The base URL to use during development. * + * * + * • No trailing slash at the end * + * • `http://` or `https://` at the beginning. * + * * + * > This is for use in custom logic that builds URLs. * + * > It is particularly handy for building dynamic links in emails, * + * > but it can also be used for user-uploaded images, webhooks, etc. * + * * + **************************************************************************/ + baseUrl: 'http://localhost:1337', + + /************************************************************************** + * * + * The TTL (time-to-live) for various sorts of tokens before they expire. * + * * + **************************************************************************/ + passwordResetTokenTTL: 24 * 60 * 60 * 1000, // 24 hours + emailProofTokenTTL: 24 * 60 * 60 * 1000, // 24 hours + + /************************************************************************** + * * + * The extended length that browsers should retain the session cookie * + * if "Remember Me" was checked while logging in. * + * * + **************************************************************************/ + rememberMeCookieMaxAge: 30 * 24 * 60 * 60 * 1000, // 30 days + + // Email address for receiving support messages & other correspondences. + internalEmail: 'support+development@example.com' + /*************************************************************************** * * * Any other custom config this Sails app should use during development. * diff --git a/templates/mellow-react/config/env/testing.js b/templates/mellow-react/config/env/testing.js new file mode 100644 index 00000000..5b6a0f82 --- /dev/null +++ b/templates/mellow-react/config/env/testing.js @@ -0,0 +1,27 @@ +module.exports = { + port: 3333, + hooks: { + // Uncomment if you have the apianalytics hook and you don't want to see logs + // from it during testing + // apianalytics: false + }, + log: { + level: 'error' + }, + models: { + migrate: 'drop' + }, + datastores: { + default: { + adapter: 'sails-disk' + } + }, + mail: { + default: 'log', + mailers: { + log: { + transport: 'log' + } + } + } +} diff --git a/templates/mellow-react/config/mail.js b/templates/mellow-react/config/mail.js new file mode 100644 index 00000000..3ebccaf9 --- /dev/null +++ b/templates/mellow-react/config/mail.js @@ -0,0 +1,60 @@ +/** + * Mail + * (sails.config.mail) + * + * Use the settings below to configure mail ntegration in your app. + * + * For more information on Mail configuration, visit: + * https://docs.sailscasts.com/mail/ + */ + +module.exports.mail = { + /** + * Default Mailer + * (sails.config.mail.default) + * + * Determines the default mailer used to send email messages from your Sails application. + * You can set up alternative mailers and use them as needed, but this mailer will be + * the default choice. + * + */ + default: process.env.MAIL_MAILER || 'log', + /** + * Mailer Configurations + * (config.mail.mailers) + * + * Configure all the mailers used by your Sails application along with their respective settings. + * Several examples have been provided for you, and you are free to add your own mailers based on + * your application's requirements. + * + * Sails Mail supports various mail "transport" options for sending emails. You can specify which one + * you are using for your mailers below. Feel free to add additional mailers as needed. + * + * Supported transports: "log", "smtp", "resend", + * + */ + mailers: { + smtp: { + transport: 'smtp' + }, + log: { + transport: 'log' + }, + nodemailer: { + transport: 'smtp' + } + }, + /** + * Global "From" Address + * (config.mail.from) + * + * Set a default name and email address to be used as the sender for all emails + * sent by your Sails application. This global "From" address ensures that all + * outgoing emails have a consistent sender identity. + * + */ + from: { + address: 'boring@sailscasts.com', + name: 'The Boring JavaScript Stack' + } +} diff --git a/templates/mellow-react/config/policies.js b/templates/mellow-react/config/policies.js index 859e0fa6..f928148b 100644 --- a/templates/mellow-react/config/policies.js +++ b/templates/mellow-react/config/policies.js @@ -15,5 +15,8 @@ module.exports.policies = { * (`true` allows public access) * * * ***************************************************************************/ - // '*': true, + 'auth/*': 'is-guest', + 'auth/view-success': true, + 'user/*': 'is-authenticated', + 'dashboard/*': 'is-authenticated' } diff --git a/templates/mellow-react/config/routes.js b/templates/mellow-react/config/routes.js index 4961d3e5..f038580f 100644 --- a/templates/mellow-react/config/routes.js +++ b/templates/mellow-react/config/routes.js @@ -18,6 +18,37 @@ module.exports.routes = { * for configuration options and examples. * * * ***************************************************************************/ - 'GET /': 'home/index', - 'GET /example': 'example/index' + 'GET /': 'home/view-home', + + 'GET /signup': 'auth/view-signup', + 'POST /signup': 'auth/signup', + + 'GET /check-email': 'auth/view-check-email', + 'GET /verify-email': 'auth/verify-email', + + 'GET /link-expired': 'auth/view-link-expired', + 'GET /resend-link': 'auth/resend-link', + + 'GET /:operation/success': 'auth/view-success', + + 'GET /login': 'auth/view-login', + 'POST /login': 'auth/login', + + 'GET /forgot-password': 'auth/view-forgot-password', + 'POST /forgot-password': 'auth/forgot-password', + + 'GET /reset-password': 'auth/view-reset-password', + 'POST /reset-password': 'auth/reset-password', + + 'GET /dashboard': 'dashboard/view-dashboard', + + 'GET /profile': 'user/view-profile', + 'PATCH /profile': 'user/update-profile', + 'DELETE /profile': 'user/delete-profile', + + 'DELETE /logout': 'user/logout', + + 'GET /auth/:provider/redirect': 'auth/redirect', + + 'GET /auth/:provider/callback': 'auth/callback' } diff --git a/templates/mellow-react/jsconfig.json b/templates/mellow-react/jsconfig.json index 77476791..0c635be7 100644 --- a/templates/mellow-react/jsconfig.json +++ b/templates/mellow-react/jsconfig.json @@ -1,6 +1,6 @@ { - "include": ["api/**/*", "assets/js/**/*", "types/index.d.ts"], - "exclude": [".tmp/**/*"], + "include": ["api/**/*", "assets/js/**/*"], + "compilerOptions": { "types": ["node"], "typeRoots": ["./types", "./node_modules/@types"], @@ -8,8 +8,7 @@ // silences wrong TS error, we don't compile, we only typecheck "outDir": "./irrelevant/unused", "allowJs": true, - "checkJs": true, - "jsx": "react-jsx", + "checkJs": false, "noImplicitThis": true, "noUnusedLocals": true, "noUnusedParameters": true, @@ -17,8 +16,7 @@ "noErrorTruncation": true, "baseUrl": ".", "paths": { - "@/*": ["assets/js/*"], - "~/*": ["assets/*"] + "@/*": ["assets/js/*"] } } } diff --git a/templates/mellow-react/package-lock.json b/templates/mellow-react/package-lock.json index 96401fc9..c3a97120 100644 --- a/templates/mellow-react/package-lock.json +++ b/templates/mellow-react/package-lock.json @@ -8,27 +8,31 @@ "name": "mellow-react", "version": "0.0.0", "dependencies": { - "@inertiajs/react": "^1.0.15", - "@sailshq/connect-redis": "^3.2.1", - "@sailshq/lodash": "^3.10.3", - "@sailshq/socket.io-redis": "^5.2.0", + "@inertiajs/react": "^1.2.0", + "@sailshq/connect-redis": "^6.1.3", + "@sailshq/lodash": "^3.10.6", + "@sailshq/socket.io-redis": "^6.1.2", "inertia-sails": "^0.2.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sails": "^1.5.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sails": "^1.5.12", "sails-flash": "^0.0.1", - "sails-hook-orm": "^4.0.0", - "sails-hook-sockets": "^2.0.0" + "sails-hook-mail": "^0.1.0", + "sails-hook-organics": "^3.0.0", + "sails-hook-orm": "^4.0.3", + "sails-hook-sockets": "^3.0.1" }, "devDependencies": { - "@rsbuild/plugin-react": "^0.7.3", - "create-sails-generator": "^0.0.1", - "prettier": "^2.6.2", - "prettier-plugin-tailwindcss": "^0.1.11", - "sails-hook-shipwright": "^0.2.0", + "@rsbuild/plugin-react": "^1.0.2", + "@types/node": "^22.5.5", + "create-sails-generator": "^0.0.3", + "playwright": "^1.47.1", + "prettier": "^2.8.8", + "prettier-plugin-tailwindcss": "^0.4.1", + "sails-hook-shipwright": "^0.3.0", "sails.io.js": "^1.2.1", - "socket.io-client": "^2.2.0", - "tailwindcss": "^3.0.24" + "socket.io-client": "^4.7.5", + "tailwindcss": "^3.4.12" }, "engines": { "node": ">=18.0" @@ -47,9 +51,10 @@ } }, "node_modules/@inertiajs/core": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.15.tgz", - "integrity": "sha512-7h73+manxkpXdSPlVa2uSjo10AbSS0z9Q1jV7r/otqHfTYCNp7JJxHUX4QpKq/3Z88U8bDUe1RRix1o76pyd5Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.2.0.tgz", + "integrity": "sha512-6U0gqCPbGGGMcLoDm+ckKipc5gptZMmfVFfPGdO7vlO7yipWf1RD+TKkcZGJklFvfgFMKwK2VPw8GAv1OctuQA==", + "license": "MIT", "dependencies": { "axios": "^1.6.0", "deepmerge": "^4.0.0", @@ -58,11 +63,12 @@ } }, "node_modules/@inertiajs/react": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.0.15.tgz", - "integrity": "sha512-T+eDD8Yz5FZ3Qbd0xKXbfRNSrZAQP6o2+jKv7Jakyzjr8ZLdcIpXmevqlGGo5Tc3/ZLzHAX4+2fzpyEKtfonng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@inertiajs/react/-/react-1.2.0.tgz", + "integrity": "sha512-Q3wTaQJdoUbUB8YIGeQ0y2Tf/k8dNtz9Nu2dYr1pbYUBv++6d45iC/CFB/lIpqVvvUw8XuIai2bdsUcRSIbPCQ==", + "license": "MIT", "dependencies": { - "@inertiajs/core": "1.0.15", + "@inertiajs/core": "1.2.0", "lodash.isequal": "^4.5.0" }, "peerDependencies": { @@ -118,38 +124,42 @@ } }, "node_modules/@module-federation/runtime": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.1.6.tgz", - "integrity": "sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/sdk": "0.1.6" + "@module-federation/sdk": "0.5.1" } }, "node_modules/@module-federation/runtime-tools": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.1.6.tgz", - "integrity": "sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.1.6", - "@module-federation/webpack-bundler-runtime": "0.1.6" + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" } }, "node_modules/@module-federation/sdk": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.1.6.tgz", - "integrity": "sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==", - "dev": true + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true, + "license": "MIT" }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.1.6.tgz", - "integrity": "sha512-K5WhKZ4RVNaMEtfHsd/9CNCgGKB0ipbm/tgweNNeC11mEuBTNxJ09Y630vg3WPkKv9vfMCuXg2p2Dk+Q/KWTSA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime": "0.1.6", - "@module-federation/sdk": "0.1.6" + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" } }, "node_modules/@nodelib/fs.scandir": { @@ -188,199 +198,197 @@ } }, "node_modules/@rsbuild/core": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-0.7.3.tgz", - "integrity": "sha512-Zf49scJ706Zu6PEA/nl99XLEgouNacK4RzF4ckqQalR+FW5iyc9/WYTQYUWf/g7IhQsYy61W/5pv3ddEkCjzYA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.0.4.tgz", + "integrity": "sha512-ACvCzeyW5gW5olGBzK5Tnc5RfUOQ+BPnMB7Y0Iycz0pRYAghKQcYkpPZlEpdsKQDNeBUKk9loOy+Z7Rca4Ouzw==", "dev": true, + "license": "MIT", "dependencies": { - "@rsbuild/shared": "0.7.3", - "@rspack/core": "0.7.1", - "@swc/helpers": "0.5.3", - "core-js": "~3.36.0", - "html-webpack-plugin": "npm:html-rspack-plugin@5.7.2", - "postcss": "^8.4.38" + "@rspack/core": "~1.0.5", + "@rspack/lite-tapable": "~1.0.0", + "@swc/helpers": "^0.5.13", + "caniuse-lite": "^1.0.30001659", + "core-js": "~3.38.1" }, "bin": { "rsbuild": "bin/rsbuild.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=16.7.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, "node_modules/@rsbuild/plugin-react": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@rsbuild/plugin-react/-/plugin-react-0.7.3.tgz", - "integrity": "sha512-v1eVRyyw8T0EXW19bGbc6IJMD0+jRiEpvSdVkivRFVvVW5wqNnEajBoFMvfhoHw7VywVkH1CFhjSFX6omAe+fw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rsbuild/plugin-react/-/plugin-react-1.0.2.tgz", + "integrity": "sha512-8Sa4AJ43/ift7ZW1iNMA38ZIEDXNINPa8rGI38u7b42yBgMUWBan8yDjFYAC0Gkg3lh8vCWYVQYZp0RyIS7lqA==", "dev": true, + "license": "MIT", "dependencies": { - "@rsbuild/shared": "0.7.3", - "@rspack/plugin-react-refresh": "0.7.1", + "@rspack/plugin-react-refresh": "1.0.0", "react-refresh": "^0.14.2" }, "peerDependencies": { - "@rsbuild/core": "^0.7.3" - } - }, - "node_modules/@rsbuild/shared": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@rsbuild/shared/-/shared-0.7.3.tgz", - "integrity": "sha512-TBD0rlZOayK0clLwmcTMMXXEIR6R8rNHmSLglPd3lZaBBim8yhDgudR5gNUFvO5zOefaV1SBj/Mr1uQqSyHzOg==", - "dev": true, - "dependencies": { - "@rspack/core": "0.7.1", - "caniuse-lite": "^1.0.30001625", - "html-webpack-plugin": "npm:html-rspack-plugin@5.7.2", - "postcss": "^8.4.38" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "@rsbuild/core": "1.x || ^1.0.1-rc.0" } }, "node_modules/@rspack/binding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-0.7.1.tgz", - "integrity": "sha512-4C9qRDytKIaExmCExTHPQlONeZMHQK/fyXGlVo/WIK/OLQj6XDshJ0Jk7YHE6XNwai3m3LwNNkEFeluMLVO1yQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.0.5.tgz", + "integrity": "sha512-SnVrzRWeKSosJ0/1e5taAeqJ1ISst6NAE1N8YK4ZdUEVWmE26tC2V/yTvZHSsqatc/0Cf+A18IZJx0q6H/DlRw==", "dev": true, + "license": "MIT", "optionalDependencies": { - "@rspack/binding-darwin-arm64": "0.7.1", - "@rspack/binding-darwin-x64": "0.7.1", - "@rspack/binding-linux-arm64-gnu": "0.7.1", - "@rspack/binding-linux-arm64-musl": "0.7.1", - "@rspack/binding-linux-x64-gnu": "0.7.1", - "@rspack/binding-linux-x64-musl": "0.7.1", - "@rspack/binding-win32-arm64-msvc": "0.7.1", - "@rspack/binding-win32-ia32-msvc": "0.7.1", - "@rspack/binding-win32-x64-msvc": "0.7.1" + "@rspack/binding-darwin-arm64": "1.0.5", + "@rspack/binding-darwin-x64": "1.0.5", + "@rspack/binding-linux-arm64-gnu": "1.0.5", + "@rspack/binding-linux-arm64-musl": "1.0.5", + "@rspack/binding-linux-x64-gnu": "1.0.5", + "@rspack/binding-linux-x64-musl": "1.0.5", + "@rspack/binding-win32-arm64-msvc": "1.0.5", + "@rspack/binding-win32-ia32-msvc": "1.0.5", + "@rspack/binding-win32-x64-msvc": "1.0.5" } }, "node_modules/@rspack/binding-darwin-arm64": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-0.7.1.tgz", - "integrity": "sha512-nuTZ720C33OZL0otuGy0RYw/AmX7UF/Siq7Kq/sy5T6jtHX7Yy/RWEZG3pKlZWDgbvjHw4jZ+4M9/arTRgMacQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.0.5.tgz", + "integrity": "sha512-pEHj4AOluOa7FaR1DMACPUUZKO3qZI4/66xaTqk0BbclvMT7eheQAWtkmjdE9WJgeZ389TrwZeaMzzPdHhK/6Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rspack/binding-darwin-x64": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-0.7.1.tgz", - "integrity": "sha512-GRDmYOUx24dZ5UlayZvMHNySK9m2WUpVkR0rPURI0XMG64+OqOwgbaopmgrDKgMNCOmpieR0q6zP4X5cBH4CNA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.0.5.tgz", + "integrity": "sha512-xS5EDD9l3MHL54bnmxsndm61P9l3l7ZNuLSuPl2MbYJzDqPdnXhTdkIjdcDOLH2daFm8gfB634wa5knZhPGLOw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.7.1.tgz", - "integrity": "sha512-w4pbei0AQZfw5JhbkELY9r4a+jY3fVNfgI+NxqVEcx3oglHfM5bPW0zw6c8B4hMAFEF83+YTvI9yIsPOfUtt0w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.5.tgz", + "integrity": "sha512-svPOFlem7s6T33tX8a28uD5Ngc7bdML96ioiH7Fhi0J/at+WAthor4GeUNwkwuzBQI/Nc9XCgiYPcE0pzP7c6w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.7.1.tgz", - "integrity": "sha512-rwGTbhJq0a+uWq0dsgR20+x8XB5Vnj1Ejk2V6XjA5mOVxf8W9zRJx2S0RjDF33o/r4YQE4P26FrOHKkR57nKuw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.5.tgz", + "integrity": "sha512-cysqogEUNc0TgzzXcK9bkv12eoCjqhLzOvGXQU1zSEU9Hov7tuzMDl3Z6R3A7NgOCmWu84/wOnTrkSOI28caew==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.7.1.tgz", - "integrity": "sha512-7xtSbOGovZ5A9F7sumbSpDby8DYpKHfbfVnGpmjvngiLYUb3tcVEi1JydFjxbIaebd0hhR4h3rdwjPKbFW7ZVw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.5.tgz", + "integrity": "sha512-qIEMsWOzTKpVm0Sg553gKkua49Kd/sElLD1rZcXjjxjAsD97uq8AiNncArMfYdDKgkKbtwtW/Fb3uVuafTLnZg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-linux-x64-musl": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-0.7.1.tgz", - "integrity": "sha512-EuOvMlDtpPL4lAetLW0InnZEMdVDoZfZ71vXu1u8/cPlbo32VD76ayymLgOmW0FX4hezKsu40LJKNWjCOmg4eA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.5.tgz", + "integrity": "sha512-yulltMSQN3aBt3NMURYTmJcpAJBi4eEJ4i9qF0INE8f0885sJpI0j35/31POkCghG1ZOSZkYALFrheKKP9e8pg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.7.1.tgz", - "integrity": "sha512-e1ZWVErTmrGOQUM4pEwHymS/d+j9W7aeCrD2Bd8HuR1C4+hjlD7BUHCIosZk64uYYct4jI6qMkPE9vkP9942YA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.5.tgz", + "integrity": "sha512-5oF/qN6TnUj28UAdaOgSIWKq7HG5QgI4p37zvQBBTXZHhrwN2kE6H+TaofWnSqWJynwmGIxJIx8bGo3lDfFbfA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.7.1.tgz", - "integrity": "sha512-RrUMGCAh8aZvmHGs1Y5R3fs2TjK1n20SWyuNVb6rAoPjvPT9cxW71XOxnD0bdJm+NEunR7BzL+IdoKAgkFGDog==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.5.tgz", + "integrity": "sha512-y16IPjd/z6L7+r6RXLu7J/jlZDUenSnJDqo10HnnxtLjOJ+vna+pljI8sHcwu1ao0c3J3uMvbkF34dTiev7Opg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.7.1.tgz", - "integrity": "sha512-QNO2gL3XZK5mGjZYVwdEfvBgzJZdQiJ7GR7WGCoVT3duRzueGErTKe1Q0DgDKNN5zzGRgs1FSJFKtKS3eKOGNg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.5.tgz", + "integrity": "sha512-PSBTbDSgT+ClYvyQTDtWBi/bxXW/xJmVjg9NOWe8KAEl5WNU+pToiCBLLPCGDSa+K7/zr2TDb6QakG/qYItPZw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rspack/core": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-0.7.1.tgz", - "integrity": "sha512-ZOVRucpC5FDT00FD5ynEZb7siXVyHnxzoJNhcv67OqtTcaO8e7iQiOE8fHMJM4Z2Ix0zGKQn5/FV9G6MZoH+4w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.0.5.tgz", + "integrity": "sha512-UlydS2VupZ6yBx3jCqCHpeEUQNWCrBkTQhPIezK0eCAk13i745byjqXX4tcfN6jR5Kjh/1CIb8r07k9DgGON1w==", "dev": true, + "license": "MIT", "dependencies": { - "@module-federation/runtime-tools": "0.1.6", - "@rspack/binding": "0.7.1", - "caniuse-lite": "^1.0.30001616", - "tapable": "2.2.1", - "webpack-sources": "3.2.3" + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.0.5", + "@rspack/lite-tapable": "1.0.0", + "caniuse-lite": "^1.0.30001616" }, "engines": { "node": ">=16.0.0" @@ -394,11 +402,26 @@ } } }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.0.tgz", + "integrity": "sha512-7MZf4lburSUZoEenwazwUDKHhqyfnLCGnQ/tKcUtztfmVzfjZfRn/EaiT0AKkYGnL2U8AGsw89oUeVyvaOLVCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@rspack/plugin-react-refresh": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-0.7.1.tgz", - "integrity": "sha512-PVolWxsoFVeEEYfrLaJnPuLuz/pan/yzMow68UBMsk5667FzP5014AE+DIoOh2pIOFD+U3P+ujgz+sJNQ2CCnA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.0.0.tgz", + "integrity": "sha512-WvXkLewW5G0Mlo5H1b251yDh5FFiH4NDAbYlFpvFjcuXX2AchZRf9zdw57BDE/ADyWsJgA8kixN/zZWBTN3iYA==", "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0" + }, "peerDependencies": { "react-refresh": ">=0.10.0 <1.0.0" }, @@ -417,34 +440,19 @@ } }, "node_modules/@sailshq/connect-redis": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sailshq/connect-redis/-/connect-redis-3.2.1.tgz", - "integrity": "sha512-WoirB/kUnHm5ORSMjyqElmdIY+Xq/gwW5HxKr0V8u6p833rMP25JXParG8IBo3Y3R+IUQEmv9JeJs/tE09eh5Q==", - "dependencies": { - "debug": "^2.2.0", - "redis": "^2.1.0" - }, + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sailshq/connect-redis/-/connect-redis-6.1.3.tgz", + "integrity": "sha512-KFIMY/rGW82aNDk2bp2qpxV1+t7S9OSre3LNrCNsUsBnddonq3DjGnVp88i4QFNTe8lcw3g7z0IHC3bEafMVJg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/@sailshq/connect-redis/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@sailshq/connect-redis/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/@sailshq/lodash": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/@sailshq/lodash/-/lodash-3.10.4.tgz", - "integrity": "sha512-YXJqp9gdHcZKAmBY/WnwFpPtNQp2huD/ME2YMurH2YHJvxrVzYsmpKw/pb7yINArRpp8E++fwbQd3ajYXGA45Q==" + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@sailshq/lodash/-/lodash-3.10.6.tgz", + "integrity": "sha512-gp2pRE/kyh3DbrQ7MaI65xNcjrToZHRa52XJsNB8kZ0Aj0fcDNQPw8entkcuaaPYzCPxXau4rpOXaw/rl0c/ZQ==", + "license": "MIT" }, "node_modules/@sailshq/nedb": { "version": "1.8.2", @@ -463,30 +471,153 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" }, - "node_modules/@sailshq/socket.io-redis": { + "node_modules/@sailshq/request": { + "version": "2.88.3", + "resolved": "https://registry.npmjs.org/@sailshq/request/-/request-2.88.3.tgz", + "integrity": "sha512-hjWZxn/yVU7G/N9OwglSmCPyZqBb6hBqGAAR8GDX5IEIXrBSOb5rhcMI4zYQ802VE6F36YWauDswv+lu8TjPug==", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sailshq/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@sailshq/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/@sailshq/request/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@sailshq/socket.io-redis/-/socket.io-redis-5.2.1.tgz", - "integrity": "sha512-ucQfoDPigpC1qRfVYsm2lAz/jWW1NVuSS6gIGdKsF0WiB9CbFJeYIwhdfUtjWxaW1Mf73nkSd/FHo4lLOXM7jg==", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/@sailshq/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@sailshq/router": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@sailshq/router/-/router-1.3.9.tgz", + "integrity": "sha512-giCbgFJSChKC1MP3JnbY5mqQmlsAmYh9oXmuiXsA553LVY8fcPiI5j7LCVrKFcJ+bsI0MRHwrZOvayfni4SIew==", + "license": "MIT", "dependencies": { - "debug": "~2.6.8", - "notepack.io": "~2.1.2", - "redis": "3.1.1", - "socket.io-adapter": "~1.1.0", - "uid2": "0.0.3" + "array-flatten": "3.0.0", + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.11", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/@sailshq/socket.io-redis/node_modules/debug": { + "node_modules/@sailshq/router/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/@sailshq/socket.io-redis/node_modules/ms": { + "node_modules/@sailshq/router/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/@sailshq/router/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@sailshq/router/node_modules/path-to-regexp": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.11.tgz", + "integrity": "sha512-c0t+KCuUkO/YDLPG4WWzEwx3J5F/GHXsD1h/SNZfySqAIKe/BaP95x8fWtOfRJokpS5yYHRJjMtYlXD8jxnpbw==", + "license": "MIT" + }, + "node_modules/@sailshq/socket.io-redis": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@sailshq/socket.io-redis/-/socket.io-redis-6.1.2.tgz", + "integrity": "sha512-rSyq/1cBF23C5jQHhmGI/XIIlDZma4YRhXt3t4rmAyO2pvGsODBTJrJGhCg9InLvKJ5qhnu/77JcCD/0b1qPAQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.1", + "notepack.io": "~2.2.0", + "redis": "^3.0.0", + "socket.io-adapter": "~2.2.0", + "uid2": "0.0.3" + }, + "engines": { + "node": ">=10.0.0" + } }, "node_modules/@sailshq/socket.io-redis/node_modules/redis": { "version": "3.1.1", @@ -517,15 +648,46 @@ "node": ">=4" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, "node_modules/@swc/helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", - "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -538,10 +700,33 @@ "node": ">= 0.6" } }, - "node_modules/after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, "node_modules/anchor": { "version": "1.4.1", @@ -597,20 +782,34 @@ "dev": true }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==", + "license": "MIT" }, "node_modules/asap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", @@ -622,44 +821,64 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcryptjs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.3.0.tgz", + "integrity": "sha512-cEPr8jwWSB7xk73mbJYuWxyM9EMKomNlv51da7j+xa9Go2pyRU/Hml8v/WX9doW87b7a2ph18G+xsp7bQcliwg==", + "license": "MIT" + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -669,40 +888,40 @@ "node": ">=8" } }, - "node_modules/blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, "node_modules/bluebird": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.2.1.tgz", "integrity": "sha512-OfdwXncy2KqoGIlXUqxe+xb7G54s8y5pdo96+KGQMkQMZ5C/rT26tT2IJxWtgiAPeklwAU6iXxxjX8b8blcTPQ==" }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -711,45 +930,68 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -775,6 +1017,26 @@ "node": ">=8" } }, + "node_modules/browserify-transform-machinepack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/browserify-transform-machinepack/-/browserify-transform-machinepack-1.0.4.tgz", + "integrity": "sha512-pru/JMQm1CeRQvubPE6bHRwp17r9cZQzYwhQ6/3weXWWupzxehl9te221n3R+/DhgfBTXOlaBxPLMd0S17GQwA==", + "license": "MIT", + "dependencies": { + "@sailshq/lodash": "^3.10.3", + "browserify-transform-tools": "^1.4.2" + } + }, + "node_modules/browserify-transform-tools": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/browserify-transform-tools/-/browserify-transform-tools-1.7.0.tgz", + "integrity": "sha512-D4/vMGx4ILHI/+Qokdo2x7cxPJqy7uXt0zugOBbDvnCcrQL9/WrgK71GJgrNHF/L4XLErA4cMGlTVmc2sICRnA==", + "license": "MIT", + "dependencies": { + "falafel": "^2.0.0", + "through": "^2.3.7" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -787,6 +1049,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -819,9 +1082,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001629", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz", - "integrity": "sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==", + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", "dev": true, "funding": [ { @@ -836,80 +1099,41 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/captains-log": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/captains-log/-/captains-log-2.0.4.tgz", - "integrity": "sha512-TJ11SQV9o3e7aJrq6GAvxztdCc+Tgx9uSdB1YQLNPlft4/h6XQgFyA/dFA9oS/CmHtVZvIvOmJXfAS0MDBDBGg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/captains-log/-/captains-log-2.0.5.tgz", + "integrity": "sha512-Gg6xMzB9Ps1kBpbdts2QqT8Dzw4Zo+uHAIjnvBD8APS09AbWDpU4KTlE0w1SkQx8PIZLLUcNPbLraTSTWGm1sA==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.2", - "chalk": "1.1.3", + "chalk": "2.3.0", "rc": "1.2.8", "semver": "7.5.2" } }, - "node_modules/captains-log/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" }, - "node_modules/captains-log/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/captains-log/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/captains-log/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "node_modules/chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/captains-log/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/captains-log/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -974,6 +1198,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -991,24 +1216,6 @@ "resolved": "https://registry.npmjs.org/common-js-file-extensions/-/common-js-file-extensions-1.0.2.tgz", "integrity": "sha512-unB33lDBJbuMtc6dqm6SZbHbIu+uR2+zlv+DCO6bfjdvrMdn2GSKZTbKpLnbYpJS+GLq49U8prq5FPfL8QVrtA==" }, - "node_modules/component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -1094,6 +1301,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -1118,12 +1326,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1170,21 +1380,42 @@ } }, "node_modules/core-js": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", - "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/create-sails-generator": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/create-sails-generator/-/create-sails-generator-0.0.1.tgz", - "integrity": "sha512-WOFR+4NZuziKfRV3eWPSb2yTkJCwZQcqTEoYSgJoDmWbFhMQXOEA8ahH0WxOqMD/1OreYLtLncEZMzd7mEVfNQ==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/create-sails-generator/-/create-sails-generator-0.0.3.tgz", + "integrity": "sha512-7meULkmsgo2sv3YFKQU34pOYYphZxKfS2TXTi3RR3qqLQPBOZtaWdGE0ksPEsyF43KbByzycgq96j8OoVLexvA==", "dev": true, + "license": "MIT", "peerDependencies": { "sails": ">=1" } @@ -1193,25 +1424,12 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "license": "MIT", "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, - "node_modules/cross-spawn/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, "node_modules/csrf": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz", @@ -1272,6 +1490,35 @@ "node": ">=0.4.0" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1284,6 +1531,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -1292,6 +1540,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1300,6 +1549,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1316,6 +1566,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -1337,9 +1588,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/didyoumean": { "version": "1.2.2", @@ -1353,10 +1609,15 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, - "node_modules/double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==" + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } }, "node_modules/ee-first": { "version": "1.1.1", @@ -1364,9 +1625,10 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -1397,85 +1659,73 @@ } }, "node_modules/engine.io": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.6.1.tgz", - "integrity": "sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==", - "dependencies": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-client": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.3.tgz", - "integrity": "sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==", - "dependencies": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.0.0" } }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" } }, "node_modules/engine.io/node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "stackframe": "^1.3.4" } }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1487,6 +1737,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1513,37 +1764,39 @@ } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", + "depd": "2.0.0", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.3.1", "fresh": "0.5.2", - "merge-descriptors": "1.0.1", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -1609,10 +1862,17 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/express/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1620,61 +1880,102 @@ "node_modules/express/node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/express/node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", @@ -1693,22 +1994,42 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/express/node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", @@ -1717,6 +2038,31 @@ "node": "> 0.1.90" } }, + "node_modules/falafel": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", + "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "isarray": "^2.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/falafel/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -1745,6 +2091,12 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -1758,6 +2110,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha512-MX1ZLPIuKED51hrI4++K+1B0VX87Cs4EkybD2q12Ysuf5p4vkmHqMvQJRlDwROqFr4D2Pzyit5wGQxf30grIcw==", + "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -1766,6 +2119,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -1774,6 +2128,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1782,6 +2137,7 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1848,15 +2204,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -1866,10 +2223,20 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -1883,6 +2250,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1938,6 +2306,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -1952,6 +2321,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1987,6 +2365,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -2004,6 +2383,29 @@ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -2015,36 +2417,20 @@ "node": ">=0.10.0" } }, - "node_modules/has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dependencies": { - "isarray": "2.0.1" - } - }, - "node_modules/has-binary2/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" - }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -2056,6 +2442,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2067,6 +2454,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2085,27 +2473,22 @@ "node": ">= 0.4" } }, - "node_modules/html-webpack-plugin": { - "name": "html-rspack-plugin", - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/html-rspack-plugin/-/html-rspack-plugin-5.7.2.tgz", - "integrity": "sha512-uVXGYq19bcsX7Q/53VqXQjCKXw0eUMHlFGDLTaqzgj/ckverfhZQvXyA6ecFBaF9XUH16jfCTCyALYi0lJcagg==", + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" } - } + ], + "license": "MIT" }, "node_modules/http-errors": { "version": "1.7.3", @@ -2127,6 +2510,21 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/i18n-2": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/i18n-2/-/i18n-2-0.7.3.tgz", @@ -2151,6 +2549,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -2175,15 +2574,11 @@ "@sailshq/lodash": "^3.10.2" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" - }, "node_modules/inertia-sails": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/inertia-sails/-/inertia-sails-0.2.2.tgz", "integrity": "sha512-I4Zk6BrgriV+qCFb3ZVl/48uNC9mwNTOzL15I7yUvGBxe1jxgBYOuE+ygnNLRkPO7qhZOqJwMvE9tk2KudCIuA==", + "license": "MIT", "peerDependencies": { "sails": ">=1", "sails-flash": ">=0.0.1" @@ -2206,12 +2601,14 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -2270,10 +2667,17 @@ "node": ">=0.12.0" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, "node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -2281,12 +2685,14 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/isstream": { "version": "0.1.2", @@ -2294,9 +2700,10 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -2314,6 +2721,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2325,14 +2733,16 @@ } }, "node_modules/jake/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2348,6 +2758,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2358,7 +2769,29 @@ "node_modules/jake/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/jiti": { "version": "1.21.0", @@ -2374,6 +2807,30 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -2382,6 +2839,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", @@ -2423,6 +2895,12 @@ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, "node_modules/lodash.issafeinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.issafeinteger/-/lodash.issafeinteger-4.0.4.tgz", @@ -2439,6 +2917,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "node_modules/machine": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/machine/-/machine-15.2.3.tgz", @@ -2476,10 +2964,27 @@ "walker": "1.0.7" } }, + "node_modules/machinepack-http": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/machinepack-http/-/machinepack-http-9.0.0.tgz", + "integrity": "sha512-CfAbgkCcHzwS8ZHPsE0RrnJSluD5rVESzMTYh/mk8U5ZJaXiPsOpcOHRyvRvjfxA68vdVCBDp2+ci7FN9/UhIA==", + "license": "MIT", + "dependencies": { + "@sailshq/lodash": "^3.10.2", + "@sailshq/request": "^2.88.2", + "machine": "^15.0.0-0", + "machinepack-urls": "^6.0.2-0", + "rttc": "^10.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/machinepack-process": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/machinepack-process/-/machinepack-process-4.0.1.tgz", "integrity": "sha512-/5dqpWVhNjRC78v4cOKMH2I74u3hbM4pVha0SEh427eddWLSDt41txECZh+HLPPD3h/r35UU0cKszIFxqZYJlA==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.2", "machine": "^15.0.0-23", @@ -2530,6 +3035,25 @@ "node": ">=4" } }, + "node_modules/machinepack-strings": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/machinepack-strings/-/machinepack-strings-6.1.1.tgz", + "integrity": "sha512-XrnVwTBqFtfF7Ot/J0n0JNOOggScSMlFzKnRPezzMClVKcgQdmCYAHdxhBcxsvhcVAKnTcHNCk2YIA3gUNd3zg==", + "license": "MIT", + "dependencies": { + "@sailshq/lodash": "^3.10.2", + "browserify-transform-machinepack": "^1.0.3", + "machine": "^15.0.0-2", + "uuid": "2.0.2" + } + }, + "node_modules/machinepack-strings/node_modules/uuid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.2.tgz", + "integrity": "sha512-BooSif/UQWXwaQme+4z32duvmtUUz/nlHsyGrrSCgsGf6snMrp9q/n1nGHwQzU12kaCeceODmAiRZA8TCK06jA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT" + }, "node_modules/machinepack-urls": { "version": "6.0.2-0", "resolved": "https://registry.npmjs.org/machinepack-urls/-/machinepack-urls-6.0.2-0.tgz", @@ -2551,6 +3075,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2563,11 +3088,15 @@ "@sailshq/lodash": "^3.10.2" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-dictionaries": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/merge-dictionaries/-/merge-dictionaries-1.0.0.tgz", @@ -2589,6 +3118,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2610,6 +3140,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2664,14 +3195,16 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/multiparty": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.1.3.tgz", "integrity": "sha512-Qhty41IpN0IuoBstlVPhdgqtnwrsj0gE7ndajbtUVE0f2UTT/2ChmZZnS5Nsf4a5H+5C68V/tN2vi6Wcvhn00Q==", + "license": "MIT", "dependencies": { "fd-slicer": "~1.0.1" }, @@ -2731,20 +3264,30 @@ } }, "node_modules/notepack.io": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/notepack.io/-/notepack.io-2.1.3.tgz", - "integrity": "sha512-AgSt+cP5XMooho1Ppn8NB3FFaVWefV+qZoZncYTUSch2GAEwlYLcIIbT5YVkMlFeNHnfwOvc4HDlbvrB5BRxXA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/notepack.io/-/notepack.io-2.2.0.tgz", + "integrity": "sha512-9b5w3t5VSH6ZPosoYnyDONnUTF8o0UkBw7JLA6eBlYJWyGT1Q3vQa8Hmuj1/X6RYvHjjygBDgw6fJhe0JEojfw==", + "license": "MIT" }, "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2759,9 +3302,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2797,6 +3344,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "license": "MIT", "dependencies": { "is-wsl": "^1.1.0" }, @@ -2807,7 +3355,8 @@ "node_modules/parasails": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/parasails/-/parasails-0.9.3.tgz", - "integrity": "sha512-tX9sf+qDXE3NqZ8XhXai4dDSiVq8Z5FOttWH7tYuwiYwh9ZpPqFEf7W4Lx3A19e0P1D5FPuw1jNRWe3JMv9sQg==" + "integrity": "sha512-tX9sf+qDXE3NqZ8XhXai4dDSiVq8Z5FOttWH7tYuwiYwh9ZpPqFEf7W4Lx3A19e0P1D5FPuw1jNRWe3JMv9sQg==", + "license": "MIT" }, "node_modules/parley": { "version": "3.8.3", @@ -2819,16 +3368,6 @@ "flaverr": "^1.5.1" } }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, "node_modules/parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -2852,9 +3391,10 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.5.3.tgz", - "integrity": "sha512-bqgexHATMvdKmLuLFDxO7cEy6zGYVuURhAbJZYVbBR6XnX4KmXXBOt0OKVaDGOJ5l5UY86OXpKE2RHD30TbbOQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", "dependencies": { "isarray": "0.0.1" } @@ -2862,7 +3402,14 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", @@ -2891,6 +3438,53 @@ "node": ">= 6" } }, + "node_modules/playwright": { + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.1.tgz", + "integrity": "sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.47.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz", + "integrity": "sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/pluralize": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", @@ -3056,6 +3650,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -3067,15 +3662,78 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.1.13.tgz", - "integrity": "sha512-/EKQURUrxLu66CMUg4+1LwGdxnz8of7IDvrSLqEtDqhLH61SAlNNUSr90UTvZaemujgl3OH/VHg+fyGltrNixw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.4.1.tgz", + "integrity": "sha512-hwn2EiJmv8M+AW4YDkbjJ6HlZCTzLyz1QlySn9sMuKV/Px0fjwldlB7tol8GzdgqtkdPtzT3iJ4UzdnYXP25Ag==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17.0" }, "peerDependencies": { - "prettier": ">=2.2.0" + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@shufo/prettier-plugin-blade": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "prettier": "^2.2 || ^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*", + "prettier-plugin-twig-melody": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@shufo/prettier-plugin-blade": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "prettier-plugin-twig-melody": { + "optional": true + } } }, "node_modules/promise": { @@ -3110,6 +3768,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -3121,17 +3780,35 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -3142,6 +3819,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3174,17 +3857,19 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -3196,29 +3881,50 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3227,6 +3933,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -3238,9 +3945,10 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -3249,15 +3957,16 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-refresh": { @@ -3265,6 +3974,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3310,19 +4020,6 @@ "node": ">=8.10.0" } }, - "node_modules/redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", - "dependencies": { - "double-ended-queue": "^2.1.0-0", - "redis-commands": "^1.2.0", - "redis-parser": "^2.6.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -3336,23 +4033,22 @@ "node": ">=4" } }, - "node_modules/redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha512-9Hdw19gwXFBJdN8ENUoNVJFRyMDFrE/ZBClPicKYDPwNPJ4ST1TedAHYNSiGKElwh2vrmRGMoJYbVdJd+WQXIw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/reportback": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/reportback/-/reportback-2.0.2.tgz", "integrity": "sha512-EOF6vRKfXjI7ydRoOdXXeRTK1zgWq7mep8/32patt0FOnBap32eTSw6yCea/o0025PHmVB8crx5OxzZJ+/P34g==", + "license": "MIT", "dependencies": { "captains-log": "^2.0.2", "switchback": "^2.0.1" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3404,51 +4100,6 @@ "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "integrity": "sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==" }, - "node_modules/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.2.tgz", - "integrity": "sha512-HyiHMDfHAmKe+k3fiHjiM33fFl9KITVhCyR6qqSPYyv308hghR7k5LapZlAUuYjkcnx1q36lZ/Ab/i3GrlVqTQ==", - "dependencies": { - "array-flatten": "2.1.1", - "debug": "2.6.9", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "setprototypeof": "1.1.0", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/router/node_modules/array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha512-Ylfqm/V1V/VKGazsJeRDZ31wV9gdNeK3ZsvwbYBAVSNgH8o8CMLfdx/ofn9pnMVsvTMfvC3yfcBYzGpD1vxnlw==" - }, - "node_modules/router/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/router/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/router/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, "node_modules/rttc": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rttc/-/rttc-10.0.1.tgz", @@ -3492,16 +4143,19 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sails": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/sails/-/sails-1.5.8.tgz", - "integrity": "sha512-S1omXwRYsnJzQtnDG0pDOmLUT8WssFV3KMIE15grYo6gtOwUwPhITs8dSw1rzTCyV8TIt5vQzVbeL82vvfwINA==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/sails/-/sails-1.5.12.tgz", + "integrity": "sha512-Q4rTOkpUUKvfshEVMI/9ErE8dei/5tobF7WAAEHYLs7f3ExijbM3yZ79FsPx/6ai9P9IyYENsSgcJ7Zk8fd65A==", + "license": "MIT", "dependencies": { - "@sailshq/lodash": "^3.10.2", + "@sailshq/lodash": "^3.10.6", + "@sailshq/router": "^1.3.9", "async": "2.6.4", - "captains-log": "^2.0.0", + "captains-log": "^2.0.5", "chalk": "2.3.0", "commander": "2.11.0", "common-js-file-extensions": "1.0.2", @@ -3511,8 +4165,8 @@ "cookie-parser": "1.4.4", "cookie-signature": "1.1.0", "csurf": "1.10.0", - "ejs": "3.1.7", - "express": "4.17.3", + "ejs": "3.1.10", + "express": "4.21.0", "express-session": "1.17.0", "flaverr": "^1.10.0", "glob": "7.1.2", @@ -3527,18 +4181,17 @@ "minimist": "1.2.6", "parley": "^3.3.4", "parseurl": "1.3.2", - "path-to-regexp": "1.5.3", + "path-to-regexp": "1.9.0", "pluralize": "1.2.1", "prompt": "1.2.1", "rc": "1.2.8", - "router": "1.3.2", "rttc": "^10.0.0-0", - "sails-generate": "^2.0.3", + "sails-generate": "^2.0.11", "sails-stringfile": "^0.3.3", "semver": "7.5.2", "serve-favicon": "2.4.5", - "serve-static": "1.13.1", - "skipper": "^0.9.0-0", + "serve-static": "1.16.2", + "skipper": "^0.9.5", "sort-route-addresses": "^0.0.4", "uid-safe": "2.1.5", "vary": "1.1.2", @@ -3573,13 +4226,14 @@ } }, "node_modules/sails-generate": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/sails-generate/-/sails-generate-2.0.8.tgz", - "integrity": "sha512-uB3KQGHcMt3NpA26CTPgVDdFc1gNCKMhZHM4wyUASJoWPNbulZNjNdx/nj6A88Hr1VOSIs++9xpL/v654AAGhw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/sails-generate/-/sails-generate-2.0.12.tgz", + "integrity": "sha512-uP1AxV+LjuCKF8tnUtyUsce2iyWRXi0hIZRwrf1+ruH0JwC014rQ8FBX8dX1Uso+jUYib4E3t6uj0N1tmpK80g==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.3", "async": "2.6.4", - "chalk": "1.1.3", + "chalk": "2.3.0", "cross-spawn": "4.0.2", "flaverr": "^1.0.0", "fs-extra": "0.30.0", @@ -3590,45 +4244,40 @@ "sails.io.js-dist": "^1.0.0" } }, - "node_modules/sails-generate/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/sails-hook-mail": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/sails-hook-mail/-/sails-hook-mail-0.1.0.tgz", + "integrity": "sha512-838v/VFlg5lE+/Gb3nsfr/lKIXzqM9fjwoNYnbuUxk2nax+ekEj85qoY0olLX/b2VPNzMRggkeDRXQ/NTdehUQ==", + "license": "MIT" }, - "node_modules/sails-generate/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/sails-hook-organics": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sails-hook-organics/-/sails-hook-organics-3.0.0.tgz", + "integrity": "sha512-GpzWqRaEV4H2nyVFj+IzJJ1L70Gj/jZT4NQ9GXuiMlKe+xDh7bZJiQuQMqBZAX6PscdFuEjswWdT+zJR/jtuLg==", + "license": "MIT", "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "@sailshq/lodash": "^3.10.2", + "async": "2.6.4", + "bcryptjs": "2.3.0", + "machinepack-fs": "^12.0.0", + "machinepack-http": "^9.0.0", + "machinepack-process": "^4.0.0-0", + "machinepack-strings": "^6.0.1", + "stripe": "5.4.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sails-generate/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, "node_modules/sails-hook-orm": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/sails-hook-orm/-/sails-hook-orm-4.0.2.tgz", - "integrity": "sha512-uNB1SW3thRyGo0KH0W+FTNMrKl/iGAayJedlMZmEsy3HbioI3sCiI0rDaL/gR4eWAoj3w2ZeUbl7NMpsuVvxoQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/sails-hook-orm/-/sails-hook-orm-4.0.3.tgz", + "integrity": "sha512-/PrAHwsjbby0PK27LpLamYMUz4CedVYW3vr6JFSG9OncoeUG9qgwcNjeWNxo2HuEfHDal92KISXkcdRX7jh5Eg==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.2", "async": "2.6.4", - "chalk": "1.1.3", + "chalk": "2.3.0", "flaverr": "^1.8.0", "parley": "^3.3.2", "prompt": "1.2.1", @@ -3637,50 +4286,21 @@ "waterline-utils": "^1.0.0" } }, - "node_modules/sails-hook-orm/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sails-hook-orm/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sails-hook-orm/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/sails-hook-shipwright": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/sails-hook-shipwright/-/sails-hook-shipwright-0.2.0.tgz", - "integrity": "sha512-8qGh6iMeiswBoeywlsTm/wDrG0La2C2GXeGzB+90X2a8UUaLaYy4y5nSNDlfzRtG1SLublvYhpTmg6k0OtqadQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/sails-hook-shipwright/-/sails-hook-shipwright-0.3.0.tgz", + "integrity": "sha512-eG1valxwqpNRGZ4gRk8OM2Y6Nm41Jf3Whi2JeVlCEYHJ6kqmfEWDSUp5BJS8zCkRQAQfNFmk7TccC3Bi5kVGZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@rsbuild/core": "^0.7.1" + "@rsbuild/core": "^1.0.1" } }, "node_modules/sails-hook-sockets": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sails-hook-sockets/-/sails-hook-sockets-2.0.4.tgz", - "integrity": "sha512-kR6i9WXzPjkRuTl+2NVzBpJMqP8DuPLLHF1rKQSXkxK0ysZlHGzCLJScPWuu8qd33b/Ug7If39qFFwZCZuhQCA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sails-hook-sockets/-/sails-hook-sockets-3.0.1.tgz", + "integrity": "sha512-d1LNW3h7T2xGEIHmf0btY2tcgK7EDqHZPyD3fpCx4Frhqx8n6MXdbbuKDdPx3c/h0inoJzZvkjtHNSovDk8hNQ==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.2", "async": "2.6.4", @@ -3689,7 +4309,7 @@ "machinepack-urls": "^6.0.2-0", "proxy-addr": "1.1.5", "semver": "7.5.2", - "socket.io": "2.5.0", + "socket.io": "4.7.5", "uid2": "0.0.3" } }, @@ -3709,17 +4329,6 @@ "node": ">= 0.10" } }, - "node_modules/sails-hook-sockets/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/sails-hook-sockets/node_modules/proxy-addr": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", @@ -3732,25 +4341,6 @@ "node": ">= 0.6" } }, - "node_modules/sails-hook-sockets/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sails-hook-sockets/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/sails-stringfile": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/sails-stringfile/-/sails-stringfile-0.3.3.tgz", @@ -3764,25 +4354,14 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/sails.io.js/-/sails.io.js-1.2.1.tgz", "integrity": "sha512-Dd53Q4G8RRo3wZW7nSf49F88Y83qG/fkDSB7z7qb3qBd2vXiNodOAAv+tjKJuUsZ3osWIrlpaIxQUYMC4eR+cg==", - "dev": true - }, - "node_modules/sails.io.js-dist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sails.io.js-dist/-/sails.io.js-dist-1.2.1.tgz", - "integrity": "sha512-fBMdntawlqd5N/1xL9Vu6l+J5zvy86jLUf0nFDal5McUeZzUy7PpNqq+Vx/F9KgItAyFJ7RoO3YltO9dD0Q5OQ==" + "dev": true, + "license": "MIT" }, - "node_modules/sails/node_modules/chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dependencies": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - }, - "engines": { - "node": ">=4" - } + "node_modules/sails.io.js-dist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sails.io.js-dist/-/sails.io.js-dist-1.2.1.tgz", + "integrity": "sha512-fBMdntawlqd5N/1xL9Vu6l+J5zvy86jLUf0nFDal5McUeZzUy7PpNqq+Vx/F9KgItAyFJ7RoO3YltO9dD0Q5OQ==", + "license": "MIT" }, "node_modules/sails/node_modules/glob": { "version": "7.1.2", @@ -3800,29 +4379,20 @@ "node": "*" } }, - "node_modules/sails/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sails/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.1.0" } }, - "node_modules/sails/node_modules/semver": { + "node_modules/semver": { "version": "7.5.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3833,48 +4403,43 @@ "node": ">=10" } }, - "node_modules/sails/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { - "has-flag": "^2.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/sails/node_modules/yallist": { + "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -3884,6 +4449,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -3891,32 +4457,60 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -3942,99 +4536,43 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.1", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.1" + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "bin": { - "mime": "cli.js" - } - }, - "node_modules/serve-static/node_modules/ms": { + "node_modules/serve-static/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.1", - "destroy": "~1.0.4", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.3.1" - }, + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/serve-static/node_modules/send/node_modules/statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "node_modules/serve-static/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/serve-static/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -4050,12 +4588,14 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4070,13 +4610,14 @@ } }, "node_modules/skipper": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/skipper/-/skipper-0.9.4.tgz", - "integrity": "sha512-+VaLLr4Pu658D2a+WD00miu/ZK0APJgSWqI1qfWqrks1jLKqfI0fFryUZ95MuCkhmlg2O7Ky5rIFkXe3IhFCCQ==", + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/skipper/-/skipper-0.9.5.tgz", + "integrity": "sha512-8uQBMJgTI0T07IxThc46pXg5Dkvycp42UhL3JavIcdK+pNRRK0SXUJSJ7Gv9CxdugLQK4H4s4DdnFbvIEtheVA==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.3", "async": "2.6.4", - "body-parser": "1.19.2", + "body-parser": "1.20.3", "debug": "3.1.0", "multiparty": "4.1.3", "semver": "7.5.2", @@ -4092,6 +4633,7 @@ "version": "0.5.12", "resolved": "https://registry.npmjs.org/skipper-disk/-/skipper-disk-0.5.12.tgz", "integrity": "sha512-yyLOWT1WKY2h9NaUuG77XyhMti6vltRqp3ofN2ZTYoG3/V/SRLH1CjtZQ2Az6oqgMrfN8SZ83k3ptaOvB31YmQ==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.2", "debug": "3.1.0", @@ -4102,6 +4644,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4109,154 +4652,85 @@ "node_modules/skipper-disk/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/skipper/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/skipper/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/skipper/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/skipper/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10" - } - }, - "node_modules/skipper/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/socket.io": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.5.0.tgz", - "integrity": "sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==", - "dependencies": { - "debug": "~4.1.0", - "engine.io": "~3.6.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.5.0", - "socket.io-parser": "~3.4.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz", + "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg==", + "license": "MIT" }, "node_modules/socket.io-client": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.5.0.tgz", - "integrity": "sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==", - "dependencies": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io-client/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" - }, - "node_modules/socket.io-client/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/socket.io-client/node_modules/socket.io-parser": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", - "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "dev": true, + "license": "MIT", "dependencies": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/socket.io-parser": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.3.tgz", - "integrity": "sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", "dependencies": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/socket.io-parser/node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socket.io-parser/node_modules/isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/socket.io/node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, "node_modules/sort-route-addresses": { @@ -4281,6 +4755,31 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -4289,6 +4788,13 @@ "node": "*" } }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -4308,7 +4814,8 @@ "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" }, "node_modules/strip-ansi": { "version": "3.0.1", @@ -4325,10 +4832,41 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/stripe": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.4.0.tgz", + "integrity": "sha512-VCDFp4oQu1uOcOLHIwRIznH8ikLJcpDsHahWN48V/QuV6y2Bm281cq5wnkjqv+LPdUpqXVp9pjlb+SfN6dnyZg==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.0", + "lodash.isplainobject": "^4.0.6", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stripe/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/stripe/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", @@ -4381,14 +4919,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -4407,15 +4946,17 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/switchback/-/switchback-2.0.5.tgz", "integrity": "sha512-w9gnsTxR5geOKt45QUryhDP9KTLcOAqje9usR2VQ2ng8DfhaF+mkIcArxioMP/p6Z/ecKE58i2/B0DDlMJK1jw==", + "license": "MIT", "dependencies": { "@sailshq/lodash": "^3.10.3" } }, "node_modules/tailwindcss": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.6.tgz", - "integrity": "sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", + "integrity": "sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==", "dev": true, + "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -4425,7 +4966,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -4448,15 +4989,6 @@ "node": ">=14.0.0" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -4478,16 +5010,17 @@ "node": ">=0.8" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, - "node_modules/to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4508,6 +5041,21 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -4515,10 +5063,11 @@ "dev": true }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -4528,10 +5077,29 @@ "node": ">=0.6.x" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -4561,6 +5129,21 @@ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4569,6 +5152,25 @@ "node": ">= 0.8" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4587,6 +5189,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.0.tgz", "integrity": "sha512-LNUrNsXdI/fUsypJbWM8Jt4DgQdFAZh41p9C7WE9Cn+CULOEkoG2lgQyH68v3wnIy5K3fN4jdSt270K6IFA3MQ==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -4607,6 +5210,20 @@ "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -4665,15 +5282,6 @@ "node": ">=0.6" } }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/whelk": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/whelk/-/whelk-6.0.1.tgz", @@ -4734,6 +5342,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4787,15 +5396,16 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -4807,13 +5417,20 @@ } }, "node_modules/xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "license": "ISC" + }, "node_modules/yargs": { "version": "3.4.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.4.5.tgz", @@ -4824,11 +5441,6 @@ "window-size": "0.1.0", "wordwrap": "0.0.2" } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" } } } diff --git a/templates/mellow-react/package.json b/templates/mellow-react/package.json index 0e708169..a40215e8 100644 --- a/templates/mellow-react/package.json +++ b/templates/mellow-react/package.json @@ -5,34 +5,39 @@ "description": "a Sails application", "keywords": [], "dependencies": { - "@inertiajs/react": "^1.0.15", - "@sailshq/connect-redis": "^3.2.1", - "@sailshq/lodash": "^3.10.3", - "@sailshq/socket.io-redis": "^5.2.0", + "@inertiajs/react": "^1.2.0", + "@sailshq/connect-redis": "^6.1.3", + "@sailshq/lodash": "^3.10.6", + "@sailshq/socket.io-redis": "^6.1.2", "inertia-sails": "^0.2.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sails": "^1.5.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sails": "^1.5.12", "sails-flash": "^0.0.1", - "sails-hook-orm": "^4.0.0", - "sails-hook-sockets": "^2.0.0" + "sails-hook-mail": "^0.1.0", + "sails-hook-organics": "^3.0.0", + "sails-hook-orm": "^4.0.3", + "sails-hook-sockets": "^3.0.1" }, "devDependencies": { - "@rsbuild/plugin-react": "^0.7.3", - "create-sails-generator": "^0.0.1", - "prettier": "^2.6.2", - "prettier-plugin-tailwindcss": "^0.1.11", - "sails-hook-shipwright": "^0.2.0", + "@rsbuild/plugin-react": "^1.0.2", + "@types/node": "^22.5.5", + "create-sails-generator": "^0.0.3", + "playwright": "^1.47.1", + "prettier": "^2.8.8", + "prettier-plugin-tailwindcss": "^0.4.1", + "sails-hook-shipwright": "^0.3.0", "sails.io.js": "^1.2.1", - "socket.io-client": "^2.2.0", - "tailwindcss": "^3.0.24" + "socket.io-client": "^4.7.5", + "tailwindcss": "^3.4.12" }, "scripts": { - "dev": "node app.js", + "dev": "node --watch app.js", "start": "NODE_ENV=production node app.js", - "test": "npm run lint && npm run custom-tests && echo 'Done.'", - "lint": "./node_modules/eslint/bin/eslint.js . --max-warnings=0 --report-unused-disable-directives && echo '✔ Your .js files look good.'", - "custom-tests": "echo \"(No other custom tests yet.)\" && echo" + "lint": "prettier --check .", + "lint:fix": "prettier --write .", + "test:unit": "node --test ./tests/unit/**/*.test.js", + "test": "npm run test:unit" }, "main": "app.js", "engines": { diff --git a/templates/mellow-react/prettier.config.js b/templates/mellow-react/prettier.config.js index e94a48b6..6c8bc81e 100644 --- a/templates/mellow-react/prettier.config.js +++ b/templates/mellow-react/prettier.config.js @@ -1,5 +1,6 @@ module.exports = { plugins: [require('prettier-plugin-tailwindcss')], semi: false, - singleQuote: true + singleQuote: true, + trailingComma: 'none' } diff --git a/templates/mellow-react/tailwind.config.js b/templates/mellow-react/tailwind.config.js index cc0c401e..1b56711f 100644 --- a/templates/mellow-react/tailwind.config.js +++ b/templates/mellow-react/tailwind.config.js @@ -1,7 +1,66 @@ module.exports = { - content: ['./views/**/*.ejs', './assets/js/**/*.{js,jsx,ts,tsx}'], + content: ['./views/**/*.ejs', './assets/js/**/*.{js,vue,jsx,ts,tsx}'], theme: { - extend: {} + extend: { + colors: { + brand: { + DEFAULT: '#6C25C1', + 50: '#CCAEEF', + 100: '#C19DEC', + 200: '#AB7BE6', + 300: '#9659DF', + 400: '#8036D9', + 500: '#6C25C1', + 600: '#521C92', + 700: '#371363', + 800: '#1D0A34', + 900: '#030105', + 950: '#000000' + }, + green: { + DEFAULT: '#49D489', + 50: '#DEF7E9', + 100: '#CDF3DF', + 200: '#ACEBC9', + 300: '#8BE4B4', + 400: '#6ADC9E', + 500: '#49D489', + 600: '#2CB96D', + 700: '#218C52', + 800: '#165E37', + 900: '#0C311D', + 950: '#061A0F' + }, + gray: { + DEFAULT: '#878787', + 50: '#E3E3E3', + 100: '#D9D9D9', + 200: '#C4C4C4', + 300: '#B0B0B0', + 400: '#9B9B9B', + 500: '#878787', + 600: '#6B6B6B', + 700: '#4F4F4F', + 800: '#333333', + 900: '#171717', + 950: '#090909' + }, + black: { + DEFAULT: '#333333', + 50: '#8F8F8F', + 100: '#858585', + 200: '#707070', + 300: '#5C5C5C', + 400: '#474747', + 500: '#333333', + 600: '#171717', + 700: '#000000', + 800: '#000000', + 900: '#000000', + 950: '#000000' + } + } + } }, plugins: [] } diff --git a/templates/mellow-react/tests/unit/helpers.test.js b/templates/mellow-react/tests/unit/helpers.test.js new file mode 100644 index 00000000..b0195052 --- /dev/null +++ b/templates/mellow-react/tests/unit/helpers.test.js @@ -0,0 +1,83 @@ +const { describe, it, before, after } = require('node:test') +const assert = require('node:assert/strict') +const Sails = require('sails').constructor + +describe('sails.helpers.capitalize()', () => { + let sails + let sailsApp = new Sails() + + before(async () => { + sails = await new Promise((resolve, reject) => { + sailsApp.load( + { environment: 'testing', hooks: { shipwright: false } }, + (err, sailsInstance) => { + if (err) { + return reject(err) + } + resolve(sailsInstance) + } + ) + }) + }) + + after(async () => { + await new Promise((resolve, reject) => { + sailsApp.lower((err) => { + if (err) { + return reject(err) + } + resolve() + }) + }) + }) + + it('capitalizes single word correctly', async () => { + const capitalized = sails.helpers.capitalize('hello') + assert.equal(capitalized, 'Hello') + }) + + it('capitalizes multiple words correctly', async () => { + const capitalized = sails.helpers.capitalize('the quick brown fox') + assert.equal(capitalized, 'The quick brown fox') + }) +}) + +describe('sails.helpers.getUserIntials()', () => { + let sails + let sailsApp = new Sails() + + before(async () => { + sails = await new Promise((resolve, reject) => { + sailsApp.load( + { environment: 'testing', hooks: { shipwright: false } }, + (err, sailsInstance) => { + if (err) { + return reject(err) + } + resolve(sailsInstance) + } + ) + }) + }) + + after(async () => { + await new Promise((resolve, reject) => { + sailsApp.lower((err) => { + if (err) { + return reject(err) + } + resolve() + }) + }) + }) + + it('gets user initials from first name and last name', async () => { + const initials = sails.helpers.getUserInitials('Kelvin Omereshone') + assert.equal(initials, 'KO') + }) + + it('gets user initials from just name', async () => { + const initials = sails.helpers.getUserInitials('Kelvin') + assert.equal(initials, 'KE') + }) +}) diff --git a/templates/mellow-react/types/index.d.ts b/templates/mellow-react/types/index.d.ts deleted file mode 100644 index 9168476c..00000000 --- a/templates/mellow-react/types/index.d.ts +++ /dev/null @@ -1,173 +0,0 @@ -interface Sails { - log: LogMethod & LogObject - models: { [modelName: string]: Model } - helpers: Helper - on(event: string, listener: (...args: any[]) => void): void - off(event: string, listener: (...args: any[]) => void): void - emit(event: string, ...args: any[]): void - lift(cb?: (err: Error, sails: Sails) => void): Sails - lower(cb?: (err?: Error) => void): void - load(): Sails - getVersion(): string - inertia: Inertia - wish: Wish - hooks: Hook - config: Config - req: { - ip: string - } - renderView: ( - relPathToView: string, - _options: Dictionary, - optionalCb?: (err: Error | null, compiledHtml: string) => void - ) => Sails & Promise - intercept(callback: (err: Error) => Error): Sails & Promise -} - -interface Helper { - passwords: { - hashPassword: (password: string, strength?: number) => Promise - checkPassword: ( - passwordAttempt: string, - hashedPassword: string - ) => Promise - } - strings: { - random: (style?: 'url-friendly' | 'alphanumeric') => string - uuid: () => string - } - mail: { - send: { - with: (params: EmailParams) => Promise - } - } - getUserInitials: (fullName: string) => string - capitalize: (inputString: string) => string -} -interface EmailParams { - mailer?: string - to: string - cc?: string | array - bcc?: string | array - subject?: string - template?: string - templateData?: object - attachments?: EmailAttachment[] -} -interface EmailAttachment { - filename: string - content?: string | Buffer | NodeJS.ReadableStream - path?: string - href?: string - httpHeaders?: { [key: string]: string } - contentType?: string - contentDisposition?: string - cid?: string - encoding?: string - headers?: { [key: string]: string } - raw?: string -} - -interface Hook { - inertia: Inertia -} -interface LogMethod { - (...args: any[]): void -} - -interface LogObject { - info: LogMethod - warn: LogMethod - error: LogMethod - debug: LogMethod - silly: LogMethod - verbose: LogMethod -} - -interface Config { - smtp: { - transport?: 'smtp' - host?: string - port?: number - encryption?: 'tls' | 'ssl' - username: string - password: string - } - google: { - clientId: string - clientSecret: string - redirect: string - } - mail: { - default: string - mailers: { - log: object - smtp: { - transport: 'smtp' - host: string - port: number - encryption: 'tls' | 'ssl' - username?: string - password?: string - } - } - from: { - name: string - address: string - } - } - custom: Custom -} - -interface Custom { - baseUrl: string - passwordResetTokenTTL: number - emailProofTokenTTL: number - rememberMeCookieMaxAge: number - internalEmail: string - verifyEmail: boolean -} -interface Wish { - provider: (provider: string) => Wish - redirect: () => string - user: (code: string) => GoogleUser | GitHubUser -} -interface Inertia { - share: (key: string, value?: any) => void - render: ( - component: string, - props?: Record, - viewData?: Record - ) => any - flushShared: (key?: string) => void - viewData: (key: string, value: any) => void - getViewData: (key: string) => any - setRootView: (newRootView: string) => void - getRootView: () => string - location: (path: string) => void -} - -interface GoogleUser { - id: string - email: string - verified_email: boolean - name: string - given_name: string - family_name: string - picture: string - locale: string - accessToken: string - idToken: string -} - -interface LoggedInUser { - id: string - fullName: string - email: string - initials?: string - googleAvatarUrl?: string - value: LoggedInUser -} -declare const sails: Sails - -declare const User diff --git a/templates/mellow-react/views/emails/email-reset-password.ejs b/templates/mellow-react/views/emails/email-reset-password.ejs new file mode 100644 index 00000000..e2628795 --- /dev/null +++ b/templates/mellow-react/views/emails/email-reset-password.ejs @@ -0,0 +1,33 @@ +

Dear <%= fullName %>,

+

+ Someone requested a password reset for your account. If this was not you, + please disregard this email. Otherwise, simply click the button below: +

+ +

+ If you have any trouble, try pasting this link in your browser: + <%= + url.resolve(sails.config.custom.baseUrl,'/reset-password')+'?token='+encodeURIComponent(token) + %> +

+

Sincerely,

+

The Boring JavaScript Stack Team

diff --git a/templates/mellow-react/views/emails/email-verify-account.ejs b/templates/mellow-react/views/emails/email-verify-account.ejs new file mode 100644 index 00000000..e989d578 --- /dev/null +++ b/templates/mellow-react/views/emails/email-verify-account.ejs @@ -0,0 +1,9 @@ +<% /* Note: This is injected into `views/layouts/layout-email.ejs` */ %> +

Welcome, <%= fullName %>!

+

You're almost ready to get started. Just click the button below to verify the email address for your account:

+ +

If you have any trouble, try pasting this link in your browser: <%= url.resolve(sails.config.custom.baseUrl,'/verify-email')+'?token='+encodeURIComponent(token) %>

+

Sincerely,

+

The Boring JavaScript Stack Team

diff --git a/templates/mellow-react/views/emails/email-verify-new-email.ejs b/templates/mellow-react/views/emails/email-verify-new-email.ejs new file mode 100644 index 00000000..173aa1ea --- /dev/null +++ b/templates/mellow-react/views/emails/email-verify-new-email.ejs @@ -0,0 +1,57 @@ +

+ Confirm Your New Email, <%= fullName %>! +

+

+ We've received a request to change your email address. To complete this + process, please click the button below to verify your new email address: +

+ +

+ If you have any trouble, try pasting this link in your browser: + <%= + url.resolve(sails.config.custom.baseUrl,'/verify-email')+'?token='+encodeURIComponent(token) + %> +

+

+ If you didn't request this change, please ignore this email or contact our + support team if you have any concerns. +

+

Sincerely,

+

The Mellow Team

diff --git a/templates/mellow-react/views/layouts/layout-email.ejs b/templates/mellow-react/views/layouts/layout-email.ejs new file mode 100644 index 00000000..9ff8bd40 --- /dev/null +++ b/templates/mellow-react/views/layouts/layout-email.ejs @@ -0,0 +1,12 @@ +<% /* Default layout for email templates */ %> +
+
+
+
+ <%- body %> +
+
+

© 2023 The Boring JavaScript Stack
All trademarks, service marks, and company names are the property of their respective owners.

+
+
+
diff --git a/templates/mellow-vue/api/controllers/auth/callback.js b/templates/mellow-vue/api/controllers/auth/callback.js index 928dc808..167022f9 100644 --- a/templates/mellow-vue/api/controllers/auth/callback.js +++ b/templates/mellow-vue/api/controllers/auth/callback.js @@ -21,7 +21,6 @@ module.exports = { }, fn: async function ({ code, provider }, exits) { const req = this.req - /** @type GoogleUser */ const googleUser = await sails.wish.provider(provider).user(code) User.findOrCreate( diff --git a/templates/mellow-vue/api/controllers/user/update-profile.js b/templates/mellow-vue/api/controllers/user/update-profile.js index 725d96ff..67aac57e 100644 --- a/templates/mellow-vue/api/controllers/user/update-profile.js +++ b/templates/mellow-vue/api/controllers/user/update-profile.js @@ -25,7 +25,7 @@ module.exports = { allowNull: true, description: 'The new password of the user.' }, - passwordConfirmation: { + confirmPassword: { type: 'string', description: 'The confirmation of the new password.', allowNull: true @@ -52,7 +52,7 @@ module.exports = { email, currentPassword, password, - passwordConfirmation + confirmPassword }) { const userId = this.req.session.userId const user = await User.findOne({ id: userId }).select([ @@ -89,7 +89,7 @@ module.exports = { } if (password) { - if (password !== passwordConfirmation) { + if (password !== confirmPassword) { throw { invalid: { problems: [{ password: 'Password confirmation does not match.' }] diff --git a/templates/mellow-vue/api/controllers/user/view-profile.js b/templates/mellow-vue/api/controllers/user/view-profile.js index 62d61051..8d1727ea 100644 --- a/templates/mellow-vue/api/controllers/user/view-profile.js +++ b/templates/mellow-vue/api/controllers/user/view-profile.js @@ -10,6 +10,6 @@ module.exports = { }, fn: async function () { - return { page: 'user/profile' } + return { page: 'dashboard/profile' } } } diff --git a/templates/mellow-vue/api/models/User.js b/templates/mellow-vue/api/models/User.js index 67f04ce3..15b68476 100644 --- a/templates/mellow-vue/api/models/User.js +++ b/templates/mellow-vue/api/models/User.js @@ -120,7 +120,6 @@ module.exports = { }, {}) }, beforeCreate: async function (valuesToSet, proceed) { - valuesToSet.id = sails.helpers.strings.uuid() valuesToSet.initials = sails.helpers.getUserInitials(valuesToSet.fullName) if (valuesToSet.password) { valuesToSet.password = await sails.helpers.passwords.hashPassword( diff --git a/templates/mellow-vue/api/responses/badRequest.js b/templates/mellow-vue/api/responses/badRequest.js index 142fcd6b..0c9aa420 100644 --- a/templates/mellow-vue/api/responses/badRequest.js +++ b/templates/mellow-vue/api/responses/badRequest.js @@ -68,7 +68,7 @@ module.exports = function badRequest(optionalData) { } }) req.session.errors = errors - return res.redirect(303, 'back') + return res.redirect(303, req.get('Referrer') || '/') } } diff --git a/templates/mellow-vue/assets/js/components/InputBase.vue b/templates/mellow-vue/assets/js/components/InputBase.vue index f91ab683..518eda52 100644 --- a/templates/mellow-vue/assets/js/components/InputBase.vue +++ b/templates/mellow-vue/assets/js/components/InputBase.vue @@ -41,3 +41,8 @@ function updateValue(event) { + diff --git a/templates/mellow-vue/assets/js/components/InputEmail.vue b/templates/mellow-vue/assets/js/components/InputEmail.vue index c8d24279..965d078d 100644 --- a/templates/mellow-vue/assets/js/components/InputEmail.vue +++ b/templates/mellow-vue/assets/js/components/InputEmail.vue @@ -3,7 +3,7 @@ import InputBase from '@/components/InputBase' - diff --git a/templates/mellow-vue/assets/js/pages/auth/reset-password.vue b/templates/mellow-vue/assets/js/pages/auth/reset-password.vue index f58450e5..2690064c 100644 --- a/templates/mellow-vue/assets/js/pages/auth/reset-password.vue +++ b/templates/mellow-vue/assets/js/pages/auth/reset-password.vue @@ -1,6 +1,8 @@