feature/IO-3614-March-2026-Tech-Debt - GraphQL-Request backend package bump

This commit is contained in:
Dave
2026-03-16 14:18:36 -04:00
parent 665f09d832
commit 318a3be786
6 changed files with 3048 additions and 1139 deletions

3719
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -2,60 +2,60 @@
"name": "bodyshop", "name": "bodyshop",
"version": "0.2.1", "version": "0.2.1",
"engines": { "engines": {
"node": ">=22.12.0" "node": ">=22.0.0"
}, },
"type": "module", "type": "module",
"private": true, "private": true,
"proxy": "http://localhost:4000", "proxy": "http://localhost:4000",
"dependencies": { "dependencies": {
"@amplitude/analytics-browser": "^2.36.5", "@amplitude/analytics-browser": "^2.35.3",
"@ant-design/pro-layout": "^7.22.6", "@ant-design/pro-layout": "^7.22.6",
"@apollo/client": "^4.1.6", "@apollo/client": "^4.1.6",
"@dnd-kit/core": "^6.3.1", "@dnd-kit/core": "^6.3.1",
"@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/modifiers": "^9.0.0",
"@dnd-kit/sortable": "^10.0.0", "@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2", "@dnd-kit/utilities": "^3.2.2",
"@documenso/embed-react": "^0.6.0", "@documenso/embed-react": "^0.5.1",
"@emotion/is-prop-valid": "^1.4.0", "@emotion/is-prop-valid": "^1.4.0",
"@fingerprintjs/fingerprintjs": "^5.1.0", "@fingerprintjs/fingerprintjs": "^5.0.1",
"@firebase/analytics": "^0.10.20", "@firebase/analytics": "^0.10.19",
"@firebase/app": "^0.14.9", "@firebase/app": "^0.14.8",
"@firebase/auth": "^1.12.1", "@firebase/auth": "^1.12.0",
"@firebase/firestore": "^4.12.0", "@firebase/firestore": "^4.11.0",
"@firebase/messaging": "^0.12.24", "@firebase/messaging": "^0.12.22",
"@jsreport/browser-client": "^3.1.0", "@jsreport/browser-client": "^3.1.0",
"@reduxjs/toolkit": "^2.11.2", "@reduxjs/toolkit": "^2.11.2",
"@sentry/cli": "^3.3.3", "@sentry/cli": "^3.2.2",
"@sentry/react": "^10.43.0", "@sentry/react": "^10.40.0",
"@sentry/vite-plugin": "^4.9.1", "@sentry/vite-plugin": "^4.9.1",
"@splitsoftware/splitio-react": "^2.6.1", "@splitsoftware/splitio-react": "^2.6.1",
"@tanem/react-nprogress": "^5.0.63", "@tanem/react-nprogress": "^5.0.63",
"antd": "^6.3.3", "antd": "^6.3.1",
"apollo-link-logger": "^3.0.0", "apollo-link-logger": "^3.0.0",
"autosize": "^6.0.1", "autosize": "^6.0.1",
"axios": "^1.13.6", "axios": "^1.13.5",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"css-box-model": "^1.2.1", "css-box-model": "^1.2.1",
"dayjs": "^1.11.20", "dayjs": "^1.11.19",
"dayjs-business-days2": "^1.3.2", "dayjs-business-days2": "^1.3.2",
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"dotenv": "^17.3.1", "dotenv": "^17.3.1",
"env-cmd": "^11.0.0", "env-cmd": "^11.0.0",
"exifr": "^7.1.3", "exifr": "^7.1.3",
"graphql": "^16.13.1", "graphql": "^16.13.0",
"graphql-ws": "^6.0.7", "graphql-ws": "^6.0.7",
"i18next": "^25.8.18", "i18next": "^25.8.13",
"i18next-browser-languagedetector": "^8.2.1", "i18next-browser-languagedetector": "^8.2.1",
"immutability-helper": "^3.1.1", "immutability-helper": "^3.1.1",
"libphonenumber-js": "^1.12.40", "libphonenumber-js": "^1.12.38",
"lightningcss": "^1.32.0", "lightningcss": "^1.31.1",
"logrocket": "^12.1.0", "logrocket": "^12.0.0",
"markerjs2": "^2.32.7", "markerjs2": "^2.32.7",
"memoize-one": "^6.0.0", "memoize-one": "^6.0.0",
"normalize-url": "^8.1.1", "normalize-url": "^8.1.1",
"object-hash": "^3.0.0", "object-hash": "^3.0.0",
"phone": "^3.1.71", "phone": "^3.1.71",
"posthog-js": "^1.360.2", "posthog-js": "^1.355.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"query-string": "^9.3.1", "query-string": "^9.3.1",
"raf-schd": "^4.0.3", "raf-schd": "^4.0.3",
@@ -66,8 +66,8 @@
"react-dom": "^19.2.4", "react-dom": "^19.2.4",
"react-grid-gallery": "^1.0.1", "react-grid-gallery": "^1.0.1",
"react-grid-layout": "^2.2.2", "react-grid-layout": "^2.2.2",
"react-i18next": "^16.5.8", "react-i18next": "^16.5.4",
"react-icons": "^5.6.0", "react-icons": "^5.5.0",
"react-image-lightbox": "^5.1.4", "react-image-lightbox": "^5.1.4",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"react-number-format": "^5.4.3", "react-number-format": "^5.4.3",
@@ -77,8 +77,8 @@
"react-resizable": "^3.1.3", "react-resizable": "^3.1.3",
"react-router-dom": "^7.13.1", "react-router-dom": "^7.13.1",
"react-sticky": "^6.0.3", "react-sticky": "^6.0.3",
"react-virtuoso": "^4.18.3", "react-virtuoso": "^4.18.1",
"recharts": "^3.8.0", "recharts": "^3.7.0",
"redux": "^5.0.1", "redux": "^5.0.1",
"redux-actions": "^3.0.3", "redux-actions": "^3.0.3",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
@@ -86,7 +86,7 @@
"redux-state-sync": "^3.1.4", "redux-state-sync": "^3.1.4",
"reselect": "^5.1.1", "reselect": "^5.1.1",
"rxjs": "^7.8.2", "rxjs": "^7.8.2",
"sass": "^1.98.0", "sass": "^1.97.3",
"socket.io-client": "^4.8.3", "socket.io-client": "^4.8.3",
"styled-components": "^6.3.11", "styled-components": "^6.3.11",
"vite-plugin-ejs": "^1.7.0", "vite-plugin-ejs": "^1.7.0",
@@ -141,16 +141,15 @@
"@ant-design/icons": "^6.1.0", "@ant-design/icons": "^6.1.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@babel/preset-react": "^7.28.5", "@babel/preset-react": "^7.28.5",
"@dotenvx/dotenvx": "^1.55.1", "@dotenvx/dotenvx": "^1.52.0",
"@emotion/babel-plugin": "^11.13.5", "@emotion/babel-plugin": "^11.13.5",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.14.0",
"@eslint/js": "^9.39.2", "@eslint/js": "^9.39.2",
"@playwright/test": "^1.58.2", "@playwright/test": "^1.58.2",
"@rolldown/plugin-babel": "^0.2.1",
"@testing-library/dom": "^10.4.1", "@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1", "@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2", "@testing-library/react": "^16.3.2",
"@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-react": "^5.1.4",
"babel-plugin-react-compiler": "^1.0.0", "babel-plugin-react-compiler": "^1.0.0",
"browserslist": "^4.28.1", "browserslist": "^4.28.1",
"browserslist-to-esbuild": "^2.1.1", "browserslist-to-esbuild": "^2.1.1",
@@ -158,18 +157,21 @@
"eslint": "^9.39.2", "eslint": "^9.39.2",
"eslint-plugin-react": "^7.37.5", "eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-compiler": "^19.1.0-rc.2", "eslint-plugin-react-compiler": "^19.1.0-rc.2",
"globals": "^17.4.0", "globals": "^17.3.0",
"jsdom": "^28.1.0", "jsdom": "^28.1.0",
"memfs": "^4.56.11", "memfs": "^4.56.10",
"os-browserify": "^0.3.0", "os-browserify": "^0.3.0",
"playwright": "^1.58.2", "playwright": "^1.58.2",
"react-error-overlay": "^6.1.0", "react-error-overlay": "^6.1.0",
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"source-map-explorer": "^2.5.3", "source-map-explorer": "^2.5.3",
"vite": "^8.0.0", "vite": "^7.3.1",
"vite-plugin-babel": "^1.5.1",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-plugin-node-polyfills": "^0.25.0",
"vite-plugin-pwa": "^1.2.0", "vite-plugin-pwa": "^1.2.0",
"vitest": "^4.1.0", "vite-plugin-style-import": "^2.0.0",
"vitest": "^4.0.18",
"workbox-window": "^7.4.0" "workbox-window": "^7.4.0"
} }
} }

