ugly-app 0.1.78 → 0.1.79

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 (116) hide show
  1. package/README.md +6 -143
  2. package/coverage/.tmp/coverage-0.json +1 -0
  3. package/coverage/.tmp/coverage-1.json +1 -0
  4. package/coverage/.tmp/coverage-10.json +1 -0
  5. package/coverage/.tmp/coverage-11.json +1 -0
  6. package/coverage/.tmp/coverage-12.json +1 -0
  7. package/coverage/.tmp/coverage-13.json +1 -0
  8. package/coverage/.tmp/coverage-14.json +1 -0
  9. package/coverage/.tmp/coverage-15.json +1 -0
  10. package/coverage/.tmp/coverage-16.json +1 -0
  11. package/coverage/.tmp/coverage-17.json +1 -0
  12. package/coverage/.tmp/coverage-18.json +1 -0
  13. package/coverage/.tmp/coverage-19.json +1 -0
  14. package/coverage/.tmp/coverage-2.json +1 -0
  15. package/coverage/.tmp/coverage-20.json +1 -0
  16. package/coverage/.tmp/coverage-21.json +1 -0
  17. package/coverage/.tmp/coverage-22.json +1 -0
  18. package/coverage/.tmp/coverage-23.json +1 -0
  19. package/coverage/.tmp/coverage-24.json +1 -0
  20. package/coverage/.tmp/coverage-25.json +1 -0
  21. package/coverage/.tmp/coverage-26.json +1 -0
  22. package/coverage/.tmp/coverage-27.json +1 -0
  23. package/coverage/.tmp/coverage-28.json +1 -0
  24. package/coverage/.tmp/coverage-29.json +1 -0
  25. package/coverage/.tmp/coverage-3.json +1 -0
  26. package/coverage/.tmp/coverage-30.json +1 -0
  27. package/coverage/.tmp/coverage-31.json +1 -0
  28. package/coverage/.tmp/coverage-32.json +1 -0
  29. package/coverage/.tmp/coverage-33.json +1 -0
  30. package/coverage/.tmp/coverage-34.json +1 -0
  31. package/coverage/.tmp/coverage-35.json +1 -0
  32. package/coverage/.tmp/coverage-36.json +1 -0
  33. package/coverage/.tmp/coverage-37.json +1 -0
  34. package/coverage/.tmp/coverage-38.json +1 -0
  35. package/coverage/.tmp/coverage-39.json +1 -0
  36. package/coverage/.tmp/coverage-4.json +1 -0
  37. package/coverage/.tmp/coverage-40.json +1 -0
  38. package/coverage/.tmp/coverage-41.json +1 -0
  39. package/coverage/.tmp/coverage-42.json +1 -0
  40. package/coverage/.tmp/coverage-5.json +1 -0
  41. package/coverage/.tmp/coverage-6.json +1 -0
  42. package/coverage/.tmp/coverage-7.json +1 -0
  43. package/coverage/.tmp/coverage-8.json +1 -0
  44. package/coverage/.tmp/coverage-9.json +1 -0
  45. package/dist/cli/version.d.ts +1 -1
  46. package/dist/cli/version.js +1 -1
  47. package/dist/client/components/Button.d.ts +3 -3
  48. package/dist/client/components/Button.d.ts.map +1 -1
  49. package/dist/client/components/Button.js +27 -13
  50. package/dist/client/components/Button.js.map +1 -1
  51. package/dist/client/components/Card.d.ts +3 -3
  52. package/dist/client/components/Card.d.ts.map +1 -1
  53. package/dist/client/components/Card.js +10 -3
  54. package/dist/client/components/Card.js.map +1 -1
  55. package/dist/client/components/EnumInput.d.ts +3 -3
  56. package/dist/client/components/EnumInput.d.ts.map +1 -1
  57. package/dist/client/components/EnumInput.js +17 -2
  58. package/dist/client/components/EnumInput.js.map +1 -1
  59. package/dist/client/components/PageLayout.d.ts +3 -3
  60. package/dist/client/components/PageLayout.d.ts.map +1 -1
  61. package/dist/client/components/PageLayout.js +14 -2
  62. package/dist/client/components/PageLayout.js.map +1 -1
  63. package/dist/client/components/Panel.d.ts +1 -2
  64. package/dist/client/components/Panel.d.ts.map +1 -1
  65. package/dist/client/components/Panel.js +7 -2
  66. package/dist/client/components/Panel.js.map +1 -1
  67. package/dist/client/components/PopupPanel.d.ts +3 -3
  68. package/dist/client/components/PopupPanel.d.ts.map +1 -1
  69. package/dist/client/components/PopupPanel.js +11 -2
  70. package/dist/client/components/PopupPanel.js.map +1 -1
  71. package/dist/client/components/Pressable.d.ts +1 -2
  72. package/dist/client/components/Pressable.d.ts.map +1 -1
  73. package/dist/client/components/Pressable.js +8 -2
  74. package/dist/client/components/Pressable.js.map +1 -1
  75. package/dist/client/components/ScrollView.js +1 -1
  76. package/dist/client/components/ScrollView.js.map +1 -1
  77. package/dist/client/components/SettingGroup.d.ts +3 -3
  78. package/dist/client/components/SettingGroup.d.ts.map +1 -1
  79. package/dist/client/components/SettingGroup.js +15 -2
  80. package/dist/client/components/SettingGroup.js.map +1 -1
  81. package/dist/client/components/ValidatedTextInput.d.ts.map +1 -1
  82. package/dist/client/components/ValidatedTextInput.js +0 -1
  83. package/dist/client/components/ValidatedTextInput.js.map +1 -1
  84. package/dist/client/createSocket.d.ts.map +1 -1
  85. package/dist/client/createSocket.js +3 -3
  86. package/dist/client/createSocket.js.map +1 -1
  87. package/dist/server/App.d.ts +29 -3
  88. package/dist/server/App.d.ts.map +1 -1
  89. package/dist/server/App.js +69 -6
  90. package/dist/server/App.js.map +1 -1
  91. package/dist/server/Router.d.ts +1 -1
  92. package/dist/server/Router.d.ts.map +1 -1
  93. package/dist/server/Router.js +6 -1
  94. package/dist/server/Router.js.map +1 -1
  95. package/dist/server/Socket.js +10 -10
  96. package/dist/server/Socket.js.map +1 -1
  97. package/dist/server/StoreHandlers.d.ts +4 -0
  98. package/dist/server/StoreHandlers.d.ts.map +1 -0
  99. package/dist/server/StoreHandlers.js +160 -0
  100. package/dist/server/StoreHandlers.js.map +1 -0
  101. package/dist/server/index.d.ts +1 -1
  102. package/dist/server/index.d.ts.map +1 -1
  103. package/dist/shared/Socket.d.ts +33 -3
  104. package/dist/shared/Socket.d.ts.map +1 -1
  105. package/eslint.config.js +106 -0
  106. package/package.json +1 -1
  107. package/templates/client/pages/AITestPage.tsx +17 -56
  108. package/templates/client/pages/AuthDemoPage.tsx +13 -33
  109. package/templates/client/pages/HomePage.tsx +14 -22
  110. package/templates/client/pages/SearchPage.tsx +7 -13
  111. package/templates/client/pages/UserPage.tsx +7 -13
  112. package/templates/client/styles.css +0 -3
  113. package/templates/eslint.config.js +78 -0
  114. package/templates/package.json +0 -1
  115. package/templates/postcss.config.js +0 -1
  116. package/templates/tailwind.config.js +0 -6
