Commit fee8df29 by Ravindra Kanojiya

.

2 parents 82d20bb3 7c8505a2
......@@ -4,3 +4,20 @@ APP_KEYS="toBeModified1,toBeModified2"
API_TOKEN_SALT=tobemodified
ADMIN_JWT_SECRET=tobemodified
JWT_SECRET=tobemodified
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=offers
DATABASE_USERNAME=harishpatel
DATABASE_PASSWORD=harishpatel
DATABASE_SCHEMA=public
SMTP_HOST=smtp.mailtrap.io
SMTP_PORT=2525
SMTP_USERNAME=2b3a6bda8b6889
SMTP_PASSWORD=521c5fbdaa4326
AWS_ACCESS_KEY_ID=
AWS_ACCESS_SECRET=
AWS_REGION=
AWS_BUCKET=
No preview for this file type
This diff could not be displayed because it is too large.
module.exports = ({ env }) => ({
// ...
// Reference: https://github.com/strapi/strapi/tree/main/packages/providers/email-nodemailer
email: {
config: {
provider: "nodemailer",
providerOptions: {
host: env("SMTP_HOST", "smtp.example.com"),
port: env("SMTP_PORT", 587),
auth: {
user: env("SMTP_USERNAME"),
pass: env("SMTP_PASSWORD"),
},
// ... any custom nodemailer options
},
settings: {
defaultFrom: "from@example.com",
// defaultReplyTo: "hello@example.com"
},
},
},
// ...
// ...
// Reference: https://www.npmjs.com/package/@strapi/provider-upload-aws-s3
// upload: {
// config: {
// provider: "aws-s3",
// providerOptions: {
// accessKeyId: env("AWS_ACCESS_KEY_ID"),
// secretAccessKey: env("AWS_ACCESS_SECRET"),
// region: env("AWS_REGION"),
// params: {
// Bucket: env("AWS_BUCKET"),
// },
// },
// actionOptions: {
// upload: {},
// uploadStream: {},
// delete: {},
// },
// },
// },
// ...
});
module.exports = {
apps: [
{
name: 'strapiapp',
script: 'npm',
args: 'start',
},
],
};
......@@ -12,6 +12,8 @@
"dependencies": {
"@strapi/plugin-i18n": "4.3.6",
"@strapi/plugin-users-permissions": "4.3.6",
"@strapi/provider-email-nodemailer": "^4.3.8",
"@strapi/provider-upload-aws-s3": "^4.3.9",
"@strapi/strapi": "4.3.6",
"better-sqlite3": "7.4.6",
"pg": "^8.8.0",
......
......@@ -4,7 +4,8 @@
"info": {
"singularName": "amenity",
"pluralName": "amenities",
"displayName": "Amenity"
"displayName": "Amenity",
"description": ""
},
"options": {
"draftAndPublish": true
......@@ -15,11 +16,20 @@
"type": "string"
},
"icon": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"type": "media",
"multiple": false
]
},
"type": {
"type": "enumeration",
"enum": [
"Internal",
"External",
"Common"
]
}
}
}
{
"kind": "collectionType",
"collectionName": "channel_partners",
"info": {
"singularName": "channel-partner",
"pluralName": "channel-partners",
"displayName": "Channel Partner",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {},
"attributes": {
"companyName": {
"type": "string",
"required": true
},
"companyType": {
"type": "string"
},
"contactPersonName": {
"type": "string"
},
"email": {
"type": "string"
},
"communicationAddress": {
"type": "text"
},
"mobileNo": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"reraNumber": {
"type": "string"
},
"regionOfOperation": {
"type": "string"
},
"sourcingManager": {
"type": "string"
},
"pan": {
"type": "string"
},
"panFile": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": [
"images",
"files"
]
},
"memberOf": {
"type": "string"
},
"termsAndConditions": {
"type": "boolean"
},
"user": {
"type": "relation",
"relation": "oneToOne",
"target": "plugin::users-permissions.user"
}
}
}
'use strict';
/**
* channel-partner controller
*/
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::channel-partner.channel-partner');
'use strict';
/**
* channel-partner router
*/
const { createCoreRouter } = require('@strapi/strapi').factories;
module.exports = createCoreRouter('api::channel-partner.channel-partner');
'use strict';
/**
* channel-partner service
*/
const { createCoreService } = require('@strapi/strapi').factories;
module.exports = createCoreService('api::channel-partner.channel-partner');
......@@ -12,15 +12,37 @@
},
"pluginOptions": {},
"attributes": {
"statistics": {
"type": "richtext"
},
"backgroundImage": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"type": "media",
"multiple": false
]
},
"stat1Label": {
"type": "string"
},
"stat2Label": {
"type": "string"
},
"stat3Label": {
"type": "string"
},
"stat4Label": {
"type": "string"
},
"stat1Value": {
"type": "string"
},
"stat2Value": {
"type": "string"
},
"stat3Value": {
"type": "string"
},
"stat4Value": {
"type": "string"
}
}
}
......@@ -14,7 +14,8 @@
"attributes": {
"projectName": {
"type": "string",
"required": true
"required": true,
"unique": true
},
"address": {
"type": "text",
......@@ -43,10 +44,6 @@
"videos"
]
},
"details": {
"type": "richtext",
"required": true
},
"featuredOnHome": {
"type": "boolean",
"default": false,
......@@ -125,6 +122,29 @@
},
"offersText": {
"type": "richtext"
},
"slug": {
"type": "uid",
"targetField": "projectName",
"required": true
},
"details1": {
"type": "richtext",
"required": true
},
"details2": {
"type": "richtext",
"required": true
},
"details3": {
"type": "richtext",
"required": true
},
"storeys": {
"type": "integer"
},
"posession": {
"type": "string"
}
}
}
{
"kind": "collectionType",
"collectionName": "referrals",
"info": {
"singularName": "referral",
"pluralName": "referrals",
"displayName": "Referral",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {
"i18n": {
"localized": true
}
},
"attributes": {
"fullName": {
"type": "string",
"required": true,
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"mobileNumber": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"email": {
"type": "email",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"wing": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"flatNumber": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"ownershipType": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"purchasedYear": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"purchasedSource": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"referralName": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"referralPhoneNo": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"referralEmail": {
"type": "email",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"projectReferredTo": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"project": {
"type": "relation",
"relation": "oneToOne",
"target": "api::project.project"
},
"township": {
"type": "relation",
"relation": "oneToOne",
"target": "api::township.township"
}
}
}
'use strict';
/**
* referral controller
*/
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::referral.referral');
'use strict';
/**
* referral router
*/
const { createCoreRouter } = require('@strapi/strapi').factories;
module.exports = createCoreRouter('api::referral.referral');
'use strict';
/**
* referral service
*/
const { createCoreService } = require('@strapi/strapi').factories;
module.exports = createCoreService('api::referral.referral');
......@@ -65,6 +65,28 @@
"type": "relation",
"relation": "oneToMany",
"target": "api::amenity.amenity"
},
"townshipContactEmail": {
"type": "string",
"required": true
},
"townshipContactNumber": {
"type": "string",
"required": true
},
"cpSubmitLeadEnabled": {
"type": "boolean",
"default": false
},
"cpGuidelines": {
"allowedTypes": [
"images",
"files",
"videos",
"audios"
],
"type": "media",
"multiple": false
}
}
}
{
"kind": "collectionType",
"collectionName": "up_users",
"info": {
"name": "user",
"description": "",
"singularName": "user",
"pluralName": "users",
"displayName": "User"
},
"options": {
"draftAndPublish": false,
"timestamps": true
},
"attributes": {
"username": {
"type": "string",
"minLength": 3,
"unique": true,
"configurable": false,
"required": true
},
"email": {
"type": "email",
"minLength": 6,
"configurable": false,
"required": true
},
"provider": {
"type": "string",
"configurable": false
},
"password": {
"type": "password",
"minLength": 6,
"configurable": false,
"private": true
},
"resetPasswordToken": {
"type": "string",
"configurable": false,
"private": true
},
"confirmationToken": {
"type": "string",
"configurable": false,
"private": true
},
"confirmed": {
"type": "boolean",
"default": false,
"configurable": false
},
"blocked": {
"type": "boolean",
"default": false,
"configurable": false
},
"role": {
"type": "relation",
"relation": "manyToOne",
"target": "plugin::users-permissions.role",
"inversedBy": "users",
"configurable": false
},
"profileImage": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
]
},
"aboutMe": {
"type": "text"
},
"fullName": {
"type": "string",
"required": true
},
"oneTimePassword": {
"type": "string",
"configurable": false,
"private": true
}
}
}
\ No newline at end of file
const utils = require("@strapi/utils");
const _ = require("lodash");
const { sanitize } = utils;
const { ApplicationError, ValidationError } = utils.errors;
const {
validateRegisterBody,
} = require("@strapi/plugin-users-permissions/server/controllers/validation/auth");
const { getService } = require("@strapi/plugin-users-permissions/server/utils");
const sanitizeUser = (user, ctx) => {
const { auth } = ctx.state;
const userSchema = strapi.getModel("plugin::users-permissions.user");
return sanitize.contentAPI.output(user, userSchema, { auth });
};
const userPermissionExtension = (plugin) => {
/** Example of overriding and adding a new endpoint, check the section where we have registered this as a route below. */
plugin.controllers.user.updateMe = (ctx) => {
ctx.params.id = ctx.state.user.id;
return plugin.controllers.user.update(ctx);
};
plugin.controllers.user.startOtpLogin = async (ctx) => {
const { mahareraNumber, mobileNumber } = ctx.request.body;
if (!mahareraNumber || !mobileNumber) {
throw new ValidationError(
"Please specify both the maharera & mobile numbers."
);
}
const pluginStore = await strapi.store({
type: "plugin",
name: "users-permissions",
});
const emailSettings = await pluginStore.get({ key: "email" });
// Find the channel partner first.
const channelPartner = await strapi
.query("api::channel-partner.channel-partner")
.findOne({
populate: ["user"],
where: {
$and: [
{ publishedAt: { $notNull: true } },
{ reraNumber: mahareraNumber },
{ mobileNo: mobileNumber },
],
},
});
if (!channelPartner) {
throw new ValidationError(
"No channel partner registered with specified maharera number, mobile number combination."
);
}
// Find the linked user next.
const user = await strapi
.query("plugin::users-permissions.user")
.findOne({ id: channelPartner.user.id });
if (!user || user.blocked) {
throw new ValidationError(
"Unable to resolve user linked to channel partner."
);
}
const resetPasswordSettings = _.get(
emailSettings,
"reset_password.options",
{}
);
const oneTimePassword = Math.floor(100000 + Math.random() * 900000);
const emailToSend = {
to: user.email,
from:
resetPasswordSettings.from.email || resetPasswordSettings.from.name
? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>`
: undefined,
replyTo: resetPasswordSettings.response_email,
subject: `Your one time password is: ${oneTimePassword}`,
text: `Hello ${channelPartner.contactPersonName}, Your one time password to login to your partner portal is ${oneTimePassword}`,
html: `<p>Hello ${channelPartner.contactPersonName}, <br></br>Your one time password to login to your partner portal is ${oneTimePassword}</p><br /> Best Regards, <br /> Team Hiranandani.`,
};
// NOTE: Update the user before sending the email so an Admin can generate the link if the email fails
await getService("user").edit(user.id, {
oneTimePassword: `${oneTimePassword}`,
});
// Send an email to the user.
await strapi.plugin("email").service("email").send(emailToSend);
// TODO: Send SMS.
ctx.send({ ok: true, message: "otp sent" });
};
plugin.controllers.user.finishOtpLogin = async (ctx) => {
const { oneTimePassword, mahareraNumber, mobileNumber } = ctx.request.body;
if (!oneTimePassword || !mobileNumber || !mahareraNumber) {
throw new ValidationError(
"Please specify the oneTimePassword, maharera number and mobile numbers."
);
}
// Find the channel partner first.
const channelPartner = await strapi
.query("api::channel-partner.channel-partner")
.findOne({
populate: ["user"],
where: {
$and: [
{ publishedAt: { $notNull: true } },
{ reraNumber: mahareraNumber },
{ mobileNo: mobileNumber },
],
},
});
if (!channelPartner) {
throw new ValidationError(
"No channel partner registered with specified maharera number, mobile number combination."
);
}
// Find the linked user next.
const user = await strapi.query("plugin::users-permissions.user").findOne({
where: {
$and: [
{ id: channelPartner.user.id },
{ oneTimePassword: oneTimePassword },
],
},
});
if (!user || user.blocked) {
throw new ValidationError("Code provided is not valid.");
}
await getService("user").edit(user.id, {
oneTimePassword: null,
password: oneTimePassword,
});
ctx.send({ ok: true, message: "otp updated" });
};
/** Example of overriding an existing route. */
plugin.controllers.auth.register = async (ctx) => {
const pluginStore = await strapi.store({
type: "plugin",
name: "users-permissions",
});
const settings = await pluginStore.get({ key: "advanced" });
if (!settings.allow_register) {
throw new ApplicationError("Register action is currently disabled");
}
const params = {
..._.omit(ctx.request.body, [
"confirmed",
"blocked",
"confirmationToken",
"resetPasswordToken",
"provider",
]),
provider: "local",
};
await validateRegisterBody(params);
// We have added the ability to choose the role.
// This is the customisation that we wanted to do to make this possible
const newUserRole = params?.role ? params?.role : settings.default_role;
// the query was also changed to apply a query on "name" rather than the default "type".
const role = await strapi
.query("plugin::users-permissions.role")
.findOne({ where: { name: newUserRole } });
if (!role) {
throw new ApplicationError("Impossible to find the default role");
}
// @ts-ignore
const { email, username, provider } = params;
const identifierFilter = {
$or: [
{ email: email.toLowerCase() },
{ username: email.toLowerCase() },
{ username },
{ email: username },
],
};
const conflictingUserCount = await strapi
.query("plugin::users-permissions.user")
.count({
where: { ...identifierFilter, provider },
});
if (conflictingUserCount > 0) {
throw new ApplicationError("Email or Username are already taken");
}
if (settings.unique_email) {
const conflictingUserCount = await strapi
.query("plugin::users-permissions.user")
.count({
where: { ...identifierFilter },
});
if (conflictingUserCount > 0) {
throw new ApplicationError("Email or Username are already taken");
}
}
let newUser = {
...params,
role: role.id,
email: email.toLowerCase(),
username,
confirmed: !settings.email_confirmation,
};
const user = await strapi
.plugin("users-permissions")
.service("user")
.add(newUser);
const sanitizedUser = await sanitizeUser(user, ctx);
if (settings.email_confirmation) {
try {
await strapi
.plugin("users-permissions")
.service("user")
.sendConfirmationEmail(sanitizedUser);
} catch (err) {
throw new ApplicationError(err.message);
}
return ctx.send({ user: sanitizedUser });
}
const jwt = strapi
.plugin("users-permissions")
.service("jwt")
.issue(_.pick(user, ["id"]));
return ctx.send({
jwt,
user: sanitizedUser,
});
};
/** Endpoint used to allow edits on a user done by currently logged in user only their own record. */
plugin.routes["content-api"].routes.push({
method: "PUT",
path: "/users/me",
handler: "user.updateMe",
});
plugin.routes["content-api"].routes.push({
method: "POST",
path: "/users/start-otp-login",
handler: "user.startOtpLogin",
});
plugin.routes["content-api"].routes.push({
method: "POST",
path: "/users/finish-otp-login",
handler: "user.finishOtpLogin",
});
return plugin;
};
module.exports = userPermissionExtension;
......@@ -1784,6 +1784,14 @@
"request" "^2.83.0"
"url-join" "4.0.1"
"@strapi/provider-email-nodemailer@^4.3.8":
"integrity" "sha512-KCZxlZlrQcKo9G5RY17KN73x2hcW3rEm/DXo/Is4pqQiehC35HZEMbxzAMc3SG1NArkqtnoI8JtI1BXJd8jomg=="
"resolved" "https://registry.npmjs.org/@strapi/provider-email-nodemailer/-/provider-email-nodemailer-4.3.8.tgz"
"version" "4.3.8"
dependencies:
"lodash" "4.17.21"
"nodemailer" "6.7.7"
"@strapi/provider-email-sendmail@4.3.6":
"integrity" "sha512-pTz08brITDu1tjGBMZoKfoE+7zEhMoxdFvEMx16h32PLa0TJSjne3vv1ETzmNGWX/JKD6GFH4ESzSnLT2ES6gQ=="
"resolved" "https://registry.npmjs.org/@strapi/provider-email-sendmail/-/provider-email-sendmail-4.3.6.tgz"
......@@ -1792,6 +1800,14 @@
"@strapi/utils" "4.3.6"
"sendmail" "^1.6.1"
"@strapi/provider-upload-aws-s3@^4.3.9":
"integrity" "sha512-fYX0Z11NGWN0Da1XQogU2XcD2Dt3EisFfyTWCv/qCKPzXgMB/IARnsO2eLyhfKP8wDJX/1OJllHfG6jh9AuFSQ=="
"resolved" "https://registry.npmjs.org/@strapi/provider-upload-aws-s3/-/provider-upload-aws-s3-4.3.9.tgz"
"version" "4.3.9"
dependencies:
"aws-sdk" "2.1215.0"
"lodash" "4.17.21"
"@strapi/provider-upload-local@4.3.6":
"integrity" "sha512-rTPNA1QY3V2I4wa0n9jrW73G2qXvWzT1YefuP/Bk4XFRbhJYbNyiYd5/DrIAo4wwBA5KDqi2beZAPD5eLDOWqw=="
"resolved" "https://registry.npmjs.org/@strapi/provider-upload-local/-/provider-upload-local-4.3.6.tgz"
......@@ -2618,6 +2634,22 @@
"resolved" "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz"
"version" "1.0.5"
"aws-sdk@2.1215.0":
"integrity" "sha512-btOexIY0O2F+HhjytToaYuub2HEdLqccZSM8rbT3nrbXo7U4k4Gqi6SbMGi2a+vEpj8lY8dAuMR2lvvVs4Ib9Q=="
"resolved" "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1215.0.tgz"
"version" "2.1215.0"
dependencies:
"buffer" "4.9.2"
"events" "1.1.1"
"ieee754" "1.1.13"
"jmespath" "0.16.0"
"querystring" "0.2.0"
"sax" "1.2.1"
"url" "0.10.3"
"util" "^0.12.4"
"uuid" "8.0.0"
"xml2js" "0.4.19"
"aws-sign2@~0.7.0":
"integrity" "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
"resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
......@@ -2730,7 +2762,7 @@
"mixin-deep" "^1.2.0"
"pascalcase" "^0.1.1"
"base64-js@^1.3.1":
"base64-js@^1.0.2", "base64-js@^1.3.1":
"integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
"resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
"version" "1.5.1"
......@@ -3011,6 +3043,15 @@
"base64-js" "^1.3.1"
"ieee754" "^1.2.1"
"buffer@4.9.2":
"integrity" "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="
"resolved" "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz"
"version" "4.9.2"
dependencies:
"base64-js" "^1.0.2"
"ieee754" "^1.1.4"
"isarray" "^1.0.0"
"buildmail@3.10.0":
"integrity" "sha512-6e5sDN/pl3en5Klqdfyir7LEIBiFr9oqZuvYaEyVwjxpIbBZN+98e0j87Fz2Ukl8ud32rbk9VGOZAnsOZ7pkaA=="
"resolved" "https://registry.npmjs.org/buildmail/-/buildmail-3.10.0.tgz"
......@@ -4424,6 +4465,11 @@
"resolved" "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
"version" "3.3.0"
"events@1.1.1":
"integrity" "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw=="
"resolved" "https://registry.npmjs.org/events/-/events-1.1.1.tgz"
"version" "1.1.1"
"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3":
"integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="
"resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
......@@ -5496,6 +5542,11 @@
"resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
"version" "1.2.1"
"ieee754@^1.1.4", "ieee754@1.1.13":
"integrity" "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
"resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"
"version" "1.1.13"
"ignore@^5.1.1":
"integrity" "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
"resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz"
......@@ -6012,7 +6063,7 @@
dependencies:
"is-docker" "^2.0.0"
"isarray@~1.0.0", "isarray@1.0.0":
"isarray@^1.0.0", "isarray@~1.0.0", "isarray@1.0.0":
"integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
"resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
"version" "1.0.0"
......@@ -6058,6 +6109,11 @@
"merge-stream" "^2.0.0"
"supports-color" "^8.0.0"
"jmespath@0.16.0":
"integrity" "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="
"resolved" "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz"
"version" "0.16.0"
"joycon@^3.0.1":
"integrity" "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="
"resolved" "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz"
......@@ -7173,6 +7229,11 @@
dependencies:
"nodemailer-fetch" "1.6.0"
"nodemailer@6.7.7":
"integrity" "sha512-pOLC/s+2I1EXuSqO5Wa34i3kXZG3gugDssH+ZNCevHad65tc8vQlCQpOLaUjopvkRQKm2Cki2aME7fEOPRy3bA=="
"resolved" "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.7.tgz"
"version" "6.7.7"
"normalize-path@^3.0.0", "normalize-path@~3.0.0":
"integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
"resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
......@@ -8714,6 +8775,11 @@
"parse-srcset" "^1.0.2"
"postcss" "^8.3.11"
"sax@>=0.6.0", "sax@1.2.1":
"integrity" "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="
"resolved" "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz"
"version" "1.2.1"
"scheduler@^0.20.2":
"integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
"resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
......@@ -9817,6 +9883,14 @@
"punycode" "1.3.2"
"querystring" "0.2.0"
"url@0.10.3":
"integrity" "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ=="
"resolved" "https://registry.npmjs.org/url/-/url-0.10.3.tgz"
"version" "0.10.3"
dependencies:
"punycode" "1.3.2"
"querystring" "0.2.0"
"use@^3.1.0":
"integrity" "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
"resolved" "https://registry.npmjs.org/use/-/use-3.1.1.tgz"
......@@ -9864,6 +9938,11 @@
"resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
"version" "8.3.2"
"uuid@8.0.0":
"integrity" "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="
"resolved" "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz"
"version" "8.0.0"
"v8flags@^2.0.10":
"integrity" "sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA=="
"resolved" "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz"
......@@ -10186,6 +10265,19 @@
"resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
"version" "4.0.0"
"xml2js@0.4.19":
"integrity" "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q=="
"resolved" "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz"
"version" "0.4.19"
dependencies:
"sax" ">=0.6.0"
"xmlbuilder" "~9.0.1"
"xmlbuilder@~9.0.1":
"integrity" "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ=="
"resolved" "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz"
"version" "9.0.7"
"xtend@^4.0.0", "xtend@^4.0.2":
"integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
"resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!