View File

@@ -1,7 +1,7 @@
import { DownOutlined, UpOutlined } from "@ant-design/icons"; import { DownOutlined, UpOutlined } from "@ant-design/icons";
import { Space } from "antd"; import { Space } from "antd";
export default function FormListMoveArrows({ move, index, total }) { export default function FormListMoveArrows({ move, index, total, orientation = "vertical" }) {
const upDisabled = index === 0; const upDisabled = index === 0;
const downDisabled = index === total - 1; const downDisabled = index === total - 1;
@@ -14,7 +14,7 @@ export default function FormListMoveArrows({ move, index, total }) {
}; };
return ( return (
<Space orientation="vertical"> <Space orientation={orientation}>
<UpOutlined disabled={upDisabled} onClick={handleUp} /> <UpOutlined disabled={upDisabled} onClick={handleUp} />
<DownOutlined disabled={downDisabled} onClick={handleDown} /> <DownOutlined disabled={downDisabled} onClick={handleDown} />
</Space> </Space>

View File

@@ -52,6 +52,23 @@ const getSplitTotal = (teamMembers = []) =>
const hasExactSplitTotal = (teamMembers = []) => Math.abs(getSplitTotal(teamMembers) - 100) < 0.00001; const hasExactSplitTotal = (teamMembers = []) => Math.abs(getSplitTotal(teamMembers) - 100) < 0.00001;
const getEmployeeDisplayName = (employees = [], employeeId) => {
const employee = employees.find((currentEmployee) => currentEmployee.id === employeeId);
if (!employee) return null;
const fullName = [employee.first_name, employee.last_name].filter(Boolean).join(" ").trim();
return fullName || employee.employee_number || null;
};
const formatAllocationPercentage = (percentage) => {
if (percentage === null || percentage === undefined || percentage === "") return null;
const numericValue = Number(percentage);
if (!Number.isFinite(numericValue)) return null;
return `${numericValue.toFixed(2).replace(/\.?0+$/, "")}%`;
};
export function ShopEmployeeTeamsFormComponent({ bodyshop }) { export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [form] = Form.useForm(); const [form] = Form.useForm();
@@ -80,6 +97,18 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
label: t(labelKey), label: t(labelKey),
value value
})); }));
const teamName = Form.useWatch("name", form);
const teamMembers = Form.useWatch(["employee_team_members"], form) || [];
const teamCardTitle = teamName?.trim() || t("employee_teams.fields.name");
const getTeamMemberTitle = (teamMember = {}) => {
const employeeName = getEmployeeDisplayName(bodyshop.employees, teamMember.employeeid) || t("employee_teams.fields.employeeid");
const allocation = formatAllocationPercentage(teamMember.percentage) || t("employee_teams.fields.allocation_percentage");
const payoutMethod =
payoutMethodOptions.find((option) => option.value === teamMember.payout_method)?.label || t("employee_teams.fields.payout_method");
return `${employeeName} | ${allocation} | ${payoutMethod}`;
};
const handleFinish = async ({ employee_team_members = [], ...values }) => { const handleFinish = async ({ employee_team_members = [], ...values }) => {
const normalizedTeamMembers = employee_team_members.map((teamMember) => { const normalizedTeamMembers = employee_team_members.map((teamMember) => {
@@ -172,6 +201,7 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
return ( return (
<Card <Card
title={teamCardTitle}
extra={ extra={
<Button type="primary" onClick={() => form.submit()}> <Button type="primary" onClick={() => form.submit()}>
{t("general.actions.save")} {t("general.actions.save")}
@@ -210,86 +240,97 @@ export function ShopEmployeeTeamsFormComponent({ bodyshop }) {
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => {
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> const teamMember = normalizeTeamMember(teamMembers[field.name]);
<Form.Item label={t("employees.fields.id")} key={`${index}`} name={[field.name, "id"]} hidden>
<Input type="hidden" />
</Form.Item>
<LayoutFormRow grow>
<Form.Item
label={t("employee_teams.fields.employeeid")}
key={`${index}`}
name={[field.name, "employeeid"]}
rules={[
{
required: true
}
]}
>
<EmployeeSearchSelectComponent options={bodyshop.employees} />
</Form.Item>
<Form.Item
label={t("employee_teams.fields.allocation_percentage")}
key={`${index}`}
name={[field.name, "percentage"]}
rules={[
{
required: true
}
]}
>
<InputNumber min={0} max={100} precision={2} />
</Form.Item>
<Form.Item
label={t("employee_teams.fields.payout_method")}
key={`${index}-payout-method`}
name={[field.name, "payout_method"]}
initialValue="hourly"
rules={[
{
required: true
}
]}
>
<Select options={payoutMethodOptions} />
</Form.Item>
<Form.Item noStyle dependencies={[["employee_team_members", field.name, "payout_method"]]}>
{() => {
const payoutMethod =
form.getFieldValue(["employee_team_members", field.name, "payout_method"]) || "hourly";
const fieldName = payoutMethod === "commission" ? "commission_rates" : "labor_rates";
return LABOR_TYPES.map((laborType) => ( return (
<Form.Item <Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
label={payoutMethod === "commission" ? `${t(`joblines.fields.lbr_types.${laborType}`)} %` : t(`joblines.fields.lbr_types.${laborType}`)} <Form.Item label={t("employees.fields.id")} key={`${index}`} name={[field.name, "id"]} hidden>
key={`${index}-${fieldName}-${laborType}`} <Input type="hidden" />
name={[field.name, fieldName, laborType]}
rules={[
{
required: true
}
]}
>
{payoutMethod === "commission" ? (
<InputNumber min={0} max={100} precision={2} />
) : (
<CurrencyInput />
)}
</Form.Item>
));
}}
</Form.Item> </Form.Item>
<Space align="center"> <LayoutFormRow
<DeleteFilled grow
onClick={() => { title={getTeamMemberTitle(teamMember)}
remove(field.name); extra={
<Space align="center" size="small">
<Button
type="text"
icon={<DeleteFilled />}
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows move={move} index={index} total={fields.length} orientation="horizontal" />
</Space>
}
>
<Form.Item
label={t("employee_teams.fields.employeeid")}
key={`${index}`}
name={[field.name, "employeeid"]}
rules={[
{
required: true
}
]}
>
<EmployeeSearchSelectComponent options={bodyshop.employees} />
</Form.Item>
<Form.Item
label={t("employee_teams.fields.allocation_percentage")}
key={`${index}`}
name={[field.name, "percentage"]}
rules={[
{
required: true
}
]}
>
<InputNumber min={0} max={100} precision={2} />
</Form.Item>
<Form.Item
label={t("employee_teams.fields.payout_method")}
key={`${index}-payout-method`}
name={[field.name, "payout_method"]}
initialValue="hourly"
rules={[
{
required: true
}
]}
>
<Select options={payoutMethodOptions} />
</Form.Item>
<Form.Item noStyle dependencies={[["employee_team_members", field.name, "payout_method"]]}>
{() => {
const payoutMethod =
form.getFieldValue(["employee_team_members", field.name, "payout_method"]) || "hourly";
const fieldName = payoutMethod === "commission" ? "commission_rates" : "labor_rates";
return LABOR_TYPES.map((laborType) => (
<Form.Item
label={payoutMethod === "commission" ? `${t(`joblines.fields.lbr_types.${laborType}`)} %` : t(`joblines.fields.lbr_types.${laborType}`)}
key={`${index}-${fieldName}-${laborType}`}
name={[field.name, fieldName, laborType]}
rules={[
{
required: true
}
]}
>
{payoutMethod === "commission" ? (
<InputNumber min={0} max={100} precision={2} />
) : (
<CurrencyInput />
)}
</Form.Item>
));
}} }}
/> </Form.Item>
<FormListMoveArrows move={move} index={index} total={fields.length} /> </LayoutFormRow>
</Space> </Form.Item>
</LayoutFormRow> );
</Form.Item> })}
))}
<Form.Item> <Form.Item>
<Button <Button
type="dashed" type="dashed"

View File

@@ -47,33 +47,6 @@ const httpsCerts = {
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename); const __dirname = dirname(__filename);
const pathSeparatorPattern = String.raw`[\\/]`;
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const packageChunkTest = (packageNames) => {
const names = Array.isArray(packageNames) ? packageNames : [packageNames];
return new RegExp(
`${pathSeparatorPattern}node_modules${pathSeparatorPattern}(?:${names
.map((name) => name.split("/").map(escapeRegex).join(pathSeparatorPattern))
.join("|")})(?:${pathSeparatorPattern}|$)`
);
};
const vendorCodeSplittingGroups = [
{ name: "antd", test: packageChunkTest("antd"), priority: 100 },
{ name: "react-redux", test: packageChunkTest("react-redux"), priority: 95 },
{ name: "redux", test: packageChunkTest("redux"), priority: 90 },
{ name: "lodash", test: packageChunkTest("lodash"), priority: 85 },
{ name: "@sentry/react", test: packageChunkTest("@sentry/react"), priority: 80 },
{ name: "@splitsoftware/splitio-react", test: packageChunkTest("@splitsoftware/splitio-react"), priority: 75 },
{ name: "logrocket", test: packageChunkTest("logrocket"), priority: 70 },
{ name: "firebase", test: packageChunkTest("@firebase"), priority: 65 },
{ name: "markerjs2", test: packageChunkTest("markerjs2"), priority: 60 },
{ name: "@apollo/client", test: packageChunkTest("@apollo/client"), priority: 55 },
{ name: "libphonenumber-js", test: packageChunkTest("libphonenumber-js"), priority: 50 },
{ name: "recharts", test: packageChunkTest("recharts"), priority: 45 }
];
export default defineConfig(({ command, mode }) => { export default defineConfig(({ command, mode }) => {
// React Compiler is always enabled for production/test builds // React Compiler is always enabled for production/test builds
@@ -255,13 +228,27 @@ export default defineConfig(({ command, mode }) => {
build: { build: {
sourcemap: true, sourcemap: true,
rolldownOptions: { rollupOptions: {
output: { output: {
codeSplitting: { manualChunks: {
groups: vendorCodeSplittingGroups antd: ["antd"],
}, "react-redux": ["react-redux"],
comments: { redux: ["redux"],
legal: false lodash: ["lodash"],
"@sentry/react": ["@sentry/react"],
"@splitsoftware/splitio-react": ["@splitsoftware/splitio-react"],
logrocket: ["logrocket"],
firebase: [
"@firebase/analytics",
"@firebase/app",
"@firebase/firestore",
"@firebase/auth",
"@firebase/messaging"
],
markerjs2: ["markerjs2"],
"@apollo/client": ["@apollo/client"],
"libphonenumber-js": ["libphonenumber-js"],
recharts: ["recharts"]
} }
} }
}, },
@@ -269,6 +256,12 @@ export default defineConfig(({ command, mode }) => {
cssMinify: "lightningcss" cssMinify: "lightningcss"
}, },
// Strip console/debugger in prod to shrink bundles
esbuild: {
// drop: mode === "production" ? ["console", "debugger"] : [],
legalComments: "none" // Remove license comments in production
},
optimizeDeps: { optimizeDeps: {
include: [ include: [
"react", "react",
@@ -291,8 +284,8 @@ export default defineConfig(({ command, mode }) => {
"@firebase/util", "@firebase/util",
"styled-components" "styled-components"
], ],
rolldownOptions: { esbuildOptions: {
moduleTypes: { ".jsx": "jsx", ".tsx": "tsx" } loader: { ".jsx": "jsx", ".tsx": "tsx" }
}, },
// Force styled-components to be pre-bundled and deduplicated // Force styled-components to be pre-bundled and deduplicated
force: mode === "development" force: mode === "development"

140
package-lock.json generated
View File

@@ -2209,9 +2209,9 @@
} }
}, },
"node_modules/@hono/node-server": { "node_modules/@hono/node-server": {
"version": "1.19.11", "version": "1.19.9",
"resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz",
"integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=18.14.1" "node": ">=18.14.1"
@@ -2542,9 +2542,9 @@
} }
}, },
"node_modules/@modelcontextprotocol/sdk/node_modules/jose": { "node_modules/@modelcontextprotocol/sdk/node_modules/jose": {
"version": "6.2.1", "version": "6.1.3",
"resolved": "https://registry.npmjs.org/jose/-/jose-6.2.1.tgz", "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz",
"integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==", "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/panva" "url": "https://github.com/sponsors/panva"
@@ -3368,9 +3368,9 @@
} }
}, },
"node_modules/@smithy/core": { "node_modules/@smithy/core": {
"version": "3.23.11", "version": "3.23.12",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz",
"integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/protocol-http": "^5.3.12", "@smithy/protocol-http": "^5.3.12",
@@ -3379,7 +3379,7 @@
"@smithy/util-base64": "^4.3.2", "@smithy/util-base64": "^4.3.2",
"@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-browser": "^4.2.2",
"@smithy/util-middleware": "^4.2.12", "@smithy/util-middleware": "^4.2.12",
"@smithy/util-stream": "^4.5.19", "@smithy/util-stream": "^4.5.20",
"@smithy/util-utf8": "^4.2.2", "@smithy/util-utf8": "^4.2.2",
"@smithy/uuid": "^1.1.2", "@smithy/uuid": "^1.1.2",
"tslib": "^2.6.2" "tslib": "^2.6.2"
@@ -3588,13 +3588,13 @@
} }
}, },
"node_modules/@smithy/middleware-endpoint": { "node_modules/@smithy/middleware-endpoint": {
"version": "4.4.25", "version": "4.4.26",
"resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz",
"integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/core": "^3.23.11", "@smithy/core": "^3.23.12",
"@smithy/middleware-serde": "^4.2.14", "@smithy/middleware-serde": "^4.2.15",
"@smithy/node-config-provider": "^4.3.12", "@smithy/node-config-provider": "^4.3.12",
"@smithy/shared-ini-file-loader": "^4.4.7", "@smithy/shared-ini-file-loader": "^4.4.7",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
@@ -3607,15 +3607,15 @@
} }
}, },
"node_modules/@smithy/middleware-retry": { "node_modules/@smithy/middleware-retry": {
"version": "4.4.42", "version": "4.4.43",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz",
"integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/node-config-provider": "^4.3.12", "@smithy/node-config-provider": "^4.3.12",
"@smithy/protocol-http": "^5.3.12", "@smithy/protocol-http": "^5.3.12",
"@smithy/service-error-classification": "^4.2.12", "@smithy/service-error-classification": "^4.2.12",
"@smithy/smithy-client": "^4.12.5", "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"@smithy/util-middleware": "^4.2.12", "@smithy/util-middleware": "^4.2.12",
"@smithy/util-retry": "^4.2.12", "@smithy/util-retry": "^4.2.12",
@@ -3627,12 +3627,12 @@
} }
}, },
"node_modules/@smithy/middleware-serde": { "node_modules/@smithy/middleware-serde": {
"version": "4.2.14", "version": "4.2.15",
"resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz",
"integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/core": "^3.23.11", "@smithy/core": "^3.23.12",
"@smithy/protocol-http": "^5.3.12", "@smithy/protocol-http": "^5.3.12",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"tslib": "^2.6.2" "tslib": "^2.6.2"
@@ -3670,9 +3670,9 @@
} }
}, },
"node_modules/@smithy/node-http-handler": { "node_modules/@smithy/node-http-handler": {
"version": "4.4.16", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz",
"integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/abort-controller": "^4.2.12", "@smithy/abort-controller": "^4.2.12",
@@ -3783,17 +3783,17 @@
} }
}, },
"node_modules/@smithy/smithy-client": { "node_modules/@smithy/smithy-client": {
"version": "4.12.5", "version": "4.12.6",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.6.tgz",
"integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/core": "^3.23.11", "@smithy/core": "^3.23.12",
"@smithy/middleware-endpoint": "^4.4.25", "@smithy/middleware-endpoint": "^4.4.26",
"@smithy/middleware-stack": "^4.2.12", "@smithy/middleware-stack": "^4.2.12",
"@smithy/protocol-http": "^5.3.12", "@smithy/protocol-http": "^5.3.12",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"@smithy/util-stream": "^4.5.19", "@smithy/util-stream": "^4.5.20",
"tslib": "^2.6.2" "tslib": "^2.6.2"
}, },
"engines": { "engines": {
@@ -3890,13 +3890,13 @@
} }
}, },
"node_modules/@smithy/util-defaults-mode-browser": { "node_modules/@smithy/util-defaults-mode-browser": {
"version": "4.3.41", "version": "4.3.42",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz",
"integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/property-provider": "^4.2.12", "@smithy/property-provider": "^4.2.12",
"@smithy/smithy-client": "^4.12.5", "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"tslib": "^2.6.2" "tslib": "^2.6.2"
}, },
@@ -3905,16 +3905,16 @@
} }
}, },
"node_modules/@smithy/util-defaults-mode-node": { "node_modules/@smithy/util-defaults-mode-node": {
"version": "4.2.44", "version": "4.2.45",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz",
"integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/config-resolver": "^4.4.11", "@smithy/config-resolver": "^4.4.11",
"@smithy/credential-provider-imds": "^4.2.12", "@smithy/credential-provider-imds": "^4.2.12",
"@smithy/node-config-provider": "^4.3.12", "@smithy/node-config-provider": "^4.3.12",
"@smithy/property-provider": "^4.2.12", "@smithy/property-provider": "^4.2.12",
"@smithy/smithy-client": "^4.12.5", "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"tslib": "^2.6.2" "tslib": "^2.6.2"
}, },
@@ -3976,13 +3976,13 @@
} }
}, },
"node_modules/@smithy/util-stream": { "node_modules/@smithy/util-stream": {
"version": "4.5.19", "version": "4.5.20",
"resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.20.tgz",
"integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@smithy/fetch-http-handler": "^5.3.15", "@smithy/fetch-http-handler": "^5.3.15",
"@smithy/node-http-handler": "^4.4.16", "@smithy/node-http-handler": "^4.5.0",
"@smithy/types": "^4.13.1", "@smithy/types": "^4.13.1",
"@smithy/util-base64": "^4.3.2", "@smithy/util-base64": "^4.3.2",
"@smithy/util-buffer-from": "^4.2.2", "@smithy/util-buffer-from": "^4.2.2",
@@ -6993,12 +6993,12 @@
} }
}, },
"node_modules/express-rate-limit": { "node_modules/express-rate-limit": {
"version": "8.3.1", "version": "8.2.1",
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.1.tgz", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz",
"integrity": "sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==", "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ip-address": "10.1.0" "ip-address": "10.0.1"
}, },
"engines": { "engines": {
"node": ">= 16" "node": ">= 16"
@@ -7340,15 +7340,14 @@
} }
}, },
"node_modules/firebase-admin/node_modules/gaxios": { "node_modules/firebase-admin/node_modules/gaxios": {
"version": "7.1.3", "version": "7.1.4",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.4.tgz",
"integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", "integrity": "sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"extend": "^3.0.2", "extend": "^3.0.2",
"https-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.1",
"node-fetch": "^3.3.2", "node-fetch": "^3.3.2"
"rimraf": "^5.0.1"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
@@ -7369,14 +7368,14 @@
} }
}, },
"node_modules/firebase-admin/node_modules/google-auth-library": { "node_modules/firebase-admin/node_modules/google-auth-library": {
"version": "10.6.1", "version": "10.6.2",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.1.tgz", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.6.2.tgz",
"integrity": "sha512-5awwuLrzNol+pFDmKJd0dKtZ0fPLAtoA5p7YO4ODsDu6ONJUVqbYwvv8y2ZBO5MBNp9TJXigB19710kYpBPdtA==", "integrity": "sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"base64-js": "^1.3.0", "base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11", "ecdsa-sig-formatter": "^1.0.11",
"gaxios": "7.1.3", "gaxios": "^7.1.4",
"gcp-metadata": "8.1.2", "gcp-metadata": "8.1.2",
"google-logging-utils": "1.1.3", "google-logging-utils": "1.1.3",
"jws": "^4.0.0" "jws": "^4.0.0"
@@ -7412,21 +7411,6 @@
"url": "https://opencollective.com/node-fetch" "url": "https://opencollective.com/node-fetch"
} }
}, },
"node_modules/firebase-admin/node_modules/rimraf": {
"version": "5.0.10",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
"integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
"license": "ISC",
"dependencies": {
"glob": "^10.3.7"
},
"bin": {
"rimraf": "dist/esm/bin.mjs"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/flat-cache": { "node_modules/flat-cache": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -8045,9 +8029,9 @@
} }
}, },
"node_modules/hono": { "node_modules/hono": {
"version": "4.12.8", "version": "4.12.3",
"resolved": "https://registry.npmjs.org/hono/-/hono-4.12.8.tgz", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz",
"integrity": "sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A==", "integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=16.9.0" "node": ">=16.9.0"
@@ -8312,9 +8296,9 @@
} }
}, },
"node_modules/ip-address": { "node_modules/ip-address": {
"version": "10.1.0", "version": "10.0.1",
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
"integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">= 12" "node": ">= 12"