@carlonicora/nextjs-jsonapi 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/{BlockNoteEditor-7WGCH2KB.js → BlockNoteEditor-TIMGYKAA.js} +19 -19
  2. package/dist/{BlockNoteEditor-7WGCH2KB.js.map → BlockNoteEditor-TIMGYKAA.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-GWAV5ESO.mjs → BlockNoteEditor-YFJMXJEU.mjs} +4 -4
  4. package/dist/billing/index.js +362 -362
  5. package/dist/billing/index.mjs +3 -3
  6. package/dist/{chunk-GYGMEDVS.js → chunk-7HKJNUW7.js} +755 -746
  7. package/dist/chunk-7HKJNUW7.js.map +1 -0
  8. package/dist/{chunk-3LVSA7IM.mjs → chunk-DJWNNV52.mjs} +2 -2
  9. package/dist/{chunk-LCCRUWWY.mjs → chunk-FS4RVV3K.mjs} +241 -1
  10. package/dist/chunk-FS4RVV3K.mjs.map +1 -0
  11. package/dist/{chunk-M2EGUO2F.mjs → chunk-G4YS52SO.mjs} +16 -7
  12. package/dist/chunk-G4YS52SO.mjs.map +1 -0
  13. package/dist/{chunk-TOKHHZSP.js → chunk-OTEDZ6YW.js} +7 -7
  14. package/dist/{chunk-TOKHHZSP.js.map → chunk-OTEDZ6YW.js.map} +1 -1
  15. package/dist/{chunk-V66AZWPG.js → chunk-RTOC53EZ.js} +246 -6
  16. package/dist/chunk-RTOC53EZ.js.map +1 -0
  17. package/dist/client/index.js +4 -4
  18. package/dist/client/index.mjs +3 -3
  19. package/dist/components/index.d.mts +16 -1
  20. package/dist/components/index.d.ts +16 -1
  21. package/dist/components/index.js +4 -4
  22. package/dist/components/index.mjs +3 -3
  23. package/dist/{tokenusage-admin.module-5wJ_tZTj.d.ts → config-BIjrg5wd.d.ts} +39 -1
  24. package/dist/{tokenusage-admin.module-DQVT4O4j.d.mts → config-BRUjtCd1.d.mts} +39 -1
  25. package/dist/contexts/index.js +4 -4
  26. package/dist/contexts/index.mjs +3 -3
  27. package/dist/core/index.d.mts +5 -2
  28. package/dist/core/index.d.ts +5 -2
  29. package/dist/core/index.js +8 -2
  30. package/dist/core/index.js.map +1 -1
  31. package/dist/core/index.mjs +7 -1
  32. package/dist/features/help/index.js +37 -37
  33. package/dist/features/help/index.mjs +3 -3
  34. package/dist/features/tokenusage/index.d.mts +413 -14
  35. package/dist/features/tokenusage/index.d.ts +413 -14
  36. package/dist/features/tokenusage/index.js +481 -120
  37. package/dist/features/tokenusage/index.js.map +1 -1
  38. package/dist/features/tokenusage/index.mjs +431 -70
  39. package/dist/features/tokenusage/index.mjs.map +1 -1
  40. package/dist/index.d.mts +2 -2
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +9 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/index.mjs +8 -2
  45. package/dist/server/index.js +3 -3
  46. package/dist/server/index.mjs +1 -1
  47. package/package.json +1 -1
  48. package/src/core/index.ts +10 -0
  49. package/src/core/registry/ModuleRegistry.ts +4 -0
  50. package/src/features/tokenusage/components/TokenUsageAdminContainer.tsx +20 -4
  51. package/src/features/tokenusage/components/TokenUsageAdminTiles.tsx +31 -18
  52. package/src/features/tokenusage/components/TokenUsageBreakdownTable.tsx +13 -13
  53. package/src/features/tokenusage/components/TokenUsageRankedBar.tsx +24 -7
  54. package/src/features/tokenusage/components/TokenUsageReportContainer.tsx +102 -0
  55. package/src/features/tokenusage/components/TokenUsageReportFilterBar.tsx +34 -0
  56. package/src/features/tokenusage/components/TokenUsageReportTiles.tsx +161 -0
  57. package/src/features/tokenusage/components/TokenUsageTimelineChart.tsx +15 -13
  58. package/src/features/tokenusage/components/__tests__/TokenUsageAdminTiles.spec.tsx +4 -2
  59. package/src/features/tokenusage/components/__tests__/TokenUsageRankedBar.spec.tsx +3 -1
  60. package/src/features/tokenusage/contexts/TokenUsageAdminContext.tsx +6 -3
  61. package/src/features/tokenusage/contexts/TokenUsageReportContext.tsx +199 -0
  62. package/src/features/tokenusage/data/TokenUsageReportService.ts +65 -0
  63. package/src/features/tokenusage/data/index.ts +9 -0
  64. package/src/features/tokenusage/data/tokenusage-report-breakdown.interface.ts +12 -0
  65. package/src/features/tokenusage/data/tokenusage-report-breakdown.ts +94 -0
  66. package/src/features/tokenusage/data/tokenusage-report-summary.interface.ts +12 -0
  67. package/src/features/tokenusage/data/tokenusage-report-summary.ts +87 -0
  68. package/src/features/tokenusage/data/tokenusage-report-timeline.interface.ts +13 -0
  69. package/src/features/tokenusage/data/tokenusage-report-timeline.ts +94 -0
  70. package/src/features/tokenusage/data/tokenusage-report.types.ts +51 -0
  71. package/src/features/tokenusage/i18n-keys.ts +28 -0
  72. package/src/features/tokenusage/index.ts +18 -0
  73. package/src/features/tokenusage/lib/config.ts +22 -0
  74. package/src/features/tokenusage/lib/formatters.ts +100 -0
  75. package/src/features/tokenusage/lib/metrics.ts +8 -26
  76. package/src/features/tokenusage/lib/palette.ts +41 -14
  77. package/src/features/tokenusage/tokenusage-admin.module.ts +4 -0
  78. package/src/features/tokenusage/tokenusage.modules.ts +40 -0
  79. package/src/shadcnui/ui/chart.tsx +30 -3
  80. package/dist/chunk-GYGMEDVS.js.map +0 -1
  81. package/dist/chunk-LCCRUWWY.mjs.map +0 -1
  82. package/dist/chunk-M2EGUO2F.mjs.map +0 -1
  83. package/dist/chunk-V66AZWPG.js.map +0 -1
  84. /package/dist/{BlockNoteEditor-GWAV5ESO.mjs.map → BlockNoteEditor-YFJMXJEU.mjs.map} +0 -0
  85. /package/dist/{chunk-3LVSA7IM.mjs.map → chunk-DJWNNV52.mjs.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ export { A as ApiData } from './ApiData-DPKNfY-9.js';
2
2
  import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from './ApiDataInterface-BcZeXy5X.js';
3
3
  export { A as ApiRequestDataTypeInterface, F as FieldSelector, G as GetterKeys, c as createJsonApiInclusion } from './ApiRequestDataTypeInterface-CYEcRUrh.js';
4
4
  export { A as ApiResponseInterface } from './ApiResponseInterface-CWLvSCvS.js';
5
- import { A as AbstractApiData } from './tokenusage-admin.module-5wJ_tZTj.js';
6
- export { b as TokenUsageAdminBreakdownModule, T as TokenUsageAdminSummaryModule, a as TokenUsageAdminTimelineModule } from './tokenusage-admin.module-5wJ_tZTj.js';
5
+ import { A as AbstractApiData } from './config-BIjrg5wd.js';
6
+ export { b as TokenUsageAdminBreakdownModule, T as TokenUsageAdminSummaryModule, a as TokenUsageAdminTimelineModule, c as configureTokenUsage, g as getTokenUsageCurrency, t as tokenUsageModules } from './config-BIjrg5wd.js';
7
7
  import { A as AbstractService } from './AbstractService-Cew0PD0L.js';
8
8
  export { H as HttpMethod, N as NextRef, P as PreviousRef, S as SelfRef, T as TotalRef, b as clearLastApiMeta, c as clearLastApiTotal, d as getGlobalErrorHandler, a as getLastApiMeta, g as getLastApiTotal, s as setGlobalErrorHandler } from './AbstractService-Cew0PD0L.js';
9
9
  export { AppModuleDefinitions, Assistant, AssistantAction, AssistantActionInput, AssistantActionInterface, AssistantActionModule, AssistantActionService, AssistantActionStatus, AssistantMessage, AssistantMessageModule, AssistantMessageService, AssistantModule, AssistantService, AuditLog, AuditLogInterface, AuditLogModule, AuditLogService, Auth, AuthModule, AuthorModule, BackupCodeVerify, BackupCodeVerifyInput, BackupCodeVerifyModule, Billing, BillingModule, BillingService, BlockDiffOptions, BlockNoteDiffUtil, BlockNoteWordDiffRendererUtil, Chunk, ChunkInput, ChunkModule, ClientAbstractService, ClientHttpMethod, ClientNextRef, ClientPreviousRef, ClientSelfRef, ClientTotalRef, CodiceFiscaleValidationOptions, Company, CompanyFields, CompanyModule, Content, ContentModule, DataClass, DataClass as DataClassRegistry, DiffBlock, DiffResult, EndpointCreator, EndpointQuery, EntityAiStatus, EntityObject, Feature, FeatureModule, FormatOption, FoundationModuleDefinitions, HowTo, HowToFields, HowToModule, HowToService, InviteValidation, JsonApiDataFactory, MOBILE_BREAKPOINT, Module, ModuleDefinitions, ModuleModule, ModulePathsModule, ModuleRegistrar, ModuleRegistry, Modules, Notification, NotificationFields, NotificationModule, OAuthClient, OAuthModule, OAuthService, Passkey, PasskeyAuthenticationOptions, PasskeyAuthenticationOptionsInput, PasskeyAuthenticationOptionsInterface, PasskeyAuthenticationOptionsModule, PasskeyModule, PasskeyRegistrationOptions, PasskeyRegistrationOptionsInput, PasskeyRegistrationOptionsInterface, PasskeyRegistrationOptionsModule, PasskeyRegistrationVerify, PasskeyRegistrationVerifyInput, PasskeyRegistrationVerifyModule, PasskeyRename, PasskeyRenameInput, PasskeyRenameModule, PasskeyVerifyLogin, PasskeyVerifyLoginInput, PasskeyVerifyLoginModule, PaymentMethod, PermissionMappingModule, Push, PushInput, PushInterface, PushModule, RbacMatrixModule, ReferralModule, ReferralService, ReferralStats, ReferralStatsModule, RehydrationFactory, Role, RoleModule, S3, S3Module, SearchResultInterface, StripeCustomer, StripeCustomerModule, StripeCustomerService, StripeInvoice, StripeInvoiceModule, StripeInvoiceService, StripePaymentMethodModule, StripePrice, StripePriceModule, StripePriceService, StripeProduct, StripeProductModule, StripeProductService, StripePromotionCode, StripePromotionCodeModule, StripePromotionCodeService, StripeSubscription, StripeSubscriptionModule, StripeSubscriptionService, StripeUsage, StripeUsageModule, StripeUsageService, TableOptions, ToastOptions, TotpAuthenticator, TotpAuthenticatorModule, TotpSetup, TotpSetupInput, TotpSetupInterface, TotpSetupModule, TotpVerify, TotpVerifyInput, TotpVerifyLogin, TotpVerifyLoginInput, TotpVerifyLoginModule, TotpVerifyModule, TwoFactorChallenge, TwoFactorChallengeInput, TwoFactorChallengeModule, TwoFactorEnable, TwoFactorEnableInput, TwoFactorEnableModule, TwoFactorService, TwoFactorStatus, TwoFactorStatusInterface, TwoFactorStatusModule, User, UserModule, UserObject, VIEWPORT_COOKIE_NAME, Waitlist, WaitlistInput, WaitlistInterface, WaitlistModule, WaitlistService, WaitlistStats, WaitlistStatsInterface, WaitlistStatsModule, WaitlistStatus, WordDiff, checkPermissions, checkPermissionsFromServer, cn, composeRefs, dismissToast, entityObjectSchema, exists, formatCodiceFiscale, formatDate, formatLocalDate, formatPartitaIva, getBootstrapper, getClientGlobalErrorHandler, getTableComponents, getTableOptions, getValueFromPath, hasBootstrapper, isRemoteImageSrc, rehydrate, rehydrateList, resetBootstrapStore, setBootstrapper, setClientGlobalErrorHandler, showCustomToast, showError, showToast, translateData, translateResponse, tryBootstrap, useComposedRefs, useIsMobile, userObjectSchema, validateCodiceFiscale, validateItalianTaxCode, validatePartitaIva } from './core/index.js';
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- var _chunkTOKHHZSPjs = require('./chunk-TOKHHZSP.js');
21
+ var _chunkOTEDZ6YWjs = require('./chunk-OTEDZ6YW.js');
22
22
 
23
23
 
24
24
 
@@ -216,7 +216,10 @@ var _chunkTOKHHZSPjs = require('./chunk-TOKHHZSP.js');
216
216
 
217
217
 
218
218
 
219
- var _chunkV66AZWPGjs = require('./chunk-V66AZWPG.js');
219
+
220
+
221
+
222
+ var _chunkRTOC53EZjs = require('./chunk-RTOC53EZ.js');
220
223
  require('./chunk-LXKSUWAV.js');
221
224
  require('./chunk-IBS6NI7D.js');
222
225
 
@@ -457,5 +460,8 @@ require('./chunk-7QVYU63E.js');
457
460
 
458
461
 
459
462
 
460
- exports.ACTION_TYPES = _chunkTOKHHZSPjs.ACTION_TYPES; exports.AVAILABLE_OAUTH_SCOPES = _chunkV66AZWPGjs.AVAILABLE_OAUTH_SCOPES; exports.AbstractApiData = _chunkV66AZWPGjs.AbstractApiData; exports.AbstractService = _chunkV66AZWPGjs.AbstractService; exports.Action = _chunkV66AZWPGjs.Action; exports.Assistant = _chunkV66AZWPGjs.Assistant; exports.AssistantAction = _chunkV66AZWPGjs.AssistantAction; exports.AssistantActionModule = _chunkV66AZWPGjs.AssistantActionModule; exports.AssistantActionService = _chunkV66AZWPGjs.AssistantActionService; exports.AssistantMessage = _chunkV66AZWPGjs.AssistantMessage; exports.AssistantMessageModule = _chunkV66AZWPGjs.AssistantMessageModule; exports.AssistantMessageService = _chunkV66AZWPGjs.AssistantMessageService; exports.AssistantModule = _chunkV66AZWPGjs.AssistantModule; exports.AssistantService = _chunkV66AZWPGjs.AssistantService; exports.AuditLog = _chunkV66AZWPGjs.AuditLog; exports.AuditLogModule = _chunkV66AZWPGjs.AuditLogModule; exports.AuditLogService = _chunkV66AZWPGjs.AuditLogService; exports.Auth = _chunkV66AZWPGjs.Auth; exports.AuthComponent = _chunkV66AZWPGjs.AuthComponent; exports.AuthModule = _chunkV66AZWPGjs.AuthModule; exports.AuthService = _chunkV66AZWPGjs.AuthService; exports.AuthorModule = _chunkV66AZWPGjs.AuthorModule; exports.BackupCodeVerify = _chunkV66AZWPGjs.BackupCodeVerify; exports.BackupCodeVerifyModule = _chunkV66AZWPGjs.BackupCodeVerifyModule; exports.Billing = _chunkV66AZWPGjs.Billing; exports.BillingModule = _chunkV66AZWPGjs.BillingModule; exports.BillingService = _chunkV66AZWPGjs.BillingService; exports.BlockNoteDiffUtil = _chunkV66AZWPGjs.BlockNoteDiffUtil; exports.BlockNoteWordDiffRendererUtil = _chunkV66AZWPGjs.BlockNoteWordDiffRendererUtil; exports.COMPANY_ADMINISTRATOR_ROLE_ID = _chunkTOKHHZSPjs.COMPANY_ADMINISTRATOR_ROLE_ID; exports.Chunk = _chunkV66AZWPGjs.Chunk; exports.ChunkModule = _chunkV66AZWPGjs.ChunkModule; exports.ClientAbstractService = _chunkV66AZWPGjs.ClientAbstractService; exports.ClientHttpMethod = _chunkV66AZWPGjs.ClientHttpMethod; exports.Company = _chunkV66AZWPGjs.Company; exports.CompanyFields = _chunkV66AZWPGjs.CompanyFields; exports.CompanyModule = _chunkV66AZWPGjs.CompanyModule; exports.CompanyService = _chunkV66AZWPGjs.CompanyService; exports.Content = _chunkV66AZWPGjs.Content; exports.ContentFields = _chunkV66AZWPGjs.ContentFields; exports.ContentModule = _chunkV66AZWPGjs.ContentModule; exports.ContentService = _chunkV66AZWPGjs.ContentService; exports.DEFAULT_GRANT_TYPES = _chunkV66AZWPGjs.DEFAULT_GRANT_TYPES; exports.DataClass = _chunkFPO4DLZNjs.DataClassRegistry; exports.DataClassRegistry = _chunkFPO4DLZNjs.DataClassRegistry; exports.EndpointCreator = _chunkV66AZWPGjs.EndpointCreator; exports.EntityAiStatus = _chunkV66AZWPGjs.EntityAiStatus; exports.Feature = _chunkV66AZWPGjs.Feature; exports.FeatureModule = _chunkV66AZWPGjs.FeatureModule; exports.FeatureService = _chunkV66AZWPGjs.FeatureService; exports.HowTo = _chunkV66AZWPGjs.HowTo; exports.HowToFields = _chunkV66AZWPGjs.HowToFields; exports.HowToModule = _chunkV66AZWPGjs.HowToModule; exports.HowToService = _chunkV66AZWPGjs.HowToService; exports.HttpMethod = _chunkV66AZWPGjs.HttpMethod; exports.InvoiceStatus = _chunkV66AZWPGjs.InvoiceStatus; exports.JsonApiDataFactory = _chunkFPO4DLZNjs.JsonApiDataFactory; exports.MOBILE_BREAKPOINT = _chunkV66AZWPGjs.MOBILE_BREAKPOINT; exports.Module = _chunkV66AZWPGjs.Module; exports.ModuleModule = _chunkV66AZWPGjs.ModuleModule; exports.ModulePaths = _chunkV66AZWPGjs.ModulePaths; exports.ModulePathsModule = _chunkV66AZWPGjs.ModulePathsModule; exports.ModuleRegistrar = _chunkV66AZWPGjs.ModuleRegistrar; exports.ModuleRegistry = _chunkV66AZWPGjs.ModuleRegistry; exports.Modules = _chunkV66AZWPGjs.Modules; exports.Notification = _chunkV66AZWPGjs.Notification; exports.NotificationFields = _chunkV66AZWPGjs.NotificationFields; exports.NotificationModule = _chunkV66AZWPGjs.NotificationModule; exports.NotificationService = _chunkV66AZWPGjs.NotificationService; exports.OAUTH_SCOPE_DISPLAY = _chunkV66AZWPGjs.OAUTH_SCOPE_DISPLAY; exports.OAuthClient = _chunkV66AZWPGjs.OAuthClient; exports.OAuthModule = _chunkV66AZWPGjs.OAuthModule; exports.OAuthService = _chunkV66AZWPGjs.OAuthService; exports.Passkey = _chunkV66AZWPGjs.Passkey; exports.PasskeyAuthenticationOptions = _chunkV66AZWPGjs.PasskeyAuthenticationOptions; exports.PasskeyAuthenticationOptionsModule = _chunkV66AZWPGjs.PasskeyAuthenticationOptionsModule; exports.PasskeyModule = _chunkV66AZWPGjs.PasskeyModule; exports.PasskeyRegistrationOptions = _chunkV66AZWPGjs.PasskeyRegistrationOptions; exports.PasskeyRegistrationOptionsModule = _chunkV66AZWPGjs.PasskeyRegistrationOptionsModule; exports.PasskeyRegistrationVerify = _chunkV66AZWPGjs.PasskeyRegistrationVerify; exports.PasskeyRegistrationVerifyModule = _chunkV66AZWPGjs.PasskeyRegistrationVerifyModule; exports.PasskeyRename = _chunkV66AZWPGjs.PasskeyRename; exports.PasskeyRenameModule = _chunkV66AZWPGjs.PasskeyRenameModule; exports.PasskeyVerifyLogin = _chunkV66AZWPGjs.PasskeyVerifyLogin; exports.PasskeyVerifyLoginModule = _chunkV66AZWPGjs.PasskeyVerifyLoginModule; exports.PaymentMethod = _chunkV66AZWPGjs.PaymentMethod; exports.PermissionMapping = _chunkV66AZWPGjs.PermissionMapping; exports.PermissionMappingModule = _chunkV66AZWPGjs.PermissionMappingModule; exports.Push = _chunkV66AZWPGjs.Push; exports.PushModule = _chunkV66AZWPGjs.PushModule; exports.PushService = _chunkV66AZWPGjs.PushService; exports.RbacMatrixModel = _chunkV66AZWPGjs.RbacMatrixModel; exports.RbacMatrixModule = _chunkV66AZWPGjs.RbacMatrixModule; exports.RbacService = _chunkTOKHHZSPjs.RbacService; exports.ReferralModule = _chunkV66AZWPGjs.ReferralModule; exports.ReferralService = _chunkV66AZWPGjs.ReferralService; exports.ReferralStats = _chunkV66AZWPGjs.ReferralStats; exports.ReferralStatsModule = _chunkV66AZWPGjs.ReferralStatsModule; exports.RehydrationFactory = _chunkV66AZWPGjs.RehydrationFactory; exports.Role = _chunkV66AZWPGjs.Role; exports.RoleFields = _chunkV66AZWPGjs.RoleFields; exports.RoleModule = _chunkV66AZWPGjs.RoleModule; exports.RoleService = _chunkV66AZWPGjs.RoleService; exports.S3 = _chunkV66AZWPGjs.S3; exports.S3Module = _chunkV66AZWPGjs.S3Module; exports.S3Service = _chunkV66AZWPGjs.S3Service; exports.StripeCustomer = _chunkV66AZWPGjs.StripeCustomer; exports.StripeCustomerModule = _chunkV66AZWPGjs.StripeCustomerModule; exports.StripeCustomerService = _chunkV66AZWPGjs.StripeCustomerService; exports.StripeInvoice = _chunkV66AZWPGjs.StripeInvoice; exports.StripeInvoiceModule = _chunkV66AZWPGjs.StripeInvoiceModule; exports.StripeInvoiceService = _chunkV66AZWPGjs.StripeInvoiceService; exports.StripePaymentMethodModule = _chunkV66AZWPGjs.StripePaymentMethodModule; exports.StripePrice = _chunkV66AZWPGjs.StripePrice; exports.StripePriceModule = _chunkV66AZWPGjs.StripePriceModule; exports.StripePriceService = _chunkV66AZWPGjs.StripePriceService; exports.StripeProduct = _chunkV66AZWPGjs.StripeProduct; exports.StripeProductModule = _chunkV66AZWPGjs.StripeProductModule; exports.StripeProductService = _chunkV66AZWPGjs.StripeProductService; exports.StripePromotionCode = _chunkV66AZWPGjs.StripePromotionCode; exports.StripePromotionCodeModule = _chunkV66AZWPGjs.StripePromotionCodeModule; exports.StripePromotionCodeService = _chunkV66AZWPGjs.StripePromotionCodeService; exports.StripeSubscription = _chunkV66AZWPGjs.StripeSubscription; exports.StripeSubscriptionModule = _chunkV66AZWPGjs.StripeSubscriptionModule; exports.StripeSubscriptionService = _chunkV66AZWPGjs.StripeSubscriptionService; exports.StripeUsage = _chunkV66AZWPGjs.StripeUsage; exports.StripeUsageModule = _chunkV66AZWPGjs.StripeUsageModule; exports.StripeUsageService = _chunkV66AZWPGjs.StripeUsageService; exports.SubscriptionStatus = _chunkV66AZWPGjs.SubscriptionStatus; exports.TableOptions = _chunkV66AZWPGjs.TableOptions; exports.TokenUsageAdminBreakdownModule = _chunkV66AZWPGjs.TokenUsageAdminBreakdownModule; exports.TokenUsageAdminSummaryModule = _chunkV66AZWPGjs.TokenUsageAdminSummaryModule; exports.TokenUsageAdminTimelineModule = _chunkV66AZWPGjs.TokenUsageAdminTimelineModule; exports.TotpAuthenticator = _chunkV66AZWPGjs.TotpAuthenticator; exports.TotpAuthenticatorModule = _chunkV66AZWPGjs.TotpAuthenticatorModule; exports.TotpSetup = _chunkV66AZWPGjs.TotpSetup; exports.TotpSetupModule = _chunkV66AZWPGjs.TotpSetupModule; exports.TotpVerify = _chunkV66AZWPGjs.TotpVerify; exports.TotpVerifyLogin = _chunkV66AZWPGjs.TotpVerifyLogin; exports.TotpVerifyLoginModule = _chunkV66AZWPGjs.TotpVerifyLoginModule; exports.TotpVerifyModule = _chunkV66AZWPGjs.TotpVerifyModule; exports.TwoFactorChallenge = _chunkV66AZWPGjs.TwoFactorChallenge; exports.TwoFactorChallengeModule = _chunkV66AZWPGjs.TwoFactorChallengeModule; exports.TwoFactorEnable = _chunkV66AZWPGjs.TwoFactorEnable; exports.TwoFactorEnableModule = _chunkV66AZWPGjs.TwoFactorEnableModule; exports.TwoFactorService = _chunkV66AZWPGjs.TwoFactorService; exports.TwoFactorStatus = _chunkV66AZWPGjs.TwoFactorStatus; exports.TwoFactorStatusModule = _chunkV66AZWPGjs.TwoFactorStatusModule; exports.User = _chunkV66AZWPGjs.User; exports.UserFields = _chunkV66AZWPGjs.UserFields; exports.UserModule = _chunkV66AZWPGjs.UserModule; exports.UserService = _chunkV66AZWPGjs.UserService; exports.VIEWPORT_COOKIE_NAME = _chunkV66AZWPGjs.VIEWPORT_COOKIE_NAME; exports.Waitlist = _chunkV66AZWPGjs.Waitlist; exports.WaitlistModule = _chunkV66AZWPGjs.WaitlistModule; exports.WaitlistService = _chunkV66AZWPGjs.WaitlistService; exports.WaitlistStats = _chunkV66AZWPGjs.WaitlistStats; exports.WaitlistStatsModule = _chunkV66AZWPGjs.WaitlistStatsModule; exports.checkPermissions = _chunkV66AZWPGjs.checkPermissions; exports.checkPermissionsFromServer = _chunkV66AZWPGjs.checkPermissionsFromServer; exports.clearLastApiMeta = _chunkV66AZWPGjs.clearLastApiMeta; exports.clearLastApiTotal = _chunkV66AZWPGjs.clearLastApiTotal; exports.cn = _chunkV66AZWPGjs.cn; exports.composeRefs = _chunkV66AZWPGjs.composeRefs; exports.configureAuth = _chunkV66AZWPGjs.configureAuth; exports.configureI18n = _chunkTOKHHZSPjs.configureI18n; exports.configureJsonApi = _chunkTOKHHZSPjs.configureJsonApi; exports.configureLogin = _chunkTOKHHZSPjs.configureLogin; exports.configureReferral = _chunkTOKHHZSPjs.configureReferral; exports.configureRoles = _chunkTOKHHZSPjs.configureRoles; exports.configureWaitlist = _chunkTOKHHZSPjs.configureWaitlist; exports.createJsonApiInclusion = _chunkV66AZWPGjs.createJsonApiInclusion; exports.dismissToast = _chunkV66AZWPGjs.dismissToast; exports.entityObjectSchema = _chunkV66AZWPGjs.entityObjectSchema; exports.exists = _chunkV66AZWPGjs.exists; exports.formatCodiceFiscale = _chunkV66AZWPGjs.formatCodiceFiscale; exports.formatDate = _chunkV66AZWPGjs.formatDate; exports.formatLocalDate = _chunkV66AZWPGjs.formatLocalDate; exports.formatPartitaIva = _chunkV66AZWPGjs.formatPartitaIva; exports.getApiUrl = _chunkTOKHHZSPjs.getApiUrl; exports.getAppUrl = _chunkTOKHHZSPjs.getAppUrl; exports.getBootstrapper = _chunkFPO4DLZNjs.getBootstrapper; exports.getClientGlobalErrorHandler = _chunkV66AZWPGjs.getClientGlobalErrorHandler; exports.getGlobalErrorHandler = _chunkV66AZWPGjs.getGlobalErrorHandler; exports.getIcon = _chunkV66AZWPGjs.getIcon; exports.getIconByModule = _chunkV66AZWPGjs.getIconByModule; exports.getIconByModuleName = _chunkV66AZWPGjs.getIconByModuleName; exports.getInitials = _chunkV66AZWPGjs.getInitials; exports.getLastApiMeta = _chunkV66AZWPGjs.getLastApiMeta; exports.getLastApiTotal = _chunkV66AZWPGjs.getLastApiTotal; exports.getLucideIcon = _chunkV66AZWPGjs.getLucideIcon; exports.getLucideIconByModule = _chunkV66AZWPGjs.getLucideIconByModule; exports.getLucideIconByModuleName = _chunkV66AZWPGjs.getLucideIconByModuleName; exports.getPublicApiUrl = _chunkTOKHHZSPjs.getPublicApiUrl; exports.getReferralConfig = _chunkTOKHHZSPjs.getReferralConfig; exports.getRoleId = _chunkTOKHHZSPjs.getRoleId; exports.getStripePublishableKey = _chunkTOKHHZSPjs.getStripePublishableKey; exports.getTableComponents = _chunkV66AZWPGjs.getTableComponents; exports.getTableOptions = _chunkV66AZWPGjs.getTableOptions; exports.getTokenHandler = _chunkV66AZWPGjs.getTokenHandler; exports.getTrackablePages = _chunkTOKHHZSPjs.getTrackablePages; exports.getValueFromPath = _chunkV66AZWPGjs.getValueFromPath; exports.getWaitlistConfig = _chunkTOKHHZSPjs.getWaitlistConfig; exports.hasBootstrapper = _chunkFPO4DLZNjs.hasBootstrapper; exports.isReferralEnabled = _chunkTOKHHZSPjs.isReferralEnabled; exports.isRemoteImageSrc = _chunkV66AZWPGjs.isRemoteImageSrc; exports.isRolesConfigured = _chunkTOKHHZSPjs.isRolesConfigured; exports.rehydrate = _chunkV66AZWPGjs.rehydrate; exports.rehydrateList = _chunkV66AZWPGjs.rehydrateList; exports.resetBootstrapStore = _chunkFPO4DLZNjs.resetBootstrapStore; exports.setBootstrapper = _chunkFPO4DLZNjs.setBootstrapper; exports.setClientGlobalErrorHandler = _chunkV66AZWPGjs.setClientGlobalErrorHandler; exports.setGlobalErrorHandler = _chunkV66AZWPGjs.setGlobalErrorHandler; exports.showCustomToast = _chunkV66AZWPGjs.showCustomToast; exports.showError = _chunkV66AZWPGjs.showError; exports.showToast = _chunkV66AZWPGjs.showToast; exports.translateData = _chunkFPO4DLZNjs.translateData; exports.translateResponse = _chunkFPO4DLZNjs.translateResponse; exports.tryBootstrap = _chunkFPO4DLZNjs.tryBootstrap; exports.useComposedRefs = _chunkV66AZWPGjs.useComposedRefs; exports.useIsMobile = _chunkV66AZWPGjs.useIsMobile; exports.userObjectSchema = _chunkV66AZWPGjs.userObjectSchema; exports.validateCodiceFiscale = _chunkV66AZWPGjs.validateCodiceFiscale; exports.validateItalianTaxCode = _chunkV66AZWPGjs.validateItalianTaxCode; exports.validatePartitaIva = _chunkV66AZWPGjs.validatePartitaIva;
463
+
464
+
465
+
466
+ exports.ACTION_TYPES = _chunkOTEDZ6YWjs.ACTION_TYPES; exports.AVAILABLE_OAUTH_SCOPES = _chunkRTOC53EZjs.AVAILABLE_OAUTH_SCOPES; exports.AbstractApiData = _chunkRTOC53EZjs.AbstractApiData; exports.AbstractService = _chunkRTOC53EZjs.AbstractService; exports.Action = _chunkRTOC53EZjs.Action; exports.Assistant = _chunkRTOC53EZjs.Assistant; exports.AssistantAction = _chunkRTOC53EZjs.AssistantAction; exports.AssistantActionModule = _chunkRTOC53EZjs.AssistantActionModule; exports.AssistantActionService = _chunkRTOC53EZjs.AssistantActionService; exports.AssistantMessage = _chunkRTOC53EZjs.AssistantMessage; exports.AssistantMessageModule = _chunkRTOC53EZjs.AssistantMessageModule; exports.AssistantMessageService = _chunkRTOC53EZjs.AssistantMessageService; exports.AssistantModule = _chunkRTOC53EZjs.AssistantModule; exports.AssistantService = _chunkRTOC53EZjs.AssistantService; exports.AuditLog = _chunkRTOC53EZjs.AuditLog; exports.AuditLogModule = _chunkRTOC53EZjs.AuditLogModule; exports.AuditLogService = _chunkRTOC53EZjs.AuditLogService; exports.Auth = _chunkRTOC53EZjs.Auth; exports.AuthComponent = _chunkRTOC53EZjs.AuthComponent; exports.AuthModule = _chunkRTOC53EZjs.AuthModule; exports.AuthService = _chunkRTOC53EZjs.AuthService; exports.AuthorModule = _chunkRTOC53EZjs.AuthorModule; exports.BackupCodeVerify = _chunkRTOC53EZjs.BackupCodeVerify; exports.BackupCodeVerifyModule = _chunkRTOC53EZjs.BackupCodeVerifyModule; exports.Billing = _chunkRTOC53EZjs.Billing; exports.BillingModule = _chunkRTOC53EZjs.BillingModule; exports.BillingService = _chunkRTOC53EZjs.BillingService; exports.BlockNoteDiffUtil = _chunkRTOC53EZjs.BlockNoteDiffUtil; exports.BlockNoteWordDiffRendererUtil = _chunkRTOC53EZjs.BlockNoteWordDiffRendererUtil; exports.COMPANY_ADMINISTRATOR_ROLE_ID = _chunkOTEDZ6YWjs.COMPANY_ADMINISTRATOR_ROLE_ID; exports.Chunk = _chunkRTOC53EZjs.Chunk; exports.ChunkModule = _chunkRTOC53EZjs.ChunkModule; exports.ClientAbstractService = _chunkRTOC53EZjs.ClientAbstractService; exports.ClientHttpMethod = _chunkRTOC53EZjs.ClientHttpMethod; exports.Company = _chunkRTOC53EZjs.Company; exports.CompanyFields = _chunkRTOC53EZjs.CompanyFields; exports.CompanyModule = _chunkRTOC53EZjs.CompanyModule; exports.CompanyService = _chunkRTOC53EZjs.CompanyService; exports.Content = _chunkRTOC53EZjs.Content; exports.ContentFields = _chunkRTOC53EZjs.ContentFields; exports.ContentModule = _chunkRTOC53EZjs.ContentModule; exports.ContentService = _chunkRTOC53EZjs.ContentService; exports.DEFAULT_GRANT_TYPES = _chunkRTOC53EZjs.DEFAULT_GRANT_TYPES; exports.DataClass = _chunkFPO4DLZNjs.DataClassRegistry; exports.DataClassRegistry = _chunkFPO4DLZNjs.DataClassRegistry; exports.EndpointCreator = _chunkRTOC53EZjs.EndpointCreator; exports.EntityAiStatus = _chunkRTOC53EZjs.EntityAiStatus; exports.Feature = _chunkRTOC53EZjs.Feature; exports.FeatureModule = _chunkRTOC53EZjs.FeatureModule; exports.FeatureService = _chunkRTOC53EZjs.FeatureService; exports.HowTo = _chunkRTOC53EZjs.HowTo; exports.HowToFields = _chunkRTOC53EZjs.HowToFields; exports.HowToModule = _chunkRTOC53EZjs.HowToModule; exports.HowToService = _chunkRTOC53EZjs.HowToService; exports.HttpMethod = _chunkRTOC53EZjs.HttpMethod; exports.InvoiceStatus = _chunkRTOC53EZjs.InvoiceStatus; exports.JsonApiDataFactory = _chunkFPO4DLZNjs.JsonApiDataFactory; exports.MOBILE_BREAKPOINT = _chunkRTOC53EZjs.MOBILE_BREAKPOINT; exports.Module = _chunkRTOC53EZjs.Module; exports.ModuleModule = _chunkRTOC53EZjs.ModuleModule; exports.ModulePaths = _chunkRTOC53EZjs.ModulePaths; exports.ModulePathsModule = _chunkRTOC53EZjs.ModulePathsModule; exports.ModuleRegistrar = _chunkRTOC53EZjs.ModuleRegistrar; exports.ModuleRegistry = _chunkRTOC53EZjs.ModuleRegistry; exports.Modules = _chunkRTOC53EZjs.Modules; exports.Notification = _chunkRTOC53EZjs.Notification; exports.NotificationFields = _chunkRTOC53EZjs.NotificationFields; exports.NotificationModule = _chunkRTOC53EZjs.NotificationModule; exports.NotificationService = _chunkRTOC53EZjs.NotificationService; exports.OAUTH_SCOPE_DISPLAY = _chunkRTOC53EZjs.OAUTH_SCOPE_DISPLAY; exports.OAuthClient = _chunkRTOC53EZjs.OAuthClient; exports.OAuthModule = _chunkRTOC53EZjs.OAuthModule; exports.OAuthService = _chunkRTOC53EZjs.OAuthService; exports.Passkey = _chunkRTOC53EZjs.Passkey; exports.PasskeyAuthenticationOptions = _chunkRTOC53EZjs.PasskeyAuthenticationOptions; exports.PasskeyAuthenticationOptionsModule = _chunkRTOC53EZjs.PasskeyAuthenticationOptionsModule; exports.PasskeyModule = _chunkRTOC53EZjs.PasskeyModule; exports.PasskeyRegistrationOptions = _chunkRTOC53EZjs.PasskeyRegistrationOptions; exports.PasskeyRegistrationOptionsModule = _chunkRTOC53EZjs.PasskeyRegistrationOptionsModule; exports.PasskeyRegistrationVerify = _chunkRTOC53EZjs.PasskeyRegistrationVerify; exports.PasskeyRegistrationVerifyModule = _chunkRTOC53EZjs.PasskeyRegistrationVerifyModule; exports.PasskeyRename = _chunkRTOC53EZjs.PasskeyRename; exports.PasskeyRenameModule = _chunkRTOC53EZjs.PasskeyRenameModule; exports.PasskeyVerifyLogin = _chunkRTOC53EZjs.PasskeyVerifyLogin; exports.PasskeyVerifyLoginModule = _chunkRTOC53EZjs.PasskeyVerifyLoginModule; exports.PaymentMethod = _chunkRTOC53EZjs.PaymentMethod; exports.PermissionMapping = _chunkRTOC53EZjs.PermissionMapping; exports.PermissionMappingModule = _chunkRTOC53EZjs.PermissionMappingModule; exports.Push = _chunkRTOC53EZjs.Push; exports.PushModule = _chunkRTOC53EZjs.PushModule; exports.PushService = _chunkRTOC53EZjs.PushService; exports.RbacMatrixModel = _chunkRTOC53EZjs.RbacMatrixModel; exports.RbacMatrixModule = _chunkRTOC53EZjs.RbacMatrixModule; exports.RbacService = _chunkOTEDZ6YWjs.RbacService; exports.ReferralModule = _chunkRTOC53EZjs.ReferralModule; exports.ReferralService = _chunkRTOC53EZjs.ReferralService; exports.ReferralStats = _chunkRTOC53EZjs.ReferralStats; exports.ReferralStatsModule = _chunkRTOC53EZjs.ReferralStatsModule; exports.RehydrationFactory = _chunkRTOC53EZjs.RehydrationFactory; exports.Role = _chunkRTOC53EZjs.Role; exports.RoleFields = _chunkRTOC53EZjs.RoleFields; exports.RoleModule = _chunkRTOC53EZjs.RoleModule; exports.RoleService = _chunkRTOC53EZjs.RoleService; exports.S3 = _chunkRTOC53EZjs.S3; exports.S3Module = _chunkRTOC53EZjs.S3Module; exports.S3Service = _chunkRTOC53EZjs.S3Service; exports.StripeCustomer = _chunkRTOC53EZjs.StripeCustomer; exports.StripeCustomerModule = _chunkRTOC53EZjs.StripeCustomerModule; exports.StripeCustomerService = _chunkRTOC53EZjs.StripeCustomerService; exports.StripeInvoice = _chunkRTOC53EZjs.StripeInvoice; exports.StripeInvoiceModule = _chunkRTOC53EZjs.StripeInvoiceModule; exports.StripeInvoiceService = _chunkRTOC53EZjs.StripeInvoiceService; exports.StripePaymentMethodModule = _chunkRTOC53EZjs.StripePaymentMethodModule; exports.StripePrice = _chunkRTOC53EZjs.StripePrice; exports.StripePriceModule = _chunkRTOC53EZjs.StripePriceModule; exports.StripePriceService = _chunkRTOC53EZjs.StripePriceService; exports.StripeProduct = _chunkRTOC53EZjs.StripeProduct; exports.StripeProductModule = _chunkRTOC53EZjs.StripeProductModule; exports.StripeProductService = _chunkRTOC53EZjs.StripeProductService; exports.StripePromotionCode = _chunkRTOC53EZjs.StripePromotionCode; exports.StripePromotionCodeModule = _chunkRTOC53EZjs.StripePromotionCodeModule; exports.StripePromotionCodeService = _chunkRTOC53EZjs.StripePromotionCodeService; exports.StripeSubscription = _chunkRTOC53EZjs.StripeSubscription; exports.StripeSubscriptionModule = _chunkRTOC53EZjs.StripeSubscriptionModule; exports.StripeSubscriptionService = _chunkRTOC53EZjs.StripeSubscriptionService; exports.StripeUsage = _chunkRTOC53EZjs.StripeUsage; exports.StripeUsageModule = _chunkRTOC53EZjs.StripeUsageModule; exports.StripeUsageService = _chunkRTOC53EZjs.StripeUsageService; exports.SubscriptionStatus = _chunkRTOC53EZjs.SubscriptionStatus; exports.TableOptions = _chunkRTOC53EZjs.TableOptions; exports.TokenUsageAdminBreakdownModule = _chunkRTOC53EZjs.TokenUsageAdminBreakdownModule; exports.TokenUsageAdminSummaryModule = _chunkRTOC53EZjs.TokenUsageAdminSummaryModule; exports.TokenUsageAdminTimelineModule = _chunkRTOC53EZjs.TokenUsageAdminTimelineModule; exports.TotpAuthenticator = _chunkRTOC53EZjs.TotpAuthenticator; exports.TotpAuthenticatorModule = _chunkRTOC53EZjs.TotpAuthenticatorModule; exports.TotpSetup = _chunkRTOC53EZjs.TotpSetup; exports.TotpSetupModule = _chunkRTOC53EZjs.TotpSetupModule; exports.TotpVerify = _chunkRTOC53EZjs.TotpVerify; exports.TotpVerifyLogin = _chunkRTOC53EZjs.TotpVerifyLogin; exports.TotpVerifyLoginModule = _chunkRTOC53EZjs.TotpVerifyLoginModule; exports.TotpVerifyModule = _chunkRTOC53EZjs.TotpVerifyModule; exports.TwoFactorChallenge = _chunkRTOC53EZjs.TwoFactorChallenge; exports.TwoFactorChallengeModule = _chunkRTOC53EZjs.TwoFactorChallengeModule; exports.TwoFactorEnable = _chunkRTOC53EZjs.TwoFactorEnable; exports.TwoFactorEnableModule = _chunkRTOC53EZjs.TwoFactorEnableModule; exports.TwoFactorService = _chunkRTOC53EZjs.TwoFactorService; exports.TwoFactorStatus = _chunkRTOC53EZjs.TwoFactorStatus; exports.TwoFactorStatusModule = _chunkRTOC53EZjs.TwoFactorStatusModule; exports.User = _chunkRTOC53EZjs.User; exports.UserFields = _chunkRTOC53EZjs.UserFields; exports.UserModule = _chunkRTOC53EZjs.UserModule; exports.UserService = _chunkRTOC53EZjs.UserService; exports.VIEWPORT_COOKIE_NAME = _chunkRTOC53EZjs.VIEWPORT_COOKIE_NAME; exports.Waitlist = _chunkRTOC53EZjs.Waitlist; exports.WaitlistModule = _chunkRTOC53EZjs.WaitlistModule; exports.WaitlistService = _chunkRTOC53EZjs.WaitlistService; exports.WaitlistStats = _chunkRTOC53EZjs.WaitlistStats; exports.WaitlistStatsModule = _chunkRTOC53EZjs.WaitlistStatsModule; exports.checkPermissions = _chunkRTOC53EZjs.checkPermissions; exports.checkPermissionsFromServer = _chunkRTOC53EZjs.checkPermissionsFromServer; exports.clearLastApiMeta = _chunkRTOC53EZjs.clearLastApiMeta; exports.clearLastApiTotal = _chunkRTOC53EZjs.clearLastApiTotal; exports.cn = _chunkRTOC53EZjs.cn; exports.composeRefs = _chunkRTOC53EZjs.composeRefs; exports.configureAuth = _chunkRTOC53EZjs.configureAuth; exports.configureI18n = _chunkOTEDZ6YWjs.configureI18n; exports.configureJsonApi = _chunkOTEDZ6YWjs.configureJsonApi; exports.configureLogin = _chunkOTEDZ6YWjs.configureLogin; exports.configureReferral = _chunkOTEDZ6YWjs.configureReferral; exports.configureRoles = _chunkOTEDZ6YWjs.configureRoles; exports.configureTokenUsage = _chunkRTOC53EZjs.configureTokenUsage; exports.configureWaitlist = _chunkOTEDZ6YWjs.configureWaitlist; exports.createJsonApiInclusion = _chunkRTOC53EZjs.createJsonApiInclusion; exports.dismissToast = _chunkRTOC53EZjs.dismissToast; exports.entityObjectSchema = _chunkRTOC53EZjs.entityObjectSchema; exports.exists = _chunkRTOC53EZjs.exists; exports.formatCodiceFiscale = _chunkRTOC53EZjs.formatCodiceFiscale; exports.formatDate = _chunkRTOC53EZjs.formatDate; exports.formatLocalDate = _chunkRTOC53EZjs.formatLocalDate; exports.formatPartitaIva = _chunkRTOC53EZjs.formatPartitaIva; exports.getApiUrl = _chunkOTEDZ6YWjs.getApiUrl; exports.getAppUrl = _chunkOTEDZ6YWjs.getAppUrl; exports.getBootstrapper = _chunkFPO4DLZNjs.getBootstrapper; exports.getClientGlobalErrorHandler = _chunkRTOC53EZjs.getClientGlobalErrorHandler; exports.getGlobalErrorHandler = _chunkRTOC53EZjs.getGlobalErrorHandler; exports.getIcon = _chunkRTOC53EZjs.getIcon; exports.getIconByModule = _chunkRTOC53EZjs.getIconByModule; exports.getIconByModuleName = _chunkRTOC53EZjs.getIconByModuleName; exports.getInitials = _chunkRTOC53EZjs.getInitials; exports.getLastApiMeta = _chunkRTOC53EZjs.getLastApiMeta; exports.getLastApiTotal = _chunkRTOC53EZjs.getLastApiTotal; exports.getLucideIcon = _chunkRTOC53EZjs.getLucideIcon; exports.getLucideIconByModule = _chunkRTOC53EZjs.getLucideIconByModule; exports.getLucideIconByModuleName = _chunkRTOC53EZjs.getLucideIconByModuleName; exports.getPublicApiUrl = _chunkOTEDZ6YWjs.getPublicApiUrl; exports.getReferralConfig = _chunkOTEDZ6YWjs.getReferralConfig; exports.getRoleId = _chunkOTEDZ6YWjs.getRoleId; exports.getStripePublishableKey = _chunkOTEDZ6YWjs.getStripePublishableKey; exports.getTableComponents = _chunkRTOC53EZjs.getTableComponents; exports.getTableOptions = _chunkRTOC53EZjs.getTableOptions; exports.getTokenHandler = _chunkRTOC53EZjs.getTokenHandler; exports.getTokenUsageCurrency = _chunkRTOC53EZjs.getTokenUsageCurrency; exports.getTrackablePages = _chunkOTEDZ6YWjs.getTrackablePages; exports.getValueFromPath = _chunkRTOC53EZjs.getValueFromPath; exports.getWaitlistConfig = _chunkOTEDZ6YWjs.getWaitlistConfig; exports.hasBootstrapper = _chunkFPO4DLZNjs.hasBootstrapper; exports.isReferralEnabled = _chunkOTEDZ6YWjs.isReferralEnabled; exports.isRemoteImageSrc = _chunkRTOC53EZjs.isRemoteImageSrc; exports.isRolesConfigured = _chunkOTEDZ6YWjs.isRolesConfigured; exports.rehydrate = _chunkRTOC53EZjs.rehydrate; exports.rehydrateList = _chunkRTOC53EZjs.rehydrateList; exports.resetBootstrapStore = _chunkFPO4DLZNjs.resetBootstrapStore; exports.setBootstrapper = _chunkFPO4DLZNjs.setBootstrapper; exports.setClientGlobalErrorHandler = _chunkRTOC53EZjs.setClientGlobalErrorHandler; exports.setGlobalErrorHandler = _chunkRTOC53EZjs.setGlobalErrorHandler; exports.showCustomToast = _chunkRTOC53EZjs.showCustomToast; exports.showError = _chunkRTOC53EZjs.showError; exports.showToast = _chunkRTOC53EZjs.showToast; exports.tokenUsageModules = _chunkRTOC53EZjs.tokenUsageModules; exports.translateData = _chunkFPO4DLZNjs.translateData; exports.translateResponse = _chunkFPO4DLZNjs.translateResponse; exports.tryBootstrap = _chunkFPO4DLZNjs.tryBootstrap; exports.useComposedRefs = _chunkRTOC53EZjs.useComposedRefs; exports.useIsMobile = _chunkRTOC53EZjs.useIsMobile; exports.userObjectSchema = _chunkRTOC53EZjs.userObjectSchema; exports.validateCodiceFiscale = _chunkRTOC53EZjs.validateCodiceFiscale; exports.validateItalianTaxCode = _chunkRTOC53EZjs.validateItalianTaxCode; exports.validatePartitaIva = _chunkRTOC53EZjs.validatePartitaIva;
461
467
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,y6aAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/index.js"}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/index.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qnbAAC","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/index.js"}
package/dist/index.mjs CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  getWaitlistConfig,
19
19
  isReferralEnabled,
