diff --git a/eslint.config.mjs b/eslint.config.mjs index 09a4ba1..bf12c59 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,6 +3,7 @@ import eslint from "@eslint/js"; import prettier from "eslint-plugin-prettier/recommended"; import rxjs from "eslint-plugin-rxjs"; // import storybook from "eslint-plugin-storybook"; +// import react from "eslint-plugin-react"; import tseslint from "typescript-eslint"; export default tseslint.config( @@ -49,6 +50,7 @@ export default tseslint.config( "@typescript-eslint/restrict-plus-operands": "error", "@typescript-eslint/restrict-template-expressions": "error", "@typescript-eslint/unbound-method": "error", + "@typescript-eslint/promise-function-async": "warn", "rxjs/no-async-subscribe": "warn", "rxjs/no-ignored-observable": "warn", "rxjs/no-ignored-subscription": "warn", @@ -56,5 +58,10 @@ export default tseslint.config( "rxjs/throw-error": "warn", }, }, - { ignores: ["node_modules/*", "build/*", "dist/*", "**/*.spec.ts", "*.config.mjs"] }, + // { + // files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"], + // plugins: { react: fixupPluginRules(react) }, + // ...react.configs.recommended, + // }, + { ignores: ["node_modules/*", ".storybook/", "build/*", "dist/*", "**/*.spec.ts", "*.config.mjs"] }, ); diff --git a/package.json b/package.json index 85ed79a..dc18462 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "eslint": "^9.2.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-react": "^7.34.1", "eslint-plugin-rxjs": "^5.0.3", "eslint-plugin-storybook": "^0.8.0", "http-proxy-middleware": "^3.0.0", diff --git a/src/app/components/Portfolio/Balance/actions.ts b/src/app/components/Portfolio/Balance/actions.ts index 1c3e34d..8c3326a 100644 --- a/src/app/components/Portfolio/Balance/actions.ts +++ b/src/app/components/Portfolio/Balance/actions.ts @@ -6,11 +6,11 @@ import { ActionFunctionArgs, redirect } from "react-router-dom"; * @param params * @returns */ -export const balanceSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const balanceSave = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, balanceId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const data = Object.fromEntries(formData); // console.log("balance save ", data); return fetch(`/api/portfolio/${portfolioId}/balances/id/${balanceId}/SaveBalance`, { @@ -22,7 +22,7 @@ export const balanceSave = ({ request, params }: ActionFunctionArgs): Promise response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -31,15 +31,15 @@ export const balanceSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const balanceDelete = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, balanceId } = params; return request .formData() - .then((_formData: Iterable) => { + .then(async (_formData: Iterable) => { return fetch(`/api/portfolio/${portfolioId}/balances/id/${balanceId}/DeleteBalance`, { method: "DELETE", }); }) - .then((response: Response) => response.text()) + .then(async (response: Response) => response.text()) .then((_data) => redirect("../")); }; diff --git a/src/app/components/Portfolio/Balance/loaders.ts b/src/app/components/Portfolio/Balance/loaders.ts index 106b9fc..c973d0c 100644 --- a/src/app/components/Portfolio/Balance/loaders.ts +++ b/src/app/components/Portfolio/Balance/loaders.ts @@ -6,10 +6,10 @@ import { BalanceEntry } from "../../../../routers/balances.types"; * @param params * @returns */ -export const balancesIndexLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const balancesIndexLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/balances/index`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.balances as BalanceEntry[]); }; @@ -18,10 +18,10 @@ export const balancesIndexLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const balancesShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, balanceId } = params; // console.log("balancesShowLoader", portfolioId, balanceId); return fetch(`/api/portfolio/${portfolioId}/balances/id/${balanceId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.balance as BalanceEntry); }; diff --git a/src/app/components/Portfolio/Contract/loaders.ts b/src/app/components/Portfolio/Contract/loaders.ts index 25679f0..08762c4 100644 --- a/src/app/components/Portfolio/Contract/loaders.ts +++ b/src/app/components/Portfolio/Contract/loaders.ts @@ -6,9 +6,9 @@ import { ContractEntry } from "../../../../routers/repository.types"; * @param params * @returns */ -export const contractShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const contractShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, contractId } = params; return fetch(`/api/portfolio/${portfolioId}/contracts/id/${contractId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.contract as ContractEntry); }; diff --git a/src/app/components/Portfolio/Layout/PortfolioLayout.tsx b/src/app/components/Portfolio/Layout/PortfolioLayout.tsx index d2f4d03..fc6c815 100644 --- a/src/app/components/Portfolio/Layout/PortfolioLayout.tsx +++ b/src/app/components/Portfolio/Layout/PortfolioLayout.tsx @@ -16,7 +16,7 @@ const PortfolioLayout: FunctionComponent = ({ children, .. useEffect(() => { fetch(`/api/portfolio/${portfolioId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => setPortfolio(data.portfolio as PortfolioModel)) .catch((error) => console.error("error fetching portfolio:", error)); }, []); diff --git a/src/app/components/Portfolio/Portfolio/loaders.ts b/src/app/components/Portfolio/Portfolio/loaders.ts index 88b7a99..6c83e80 100644 --- a/src/app/components/Portfolio/Portfolio/loaders.ts +++ b/src/app/components/Portfolio/Portfolio/loaders.ts @@ -6,9 +6,9 @@ import { Portfolio as PortfolioModel } from "../../../../models/portfolio.model" * @param param0 * @returns */ -export const portfolioLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const portfolioLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.portfolio as PortfolioModel); }; diff --git a/src/app/components/Portfolio/Position/actions.ts b/src/app/components/Portfolio/Position/actions.ts index b6e5274..6d34017 100644 --- a/src/app/components/Portfolio/Position/actions.ts +++ b/src/app/components/Portfolio/Position/actions.ts @@ -5,11 +5,11 @@ import { ActionFunctionArgs, redirect } from "react-router-dom"; * @param params * @returns */ -export const positionSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const positionSave = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, positionId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const data = Object.fromEntries(formData); // console.log("data:", data); return fetch(`/api/portfolio/${portfolioId}/positions/id/${positionId}/SavePosition`, { @@ -21,7 +21,7 @@ export const positionSave = ({ request, params }: ActionFunctionArgs): Promise response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -30,14 +30,14 @@ export const positionSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const positionDelete = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, positionId } = params; return request .formData() - .then((_formData: Iterable) => { + .then(async (_formData: Iterable) => { return fetch(`/api/portfolio/${portfolioId}/positions/id/${positionId}/DeletePosition`); }) - .then((response: Response) => response.text()) + .then(async (response: Response) => response.text()) .then((_data) => redirect("../")); }; @@ -46,15 +46,15 @@ export const positionDelete = ({ request, params }: ActionFunctionArgs): Promise * @param params * @returns */ -export const positionGuessTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const positionGuessTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, positionId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/positions/${positionId}/GuessTrade`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -64,15 +64,15 @@ export const positionGuessTrade = ({ request, params }: ActionFunctionArgs): Pro * @param request * @returns */ -export const positionAddToTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const positionAddToTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, positionId, tradeId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/positions/${positionId}/AddToTrade/${tradeId}`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -82,15 +82,15 @@ export const positionAddToTrade = ({ request, params }: ActionFunctionArgs): Pro * @param request * @returns */ -export const positionUnlinkTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const positionUnlinkTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, positionId } = params; // console.log("positionUnlinkTrade", portfolioId, positionId); return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/positions/${positionId}/UnlinkTrade`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; diff --git a/src/app/components/Portfolio/Position/loaders.ts b/src/app/components/Portfolio/Position/loaders.ts index 23762a3..384281a 100644 --- a/src/app/components/Portfolio/Position/loaders.ts +++ b/src/app/components/Portfolio/Position/loaders.ts @@ -7,10 +7,10 @@ import { PositionEntry } from "../../../../routers/positions.types"; * @param param0 * @returns */ -export const positionsIndexLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const positionsIndexLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/positions/index`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.positions as PositionEntry[]); }; @@ -19,10 +19,10 @@ export const positionsIndexLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const positionsOptionsLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/positions/index`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data: { positions: PositionEntry[] }) => data.positions.filter((item) => item.contract.secType == "OPT")); }; @@ -31,9 +31,9 @@ export const positionsOptionsLoader = ({ params }: LoaderFunctionArgs): Promise< * @param param0 * @returns */ -export const positionShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const positionShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, positionId } = params; return fetch(`/api/portfolio/${portfolioId}/positions/id/${positionId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.position as Position); }; diff --git a/src/app/components/Portfolio/Report/DividendsComponent.tsx b/src/app/components/Portfolio/Report/DividendsComponent.tsx index 78e766b..7210575 100644 --- a/src/app/components/Portfolio/Report/DividendsComponent.tsx +++ b/src/app/components/Portfolio/Report/DividendsComponent.tsx @@ -1,7 +1,10 @@ -import { Box, HStack, Spacer, Text, VStack } from "@chakra-ui/react"; +import { Box, HStack, Link, Spacer, Text, VStack } from "@chakra-ui/react"; import { default as React } from "react"; +import { Link as RouterLink, useParams } from "react-router-dom"; import { DididendSummary, ReportEntry } from "../../../../routers/reports.types"; import Number from "../../Number/Number"; +import { StatementLink } from "../Statement/links"; +import { formatMonth } from "./utils"; type Props = { theReports: ReportEntry[] }; @@ -12,10 +15,12 @@ const _compareReports = (a: ReportEntry, b: ReportEntry): number => { }; const OneCountryTable = ({ + portfolioId, theReports, country, ..._rest }: { + portfolioId: string; theReports: ReportEntry[]; country: string; }): React.ReactNode => { @@ -36,10 +41,10 @@ const OneCountryTable = ({ report.dividendsSummary .filter((summary: DididendSummary) => summary.country == country) .map((item) => ( - - - {report.year}-{report.month} - + + + {formatMonth(report.year, report.month)} + @@ -64,6 +69,8 @@ const OneCountryTable = ({ * @returns */ const Dividends = ({ theReports, ..._rest }: Props): React.ReactNode => { + const { portfolioId } = useParams(); + let grossTotal = 0; let taxesTotal = 0; let netTotal = 0; @@ -97,7 +104,7 @@ const Dividends = ({ theReports, ..._rest }: Props): React.ReactNode => { {countries.map((country) => ( {country} - + ))} diff --git a/src/app/components/Portfolio/Report/FeesComponent.tsx b/src/app/components/Portfolio/Report/FeesComponent.tsx index cc87f32..c2eda68 100644 --- a/src/app/components/Portfolio/Report/FeesComponent.tsx +++ b/src/app/components/Portfolio/Report/FeesComponent.tsx @@ -1,22 +1,21 @@ -import { Box, HStack, Spacer, Text, VStack } from "@chakra-ui/react"; +import { Box, HStack, Link, Spacer, Text, VStack } from "@chakra-ui/react"; import { default as React } from "react"; +import { Link as RouterLink, useParams } from "react-router-dom"; import { ReportEntry } from "../../../../routers/reports.types"; import Number from "../../Number/Number"; +import { StatementLink } from "../Statement/links"; +import { formatMonth } from "./utils"; type Props = { theReports: ReportEntry[] }; -const _compareReports = (a: ReportEntry, b: ReportEntry): number => { - let result = a.year - b.year; - if (!result) result = a.month - b.month; - return result; -}; - /** * Fees table component * @param theReports Tax reports to summarize. Assume their summaries are sorted by date * @returns */ const Fees = ({ theReports, ..._rest }: Props): React.ReactNode => { + const { portfolioId } = useParams(); + return ( <> @@ -29,9 +28,9 @@ const Fees = ({ theReports, ..._rest }: Props): React.ReactNode => { {theReports.map((report) => ( - - {report.year}-{report.month} - + + {formatMonth(report.year, report.month)} + diff --git a/src/app/components/Portfolio/Report/InterestsComponent.tsx b/src/app/components/Portfolio/Report/InterestsComponent.tsx index 9008530..ae0e4fb 100644 --- a/src/app/components/Portfolio/Report/InterestsComponent.tsx +++ b/src/app/components/Portfolio/Report/InterestsComponent.tsx @@ -1,7 +1,10 @@ -import { Box, HStack, Spacer, Text, VStack } from "@chakra-ui/react"; +import { Box, HStack, Link, Spacer, Text, VStack } from "@chakra-ui/react"; import { default as React } from "react"; +import { Link as RouterLink, useParams } from "react-router-dom"; import { InterestsSummary, ReportEntry } from "../../../../routers/reports.types"; import Number from "../../Number/Number"; +import { StatementLink } from "../Statement/links"; +import { formatMonth } from "./utils"; type Props = { theReports: ReportEntry[] }; @@ -12,10 +15,12 @@ const _compareReports = (a: ReportEntry, b: ReportEntry): number => { }; const OneCountryTable = ({ + portfolioId, theReports, country, ..._rest }: { + portfolioId: string; theReports: ReportEntry[]; country: string; }): React.ReactNode => { @@ -40,9 +45,9 @@ const OneCountryTable = ({ .filter((summary: InterestsSummary) => summary.country == country) .map((item) => ( - - {report.year}-{report.month} - + + {formatMonth(report.year, report.month)} + @@ -69,6 +74,8 @@ const OneCountryTable = ({ * @returns */ const Interests = ({ theReports, ..._rest }: Props): React.ReactNode => { + const { portfolioId } = useParams(); + let creditTotal = 0; let debitTotal = 0; let withHoldingTotal = 0; @@ -107,7 +114,7 @@ const Interests = ({ theReports, ..._rest }: Props): React.ReactNode => { {countries.map((country) => ( {country} - + ))} diff --git a/src/app/components/Portfolio/Report/PnLsComponent.tsx b/src/app/components/Portfolio/Report/PnLsComponent.tsx index 4552454..3e5f37f 100644 --- a/src/app/components/Portfolio/Report/PnLsComponent.tsx +++ b/src/app/components/Portfolio/Report/PnLsComponent.tsx @@ -1,7 +1,10 @@ -import { Box, HStack, Spacer, Text, VStack } from "@chakra-ui/react"; +import { Box, HStack, Link, Spacer, Text, VStack } from "@chakra-ui/react"; import { default as React } from "react"; +import { Link as RouterLink, useParams } from "react-router-dom"; import { ReportEntry, TradesSummary } from "../../../../routers/reports.types"; import Number from "../../Number/Number"; +import { StatementLink } from "../Statement/links"; +import { formatMonth } from "./utils"; type Props = { theReports: ReportEntry[] }; @@ -22,10 +25,12 @@ const _compareReports = (a: ReportEntry, b: ReportEntry): number => { }; const OneAssetTable = ({ + portfolioId, theReports, assetType, ..._rest }: { + portfolioId: string; theReports: ReportEntry[]; assetType: string; }): React.ReactNode => { @@ -42,9 +47,9 @@ const OneAssetTable = ({ .filter((report) => PnLs[assetType](report.tradesSummary)) .map((report) => ( - - {report.year}-{report.month} - + + {formatMonth(report.year, report.month)} + {addToTotal(PnLs[assetType](report.tradesSummary))} @@ -64,6 +69,8 @@ const OneAssetTable = ({ * @returns */ const PnL = ({ theReports, ..._rest }: Props): React.ReactNode => { + const { portfolioId } = useParams(); + return ( <> @@ -78,7 +85,7 @@ const PnL = ({ theReports, ..._rest }: Props): React.ReactNode => { {Object.keys(PnLs).map((assetType) => ( {assetType} - + ))} diff --git a/src/app/components/Portfolio/Report/loaders.ts b/src/app/components/Portfolio/Report/loaders.ts index 021befd..5dee958 100644 --- a/src/app/components/Portfolio/Report/loaders.ts +++ b/src/app/components/Portfolio/Report/loaders.ts @@ -6,24 +6,24 @@ import { ReportEntry } from "../../../../routers/reports.types"; * @param param0 * @returns */ -export const reportsIndexLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const reportsIndexLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/reports/summary/all`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.reports as ReportEntry[]); }; -export const reportsIndexLoader12m = ({ params }: LoaderFunctionArgs): Promise => { +export const reportsIndexLoader12m = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/reports/summary/12m`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.reports as ReportEntry[]); }; -export const reportsIndexLoaderYtd = ({ params }: LoaderFunctionArgs): Promise => { +export const reportsIndexLoaderYtd = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/reports/summary/ytd`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.reports as ReportEntry[]); }; /** @@ -31,9 +31,9 @@ export const reportsIndexLoaderYtd = ({ params }: LoaderFunctionArgs): Promise => { +export const reportSummaryLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, year } = params; return fetch(`/api/portfolio/${portfolioId}/reports/year/${year}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.reports as ReportEntry[]); }; diff --git a/src/app/components/Portfolio/Report/utils.ts b/src/app/components/Portfolio/Report/utils.ts new file mode 100644 index 0000000..df6e59f --- /dev/null +++ b/src/app/components/Portfolio/Report/utils.ts @@ -0,0 +1,3 @@ +export const formatMonth = (year: number, month: number): string => { + return `${year}-${month < 10 ? "0" : ""}${month}`; +}; diff --git a/src/app/components/Portfolio/Statement/actions.ts b/src/app/components/Portfolio/Statement/actions.ts index ee699b9..715a8e1 100644 --- a/src/app/components/Portfolio/Statement/actions.ts +++ b/src/app/components/Portfolio/Statement/actions.ts @@ -5,15 +5,15 @@ import { ActionFunctionArgs, redirect } from "react-router-dom"; * @param params * @returns */ -export const statementCreateTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementCreateTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/statements/${statementId}/CreateTrade`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -22,15 +22,15 @@ export const statementCreateTrade = ({ request, params }: ActionFunctionArgs): P * @param params * @returns */ -export const statementGuessTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementGuessTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/statements/${statementId}/GuessTrade`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -40,15 +40,15 @@ export const statementGuessTrade = ({ request, params }: ActionFunctionArgs): Pr * @param request * @returns */ -export const statementUnlinkTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementUnlinkTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/statements/${statementId}/UnlinkTrade`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -57,15 +57,15 @@ export const statementUnlinkTrade = ({ request, params }: ActionFunctionArgs): P * @param params * @returns */ -export const statementAddToTrade = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementAddToTrade = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId, tradeId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/statements/${statementId}/AddToTrade/${tradeId}`); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -74,16 +74,16 @@ export const statementAddToTrade = ({ request, params }: ActionFunctionArgs): Pr * @param params * @returns */ -export const statementDelete = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementDelete = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId } = params; // console.log("statementDelete", portfolioId, statementId); return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const _data = Object.fromEntries(formData); return fetch(`/api/portfolio/${portfolioId}/statements/${statementId}/DeleteStatement`, { method: "DELETE" }); }) - .then((response: Response) => response.text()) + .then(async (response: Response) => response.text()) .then((_data) => redirect("../")); }; @@ -92,11 +92,11 @@ export const statementDelete = ({ request, params }: ActionFunctionArgs): Promis * @param params * @returns */ -export const statementSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const statementSave = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, statementId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const data = Object.fromEntries(formData); Object.keys(data).forEach((key) => { if (data[key] == "null") data[key] = null; @@ -115,6 +115,6 @@ export const statementSave = ({ request, params }: ActionFunctionArgs): Promise< body: JSON.stringify(data), }); }) - .then((response: Response) => response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; diff --git a/src/app/components/Portfolio/Statement/loaders.ts b/src/app/components/Portfolio/Statement/loaders.ts index 9818e4e..33b85ec 100644 --- a/src/app/components/Portfolio/Statement/loaders.ts +++ b/src/app/components/Portfolio/Statement/loaders.ts @@ -6,10 +6,12 @@ import { StatementEntry, StatementsSynthesysEntries } from "../../../../routers/ * @param params * @returns */ -export const statementSummaryLoaderYTD = ({ params }: LoaderFunctionArgs): Promise => { +export const statementSummaryLoaderYTD = async ({ + params, +}: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/statements/summary/ytd`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.synthesysentries as StatementsSynthesysEntries); }; @@ -18,10 +20,12 @@ export const statementSummaryLoaderYTD = ({ params }: LoaderFunctionArgs): Promi * @param params * @returns */ -export const statementSummaryLoader12M = ({ params }: LoaderFunctionArgs): Promise => { +export const statementSummaryLoader12M = async ({ + params, +}: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/statements/summary/12m`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.synthesysentries as StatementsSynthesysEntries); }; @@ -30,10 +34,12 @@ export const statementSummaryLoader12M = ({ params }: LoaderFunctionArgs): Promi * @param params * @returns */ -export const statementSummaryLoaderAll = ({ params }: LoaderFunctionArgs): Promise => { +export const statementSummaryLoaderAll = async ({ + params, +}: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/statements/summary/all`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.synthesysentries as StatementsSynthesysEntries); }; @@ -42,10 +48,10 @@ export const statementSummaryLoaderAll = ({ params }: LoaderFunctionArgs): Promi * @param params * @returns */ -export const statementShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const statementShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, statementId } = params; return fetch(`/api/portfolio/${portfolioId}/statements/id/${statementId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.statement as StatementEntry); }; @@ -54,9 +60,9 @@ export const statementShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const statementMonthLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, year, month } = params; return fetch(`/api/portfolio/${portfolioId}/statements/month/${year}/${month}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.statemententries as StatementEntry[]); }; diff --git a/src/app/components/Portfolio/Trade/actions.ts b/src/app/components/Portfolio/Trade/actions.ts index ee91290..0b40e52 100644 --- a/src/app/components/Portfolio/Trade/actions.ts +++ b/src/app/components/Portfolio/Trade/actions.ts @@ -7,11 +7,11 @@ import { TradeLink } from "./links"; * @param params * @returns */ -export const tradeSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const tradeSave = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, tradeId } = params; return request .formData() - .then((formData: Iterable) => { + .then(async (formData: Iterable) => { const data = Object.fromEntries(formData); // console.log("trade save ", data); return fetch(`/api/portfolio/${portfolioId}/trades/id/${tradeId}/SaveTrade`, { @@ -23,7 +23,7 @@ export const tradeSave = ({ request, params }: ActionFunctionArgs): Promise response.json()) + .then(async (response: Response) => response.json()) .then((_data) => redirect("../")); }; @@ -33,18 +33,18 @@ export const tradeSave = ({ request, params }: ActionFunctionArgs): Promise => { +export const tradeDelete = async ({ request, params }: ActionFunctionArgs): Promise => { const { portfolioId, tradeId } = params; // console.log("tradeDelete:", portfolioId, tradeId); return ( request .formData() - .then((_formData: Iterable) => { + .then(async (_formData: Iterable) => { return fetch(`/api/portfolio/${portfolioId}/trades/id/${tradeId}/DeleteTrade`, { method: "DELETE", }); }) - .then((response: Response) => response.text()) + .then(async (response: Response) => response.text()) // .then((data) => console.log("tradeDelete done:", data)) .then(() => redirect(TradeLink.toIndex(portfolioId))) ); diff --git a/src/app/components/Portfolio/Trade/loaders.ts b/src/app/components/Portfolio/Trade/loaders.ts index fcf69c9..f54c71a 100644 --- a/src/app/components/Portfolio/Trade/loaders.ts +++ b/src/app/components/Portfolio/Trade/loaders.ts @@ -6,10 +6,10 @@ import { TradeEntry, TradeSynthesys } from "../../../../routers/trades.types"; * @param param0 * @returns */ -export const tradeSummaryLoaderYTD = ({ params }: LoaderFunctionArgs): Promise => { +export const tradeSummaryLoaderYTD = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/trades/summary/ytd`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.tradessynthesys as TradeSynthesys); }; @@ -18,10 +18,10 @@ export const tradeSummaryLoaderYTD = ({ params }: LoaderFunctionArgs): Promise => { +export const tradeSummaryLoader12M = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/trades/summary/12m`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.tradessynthesys as TradeSynthesys); }; @@ -30,10 +30,10 @@ export const tradeSummaryLoader12M = ({ params }: LoaderFunctionArgs): Promise => { +export const tradeSummaryLoaderAll = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/trades/summary/all`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.tradessynthesys as TradeSynthesys); }; @@ -42,10 +42,10 @@ export const tradeSummaryLoaderAll = ({ params }: LoaderFunctionArgs): Promise => { +export const tradesOpenLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId } = params; return fetch(`/api/portfolio/${portfolioId}/trades/summary/open`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.trades as TradeEntry[]); }; @@ -54,11 +54,11 @@ export const tradesOpenLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const tradesShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, tradeId } = params; // console.log("tradesShowLoader", portfolioId, tradeId); return fetch(`/api/portfolio/${portfolioId}/trades/id/${tradeId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.trade as TradeEntry); }; @@ -67,9 +67,9 @@ export const tradesShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const tradesMonthLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { portfolioId, year, month } = params; return fetch(`/api/portfolio/${portfolioId}/trades/month/${year}/${month}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.trades as TradeEntry[]); }; diff --git a/src/app/components/Portfolio/loaders.ts b/src/app/components/Portfolio/loaders.ts index 41f5de6..3148bbe 100644 --- a/src/app/components/Portfolio/loaders.ts +++ b/src/app/components/Portfolio/loaders.ts @@ -6,9 +6,12 @@ import { Portfolio as PortfolioModel } from "../../../models/portfolio.model"; * @param params * @returns */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export const portfolioIndexLoader: LoaderFunction = ({ params }: LoaderFunctionArgs): Promise => { + +export const portfolioIndexLoader: LoaderFunction = async ({ + params, +}: LoaderFunctionArgs): Promise => { + const { portfolioId } = params; // eslint-disable-line @typescript-eslint/no-unused-vars return fetch("/api/portfolio") - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.portfolios as PortfolioModel[]); }; diff --git a/src/app/components/Repository/Options/loaders.ts b/src/app/components/Repository/Options/loaders.ts index 66d380e..7a82561 100644 --- a/src/app/components/Repository/Options/loaders.ts +++ b/src/app/components/Repository/Options/loaders.ts @@ -6,10 +6,10 @@ import { OptionEntry } from "../../../../routers/repository.types"; * @param params * @returns */ -export const optionShowLoader = ({ params }: LoaderFunctionArgs): Promise => { +export const optionShowLoader = async ({ params }: LoaderFunctionArgs): Promise => { const { optionId } = params; // console.log("tradesShowLoader", portfolioId, tradeId); return fetch(`/api/repository/options/${optionId}`) - .then((response) => response.json()) + .then(async (response) => response.json()) .then((data) => data.option as OptionEntry); }; diff --git a/src/bots/account.bot.ts b/src/bots/account.bot.ts index 1969d72..b2d86be 100644 --- a/src/bots/account.bot.ts +++ b/src/bots/account.bot.ts @@ -82,12 +82,12 @@ export class AccountUpdateBot extends ITradingBot { setTimeout(() => this.emit("processQueue"), 100); } - private createAndUpdateLegs(order: IbOpenOrder, transaction: Transaction): Promise { + private async createAndUpdateLegs(order: IbOpenOrder, transaction: Transaction): Promise { if (order.contract.secType == SecType.BAG) { return order.contract.comboLegs!.reduce( - (p, leg) => - p.then(() => - this.findOrCreateContract({ conId: leg.conId }, transaction).then((contract) => { + async (p, leg) => + p.then(async () => + this.findOrCreateContract({ conId: leg.conId }, transaction).then(async (contract) => { const where = { permId: order.order.permId!, portfolioId: this.portfolio.id, @@ -115,7 +115,7 @@ export class AccountUpdateBot extends ITradingBot { defaults: values, transaction: transaction, // logging: false, - }).then(([open_order, _created]) => + }).then(async ([open_order, _created]) => open_order .update(values, { transaction: transaction, @@ -134,7 +134,7 @@ export class AccountUpdateBot extends ITradingBot { protected async handleUpdateOpenOrder(order: IbOpenOrder, transaction: Transaction): Promise { logger.log(LogLevel.Info, MODULE + ".handleUpdateOpenOrder", undefined, order.order.permId, order.contract.symbol); - await this.findOrCreateContract(order.contract, transaction).then((contract: Contract) => { + await this.findOrCreateContract(order.contract, transaction).then(async (contract: Contract) => { logger.log(LogLevel.Trace, MODULE + ".updateOpenOrder", contract.symbol, "contract found", contract.id); return OpenOrder.findOrCreate({ where: { @@ -158,7 +158,7 @@ export class AccountUpdateBot extends ITradingBot { transaction: transaction, // logging: console.log, }) - .then(([open_order, created]) => { + .then(async ([open_order, created]) => { // console.log("OpenOrder.findOrCreate done"); if (created) return Promise.resolve(open_order); else @@ -178,7 +178,7 @@ export class AccountUpdateBot extends ITradingBot { { transaction: transaction }, ); }) - .then(() => this.createAndUpdateLegs(order, transaction)) + .then(async () => this.createAndUpdateLegs(order, transaction)) .then(() => logger.log( LogLevel.Trace, @@ -193,7 +193,7 @@ export class AccountUpdateBot extends ITradingBot { }); } - protected updateOpenOrder(order: IbOpenOrder): Promise { + protected async updateOpenOrder(order: IbOpenOrder): Promise { logger.log(LogLevel.Info, MODULE + ".updateOpenOrder", undefined, order.order.permId, order.contract.symbol); return this.app.sequelize.transaction(async (t) => this.handleUpdateOpenOrder(order, t)); @@ -219,26 +219,26 @@ export class AccountUpdateBot extends ITradingBot { } } - protected updatePosition(pos: IbPosition): Promise { + protected async updatePosition(pos: IbPosition): Promise { logger.log(LogLevel.Trace, MODULE + ".updatePosition", pos.contract.symbol, pos); const defaults = { portfolio_id: this.portfolio.id, quantity: pos.pos, cost: pos.avgCost! * pos.pos, }; - return this.findOrCreateContract(pos.contract).then((contract): Promise => { + return this.findOrCreateContract(pos.contract).then(async (contract): Promise => { if (defaults.quantity) { return Position.findOrCreate({ where: { contract_id: contract.id }, defaults: { ...defaults, contract_id: contract.id }, }) - .then(([position, created]) => { + .then(async ([position, created]) => { if (created) return position; else { return position.update(defaults, { logging: console.log }); } }) - .then((position): Promise => { + .then(async (position): Promise => { // update contract price, then return position if (pos.marketValue) { contract.price = pos.marketValue / pos.pos / (pos.contract.multiplier || 1); @@ -254,7 +254,7 @@ export class AccountUpdateBot extends ITradingBot { }); } - protected updateCashPosition(pos: { currency: string; balance: number }): Promise { + protected async updateCashPosition(pos: { currency: string; balance: number }): Promise { logger.log(LogLevel.Info, MODULE + ".updateCashPosition", undefined, pos.currency, pos.balance); const where = { portfolio_id: this.portfolio.id, @@ -263,10 +263,10 @@ export class AccountUpdateBot extends ITradingBot { return Balance.findOrCreate({ where: where, defaults: { ...where, quantity: pos.balance }, - }).then(([balance, _created]) => balance.update({ quantity: pos.balance })); + }).then(async ([balance, _created]) => balance.update({ quantity: pos.balance })); } - private cleanBalances(now: number): Promise { + private async cleanBalances(now: number): Promise { return Balance.update( { quantity: 0, @@ -292,7 +292,7 @@ export class AccountUpdateBot extends ITradingBot { // console.log(Date.now(), now); await this.init(); - await this.api.getAllOpenOrders().then((orders) => { + await this.api.getAllOpenOrders().then(async (orders) => { this.iterateOpenOrdersForUpdate(orders); return OpenOrder.destroy({ where: { diff --git a/src/bots/cash.bot.ts b/src/bots/cash.bot.ts index 00f4ec0..ef41729 100644 --- a/src/bots/cash.bot.ts +++ b/src/bots/cash.bot.ts @@ -63,8 +63,8 @@ export class CashManagementBot extends ITradingBot { contract_id: this.portfolio.benchmark.id, orderId: { [Op.ne]: 0 }, }, - }).then((orders) => - orders.reduce((p, order) => { + }).then(async (orders) => + orders.reduce(async (p, order) => { return p.then(() => this.api.cancelOrder(order.orderId)); }, Promise.resolve()), ); diff --git a/src/bots/cc.bot.ts b/src/bots/cc.bot.ts index 9e2aceb..91ee8cd 100644 --- a/src/bots/cc.bot.ts +++ b/src/bots/cc.bot.ts @@ -119,13 +119,13 @@ export class SellCoveredCallsBot extends ITradingBot { } } - private iteratePositions(positions: Position[]): Promise { - return positions.reduce((p, position) => { - return p.then(() => this.processOnePosition(position)); + private async iteratePositions(positions: Position[]): Promise { + return positions.reduce(async (p, position) => { + return p.then(async () => this.processOnePosition(position)); }, Promise.resolve()); // initial } - private listStockPostitions(): Promise { + private async listStockPostitions(): Promise { return Position.findAll({ include: { model: Contract, @@ -140,7 +140,7 @@ export class SellCoveredCallsBot extends ITradingBot { private process(): void { console.log("SellCoveredCallsBot process begin"); this.listStockPostitions() - .then((result) => this.iteratePositions(result)) + .then(async (result) => this.iteratePositions(result)) .then(() => setTimeout(() => this.emit("process"), 3600 * 1000)) .catch((error) => console.error("cc bot process:", error)); } diff --git a/src/bots/csp.bot.ts b/src/bots/csp.bot.ts index dabbeea..6b18996 100644 --- a/src/bots/csp.bot.ts +++ b/src/bots/csp.bot.ts @@ -194,7 +194,7 @@ export class SellCashSecuredPutBot extends ITradingBot { } } - private listParameters(): Promise { + private async listParameters(): Promise { return Setting.findAll({ where: { cspStrategy: { @@ -212,7 +212,7 @@ export class SellCashSecuredPutBot extends ITradingBot { private process(): void { console.log("SellCashSecuredPutBot process begin"); this.listParameters() - .then((result) => this.iterateParameters(result)) + .then(async (result) => this.iterateParameters(result)) .then(() => setTimeout(() => this.emit("process"), CSP_FREQ * 60 * 1000)) .catch((error) => console.error("csp bot process:", error)); } diff --git a/src/bots/importer.bot.ts b/src/bots/importer.bot.ts index 0a7b249..cd2372a 100644 --- a/src/bots/importer.bot.ts +++ b/src/bots/importer.bot.ts @@ -170,19 +170,19 @@ export class ImporterBot extends ITradingBot { } */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processSecurityInfoUnderlying(element: any): Promise | Promise { + protected async processSecurityInfoUnderlying(element: any): Promise | Promise { if (element.underlyingConid) { return this.findOrCreateContract(ibUnderlyingContractFromElement(element)); } else return Promise.resolve(undefined); } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processSecurityInfo(element: any): Promise { + protected async processSecurityInfo(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processSecurityInfo", element.securityID as string, element); // I don't understand where the next lint error comes from... // eslint-disable-next-line @typescript-eslint/no-unsafe-return return this.processSecurityInfoUnderlying(element) - .then((underlying) => { + .then(async (underlying) => { const ibContract = ibContractFromElement(element); logger.log( LogLevel.Trace, @@ -193,7 +193,7 @@ export class ImporterBot extends ITradingBot { "contract", ibContract, ); - return this.findOrCreateContract(ibContract).then((contract) => { + return this.findOrCreateContract(ibContract).then(async (contract) => { if (contract.secType == SecType.STK) { const contract_data = { symbol: element.symbol, @@ -221,7 +221,7 @@ export class ImporterBot extends ITradingBot { return BondContract.findOrCreate({ where: { id: contract.id }, defaults: bond_data, - }).then(([bond, _created]) => { + }).then(async ([bond, _created]) => { // Don't update bond's country prop with 'XS' const bond_update = { ...bond_data, @@ -229,7 +229,7 @@ export class ImporterBot extends ITradingBot { ? undefined : (element.isin as string).substring(0, 2), }; - return bond.update(bond_update).then((_) => contract.update(contract_data)); + return bond.update(bond_update).then(async (_) => contract.update(contract_data)); // .then((contract) => { // console.log(element, contract_data, contract); // return contract; @@ -246,13 +246,13 @@ export class ImporterBot extends ITradingBot { }); } - private processAllSecuritiesInfo(element: any): Promise { + private async processAllSecuritiesInfo(element: any): Promise { logger.trace(MODULE + ".processAllSecuritiesInfo", undefined, element); if (element instanceof Array) { return element.reduce( - (p: Promise, element: any): Promise => - p.then(() => - this.processSecurityInfo(element).catch((error) => { + async (p: Promise, element: any): Promise => + p.then(async () => + this.processSecurityInfo(element).catch(async (error) => { logger.error(MODULE + ".processAllSecuritiesInfo", undefined, error, element); return Promise.resolve(undefined as undefined); }), @@ -266,9 +266,9 @@ export class ImporterBot extends ITradingBot { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processStockTrade(element: any): Promise { + protected async processStockTrade(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processStockTrade", element.symbol as string, element); - return this.findOrCreateContract(ibContractFromElement(element)).then((contract) => + return this.findOrCreateContract(ibContractFromElement(element)).then(async (contract) => Statement.findOrCreate({ where: { transactionId: element.transactionID }, defaults: { @@ -283,7 +283,7 @@ export class ImporterBot extends ITradingBot { stock_id: contract?.id, }, }) - .then(([statement, _created]) => + .then(async ([statement, _created]) => EquityStatement.findOrCreate({ where: { id: statement.id }, defaults: { @@ -366,9 +366,9 @@ export class ImporterBot extends ITradingBot { } */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processOptionTrade(element: any): Promise { + protected async processOptionTrade(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processOptionTrade", element.underlyingSymbol as string, element); - return this.processSecurityInfoUnderlying(element).then((underlying) => + return this.processSecurityInfoUnderlying(element).then(async (underlying) => Statement.findOrCreate({ where: { transactionId: element.transactionID }, defaults: { @@ -382,8 +382,8 @@ export class ImporterBot extends ITradingBot { fxRateToBase: element.fxRateToBase, stock_id: underlying?.id, }, - }).then(([statement, _created]) => - this.processSecurityInfo(element).then((contract) => + }).then(async ([statement, _created]) => + this.processSecurityInfo(element).then(async (contract) => OptionStatement.findOrCreate({ where: { id: statement.id }, defaults: { @@ -466,10 +466,10 @@ export class ImporterBot extends ITradingBot { } */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processBondTrade(element: any): Promise { + protected async processBondTrade(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processBondTrade", element.securityID as string, element); // this.printObject(element); - return this.findOrCreateContract(ibContractFromElement(element)).then((contract) => + return this.findOrCreateContract(ibContractFromElement(element)).then(async (contract) => Statement.findOrCreate({ where: { transactionId: element.transactionID }, defaults: { @@ -483,7 +483,7 @@ export class ImporterBot extends ITradingBot { fxRateToBase: element.fxRateToBase, stock_id: contract?.id, }, - }).then(([statement, _created]) => { + }).then(async ([statement, _created]) => { const defaults = { quantity: element.quantity, price: element.tradePrice, @@ -496,13 +496,13 @@ export class ImporterBot extends ITradingBot { return BondStatement.findOrCreate({ where: { id: statement.id }, defaults, - }).then(([bondstatement, _created]) => bondstatement.update(defaults)); + }).then(async ([bondstatement, _created]) => bondstatement.update(defaults)); }), ); } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processOneTrade(element: any): Promise { + protected async processOneTrade(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processOneTrade", element.securityID as string, element); switch (element.assetCategory) { case SecType.STK: @@ -521,13 +521,13 @@ export class ImporterBot extends ITradingBot { } } - private processAllTrades(element: any): Promise { + private async processAllTrades(element: any): Promise { logger.trace(MODULE + ".processAllTrades", undefined, element); if (element instanceof Array) { return element.reduce( - (p: Promise, element: any) => + async (p: Promise, element: any) => p - .then(() => this.processOneTrade(element)) + .then(async () => this.processOneTrade(element)) .catch((error) => logger.error(MODULE + ".processAllTrades", undefined, error, element)), Promise.resolve(), ); @@ -578,7 +578,7 @@ export class ImporterBot extends ITradingBot { } */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processCashTransaction(element: any): Promise { + protected async processCashTransaction(element: any): Promise { logger.log(LogLevel.Trace, MODULE + ".processCashTransaction", element.securityID as string, element); // if (element.assetCategory == "BOND") console.log("processCashTransaction", element); let statementType: StatementTypes; @@ -615,7 +615,7 @@ export class ImporterBot extends ITradingBot { throw Error("undefined cash trasaction type: " + element.type); } return (element.assetCategory ? this.findOrCreateContract(ibContractFromElement(element)) : Promise.resolve(null)) - .then((contract: Contract | null | undefined) => { + .then(async (contract: Contract | null | undefined) => { return Statement.findOrCreate({ where: { transactionId: element.transactionID }, defaults: { @@ -631,7 +631,7 @@ export class ImporterBot extends ITradingBot { }, }); }) - .then(([statement, _created]) => { + .then(async ([statement, _created]) => { switch (statementType) { case StatementTypes.TaxStatement: { @@ -676,10 +676,10 @@ export class ImporterBot extends ITradingBot { }); } - private processAllCashTransactions(element: any): Promise { + private async processAllCashTransactions(element: any): Promise { if (element instanceof Array) { return element.reduce( - (p: Promise, element: any) => p.then(() => this.processCashTransaction(element)), + async (p: Promise, element: any) => p.then(async () => this.processCashTransaction(element)), Promise.resolve(), ); } else if (element) { @@ -688,11 +688,11 @@ export class ImporterBot extends ITradingBot { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processCorporateAction(element: any): Promise { + protected async processCorporateAction(element: any): Promise { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument logger.log(LogLevel.Trace, MODULE + ".processCorporateAction", element.symbol, element); return (element.assetCategory ? this.findOrCreateContract(ibContractFromElement(element)) : Promise.resolve(null)) - .then((contract: Contract | null | undefined) => { + .then(async (contract: Contract | null | undefined) => { return Statement.findOrCreate({ where: { transactionId: element.transactionID }, defaults: { @@ -708,7 +708,7 @@ export class ImporterBot extends ITradingBot { }, }); }) - .then(([statement, _created]) => + .then(async ([statement, _created]) => CorporateStatement.findOrCreate({ where: { id: statement.id }, defaults: { id: statement.id, quantity: element.quantity, pnl: element.fifoPnlRealized }, @@ -716,11 +716,11 @@ export class ImporterBot extends ITradingBot { ); } - private processAllCorporateActions(element: any): Promise { + private async processAllCorporateActions(element: any): Promise { if (element.CorporateActions.CorporateAction instanceof Array) { // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call return element.CorporateActions.CorporateAction.reduce( - (p: Promise, element: any) => p.then(() => this.processCorporateAction(element)), + async (p: Promise, element: any) => p.then(async () => this.processCorporateAction(element)), Promise.resolve(), ); } else if (element.CorporateActions.CorporateAction) { @@ -730,7 +730,7 @@ export class ImporterBot extends ITradingBot { } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types - protected processReport(element: any): Promise { + protected async processReport(element: any): Promise { logger.log(LogLevel.Info, MODULE + ".processReport", undefined, element.AccountInformation); return Portfolio.findOrCreate({ where: { @@ -744,23 +744,23 @@ export class ImporterBot extends ITradingBot { country: (element.AccountInformation.ibEntity as string).substring(3), }, }) - .then(([_portfolio, _created]) => this.processAllSecuritiesInfo(element.SecuritiesInfo.SecurityInfo)) - .then(() => this.processAllTrades(element.Trades.Trade)) - .then(() => this.processAllCashTransactions(element.CashTransactions.CashTransaction)) - .then(() => this.processAllCorporateActions(element)) + .then(async ([_portfolio, _created]) => this.processAllSecuritiesInfo(element.SecuritiesInfo.SecurityInfo)) + .then(async () => this.processAllTrades(element.Trades.Trade)) + .then(async () => this.processAllCashTransactions(element.CashTransactions.CashTransaction)) + .then(async () => this.processAllCorporateActions(element)) .then(() => logger.log(LogLevel.Info, MODULE + ".processReport", undefined, "Report loaded")) - .then(() => Promise.resolve()) + .then(async () => Promise.resolve()) .catch((error) => logger.error(MODULE + ".processReport", undefined, "importer bot process report:", error)); } - protected fetchReport(url: string): Promise { + protected async fetchReport(url: string): Promise { const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: "", }); logger.info(MODULE + ".fetchReport", "Fetching report at " + url); return fetch(url) - .then((response) => response.text()) + .then(async (response) => response.text()) .then((XMLdata) => { const jObj = parser.parse(XMLdata); if (jObj["FlexQueryResponse"]) { @@ -768,8 +768,8 @@ export class ImporterBot extends ITradingBot { // disable the following eslint test because I was unable to fix it // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call return jObj["FlexQueryResponse"].FlexStatements.FlexStatement.reduce( - (p: Promise, element: any): Promise => - p.then((): Promise => this.processReport(element)), + async (p: Promise, element: any): Promise => + p.then(async (): Promise => this.processReport(element)), Promise.resolve(), ); } else { @@ -777,7 +777,7 @@ export class ImporterBot extends ITradingBot { } } else if (jObj["FlexStatementResponse"]?.Status == "Warn" && jObj["FlexStatementResponse"].ErrorCode == 1019) { // Retry - return awaitTimeout(1).then(() => this.fetchReport(url)); + return awaitTimeout(1).then(async () => this.fetchReport(url)); } else if (jObj["FlexStatementResponse"]?.ErrorMessage) { throw Error("Can t fetch data" + jObj["FlexStatementResponse"].ErrorMessage); } else { @@ -788,13 +788,13 @@ export class ImporterBot extends ITradingBot { .catch((error) => console.error("importer bot fetch report:", error)); } - protected process(): Promise { + protected async process(): Promise { return ( fetch( `https://gdcdyn.interactivebrokers.com/Universal/servlet/FlexStatementService.SendRequest?t=${this.token}&q=${this.query}&v=3`, ) - .then((response) => response.text()) - .then((XMLdata) => { + .then(async (response) => response.text()) + .then(async (XMLdata) => { const parser = new XMLParser(); const jObj = parser.parse(XMLdata); if (jObj["FlexStatementResponse"]?.Status == "Success") { @@ -815,11 +815,11 @@ export class ImporterBot extends ITradingBot { public start(): void { this.init() - .then(() => { + .then(async () => { setInterval((): void => { this.process().catch((error) => logger.error(MODULE + ".start", error)); }, 3600 * 1000); // On every hour - return awaitTimeout(3).then(() => this.process()); + return awaitTimeout(3).then(async () => this.process()); }) .catch((error) => console.error("start importer bot:", error)); } diff --git a/src/bots/index.ts b/src/bots/index.ts index cdcac5b..2399919 100644 --- a/src/bots/index.ts +++ b/src/bots/index.ts @@ -165,7 +165,7 @@ export class ITradingBot extends EventEmitter { return order; } - protected init(): Promise { + protected async init(): Promise { return Portfolio.findOne({ where: { account: this.accountNumber, @@ -178,7 +178,7 @@ export class ITradingBot extends EventEmitter { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { this.portfolio = portfolio; return Currency.findAll({ @@ -192,7 +192,7 @@ export class ITradingBot extends EventEmitter { }); } - protected getContractPosition(contract: Contract): Promise { + protected async getContractPosition(contract: Contract): Promise { if (this.portfolio !== null && contract !== null) { console.log("getContractPosition", contract.id); return Position.findOne({ @@ -210,9 +210,9 @@ export class ITradingBot extends EventEmitter { } } - protected getContractPositionValueInBase(contract: Contract): Promise { + protected async getContractPositionValueInBase(contract: Contract): Promise { // console.log("getContractPositionValueInBase", contract); - return this.getContractPosition(contract).then((position) => { + return this.getContractPosition(contract).then(async (position) => { return this.findOrCreateCurrency(contract.currency).then((currency) => { console.log("getContractPositionValueInBase", position, contract.livePrice, currency.rate); return (position * contract.livePrice) / currency.rate; @@ -228,7 +228,7 @@ export class ITradingBot extends EventEmitter { secId: SecType.CASH, currency: symbol, symbol: symbol + "." + this.portfolio.baseCurrency, - }).then((contract) => { + }).then(async (contract) => { return Currency.create({ base: this.portfolio.baseCurrency, currency: symbol, @@ -239,7 +239,7 @@ export class ITradingBot extends EventEmitter { return Promise.resolve(currency); } - protected getContractOrdersQuantity(benchmark: Contract, actionType?: OrderAction): Promise { + protected async getContractOrdersQuantity(benchmark: Contract, actionType?: OrderAction): Promise { const where: { portfolio_id: number; status: string[]; @@ -264,7 +264,7 @@ export class ITradingBot extends EventEmitter { } } - protected getContractOrderValueInBase(benchmark: Contract, actionType?: OrderAction): Promise { + protected async getContractOrderValueInBase(benchmark: Contract, actionType?: OrderAction): Promise { if (this.portfolio !== null && benchmark !== null) { const where: { portfolio_id: number; @@ -283,7 +283,7 @@ export class ITradingBot extends EventEmitter { id: benchmark.id, }, }, - }).then((orders: OpenOrder[]) => + }).then(async (orders: OpenOrder[]) => Currency.findOne({ where: { base: this.portfolio.baseCurrency, @@ -341,7 +341,7 @@ export class ITradingBot extends EventEmitter { return result; } - protected getOptionsPositionsSynthesisInBase( + protected async getOptionsPositionsSynthesisInBase( underlying?: number, right?: OptionType, short?: boolean, @@ -361,7 +361,7 @@ export class ITradingBot extends EventEmitter { secType: IbSecType.OPT, }, }, - }).then((positions: Position[]) => this.sumOptionsPositionsSynthesisInBase(positions, underlying, right)); + }).then(async (positions: Position[]) => this.sumOptionsPositionsSynthesisInBase(positions, underlying, right)); } else { return Promise.resolve({ engaged: 0, @@ -373,29 +373,29 @@ export class ITradingBot extends EventEmitter { } } - protected getOptionsPositionsQuantity(underlying: Contract, right: OptionType): Promise { + protected async getOptionsPositionsQuantity(underlying: Contract, right: OptionType): Promise { return this.getOptionsPositionsSynthesisInBase(underlying.id, right).then((r) => r.quantity); } - protected getOptionPositionsValueInBase( + protected async getOptionPositionsValueInBase( underlying: number | undefined, right: OptionType | undefined, ): Promise { return this.getOptionsPositionsSynthesisInBase(underlying, right).then((r) => r.value); } - protected getOptionsPositionsEngagedInBase(underlying: number, right: OptionType): Promise { + protected async getOptionsPositionsEngagedInBase(underlying: number, right: OptionType): Promise { return this.getOptionsPositionsSynthesisInBase(underlying, right).then((r) => r.engaged); } - protected getOptionsPositionsRiskInBase( + protected async getOptionsPositionsRiskInBase( underlying: number | undefined, right: OptionType | undefined, ): Promise { return this.getOptionsPositionsSynthesisInBase(underlying, right).then((r) => r.risk); } - protected getOptionShortPositionsValueInBase(underlying: number, right: OptionType): Promise { + protected async getOptionShortPositionsValueInBase(underlying: number, right: OptionType): Promise { return this.getOptionsPositionsSynthesisInBase(underlying, right, true).then((r) => r.quantity); } @@ -414,7 +414,7 @@ export class ITradingBot extends EventEmitter { await OptionContract.findOne({ where: where, include: { as: "contract", model: Contract, required: true }, - }).then((opt) => + }).then(async (opt) => Currency.findOne({ where: { base: this.portfolio.baseCurrency, @@ -447,7 +447,7 @@ export class ITradingBot extends EventEmitter { return result; } - protected getOptionsOrdersSynthesisInBase( + protected async getOptionsOrdersSynthesisInBase( underlying: number, right?: OptionType, actionType?: OrderAction, @@ -470,7 +470,7 @@ export class ITradingBot extends EventEmitter { secType: IbSecType.OPT, }, }, - }).then((orders: OpenOrder[]) => this.sumOptionsOrdersInBase(orders, underlying, right)); + }).then(async (orders: OpenOrder[]) => this.sumOptionsOrdersInBase(orders, underlying, right)); } else { return Promise.resolve({ engaged: 0, @@ -482,7 +482,7 @@ export class ITradingBot extends EventEmitter { } } - protected getOptionsOrdersValueInBase( + protected async getOptionsOrdersValueInBase( underlying: number, right: OptionType, actionType?: OrderAction, @@ -490,7 +490,7 @@ export class ITradingBot extends EventEmitter { return this.getOptionsOrdersSynthesisInBase(underlying, right, actionType).then((r) => r.value); } - protected getOptionsOrdersEngagedInBase( + protected async getOptionsOrdersEngagedInBase( underlying: number, right: OptionType, actionType?: OrderAction, @@ -498,7 +498,7 @@ export class ITradingBot extends EventEmitter { return this.getOptionsOrdersSynthesisInBase(underlying, right, actionType).then((r) => r.engaged); } - protected getOptionsOrdersRiskInBase( + protected async getOptionsOrdersRiskInBase( underlying: number, right?: OptionType, actionType?: OrderAction, @@ -506,7 +506,7 @@ export class ITradingBot extends EventEmitter { return this.getOptionsOrdersSynthesisInBase(underlying, right, actionType).then((r) => r.risk); } - protected getOptionsOrdersQuantity( + protected async getOptionsOrdersQuantity( underlying: Contract, right: OptionType, actionType: OrderAction, @@ -514,7 +514,7 @@ export class ITradingBot extends EventEmitter { return this.getOptionsOrdersSynthesisInBase(underlying.id, right, actionType).then((r) => r.quantity); } - protected getBalanceInBase(currency: string): Promise { + protected async getBalanceInBase(currency: string): Promise { return Balance.findOne({ where: { portfolio_id: this.portfolio.id, @@ -526,7 +526,7 @@ export class ITradingBot extends EventEmitter { }); } - protected getTotalBalanceInBase(): Promise { + protected async getTotalBalanceInBase(): Promise { return Balance.findAll({ where: { portfolio_id: this.portfolio.id } }).then((balances) => { return balances.reduce( (p, b) => { @@ -556,7 +556,7 @@ export class ITradingBot extends EventEmitter { ); } - protected createStockContract( + protected async createStockContract( ibContract: IbContract, details: ContractDetails, transaction?: Transaction, @@ -583,7 +583,7 @@ export class ITradingBot extends EventEmitter { }, defaults: contract_defaults, transaction: transaction, - }).then(([contract, created]) => { + }).then(async ([contract, created]) => { const stock_defaults = { id: contract.id, industry: details.industry as string, @@ -596,18 +596,18 @@ export class ITradingBot extends EventEmitter { defaults: stock_defaults, transaction: transaction, }) - .then(([stock, created]) => { + .then(async ([stock, created]) => { if (created) return stock; else return stock.update(stock_defaults, { transaction: transaction }); }) - .then((_stock) => { + .then(async (_stock) => { if (created) return contract; else return contract.update(contract_defaults, { transaction: transaction }); }); }); } - protected createIndexContract( + protected async createIndexContract( ibContract: IbContract, details: ContractDetails, transaction?: Transaction, @@ -629,16 +629,18 @@ export class ITradingBot extends EventEmitter { defaults: defaults, transaction: transaction, // logging: console.log, - }).then(([contract, created]) => { + }).then(async ([contract, created]) => { if (created) { - return Index.create({ id: contract.id }, { transaction: transaction }).then(() => Promise.resolve(contract)); + return Index.create({ id: contract.id }, { transaction: transaction }).then(async () => + Promise.resolve(contract), + ); } else { return contract.update(defaults, { transaction: transaction }); } }); } - protected createCashContract( + protected async createCashContract( ibContract: IbContract, _details: ContractDetails, transaction?: Transaction, @@ -660,18 +662,18 @@ export class ITradingBot extends EventEmitter { defaults: defaults, transaction: transaction, // logging: console.log, - }).then(([contract, created]) => { + }).then(async ([contract, created]) => { if (created) { - return CashContract.create({ id: contract.id }, { transaction: transaction }).then(() => + return CashContract.create({ id: contract.id }, { transaction: transaction }).then(async () => Promise.resolve(contract), ); } else { - return contract.update(defaults, { transaction: transaction }).then(() => Promise.resolve(contract)); + return contract.update(defaults, { transaction: transaction }).then(async () => Promise.resolve(contract)); } }); } - protected createBagContract( + protected async createBagContract( ibContract: IbContract, _details: undefined, transaction?: Transaction, @@ -693,22 +695,24 @@ export class ITradingBot extends EventEmitter { defaults: defaults, transaction: transaction, // logging: console.log, - }).then(([contract, created]) => { + }).then(async ([contract, created]) => { if (created) { - return BagContract.create({ id: contract.id }, { transaction: transaction }).then(() => + return BagContract.create({ id: contract.id }, { transaction: transaction }).then(async () => ibContract.comboLegs!.reduce( - (p, leg) => - p.then((contract) => this.findOrCreateContract({ conId: leg.conId }, transaction).then(() => contract)), + async (p, leg) => + p.then(async (contract) => + this.findOrCreateContract({ conId: leg.conId }, transaction).then(() => contract), + ), Promise.resolve(contract), ), ); } else { - return contract.update(defaults, { transaction: transaction }).then(() => Promise.resolve(contract)); + return contract.update(defaults, { transaction: transaction }).then(async () => Promise.resolve(contract)); } }); } - protected createFutureContract( + protected async createFutureContract( ibContract: IbContract, details: ContractDetails, transaction?: Transaction, @@ -736,7 +740,7 @@ export class ITradingBot extends EventEmitter { symbol: details.underSymbol, currency: ibContract.currency, }; - return this.findOrCreateContract(underlying, transaction).then((future) => { + return this.findOrCreateContract(underlying, transaction).then(async (future) => { future_values.underlying_id = future.id; return FutureContract.findOne({ where: { @@ -744,29 +748,31 @@ export class ITradingBot extends EventEmitter { lastTradeDate: future_values.lastTradeDate, }, transaction: transaction, - }).then((option) => { + }).then(async (option) => { if (option) { // update future_values.id = option.id; return Contract.update(contract_values, { where: { id: option.id }, transaction: transaction }) - .then(() => FutureContract.update(future_values, { where: { id: option.id }, transaction: transaction })) - .then(() => Contract.findByPk(option.id, { transaction: transaction })) + .then(async () => + FutureContract.update(future_values, { where: { id: option.id }, transaction: transaction }), + ) + .then(async () => Contract.findByPk(option.id, { transaction: transaction })) .then((contract) => contract!); } else { return Contract.create(contract_values, { transaction: transaction /* logging: console.log, */, - }).then((contract) => { + }).then(async (contract) => { future_values.id = contract.id; return FutureContract.create(future_values, { transaction: transaction /* logging: false, */, - }).then(() => Promise.resolve(contract)); + }).then(async () => Promise.resolve(contract)); }); } }); }); } - protected createBondContract( + protected async createBondContract( ibContract: IbContract, _details: ContractDetails, transaction?: Transaction, @@ -791,16 +797,16 @@ export class ITradingBot extends EventEmitter { }; return Contract.create(contract_values, { transaction: transaction /* logging: console.log, */, - }).then((contract) => { + }).then(async (contract) => { extended_values.id = contract.id; // console.log(contract_values, extended_values); return BondContract.create(extended_values, { transaction: transaction /* logging: false, */, - }).then(() => Promise.resolve(contract)); + }).then(async () => Promise.resolve(contract)); }); } - protected createOptionContract( + protected async createOptionContract( ibContract: IbContract, details: ContractDetails, transaction?: Transaction, @@ -832,7 +838,7 @@ export class ITradingBot extends EventEmitter { symbol: details.underSymbol, currency: ibContract.currency, }; - return this.findOrCreateContract(underlying, transaction).then((stock) => { + return this.findOrCreateContract(underlying, transaction).then(async (stock) => { opt_values.stock_id = stock.id; return OptionContract.findOne({ where: { @@ -842,22 +848,22 @@ export class ITradingBot extends EventEmitter { callOrPut: opt_values.callOrPut, }, transaction: transaction, - }).then((option) => { + }).then(async (option) => { if (option) { // update opt_values.id = option.id; return Contract.update(contract_values, { where: { id: option.id }, transaction: transaction }) - .then(() => OptionContract.update(opt_values, { where: { id: option.id }, transaction: transaction })) - .then(() => Contract.findByPk(option.id, { transaction: transaction })) + .then(async () => OptionContract.update(opt_values, { where: { id: option.id }, transaction: transaction })) + .then(async () => Contract.findByPk(option.id, { transaction: transaction })) .then((contract) => contract!); } else { return Contract.create(contract_values, { transaction: transaction /* logging: console.log, */, - }).then((contract) => { + }).then(async (contract) => { opt_values.id = contract.id; return OptionContract.create(opt_values, { transaction: transaction /* logging: false, */, - }).then(() => Promise.resolve(contract)); + }).then(async () => Promise.resolve(contract)); }); } }); @@ -994,5 +1000,5 @@ export { RollOptionPositionsBot } from "./roll.bot"; export { ContractsUpdaterBot } from "./updater.bot"; export { YahooUpdateBot } from "./yahoo.bot"; -export const awaitTimeout = (delay: number): Promise => +export const awaitTimeout = async (delay: number): Promise => new Promise((resolve): NodeJS.Timeout => setTimeout(resolve, delay * 1000)); diff --git a/src/bots/options.bot.ts b/src/bots/options.bot.ts index 278f988..302cba6 100644 --- a/src/bots/options.bot.ts +++ b/src/bots/options.bot.ts @@ -44,7 +44,7 @@ export class OptionsCreateBot extends ITradingBot { .catch(() => { /* silently ignore any error */ }) - .then(() => + .then(async () => this.findOrCreateContract({ ...ibContract, ...{ right: OptionType.Call }, @@ -70,7 +70,10 @@ export class OptionsCreateBot extends ITradingBot { // return Promise.resolve(); } - private iterateSecDefOptParams(stock: Contract, details: SecurityDefinitionOptionParameterType[]): Promise { + private async iterateSecDefOptParams( + stock: Contract, + details: SecurityDefinitionOptionParameterType[], + ): Promise { // console.log(`iterateSecDefOptParams: ${stock.symbol} ${details.length} details`) // use details associated to SMART exchange or first one if SMART not present let idx = 0; @@ -85,7 +88,7 @@ export class OptionsCreateBot extends ITradingBot { return this.iterateSecDefOptParamsForExpStrikes(stock, details[idx].expirations, details[idx].strikes); } - private requestSecDefOptParams(stock: Contract): Promise { + private async requestSecDefOptParams(stock: Contract): Promise { console.log(`requestSecDefOptParams: ${stock.symbol} ${stock.conId}`); return this.api .getSecDefOptParams( @@ -100,17 +103,17 @@ export class OptionsCreateBot extends ITradingBot { }); } - private iterateToBuildOptionList(contracts: Contract[]): Promise { + private async iterateToBuildOptionList(contracts: Contract[]): Promise { console.log(`iterateToBuildOptionList ${contracts.length} items`); - return contracts.reduce((p, stock) => { - return p.then(() => { + return contracts.reduce(async (p, stock) => { + return p.then(async () => { console.log( `iterateToBuildOptionList ${stock.symbol} ${stock["options_age"] * 24} vs ${OPTIONS_LIST_BUILD_FREQ}`, ); if (stock["options_age"] * 24 > OPTIONS_LIST_BUILD_FREQ) { console.log("iterateToBuildOptionList: option contracts list need refreshing"); - return this.findOrCreateContract(stock as IbContract).then((contract) => - this.requestSecDefOptParams(contract).then((params) => this.iterateSecDefOptParams(contract, params)), + return this.findOrCreateContract(stock as IbContract).then(async (contract) => + this.requestSecDefOptParams(contract).then(async (params) => this.iterateSecDefOptParams(contract, params)), ); } return Promise.resolve(); @@ -118,7 +121,7 @@ export class OptionsCreateBot extends ITradingBot { }, Promise.resolve()); // initial } - private findStocksToListOptions(): Promise { + private async findStocksToListOptions(): Promise { return this.app.sequelize.query( ` SELECT @@ -144,7 +147,7 @@ export class OptionsCreateBot extends ITradingBot { private buildOptionsList(): void { console.log("buildOptionsList"); this.findStocksToListOptions() - .then((stocks) => this.iterateToBuildOptionList(stocks)) + .then(async (stocks) => this.iterateToBuildOptionList(stocks)) .then(() => setTimeout(() => this.emit("buildOptionsList"), 4 * 3600 * 1000)) .catch((error) => console.log("option bot:", error)); } diff --git a/src/bots/roll.bot.ts b/src/bots/roll.bot.ts index edd03c3..266aee9 100644 --- a/src/bots/roll.bot.ts +++ b/src/bots/roll.bot.ts @@ -219,13 +219,13 @@ export class RollOptionPositionsBot extends ITradingBot { } } - private iteratePositions(positions: Position[]): Promise { - return positions.reduce((p, position) => { - return p.then(() => this.processOnePosition(position)); + private async iteratePositions(positions: Position[]): Promise { + return positions.reduce(async (p, position) => { + return p.then(async () => this.processOnePosition(position)); }, Promise.resolve()); // initial } - private listItmOptionPostitions(): Promise { + private async listItmOptionPostitions(): Promise { return Position.findAll({ include: Contract }).then(async (positions) => { const result: Position[] = []; for (const position of positions) { @@ -254,7 +254,7 @@ export class RollOptionPositionsBot extends ITradingBot { public process(): void { console.log("RollOptionPositionsBot process begin"); this.listItmOptionPostitions() - .then((result) => this.iteratePositions(result)) + .then(async (result) => this.iteratePositions(result)) .then(() => setTimeout(() => this.emit("process"), ROLL_FREQ * 60000)) .catch((error) => console.error("roll bot:", error)); } diff --git a/src/bots/updater.bot.ts b/src/bots/updater.bot.ts index fbe5b30..e08c3c4 100644 --- a/src/bots/updater.bot.ts +++ b/src/bots/updater.bot.ts @@ -54,7 +54,7 @@ export class ContractsUpdaterBot extends ITradingBot { // setTimeout(() => this.emit("buildOptionsList"), 3600 * 1000); // start after 1 hour } - private updateHistoricalVolatility(id: number, bars: Bar[]): Promise { + private async updateHistoricalVolatility(id: number, bars: Bar[]): Promise { const histVol: number = bars[bars.length - 1].close!; // console.log(`updateHistoricalVolatility got ${histVol} for contract id ${id}`) return StockContract.update( @@ -69,7 +69,7 @@ export class ContractsUpdaterBot extends ITradingBot { ).then(); } - private requestHistoricalVolatility(contract: Contract): Promise { + private async requestHistoricalVolatility(contract: Contract): Promise { // console.log(`requestHistoricalVolatility for contract ${contract.symbol}`) return this.api .getHistoricalData( @@ -93,11 +93,11 @@ export class ContractsUpdaterBot extends ITradingBot { }); } - private iterateContractsForHistoricalVolatility(contracts: Contract[]): Promise { - return contracts.reduce((p, contract) => { - return p.then(() => + private async iterateContractsForHistoricalVolatility(contracts: Contract[]): Promise { + return contracts.reduce(async (p, contract) => { + return p.then(async () => this.requestHistoricalVolatility(contract) - .then((bars) => this.updateHistoricalVolatility(contract.id, bars)) + .then(async (bars) => this.updateHistoricalVolatility(contract.id, bars)) .catch(() => { // this.app.error(`getHistoricalData failed with '${err.error.message}'`); }), @@ -105,7 +105,7 @@ export class ContractsUpdaterBot extends ITradingBot { }, Promise.resolve()); // initial } - private findStocksNeedingHistoricalData(): Promise { + private async findStocksNeedingHistoricalData(): Promise { // stock.historical_volatility is not needed below be we like to eventually display it in debug logs return this.app.sequelize.query( ` @@ -130,16 +130,19 @@ export class ContractsUpdaterBot extends ITradingBot { private updateHistoricalData(): void { console.log("updateHistoricalData"); this.findStocksNeedingHistoricalData() - .then((contracts) => this.iterateContractsForHistoricalVolatility(contracts)) + .then(async (contracts) => this.iterateContractsForHistoricalVolatility(contracts)) .then(() => setTimeout(() => this.emit("updateHistoricalData"), HISTORICAL_DATA_REFRESH_FREQ * 60000)) .catch((error) => console.error("updater bot update historical data:", error)); } - private requestContractPrice(ibContract: IbContract): Promise { + private async requestContractPrice(ibContract: IbContract): Promise { return this.api.getMarketDataSnapshot(ibContract, "", false); } - private updateContratPrice(contract: Contract, marketData: MutableMarketData): Promise { + private async updateContratPrice( + contract: Contract, + marketData: MutableMarketData, + ): Promise { // Clear values, we can't keep old invalid values const dataset: { bid: number | null; @@ -300,7 +303,7 @@ export class ContractsUpdaterBot extends ITradingBot { where: { id: contract.id, }, - }).then(() => { + }).then(async () => { if (contract.secType == "OPT") { return OptionContract.update(optdataset, { where: { id: contract.id } }).then(() => price); } else if (contract.secType == "CASH") { @@ -320,7 +323,7 @@ export class ContractsUpdaterBot extends ITradingBot { }); } - private findStockContractsToUpdatePrice(limit: number): Promise { + private async findStockContractsToUpdatePrice(limit: number): Promise { const now: number = Date.now() - STOCKS_PRICES_REFRESH_FREQ * 60 * 1000; return Contract.findAll({ where: { @@ -339,7 +342,7 @@ export class ContractsUpdaterBot extends ITradingBot { }); } - private findPortfolioContractsNeedingPriceUpdate(limit: number): Promise { + private async findPortfolioContractsNeedingPriceUpdate(limit: number): Promise { // console.log("findOptionsToUpdatePrice", dte, age/1400, limit); const now: number = Date.now() - STOCKS_PRICES_REFRESH_FREQ * 60 * 1000; return Position.findAll({ @@ -365,9 +368,9 @@ export class ContractsUpdaterBot extends ITradingBot { order: [["contract", "updatedAt", "ASC"]], limit: limit, // logging: console.log, - }).then((positions: Position[]) => + }).then(async (positions: Position[]) => Promise.all( - positions.map((position: Position) => { + positions.map(async (position: Position) => { // console.log("position", position); if (position.contract.secType == SecType.STK) { return StockContract.findByPk(position.contract.id, { @@ -445,7 +448,10 @@ export class ContractsUpdaterBot extends ITradingBot { return Promise.resolve(); } - private iterateSecDefOptParams(stock: Contract, details: SecurityDefinitionOptionParameterType[]): Promise { + private async iterateSecDefOptParams( + stock: Contract, + details: SecurityDefinitionOptionParameterType[], + ): Promise { // console.log(`iterateSecDefOptParams: ${stock.symbol} ${details.length} details`) // use details associated to SMART exchange or first one if SMART not present let idx = 0; @@ -458,7 +464,7 @@ export class ContractsUpdaterBot extends ITradingBot { return this.iterateSecDefOptParamsForExpStrikes(stock, details[idx].expirations, details[idx].strikes); } - private requestSecDefOptParams(stock: Contract): Promise { + private async requestSecDefOptParams(stock: Contract): Promise { console.log(`requestSecDefOptParams: ${stock.symbol}`); return this.api .getSecDefOptParams( @@ -473,23 +479,23 @@ export class ContractsUpdaterBot extends ITradingBot { }); } - private iterateToBuildOptionList(contracts: Contract[]): Promise { + private async iterateToBuildOptionList(contracts: Contract[]): Promise { console.log(`iterateToBuildOptionList ${contracts.length} items`); - return contracts.reduce((p, stock) => { - return p.then(() => { + return contracts.reduce(async (p, stock) => { + return p.then(async () => { console.log( `iterateToBuildOptionList ${stock.symbol} ${stock["options_age"] * 24} vs ${OPTIONS_LIST_BUILD_FREQ}`, ); if (stock["options_age"] * 24 > OPTIONS_LIST_BUILD_FREQ) { console.log("iterateToBuildOptionList: option contracts list need refreshing"); - return this.requestSecDefOptParams(stock).then((params) => this.iterateSecDefOptParams(stock, params)); + return this.requestSecDefOptParams(stock).then(async (params) => this.iterateSecDefOptParams(stock, params)); } return Promise.resolve(); }); }, Promise.resolve()); // initial } - private findStocksToListOptions(): Promise { + private async findStocksToListOptions(): Promise { return this.app.sequelize.query( ` SELECT @@ -514,12 +520,12 @@ export class ContractsUpdaterBot extends ITradingBot { private buildOptionsList(): void { console.log("buildOptionsList"); this.findStocksToListOptions() - .then((stocks) => this.iterateToBuildOptionList(stocks)) + .then(async (stocks) => this.iterateToBuildOptionList(stocks)) .then(() => setTimeout(() => this.emit("buildOptionsList"), 3600 * 1000)) .catch((error) => console.error("updater bot build options list:", error)); } - private findOptionsToUpdatePrice(dte: number, age: number, limit: number): Promise { + private async findOptionsToUpdatePrice(dte: number, age: number, limit: number): Promise { // console.log("findOptionsToUpdatePrice", dte, age/1400, limit); const now: number = Date.now(); return OptionContract.findAll({ @@ -577,7 +583,7 @@ export class ContractsUpdaterBot extends ITradingBot { return contract; } - private fetchContractsPrices(contracts: AnyContract[]): Promise { + private async fetchContractsPrices(contracts: AnyContract[]): Promise { // fetch all contracts in parallel const promises: Promise[] = []; for (const aContract of contracts) { @@ -602,13 +608,13 @@ export class ContractsUpdaterBot extends ITradingBot { // mark contract as updated contract.changed("price", true); promises.push( - contract.save().then((contract) => + contract.save().then(async (contract) => this.requestContractPrice(ibContract) - .then((marketData) => this.updateContratPrice(contract, marketData)) + .then(async (marketData) => this.updateContratPrice(contract, marketData)) .then((_price) => { /* void */ }) - .catch((err: { code: number; error: { message: string } }) => { + .catch(async (err: { code: number; error: { message: string } }) => { // err.code == 200 || // 'No security definition has been found for the request' // err.code == 354 || // 'Requested market data is not subscribed.Delayed market data is not available.WBD NASDAQ.NMS/TOP/ALL' // err.code == 10090 || // 'Part of requested market data is not subscribed. Subscription-independent ticks are still active.Delayed market data is not available.XLV ARCA/TOP/ALL' @@ -628,10 +634,10 @@ export class ContractsUpdaterBot extends ITradingBot { ), ); } - return Promise.all(promises).then(() => this.yahooBot?.processQ()); + return Promise.all(promises).then(async () => this.yahooBot?.processQ()); } - private findCashContractsToUpdatePrice(limit: number): Promise { + private async findCashContractsToUpdatePrice(limit: number): Promise { const now: number = Date.now() - FX_RATES_REFRESH_FREQ * 60 * 1000; return Contract.findAll({ where: { @@ -646,9 +652,9 @@ export class ContractsUpdaterBot extends ITradingBot { private createCashContracts(): void { Currency.findAll() - .then((currencies) => - currencies.reduce((p, currency) => { - return p.then(() => { + .then(async (currencies) => + currencies.reduce(async (p, currency) => { + return p.then(async () => { const ibContract: IbContract = { symbol: currency.base, localSymbol: `${currency.base}.${currency.currency}`, @@ -661,7 +667,7 @@ export class ContractsUpdaterBot extends ITradingBot { .catch((error: Error) => { throw Error(`createCashContracts failed for ${ibContract.localSymbol}: '${error.message}'`); }) - .then(() => Promise.resolve()); + .then(async () => Promise.resolve()); }); }, Promise.resolve()), ) diff --git a/src/bots/yahoo.bot.ts b/src/bots/yahoo.bot.ts index 4443d79..59d03f7 100644 --- a/src/bots/yahoo.bot.ts +++ b/src/bots/yahoo.bot.ts @@ -133,7 +133,7 @@ export class YahooUpdateBot extends ITradingBot { return name; } - private iterateResults(q: MappedQuote[]): Promise { + private async iterateResults(q: MappedQuote[]): Promise { const promises: Promise[] = []; for (const r of q) { if (r.quote !== undefined) { @@ -170,7 +170,7 @@ export class YahooUpdateBot extends ITradingBot { OptionContract.findByPk(r.contract.id, { include: { as: "stock", model: Contract, required: true }, }) - .then((option) => + .then(async (option) => Contract.findByPk(option.stock.id, {}).then(async (stock) => { let iv_: number | undefined = undefined; if (r.quote?.regularMarketPrice > 0) { @@ -272,7 +272,7 @@ export class YahooUpdateBot extends ITradingBot { return q; } - private findCurrencies(limit: number): Promise { + private async findCurrencies(limit: number): Promise { const now: number = Date.now(); return Contract.findAll({ where: { @@ -296,7 +296,7 @@ export class YahooUpdateBot extends ITradingBot { }); } - private findStocks(limit: number): Promise { + private async findStocks(limit: number): Promise { const now: number = Date.now(); return StockContract.findAll({ include: { @@ -330,7 +330,7 @@ export class YahooUpdateBot extends ITradingBot { }); } - private findOptions(limit: number): Promise { + private async findOptions(limit: number): Promise { const now: number = Date.now(); return OptionContract.findAll({ where: { @@ -382,12 +382,12 @@ export class YahooUpdateBot extends ITradingBot { }); } - public processQ(): Promise { + public async processQ(): Promise { if (Date.now() - this.lastFetch < YAHOO_PRICE_FREQ * 1000) return Promise.resolve(); console.log("YahooUpdateBot processQ begin"); const contracts: MappedQuote[] = this.requestsQ.splice(0, BATCH_SIZE_YAHOO_PRICE); return this.fetchQuotes(contracts) - .then((q) => this.iterateResults(q)) + .then(async (q) => this.iterateResults(q)) .then(() => console.log("YahooUpdateBot processQ end")); } @@ -412,7 +412,7 @@ export class YahooUpdateBot extends ITradingBot { console.log(c.length, "option contract(s)"); contracts = contracts.concat(c); } - await this.fetchQuotes(contracts).then((q) => this.iterateResults(q)); + await this.fetchQuotes(contracts).then(async (q) => this.iterateResults(q)); } setTimeout(() => this.emit("process"), (YAHOO_PRICE_FREQ * 1000) / 2); console.log("YahooUpdateBot process end"); diff --git a/src/index.ts b/src/index.ts index 007e83e..55db431 100644 --- a/src/index.ts +++ b/src/index.ts @@ -124,7 +124,7 @@ export class MyTradingBotApp extends IBApiNextApp { this.sequelize = new Sequelize(sequelize_settings); this.sequelize .authenticate() - .then(() => this.sequelize.sync()) + .then(async () => this.sequelize.sync()) .then(() => { let accountId: string; if (this.cmdLineArgs.accountId) accountId = this.cmdLineArgs.accountId as string; diff --git a/src/routers/balances.router.ts b/src/routers/balances.router.ts index fcf9ee6..c96c09b 100644 --- a/src/routers/balances.router.ts +++ b/src/routers/balances.router.ts @@ -43,7 +43,7 @@ router.delete("/id/:balanceId(\\d+)/DeleteBalance", (req, res): void => { const { balanceId } = req.params as typeof req.params & parentParams; Balance.findByPk(balanceId) - .then((balance) => { + .then(async (balance) => { if (balance) return balance.destroy(); else throw Error("balance entry not found"); }) @@ -95,7 +95,7 @@ router.post("/id/:balanceId(\\d+)/SaveBalance", (req, res): void => { const data = req.body as BalanceEntry; Balance.findByPk(balanceId) - .then((balance) => { + .then(async (balance) => { // console.log(JSON.stringify(position)); if (balance) return balance.update({ diff --git a/src/routers/contracts.router.ts b/src/routers/contracts.router.ts index efb40f3..c27b94e 100644 --- a/src/routers/contracts.router.ts +++ b/src/routers/contracts.router.ts @@ -17,7 +17,7 @@ const router = express.Router({ mergeParams: true }); type parentParams = { portfolioId: number }; -const getAllPositionsRelatedToContract = ( +const getAllPositionsRelatedToContract = async ( portfolioId: number, contractId: number, ): Promise<(PositionEntry | OptionPositionEntry)[]> => { @@ -26,7 +26,7 @@ const getAllPositionsRelatedToContract = ( { model: Position, as: "positions", include: [{ model: Contract, as: "contract" }] }, { model: Currency, as: "baseRates" }, ], - }).then((portfolio) => { + }).then(async (portfolio) => { if (!portfolio) throw Error("portfolio not found: " + portfolioId); else if (portfolio.positions) return preparePositions(portfolio).then((positions) => @@ -73,25 +73,25 @@ router.get("/id/:contractId(\\d+)", (req, res): void => { fiftyTwoWeekHigh: contract.fiftyTwoWeekHigh, } as ContractEntry; }) - .then((contract) => { + .then(async (contract) => { // Add positions return getAllPositionsRelatedToContract(portfolioId, parseInt(contractId)).then((positions) => { contract.positions = positions; return contract; }); }) - .then((contract) => { + .then(async (contract) => { // Add trades return Trade.findAll({ where: { portfolio_id: portfolioId, symbol_id: contractId }, include: [{ model: Contract, as: "underlying" }], }) - .then((trades) => { + .then(async (trades) => { logger.log(LogLevel.Trace, MODULE + ".GetContract", undefined, "trades", trades); return trades.reduce( - (p: Promise, item: Trade): Promise => { + async (p: Promise, item: Trade): Promise => { logger.log(LogLevel.Trace, MODULE + ".GetContract", undefined, "item", item); - return p.then((entries) => { + return p.then(async (entries) => { return tradeModelToTradeEntry(item).then((entry) => { entries.push(entry); return entries; @@ -106,16 +106,16 @@ router.get("/id/:contractId(\\d+)", (req, res): void => { return contract; }); }) - .then((contract) => { + .then(async (contract) => { // Add statements return Statement.findAll({ where: { portfolio_id: portfolioId, stock_id: contractId }, include: [{ model: Contract, as: "stock" }], }) - .then((statements) => { + .then(async (statements) => { return statements.reduce( - (p, statement) => { - return p.then((entries) => { + async (p, statement) => { + return p.then(async (entries) => { return statementModelToStatementEntry(statement).then((entry) => { entries.push(entry); return entries; diff --git a/src/routers/positions.router.ts b/src/routers/positions.router.ts index 5e4b98c..02979ff 100644 --- a/src/routers/positions.router.ts +++ b/src/routers/positions.router.ts @@ -27,11 +27,11 @@ const getPrice = (item: Contract): number | null => { return item.ask && item.bid ? (item.ask + item.bid) / 2 : item.price ? item.price : item.previousClosePrice; }; -export const preparePositions = (portfolio: Portfolio): Promise<(PositionEntry | OptionPositionEntry)[]> => { +export const preparePositions = async (portfolio: Portfolio): Promise<(PositionEntry | OptionPositionEntry)[]> => { // logger.trace(MODULE + ".preparePositions", portfolio); return portfolio.positions.reduce( - (p, item: Position) => { - return p.then((positions) => { + async (p, item: Position) => { + return p.then(async (positions) => { switch (item.contract?.secType) { case SecType.STK: { const price = getPrice(item.contract); @@ -229,7 +229,7 @@ router.get("/index", (req, res): void => { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { return preparePositions(portfolio); } else throw Error("Portfolio not found"); @@ -251,7 +251,7 @@ router.post("/id/:positionId(\\d+)/SavePosition", (req, res): void => { // console.log("SavePosition", portfolioId, positionId, data, req.body); Position.findByPk(positionId) - .then((position) => { + .then(async (position) => { // console.log(JSON.stringify(position)); if (position) return position.update({ @@ -277,7 +277,7 @@ router.get("/id/:positionId(\\d+)/DeletePosition", (req, res): void => { const { positionId } = req.params as typeof req.params & parentParams; Position.findByPk(positionId) - .then((position) => { + .then(async (position) => { if (position) return position.destroy(); else throw Error("position not found"); }) @@ -302,7 +302,7 @@ router.get("/id/:positionId(\\d+)", (req, res): void => { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { return preparePositions(portfolio); } else throw Error("Portfolio not found"); @@ -329,7 +329,7 @@ router.get("/:positionId(\\d+)/GuessTrade", (req, res): void => { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { const position = portfolio.positions[0]; switch (position.contract.secType) { @@ -341,7 +341,7 @@ router.get("/:positionId(\\d+)/GuessTrade", (req, res): void => { stock_id: position.contract.id, }, order: [["date", "DESC"]], - }).then((ref) => position.update({ trade_unit_id: ref?.trade_unit_id })); + }).then(async (ref) => position.update({ trade_unit_id: ref?.trade_unit_id })); case ContractType.Option: case ContractType.FutureOption: @@ -353,11 +353,11 @@ router.get("/:positionId(\\d+)/GuessTrade", (req, res): void => { // logging: console.log, include: [{ model: Statement, as: "statement", where: { portfolio_id: portfolioId }, required: true }], }) - .then((statement) => { + .then(async (statement) => { if (statement) return Statement.findByPk(statement.id); else return null; }) - .then((ref) => position.update({ trade_unit_id: ref?.trade_unit_id })); + .then(async (ref) => position.update({ trade_unit_id: ref?.trade_unit_id })); default: logger.log( @@ -396,7 +396,7 @@ router.get("/:positionId(\\d+)/AddToTrade/:tradeId(\\d+)", (req, res): void => { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { const position = portfolio.positions[0]; if (position) { @@ -415,7 +415,7 @@ router.get("/:positionId(\\d+)/UnlinkTrade", (req, res): void => { const { _portfolioId, positionId } = req.params as typeof req.params & parentParams; logger.log(LogLevel.Debug, MODULE + ".UnlinkTrade", undefined, req.params); Position.findByPk(positionId) - .then((position) => { + .then(async (position) => { if (position) { return position.update({ trade_unit_id: null }); } else { diff --git a/src/routers/reports.router.ts b/src/routers/reports.router.ts index ecbe51f..0c549ca 100644 --- a/src/routers/reports.router.ts +++ b/src/routers/reports.router.ts @@ -37,7 +37,7 @@ router.get("/year/:year(\\d+)", (req, res): void => { }, ], }) - .then((portfolio) => prepareReport(portfolio!)) + .then(async (portfolio) => prepareReport(portfolio!)) .then((reports) => { res.status(200).json({ reports }); }) @@ -69,7 +69,7 @@ router.get("/summary/all", (req, res): void => { }, ], }) - .then((portfolio) => prepareReport(portfolio!)) + .then(async (portfolio) => prepareReport(portfolio!)) .then((reports) => { res.status(200).json({ reports }); }) @@ -101,7 +101,7 @@ router.get("/summary/ytd", (req, res): void => { }, ], }) - .then((portfolio) => prepareReport(portfolio!)) + .then(async (portfolio) => prepareReport(portfolio!)) .then((reports) => { res.status(200).json({ reports }); }) @@ -134,7 +134,7 @@ router.get("/summary/12m", (req, res): void => { }, ], }) - .then((portfolio) => prepareReport(portfolio!)) + .then(async (portfolio) => prepareReport(portfolio!)) .then((reports) => { res.status(200).json({ reports }); }) diff --git a/src/routers/statements.router.ts b/src/routers/statements.router.ts index 00c193e..d57d42c 100644 --- a/src/routers/statements.router.ts +++ b/src/routers/statements.router.ts @@ -30,7 +30,7 @@ const router = express.Router({ mergeParams: true }); type parentParams = { portfolioId: number }; -const updateStatementTrade = (statement: Statement): Promise => { +const updateStatementTrade = async (statement: Statement): Promise => { logger.trace(MODULE + ".updateStatementTrade", "statement", statement); if (statement.trade_unit_id) { logger.trace(MODULE + ".updateStatementTrade", "trade_unit_id", statement.trade_unit_id); @@ -43,12 +43,12 @@ const updateStatementTrade = (statement: Statement): Promise => { ], logging: sequelize_logging, }) - .then((thisTrade): Promise => { + .then(async (thisTrade): Promise => { logger.trace(MODULE + ".updateStatementTrade", "thisTrade", thisTrade); if (thisTrade) return updateTradeDetails(thisTrade).then(() => statement); return Promise.resolve(statement); }) - .then((statement) => { + .then(async (statement) => { return Promise.resolve(statement); }); } else return Promise.resolve(statement); @@ -59,10 +59,10 @@ const formatDate = (when: Date): string => { return datestr; }; -const makeSynthesys = (statements: Statement[]): Promise => { +const makeSynthesys = async (statements: Statement[]): Promise => { return statements.reduce( - (p: Promise, item: Statement) => { - return p.then((value: StatementsSynthesysEntries) => { + async (p: Promise, item: Statement) => { + return p.then(async (value: StatementsSynthesysEntries) => { // console.log('item:', JSON.stringify(item)); const idx = formatDate(item.date); if (value[idx] === undefined) { @@ -149,7 +149,7 @@ router.get("/summary/all", (req, res): void => { }, // limit: 500, }) - .then((statements: Statement[]): Promise => makeSynthesys(statements)) + .then(async (statements: Statement[]): Promise => makeSynthesys(statements)) .then((synthesysentries: StatementsSynthesysEntries) => res.status(200).json({ synthesysentries })) .catch((error) => { console.error(error); @@ -173,7 +173,7 @@ router.get("/summary/ytd", (req, res): void => { }, // limit: 500, }) - .then((statements: Statement[]): Promise => makeSynthesys(statements)) + .then(async (statements: Statement[]): Promise => makeSynthesys(statements)) .then((synthesysentries: StatementsSynthesysEntries) => res.status(200).json({ synthesysentries })) .catch((error) => { console.error(error); @@ -197,7 +197,7 @@ router.get("/summary/12m", (req, res): void => { }, // limit: 500, }) - .then((statements: Statement[]): Promise => makeSynthesys(statements)) + .then(async (statements: Statement[]): Promise => makeSynthesys(statements)) .then((synthesysentries: StatementsSynthesysEntries) => res.status(200).json({ synthesysentries })) .catch((error) => { console.error(error); @@ -224,10 +224,10 @@ router.get("/month/:year(\\d+)/:month(\\d+)", (req, res): void => { // limit: 5, include: [{ model: Contract }, { model: Portfolio }, { model: Trade }], }) - .then((statements: Statement[]): Promise => { + .then(async (statements: Statement[]): Promise => { return statements.reduce( - (p: Promise, item: Statement) => { - return p.then((value: StatementEntry[]) => { + async (p: Promise, item: Statement) => { + return p.then(async (value: StatementEntry[]) => { return statementModelToStatementEntry(item).then((statement) => { value.push(statement); return value; @@ -254,7 +254,7 @@ router.get("/:statementId(\\d+)/CreateTrade", (req, res): void => { Statement.findByPk(statementId, { include: [{ model: Contract }, { model: Portfolio }], }) - .then((statement) => { + .then(async (statement) => { if (statement) { const trade = { portfolio_id: portfolioId, @@ -265,7 +265,7 @@ router.get("/:statementId(\\d+)/CreateTrade", (req, res): void => { strategy: TradeStrategy.undefined, comment: "", }; - return Trade.create(trade, { logging: false }).then((trade) => { + return Trade.create(trade, { logging: false }).then(async (trade) => { statement.trade_unit_id = trade.id; return statement.save(); }); @@ -273,7 +273,7 @@ router.get("/:statementId(\\d+)/CreateTrade", (req, res): void => { throw Error("statement doesn't exist"); } }) - .then((statement) => updateStatementTrade(statement)) + .then(async (statement) => updateStatementTrade(statement)) .then((statement) => res.status(200).json({ statement })) .catch((error) => { logger.error(MODULE + ".CreateTrade", error); @@ -290,7 +290,7 @@ router.get("/:statementId(\\d+)/GuessTrade", (req, res): void => { Statement.findByPk(statementId, { include: [{ model: Contract }, { model: Portfolio }], }) - .then((statement) => { + .then(async (statement) => { if (statement) { switch (statement.statementType) { case StatementTypes.EquityStatement: @@ -320,13 +320,13 @@ router.get("/:statementId(\\d+)/GuessTrade", (req, res): void => { ], order: [["date", "DESC"]], logging: sequelize_logging, - }).then((ref) => { + }).then(async (ref) => { if (ref) statement.trade_unit_id = ref.trade_unit_id; return statement.save(); }); break; case StatementTypes.OptionStatement: - return OptionStatement.findByPk(statementId).then((optstatement) => { + return OptionStatement.findByPk(statementId).then(async (optstatement) => { logger.log(LogLevel.Info, MODULE + ".GuessTrade", undefined, "guessing for optstatement", optstatement); if (optstatement) { return OptionStatement.findOne({ @@ -348,9 +348,9 @@ router.get("/:statementId(\\d+)/GuessTrade", (req, res): void => { ], order: [["statement", "date", "DESC"]], // logging: console.log, - }).then((refopt) => { + }).then(async (refopt) => { if (refopt) - return Statement.findByPk(refopt.id).then((ref) => { + return Statement.findByPk(refopt.id).then(async (ref) => { if (ref) { statement.trade_unit_id = ref?.trade_unit_id; } @@ -370,7 +370,7 @@ router.get("/:statementId(\\d+)/GuessTrade", (req, res): void => { throw Error("statement doesn't exist"); } }) - .then((statement) => updateStatementTrade(statement)) + .then(async (statement) => updateStatementTrade(statement)) .then((statement) => res.status(200).json({ statement })) .catch((error) => { logger.log(LogLevel.Error, MODULE + ".GuessTrade", undefined, error.message); @@ -387,7 +387,7 @@ router.get("/:statementId(\\d+)/AddToTrade/:tradeId(\\d+)", (req, res): void => Statement.findByPk(statementId, { include: [{ model: Contract }, { model: Portfolio }], }) - .then((statement) => { + .then(async (statement) => { if (statement) { statement.trade_unit_id = parseInt(tradeId); return statement.save(); @@ -395,7 +395,7 @@ router.get("/:statementId(\\d+)/AddToTrade/:tradeId(\\d+)", (req, res): void => throw Error("statement doesn't exist"); } }) - .then((statement) => updateStatementTrade(statement)) + .then(async (statement) => updateStatementTrade(statement)) .then((statement) => res.status(200).json({ statement })) .catch((error) => { console.error(error); @@ -410,7 +410,7 @@ router.get("/:statementId(\\d+)/AddToTrade/:tradeId(\\d+)", (req, res): void => router.get("/:statementId(\\d+)/UnlinkTrade", (req, res): void => { const { _portfolioId, statementId } = req.params as typeof req.params & parentParams; Statement.findByPk(statementId) - .then((statement) => { + .then(async (statement) => { if (statement) { return statement.update({ trade_unit_id: null }); } else { @@ -418,7 +418,7 @@ router.get("/:statementId(\\d+)/UnlinkTrade", (req, res): void => { throw Error("statement not found: " + statementId); } }) - .then((statement) => updateStatementTrade(statement)) + .then(async (statement) => updateStatementTrade(statement)) .then((statement) => res.status(200).json({ statement })) .catch((error) => { console.error(error); @@ -440,7 +440,7 @@ router.get("/id/:statementId(\\d+)", (req, res): void => { if (!statement) throw Error("statement doesn't exist"); return statement; }) - .then((statement) => statementModelToStatementEntry(statement)) + .then(async (statement) => statementModelToStatementEntry(statement)) // .then((statement) => { // console.log("statement", statement); // return statement; @@ -460,7 +460,7 @@ router.delete("/:statementId(\\d+)/DeleteStatement", (req, res): void => { const { _portfolioId, statementId } = req.params as typeof req.params & parentParams; Statement.findByPk(statementId) - .then((statement) => { + .then(async (statement) => { if (statement) { // console.log(JSON.stringify(statement)); switch (statement.statementType) { @@ -489,7 +489,7 @@ router.delete("/:statementId(\\d+)/DeleteStatement", (req, res): void => { throw Error("statement not found: " + statementId); } }) - .then((statement) => { + .then(async (statement) => { if (statement) { // console.log("deleteing statement", statement.id); return Statement.destroy({ where: { id: statementId } }); @@ -517,7 +517,7 @@ router.post("/id/:statementId(\\d+)/SaveStatement", (req, res): void => { const data = req.body as StatementEntry; Statement.findByPk(statementId) - .then((statement) => { + .then(async (statement) => { if (statement) return statement .update({ @@ -525,7 +525,7 @@ router.post("/id/:statementId(\\d+)/SaveStatement", (req, res): void => { statementType: data.statementType, description: data.description, }) - .then((_statement) => { + .then(async (_statement) => { switch (data.statementType) { case StatementTypes.BondStatement: return BondStatement.update({ country: data.country }, { where: { id: statementId } }); diff --git a/src/routers/statements.utils.ts b/src/routers/statements.utils.ts index 6bbb455..d11a812 100644 --- a/src/routers/statements.utils.ts +++ b/src/routers/statements.utils.ts @@ -15,7 +15,7 @@ import { ContractType, StatementTypes } from "../models/types"; import { DididendSummary, InterestsSummary, ReportEntry } from "./reports.types"; import { BaseStatement, StatementEntry, StatementUnderlyingOption } from "./statements.types"; -export const statementModelToStatementEntry = (item: Statement): Promise => { +export const statementModelToStatementEntry = async (item: Statement): Promise => { const baseStatement: BaseStatement = { id: item.id, transactionId: item.transactionId, @@ -180,12 +180,12 @@ export const statementModelToStatementEntry = (item: Statement): Promise => { +export const prepareStatements = async (statements: Statement[]): Promise => { return statements .sort((a, b) => a.date.getTime() - b.date.getTime()) .reduce( - (p, item) => - p.then((statements) => { + async (p, item) => + p.then(async (statements) => { return statementModelToStatementEntry(item).then((statement_entry) => { statements.push(statement_entry); return statements; @@ -195,7 +195,7 @@ export const prepareStatements = (statements: Statement[]): Promise => { +export const prepareReport = async (portfolio: Portfolio): Promise => { return prepareStatements(portfolio.statements).then((statements) => { const result: ReportEntry[] = []; statements.forEach((statement) => { diff --git a/src/routers/trades.router.ts b/src/routers/trades.router.ts index 68ddab9..56f126f 100644 --- a/src/routers/trades.router.ts +++ b/src/routers/trades.router.ts @@ -41,7 +41,7 @@ router.get("/summary/all", (req, res): void => { }, include: [{ model: Contract, as: "underlying" }], }) - .then((trades: Trade[]) => makeSynthesys(trades)) + .then(async (trades: Trade[]) => makeSynthesys(trades)) .then((tradessynthesys) => res.status(200).json({ tradessynthesys })) .catch((error) => { console.error(error); @@ -71,7 +71,7 @@ router.get("/summary/12m", (req, res): void => { include: [{ model: Contract, as: "underlying" }], // limit: 500, }) - .then((trades: Trade[]) => makeSynthesys(trades)) + .then(async (trades: Trade[]) => makeSynthesys(trades)) .then((tradessynthesys) => res.status(200).json({ tradessynthesys })) .catch((error) => res.status(500).json({ error })); }); @@ -94,7 +94,7 @@ router.get("/summary/ytd", (req, res): void => { }, include: [{ model: Contract, as: "underlying" }], }) - .then((trades: Trade[]) => makeSynthesys(trades)) + .then(async (trades: Trade[]) => makeSynthesys(trades)) .then((tradessynthesys) => res.status(200).json({ tradessynthesys })) .catch((error) => { console.error(error); @@ -122,7 +122,7 @@ router.get("/month/:year(\\d+)/:month(\\d+)", (req, res): void => { }, include: [{ model: Contract, as: "underlying" }, { association: "statements" }], }) - .then((trades: Trade[]) => prepareTrades(trades)) + .then(async (trades: Trade[]) => prepareTrades(trades)) .then((trades) => res.status(200).json({ trades })) .catch((error) => { console.error(error); @@ -150,8 +150,8 @@ router.get("/summary/open", (req, res): void => { { association: "statements", include: [{ association: "stock" }] }, ], }) - .then((trades: Trade[]) => prepareTrades(trades)) - .then((trades) => { + .then(async (trades: Trade[]) => prepareTrades(trades)) + .then(async (trades) => { return Portfolio.findByPk(portfolioId, { include: [ { @@ -163,7 +163,7 @@ router.get("/summary/open", (req, res): void => { ], // logging: console.log, }) - .then((portfolio) => { + .then(async (portfolio) => { if (portfolio) { return preparePositions(portfolio); } else throw Error("Portfolio not found"); @@ -200,7 +200,7 @@ router.get("/id/:tradeId(\\d+)", (req, res): void => { ], // logging: console.log, }) - .then((trade) => { + .then(async (trade) => { if (trade) { return tradeModelToTradeEntry(trade, { with_statements: true, with_positions: true, with_virtuals: true }); } else { @@ -243,8 +243,8 @@ router.post("/id/:tradeId(\\d+)/SaveTrade", (req, res): void => { return trade; } else throw Error(`trade id ${tradeId} not found!`); }) - .then((trade) => updateTradeDetails(trade)) - .then((trade) => trade.save()) + .then(async (trade) => updateTradeDetails(trade)) + .then(async (trade) => trade.save()) .then((trade) => res.status(200).json({ trade })) .catch((error) => { console.error(error); @@ -261,15 +261,15 @@ router.delete("/id/:tradeId(\\d+)/DeleteTrade", (req, res): void => { logger.log(LogLevel.Debug, MODULE + ".DeleteTrade", undefined, portfolioId, tradeId); Position.update({ trade_unit_id: null }, { where: { portfolio_id: portfolioId, trade_unit_id: tradeId } }) - .then(() => + .then(async () => Statement.update({ trade_unit_id: null }, { where: { portfolio_id: portfolioId, trade_unit_id: tradeId } }), ) - .then(() => + .then(async () => Trade.findByPk(tradeId, { include: [{ model: Statement, as: "statements", required: false, include: [{ model: Contract, as: "stock" }] }], }), ) - .then((trade) => { + .then(async (trade) => { if (trade) return trade.destroy(); else throw Error("trade not found"); }) diff --git a/src/routers/trades.utils.ts b/src/routers/trades.utils.ts index d919561..2dd6c43 100644 --- a/src/routers/trades.utils.ts +++ b/src/routers/trades.utils.ts @@ -125,7 +125,7 @@ const updateTradeExpiry = (thisTrade: Trade, virtuals: Record => { +export const updateTradeDetails = async (thisTrade: Trade): Promise => { // logger.log(LogLevel.Trace, MODULE + ".updateTradeDetails", thisTrade.underlying?.symbol, "thisTrade", thisTrade); if (thisTrade && thisTrade.statements?.length) { // sort statements by date @@ -149,7 +149,7 @@ export const updateTradeDetails = (thisTrade: Trade): Promise => { thisTrade.PnL = 0; thisTrade.pnlInBase = 0; return prepareStatements(statements) // Convert Statement[] to StatementEntry[] - .then((statement_entries) => { + .then(async (statement_entries) => { // TODO: computeRisk_Generic could compute and return virtuals computeRisk_Generic(thisTrade, statement_entries); const virtuals = makeVirtualPositions(statement_entries); @@ -166,7 +166,7 @@ export const updateTradeDetails = (thisTrade: Trade): Promise => { * @param _options * @returns */ -export const tradeModelToTradeEntry = ( +export const tradeModelToTradeEntry = async ( thisTrade: Trade, _options: { with_statements: boolean; with_positions: boolean; with_virtuals: boolean } = { with_statements: false, @@ -200,7 +200,7 @@ export const tradeModelToTradeEntry = ( positions: undefined, virtuals: undefined, } as TradeEntry) - .then((trade_entry) => { + .then(async (trade_entry) => { // Add statements if (thisTrade.statements) { return prepareStatements(thisTrade.statements).then((statements) => { @@ -209,7 +209,7 @@ export const tradeModelToTradeEntry = ( }); } else return trade_entry; }) - .then((trade_entry) => { + .then(async (trade_entry) => { // Add positions return Portfolio.findByPk(thisTrade.portfolio_id, { include: [ @@ -222,7 +222,7 @@ export const tradeModelToTradeEntry = ( }, { model: Currency, as: "baseRates" }, ], - }).then((portfolio) => { + }).then(async (portfolio) => { if (!portfolio) throw Error("portfolio not found: " + thisTrade.portfolio_id); return preparePositions(portfolio).then((positions) => { trade_entry.positions = positions; @@ -566,10 +566,10 @@ const computeRisk_Generic = (thisTrade: Trade, statements: StatementEntry[]): Re return virtuals; }; -export const makeSynthesys = (trades: Trade[]): Promise => { +export const makeSynthesys = async (trades: Trade[]): Promise => { return trades.reduce( - (p, item) => - p.then((theSynthesys) => { + async (p, item) => + p.then(async (theSynthesys) => { if (item.closingDate) { const idx = formatDate(item.openingDate); if (theSynthesys.byMonth[idx] === undefined) { @@ -609,10 +609,10 @@ export const makeSynthesys = (trades: Trade[]): Promise => { ); }; -export const prepareTrades = (trades: Trade[]): Promise => { +export const prepareTrades = async (trades: Trade[]): Promise => { return trades.reduce( - (p, item) => - p.then((trades) => + async (p, item) => + p.then(async (trades) => tradeModelToTradeEntry(item).then((trade) => { trades.push(trade); return trades; diff --git a/tsconfig.json b/tsconfig.json index 9e7a8d6..a0b811c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "isolatedModules": true, "jsx": "react", "lib": ["ESNext", "DOM", "DOM.Iterable", "ES2021.String"], - "module": "ESNext", + "module": "CommonJS", // Was ESNext "moduleResolution": "Node", "noImplicitAny": false, // TODO set to true once all data hava a type "noImplicitReturns": true, diff --git a/tsconfig.server.json b/tsconfig.server.json index b0be9e5..92ab951 100644 --- a/tsconfig.server.json +++ b/tsconfig.server.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", // "compilerOptions": { // "outDir": "./dist", - // "module": "ESNext", + // "module": "CommonJS" // "noEmit": false // }, "include": ["./src"], diff --git a/yarn.lock b/yarn.lock index 30e159f..d1f1b26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4805,16 +4805,103 @@ array-buffer-byte-length@^1.0.0: call-bind "^1.0.2" is-array-buffer "^3.0.1" +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + assert@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" @@ -4863,6 +4950,13 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -5143,6 +5237,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -5607,6 +5712,33 @@ csstype@^3.0.2, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + date-fns@^2.30.0: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -5694,6 +5826,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -5707,6 +5848,15 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + defu@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c" @@ -5793,6 +5943,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -5956,6 +6113,70 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-get-iterator@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" @@ -5971,6 +6192,26 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" +es-iterator-helpers@^1.0.17: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + es-module-lexer@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -5981,6 +6222,38 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es6-object-assign@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" @@ -6080,6 +6353,30 @@ eslint-plugin-prettier@^5.1.3: prettier-linter-helpers "^1.0.0" synckit "^0.8.6" +eslint-plugin-react@^7.34.1: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + eslint-plugin-rxjs@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/eslint-plugin-rxjs/-/eslint-plugin-rxjs-5.0.3.tgz#a7ec16549f0dd23051bb744fea5bc0cdf096131a" @@ -6209,7 +6506,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -6690,6 +6987,16 @@ function-rate-limit@^1.1.0: resolved "https://registry.yarnpkg.com/function-rate-limit/-/function-rate-limit-1.1.0.tgz#eccdf1af918fc959eb6509058603e462e37fd683" integrity sha512-XNFOWy3kSz+96MeBCDUMmsLMSb7SmkAIfnhOsPRPz9V2Dx2agNmqjT//3QvXOgIH7FcGPfXMj8peajKHYuQ/Sw== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" @@ -6734,6 +7041,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -6754,6 +7072,15 @@ get-stream@^8.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + giget@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/giget/-/giget-1.1.2.tgz#f99a49cb0ff85479c8c3612cdc7ca27f2066e818" @@ -6875,6 +7202,14 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -6933,7 +7268,7 @@ handlebars@^4.7.7: optionalDependencies: uglify-js "^3.1.4" -has-bigints@^1.0.1: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -6955,11 +7290,23 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -6972,6 +7319,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6991,6 +7345,13 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hast-util-heading-rank@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz#2d5c6f2807a7af5c45f74e623498dd6054d2aba8" @@ -7189,6 +7550,15 @@ internal-slot@^1.0.4: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -7233,6 +7603,14 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -7243,6 +7621,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -7265,7 +7650,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -7284,7 +7669,14 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.0" -is-date-object@^1.0.5: +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7306,6 +7698,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -7323,7 +7722,7 @@ is-fullwidth-code-point@^5.0.0: dependencies: get-east-asian-width "^1.0.0" -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -7365,6 +7764,11 @@ is-nan@^1.2.1, is-nan@^1.3.2: call-bind "^1.0.0" define-properties "^1.1.3" +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -7424,6 +7828,13 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -7441,7 +7852,7 @@ is-string@^1.0.5, is-string@^1.0.7: dependencies: has-tostringtag "^1.0.0" -is-symbol@^1.0.3: +is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== @@ -7459,6 +7870,13 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -7469,6 +7887,13 @@ is-weakmap@^2.0.1: resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-weakset@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" @@ -7504,6 +7929,17 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jackspeak@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.0.tgz#aa228a94de830f31d4e4f0184427ce91c4ff1493" @@ -7645,6 +8081,16 @@ jsonify@^0.0.1: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -8305,6 +8751,11 @@ object-assign@^4, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" @@ -8333,6 +8784,53 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -8663,6 +9161,11 @@ polished@^4.2.2: dependencies: "@babel/runtime" "^7.17.8" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-resolve-nested-selector@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" @@ -8780,7 +9283,7 @@ prompts@^2.4.0, prompts@~2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9165,6 +9668,19 @@ reflect-metadata@^0.2.2: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -9198,6 +9714,16 @@ regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" @@ -9288,6 +9814,15 @@ resolve@^1.22.1, resolve@^1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9401,6 +9936,16 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9411,6 +9956,15 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" @@ -9551,6 +10105,28 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -9589,6 +10165,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -9845,6 +10431,52 @@ string-width@^7.0.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -10393,6 +11025,50 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + typescript-eslint@^7.8.0: version "7.8.0" resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.8.0.tgz#d2a73d4caac35d4d9825bfdfac06a9bf2ba175e4" @@ -10412,6 +11088,16 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -10718,6 +11404,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -10728,6 +11432,17 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"