package/README.md CHANGED
@@ -8,8 +8,7 @@ A full-stack TypeScript framework for building production-ready web applications
8
8
  - **Client**: React + Vite with typed routing, lazy pages, and popup management
9
9
  - **Database**: MongoDB with typed collections, dot-notation updates, indexes, migrations, and live document tracking
10
10
  - **Auth**: JWT + HttpOnly cookies, ugly.bot OAuth out of the box, extensible via `AuthProvider`
11
- - **AI**: Text generation (Together, Claude, OpenAI, Google, Groq, Fireworks, Kie) + image generation (Together, FAL, Google, Wavespeed, Kie) + embeddings + STT/TTS
12
- - **Analytics**: EventCounter (high-throughput counters), EventLog (event capture), A/B experiments
11
+ - **AI**: Text generation (Together, Claude, OpenAI, Google, Groq, Fireworks) + image generation (Together, FAL, Google, Wavespeed) + embeddings + STT/TTS
13
12
  - **Storage**: Cloudflare R2 / AWS S3 with presigned uploads
14
13
  - **CLI**: `ugly-app` commands for dev, build, deploy, migrations, logs, and auth utilities
15
14
 
@@ -32,22 +31,16 @@ Entry point for the server. Creates an Express + WebSocket server with typed RPC
32
31
  ```typescript
33
32
  import {
34
33
  createApp,
35
- createImageGen,
36
- createTextGen,
37
34
  createUserHelper,
38
- eventLogCapture,
39
- eventLogServerCapture,
40
35
  getFeedbackHandlers,
41
- getExperimentAssignments,
42
36
  type AppConfigurator,
43
37
  type RequestHandlers,
44
38
  } from 'ugly-app';
45
39
  import { dbDefaults } from 'ugly-app/shared';
46
40
  import { requests } from '../shared/api';
47
- import type { User } from '../shared/collections';
48
41
  import { collections } from '../shared/collections';
49
- import { experiments } from '../shared/experiments';
50
42
  import { pages } from '../shared/pages';
43
+ import type { User } from '../shared/collections';
51
44
 
52
45
  const userHelper = createUserHelper<User>(collections.user);
53
46
  const maintainBotUserId = process.env.MAINTAIN_BOT_USER_ID ?? '';
@@ -56,38 +49,10 @@ const app = createApp(
56
49
  { requests },
57
50
  {
58
51
  ...getFeedbackHandlers(maintainBotUserId),
59
-
60
52
  getMe: async (userId: string) => {
61
53
  const user = await userHelper.get(app.db, userId);
62
54
  return { userId, email: user?.email, phone: user?.phone };
63
55
  },
64
-
65
- // Experiment bucketing + session start event
66
- initSession: async (userId, { sessionId }) => {
67
- const branches = getExperimentAssignments(userId, sessionId, experiments);
68
- await eventLogServerCapture('SESSION_START', {}, sessionId, userId, branches);
69
- return { branches };
70
- },
71
-
72
- // Generic event capture with experiment branch tagging
73
- captureEvent: async (userId, { eventName, sessionId, properties }) => {
74
- const branches = getExperimentAssignments(userId, sessionId, experiments);
75
- const { eventId } = await eventLogCapture(
76
- { eventName, sessionId, userId, properties: properties ?? {}, experimentBranches: branches },
77
- userId,
78
- );
79
- return { eventId };
80
- },
81
-
82
- textGen: async (userId, { model, messages }) => {
83
- const text = await createTextGen(userId).generate(messages, { model });
84
- return { text };
85
- },
86
-
87
- imageGen: async (userId, { model, prompt }) => {
88
- const url = await createImageGen(userId).generate(prompt, { model });
89
- return { url };
90
- },
91
56
  } satisfies RequestHandlers<typeof requests>,
92
57
  collections,
93
58
  (configurator: AppConfigurator) => {
@@ -672,16 +637,14 @@ Run `npm run db:init` to create/update indexes.
672
637
  ### Text generation
673
638
 
674
639
  ```typescript
