Browse Source

Task/migrate from lodash to lodash-es (#7850)

* Migrate from lodash to lodash-es

* Update changelog
pull/7974/head
Szymon Łągiewka 1 week ago
committed by GitHub
parent
commit
f46f77f352
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 2
      apps/api/src/app/account-balance/account-balance.service.ts
  3. 2
      apps/api/src/app/account/account.service.ts
  4. 2
      apps/api/src/app/activities/activities-filter.dto.ts
  5. 2
      apps/api/src/app/activities/activities.service.ts
  6. 2
      apps/api/src/app/asset/asset.controller.ts
  7. 2
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts
  8. 2
      apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts
  9. 2
      apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts
  10. 2
      apps/api/src/app/export/export.service.ts
  11. 2
      apps/api/src/app/export/get-export.dto.ts
  12. 2
      apps/api/src/app/import/import.service.ts
  13. 2
      apps/api/src/app/info/info.service.ts
  14. 2
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  15. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
  16. 2
      apps/api/src/app/portfolio/current-rate.service.ts
  17. 2
      apps/api/src/app/portfolio/portfolio.service.ts
  18. 2
      apps/api/src/app/symbol/symbol.controller.ts
  19. 2
      apps/api/src/app/user/user.controller.ts
  20. 2
      apps/api/src/app/user/user.service.ts
  21. 2
      apps/api/src/dtos/filter.dto.ts
  22. 2
      apps/api/src/helper/activity.helper.ts
  23. 2
      apps/api/src/helper/object.helper.ts
  24. 2
      apps/api/src/models/rule.ts
  25. 2
      apps/api/src/services/benchmark/benchmark.service.ts
  26. 2
      apps/api/src/services/data-provider/data-provider.service.ts
  27. 2
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  28. 2
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  29. 2
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
  30. 2
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts
  31. 2
      apps/api/src/services/queues/data-gathering/data-gathering.service.ts
  32. 2
      apps/api/src/services/twitter-bot/twitter-bot.service.ts
  33. 2
      apps/client/jest.config.ts
  34. 2
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  35. 2
      apps/client/src/app/components/admin-jobs/admin-jobs.component.ts
  36. 2
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  37. 2
      apps/client/src/app/components/admin-settings/admin-settings.component.ts
  38. 2
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  39. 2
      apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts
  40. 2
      apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts
  41. 2
      apps/client/src/app/pages/api/api-page.component.ts
  42. 2
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  43. 2
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  44. 2
      apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
  45. 2
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  46. 2
      apps/client/src/app/services/import-activities.service.ts
  47. 19
      eslint.config.cjs
  48. 5
      jest.preset.js
  49. 2
      libs/common/src/lib/calculation-helper.ts
  50. 2
      libs/common/src/lib/dtos/create-account.dto.ts
  51. 2
      libs/common/src/lib/dtos/create-order.dto.ts
  52. 2
      libs/common/src/lib/dtos/update-account.dto.ts
  53. 2
      libs/common/src/lib/dtos/update-order.dto.ts
  54. 2
      libs/common/src/lib/helper.ts
  55. 2
      libs/ui/jest.config.ts
  56. 2
      libs/ui/src/lib/account-balances/account-balances.component.ts
  57. 2
      libs/ui/src/lib/activities-filter/activities-filter.component.ts
  58. 2
      libs/ui/src/lib/assistant/assistant.component.ts
  59. 2
      libs/ui/src/lib/benchmark/benchmark.component.ts
  60. 2
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  61. 2
      libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts
  62. 2
      libs/ui/src/lib/notifications/notification.service.ts
  63. 2
      libs/ui/src/lib/services/admin.service.ts
  64. 2
      libs/ui/src/lib/services/data.service.ts
  65. 2
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
  66. 2
      libs/ui/src/lib/top-holdings/top-holdings.component.ts
  67. 2
      libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
  68. 2
      libs/ui/src/lib/value/value.component.ts
  69. 15
      package-lock.json
  70. 4
      package.json

1
CHANGELOG.md

@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Extended the emergency fund dialog in the portfolio summary to include the currency suffix - Extended the emergency fund dialog in the portfolio summary to include the currency suffix
- Migrated the client to the code generated by the new `prisma-client` generator of _Prisma_ - Migrated the client to the code generated by the new `prisma-client` generator of _Prisma_
- Migrated from `lodash` to `lodash-es`
### Fixed ### Fixed

2
apps/api/src/app/account-balance/account-balance.service.ts

@ -24,7 +24,7 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { AccountBalance, Prisma } from '@prisma/client'; import { AccountBalance, Prisma } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { endOfToday, format, min, parseISO } from 'date-fns'; import { endOfToday, format, min, parseISO } from 'date-fns';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash-es';
@Injectable() @Injectable()
export class AccountBalanceService { export class AccountBalanceService {

2
apps/api/src/app/account/account.service.ts

@ -28,7 +28,7 @@ import {
} from '@prisma/client'; } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { groupBy, isNil } from 'lodash'; import { groupBy, isNil } from 'lodash-es';
import { CashDetails } from './interfaces/cash-details.interface'; import { CashDetails } from './interfaces/cash-details.interface';

2
apps/api/src/app/activities/activities-filter.dto.ts

@ -5,7 +5,7 @@ import { DateRange } from '@ghostfolio/common/types';
import { Type as ActivityType } from '@prisma/client'; import { Type as ActivityType } from '@prisma/client';
import { Transform, TransformFnParams } from 'class-transformer'; import { Transform, TransformFnParams } from 'class-transformer';
import { IsEnum, IsOptional, Matches } from 'class-validator'; import { IsEnum, IsOptional, Matches } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class ActivitiesFilterDto extends FilterDto { export class ActivitiesFilterDto extends FilterDto {
@IsEnum(ActivityType, { each: true }) @IsEnum(ActivityType, { each: true })

2
apps/api/src/app/activities/activities.service.ts

@ -60,7 +60,7 @@ import {
Type as ActivityType Type as ActivityType
} from '@prisma/client'; } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { groupBy, uniqBy } from 'lodash'; import { groupBy, uniqBy } from 'lodash-es';
import { randomUUID } from 'node:crypto'; import { randomUUID } from 'node:crypto';
@Injectable() @Injectable()

2
apps/api/src/app/asset/asset.controller.ts

@ -5,7 +5,7 @@ import type { AssetResponse } from '@ghostfolio/common/interfaces';
import { Controller, Get, Param, UseInterceptors } from '@nestjs/common'; import { Controller, Get, Param, UseInterceptors } from '@nestjs/common';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
import { pick } from 'lodash'; import { pick } from 'lodash-es';
@Controller('asset') @Controller('asset')
export class AssetController { export class AssetController {

2
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts

@ -29,7 +29,7 @@ import { MarketDataPreset } from '@ghostfolio/common/types';
import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { Injectable, Logger, NotFoundException } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventEmitter2 } from '@nestjs/event-emitter';
import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash-es';
@Injectable() @Injectable()
export class AssetProfilesService { export class AssetProfilesService {

2
apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts

@ -14,7 +14,7 @@ import { DateRange } from '@ghostfolio/common/types';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { format, isSameDay } from 'date-fns'; import { format, isSameDay } from 'date-fns';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
@Injectable() @Injectable()
export class BenchmarksService { export class BenchmarksService {

2
apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts

@ -40,7 +40,7 @@ import { Injectable, Logger } from '@nestjs/common';
import { DataSource, SymbolProfile } from '@prisma/client'; import { DataSource, SymbolProfile } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { addMilliseconds, isBefore } from 'date-fns'; import { addMilliseconds, isBefore } from 'date-fns';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash-es';
@Injectable() @Injectable()
export class GhostfolioService { export class GhostfolioService {

2
apps/api/src/app/export/export.service.ts

@ -11,7 +11,7 @@ import {
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { Platform, Prisma, Type as ActivityType } from '@prisma/client'; import { Platform, Prisma, Type as ActivityType } from '@prisma/client';
import { groupBy, uniqBy } from 'lodash'; import { groupBy, uniqBy } from 'lodash-es';
@Injectable() @Injectable()
export class ExportService { export class ExportService {

2
apps/api/src/app/export/get-export.dto.ts

@ -2,7 +2,7 @@ import { ActivitiesFilterDto } from '@ghostfolio/api/app/activities/activities-f
import { Transform, TransformFnParams } from 'class-transformer'; import { Transform, TransformFnParams } from 'class-transformer';
import { IsOptional, IsUUID } from 'class-validator'; import { IsOptional, IsUUID } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class GetExportDto extends ActivitiesFilterDto { export class GetExportDto extends ActivitiesFilterDto {
@IsOptional() @IsOptional()

2
apps/api/src/app/import/import.service.ts

@ -47,7 +47,7 @@ import { Account, DataSource, Prisma } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { isISIN } from 'class-validator'; import { isISIN } from 'class-validator';
import { isSameSecond, parseISO } from 'date-fns'; import { isSameSecond, parseISO } from 'date-fns';
import { omit, uniqBy } from 'lodash'; import { omit, uniqBy } from 'lodash-es';
import { randomUUID } from 'node:crypto'; import { randomUUID } from 'node:crypto';
import { ImportValidationError } from './errors/import-validation.error'; import { ImportValidationError } from './errors/import-validation.error';

2
apps/api/src/app/info/info.service.ts

@ -26,7 +26,7 @@ import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt';
import { MarketData } from '@prisma/client'; import { MarketData } from '@prisma/client';
import { subDays } from 'date-fns'; import { subDays } from 'date-fns';
import { isNil } from 'lodash'; import { isNil } from 'lodash-es';
@Injectable() @Injectable()
export class InfoService { export class InfoService {

2
apps/api/src/app/portfolio/calculator/portfolio-calculator.ts

@ -72,7 +72,7 @@ import {
startOfYear, startOfYear,
subDays subDays
} from 'date-fns'; } from 'date-fns';
import { groupBy, sortBy, uniqBy } from 'lodash'; import { groupBy, sortBy, uniqBy } from 'lodash-es';
export abstract class PortfolioCalculator { export abstract class PortfolioCalculator {
protected static readonly ENABLE_LOGGING = false; protected static readonly ENABLE_LOGGING = false;

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts

@ -32,7 +32,7 @@ import {
isBefore, isBefore,
isThisYear isThisYear
} from 'date-fns'; } from 'date-fns';
import { sum } from 'lodash'; import { sum } from 'lodash-es';
export class RoaiPortfolioCalculator extends PortfolioCalculator { export class RoaiPortfolioCalculator extends PortfolioCalculator {
protected calculateOverallPerformance( protected calculateOverallPerformance(

2
apps/api/src/app/portfolio/current-rate.service.ts

@ -14,7 +14,7 @@ import {
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { isBefore, isToday } from 'date-fns'; import { isBefore, isToday } from 'date-fns';
import { isEmpty, uniqBy } from 'lodash'; import { isEmpty, uniqBy } from 'lodash-es';
import { GetValueObject } from './interfaces/get-value-object.interface'; import { GetValueObject } from './interfaces/get-value-object.interface';
import { GetValuesObject } from './interfaces/get-values-object.interface'; import { GetValuesObject } from './interfaces/get-values-object.interface';

2
apps/api/src/app/portfolio/portfolio.service.ts

@ -104,7 +104,7 @@ import {
set, set,
startOfDay startOfDay
} from 'date-fns'; } from 'date-fns';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash-es';
import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { PortfolioCalculator } from './calculator/portfolio-calculator';
import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory';

2
apps/api/src/app/symbol/symbol.controller.ts

@ -25,7 +25,7 @@ import { AuthGuard } from '@nestjs/passport';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
import { isValid, parseISO } from 'date-fns'; import { isValid, parseISO } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash-es';
import { GetLookupDto } from './get-lookup.dto'; import { GetLookupDto } from './get-lookup.dto';
import { SymbolService } from './symbol.service'; import { SymbolService } from './symbol.service';

2
apps/api/src/app/user/user.controller.ts

@ -53,7 +53,7 @@ import { AuthGuard } from '@nestjs/passport';
import { Throttle } from '@nestjs/throttler'; import { Throttle } from '@nestjs/throttler';
import { User as UserModel } from '@prisma/client'; import { User as UserModel } from '@prisma/client';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { merge, size } from 'lodash'; import { merge, size } from 'lodash-es';
import { UserService } from './user.service'; import { UserService } from './user.service';

2
apps/api/src/app/user/user.service.ts

@ -46,7 +46,7 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler'; import { InjectThrottlerStorage, ThrottlerStorage } from '@nestjs/throttler';
import { Prisma, Role, User } from '@prisma/client'; import { Prisma, Role, User } from '@prisma/client';
import { differenceInDays, subDays } from 'date-fns'; import { differenceInDays, subDays } from 'date-fns';
import { isNil, without } from 'lodash'; import { isNil, without } from 'lodash-es';
import { createHmac } from 'node:crypto'; import { createHmac } from 'node:crypto';
@Injectable() @Injectable()

2
apps/api/src/dtos/filter.dto.ts

@ -9,7 +9,7 @@ import {
IsUUID, IsUUID,
MaxLength MaxLength
} from 'class-validator'; } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class FilterDto { export class FilterDto {
@IsOptional() @IsOptional()

2
apps/api/src/helper/activity.helper.ts

@ -5,7 +5,7 @@ import {
import { Prisma, Type as ActivityType } from '@prisma/client'; import { Prisma, Type as ActivityType } from '@prisma/client';
import { endOfToday, isAfter } from 'date-fns'; import { endOfToday, isAfter } from 'date-fns';
import { uniqBy } from 'lodash'; import { uniqBy } from 'lodash-es';
export const WHERE_ACTIVITY_NOT_DRAFT: Prisma.OrderWhereInput = { export const WHERE_ACTIVITY_NOT_DRAFT: Prisma.OrderWhereInput = {
tags: { tags: {

2
apps/api/src/helper/object.helper.ts

@ -1,6 +1,6 @@
import fastRedact from 'fast-redact'; import fastRedact from 'fast-redact';
import jsonpath from 'jsonpath'; import jsonpath from 'jsonpath';
import { cloneDeep, isObject } from 'lodash'; import { cloneDeep, isObject } from 'lodash-es';
export function hasNotDefinedValuesInObject(aObject: Object): boolean { export function hasNotDefinedValuesInObject(aObject: Object): boolean {
for (const key in aObject) { for (const key in aObject) {

2
apps/api/src/models/rule.ts

@ -7,7 +7,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash-es';
import { EvaluationResult } from './interfaces/evaluation-result.interface'; import { EvaluationResult } from './interfaces/evaluation-result.interface';
import { RuleInterface } from './interfaces/rule.interface'; import { RuleInterface } from './interfaces/rule.interface';

2
apps/api/src/services/benchmark/benchmark.service.ts

@ -23,7 +23,7 @@ import { Injectable, Logger } from '@nestjs/common';
import { SymbolProfile } from '@prisma/client'; import { SymbolProfile } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { addHours, isPast, subDays } from 'date-fns'; import { addHours, isPast, subDays } from 'date-fns';
import { round, uniqBy } from 'lodash'; import { round, uniqBy } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { BenchmarkValue } from './interfaces/benchmark-value.interface'; import { BenchmarkValue } from './interfaces/benchmark-value.interface';

2
apps/api/src/services/data-provider/data-provider.service.ts

@ -42,7 +42,7 @@ import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client'; import { DataSource, MarketData, Prisma, SymbolProfile } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { eachDayOfInterval, format, isValid } from 'date-fns'; import { eachDayOfInterval, format, isValid } from 'date-fns';
import { groupBy, isEmpty, isNumber, omit, uniqWith } from 'lodash'; import { groupBy, isEmpty, isNumber, omit, uniqWith } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { AssetProfileInvalidError } from './errors/asset-profile-invalid.error'; import { AssetProfileInvalidError } from './errors/asset-profile-invalid.error';

2
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -31,7 +31,7 @@ import {
SymbolProfile SymbolProfile
} from '@prisma/client'; } from '@prisma/client';
import { addDays, format, isSameDay, isToday } from 'date-fns'; import { addDays, format, isSameDay, isToday } from 'date-fns';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
@Injectable() @Injectable()
export class EodHistoricalDataService export class EodHistoricalDataService

2
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

@ -47,7 +47,7 @@ import {
isSameDay, isSameDay,
parseISO parseISO
} from 'date-fns'; } from 'date-fns';
import { isArray, uniqBy } from 'lodash'; import { isArray, uniqBy } from 'lodash-es';
@Injectable() @Injectable()
export class FinancialModelingPrepService export class FinancialModelingPrepService

2
apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

@ -24,7 +24,7 @@ import { Injectable, Logger } from '@nestjs/common';
import { DataSource, SymbolProfile } from '@prisma/client'; import { DataSource, SymbolProfile } from '@prisma/client';
import { addDays, format, isSameDay } from 'date-fns'; import { addDays, format, isSameDay } from 'date-fns';
import { ReasonPhrases, StatusCodes } from 'http-status-codes'; import { ReasonPhrases, StatusCodes } from 'http-status-codes';
import { uniqBy } from 'lodash'; import { uniqBy } from 'lodash-es';
import YahooFinance from 'yahoo-finance2'; import YahooFinance from 'yahoo-finance2';
import type { ChartResultArray } from 'yahoo-finance2/modules/chart'; import type { ChartResultArray } from 'yahoo-finance2/modules/chart';
import type { import type {

2
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

@ -26,7 +26,7 @@ import {
isToday, isToday,
subDays subDays
} from 'date-fns'; } from 'date-fns';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { ExchangeRatesByCurrency } from './interfaces/exchange-rate-data.interface'; import { ExchangeRatesByCurrency } from './interfaces/exchange-rate-data.interface';

2
apps/api/src/services/queues/data-gathering/data-gathering.service.ts

@ -33,7 +33,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common';
import { Prisma } from '@prisma/client'; import { Prisma } from '@prisma/client';
import { Job, JobOptions, Queue } from 'bull'; import { Job, JobOptions, Queue } from 'bull';
import { format, min, subDays, subMilliseconds, subYears } from 'date-fns'; import { format, min, subDays, subMilliseconds, subYears } from 'date-fns';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash-es';
import ms, { StringValue } from 'ms'; import ms, { StringValue } from 'ms';
@Injectable() @Injectable()

2
apps/api/src/services/twitter-bot/twitter-bot.service.ts

@ -10,7 +10,7 @@ import {
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { isWeekend } from 'date-fns'; import { isWeekend } from 'date-fns';
import { round } from 'lodash'; import { round } from 'lodash-es';
import { TwitterApi, TwitterApiReadWrite } from 'twitter-api-v2'; import { TwitterApi, TwitterApiReadWrite } from 'twitter-api-v2';
@Injectable() @Injectable()

2
apps/client/jest.config.ts

@ -18,6 +18,6 @@ export default {
} }
] ]
}, },
transformIgnorePatterns: ['node_modules/(?!.*.mjs$)'], transformIgnorePatterns: ['node_modules/(?!.*.mjs$|lodash-es/)'],
preset: '../../jest.preset.js' preset: '../../jest.preset.js'
}; };

2
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -55,7 +55,7 @@ import {
readerOutline, readerOutline,
swapVerticalOutline swapVerticalOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { filter, forkJoin } from 'rxjs'; import { filter, forkJoin } from 'rxjs';

2
apps/client/src/app/components/admin-jobs/admin-jobs.component.ts

@ -49,7 +49,7 @@ import {
removeCircleOutline, removeCircleOutline,
timeOutline timeOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { get } from 'lodash'; import { get } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@Component({ @Component({

2
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -106,7 +106,7 @@ import {
serverOutline, serverOutline,
trashOutline trashOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { isBoolean } from 'lodash'; import { isBoolean } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { EMPTY } from 'rxjs'; import { EMPTY } from 'rxjs';
import { catchError } from 'rxjs/operators'; import { catchError } from 'rxjs/operators';

2
apps/client/src/app/components/admin-settings/admin-settings.component.ts

@ -42,7 +42,7 @@ import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { ellipsisHorizontal, trashOutline } from 'ionicons/icons'; import { ellipsisHorizontal, trashOutline } from 'ionicons/icons';
import { get } from 'lodash'; import { get } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { catchError, filter, of } from 'rxjs'; import { catchError, filter, of } from 'rxjs';

2
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -82,7 +82,7 @@ import {
swapVerticalOutline, swapVerticalOutline,
walletOutline walletOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { isNumber, round, uniqBy } from 'lodash'; import { isNumber, round, uniqBy } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { filter, switchMap } from 'rxjs/operators'; import { filter, switchMap } from 'rxjs/operators';

2
apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts

@ -23,7 +23,7 @@ import { IonIcon } from '@ionic/angular/standalone';
import { CountUp } from 'countup.js'; import { CountUp } from 'countup.js';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { timeOutline } from 'ionicons/icons'; import { timeOutline } from 'ionicons/icons';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@Component({ @Component({

2
apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts

@ -23,7 +23,7 @@ import {
ellipsisHorizontalCircleOutline, ellipsisHorizontalCircleOutline,
informationCircleOutline informationCircleOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@Component({ @Component({

2
apps/client/src/app/pages/api/api-page.component.ts

@ -32,7 +32,7 @@ import {
import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';
import { format, startOfYear } from 'date-fns'; import { format, startOfYear } from 'date-fns';
import { isObject } from 'lodash'; import { isObject } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { catchError, map, Observable, of, OperatorFunction } from 'rxjs'; import { catchError, map, Observable, of, OperatorFunction } from 'rxjs';

2
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -51,7 +51,7 @@ import { MatTableDataSource } from '@angular/material/table';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { cloudUploadOutline, warningOutline } from 'ionicons/icons'; import { cloudUploadOutline, warningOutline } from 'ionicons/icons';
import { isArray, sortBy } from 'lodash'; import { isArray, sortBy } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { ImportStep } from './enums/import-step'; import { ImportStep } from './enums/import-step';

2
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -53,7 +53,7 @@ import { MatCardModule } from '@angular/material/card';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatProgressBarModule } from '@angular/material/progress-bar';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { filter, switchMap, tap } from 'rxjs'; import { filter, switchMap, tap } from 'rxjs';

2
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts

@ -51,7 +51,7 @@ import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { copyOutline, ellipsisVertical } from 'ionicons/icons'; import { copyOutline, ellipsisVertical } from 'ionicons/icons';
import { isNumber, keyBy, sortBy, union } from 'lodash'; import { isNumber, keyBy, sortBy, union } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';

2
apps/client/src/app/pages/portfolio/fire/fire-page.component.ts

@ -27,7 +27,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { FormControl } from '@angular/forms'; import { FormControl } from '@angular/forms';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { isFinite, isNumber } from 'lodash'; import { isFinite, isNumber } from 'lodash-es';
import { DeviceDetectorService } from 'ngx-device-detector'; import { DeviceDetectorService } from 'ngx-device-detector';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';

2
apps/client/src/app/services/import-activities.service.ts

@ -16,7 +16,7 @@ import { DataSource, Type as ActivityType } from '@ghostfolio/prisma/enums';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { inject, Service } from '@angular/core'; import { inject, Service } from '@angular/core';
import { isFinite, isNumber, isString } from 'lodash'; import { isFinite, isNumber, isString } from 'lodash-es';
import { parse as csvToJson } from 'papaparse'; import { parse as csvToJson } from 'papaparse';
import { firstValueFrom } from 'rxjs'; import { firstValueFrom } from 'rxjs';
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';

19
eslint.config.cjs

@ -116,7 +116,24 @@ module.exports = [
'no-eval': 'error', 'no-eval': 'error',
'no-fallthrough': 'error', 'no-fallthrough': 'error',
'no-new-wrappers': 'error', 'no-new-wrappers': 'error',
'no-restricted-imports': ['error', 'rxjs/Rx'], 'no-restricted-imports': [
'error',
{
paths: [
'rxjs/Rx',
{
message: 'Import from lodash-es instead.',
name: 'lodash'
}
],
patterns: [
{
group: ['lodash/*'],
message: 'Import from lodash-es instead.'
}
]
}
],
'no-undef-init': 'error', 'no-undef-init': 'error',
'no-underscore-dangle': 'off', 'no-underscore-dangle': 'off',
'no-var': 'error', 'no-var': 'error',

5
jest.preset.js

@ -1,3 +1,6 @@
const nxPreset = require('@nx/jest/preset').default; const nxPreset = require('@nx/jest/preset').default;
module.exports = { ...nxPreset }; module.exports = {
...nxPreset,
transformIgnorePatterns: ['node_modules/(?!lodash-es/)']
};

2
libs/common/src/lib/calculation-helper.ts

@ -10,7 +10,7 @@ import {
subMilliseconds, subMilliseconds,
subYears subYears
} from 'date-fns'; } from 'date-fns';
import { isFinite, isNumber } from 'lodash'; import { isFinite, isNumber } from 'lodash-es';
import { resetHours } from './helper'; import { resetHours } from './helper';
import { DateRange } from './types'; import { DateRange } from './types';

2
libs/common/src/lib/dtos/create-account.dto.ts

@ -11,7 +11,7 @@ import {
MaxLength, MaxLength,
ValidateIf ValidateIf
} from 'class-validator'; } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class CreateAccountDto { export class CreateAccountDto {
/** /**

2
libs/common/src/lib/dtos/create-order.dto.ts

@ -25,7 +25,7 @@ import {
Min, Min,
Validate Validate
} from 'class-validator'; } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class CreateOrderDto { export class CreateOrderDto {
@IsOptional() @IsOptional()

2
libs/common/src/lib/dtos/update-account.dto.ts

@ -11,7 +11,7 @@ import {
MaxLength, MaxLength,
ValidateIf ValidateIf
} from 'class-validator'; } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class UpdateAccountDto { export class UpdateAccountDto {
/** /**

2
libs/common/src/lib/dtos/update-order.dto.ts

@ -24,7 +24,7 @@ import {
Min, Min,
Validate Validate
} from 'class-validator'; } from 'class-validator';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
export class UpdateOrderDto { export class UpdateOrderDto {
@IsOptional() @IsOptional()

2
libs/common/src/lib/helper.ts

@ -42,7 +42,7 @@ import {
uk, uk,
zhCN zhCN
} from 'date-fns/locale'; } from 'date-fns/locale';
import { get, isNil, isString } from 'lodash'; import { get, isNil, isString } from 'lodash-es';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,

2
libs/ui/jest.config.ts

@ -14,7 +14,7 @@ export default {
} }
] ]
}, },
transformIgnorePatterns: ['node_modules/(?!.*.mjs$)'], transformIgnorePatterns: ['node_modules/(?!.*.mjs$|lodash-es/)'],
snapshotSerializers: [ snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes', 'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot', 'jest-preset-angular/build/serializers/ng-snapshot',

2
libs/ui/src/lib/account-balances/account-balances.component.ts

@ -40,7 +40,7 @@ import {
ellipsisHorizontal, ellipsisHorizontal,
trashOutline trashOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { get, isNil } from 'lodash'; import { get, isNil } from 'lodash-es';
import { GfValueComponent } from '../value'; import { GfValueComponent } from '../value';

2
libs/ui/src/lib/activities-filter/activities-filter.component.ts

@ -29,7 +29,7 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { closeOutline, searchOutline } from 'ionicons/icons'; import { closeOutline, searchOutline } from 'ionicons/icons';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash-es';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { translate } from '../i18n'; import { translate } from '../i18n';

2
libs/ui/src/lib/assistant/assistant.component.ts

@ -39,7 +39,7 @@ import {
closeOutline, closeOutline,
searchOutline searchOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { isFunction, sample } from 'lodash'; import { isFunction, sample } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { EMPTY, Observable, merge, of } from 'rxjs'; import { EMPTY, Observable, merge, of } from 'rxjs';
import { import {

2
libs/ui/src/lib/benchmark/benchmark.component.ts

@ -33,7 +33,7 @@ import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { ellipsisHorizontal, trashOutline } from 'ionicons/icons'; import { ellipsisHorizontal, trashOutline } from 'ionicons/icons';
import { isNumber, round } from 'lodash'; import { isNumber, round } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component'; import { GfEntityLogoComponent } from '../entity-logo/entity-logo.component';

2
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -59,7 +59,7 @@ import {
} from 'date-fns'; } from 'date-fns';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { calendarClearOutline } from 'ionicons/icons'; import { calendarClearOutline } from 'ionicons/icons';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { debounceTime } from 'rxjs'; import { debounceTime } from 'rxjs';

2
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts

@ -29,7 +29,7 @@ import { MatInputModule } from '@angular/material/input';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { calendarClearOutline, refreshOutline } from 'ionicons/icons'; import { calendarClearOutline, refreshOutline } from 'ionicons/icons';
import { isNil } from 'lodash'; import { isNil } from 'lodash-es';
import { HistoricalMarketDataEditorDialogParams } from './interfaces/interfaces'; import { HistoricalMarketDataEditorDialogParams } from './interfaces/interfaces';

2
libs/ui/src/lib/notifications/notification.service.ts

@ -3,7 +3,7 @@ import { translate } from '@ghostfolio/ui/i18n';
import { inject, Service } from '@angular/core'; import { inject, Service } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { isFunction } from 'lodash'; import { isFunction } from 'lodash-es';
import { GfAlertDialogComponent } from './alert-dialog/alert-dialog.component'; import { GfAlertDialogComponent } from './alert-dialog/alert-dialog.component';
import { GfConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component'; import { GfConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component';

2
libs/ui/src/lib/services/admin.service.ts

@ -31,7 +31,7 @@ import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { inject, Service } from '@angular/core'; import { inject, Service } from '@angular/core';
import { JobStatus } from 'bull'; import { JobStatus } from 'bull';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
@Service() @Service()
export class AdminService { export class AdminService {

2
libs/ui/src/lib/services/data.service.ts

@ -82,7 +82,7 @@ import { inject, Service } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { utc } from '@date-fns/utc'; import { utc } from '@date-fns/utc';
import { format, parseISO } from 'date-fns'; import { format, parseISO } from 'date-fns';
import { cloneDeep, groupBy, isNumber } from 'lodash'; import { cloneDeep, groupBy, isNumber } from 'lodash-es';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';

2
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts

@ -36,7 +36,7 @@ import {
} from '@angular/material/form-field'; } from '@angular/material/form-field';
import { MatInput, MatInputModule } from '@angular/material/input'; import { MatInput, MatInputModule } from '@angular/material/input';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { isString } from 'lodash'; import { isString } from 'lodash-es';
import { tap } from 'rxjs'; import { tap } from 'rxjs';
import { import {
debounceTime, debounceTime,

2
libs/ui/src/lib/top-holdings/top-holdings.component.ts

@ -18,7 +18,7 @@ import {
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { capitalize } from 'lodash'; import { capitalize } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfValueComponent } from '../value/value.component'; import { GfValueComponent } from '../value/value.component';

2
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts

@ -32,7 +32,7 @@ import { Chart, LinearScale, Tooltip } from 'chart.js';
import { TreemapController, TreemapElement } from 'chartjs-chart-treemap'; import { TreemapController, TreemapElement } from 'chartjs-chart-treemap';
import { isUUID } from 'class-validator'; import { isUUID } from 'class-validator';
import { differenceInDays, max } from 'date-fns'; import { differenceInDays, max } from 'date-fns';
import { orderBy, round } from 'lodash'; import { orderBy, round } from 'lodash-es';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import OpenColor from 'open-color'; import OpenColor from 'open-color';

2
libs/ui/src/lib/value/value.component.ts

@ -21,7 +21,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
import { IonIcon } from '@ionic/angular/standalone'; import { IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons'; import { addIcons } from 'ionicons';
import { checkmarkOutline, copyOutline } from 'ionicons/icons'; import { checkmarkOutline, copyOutline } from 'ionicons/icons';
import { isNumber } from 'lodash'; import { isNumber } from 'lodash-es';
import ms from 'ms'; import ms from 'ms';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';

15
package-lock.json

@ -83,7 +83,7 @@
"ionicons": "8.0.13", "ionicons": "8.0.13",
"jsonpath": "1.3.0", "jsonpath": "1.3.0",
"katex": "0.16.47", "katex": "0.16.47",
"lodash": "4.18.1", "lodash-es": "4.18.1",
"marked": "18.0.12", "marked": "18.0.12",
"marked-katex-extension": "5.1.12", "marked-katex-extension": "5.1.12",
"ms": "3.0.0-canary.1", "ms": "3.0.0-canary.1",
@ -147,7 +147,7 @@
"@types/google-spreadsheet": "3.1.5", "@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0", "@types/jest": "30.0.0",
"@types/jsonpath": "0.2.4", "@types/jsonpath": "0.2.4",
"@types/lodash": "4.17.25", "@types/lodash-es": "4.17.12",
"@types/node": "22.20.1", "@types/node": "22.20.1",
"@types/papaparse": "5.5.2", "@types/papaparse": "5.5.2",
"@types/passport-google-oauth20": "2.0.17", "@types/passport-google-oauth20": "2.0.17",
@ -15221,6 +15221,16 @@
"devOptional": true, "devOptional": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/lodash-es": {
"version": "4.17.12",
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/luxon": { "node_modules/@types/luxon": {
"version": "3.7.1", "version": "3.7.1",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.1.tgz",
@ -27042,7 +27052,6 @@
"version": "4.18.1", "version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
"integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash.debounce": { "node_modules/lodash.debounce": {

4
package.json

@ -127,7 +127,7 @@
"ionicons": "8.0.13", "ionicons": "8.0.13",
"jsonpath": "1.3.0", "jsonpath": "1.3.0",
"katex": "0.16.47", "katex": "0.16.47",
"lodash": "4.18.1", "lodash-es": "4.18.1",
"marked": "18.0.12", "marked": "18.0.12",
"marked-katex-extension": "5.1.12", "marked-katex-extension": "5.1.12",
"ms": "3.0.0-canary.1", "ms": "3.0.0-canary.1",
@ -191,7 +191,7 @@
"@types/google-spreadsheet": "3.1.5", "@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0", "@types/jest": "30.0.0",
"@types/jsonpath": "0.2.4", "@types/jsonpath": "0.2.4",
"@types/lodash": "4.17.25", "@types/lodash-es": "4.17.12",
"@types/node": "22.20.1", "@types/node": "22.20.1",
"@types/papaparse": "5.5.2", "@types/papaparse": "5.5.2",
"@types/passport-google-oauth20": "2.0.17", "@types/passport-google-oauth20": "2.0.17",

Loading…
Cancel
Save