20
20
  isRolesConfigured
21
- } from "./chunk-3LVSA7IM.mjs";
21
+ } from "./chunk-DJWNNV52.mjs";
22
22
  import {
23
23
  AVAILABLE_OAUTH_SCOPES,
24
24
  AbstractApiData,
@@ -179,6 +179,7 @@ import {
179
179
  cn,
180
180
  composeRefs,
181
181
  configureAuth,
182
+ configureTokenUsage,
182
183
  createJsonApiInclusion,
183
184
  dismissToast,
184
185
  entityObjectSchema,
@@ -201,6 +202,7 @@ import {
201
202
  getTableComponents,
202
203
  getTableOptions,
203
204
  getTokenHandler,
205
+ getTokenUsageCurrency,
204
206
  getValueFromPath,
205
207
  isRemoteImageSrc,
206
208
  rehydrate,
@@ -210,13 +212,14 @@ import {
210
212
  showCustomToast,
211
213
  showError,
212
214
  showToast,
215
+ tokenUsageModules,
213
216
  useComposedRefs,
214
217
  useIsMobile,
215
218
  userObjectSchema,
216
219
  validateCodiceFiscale,
217
220
  validateItalianTaxCode,
218
221
  validatePartitaIva
219
- } from "./chunk-LCCRUWWY.mjs";
222
+ } from "./chunk-FS4RVV3K.mjs";
220
223
  import "./chunk-AUXK7QSA.mjs";
221
224
  import "./chunk-C7C7VY4F.mjs";
222
225
  import {
@@ -402,6 +405,7 @@ export {
402
405
  configureLogin,
403
406
  configureReferral,
404
407
  configureRoles,
408
+ configureTokenUsage,
405
409
  configureWaitlist,
406
410
  createJsonApiInclusion,
407
411
  dismissToast,
@@ -432,6 +436,7 @@ export {
432
436
  getTableComponents,
433
437
  getTableOptions,
434
438
  getTokenHandler,
439
+ getTokenUsageCurrency,
435
440
  getTrackablePages,
436
441
  getValueFromPath,
437
442
  getWaitlistConfig,
@@ -448,6 +453,7 @@ export {
448
453
  showCustomToast,
449
454
  showError,
450
455
  showToast,
456
+ tokenUsageModules,
451
457
  translateData,
452
458
  translateResponse,
453
459
  tryBootstrap,
@@ -15,7 +15,7 @@ var _chunkIOLU4ASDjs = require('../chunk-IOLU4ASD.js');
15
15
 
16
16
 
17
17
 
18
- var _chunkV66AZWPGjs = require('../chunk-V66AZWPG.js');
18
+ var _chunkRTOC53EZjs = require('../chunk-RTOC53EZ.js');
19
19
  require('../chunk-LXKSUWAV.js');
20
20
  require('../chunk-IBS6NI7D.js');
21
21
 
@@ -86,7 +86,7 @@ var ServerSession = class {
86
86
  if (!rawModules) return false;
87
87
  const modules = JSON.parse(_pako.ungzip.call(void 0, Buffer.from(rawModules, "base64"), { toText: true }));
88
88
  const selectedModule = modules.find((module) => module.id === params.module.moduleId);
89
- return _chunkV66AZWPGjs.checkPermissionsFromServer.call(void 0, {
89
+ return _chunkRTOC53EZjs.checkPermissionsFromServer.call(void 0, {
90
90
  module: params.module,
91
91
  action: params.action,
92
92
  data: params.data,
@@ -296,5 +296,5 @@ _chunk7QVYU63Ejs.__name.call(void 0, ServerJsonApiDelete, "ServerJsonApiDelete")
296
296
 
297
297
 
298
298
 
299
- exports.ServerAuthService = _chunkV66AZWPGjs.AuthService; exports.ServerCompanyService = _chunkV66AZWPGjs.CompanyService; exports.ServerContentService = _chunkV66AZWPGjs.ContentService; exports.ServerFeatureService = _chunkV66AZWPGjs.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunkV66AZWPGjs.NotificationService; exports.ServerPushService = _chunkV66AZWPGjs.PushService; exports.ServerRoleService = _chunkV66AZWPGjs.RoleService; exports.ServerS3Service = _chunkV66AZWPGjs.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunkV66AZWPGjs.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
299
+ exports.ServerAuthService = _chunkRTOC53EZjs.AuthService; exports.ServerCompanyService = _chunkRTOC53EZjs.CompanyService; exports.ServerContentService = _chunkRTOC53EZjs.ContentService; exports.ServerFeatureService = _chunkRTOC53EZjs.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunkRTOC53EZjs.NotificationService; exports.ServerPushService = _chunkRTOC53EZjs.PushService; exports.ServerRoleService = _chunkRTOC53EZjs.RoleService; exports.ServerS3Service = _chunkRTOC53EZjs.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunkRTOC53EZjs.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
300
300
  //# sourceMappingURL=index.js.map
@@ -15,7 +15,7 @@ import {
15
15
  S3Service,
16
16
  UserService,
17
17
  checkPermissionsFromServer
18
- } from "../chunk-LCCRUWWY.mjs";
18
+ } from "../chunk-FS4RVV3K.mjs";
19
19
  import "../chunk-AUXK7QSA.mjs";
20
20
  import "../chunk-C7C7VY4F.mjs";
21
21
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
package/src/core/index.ts CHANGED
@@ -98,4 +98,14 @@ export * from "../features/referral/referral-stats.module";
98
98
  // them in its bootstrapper without pulling the feature's client bundle —
99
99
  // same placement as waitlist-stats and referral-stats above.
100
100
  export * from "../features/tokenusage/tokenusage-admin.module";
101
+ // The full six-module bundle (administrative + self-service). Same placement
102
+ // rationale as the line above: a bootstrapper needs it, and it must not drag
103
+ // the feature's recharts client bundle in.
104
+ export * from "../features/tokenusage/tokenusage.modules";
105
+ // configureTokenUsage() is called from the app's bootstrap file, which is
106
+ // evaluated on the server as well as the client. Reaching it through the
107
+ // client-marked ./tokenusage barrel makes it a client function, and calling one
108
+ // from the server throws at module evaluation — so it is exported here, exactly
109
+ // like configureJsonApi. lib/config holds no React and no charting code.
110
+ export * from "../features/tokenusage/lib/config";
101
111
  export * from "../features/audit-log";
@@ -63,6 +63,10 @@ export interface FoundationModuleDefinitions {
63
63
  TokenUsageAdminSummary: ModuleWithPermissions;
64
64
  TokenUsageAdminTimeline: ModuleWithPermissions;
65
65
  TokenUsageAdminBreakdown: ModuleWithPermissions;
66
+ // Self-service token-usage reporting modules
67
+ TokenUsageReportSummary: ModuleWithPermissions;
68
+ TokenUsageReportTimeline: ModuleWithPermissions;
69
+ TokenUsageReportBreakdown: ModuleWithPermissions;
66
70
  }
67
71
 
68
72
  // App-specific modules - apps will augment this interface ONLY
@@ -49,6 +49,21 @@ export function TokenUsageAdminContainer() {
49
49
  error,
50
50
  } = useTokenUsageAdmin();
51
51
 
52
+ // narr8-shaped deployments record essentially no platform spend (usage with no
53
+ // owning company), which would leave the platform tile and the
54
+ // platform-by-operation panel as permanent zeros. Treat "nothing to show" the
55
+ // same way a company filter is treated — the customer half then takes full
56
+ // width. a360ai is unaffected: it has real platform spend.
57
+ const platformIsEmpty = useMemo(
58
+ () =>
59
+ summary
60
+ .filter((row) => row.scope === "platform")
61
+ .every((row) => row.cost === 0 && row.credits === 0 && row.tokensIn === 0 && row.tokensOut === 0),
62
+ [summary],
63
+ );
64
+
65
+ const hidePlatform = singleCustomerMode || platformIsEmpty;
66
+
52
67
  const stackByItems = useMemo(
53
68
  () => ({
54
69
  scope: t("token_usage.admin.stack.scope"),
@@ -81,7 +96,7 @@ export function TokenUsageAdminContainer() {
81
96
  return (
82
97
  <RoundPageContainer fullWidth forceHeader>
83
98
  <div className="flex w-full flex-col gap-4 p-4">
84
- <TokenUsageAdminTiles summary={summary} metric={filters.metric} singleCustomerMode={singleCustomerMode} />
99
+ <TokenUsageAdminTiles summary={summary} metric={filters.metric} singleCustomerMode={hidePlatform} />
85
100
 
86
101
  <Card>
87
102
  <CardHeader>
@@ -142,8 +157,9 @@ export function TokenUsageAdminContainer() {
142
157
  Platform spend has no owning company, so a company filter makes that
143
158
  half meaningless: the provider skips the request and the card is
144
159
  hidden rather than rendered empty, leaving the customer half full
145
- width. */}
146
- <div className={cn("grid gap-4", !singleCustomerMode && "md:grid-cols-2")}>
160
+ width. The same holds when the window records no platform spend at
161
+ all see `hidePlatform` above. */}
162
+ <div className={cn("grid gap-4", !hidePlatform && "md:grid-cols-2")}>
147
163
  <Card>
148
164
  <CardHeader>
149
165
  <CardTitle>{t("token_usage.admin.customer_by_operation")}</CardTitle>
@@ -158,7 +174,7 @@ export function TokenUsageAdminContainer() {
158
174
  </CardContent>
159
175
  </Card>
160
176
 
161
- {!singleCustomerMode && (
177
+ {!hidePlatform && (
162
178
  <Card>
163
179
  <CardHeader>
164
180
  <CardTitle>{t("token_usage.admin.platform_by_operation")}</CardTitle>
@@ -6,15 +6,8 @@ import { Card, CardContent } from "../../../shadcnui";
6
6
  import { cn } from "../../../utils";
7
7
  import type { TokenUsageAdminSummaryInterface } from "../data/tokenusage-admin-summary.interface";
8
8
  import type { Metric } from "../data/tokenusage-admin.types";
9
- import {
10
- cacheHitPercentage,
11
- formatDecimal,
12
- formatMetricValue,
13
- formatPercent,
14
- metricValue,
15
- percentageDelta,
16
- type TokenUsageMetrics,
17
- } from "../lib/metrics";
9
+ import { useUsageFormatters } from "../lib/formatters";
10
+ import { cacheHitPercentage, metricValue, percentageDelta, type TokenUsageMetrics } from "../lib/metrics";
18
11
 
19
12
  type Props = {
20
13
  /** The six summary rows: {customer, platform, total} × {current, previous}. */
@@ -38,6 +31,7 @@ const ZERO: TokenUsageMetrics = { cost: 0, credits: 0, tokensIn: 0, tokensOut: 0
38
31
  */
39
32
  export function TokenUsageAdminTiles({ summary, metric, singleCustomerMode }: Props) {
40
33
  const t = useTranslations();
34
+ const { decimal, metricValue: formatValue, currency, percent } = useUsageFormatters();
41
35
 
42
36
  const rowFor = (scope: string, window: string): TokenUsageMetrics =>
43
37
  summary.find((r) => r.scope === scope && r.window === window) ?? ZERO;
@@ -58,17 +52,19 @@ export function TokenUsageAdminTiles({ summary, metric, singleCustomerMode }: Pr
58
52
  <LeadTile
59
53
  testId="tile-customer"
60
54
  label={t("token_usage.admin.customer_spend")}
61
- value={formatMetricValue(metricValue(customerCurrent, metric), metric)}
55
+ value={formatValue(metricValue(customerCurrent, metric), metric)}
62
56
  delta={percentageDelta(metricValue(customerCurrent, metric), metricValue(customerPrevious, metric))}
63
57
  previousLabel={t("token_usage.admin.vs_previous")}
58
+ decimal={decimal}
64
59
  />
65
60
  {!singleCustomerMode && (
66
61
  <LeadTile
67
62
  testId="tile-platform"
68
63
  label={t("token_usage.admin.platform_spend")}
69
- value={formatMetricValue(metricValue(platformCurrent, metric), metric)}
64
+ value={formatValue(metricValue(platformCurrent, metric), metric)}
70
65
  delta={percentageDelta(metricValue(platformCurrent, metric), metricValue(platformPrevious, metric))}
71
66
  previousLabel={t("token_usage.admin.vs_previous")}
67
+ decimal={decimal}
72
68
  />
73
69
  )}
74
70
  </div>
@@ -77,18 +73,21 @@ export function TokenUsageAdminTiles({ summary, metric, singleCustomerMode }: Pr
77
73
  <SupportingTile
78
74
  testId="tile-total"
79
75
  label={t("token_usage.admin.total_cost")}
80
- value={formatMetricValue(metricValue(totalCurrent, metric), metric)}
76
+ value={formatValue(metricValue(totalCurrent, metric), metric)}
81
77
  delta={percentageDelta(metricValue(totalCurrent, metric), metricValue(totalPrevious, metric))}
78
+ decimal={decimal}
82
79
  />
83
80
  <SupportingTile
84
81
  testId="tile-avg-per-call"
85
82
  label={t("token_usage.admin.avg_per_call")}
86
- value={`€ ${formatDecimal(averagePerCall, 4)}`}
83
+ value={currency(averagePerCall, 4)}
84
+ decimal={decimal}
87
85
  />
88
86
  <SupportingTile
89
87
  testId="tile-cache-hit"
90
88
  label={t("token_usage.admin.cache_hit")}
91
- value={formatPercent(cacheHit)}
89
+ value={percent(cacheHit)}
90
+ decimal={decimal}
92
91
  />
93
92
  </div>
94
93
  </div>
@@ -101,12 +100,15 @@ function LeadTile({
101
100
  value,
102
101
  delta,
103
102
  previousLabel,
103
+ decimal,
104
104
  }: {
105
105
  testId: string;
106
106
  label: string;
107
107
  value: string;
108
108
  delta: number | undefined;
109
109
  previousLabel: string;
110
+ /** Passed down because `Delta` is a plain function, not a component: it cannot call the hook itself. */
111
+ decimal: (value: number, decimals: number) => string;
110
112
  }) {
111
113
  return (
112
114
  <Card data-testid={testId}>
@@ -114,7 +116,7 @@ function LeadTile({
114
116
  <span className="text-muted-foreground text-xs">{label}</span>
115
117
  <span className="text-primary text-xl font-semibold tabular-nums">{value}</span>
116
118
  <span className="flex items-center gap-1">
117
- <Delta testId={`${testId}-delta`} delta={delta} />
119
+ <Delta testId={`${testId}-delta`} delta={delta} decimal={decimal} />
118
120
  <span className="text-muted-foreground text-xs">{previousLabel}</span>
119
121
  </span>
120
122
  </CardContent>
@@ -127,11 +129,14 @@ function SupportingTile({
127
129
  label,
128
130
  value,
129
131
  delta,
132
+ decimal,
130
133
  }: {
131
134
  testId: string;
132
135
  label: string;
133
136
  value: string;
134
137
  delta?: number | undefined;
138
+ /** Passed down because `Delta` is a plain function, not a component: it cannot call the hook itself. */
139
+ decimal: (value: number, decimals: number) => string;
135
140
  }) {
136
141
  return (
137
142
  <Card data-testid={testId} size="sm">
@@ -139,7 +144,7 @@ function SupportingTile({
139
144
  <span className="text-muted-foreground text-xs">{label}</span>
140
145
  <span className="flex items-center gap-2">
141
146
  <span className="text-sm font-medium tabular-nums">{value}</span>
142
- {delta !== undefined && <Delta testId={`${testId}-delta`} delta={delta} />}
147
+ {delta !== undefined && <Delta testId={`${testId}-delta`} delta={delta} decimal={decimal} />}
143
148
  </span>
144
149
  </CardContent>
145
150
  </Card>
@@ -150,7 +155,15 @@ function SupportingTile({
150
155
  * The delta slot. An undefined delta means the previous window was zero: an
151
156
  * em dash says "not comparable" where a percentage would say "infinite growth".
152
157
  */
153
- function Delta({ testId, delta }: { testId: string; delta: number | undefined }) {
158
+ function Delta({
159
+ testId,
160
+ delta,
161
+ decimal,
162
+ }: {
163
+ testId: string;
164
+ delta: number | undefined;
165
+ decimal: (value: number, decimals: number) => string;
166
+ }) {
154
167
  if (delta === undefined) {
155
168
  return (
156
169
  <span data-testid={testId} className="text-muted-foreground text-xs">
@@ -171,7 +184,7 @@ function Delta({ testId, delta }: { testId: string; delta: number | undefined })
171
184
  )}
172
185
  >
173
186
  <Icon aria-hidden className="size-3" />
174
- {formatDecimal(Math.abs(delta), 0)} %
187
+ {decimal(Math.abs(delta), 0)} %
175
188
  </span>
176
189
  );
177
190
  }
@@ -7,7 +7,8 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from ".
7
7
  import { cn } from "../../../utils";
8
8
  import type { TokenUsageAdminBreakdownInterface } from "../data/tokenusage-admin-breakdown.interface";
9
9
  import type { Metric } from "../data/tokenusage-admin.types";
10
- import { cacheHitPercentage, formatDecimal, formatMetricValue, formatPercent, metricValue } from "../lib/metrics";
10
+ import { useUsageFormatters } from "../lib/formatters";
11
+ import { cacheHitPercentage, metricValue } from "../lib/metrics";
11
12
 
12
13
  type Props = {
13
14
  rows: TokenUsageAdminBreakdownInterface[];
@@ -28,6 +29,7 @@ type SortState = { key: SortKey; direction: "asc" | "desc" };
28
29
  */
29
30
  export function TokenUsageBreakdownTable({ rows, metric }: Props) {
30
31
  const t = useTranslations();
32
+ const { decimal, metricValue: formatValue, percent, compare } = useUsageFormatters();
31
33
  const [sort, setSort] = useState<SortState | undefined>(undefined);
32
34
 
33
35
  // The company dimension is the only one that reports active users. Rather than
@@ -61,11 +63,11 @@ export function TokenUsageBreakdownTable({ rows, metric }: Props) {
61
63
  const left = sortValue(a, sort.key);
62
64
  const right = sortValue(b, sort.key);
63
65
  if (typeof left === "string" || typeof right === "string") {
64
- return String(left).localeCompare(String(right), "it-IT") * factor;
66
+ return compare(String(left), String(right)) * factor;
65
67
  }
66
68
  return (left - right) * factor;
67
69
  });
68
- }, [rows, sort, metric]);
70
+ }, [rows, sort, metric, compare]);
69
71
 
70
72
  // First click on a column sorts descending: on a spend table the interesting
71
73
  // end of every numeric column is the top one.
@@ -136,20 +138,18 @@ export function TokenUsageBreakdownTable({ rows, metric }: Props) {
136
138
  <TableCell className="text-muted-foreground text-xs">{row.sublabel ?? ""}</TableCell>
137
139
  {showActiveUsers && (
138
140
  <TableCell className="text-right text-xs tabular-nums">
139
- {row.activeUsers === undefined ? "" : formatDecimal(row.activeUsers, 0)}
141
+ {row.activeUsers === undefined ? "" : decimal(row.activeUsers, 0)}
140
142
  </TableCell>
141
143
  )}
142
- <TableCell className="text-right text-xs tabular-nums">{formatDecimal(row.calls, 0)}</TableCell>
143
- <TableCell className="text-right text-xs tabular-nums">{formatDecimal(row.tokensIn, 0)}</TableCell>
144
- <TableCell className="text-right text-xs tabular-nums">{formatDecimal(row.tokensOut, 0)}</TableCell>
144
+ <TableCell className="text-right text-xs tabular-nums">{decimal(row.calls, 0)}</TableCell>
145
+ <TableCell className="text-right text-xs tabular-nums">{decimal(row.tokensIn, 0)}</TableCell>
146
+ <TableCell className="text-right text-xs tabular-nums">{decimal(row.tokensOut, 0)}</TableCell>
145
147
  <TableCell className="text-right text-xs tabular-nums">
146
- {formatPercent(cacheHitPercentage(row.cached, row.tokensIn))}
148
+ {percent(cacheHitPercentage(row.cached, row.tokensIn))}
147
149
  </TableCell>
148
- <TableCell className="text-right text-xs tabular-nums">{formatMetricValue(row.cost, "cost")}</TableCell>
149
- <TableCell className="text-right text-xs tabular-nums">
150
- {formatMetricValue(row.credits, "credits")}
151
- </TableCell>
152
- <TableCell className="text-right text-xs tabular-nums">{formatPercent(share)}</TableCell>
150
+ <TableCell className="text-right text-xs tabular-nums">{formatValue(row.cost, "cost")}</TableCell>
151
+ <TableCell className="text-right text-xs tabular-nums">{formatValue(row.credits, "credits")}</TableCell>
152
+ <TableCell className="text-right text-xs tabular-nums">{percent(share)}</TableCell>
153
153
  </TableRow>
154
154
  );
155
155
  })}
@@ -1,17 +1,33 @@
1
1
  "use client";
2
2
 
3
3
  import { useTranslations } from "next-intl";
4
- import type { TokenUsageAdminBreakdownInterface } from "../data/tokenusage-admin-breakdown.interface";
5
4
  import type { Metric } from "../data/tokenusage-admin.types";
6
- import { formatMetricValue, formatPercent, metricValue } from "../lib/metrics";
5
+ import { useUsageFormatters } from "../lib/formatters";
6
+ import { metricValue, type TokenUsageMetrics } from "../lib/metrics";
7
7
  import { operationLabel } from "../lib/operation-label";
8
8
  import { SEQUENTIAL_RAMP } from "../lib/palette";
9
9
 
10
+ /**
11
+ * Everything this component actually reads from a row.
12
+ *
13
+ * Declared STRUCTURALLY rather than as one of the breakdown interfaces on
14
+ * purpose: the same list ranks administrative rows (which additionally carry
15
+ * activeUsers / monthlyCredits / availableMonthlyCredits) and self-service
16
+ * report rows (which do not). Narrowing this to the administrative interface
17
+ * would force every self-service caller into a cast, and duplicating the
18
+ * component would fork the ramp and the share arithmetic.
19
+ */
20
+ export type TokenUsageRankedRow = TokenUsageMetrics & {
21
+ /** Row identity; the literal "other" marks the folded tail. */
22
+ id: string;
23
+ label: string;
24
+ };
25
+
10
26
  type Props = {
11
27
  /** Ranked rows, already ordered descending by the backend, "other" last. */
12
- rows: TokenUsageAdminBreakdownInterface[];
28
+ rows: TokenUsageRankedRow[];
13
29
  metric: Metric;
14
- /** Italian copy shown when there is nothing to rank. */
30
+ /** Copy shown when there is nothing to rank, already translated by the caller. */
15
31
  emptyLabel: string;
16
32
  /**
17
33
  * Whether `row.label` is an operation TYPE (vocabulary the consuming app
@@ -37,8 +53,9 @@ type Props = {
37
53
  */
38
54
  export function TokenUsageRankedBar({ rows, metric, emptyLabel, labelsAreOperationTypes = false }: Props) {
39
55
  const t = useTranslations();
56
+ const { metricValue: formatValue, percent } = useUsageFormatters();
40
57
 
41
- const renderLabel = (row: TokenUsageAdminBreakdownInterface): string => {
58
+ const renderLabel = (row: TokenUsageRankedRow): string => {
42
59
  if (row.id === "other") return t("token_usage.admin.other");
43
60
  if (!labelsAreOperationTypes) return row.label;
44
61
  return operationLabel(
@@ -83,13 +100,13 @@ export function TokenUsageRankedBar({ rows, metric, emptyLabel, labelsAreOperati
83
100
  </div>
84
101
  </div>
85
102
  <span data-testid={`ranked-value-${row.id}`} className="text-right text-xs tabular-nums">
86
- {formatMetricValue(value, metric)}
103
+ {formatValue(value, metric)}
87
104
  </span>
88
105
  <span
89
106
  data-testid={`ranked-share-${row.id}`}
90
107
  className="text-muted-foreground w-16 text-right text-xs tabular-nums"
91
108
  >
92
- {formatPercent(share)}
109
+ {percent(share)}
93
110
  </span>
94
111
  </div>
95
112
  );