675
- import { createTextGen } from 'ugly-app';
676
- const textGen = createTextGen(userId);
640
+ import { createTextGenClient } from 'ugly-app';
641
+ const textGen = createTextGenClient();
677
642
 
678
643
  const text = await textGen.generate(messages);
679
644
  const json = await textGen.generateJson(schema, messages); // Zod schema, retries on parse failure
680
645
  const result = await textGen.generateWithTools(messages, tools); // automatic tool-call loop
681
646
  ```
682
647
 
683
- `createTextGen(userId, defaults?)` creates a client scoped to a user (for rate limiting and billing). Optional `defaults` set provider, model, temperature, etc.
684
-
685
648
  | Provider | `provider` value | Default model | JSON | Tools | Vision |
686
649
  |----------|-----------------|---------------|------|-------|--------|
687
650
  | Together AI | `'together'` | Llama-4-Maverick-17B-128E | yes | yes | yes |
@@ -697,14 +660,12 @@ Use `provider: 'auto'` (default) to let the system pick based on requirements.
697
660
  ### Image generation
698
661
 
699
662
  ```typescript
700
- import { createImageGen } from 'ugly-app';
701
- const imageGen = createImageGen(userId);
663
+ import { createImageGenClient } from 'ugly-app';
664
+ const imageGen = createImageGenClient();
702
665
 
703
666
  const url = await imageGen.generate(prompt, { width: 1024, height: 1024 });
704
667
  ```
705
668
 
706
- `createImageGen(userId, defaults?)` works the same way — user-scoped with optional defaults.
707
-
708
669
  | Provider | `provider` value |
709
670
  |----------|-----------------|
710
671
  | Together AI (FLUX schnell) | `'together'` |
@@ -885,104 +846,6 @@ submitFeedback: authReq({
885
846
 
886
847
  The framework enforces rate limits automatically before calling the handler.
887
848
 
888
- ### EventCounter
889
-
890
- High-throughput counters aggregated into hourly buckets in MongoDB. Increments are instant (in-memory) and flushed every 60 seconds.
891
-
892
- ```typescript
893
- import {
894
- eventCounterIncrement,
895
- startEventCounterFlush,
896
- flushCountersToMongo,
897
- eventCounterGetCounts,
898
- eventCounterGetTopTypes,
899
- } from 'ugly-app';
900
-
901
- // Increment a counter (instant, no DB write)
902
- eventCounterIncrement('api_getMe');
903
-
904
- // Start periodic flush — call once at server startup
905
- startEventCounterFlush();
906
-
907
- // Manually flush (e.g. on graceful shutdown)
908
- await flushCountersToMongo();
909
-
910
- // Query counts (admin only)
911
- const { counts } = await eventCounterGetCounts(
912
- { granularity: 'hours', intervals: 24, category: 'api' },
913
- isAdmin,
914
- );
915
-
916
- // Query top counter types (admin only)
917
- const { types } = await eventCounterGetTopTypes(
918
- { limit: 10, category: 'api' },
919
- isAdmin,
920
- );
921
- ```
922
-
923
- Counter type names use a `category_name` convention (e.g. `api_getMe`, `ai_textGen`). Data is auto-expired after 30 days via MongoDB TTL.
924
-
925
- ### EventLog
926
-
927
- Structured event capture for analytics. Events are stored in MongoDB with session, user, and experiment branch associations.
928
-
929
- ```typescript
930
- import { eventLogCapture, eventLogServerCapture } from 'ugly-app';
931
-
932
- // Capture an event (returns eventId)
933
- const { eventId } = await eventLogCapture(
934
- {
935
- eventName: 'BUTTON_CLICK',
936
- sessionId,
937
- userId,
938
- properties: { page: 'home', target: 'cta' },
939
- experimentBranches: branches,
940
- },
941
- userId,
942
- );
943
-
944
- // Server-side shorthand (fire-and-forget, no eventId returned)
945
- await eventLogServerCapture('SESSION_START', { source: 'web' }, sessionId, userId, branches);
946
- ```
947
-
948
- Admin query functions: `eventLogGetList`, `eventLogGetCounts`, `eventLogGetTopEvents`, `eventLogGetTopUsers`, `eventLogGetTopSessions`, `eventLogGetUniqueUsersCounts`, `eventLogGetUniqueSessionsCounts`.
949
-
950
- ### Experiments (A/B testing)
951
-
952
- Define experiments in `shared/experiments.ts` and use deterministic bucketing to assign users to branches.
953
-
954
- ```typescript
955
- // shared/experiments.ts
956
- import type { Experiment } from 'ugly-app/shared';
957
-
958
- export const experiments: Experiment[] = [
959
- {
960
- id: 'onboarding-v2',
961
- name: 'Onboarding V2',
962
- description: 'Test new onboarding flow',
963
- branches: [
964
- { id: 'control', name: 'Control', weight: 1 },
965
- { id: 'variant', name: 'Variant', weight: 1 },
966
- ],
967
- events: ['ONBOARDING_COMPLETE', 'SIGNUP'],
968
- active: true,
969
- },
970
- ];
971
- ```
972
-
973
- ```typescript
974
- // Server-side assignment
975
- import { getExperimentAssignments, getExperimentBranch } from 'ugly-app';
976
-
977
- // Get all branch assignments for a user/session (deterministic hash)
978
- const branches = getExperimentAssignments(userId, sessionId, experiments);
979
-
980
- // Get a single experiment branch
981
- const branch = getExperimentBranch(userId, sessionId, experiment);
982
- ```
983
-
984
- Shared helpers: `getActiveExperiments`, `getExperimentById`, `getExperimentBranch`, `getExperimentAssignments`. Server admin: `experimentGetMetrics` for per-branch analytics.
985
-
986
849
  ---
987
850
 
988
851
  ## Built-in endpoints
@@ -0,0 +1 @@
1
+ {"result":[{"scriptId":"233","url":"file:///Users/admin/Documents/GitHub/ugly-app/tests/server/audio/tts/InWorld.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":47019,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":47019,"count":1}],"isBlockCoverage":true},{"functionName":"makeWavBuffer","ranges":[{"startOffset":667,"endOffset":872,"count":10}],"isBlockCoverage":true},{"functionName":"makeNdjsonResponse","ranges":[{"startOffset":933,"endOffset":1284,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1008,"endOffset":1032,"count":9}],"isBlockCoverage":true},{"functionName":"start","ranges":[{"startOffset":1163,"endOffset":1236,"count":7}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1344,"endOffset":13691,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1390,"endOffset":1540,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1580,"endOffset":1681,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1746,"endOffset":1956,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2035,"endOffset":2888,"count":1},{"startOffset":2668,"endOffset":2702,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2967,"endOffset":3810,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3888,"endOffset":4228,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4295,"endOffset":4693,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4788,"endOffset":5770,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5859,"endOffset":7230,"count":1}],"isBlockCoverage":true},{"functionName":"start","ranges":[{"startOffset":6402,"endOffset":6508,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7305,"endOffset":7632,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7711,"endOffset":8133,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8208,"endOffset":8836,"count":1}],"isBlockCoverage":true},{"functionName":"start","ranges":[{"startOffset":8351,"endOffset":8429,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8914,"endOffset":9526,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9609,"endOffset":10386,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10499,"endOffset":11717,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11811,"endOffset":12696,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12812,"endOffset":13687,"count":1}],"isBlockCoverage":true},{"functionName":"start","ranges":[{"startOffset":13111,"endOffset":13187,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13745,"endOffset":15370,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13790,"endOffset":13844,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13952,"endOffset":14437,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":14528,"endOffset":15040,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15135,"endOffset":15366,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"235","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/audio/tts/registry.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":2383,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":2383,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":256,"endOffset":309,"count":2},{"startOffset":299,"endOffset":307,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":357,"endOffset":408,"count":1},{"startOffset":398,"endOffset":406,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":457,"endOffset":509,"count":4},{"startOffset":499,"endOffset":507,"count":0}],"isBlockCoverage":true},{"functionName":"registerTTSProvider","ranges":[{"startOffset":534,"endOffset":606,"count":2}],"isBlockCoverage":true},{"functionName":"selectTTSProvider","ranges":[{"startOffset":670,"endOffset":761,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":724,"endOffset":757,"count":1}],"isBlockCoverage":true},{"functionName":"getAllTTSProviders","ranges":[{"startOffset":763,"endOffset":820,"count":4}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"236","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/audio/tts/InWorld.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":15311,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":15311,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":255,"endOffset":307,"count":15},{"startOffset":297,"endOffset":305,"count":0}],"isBlockCoverage":true},{"functionName":"parseOffsetSeconds","ranges":[{"startOffset":466,"endOffset":684,"count":10},{"startOffset":537,"endOffset":551,"count":2},{"startOffset":551,"endOffset":659,"count":8},{"startOffset":659,"endOffset":683,"count":0}],"isBlockCoverage":true},{"functionName":"parseVisemesFromAlignment","ranges":[{"startOffset":685,"endOffset":1206,"count":1},{"startOffset":826,"endOffset":835,"count":0},{"startOffset":911,"endOffset":920,"count":0},{"startOffset":959,"endOffset":1179,"count":2}],"isBlockCoverage":true},{"functionName":"stream","ranges":[{"startOffset":1286,"endOffset":4181,"count":14},{"startOffset":1437,"endOffset":1494,"count":1},{"startOffset":1494,"endOffset":1513,"count":13},{"startOffset":1513,"endOffset":1573,"count":1},{"startOffset":1573,"endOffset":2114,"count":12},{"startOffset":2114,"endOffset":2248,"count":1},{"startOffset":2248,"endOffset":2272,"count":11},{"startOffset":2272,"endOffset":2333,"count":1},{"startOffset":2333,"endOffset":3653,"count":10},{"startOffset":3653,"endOffset":4042,"count":20},{"startOffset":3716,"endOffset":3722,"count":9},{"startOffset":3722,"endOffset":4038,"count":11},{"startOffset":4021,"endOffset":4033,"count":9},{"startOffset":4042,"endOffset":4104,"count":9},{"startOffset":4104,"endOffset":4178,"count":1}],"isBlockCoverage":true},{"functionName":"processLine","ranges":[{"startOffset":2461,"endOffset":3636,"count":12},{"startOffset":2494,"endOffset":2506,"count":0},{"startOffset":2567,"endOffset":2650,"count":1},{"startOffset":2650,"endOffset":2681,"count":11},{"startOffset":2681,"endOffset":2693,"count":1},{"startOffset":2693,"endOffset":2855,"count":10},{"startOffset":2855,"endOffset":2870,"count":5},{"startOffset":2889,"endOffset":2912,"count":5},{"startOffset":2914,"endOffset":3610,"count":5},{"startOffset":3433,"endOffset":3449,"count":2},{"startOffset":3451,"endOffset":3586,"count":1},{"startOffset":3610,"endOffset":3635,"count":5}],"isBlockCoverage":true}],"startOffset":209}]}
@@ -0,0 +1 @@
1
+ {"result":[{"scriptId":"233","url":"file:///Users/admin/Documents/GitHub/ugly-app/tests/server/billing/LimitEnforcer.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":90488,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":90488,"count":1}],"isBlockCoverage":true},{"functionName":"makeMockLedger","ranges":[{"startOffset":846,"endOffset":1380,"count":45},{"startOffset":1026,"endOffset":1055,"count":27}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1030,"endOffset":1054,"count":0}],"isBlockCoverage":false},{"functionName":"makeMockUserLimits","ranges":[{"startOffset":1381,"endOffset":1639,"count":45}],"isBlockCoverage":true},{"functionName":"makeCharge","ranges":[{"startOffset":1640,"endOffset":1784,"count":63}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2020,"endOffset":3969,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2107,"endOffset":2406,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2490,"endOffset":2791,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2874,"endOffset":3174,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3263,"endOffset":3569,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3661,"endOffset":3965,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4227,"endOffset":7219,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4273,"endOffset":4319,"count":5}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4359,"endOffset":4405,"count":5}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4479,"endOffset":4737,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4843,"endOffset":5189,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5281,"endOffset":5735,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5548,"endOffset":5556,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5825,"endOffset":6454,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6526,"endOffset":7215,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6625,"endOffset":6649,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7481,"endOffset":10668,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7576,"endOffset":8030,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8106,"endOffset":8568,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8480,"endOffset":8488,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8650,"endOffset":9149,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9239,"endOffset":9578,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9683,"endOffset":10137,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10208,"endOffset":10664,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10918,"endOffset":14374,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11023,"endOffset":11570,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11128,"endOffset":11152,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11385,"endOffset":11393,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11668,"endOffset":12179,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11714,"endOffset":11739,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11995,"endOffset":12003,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12279,"endOffset":12812,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12325,"endOffset":12351,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12627,"endOffset":12635,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12897,"endOffset":13344,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13435,"endOffset":13771,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13481,"endOffset":13505,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":13870,"endOffset":14370,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":14284,"endOffset":14292,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":14628,"endOffset":18586,"count":1}],"isBlockCoverage":true},{"functionName":"makeMockCreditStore","ranges":[{"startOffset":14637,"endOffset":14922,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15020,"endOffset":15562,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15066,"endOffset":15092,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15679,"endOffset":16204,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":15725,"endOffset":15751,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16299,"endOffset":16714,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16345,"endOffset":16371,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16810,"endOffset":17556,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":16856,"endOffset":16882,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17269,"endOffset":17277,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17633,"endOffset":18058,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":17679,"endOffset":17704,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18136,"endOffset":18582,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18182,"endOffset":18208,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18870,"endOffset":19567,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":18969,"endOffset":19563,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19048,"endOffset":19074,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19359,"endOffset":19367,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19825,"endOffset":30551,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":19925,"endOffset":20614,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":20722,"endOffset":21223,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":21309,"endOffset":22035,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22135,"endOffset":22892,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22278,"endOffset":22304,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":22987,"endOffset":23742,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":23131,"endOffset":23157,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":23838,"endOffset":24543,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":23934,"endOffset":23959,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":24638,"endOffset":25252,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":24723,"endOffset":24777,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":24812,"endOffset":24838,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":25341,"endOffset":26015,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":26112,"endOffset":26481,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":26577,"endOffset":26910,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":27004,"endOffset":27397,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":27501,"endOffset":28131,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":28224,"endOffset":28843,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":28761,"endOffset":28769,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":28954,"endOffset":29411,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29050,"endOffset":29076,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29519,"endOffset":29948,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":29565,"endOffset":29591,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":30038,"endOffset":30547,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":30123,"endOffset":30172,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"235","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/billing/LimitEnforcer.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":33174,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":33174,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":250,"endOffset":297,"count":45},{"startOffset":287,"endOffset":295,"count":0}],"isBlockCoverage":true},{"functionName":"<instance_members_initializer>","ranges":[{"startOffset":1384,"endOffset":10259,"count":45}],"isBlockCoverage":true},{"functionName":"LimitEnforcer","ranges":[{"startOffset":1576,"endOffset":1742,"count":45}],"isBlockCoverage":true},{"functionName":"setUserThresholdCallback","ranges":[{"startOffset":1744,"endOffset":1806,"count":5}],"isBlockCoverage":true},{"functionName":"setGlobalThresholdCallback","ranges":[{"startOffset":1808,"endOffset":1874,"count":9}],"isBlockCoverage":true},{"functionName":"init","ranges":[{"startOffset":2018,"endOffset":2445,"count":1},{"startOffset":2267,"endOffset":2272,"count":0},{"startOffset":2275,"endOffset":2442,"count":0}],"isBlockCoverage":true},{"functionName":"check","ranges":[{"startOffset":2753,"endOffset":5037,"count":63},{"startOffset":2880,"endOffset":2895,"count":61},{"startOffset":2897,"endOffset":3029,"count":4},{"startOffset":3029,"endOffset":3071,"count":59},{"startOffset":3106,"endOffset":3209,"count":1},{"startOffset":3209,"endOffset":3428,"count":58},{"startOffset":3428,"endOffset":3546,"count":6},{"startOffset":3546,"endOffset":3669,"count":52},{"startOffset":3669,"endOffset":3681,"count":16},{"startOffset":3681,"endOffset":3692,"count":13},{"startOffset":3753,"endOffset":4011,"count":13},{"startOffset":3898,"endOffset":4007,"count":4},{"startOffset":4011,"endOffset":4167,"count":48},{"startOffset":4167,"endOffset":4225,"count":9},{"startOffset":4225,"endOffset":4278,"count":48},{"startOffset":4278,"endOffset":4621,"count":17},{"startOffset":4344,"endOffset":4350,"count":10},{"startOffset":4350,"endOffset":4617,"count":7},{"startOffset":4529,"endOffset":4596,"count":1},{"startOffset":4621,"endOffset":4873,"count":41},{"startOffset":4873,"endOffset":5034,"count":8}],"isBlockCoverage":true},{"functionName":"addToAccumulator","ranges":[{"startOffset":5236,"endOffset":5401,"count":58},{"startOffset":5315,"endOffset":5320,"count":47}],"isBlockCoverage":true},{"functionName":"removeFromAccumulator","ranges":[{"startOffset":5491,"endOffset":5758,"count":8},{"startOffset":5592,"endOffset":5599,"count":0},{"startOffset":5755,"endOffset":5757,"count":0}],"isBlockCoverage":true},{"functionName":"pruneAccumulator","ranges":[{"startOffset":5760,"endOffset":6156,"count":71},{"startOffset":5850,"endOffset":5873,"count":24},{"startOffset":5875,"endOffset":5882,"count":50},{"startOffset":5882,"endOffset":6035,"count":21},{"startOffset":6035,"endOffset":6153,"count":2}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5947,"endOffset":5967,"count":22}],"isBlockCoverage":true},{"functionName":"sumAccumulator","ranges":[{"startOffset":6158,"endOffset":6308,"count":71},{"startOffset":6242,"endOffset":6251,"count":47},{"startOffset":6251,"endOffset":6307,"count":24}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6276,"endOffset":6300,"count":20}],"isBlockCoverage":true},{"functionName":"checkUserLimits","ranges":[{"startOffset":6506,"endOffset":7970,"count":17},{"startOffset":6614,"endOffset":6621,"count":1},{"startOffset":6621,"endOffset":6677,"count":16},{"startOffset":6677,"endOffset":7072,"count":14},{"startOffset":6794,"endOffset":6948,"count":6},{"startOffset":6931,"endOffset":6948,"count":1},{"startOffset":6948,"endOffset":7058,"count":8},{"startOffset":7058,"endOffset":7066,"count":3},{"startOffset":7072,"endOffset":7127,"count":10},{"startOffset":7127,"endOffset":7515,"count":5},{"startOffset":7242,"endOffset":7394,"count":2},{"startOffset":7377,"endOffset":7394,"count":1},{"startOffset":7394,"endOffset":7502,"count":3},{"startOffset":7502,"endOffset":7509,"count":1},{"startOffset":7515,"endOffset":7572,"count":8},{"startOffset":7572,"endOffset":7967,"count":3},{"startOffset":7689,"endOffset":7843,"count":2},{"startOffset":7826,"endOffset":7843,"count":1},{"startOffset":7843,"endOffset":7961,"count":1}],"isBlockCoverage":true},{"functionName":"tryCreditsOrThrow","ranges":[{"startOffset":8116,"endOffset":8308,"count":10},{"startOffset":8189,"endOffset":8286,"count":4},{"startOffset":8275,"endOffset":8282,"count":3},{"startOffset":8286,"endOffset":8307,"count":7}],"isBlockCoverage":true},{"functionName":"maybeFireGlobalThreshold","ranges":[{"startOffset":8780,"endOffset":9441,"count":49},{"startOffset":8894,"endOffset":8923,"count":14},{"startOffset":8924,"endOffset":8937,"count":12},{"startOffset":8939,"endOffset":8946,"count":37},{"startOffset":8946,"endOffset":9055,"count":12},{"startOffset":9055,"endOffset":9081,"count":9},{"startOffset":9083,"endOffset":9090,"count":5},{"startOffset":9090,"endOffset":9149,"count":7},{"startOffset":9182,"endOffset":9189,"count":0},{"startOffset":9189,"endOffset":9317,"count":7},{"startOffset":9317,"endOffset":9336,"count":1},{"startOffset":9337,"endOffset":9354,"count":6},{"startOffset":9430,"endOffset":9438,"count":1}],"isBlockCoverage":true},{"functionName":"maybeFireUserThreshold","ranges":[{"startOffset":9603,"endOffset":10257,"count":12},{"startOffset":9717,"endOffset":9746,"count":5},{"startOffset":9747,"endOffset":9760,"count":4},{"startOffset":9762,"endOffset":9769,"count":8},{"startOffset":9769,"endOffset":9904,"count":4},{"startOffset":9906,"endOffset":9913,"count":0},{"startOffset":9913,"endOffset":10017,"count":4},{"startOffset":10050,"endOffset":10057,"count":0},{"startOffset":10057,"endOffset":10246,"count":4},{"startOffset":10246,"endOffset":10254,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"236","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/billing/BillingLedger.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":24685,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":24685,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":250,"endOffset":297,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":337,"endOffset":380,"count":3},{"startOffset":370,"endOffset":378,"count":0}],"isBlockCoverage":true},{"functionName":"<instance_members_initializer>","ranges":[{"startOffset":600,"endOffset":5779,"count":0}],"isBlockCoverage":true},{"functionName":"storedToPublic","ranges":[{"startOffset":5959,"endOffset":6686,"count":0}],"isBlockCoverage":false}],"startOffset":209},{"scriptId":"237","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/billing/types.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":6881,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":6881,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":254,"endOffset":305,"count":32},{"startOffset":295,"endOffset":303,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":358,"endOffset":414,"count":10},{"startOffset":404,"endOffset":412,"count":0}],"isBlockCoverage":true},{"functionName":"BillingLimitError","ranges":[{"startOffset":458,"endOffset":714,"count":20}],"isBlockCoverage":true},{"functionName":"BillingValidationError","ranges":[{"startOffset":764,"endOffset":880,"count":5}],"isBlockCoverage":true}],"startOffset":209}]}
@@ -0,0 +1 @@
1
+ {"result":[{"scriptId":"233","url":"file:///Users/admin/Documents/GitHub/ugly-app/tests/server/NatsStore.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":35573,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":35573,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":454,"endOffset":682,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":743,"endOffset":849,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":800,"endOffset":814,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":890,"endOffset":1000,"count":1}],"isBlockCoverage":true},{"functionName":"StringCodec","ranges":[{"startOffset":912,"endOffset":997,"count":1}],"isBlockCoverage":true},{"functionName":"encode","ranges":[{"startOffset":930,"endOffset":951,"count":0}],"isBlockCoverage":false},{"functionName":"decode","ranges":[{"startOffset":962,"endOffset":994,"count":6}],"isBlockCoverage":true},{"functionName":"createControllableSub","ranges":[{"startOffset":1540,"endOffset":2010,"count":15}],"isBlockCoverage":true},{"functionName":"sub","ranges":[{"startOffset":1659,"endOffset":1792,"count":15}],"isBlockCoverage":true},{"functionName":"next","ranges":[{"startOffset":1698,"endOffset":1785,"count":21}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1730,"endOffset":1778,"count":21}],"isBlockCoverage":true},{"functionName":"push","ranges":[{"startOffset":1811,"endOffset":1979,"count":6}],"isBlockCoverage":true},{"functionName":"tick","ranges":[{"startOffset":2103,"endOffset":2157,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2121,"endOffset":2156,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2214,"endOffset":12668,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2260,"endOffset":2314,"count":20}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2536,"endOffset":4734,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2613,"endOffset":3115,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3187,"endOffset":3611,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3692,"endOffset":3965,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4030,"endOffset":4327,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4426,"endOffset":4729,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4970,"endOffset":7655,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5067,"endOffset":5569,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5661,"endOffset":6083,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6163,"endOffset":6430,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6529,"endOffset":6830,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6937,"endOffset":7650,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7881,"endOffset":10681,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7928,"endOffset":7971,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8083,"endOffset":8450,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8543,"endOffset":9096,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9193,"endOffset":9471,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9555,"endOffset":9828,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9888,"endOffset":10238,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10333,"endOffset":10676,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10383,"endOffset":10433,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10592,"endOffset":10656,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10909,"endOffset":12664,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11000,"endOffset":11300,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11359,"endOffset":11663,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11735,"endOffset":12254,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":12341,"endOffset":12659,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"235","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/NatsStore.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":17030,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":17030,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":249,"endOffset":295,"count":5},{"startOffset":285,"endOffset":293,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":345,"endOffset":398,"count":6},{"startOffset":388,"endOffset":396,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":443,"endOffset":491,"count":6},{"startOffset":481,"endOffset":489,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":542,"endOffset":596,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":642,"endOffset":691,"count":4},{"startOffset":681,"endOffset":689,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":737,"endOffset":786,"count":0}],"isBlockCoverage":false},{"functionName":"checkLeak","ranges":[{"startOffset":1453,"endOffset":1632,"count":15},{"startOffset":1534,"endOffset":1630,"count":0}],"isBlockCoverage":true},{"functionName":"subscribeDoc","ranges":[{"startOffset":1884,"endOffset":2533,"count":5}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2116,"endOffset":2366,"count":5},{"startOffset":2161,"endOffset":2363,"count":2},{"startOffset":2251,"endOffset":2359,"count":0},{"startOffset":2363,"endOffset":2365,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2376,"endOffset":2471,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":2482,"endOffset":2530,"count":1}],"isBlockCoverage":true},{"functionName":"subscribeCollection","ranges":[{"startOffset":2891,"endOffset":3522,"count":6}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3105,"endOffset":3355,"count":6},{"startOffset":3150,"endOffset":3352,"count":3},{"startOffset":3240,"endOffset":3348,"count":0},{"startOffset":3352,"endOffset":3354,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3365,"endOffset":3460,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":3471,"endOffset":3519,"count":1}],"isBlockCoverage":true},{"functionName":"publishDocKeys","ranges":[{"startOffset":3942,"endOffset":4287,"count":6},{"startOffset":4024,"endOffset":4285,"count":7},{"startOffset":4068,"endOffset":4081,"count":6},{"startOffset":4083,"endOffset":4092,"count":2},{"startOffset":4092,"endOffset":4274,"count":5},{"startOffset":4274,"endOffset":4282,"count":1}],"isBlockCoverage":true},{"functionName":"publishDocKeyDeletes","ranges":[{"startOffset":4543,"endOffset":4895,"count":0}],"isBlockCoverage":false},{"functionName":"subscribeDocKey","ranges":[{"startOffset":5090,"endOffset":5751,"count":4}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5334,"endOffset":5584,"count":4},{"startOffset":5379,"endOffset":5581,"count":1},{"startOffset":5469,"endOffset":5577,"count":0},{"startOffset":5581,"endOffset":5583,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5594,"endOffset":5689,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":5700,"endOffset":5748,"count":1}],"isBlockCoverage":true},{"functionName":"escapeNatsToken","ranges":[{"startOffset":5753,"endOffset":5899,"count":14}],"isBlockCoverage":true}],"startOffset":209}]}
@@ -0,0 +1 @@
1
+ {"result":[{"scriptId":"233","url":"file:///Users/admin/Documents/GitHub/ugly-app/tests/server/PushNotification.test.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":32410,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":32410,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":791,"endOffset":853,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":892,"endOffset":954,"count":15}],"isBlockCoverage":true},{"functionName":"makeMockWs","ranges":[{"startOffset":957,"endOffset":1163,"count":15}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1085,"endOffset":1128,"count":12}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1219,"endOffset":9474,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1291,"endOffset":3398,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1392,"endOffset":1602,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1700,"endOffset":2406,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":2508,"endOffset":2979,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3065,"endOffset":3393,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3451,"endOffset":4776,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":3548,"endOffset":3960,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4034,"endOffset":4501,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4588,"endOffset":4771,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4835,"endOffset":9470,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":4936,"endOffset":5562,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":5666,"endOffset":6852,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6965,"endOffset":7885,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":7975,"endOffset":8673,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8752,"endOffset":9465,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":8860,"endOffset":8910,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9004,"endOffset":9012,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9727,"endOffset":11949,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":9772,"endOffset":9920,"count":3}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10029,"endOffset":10461,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10128,"endOffset":10136,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10552,"endOffset":11116,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":10793,"endOffset":10801,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11212,"endOffset":11945,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":11475,"endOffset":11483,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"235","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/PushNotification.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":14768,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":14768,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":259,"endOffset":315,"count":16},{"startOffset":305,"endOffset":313,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":354,"endOffset":396,"count":14},{"startOffset":386,"endOffset":394,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":438,"endOffset":483,"count":3},{"startOffset":473,"endOffset":481,"count":0}],"isBlockCoverage":true},{"functionName":"registerPushConnection","ranges":[{"startOffset":1048,"endOffset":2070,"count":16},{"startOffset":1136,"endOffset":1183,"count":13},{"startOffset":1486,"endOffset":1741,"count":13}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1521,"endOffset":1529,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":1630,"endOffset":1695,"count":11}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":1751,"endOffset":2067,"count":4},{"startOffset":1890,"endOffset":2060,"count":3}],"isBlockCoverage":true},{"functionName":"deliverToLocalConnections","ranges":[{"startOffset":2072,"endOffset":2665,"count":11},{"startOffset":2196,"endOffset":2203,"count":0},{"startOffset":2271,"endOffset":2386,"count":0},{"startOffset":2419,"endOffset":2663,"count":14},{"startOffset":2448,"endOffset":2660,"count":13},{"startOffset":2557,"endOffset":2656,"count":1}],"isBlockCoverage":true},{"functionName":"sendPush","ranges":[{"startOffset":2836,"endOffset":3100,"count":14}],"isBlockCoverage":true},{"functionName":"sendFcmPush","ranges":[{"startOffset":3262,"endOffset":4645,"count":3},{"startOffset":3502,"endOffset":3516,"count":1},{"startOffset":3517,"endOffset":3532,"count":1},{"startOffset":3534,"endOffset":3624,"count":2},{"startOffset":3624,"endOffset":3949,"count":1},{"startOffset":3949,"endOffset":4382,"count":0},{"startOffset":4383,"endOffset":4394,"count":0},{"startOffset":4422,"endOffset":4526,"count":0},{"startOffset":4527,"endOffset":4538,"count":0},{"startOffset":4572,"endOffset":4576,"count":0},{"startOffset":4576,"endOffset":4643,"count":1}],"isBlockCoverage":true}],"startOffset":209},{"scriptId":"236","url":"file:///Users/admin/Documents/GitHub/ugly-app/src/server/Redis.ts","functions":[{"functionName":"","ranges":[{"startOffset":0,"endOffset":21519,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":13,"endOffset":21519,"count":1}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":249,"endOffset":295,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":340,"endOffset":388,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":427,"endOffset":469,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":508,"endOffset":550,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":589,"endOffset":631,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":674,"endOffset":720,"count":14},{"startOffset":710,"endOffset":718,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":765,"endOffset":813,"count":13},{"startOffset":803,"endOffset":811,"count":0}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":860,"endOffset":910,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":951,"endOffset":995,"count":30},{"startOffset":985,"endOffset":993,"count":0}],"isBlockCoverage":true},{"functionName":"onRedisMessage","ranges":[{"startOffset":1659,"endOffset":1956,"count":0}],"isBlockCoverage":false},{"functionName":"connectRedis","ranges":[{"startOffset":2061,"endOffset":3340,"count":0}],"isBlockCoverage":false},{"functionName":"getRedisClient","ranges":[{"startOffset":3599,"endOffset":3649,"count":0}],"isBlockCoverage":false},{"functionName":"redisGet","ranges":[{"startOffset":3718,"endOffset":4032,"count":0}],"isBlockCoverage":false},{"functionName":"redisSet","ranges":[{"startOffset":4092,"endOffset":4462,"count":0}],"isBlockCoverage":false},{"functionName":"redisDel","ranges":[{"startOffset":4496,"endOffset":4620,"count":0}],"isBlockCoverage":false},{"functionName":"redisPublish","ranges":[{"startOffset":4854,"endOffset":5307,"count":14},{"startOffset":4920,"endOffset":4981,"count":0},{"startOffset":5114,"endOffset":5305,"count":13},{"startOffset":5153,"endOffset":5302,"count":11},{"startOffset":5191,"endOffset":5298,"count":0}],"isBlockCoverage":true},{"functionName":"redisSubscribe","ranges":[{"startOffset":5818,"endOffset":6951,"count":13},{"startOffset":5891,"endOffset":6711,"count":0},{"startOffset":6776,"endOffset":6827,"count":12}],"isBlockCoverage":true},{"functionName":"","ranges":[{"startOffset":6322,"endOffset":6707,"count":0}],"isBlockCoverage":false},{"functionName":"","ranges":[{"startOffset":6885,"endOffset":6948,"count":3}],"isBlockCoverage":true},{"functionName":"isRedisConnected","ranges":[{"startOffset":7027,"endOffset":7088,"count":0}],"isBlockCoverage":false},{"functionName":"closeRedis","ranges":[{"startOffset":7166,"endOffset":7452,"count":30},{"startOffset":7245,"endOffset":7299,"count":0},{"startOffset":7324,"endOffset":7450,"count":0}],"isBlockCoverage":true}],"startOffset":209}]}