@stackframe/stack-shared 2.8.55 → 2.8.58

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 (154) hide show
  1. package/dist/apps/apps-config.d.mts +7 -1
  2. package/dist/apps/apps-config.d.ts +7 -1
  3. package/dist/apps/apps-config.js +7 -1
  4. package/dist/apps/apps-config.js.map +1 -1
  5. package/dist/config/schema-fuzzer.test.js +3 -0
  6. package/dist/config/schema-fuzzer.test.js.map +1 -1
  7. package/dist/config/schema.d.mts +162 -114
  8. package/dist/config/schema.d.ts +162 -114
  9. package/dist/config/schema.js +7 -0
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/esm/apps/apps-config.js +7 -1
  12. package/dist/esm/apps/apps-config.js.map +1 -1
  13. package/dist/esm/config/schema-fuzzer.test.js +3 -0
  14. package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
  15. package/dist/esm/config/schema.js +7 -0
  16. package/dist/esm/config/schema.js.map +1 -1
  17. package/dist/esm/interface/admin-interface.js +49 -1
  18. package/dist/esm/interface/admin-interface.js.map +1 -1
  19. package/dist/esm/interface/client-interface.js +13 -4
  20. package/dist/esm/interface/client-interface.js.map +1 -1
  21. package/dist/esm/interface/crud/current-user.js +5 -2
  22. package/dist/esm/interface/crud/current-user.js.map +1 -1
  23. package/dist/esm/interface/crud/email-outbox.js +204 -0
  24. package/dist/esm/interface/crud/email-outbox.js.map +1 -0
  25. package/dist/esm/interface/crud/emails.js +6 -3
  26. package/dist/esm/interface/crud/emails.js.map +1 -1
  27. package/dist/esm/interface/crud/notification-preferences.js +13 -1
  28. package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
  29. package/dist/esm/interface/crud/oauth-providers.js +10 -5
  30. package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
  31. package/dist/esm/interface/crud/projects.js +9 -4
  32. package/dist/esm/interface/crud/projects.js.map +1 -1
  33. package/dist/esm/interface/crud/users.js +9 -2
  34. package/dist/esm/interface/crud/users.js.map +1 -1
  35. package/dist/esm/interface/server-interface.js +16 -0
  36. package/dist/esm/interface/server-interface.js.map +1 -1
  37. package/dist/esm/known-errors.js +45 -1
  38. package/dist/esm/known-errors.js.map +1 -1
  39. package/dist/esm/schema-fields.js +26 -2
  40. package/dist/esm/schema-fields.js.map +1 -1
  41. package/dist/esm/sessions.js +72 -8
  42. package/dist/esm/sessions.js.map +1 -1
  43. package/dist/esm/utils/env.js +13 -2
  44. package/dist/esm/utils/env.js.map +1 -1
  45. package/dist/esm/utils/esbuild.js +50 -21
  46. package/dist/esm/utils/esbuild.js.map +1 -1
  47. package/dist/esm/utils/globals.js +12 -0
  48. package/dist/esm/utils/globals.js.map +1 -1
  49. package/dist/esm/utils/paginated-lists.js +153 -23
  50. package/dist/esm/utils/paginated-lists.js.map +1 -1
  51. package/dist/esm/utils/paginated-lists.test.js +842 -0
  52. package/dist/esm/utils/paginated-lists.test.js.map +1 -0
  53. package/dist/esm/utils/proxies.js +28 -1
  54. package/dist/esm/utils/proxies.js.map +1 -1
  55. package/dist/esm/utils/react.js +7 -3
  56. package/dist/esm/utils/react.js.map +1 -1
  57. package/dist/esm/utils/results.js.map +1 -1
  58. package/dist/index.d.mts +1 -1
  59. package/dist/index.d.ts +1 -1
  60. package/dist/interface/admin-interface.d.mts +26 -3
  61. package/dist/interface/admin-interface.d.ts +26 -3
  62. package/dist/interface/admin-interface.js +49 -1
  63. package/dist/interface/admin-interface.js.map +1 -1
  64. package/dist/interface/client-interface.d.mts +5 -0
  65. package/dist/interface/client-interface.d.ts +5 -0
  66. package/dist/interface/client-interface.js +13 -4
  67. package/dist/interface/client-interface.js.map +1 -1
  68. package/dist/interface/crud/current-user.d.mts +23 -6
  69. package/dist/interface/crud/current-user.d.ts +23 -6
  70. package/dist/interface/crud/current-user.js +5 -2
  71. package/dist/interface/crud/current-user.js.map +1 -1
  72. package/dist/interface/crud/email-outbox.d.mts +1075 -0
  73. package/dist/interface/crud/email-outbox.d.ts +1075 -0
  74. package/dist/interface/crud/email-outbox.js +241 -0
  75. package/dist/interface/crud/email-outbox.js.map +1 -0
  76. package/dist/interface/crud/emails.d.mts +5 -34
  77. package/dist/interface/crud/emails.d.ts +5 -34
  78. package/dist/interface/crud/emails.js +6 -3
  79. package/dist/interface/crud/emails.js.map +1 -1
  80. package/dist/interface/crud/notification-preferences.d.mts +12 -0
  81. package/dist/interface/crud/notification-preferences.d.ts +12 -0
  82. package/dist/interface/crud/notification-preferences.js +13 -1
  83. package/dist/interface/crud/notification-preferences.js.map +1 -1
  84. package/dist/interface/crud/oauth-providers.d.mts +5 -0
  85. package/dist/interface/crud/oauth-providers.d.ts +5 -0
  86. package/dist/interface/crud/oauth-providers.js +10 -5
  87. package/dist/interface/crud/oauth-providers.js.map +1 -1
  88. package/dist/interface/crud/project-api-keys.d.mts +1 -1
  89. package/dist/interface/crud/project-api-keys.d.ts +1 -1
  90. package/dist/interface/crud/projects.d.mts +73 -66
  91. package/dist/interface/crud/projects.d.ts +73 -66
  92. package/dist/interface/crud/projects.js +9 -4
  93. package/dist/interface/crud/projects.js.map +1 -1
  94. package/dist/interface/crud/team-member-profiles.d.mts +28 -12
  95. package/dist/interface/crud/team-member-profiles.d.ts +28 -12
  96. package/dist/interface/crud/users.d.mts +38 -6
  97. package/dist/interface/crud/users.d.ts +38 -6
  98. package/dist/interface/crud/users.js +9 -2
  99. package/dist/interface/crud/users.js.map +1 -1
  100. package/dist/interface/server-interface.d.mts +29 -0
  101. package/dist/interface/server-interface.d.ts +29 -0
  102. package/dist/interface/server-interface.js +16 -0
  103. package/dist/interface/server-interface.js.map +1 -1
  104. package/dist/interface/webhooks.d.mts +18 -2
  105. package/dist/interface/webhooks.d.ts +18 -2
  106. package/dist/known-errors.d.mts +14 -1
  107. package/dist/known-errors.d.ts +14 -1
  108. package/dist/known-errors.js +45 -1
  109. package/dist/known-errors.js.map +1 -1
  110. package/dist/schema-fields.d.mts +34 -1
  111. package/dist/schema-fields.d.ts +34 -1
  112. package/dist/schema-fields.js +32 -2
  113. package/dist/schema-fields.js.map +1 -1
  114. package/dist/sessions.d.mts +36 -5
  115. package/dist/sessions.d.ts +36 -5
  116. package/dist/sessions.js +72 -8
  117. package/dist/sessions.js.map +1 -1
  118. package/dist/utils/env.d.mts +2 -1
  119. package/dist/utils/env.d.ts +2 -1
  120. package/dist/utils/env.js +13 -1
  121. package/dist/utils/env.js.map +1 -1
  122. package/dist/utils/esbuild.js +49 -20
  123. package/dist/utils/esbuild.js.map +1 -1
  124. package/dist/utils/globals.d.mts +6 -1
  125. package/dist/utils/globals.d.ts +6 -1
  126. package/dist/utils/globals.js +13 -0
  127. package/dist/utils/globals.js.map +1 -1
  128. package/dist/utils/paginated-lists.d.mts +269 -12
  129. package/dist/utils/paginated-lists.d.ts +269 -12
  130. package/dist/utils/paginated-lists.js +153 -23
  131. package/dist/utils/paginated-lists.js.map +1 -1
  132. package/dist/utils/paginated-lists.test.d.mts +2 -0
  133. package/dist/utils/paginated-lists.test.d.ts +2 -0
  134. package/dist/utils/paginated-lists.test.js +844 -0
  135. package/dist/utils/paginated-lists.test.js.map +1 -0
  136. package/dist/utils/proxies.d.mts +8 -1
  137. package/dist/utils/proxies.d.ts +8 -1
  138. package/dist/utils/proxies.js +30 -2
  139. package/dist/utils/proxies.js.map +1 -1
  140. package/dist/utils/react.d.mts +1 -1
  141. package/dist/utils/react.d.ts +1 -1
  142. package/dist/utils/react.js +7 -3
  143. package/dist/utils/react.js.map +1 -1
  144. package/dist/utils/results.d.mts +5 -5
  145. package/dist/utils/results.d.ts +5 -5
  146. package/dist/utils/results.js.map +1 -1
  147. package/package.json +2 -1
  148. package/CHANGELOG.md +0 -1348
  149. package/dist/esm/interface/crud/config.js +0 -40
  150. package/dist/esm/interface/crud/config.js.map +0 -1
  151. package/dist/interface/crud/config.d.mts +0 -49
  152. package/dist/interface/crud/config.d.ts +0 -49
  153. package/dist/interface/crud/config.js +0 -79
  154. package/dist/interface/crud/config.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/paginated-lists.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { ArrayPaginatedList, PaginatedList } from \"./paginated-lists\";\nimport { stringCompare } from \"./strings\";\n\ntype NumberFilter = (item: number) => boolean;\ntype NumberOrderBy = (a: number, b: number) => number;\n\n// Helper to extract just the items from a paginated result\nconst items = <T>(result: { items: { item: T }[] }) => result.items.map(i => i.item);\n\ndescribe(\"ArrayPaginatedList\", () => {\n describe(\"basic forward pagination (next)\", () => {\n it(\"should return all items when limit is greater than array length\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 3]);\n expect(result.isFirst).toBe(true);\n expect(result.isLast).toBe(true);\n });\n\n it(\"should return exact limit when more items exist\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 3]);\n expect(result.isFirst).toBe(true);\n expect(result.isLast).toBe(false);\n });\n\n it(\"should continue from cursor correctly\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const first = await list.next({\n after: list.getFirstCursor(),\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(first)).toEqual([1, 2]);\n expect(first.cursor).toBe(\"before-2\");\n\n const second = await list.next({\n after: first.cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([3, 4]);\n expect(second.isFirst).toBe(false);\n expect(second.isLast).toBe(false);\n });\n\n it(\"should handle empty array\", async () => {\n const list = new ArrayPaginatedList<number>([]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([]);\n expect(result.isFirst).toBe(true);\n expect(result.isLast).toBe(true);\n });\n\n it(\"should handle limit of 0\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 0,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([]);\n });\n });\n\n describe(\"backward pagination (prev)\", () => {\n it(\"should return items before cursor\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.prev({\n before: list.getLastCursor(),\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([4, 5]);\n expect(result.isFirst).toBe(false);\n expect(result.isLast).toBe(true);\n });\n\n it(\"should paginate backwards correctly\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n\n const last = await list.prev({\n before: list.getLastCursor(),\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n expect(items(last)).toEqual([4, 5]);\n\n const middle = await list.prev({\n before: last.cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n expect(items(middle)).toEqual([2, 3]);\n\n const first = await list.prev({\n before: middle.cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n expect(items(first)).toEqual([1]);\n expect(first.isFirst).toBe(true);\n });\n });\n\n describe(\"cursor semantics (prevCursor and nextCursor)\", () => {\n it(\"should have prevCursor before the item and nextCursor after\", async () => {\n const list = new ArrayPaginatedList([10, 20, 30]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n // First item: prevCursor should be \"before-0\", nextCursor should be \"before-1\"\n expect(result.items[0].prevCursor).toBe(\"before-0\");\n expect(result.items[0].nextCursor).toBe(\"before-1\");\n\n // Second item\n expect(result.items[1].prevCursor).toBe(\"before-1\");\n expect(result.items[1].nextCursor).toBe(\"before-2\");\n\n // Third item\n expect(result.items[2].prevCursor).toBe(\"before-2\");\n expect(result.items[2].nextCursor).toBe(\"before-3\");\n });\n\n it(\"should allow using nextCursor to continue forward pagination\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n\n const first = await list.next({\n after: list.getFirstCursor(),\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n // Use the nextCursor of the last item to continue\n const continueFrom = first.items[first.items.length - 1].nextCursor;\n const second = await list.next({\n after: continueFrom,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([3, 4]);\n });\n\n it(\"should allow using prevCursor to go back\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n\n // Get items 3,4,5 first\n const middle = await list.next({\n after: \"before-2\",\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(middle)).toEqual([3, 4, 5]);\n expect(middle.items[0].prevCursor).toBe(\"before-2\");\n\n // Use prevCursor of first item to go back\n const goBack = await list.prev({\n before: middle.items[0].prevCursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(goBack)).toEqual([1, 2]);\n });\n });\n\n describe(\"filtering\", () => {\n it(\"should filter items correctly\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: (n) => n % 2 === 0, // only even numbers\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([2, 4, 6]);\n });\n\n it(\"should respect limit with filtering\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 2,\n filter: (n) => n % 2 === 0,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([2, 4]);\n });\n\n it(\"should handle filter that matches nothing\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => false,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([]);\n });\n });\n\n describe(\"ordering\", () => {\n it(\"should sort items in ascending order\", async () => {\n const list = new ArrayPaginatedList([5, 2, 8, 1, 9]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 5, 8, 9]);\n });\n\n it(\"should sort items in descending order\", async () => {\n const list = new ArrayPaginatedList([5, 2, 8, 1, 9]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => b - a,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([9, 8, 5, 2, 1]);\n });\n\n it(\"should sort objects by property\", async () => {\n const list = new ArrayPaginatedList([\n { name: \"Charlie\", age: 30 },\n { name: \"Alice\", age: 25 },\n { name: \"Bob\", age: 35 },\n ]);\n\n const byName = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => stringCompare(a.name, b.name),\n limitPrecision: \"exact\",\n });\n\n expect(items(byName).map(p => p.name)).toEqual([\"Alice\", \"Bob\", \"Charlie\"]);\n\n const byAge = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a.age - b.age,\n limitPrecision: \"exact\",\n });\n\n expect(items(byAge).map(p => p.name)).toEqual([\"Alice\", \"Charlie\", \"Bob\"]);\n });\n });\n\n describe(\"limitPrecision\", () => {\n it(\"exact should return exactly the limit\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(result.items.length).toBe(3);\n });\n\n // Note: ArrayPaginatedList always returns exact results since it has all data in memory\n // These tests verify the contract is respected\n it(\"at-least should return at least the limit (or all if less available)\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"at-least\",\n });\n\n expect(result.items.length).toBeGreaterThanOrEqual(3);\n });\n\n it(\"at-most should return at most the limit\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"at-most\",\n });\n\n expect(result.items.length).toBeLessThanOrEqual(3);\n });\n\n it(\"approximate should allow flexibility in either direction\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"approximate\",\n });\n\n // With 'approximate', the implementation can return more or fewer items\n // than requested. We just verify it returns some items and makes progress.\n expect(result.items.length).toBeGreaterThan(0);\n // Should still return valid items\n expect(items(result).every(n => typeof n === \"number\")).toBe(true);\n });\n\n it(\"approximate should still make progress when limit > 0\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n const allItems: number[] = [];\n\n let cursor = list.getFirstCursor();\n let iterations = 0;\n const maxIterations = 20; // Safety limit to prevent infinite loops\n\n while (iterations < maxIterations) {\n const result = await list.next({\n after: cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"approximate\",\n });\n\n if (result.items.length === 0) break;\n\n allItems.push(...items(result));\n // Cursor must change to ensure progress\n expect(result.cursor).not.toBe(cursor);\n cursor = result.cursor;\n iterations++;\n\n if (result.isLast) break;\n }\n\n // Should eventually get all items\n expect(allItems.length).toBeGreaterThan(0);\n });\n });\n\n describe(\"getFirstCursor and getLastCursor\", () => {\n it(\"should return correct cursor format\", () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n expect(list.getFirstCursor()).toBe(\"before-0\");\n expect(list.getLastCursor()).toBe(\"before-3\");\n });\n\n it(\"should work for empty array\", () => {\n const list = new ArrayPaginatedList([]);\n expect(list.getFirstCursor()).toBe(\"before-0\");\n expect(list.getLastCursor()).toBe(\"before-0\");\n });\n });\n\n describe(\"compare\", () => {\n it(\"should compare items using the orderBy function\", () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const orderBy = (a: number, b: number) => a - b;\n\n expect(list.compare(orderBy, 1, 2)).toBeLessThan(0);\n expect(list.compare(orderBy, 2, 1)).toBeGreaterThan(0);\n expect(list.compare(orderBy, 1, 1)).toBe(0);\n });\n });\n});\n\ndescribe(\"PaginatedList.empty\", () => {\n it(\"should return empty results\", async () => {\n const list = PaginatedList.empty();\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: {},\n orderBy: {},\n limitPrecision: \"exact\",\n });\n\n expect(result.items).toEqual([]);\n expect(result.isFirst).toBe(true);\n expect(result.isLast).toBe(true);\n });\n\n it(\"should have first cursor\", () => {\n const list = PaginatedList.empty();\n expect(list.getFirstCursor()).toBe(\"first\");\n expect(list.getLastCursor()).toBe(\"last\");\n });\n});\n\ndescribe(\"PaginatedList.map\", () => {\n it(\"should transform items\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const doubled = list.map<number, NumberFilter, NumberOrderBy>({\n itemMapper: (n) => n * 2,\n oldItemFromNewItem: (n) => n / 2,\n oldFilterFromNewFilter: (f) => f,\n oldOrderByFromNewOrderBy: (o) => o,\n });\n\n const result = await doubled.next({\n after: doubled.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([2, 4, 6]);\n });\n\n it(\"should preserve cursor semantics\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const doubled = list.map<number, NumberFilter, NumberOrderBy>({\n itemMapper: (n) => n * 2,\n oldItemFromNewItem: (n) => n / 2,\n oldFilterFromNewFilter: (f) => f,\n oldOrderByFromNewOrderBy: (o) => o,\n });\n\n const first = await doubled.next({\n after: doubled.getFirstCursor(),\n limit: 1,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(first)).toEqual([2]);\n\n const second = await doubled.next({\n after: first.cursor,\n limit: 1,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([4]);\n });\n});\n\ndescribe(\"PaginatedList.filter\", () => {\n it(\"should filter items\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6]);\n const evens = list.filter({\n filter: (n) => n % 2 === 0,\n oldFilterFromNewFilter: () => () => true,\n estimateItemsToFetch: ({ limit }) => limit * 2,\n });\n\n const result = await evens.next({\n after: evens.getFirstCursor(),\n limit: 10,\n filter: undefined,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([2, 4, 6]);\n });\n});\n\ndescribe(\"PaginatedList.addFilter\", () => {\n it(\"should add additional filter constraint\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n\n // First filter: only even\n const evens = list.filter({\n filter: (n) => n % 2 === 0,\n oldFilterFromNewFilter: () => () => true,\n estimateItemsToFetch: ({ limit }) => limit * 2,\n });\n\n // Add filter: only > 5\n const evenAndGreaterThan5 = evens.addFilter({\n filter: (n) => n > 5,\n estimateItemsToFetch: ({ limit }) => limit * 2,\n });\n\n const result = await evenAndGreaterThan5.next({\n after: evenAndGreaterThan5.getFirstCursor(),\n limit: 10,\n filter: undefined,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([6, 8, 10]);\n });\n});\n\ndescribe(\"PaginatedList.flatMap\", () => {\n it(\"should expand items\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3]);\n const expanded = list.flatMap<number, `before-${number}`, NumberFilter, NumberOrderBy>({\n itemMapper: (entry) => [\n { item: entry.item, prevCursor: entry.prevCursor, nextCursor: entry.nextCursor },\n { item: entry.item + 0.5, prevCursor: entry.prevCursor, nextCursor: entry.nextCursor },\n ],\n compare: (_, a, b) => a - b,\n newCursorFromOldCursor: (c) => c,\n oldCursorFromNewCursor: (c) => c,\n oldFilterFromNewFilter: (f) => f,\n oldOrderByFromNewOrderBy: (o) => o,\n estimateItemsToFetch: ({ limit }) => limit,\n });\n\n const result = await expanded.next({\n after: expanded.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 1.5, 2, 2.5, 3, 3.5]);\n });\n\n it(\"should filter out items (return empty array)\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5]);\n const evensOnly = list.flatMap<number, `before-${number}`, NumberFilter, NumberOrderBy>({\n itemMapper: (entry) => entry.item % 2 === 0\n ? [{ item: entry.item, prevCursor: entry.prevCursor, nextCursor: entry.nextCursor }]\n : [],\n compare: (_, a, b) => a - b,\n newCursorFromOldCursor: (c) => c,\n oldCursorFromNewCursor: (c) => c,\n oldFilterFromNewFilter: (f) => f,\n oldOrderByFromNewOrderBy: (o) => o,\n estimateItemsToFetch: ({ limit }) => limit * 2,\n });\n\n const result = await evensOnly.next({\n after: evensOnly.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([2, 4]);\n });\n});\n\ndescribe(\"PaginatedList.merge\", () => {\n it(\"should merge two lists\", async () => {\n const list1 = new ArrayPaginatedList([1, 3, 5]);\n const list2 = new ArrayPaginatedList([2, 4, 6]);\n\n const merged = PaginatedList.merge(list1, list2);\n\n const result = await merged.next({\n after: merged.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 3, 4, 5, 6]);\n });\n\n it(\"should merge three lists\", async () => {\n const list1 = new ArrayPaginatedList([1, 4, 7]);\n const list2 = new ArrayPaginatedList([2, 5, 8]);\n const list3 = new ArrayPaginatedList([3, 6, 9]);\n\n const merged = PaginatedList.merge(list1, list2, list3);\n\n const result = await merged.next({\n after: merged.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n });\n\n it(\"should handle empty lists in merge\", async () => {\n const list1 = new ArrayPaginatedList([1, 2, 3]);\n const list2 = new ArrayPaginatedList<number>([]);\n\n const merged = PaginatedList.merge(list1, list2);\n\n const result = await merged.next({\n after: merged.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 2, 3]);\n });\n\n it(\"should paginate through merged list\", async () => {\n const list1 = new ArrayPaginatedList([1, 3, 5, 7, 9]);\n const list2 = new ArrayPaginatedList([2, 4, 6, 8, 10]);\n\n const merged = PaginatedList.merge(list1, list2);\n\n const first = await merged.next({\n after: merged.getFirstCursor(),\n limit: 4,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(first)).toEqual([1, 2, 3, 4]);\n\n const second = await merged.next({\n after: first.cursor,\n limit: 4,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([5, 6, 7, 8]);\n });\n\n it(\"should have JSON-encoded cursor\", () => {\n const list1 = new ArrayPaginatedList([1, 2]);\n const list2 = new ArrayPaginatedList([3, 4]);\n\n const merged = PaginatedList.merge(list1, list2);\n const cursor = merged.getFirstCursor();\n\n expect(() => JSON.parse(cursor)).not.toThrow();\n expect(JSON.parse(cursor)).toEqual([\"before-0\", \"before-0\"]);\n });\n\n it(\"should paginate backward through merged list correctly\", async () => {\n const list1 = new ArrayPaginatedList([1, 3, 5]);\n const list2 = new ArrayPaginatedList([2, 4, 6]);\n\n const merged = PaginatedList.merge(list1, list2);\n\n // Get last 3 items going backward\n const last = await merged.prev({\n before: merged.getLastCursor(),\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(last)).toEqual([4, 5, 6]);\n expect(last.isLast).toBe(true);\n expect(last.isFirst).toBe(false);\n\n // Continue backward to get previous 3 items\n const middle = await merged.prev({\n before: last.cursor,\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(middle)).toEqual([1, 2, 3]);\n expect(middle.isFirst).toBe(true);\n });\n\n it(\"should paginate backward through entire merged list\", async () => {\n const list1 = new ArrayPaginatedList([1, 3, 5, 7, 9]);\n const list2 = new ArrayPaginatedList([2, 4, 6, 8, 10]);\n\n const merged = PaginatedList.merge(list1, list2);\n const allItems: number[] = [];\n\n let cursor = merged.getLastCursor();\n let isFirst = false;\n\n while (!isFirst) {\n const result = await merged.prev({\n before: cursor,\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n allItems.unshift(...items(result));\n cursor = result.cursor;\n isFirst = result.isFirst;\n }\n\n expect(allItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n });\n\n it(\"should have consistent forward and backward pagination results\", async () => {\n const list1 = new ArrayPaginatedList([1, 4, 7]);\n const list2 = new ArrayPaginatedList([2, 5, 8]);\n const list3 = new ArrayPaginatedList([3, 6, 9]);\n\n const merged = PaginatedList.merge(list1, list2, list3);\n\n // Collect all items going forward\n const forwardItems: number[] = [];\n let forwardCursor = merged.getFirstCursor();\n let isLast = false;\n\n while (!isLast) {\n const result = await merged.next({\n after: forwardCursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n forwardItems.push(...items(result));\n forwardCursor = result.cursor;\n isLast = result.isLast;\n }\n\n // Collect all items going backward\n const backwardItems: number[] = [];\n let backwardCursor = merged.getLastCursor();\n let isFirst = false;\n\n while (!isFirst) {\n const result = await merged.prev({\n before: backwardCursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n backwardItems.unshift(...items(result));\n backwardCursor = result.cursor;\n isFirst = result.isFirst;\n }\n\n // Both directions should yield the same final result\n expect(forwardItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n expect(backwardItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n });\n});\n\ndescribe(\"edge cases\", () => {\n it(\"should handle single item\", async () => {\n const list = new ArrayPaginatedList([42]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([42]);\n expect(result.isFirst).toBe(true);\n expect(result.isLast).toBe(true);\n });\n\n it(\"should handle duplicate values\", async () => {\n const list = new ArrayPaginatedList([1, 1, 2, 2, 3, 3]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([1, 1, 2, 2, 3, 3]);\n });\n\n it(\"should handle negative numbers\", async () => {\n const list = new ArrayPaginatedList([-3, -1, 0, 1, 3]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([-3, -1, 0, 1, 3]);\n });\n\n it(\"should handle string items\", async () => {\n const list = new ArrayPaginatedList([\"banana\", \"apple\", \"cherry\"]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => stringCompare(a, b),\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([\"apple\", \"banana\", \"cherry\"]);\n });\n\n it(\"should handle object items\", async () => {\n const list = new ArrayPaginatedList([\n { id: 1, value: \"a\" },\n { id: 2, value: \"b\" },\n ]);\n const result = await list.next({\n after: list.getFirstCursor(),\n limit: 10,\n filter: () => true,\n orderBy: (a, b) => a.id - b.id,\n limitPrecision: \"exact\",\n });\n\n expect(items(result)).toEqual([\n { id: 1, value: \"a\" },\n { id: 2, value: \"b\" },\n ]);\n });\n});\n\ndescribe(\"complete pagination walkthrough\", () => {\n it(\"should paginate forward through entire list\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n const allItems: number[] = [];\n\n let cursor = list.getFirstCursor();\n let isLast = false;\n\n while (!isLast) {\n const result = await list.next({\n after: cursor,\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n allItems.push(...items(result));\n cursor = result.cursor;\n isLast = result.isLast;\n }\n\n expect(allItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n });\n\n it(\"should paginate backward through entire list\", async () => {\n const list = new ArrayPaginatedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n const allItems: number[] = [];\n\n let cursor = list.getLastCursor();\n let isFirst = false;\n\n while (!isFirst) {\n const result = await list.prev({\n before: cursor,\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n allItems.unshift(...items(result));\n cursor = result.cursor;\n isFirst = result.isFirst;\n }\n\n expect(allItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n });\n});\n\ndescribe(\"unsorted array pagination\", () => {\n it(\"should correctly paginate through an unsorted array with sorting\", async () => {\n const list = new ArrayPaginatedList([3, 1, 2]);\n\n const first = await list.next({\n after: list.getFirstCursor(),\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(first)).toEqual([1, 2]);\n\n const second = await list.next({\n after: first.cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([3]);\n });\n\n it(\"should maintain sorted order across pagination boundaries\", async () => {\n const list = new ArrayPaginatedList([5, 4, 3, 2, 1]);\n const allItems: number[] = [];\n\n let cursor = list.getFirstCursor();\n let isLast = false;\n\n while (!isLast) {\n const result = await list.next({\n after: cursor,\n limit: 2,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n allItems.push(...items(result));\n cursor = result.cursor;\n isLast = result.isLast;\n }\n\n expect(allItems).toEqual([1, 2, 3, 4, 5]);\n });\n\n it(\"should handle random order array correctly\", async () => {\n const list = new ArrayPaginatedList([7, 2, 9, 1, 5, 8, 3, 6, 4]);\n\n const allItems: number[] = [];\n let cursor = list.getFirstCursor();\n let isLast = false;\n\n while (!isLast) {\n const result = await list.next({\n after: cursor,\n limit: 3,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n allItems.push(...items(result));\n cursor = result.cursor;\n isLast = result.isLast;\n }\n\n expect(allItems).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n });\n\n it(\"should have consistent cursor semantics with sorted data\", async () => {\n const list = new ArrayPaginatedList([3, 1, 2]);\n\n const first = await list.next({\n after: list.getFirstCursor(),\n limit: 1,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(first)).toEqual([1]);\n\n const second = await list.next({\n after: first.cursor,\n limit: 1,\n filter: () => true,\n orderBy: (a, b) => a - b,\n limitPrecision: \"exact\",\n });\n\n expect(items(second)).toEqual([2]);\n });\n});\n\n"],"mappings":"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","names":[]}
@@ -1,4 +1,11 @@
1
+ /**
2
+ * Creates a proxy that throws an error when any property is accessed, function is called,
3
+ * or any other operation is performed on it.
4
+ *
5
+ * Useful for placeholder values that should never actually be used at runtime.
6
+ */
7
+ declare function throwingProxy<T = any>(error: string | Error): T;
1
8
  declare function logged<T extends object>(name: string, toLog: T, options?: {}): T;
2
9
  declare function createLazyProxy<FactoryResult>(factory: () => FactoryResult): FactoryResult;
3
10
 
4
- export { createLazyProxy, logged };
11
+ export { createLazyProxy, logged, throwingProxy };
@@ -1,4 +1,11 @@
1
+ /**
2
+ * Creates a proxy that throws an error when any property is accessed, function is called,
3
+ * or any other operation is performed on it.
4
+ *
5
+ * Useful for placeholder values that should never actually be used at runtime.
6
+ */
7
+ declare function throwingProxy<T = any>(error: string | Error): T;
1
8
  declare function logged<T extends object>(name: string, toLog: T, options?: {}): T;
2
9
  declare function createLazyProxy<FactoryResult>(factory: () => FactoryResult): FactoryResult;
3
10
 
4
- export { createLazyProxy, logged };
11
+ export { createLazyProxy, logged, throwingProxy };
@@ -21,10 +21,37 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var proxies_exports = {};
22
22
  __export(proxies_exports, {
23
23
  createLazyProxy: () => createLazyProxy,
24
- logged: () => logged
24
+ logged: () => logged,
25
+ throwingProxy: () => throwingProxy
25
26
  });
26
27
  module.exports = __toCommonJS(proxies_exports);
28
+ var import_errors = require("./errors.js");
27
29
  var import_strings = require("./strings.js");
30
+ function throwingProxy(error) {
31
+ const doThrow = () => {
32
+ if (typeof error === "string") {
33
+ (0, import_errors.throwErr)(error);
34
+ } else {
35
+ (0, import_errors.throwErr)(error);
36
+ }
37
+ };
38
+ return new Proxy(() => {
39
+ }, {
40
+ get: doThrow,
41
+ set: doThrow,
42
+ has: doThrow,
43
+ deleteProperty: doThrow,
44
+ ownKeys: doThrow,
45
+ getOwnPropertyDescriptor: doThrow,
46
+ defineProperty: doThrow,
47
+ getPrototypeOf: doThrow,
48
+ setPrototypeOf: doThrow,
49
+ isExtensible: doThrow,
50
+ preventExtensions: doThrow,
51
+ apply: doThrow,
52
+ construct: doThrow
53
+ });
54
+ }
28
55
  function logged(name, toLog, options = {}) {
29
56
  const proxy = new Proxy(toLog, {
30
57
  get(target, prop, receiver) {
@@ -149,6 +176,7 @@ function createLazyProxy(factory) {
149
176
  // Annotate the CommonJS export names for ESM import in node:
150
177
  0 && (module.exports = {
151
178
  createLazyProxy,
152
- logged
179
+ logged,
180
+ throwingProxy
153
181
  });
154
182
  //# sourceMappingURL=proxies.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/proxies.tsx"],"sourcesContent":["import { nicify } from \"./strings\";\n\nexport function logged<T extends object>(name: string, toLog: T, options: {} = {}): T {\n const proxy = new Proxy(toLog, {\n get(target, prop, receiver) {\n const orig = Reflect.get(target, prop, receiver);\n if (typeof orig === \"function\") {\n return function (this: any, ...args: any[]) {\n const success = (v: any, isPromise: boolean) => console.debug(`logged(...): Called ${name}.${String(prop)}(${args.map(a => nicify(a)).join(\", \")}) => ${isPromise ? \"Promise<\" : \"\"}${nicify(result)}${isPromise ? \">\" : \"\"}`, { this: this, args, promise: isPromise ? result : false, result: v, trace: new Error() });\n const error = (e: any, isPromise: boolean) => console.debug(`logged(...): Error in ${name}.${String(prop)}(${args.map(a => nicify(a)).join(\", \")})`, { this: this, args, promise: isPromise ? result : false, error: e, trace: new Error() });\n\n let result: unknown;\n try {\n result = orig.apply(this, args);\n } catch (e) {\n error(e, false);\n throw e;\n }\n if (result instanceof Promise) {\n result.then((v) => success(v, true)).catch((e) => error(e, true));\n } else {\n success(result, false);\n }\n return result;\n };\n }\n return orig;\n },\n set(target, prop, value) {\n console.log(`Setting ${name}.${String(prop)} to ${value}`);\n return Reflect.set(target, prop, value);\n },\n apply(target, thisArg, args) {\n console.log(`Calling ${name}(${JSON.stringify(args).slice(1, -1)})`);\n return Reflect.apply(target as any, thisArg, args);\n },\n construct(target, args, newTarget) {\n console.log(`Constructing ${name}(${JSON.stringify(args).slice(1, -1)})`);\n return Reflect.construct(target as any, args, newTarget);\n },\n defineProperty(target, prop, descriptor) {\n console.log(`Defining ${name}.${String(prop)} as ${JSON.stringify(descriptor)}`);\n return Reflect.defineProperty(target, prop, descriptor);\n },\n deleteProperty(target, prop) {\n console.log(`Deleting ${name}.${String(prop)}`);\n return Reflect.deleteProperty(target, prop);\n },\n setPrototypeOf(target, prototype) {\n console.log(`Setting prototype of ${name} to ${prototype}`);\n return Reflect.setPrototypeOf(target, prototype);\n },\n preventExtensions(target) {\n console.log(`Preventing extensions of ${name}`);\n return Reflect.preventExtensions(target);\n },\n });\n return proxy;\n}\n\nexport function createLazyProxy<FactoryResult>(factory: () => FactoryResult): FactoryResult {\n let cache: FactoryResult | undefined = undefined;\n let initialized: boolean = false;\n\n function initializeIfNeeded() {\n if (!initialized) {\n cache = factory();\n initialized = true;\n }\n return cache!;\n }\n\n return new Proxy({}, {\n get(target, prop, receiver) {\n const instance = initializeIfNeeded();\n return Reflect.get(instance, prop, receiver);\n },\n set(target, prop, value, receiver) {\n const instance = initializeIfNeeded();\n return Reflect.set(instance, prop, value, receiver);\n },\n has(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.has(instance, prop);\n },\n deleteProperty(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.deleteProperty(instance, prop);\n },\n ownKeys(target) {\n const instance = initializeIfNeeded();\n return Reflect.ownKeys(instance);\n },\n getOwnPropertyDescriptor(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.getOwnPropertyDescriptor(instance, prop);\n },\n defineProperty(target, prop, descriptor) {\n const instance = initializeIfNeeded();\n return Reflect.defineProperty(instance, prop, descriptor);\n },\n getPrototypeOf(target) {\n const instance = initializeIfNeeded();\n return Reflect.getPrototypeOf(instance);\n },\n setPrototypeOf(target, proto) {\n const instance = initializeIfNeeded();\n return Reflect.setPrototypeOf(instance, proto);\n },\n isExtensible(target) {\n const instance = initializeIfNeeded();\n return Reflect.isExtensible(instance);\n },\n preventExtensions(target) {\n const instance = initializeIfNeeded();\n return Reflect.preventExtensions(instance);\n },\n apply(target, thisArg, argumentsList) {\n const instance = initializeIfNeeded();\n return Reflect.apply(instance as any, thisArg, argumentsList);\n },\n construct(target, argumentsList, newTarget) {\n const instance = initializeIfNeeded();\n return Reflect.construct(instance as any, argumentsList, newTarget);\n }\n }) as FactoryResult;\n}\nundefined?.test(\"createLazyProxy\", ({ expect }) => {\n // Test with a simple object factory\n let factoryCallCount = 0;\n const createObject = () => {\n factoryCallCount++;\n return { value: 42, method: () => \"hello\" };\n };\n\n const proxy = createLazyProxy(createObject);\n\n // Factory should not be called until property is accessed\n expect(factoryCallCount).toBe(0);\n\n // Accessing a property should initialize the object\n expect(proxy.value).toBe(42);\n expect(factoryCallCount).toBe(1);\n\n // Accessing another property should not call factory again\n expect(proxy.method()).toBe(\"hello\");\n expect(factoryCallCount).toBe(1);\n\n // Test with property setting\n proxy.value = 100;\n expect(proxy.value).toBe(100);\n expect(factoryCallCount).toBe(1);\n\n // Test with a class factory\n let classFactoryCallCount = 0;\n class TestClass {\n constructor() {\n classFactoryCallCount++;\n }\n\n getValue() {\n return \"class value\";\n }\n }\n\n const classFactory = () => new TestClass();\n const classProxy = createLazyProxy(classFactory);\n\n // Factory should not be called until method is accessed\n expect(classFactoryCallCount).toBe(0);\n\n // Accessing a method should initialize the object\n expect(classProxy.getValue()).toBe(\"class value\");\n expect(classFactoryCallCount).toBe(1);\n\n // Accessing the method again should not call factory again\n expect(classProxy.getValue()).toBe(\"class value\");\n expect(classFactoryCallCount).toBe(1);\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/proxies.tsx"],"sourcesContent":["import { throwErr } from \"./errors\";\nimport { nicify } from \"./strings\";\n\n/**\n * Creates a proxy that throws an error when any property is accessed, function is called,\n * or any other operation is performed on it.\n *\n * Useful for placeholder values that should never actually be used at runtime.\n */\nexport function throwingProxy<T = any>(error: string | Error): T {\n const doThrow = (): never => {\n if (typeof error === \"string\") {\n throwErr(error);\n } else {\n throwErr(error);\n }\n };\n\n return new Proxy(() => {}, {\n get: doThrow,\n set: doThrow,\n has: doThrow,\n deleteProperty: doThrow,\n ownKeys: doThrow,\n getOwnPropertyDescriptor: doThrow,\n defineProperty: doThrow,\n getPrototypeOf: doThrow,\n setPrototypeOf: doThrow,\n isExtensible: doThrow,\n preventExtensions: doThrow,\n apply: doThrow,\n construct: doThrow,\n }) as T;\n}\n\nexport function logged<T extends object>(name: string, toLog: T, options: {} = {}): T {\n const proxy = new Proxy(toLog, {\n get(target, prop, receiver) {\n const orig = Reflect.get(target, prop, receiver);\n if (typeof orig === \"function\") {\n return function (this: any, ...args: any[]) {\n const success = (v: any, isPromise: boolean) => console.debug(`logged(...): Called ${name}.${String(prop)}(${args.map(a => nicify(a)).join(\", \")}) => ${isPromise ? \"Promise<\" : \"\"}${nicify(result)}${isPromise ? \">\" : \"\"}`, { this: this, args, promise: isPromise ? result : false, result: v, trace: new Error() });\n const error = (e: any, isPromise: boolean) => console.debug(`logged(...): Error in ${name}.${String(prop)}(${args.map(a => nicify(a)).join(\", \")})`, { this: this, args, promise: isPromise ? result : false, error: e, trace: new Error() });\n\n let result: unknown;\n try {\n result = orig.apply(this, args);\n } catch (e) {\n error(e, false);\n throw e;\n }\n if (result instanceof Promise) {\n result.then((v) => success(v, true)).catch((e) => error(e, true));\n } else {\n success(result, false);\n }\n return result;\n };\n }\n return orig;\n },\n set(target, prop, value) {\n console.log(`Setting ${name}.${String(prop)} to ${value}`);\n return Reflect.set(target, prop, value);\n },\n apply(target, thisArg, args) {\n console.log(`Calling ${name}(${JSON.stringify(args).slice(1, -1)})`);\n return Reflect.apply(target as any, thisArg, args);\n },\n construct(target, args, newTarget) {\n console.log(`Constructing ${name}(${JSON.stringify(args).slice(1, -1)})`);\n return Reflect.construct(target as any, args, newTarget);\n },\n defineProperty(target, prop, descriptor) {\n console.log(`Defining ${name}.${String(prop)} as ${JSON.stringify(descriptor)}`);\n return Reflect.defineProperty(target, prop, descriptor);\n },\n deleteProperty(target, prop) {\n console.log(`Deleting ${name}.${String(prop)}`);\n return Reflect.deleteProperty(target, prop);\n },\n setPrototypeOf(target, prototype) {\n console.log(`Setting prototype of ${name} to ${prototype}`);\n return Reflect.setPrototypeOf(target, prototype);\n },\n preventExtensions(target) {\n console.log(`Preventing extensions of ${name}`);\n return Reflect.preventExtensions(target);\n },\n });\n return proxy;\n}\n\nexport function createLazyProxy<FactoryResult>(factory: () => FactoryResult): FactoryResult {\n let cache: FactoryResult | undefined = undefined;\n let initialized: boolean = false;\n\n function initializeIfNeeded() {\n if (!initialized) {\n cache = factory();\n initialized = true;\n }\n return cache!;\n }\n\n return new Proxy({}, {\n get(target, prop, receiver) {\n const instance = initializeIfNeeded();\n return Reflect.get(instance, prop, receiver);\n },\n set(target, prop, value, receiver) {\n const instance = initializeIfNeeded();\n return Reflect.set(instance, prop, value, receiver);\n },\n has(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.has(instance, prop);\n },\n deleteProperty(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.deleteProperty(instance, prop);\n },\n ownKeys(target) {\n const instance = initializeIfNeeded();\n return Reflect.ownKeys(instance);\n },\n getOwnPropertyDescriptor(target, prop) {\n const instance = initializeIfNeeded();\n return Reflect.getOwnPropertyDescriptor(instance, prop);\n },\n defineProperty(target, prop, descriptor) {\n const instance = initializeIfNeeded();\n return Reflect.defineProperty(instance, prop, descriptor);\n },\n getPrototypeOf(target) {\n const instance = initializeIfNeeded();\n return Reflect.getPrototypeOf(instance);\n },\n setPrototypeOf(target, proto) {\n const instance = initializeIfNeeded();\n return Reflect.setPrototypeOf(instance, proto);\n },\n isExtensible(target) {\n const instance = initializeIfNeeded();\n return Reflect.isExtensible(instance);\n },\n preventExtensions(target) {\n const instance = initializeIfNeeded();\n return Reflect.preventExtensions(instance);\n },\n apply(target, thisArg, argumentsList) {\n const instance = initializeIfNeeded();\n return Reflect.apply(instance as any, thisArg, argumentsList);\n },\n construct(target, argumentsList, newTarget) {\n const instance = initializeIfNeeded();\n return Reflect.construct(instance as any, argumentsList, newTarget);\n }\n }) as FactoryResult;\n}\nundefined?.test(\"createLazyProxy\", ({ expect }) => {\n // Test with a simple object factory\n let factoryCallCount = 0;\n const createObject = () => {\n factoryCallCount++;\n return { value: 42, method: () => \"hello\" };\n };\n\n const proxy = createLazyProxy(createObject);\n\n // Factory should not be called until property is accessed\n expect(factoryCallCount).toBe(0);\n\n // Accessing a property should initialize the object\n expect(proxy.value).toBe(42);\n expect(factoryCallCount).toBe(1);\n\n // Accessing another property should not call factory again\n expect(proxy.method()).toBe(\"hello\");\n expect(factoryCallCount).toBe(1);\n\n // Test with property setting\n proxy.value = 100;\n expect(proxy.value).toBe(100);\n expect(factoryCallCount).toBe(1);\n\n // Test with a class factory\n let classFactoryCallCount = 0;\n class TestClass {\n constructor() {\n classFactoryCallCount++;\n }\n\n getValue() {\n return \"class value\";\n }\n }\n\n const classFactory = () => new TestClass();\n const classProxy = createLazyProxy(classFactory);\n\n // Factory should not be called until method is accessed\n expect(classFactoryCallCount).toBe(0);\n\n // Accessing a method should initialize the object\n expect(classProxy.getValue()).toBe(\"class value\");\n expect(classFactoryCallCount).toBe(1);\n\n // Accessing the method again should not call factory again\n expect(classProxy.getValue()).toBe(\"class value\");\n expect(classFactoryCallCount).toBe(1);\n});\n"],"mappings":"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","names":[]}
@@ -41,7 +41,7 @@ type RefState<T> = ReadonlyRef<T> & {
41
41
  */
42
42
  declare function useRefState<T>(initialValue: T): RefState<T>;
43
43
  declare function mapRefState<T, R>(refState: RefState<T>, mapper: (value: T) => R, reverseMapper: (oldT: T, newR: R) => T): RefState<R>;
44
- declare function useQueryState(key: string, defaultValue?: string): readonly [string, (next: string) => void];
44
+ declare function useQueryState(key: string, defaultValue?: string): readonly [string | null, (next: string | null) => void];
45
45
  declare function shouldRethrowRenderingError(error: unknown): boolean;
46
46
  declare class NoSuspenseBoundaryError extends Error {
47
47
  digest: string;
@@ -41,7 +41,7 @@ type RefState<T> = ReadonlyRef<T> & {
41
41
  */
42
42
  declare function useRefState<T>(initialValue: T): RefState<T>;
43
43
  declare function mapRefState<T, R>(refState: RefState<T>, mapper: (value: T) => R, reverseMapper: (oldT: T, newR: R) => T): RefState<R>;
44
- declare function useQueryState(key: string, defaultValue?: string): readonly [string, (next: string) => void];
44
+ declare function useQueryState(key: string, defaultValue?: string): readonly [string | null, (next: string | null) => void];
45
45
  declare function shouldRethrowRenderingError(error: unknown): boolean;
46
46
  declare class NoSuspenseBoundaryError extends Error {
47
47
  digest: string;
@@ -154,7 +154,7 @@ function mapRefState(refState, mapper, reverseMapper) {
154
154
  };
155
155
  }
156
156
  function useQueryState(key, defaultValue) {
157
- const getValue = () => new URLSearchParams(window.location.search).get(key) ?? defaultValue ?? "";
157
+ const getValue = () => new URLSearchParams(window.location.search).get(key) ?? defaultValue ?? null;
158
158
  const [value, setValue] = import_react.default.useState(getValue);
159
159
  import_react.default.useEffect(() => {
160
160
  const onPopState = () => setValue(getValue());
@@ -163,8 +163,12 @@ function useQueryState(key, defaultValue) {
163
163
  }, []);
164
164
  const update = (next) => {
165
165
  const params = new URLSearchParams(window.location.search);
166
- params.set(key, next);
167
- const newUrl = `${window.location.pathname}?${params.toString()}`;
166
+ if (next !== null) {
167
+ params.set(key, next);
168
+ } else {
169
+ params.delete(key);
170
+ }
171
+ const newUrl = params.toString() ? `${window.location.pathname}?${params.toString()}` : window.location.pathname;
168
172
  window.history.pushState(null, "", newUrl);
169
173
  setValue(next);
170
174
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/react.tsx"],"sourcesContent":["import React, { SetStateAction } from \"react\";\nimport { isBrowserLike } from \"./env\";\nimport { neverResolve, runAsynchronously } from \"./promises\";\nimport { AsyncResult } from \"./results\";\nimport { deindent } from \"./strings\";\n\nexport function componentWrapper<\n C extends React.ComponentType<any> | keyof React.JSX.IntrinsicElements,\n ExtraProps extends {} = {}\n>(displayName: string, render: React.ForwardRefRenderFunction<RefFromComponent<C>, React.ComponentPropsWithRef<C> & ExtraProps>) {\n const Component = forwardRefIfNeeded(render);\n Component.displayName = displayName;\n return Component;\n}\ntype RefFromComponent<C extends React.ComponentType<any> | keyof React.JSX.IntrinsicElements> = NonNullable<RefFromComponentDistCond<React.ComponentPropsWithRef<C>[\"ref\"]>>;\ntype RefFromComponentDistCond<A> = A extends React.RefObject<infer T> ? T : never; // distributive conditional type; see https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types\n\nconst react18PromiseCache = new WeakMap<Promise<unknown>, AsyncResult<unknown, unknown>>();\nexport function use<T>(promise: Promise<T>): T {\n if (\"use\" in React) {\n return React.use(promise);\n } else {\n if (react18PromiseCache.has(promise)) {\n const result = react18PromiseCache.get(promise)!;\n if (result.status === \"pending\") {\n throw promise;\n } else if (result.status === \"ok\") {\n return result.data as T;\n } else {\n throw result.error;\n }\n } else {\n react18PromiseCache.set(promise, { \"status\": \"pending\", progress: undefined });\n runAsynchronously(async () => {\n try {\n const res = await promise;\n react18PromiseCache.set(promise, { \"status\": \"ok\", data: res });\n } catch (e) {\n react18PromiseCache.set(promise, { \"status\": \"error\", error: e });\n }\n });\n throw promise;\n }\n }\n}\n\nexport function forwardRefIfNeeded<T, P = {}>(render: React.ForwardRefRenderFunction<T, P>): React.FC<P & { ref?: React.Ref<T> }> {\n // TODO: when we drop support for react 18, remove this\n\n const version = React.version;\n const major = parseInt(version.split(\".\")[0]);\n if (major < 19) {\n return React.forwardRef<T, P>(render as any) as any;\n } else {\n return ((props: P) => render(props, (props as any).ref)) as any;\n }\n}\n\nexport function getNodeText(node: React.ReactNode): string {\n if ([\"number\", \"string\"].includes(typeof node)) {\n return `${node}`;\n }\n if (!node) {\n return \"\";\n }\n if (Array.isArray(node)) {\n return node.map(getNodeText).join(\"\");\n }\n if (typeof node === \"object\" && \"props\" in node) {\n return getNodeText(node.props.children);\n }\n throw new Error(`Unknown node type: ${typeof node}`);\n}\nundefined?.test(\"getNodeText\", ({ expect }) => {\n // Test with string\n expect(getNodeText(\"hello\")).toBe(\"hello\");\n\n // Test with number\n expect(getNodeText(42)).toBe(\"42\");\n\n // Test with null/undefined\n expect(getNodeText(null)).toBe(\"\");\n expect(getNodeText(undefined)).toBe(\"\");\n\n // Test with array\n expect(getNodeText([\"hello\", \" \", \"world\"])).toBe(\"hello world\");\n expect(getNodeText([1, 2, 3])).toBe(\"123\");\n\n // Test with mixed array\n expect(getNodeText([\"hello\", 42, null])).toBe(\"hello42\");\n\n // Test with React element (mocked)\n const mockElement = {\n props: {\n children: \"child text\"\n }\n } as React.ReactElement;\n expect(getNodeText(mockElement)).toBe(\"child text\");\n\n // Test with nested React elements\n const nestedElement = {\n props: {\n children: {\n props: {\n children: \"nested text\"\n }\n } as React.ReactElement\n }\n } as React.ReactElement;\n expect(getNodeText(nestedElement)).toBe(\"nested text\");\n\n // Test with array of React elements\n const arrayOfElements = [\n { props: { children: \"first\" } } as React.ReactElement,\n { props: { children: \"second\" } } as React.ReactElement\n ];\n expect(getNodeText(arrayOfElements)).toBe(\"firstsecond\");\n});\n\n/**\n * Suspends the currently rendered component indefinitely. Will not unsuspend unless the component rerenders.\n *\n * You can use this to translate older query- or AsyncResult-based code to new the Suspense system, for example: `if (query.isLoading) suspend();`\n */\nexport function suspend(): never {\n use(neverResolve());\n throw new Error(\"Somehow a Promise that never resolves was resolved?\");\n}\n\nexport function mapRef<T, R>(ref: ReadonlyRef<T>, mapper: (value: T) => R): ReadonlyRef<R> {\n let last: [T, R] | null = null;\n return {\n get current() {\n const input = ref.current;\n if (last === null || input !== last[0]) {\n last = [input, mapper(input)];\n }\n return last[1];\n },\n };\n}\n\nexport type ReadonlyRef<T> = {\n readonly current: T,\n};\n\nexport type RefState<T> = ReadonlyRef<T> & {\n set: (updater: SetStateAction<T>) => void,\n};\n\n/**\n * Like useState, but its value is immediately available on refState.current after being set.\n *\n * Like useRef, but setting the value will cause a rerender.\n *\n * Note that useRefState returns a new object every time a rerender happens due to a value change, which is intentional\n * as it allows you to specify it in a dependency array like this:\n *\n * ```tsx\n * useEffect(() => {\n * // do something with refState.current\n * }, [refState]); // instead of refState.current\n * ```\n *\n * If you don't want this, you can wrap the result in a useMemo call.\n */\nexport function useRefState<T>(initialValue: T): RefState<T> {\n const [, setState] = React.useState(initialValue);\n const ref = React.useRef(initialValue);\n const setValue = React.useCallback((updater: SetStateAction<T>) => {\n const value: T = typeof updater === \"function\" ? (updater as any)(ref.current) : updater;\n ref.current = value;\n setState(value);\n }, []);\n const res = React.useMemo(() => ({\n get current() {\n return ref.current;\n },\n set: setValue,\n }), [setValue]);\n return res;\n}\n\nexport function mapRefState<T, R>(refState: RefState<T>, mapper: (value: T) => R, reverseMapper: (oldT: T, newR: R) => T): RefState<R> {\n let last: [T, R] | null = null;\n return {\n get current() {\n const input = refState.current;\n if (last === null || input !== last[0]) {\n last = [input, mapper(input)];\n }\n return last[1];\n },\n set(updater: SetStateAction<R>) {\n const value: R = typeof updater === \"function\" ? (updater as any)(this.current) : updater;\n refState.set(reverseMapper(refState.current, value));\n },\n };\n}\n\nexport function useQueryState(key: string, defaultValue?: string) {\n const getValue = () => new URLSearchParams(window.location.search).get(key) ?? defaultValue ?? \"\";\n\n const [value, setValue] = React.useState(getValue);\n\n React.useEffect(() => {\n const onPopState = () => setValue(getValue());\n window.addEventListener(\"popstate\", onPopState);\n return () => window.removeEventListener(\"popstate\", onPopState);\n }, []);\n\n const update = (next: string) => {\n const params = new URLSearchParams(window.location.search);\n params.set(key, next);\n const newUrl = `${window.location.pathname}?${params.toString()}`;\n window.history.pushState(null, \"\", newUrl);\n setValue(next);\n };\n\n return [value, update] as const;\n}\n\nexport function shouldRethrowRenderingError(error: unknown): boolean {\n return !!error && typeof error === \"object\" && \"digest\" in error && error.digest === \"BAILOUT_TO_CLIENT_SIDE_RENDERING\";\n}\n\nexport class NoSuspenseBoundaryError extends Error {\n digest: string;\n reason: string;\n\n constructor(options: { caller?: string }) {\n super(deindent`\n Suspense boundary not found! Read the error message below carefully on how to fix it.\n\n ${options.caller ?? \"This code path\"} attempted to display a loading indicator, but didn't find a Suspense boundary above it. Please read the error message below carefully.\n \n The fix depends on which of the 4 scenarios caused it:\n \n 1. [Next.js] You are missing a loading.tsx file in your app directory. Fix it by adding a loading.tsx file in your app directory.\n\n 2. [React] You are missing a <Suspense> boundary in your component. Fix it by wrapping your component (or the entire app) in a <Suspense> component.\n\n 3. [Next.js] The component is rendered in the root (outermost) layout.tsx or template.tsx file. Next.js does not wrap those files in a Suspense boundary, even if there is a loading.tsx file in the same folder. To fix it, wrap your layout inside a route group like this:\n\n - app\n - - layout.tsx // contains <html> and <body>, alongside providers and other components that don't need ${options.caller ?? \"this code path\"}\n - - loading.tsx // required for suspense\n - - (main)\n - - - layout.tsx // contains the main layout of your app, like a sidebar or a header, and can use ${options.caller ?? \"this code path\"}\n - - - route.tsx // your actual main page\n - - - the rest of your app\n\n For more information on this approach, see Next's documentation on route groups: https://nextjs.org/docs/app/building-your-application/routing/route-groups\n \n 4. You caught this error with try-catch or a custom error boundary. Fix this by rethrowing the error or not catching it in the first place.\n\n See: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout\n\n More information on SSR and Suspense boundaries: https://react.dev/reference/react/Suspense#providing-a-fallback-for-server-errors-and-client-only-content\n `);\n\n this.name = \"NoSuspenseBoundaryError\";\n this.reason = options.caller ?? \"suspendIfSsr()\";\n\n // set the digest so nextjs doesn't log the error\n // https://github.com/vercel/next.js/blob/d01d6d9c35a8c2725b3d74c1402ab76d4779a6cf/packages/next/src/shared/lib/lazy-dynamic/bailout-to-csr.ts#L14\n this.digest = \"BAILOUT_TO_CLIENT_SIDE_RENDERING\";\n }\n}\nundefined?.test(\"NoSuspenseBoundaryError\", ({ expect }) => {\n // Test with default options\n const defaultError = new NoSuspenseBoundaryError({});\n expect(defaultError.name).toBe(\"NoSuspenseBoundaryError\");\n expect(defaultError.reason).toBe(\"suspendIfSsr()\");\n expect(defaultError.digest).toBe(\"BAILOUT_TO_CLIENT_SIDE_RENDERING\");\n expect(defaultError.message).toContain(\"This code path attempted to display a loading indicator\");\n\n // Test with custom caller\n const customError = new NoSuspenseBoundaryError({ caller: \"CustomComponent\" });\n expect(customError.name).toBe(\"NoSuspenseBoundaryError\");\n expect(customError.reason).toBe(\"CustomComponent\");\n expect(customError.digest).toBe(\"BAILOUT_TO_CLIENT_SIDE_RENDERING\");\n expect(customError.message).toContain(\"CustomComponent attempted to display a loading indicator\");\n\n // Verify error message contains all the necessary information\n expect(customError.message).toContain(\"loading.tsx\");\n expect(customError.message).toContain(\"route groups\");\n expect(customError.message).toContain(\"https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout\");\n});\n\n\n/**\n * Use this in a component or a hook to disable SSR. Should be wrapped in a Suspense boundary, or it will throw an error.\n */\nexport function suspendIfSsr(caller?: string) {\n if (!isBrowserLike()) {\n throw new NoSuspenseBoundaryError({ caller });\n }\n}\n"],"mappings":"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","names":["React"]}
1
+ {"version":3,"sources":["../../src/utils/react.tsx"],"sourcesContent":["import React, { SetStateAction } from \"react\";\nimport { isBrowserLike } from \"./env\";\nimport { neverResolve, runAsynchronously } from \"./promises\";\nimport { AsyncResult } from \"./results\";\nimport { deindent } from \"./strings\";\n\nexport function componentWrapper<\n C extends React.ComponentType<any> | keyof React.JSX.IntrinsicElements,\n ExtraProps extends {} = {}\n>(displayName: string, render: React.ForwardRefRenderFunction<RefFromComponent<C>, React.ComponentPropsWithRef<C> & ExtraProps>) {\n const Component = forwardRefIfNeeded(render);\n Component.displayName = displayName;\n return Component;\n}\ntype RefFromComponent<C extends React.ComponentType<any> | keyof React.JSX.IntrinsicElements> = NonNullable<RefFromComponentDistCond<React.ComponentPropsWithRef<C>[\"ref\"]>>;\ntype RefFromComponentDistCond<A> = A extends React.RefObject<infer T> ? T : never; // distributive conditional type; see https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types\n\nconst react18PromiseCache = new WeakMap<Promise<unknown>, AsyncResult<unknown, unknown>>();\nexport function use<T>(promise: Promise<T>): T {\n if (\"use\" in React) {\n return React.use(promise);\n } else {\n if (react18PromiseCache.has(promise)) {\n const result = react18PromiseCache.get(promise)!;\n if (result.status === \"pending\") {\n throw promise;\n } else if (result.status === \"ok\") {\n return result.data as T;\n } else {\n throw result.error;\n }\n } else {\n react18PromiseCache.set(promise, { \"status\": \"pending\", progress: undefined });\n runAsynchronously(async () => {\n try {\n const res = await promise;\n react18PromiseCache.set(promise, { \"status\": \"ok\", data: res });\n } catch (e) {\n react18PromiseCache.set(promise, { \"status\": \"error\", error: e });\n }\n });\n throw promise;\n }\n }\n}\n\nexport function forwardRefIfNeeded<T, P = {}>(render: React.ForwardRefRenderFunction<T, P>): React.FC<P & { ref?: React.Ref<T> }> {\n // TODO: when we drop support for react 18, remove this\n\n const version = React.version;\n const major = parseInt(version.split(\".\")[0]);\n if (major < 19) {\n return React.forwardRef<T, P>(render as any) as any;\n } else {\n return ((props: P) => render(props, (props as any).ref)) as any;\n }\n}\n\nexport function getNodeText(node: React.ReactNode): string {\n if ([\"number\", \"string\"].includes(typeof node)) {\n return `${node}`;\n }\n if (!node) {\n return \"\";\n }\n if (Array.isArray(node)) {\n return node.map(getNodeText).join(\"\");\n }\n if (typeof node === \"object\" && \"props\" in node) {\n return getNodeText(node.props.children);\n }\n throw new Error(`Unknown node type: ${typeof node}`);\n}\nundefined?.test(\"getNodeText\", ({ expect }) => {\n // Test with string\n expect(getNodeText(\"hello\")).toBe(\"hello\");\n\n // Test with number\n expect(getNodeText(42)).toBe(\"42\");\n\n // Test with null/undefined\n expect(getNodeText(null)).toBe(\"\");\n expect(getNodeText(undefined)).toBe(\"\");\n\n // Test with array\n expect(getNodeText([\"hello\", \" \", \"world\"])).toBe(\"hello world\");\n expect(getNodeText([1, 2, 3])).toBe(\"123\");\n\n // Test with mixed array\n expect(getNodeText([\"hello\", 42, null])).toBe(\"hello42\");\n\n // Test with React element (mocked)\n const mockElement = {\n props: {\n children: \"child text\"\n }\n } as React.ReactElement;\n expect(getNodeText(mockElement)).toBe(\"child text\");\n\n // Test with nested React elements\n const nestedElement = {\n props: {\n children: {\n props: {\n children: \"nested text\"\n }\n } as React.ReactElement\n }\n } as React.ReactElement;\n expect(getNodeText(nestedElement)).toBe(\"nested text\");\n\n // Test with array of React elements\n const arrayOfElements = [\n { props: { children: \"first\" } } as React.ReactElement,\n { props: { children: \"second\" } } as React.ReactElement\n ];\n expect(getNodeText(arrayOfElements)).toBe(\"firstsecond\");\n});\n\n/**\n * Suspends the currently rendered component indefinitely. Will not unsuspend unless the component rerenders.\n *\n * You can use this to translate older query- or AsyncResult-based code to new the Suspense system, for example: `if (query.isLoading) suspend();`\n */\nexport function suspend(): never {\n use(neverResolve());\n throw new Error(\"Somehow a Promise that never resolves was resolved?\");\n}\n\nexport function mapRef<T, R>(ref: ReadonlyRef<T>, mapper: (value: T) => R): ReadonlyRef<R> {\n let last: [T, R] | null = null;\n return {\n get current() {\n const input = ref.current;\n if (last === null || input !== last[0]) {\n last = [input, mapper(input)];\n }\n return last[1];\n },\n };\n}\n\nexport type ReadonlyRef<T> = {\n readonly current: T,\n};\n\nexport type RefState<T> = ReadonlyRef<T> & {\n set: (updater: SetStateAction<T>) => void,\n};\n\n/**\n * Like useState, but its value is immediately available on refState.current after being set.\n *\n * Like useRef, but setting the value will cause a rerender.\n *\n * Note that useRefState returns a new object every time a rerender happens due to a value change, which is intentional\n * as it allows you to specify it in a dependency array like this:\n *\n * ```tsx\n * useEffect(() => {\n * // do something with refState.current\n * }, [refState]); // instead of refState.current\n * ```\n *\n * If you don't want this, you can wrap the result in a useMemo call.\n */\nexport function useRefState<T>(initialValue: T): RefState<T> {\n const [, setState] = React.useState(initialValue);\n const ref = React.useRef(initialValue);\n const setValue = React.useCallback((updater: SetStateAction<T>) => {\n const value: T = typeof updater === \"function\" ? (updater as any)(ref.current) : updater;\n ref.current = value;\n setState(value);\n }, []);\n const res = React.useMemo(() => ({\n get current() {\n return ref.current;\n },\n set: setValue,\n }), [setValue]);\n return res;\n}\n\nexport function mapRefState<T, R>(refState: RefState<T>, mapper: (value: T) => R, reverseMapper: (oldT: T, newR: R) => T): RefState<R> {\n let last: [T, R] | null = null;\n return {\n get current() {\n const input = refState.current;\n if (last === null || input !== last[0]) {\n last = [input, mapper(input)];\n }\n return last[1];\n },\n set(updater: SetStateAction<R>) {\n const value: R = typeof updater === \"function\" ? (updater as any)(this.current) : updater;\n refState.set(reverseMapper(refState.current, value));\n },\n };\n}\n\nexport function useQueryState(key: string, defaultValue?: string) {\n const getValue = () => new URLSearchParams(window.location.search).get(key) ?? defaultValue ?? null;\n\n const [value, setValue] = React.useState(getValue);\n\n React.useEffect(() => {\n const onPopState = () => setValue(getValue());\n window.addEventListener(\"popstate\", onPopState);\n return () => window.removeEventListener(\"popstate\", onPopState);\n }, []);\n\n const update = (next: string | null) => {\n const params = new URLSearchParams(window.location.search);\n if (next !== null) {\n params.set(key, next);\n } else {\n params.delete(key);\n }\n const newUrl = params.toString()\n ? `${window.location.pathname}?${params.toString()}`\n : window.location.pathname;\n window.history.pushState(null, \"\", newUrl);\n setValue(next);\n };\n\n return [value, update] as const;\n}\n\nexport function shouldRethrowRenderingError(error: unknown): boolean {\n return !!error && typeof error === \"object\" && \"digest\" in error && error.digest === \"BAILOUT_TO_CLIENT_SIDE_RENDERING\";\n}\n\nexport class NoSuspenseBoundaryError extends Error {\n digest: string;\n reason: string;\n\n constructor(options: { caller?: string }) {\n super(deindent`\n Suspense boundary not found! Read the error message below carefully on how to fix it.\n\n ${options.caller ?? \"This code path\"} attempted to display a loading indicator, but didn't find a Suspense boundary above it. Please read the error message below carefully.\n \n The fix depends on which of the 4 scenarios caused it:\n \n 1. [Next.js] You are missing a loading.tsx file in your app directory. Fix it by adding a loading.tsx file in your app directory.\n\n 2. [React] You are missing a <Suspense> boundary in your component. Fix it by wrapping your component (or the entire app) in a <Suspense> component.\n\n 3. [Next.js] The component is rendered in the root (outermost) layout.tsx or template.tsx file. Next.js does not wrap those files in a Suspense boundary, even if there is a loading.tsx file in the same folder. To fix it, wrap your layout inside a route group like this:\n\n - app\n - - layout.tsx // contains <html> and <body>, alongside providers and other components that don't need ${options.caller ?? \"this code path\"}\n - - loading.tsx // required for suspense\n - - (main)\n - - - layout.tsx // contains the main layout of your app, like a sidebar or a header, and can use ${options.caller ?? \"this code path\"}\n - - - route.tsx // your actual main page\n - - - the rest of your app\n\n For more information on this approach, see Next's documentation on route groups: https://nextjs.org/docs/app/building-your-application/routing/route-groups\n \n 4. You caught this error with try-catch or a custom error boundary. Fix this by rethrowing the error or not catching it in the first place.\n\n See: https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout\n\n More information on SSR and Suspense boundaries: https://react.dev/reference/react/Suspense#providing-a-fallback-for-server-errors-and-client-only-content\n `);\n\n this.name = \"NoSuspenseBoundaryError\";\n this.reason = options.caller ?? \"suspendIfSsr()\";\n\n // set the digest so nextjs doesn't log the error\n // https://github.com/vercel/next.js/blob/d01d6d9c35a8c2725b3d74c1402ab76d4779a6cf/packages/next/src/shared/lib/lazy-dynamic/bailout-to-csr.ts#L14\n this.digest = \"BAILOUT_TO_CLIENT_SIDE_RENDERING\";\n }\n}\nundefined?.test(\"NoSuspenseBoundaryError\", ({ expect }) => {\n // Test with default options\n const defaultError = new NoSuspenseBoundaryError({});\n expect(defaultError.name).toBe(\"NoSuspenseBoundaryError\");\n expect(defaultError.reason).toBe(\"suspendIfSsr()\");\n expect(defaultError.digest).toBe(\"BAILOUT_TO_CLIENT_SIDE_RENDERING\");\n expect(defaultError.message).toContain(\"This code path attempted to display a loading indicator\");\n\n // Test with custom caller\n const customError = new NoSuspenseBoundaryError({ caller: \"CustomComponent\" });\n expect(customError.name).toBe(\"NoSuspenseBoundaryError\");\n expect(customError.reason).toBe(\"CustomComponent\");\n expect(customError.digest).toBe(\"BAILOUT_TO_CLIENT_SIDE_RENDERING\");\n expect(customError.message).toContain(\"CustomComponent attempted to display a loading indicator\");\n\n // Verify error message contains all the necessary information\n expect(customError.message).toContain(\"loading.tsx\");\n expect(customError.message).toContain(\"route groups\");\n expect(customError.message).toContain(\"https://nextjs.org/docs/messages/missing-suspense-with-csr-bailout\");\n});\n\n\n/**\n * Use this in a component or a hook to disable SSR. Should be wrapped in a Suspense boundary, or it will throw an error.\n */\nexport function suspendIfSsr(caller?: string) {\n if (!isBrowserLike()) {\n throw new NoSuspenseBoundaryError({ caller });\n }\n}\n"],"mappings":"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","names":["React"]}
@@ -64,14 +64,14 @@ declare function fromThrowing<T>(fn: () => T): Result<T, unknown>;
64
64
  declare function fromThrowingAsync<T>(fn: () => Promise<T>): Promise<Result<T, unknown>>;
65
65
  declare function mapResult<T, U, E = unknown, P = unknown>(result: Result<T, E>, fn: (data: T) => U): Result<U, E>;
66
66
  declare function mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P>;
67
- declare class RetryError extends AggregateError {
68
- readonly errors: unknown[];
69
- constructor(errors: unknown[]);
67
+ declare class RetryError<E = unknown> extends AggregateError {
68
+ readonly errors: E[];
69
+ constructor(errors: E[]);
70
70
  get attempts(): number;
71
71
  }
72
- declare function retry<T>(fn: (attemptIndex: number) => Result<T> | Promise<Result<T>>, totalAttempts: number, { exponentialDelayBase }?: {
72
+ declare function retry<T, E>(fn: (attemptIndex: number) => Result<T, E> | Promise<Result<T, E>>, totalAttempts: number, { exponentialDelayBase }?: {
73
73
  exponentialDelayBase?: number | undefined;
74
- }): Promise<Result<T, RetryError> & {
74
+ }): Promise<Result<T, RetryError<E>> & {
75
75
  attempts: number;
76
76
  }>;
77
77
 
@@ -64,14 +64,14 @@ declare function fromThrowing<T>(fn: () => T): Result<T, unknown>;
64
64
  declare function fromThrowingAsync<T>(fn: () => Promise<T>): Promise<Result<T, unknown>>;
65
65
  declare function mapResult<T, U, E = unknown, P = unknown>(result: Result<T, E>, fn: (data: T) => U): Result<U, E>;
66
66
  declare function mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P>;
67
- declare class RetryError extends AggregateError {
68
- readonly errors: unknown[];
69
- constructor(errors: unknown[]);
67
+ declare class RetryError<E = unknown> extends AggregateError {
68
+ readonly errors: E[];
69
+ constructor(errors: E[]);
70
70
  get attempts(): number;
71
71
  }
72
- declare function retry<T>(fn: (attemptIndex: number) => Result<T> | Promise<Result<T>>, totalAttempts: number, { exponentialDelayBase }?: {
72
+ declare function retry<T, E>(fn: (attemptIndex: number) => Result<T, E> | Promise<Result<T, E>>, totalAttempts: number, { exponentialDelayBase }?: {
73
73
  exponentialDelayBase?: number | undefined;
74
- }): Promise<Result<T, RetryError> & {
74
+ }): Promise<Result<T, RetryError<E>> & {
75
75
  attempts: number;
76
76
  }>;
77
77
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/results.tsx"],"sourcesContent":["import { wait } from \"./promises\";\nimport { deindent, nicify } from \"./strings\";\n\nexport type Result<T, E = unknown> =\n | {\n status: \"ok\",\n data: T,\n }\n | {\n status: \"error\",\n error: E,\n };\n\nexport type AsyncResult<T, E = unknown, P = void> =\n | Result<T, E>\n | (\n & {\n status: \"pending\",\n }\n & {\n progress: P,\n }\n );\n\n\nexport const Result = {\n fromThrowing,\n fromThrowingAsync,\n fromPromise: promiseToResult,\n ok<T>(data: T): Result<T, never> & { status: \"ok\" } {\n return {\n status: \"ok\",\n data,\n };\n },\n error<E>(error: E): Result<never, E> & { status: \"error\" } {\n return {\n status: \"error\",\n error,\n };\n },\n map: mapResult,\n or: <T, E, U>(result: Result<T, E>, fallback: U): T | U => {\n return result.status === \"ok\" ? result.data : fallback;\n },\n orThrow: <T, E>(result: Result<T, E>): T => {\n if (result.status === \"error\") {\n throw result.error;\n }\n return result.data;\n },\n orThrowAsync: async <T, E>(result: Promise<Result<T, E>>): Promise<T> => {\n return Result.orThrow(await result);\n },\n retry,\n};\nundefined?.test(\"Result.ok and Result.error\", ({ expect }) => {\n // Test Result.ok\n const okResult = Result.ok(42);\n expect(okResult.status).toBe(\"ok\");\n expect(okResult.data).toBe(42);\n\n // Test Result.error\n const error = new Error(\"Test error\");\n const errorResult = Result.error(error);\n expect(errorResult.status).toBe(\"error\");\n expect(errorResult.error).toBe(error);\n});\n\nundefined?.test(\"Result.or\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, string> = { status: \"ok\", data: 42 };\n expect(Result.or(okResult, 0)).toBe(42);\n\n // Test with error result\n const errorResult: Result<number, string> = { status: \"error\", error: \"error message\" };\n expect(Result.or(errorResult, 0)).toBe(0);\n});\n\nundefined?.test(\"Result.orThrow\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, Error> = { status: \"ok\", data: 42 };\n expect(Result.orThrow(okResult)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorResult: Result<number, Error> = { status: \"error\", error };\n expect(() => Result.orThrow(errorResult)).toThrow(error);\n});\n\nundefined?.test(\"Result.orThrowAsync\", async ({ expect }) => {\n // Test with ok result\n const okPromise = Promise.resolve({ status: \"ok\", data: 42 } as Result<number, Error>);\n expect(await Result.orThrowAsync(okPromise)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorPromise = Promise.resolve({ status: \"error\", error } as Result<number, Error>);\n await expect(Result.orThrowAsync(errorPromise)).rejects.toThrow(error);\n});\n\nexport const AsyncResult = {\n fromThrowing,\n fromPromise: promiseToResult,\n ok: Result.ok,\n error: Result.error,\n pending,\n map: mapResult,\n or: <T, E, P, U>(result: AsyncResult<T, E, P>, fallback: U): T | U => {\n if (result.status === \"pending\") {\n return fallback;\n }\n return Result.or(result, fallback);\n },\n orThrow: <T, E, P>(result: AsyncResult<T, E, P>): T => {\n if (result.status === \"pending\") {\n throw new Error(\"Result still pending\");\n }\n return Result.orThrow(result);\n },\n retry,\n};\nundefined?.test(\"AsyncResult.or\", ({ expect }) => {\n // Test with ok result\n const okResult: AsyncResult<number, string> = { status: \"ok\", data: 42 };\n expect(AsyncResult.or(okResult, 0)).toBe(42);\n\n // Test with error result\n const errorResult: AsyncResult<number, string> = { status: \"error\", error: \"error message\" };\n expect(AsyncResult.or(errorResult, 0)).toBe(0);\n\n // Test with pending result\n const pendingResult: AsyncResult<number, string> = { status: \"pending\", progress: undefined };\n expect(AsyncResult.or(pendingResult, 0)).toBe(0);\n});\n\nundefined?.test(\"AsyncResult.orThrow\", ({ expect }) => {\n // Test with ok result\n const okResult: AsyncResult<number, Error> = { status: \"ok\", data: 42 };\n expect(AsyncResult.orThrow(okResult)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorResult: AsyncResult<number, Error> = { status: \"error\", error };\n expect(() => AsyncResult.orThrow(errorResult)).toThrow(error);\n\n // Test with pending result\n const pendingResult: AsyncResult<number, Error> = { status: \"pending\", progress: undefined };\n expect(() => AsyncResult.orThrow(pendingResult)).toThrow(\"Result still pending\");\n});\n\nfunction pending(): AsyncResult<never, never, void> & { status: \"pending\" };\nfunction pending<P>(progress: P): AsyncResult<never, never, P> & { status: \"pending\" };\nfunction pending<P>(progress?: P): AsyncResult<never, never, P> & { status: \"pending\" } {\n return {\n status: \"pending\",\n progress: progress!,\n };\n}\nundefined?.test(\"pending\", ({ expect }) => {\n // Test without progress\n const pendingResult = pending();\n expect(pendingResult.status).toBe(\"pending\");\n expect(pendingResult.progress).toBe(undefined);\n\n // Test with progress\n const progressValue = { loaded: 50, total: 100 };\n const pendingWithProgress = pending(progressValue);\n expect(pendingWithProgress.status).toBe(\"pending\");\n expect(pendingWithProgress.progress).toBe(progressValue);\n});\n\nasync function promiseToResult<T>(promise: Promise<T>): Promise<Result<T>> {\n try {\n const value = await promise;\n return Result.ok(value);\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"promiseToResult\", async ({ expect }) => {\n // Test with resolved promise\n const resolvedPromise = Promise.resolve(42);\n const resolvedResult = await promiseToResult(resolvedPromise);\n expect(resolvedResult.status).toBe(\"ok\");\n if (resolvedResult.status === \"ok\") {\n expect(resolvedResult.data).toBe(42);\n }\n\n // Test with rejected promise\n const error = new Error(\"Test error\");\n const rejectedPromise = Promise.reject(error);\n const rejectedResult = await promiseToResult(rejectedPromise);\n expect(rejectedResult.status).toBe(\"error\");\n if (rejectedResult.status === \"error\") {\n expect(rejectedResult.error).toBe(error);\n }\n});\n\nfunction fromThrowing<T>(fn: () => T): Result<T, unknown> {\n try {\n return Result.ok(fn());\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"fromThrowing\", ({ expect }) => {\n // Test with function that succeeds\n const successFn = () => 42;\n const successResult = fromThrowing(successFn);\n expect(successResult.status).toBe(\"ok\");\n if (successResult.status === \"ok\") {\n expect(successResult.data).toBe(42);\n }\n\n // Test with function that throws\n const error = new Error(\"Test error\");\n const errorFn = () => {\n throw error;\n };\n const errorResult = fromThrowing(errorFn);\n expect(errorResult.status).toBe(\"error\");\n if (errorResult.status === \"error\") {\n expect(errorResult.error).toBe(error);\n }\n});\n\nasync function fromThrowingAsync<T>(fn: () => Promise<T>): Promise<Result<T, unknown>> {\n try {\n return Result.ok(await fn());\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"fromThrowingAsync\", async ({ expect }) => {\n // Test with async function that succeeds\n const successFn = async () => 42;\n const successResult = await fromThrowingAsync(successFn);\n expect(successResult.status).toBe(\"ok\");\n if (successResult.status === \"ok\") {\n expect(successResult.data).toBe(42);\n }\n\n // Test with async function that throws\n const error = new Error(\"Test error\");\n const errorFn = async () => {\n throw error;\n };\n const errorResult = await fromThrowingAsync(errorFn);\n expect(errorResult.status).toBe(\"error\");\n if (errorResult.status === \"error\") {\n expect(errorResult.error).toBe(error);\n }\n});\n\nfunction mapResult<T, U, E = unknown, P = unknown>(result: Result<T, E>, fn: (data: T) => U): Result<U, E>;\nfunction mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P>;\nfunction mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P> {\n if (result.status === \"error\") return {\n status: \"error\",\n error: result.error,\n };\n if (result.status === \"pending\") return {\n status: \"pending\",\n ...\"progress\" in result ? { progress: result.progress } : {},\n } as any;\n\n return Result.ok(fn(result.data));\n}\nundefined?.test(\"mapResult\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, string> = { status: \"ok\", data: 42 };\n const mappedOk = mapResult(okResult, (n: number) => n * 2);\n expect(mappedOk.status).toBe(\"ok\");\n if (mappedOk.status === \"ok\") {\n expect(mappedOk.data).toBe(84);\n }\n\n // Test with error result\n const errorResult: Result<number, string> = { status: \"error\", error: \"error message\" };\n const mappedError = mapResult(errorResult, (n: number) => n * 2);\n expect(mappedError.status).toBe(\"error\");\n if (mappedError.status === \"error\") {\n expect(mappedError.error).toBe(\"error message\");\n }\n\n // Test with pending result (no progress)\n const pendingResult: AsyncResult<number, string, void> = { status: \"pending\", progress: undefined };\n const mappedPending = mapResult(pendingResult, (n: number) => n * 2);\n expect(mappedPending.status).toBe(\"pending\");\n\n // Test with pending result (with progress)\n const progressValue = { loaded: 50, total: 100 };\n const pendingWithProgress: AsyncResult<number, string, typeof progressValue> = {\n status: \"pending\",\n progress: progressValue\n };\n const mappedPendingWithProgress = mapResult(pendingWithProgress, (n: number) => n * 2);\n expect(mappedPendingWithProgress.status).toBe(\"pending\");\n if (mappedPendingWithProgress.status === \"pending\") {\n expect(mappedPendingWithProgress.progress).toBe(progressValue);\n }\n});\n\n\nclass RetryError extends AggregateError {\n constructor(public readonly errors: unknown[]) {\n const strings = errors.map(e => nicify(e));\n const isAllSame = strings.length > 1 && strings.every(s => s === strings[0]);\n super(\n errors,\n deindent`\n Error after ${errors.length} attempts.\n \n ${isAllSame ? deindent`\n Attempts 1-${errors.length}:\n ${strings[0]}\n ` : strings.map((s, i) => deindent`\n Attempt ${i + 1}:\n ${s}\n `).join(\"\\n\\n\")}\n `,\n { cause: errors[errors.length - 1] }\n );\n this.name = \"RetryError\";\n }\n\n get attempts() {\n return this.errors.length;\n }\n}\nRetryError.prototype.name = \"RetryError\";\n\nundefined?.test(\"RetryError\", ({ expect }) => {\n // Test with single error\n const singleError = new Error(\"Single error\");\n const retryErrorSingle = new RetryError([singleError]);\n expect(retryErrorSingle.name).toBe(\"RetryError\");\n expect(retryErrorSingle.errors).toEqual([singleError]);\n expect(retryErrorSingle.attempts).toBe(1);\n expect(retryErrorSingle.cause).toBe(singleError);\n expect(retryErrorSingle.message).toContain(\"Error after 1 attempts\");\n\n // Test with multiple different errors\n const error1 = new Error(\"Error 1\");\n const error2 = new Error(\"Error 2\");\n const retryErrorMultiple = new RetryError([error1, error2]);\n expect(retryErrorMultiple.name).toBe(\"RetryError\");\n expect(retryErrorMultiple.errors).toEqual([error1, error2]);\n expect(retryErrorMultiple.attempts).toBe(2);\n expect(retryErrorMultiple.cause).toBe(error2);\n expect(retryErrorMultiple.message).toContain(\"Error after 2 attempts\");\n expect(retryErrorMultiple.message).toContain(\"Attempt 1\");\n expect(retryErrorMultiple.message).toContain(\"Attempt 2\");\n\n // Test with multiple identical errors\n const sameError = new Error(\"Same error\");\n const retryErrorSame = new RetryError([sameError, sameError]);\n expect(retryErrorSame.name).toBe(\"RetryError\");\n expect(retryErrorSame.errors).toEqual([sameError, sameError]);\n expect(retryErrorSame.attempts).toBe(2);\n expect(retryErrorSame.cause).toBe(sameError);\n expect(retryErrorSame.message).toContain(\"Error after 2 attempts\");\n expect(retryErrorSame.message).toContain(\"Attempts 1-2\");\n});\n\nasync function retry<T>(\n fn: (attemptIndex: number) => Result<T> | Promise<Result<T>>,\n totalAttempts: number,\n { exponentialDelayBase = 1000 } = {},\n): Promise<Result<T, RetryError> & { attempts: number }> {\n const errors: unknown[] = [];\n for (let i = 0; i < totalAttempts; i++) {\n const res = await fn(i);\n if (res.status === \"ok\") {\n return Object.assign(Result.ok(res.data), { attempts: i + 1 });\n } else {\n errors.push(res.error);\n if (i < totalAttempts - 1) {\n await wait((Math.random() + 0.5) * exponentialDelayBase * (2 ** i));\n }\n }\n }\n return Object.assign(Result.error(new RetryError(errors)), { attempts: totalAttempts });\n}\nundefined?.test(\"retry\", async ({ expect }) => {\n // Test successful on first attempt\n const successFn = async () => Result.ok(\"success\");\n const successResult = await retry(successFn, 3, { exponentialDelayBase: 0 });\n expect(successResult).toEqual({ status: \"ok\", data: \"success\", attempts: 1 });\n\n // Test successful after failures\n let attemptCount = 0;\n const eventualSuccessFn = async () => {\n return ++attemptCount < 2 ? Result.error(new Error(`Attempt ${attemptCount} failed`))\n : Result.ok(\"eventual success\");\n };\n const eventualSuccessResult = await retry(eventualSuccessFn, 3, { exponentialDelayBase: 0 });\n expect(eventualSuccessResult).toEqual({ status: \"ok\", data: \"eventual success\", attempts: 2 });\n\n // Test all attempts fail\n const errors = [new Error(\"Error 1\"), new Error(\"Error 2\"), new Error(\"Error 3\")];\n const allFailFn = async (attempt: number) => {\n return Result.error(errors[attempt]);\n };\n const allFailResult = await retry(allFailFn, 3, { exponentialDelayBase: 0 });\n expect(allFailResult).toEqual({ status: \"error\", error: expect.any(RetryError), attempts: 3 });\n const retryError = (allFailResult as any).error as RetryError;\n expect(retryError.errors).toEqual(errors);\n expect(retryError.attempts).toBe(3);\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/results.tsx"],"sourcesContent":["import { wait } from \"./promises\";\nimport { deindent, nicify } from \"./strings\";\n\nexport type Result<T, E = unknown> =\n | {\n status: \"ok\",\n data: T,\n }\n | {\n status: \"error\",\n error: E,\n };\n\nexport type AsyncResult<T, E = unknown, P = void> =\n | Result<T, E>\n | (\n & {\n status: \"pending\",\n }\n & {\n progress: P,\n }\n );\n\n\nexport const Result = {\n fromThrowing,\n fromThrowingAsync,\n fromPromise: promiseToResult,\n ok<T>(data: T): Result<T, never> & { status: \"ok\" } {\n return {\n status: \"ok\",\n data,\n };\n },\n error<E>(error: E): Result<never, E> & { status: \"error\" } {\n return {\n status: \"error\",\n error,\n };\n },\n map: mapResult,\n or: <T, E, U>(result: Result<T, E>, fallback: U): T | U => {\n return result.status === \"ok\" ? result.data : fallback;\n },\n orThrow: <T, E>(result: Result<T, E>): T => {\n if (result.status === \"error\") {\n throw result.error;\n }\n return result.data;\n },\n orThrowAsync: async <T, E>(result: Promise<Result<T, E>>): Promise<T> => {\n return Result.orThrow(await result);\n },\n retry,\n};\nundefined?.test(\"Result.ok and Result.error\", ({ expect }) => {\n // Test Result.ok\n const okResult = Result.ok(42);\n expect(okResult.status).toBe(\"ok\");\n expect(okResult.data).toBe(42);\n\n // Test Result.error\n const error = new Error(\"Test error\");\n const errorResult = Result.error(error);\n expect(errorResult.status).toBe(\"error\");\n expect(errorResult.error).toBe(error);\n});\n\nundefined?.test(\"Result.or\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, string> = { status: \"ok\", data: 42 };\n expect(Result.or(okResult, 0)).toBe(42);\n\n // Test with error result\n const errorResult: Result<number, string> = { status: \"error\", error: \"error message\" };\n expect(Result.or(errorResult, 0)).toBe(0);\n});\n\nundefined?.test(\"Result.orThrow\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, Error> = { status: \"ok\", data: 42 };\n expect(Result.orThrow(okResult)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorResult: Result<number, Error> = { status: \"error\", error };\n expect(() => Result.orThrow(errorResult)).toThrow(error);\n});\n\nundefined?.test(\"Result.orThrowAsync\", async ({ expect }) => {\n // Test with ok result\n const okPromise = Promise.resolve({ status: \"ok\", data: 42 } as Result<number, Error>);\n expect(await Result.orThrowAsync(okPromise)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorPromise = Promise.resolve({ status: \"error\", error } as Result<number, Error>);\n await expect(Result.orThrowAsync(errorPromise)).rejects.toThrow(error);\n});\n\nexport const AsyncResult = {\n fromThrowing,\n fromPromise: promiseToResult,\n ok: Result.ok,\n error: Result.error,\n pending,\n map: mapResult,\n or: <T, E, P, U>(result: AsyncResult<T, E, P>, fallback: U): T | U => {\n if (result.status === \"pending\") {\n return fallback;\n }\n return Result.or(result, fallback);\n },\n orThrow: <T, E, P>(result: AsyncResult<T, E, P>): T => {\n if (result.status === \"pending\") {\n throw new Error(\"Result still pending\");\n }\n return Result.orThrow(result);\n },\n retry,\n};\nundefined?.test(\"AsyncResult.or\", ({ expect }) => {\n // Test with ok result\n const okResult: AsyncResult<number, string> = { status: \"ok\", data: 42 };\n expect(AsyncResult.or(okResult, 0)).toBe(42);\n\n // Test with error result\n const errorResult: AsyncResult<number, string> = { status: \"error\", error: \"error message\" };\n expect(AsyncResult.or(errorResult, 0)).toBe(0);\n\n // Test with pending result\n const pendingResult: AsyncResult<number, string> = { status: \"pending\", progress: undefined };\n expect(AsyncResult.or(pendingResult, 0)).toBe(0);\n});\n\nundefined?.test(\"AsyncResult.orThrow\", ({ expect }) => {\n // Test with ok result\n const okResult: AsyncResult<number, Error> = { status: \"ok\", data: 42 };\n expect(AsyncResult.orThrow(okResult)).toBe(42);\n\n // Test with error result\n const error = new Error(\"Test error\");\n const errorResult: AsyncResult<number, Error> = { status: \"error\", error };\n expect(() => AsyncResult.orThrow(errorResult)).toThrow(error);\n\n // Test with pending result\n const pendingResult: AsyncResult<number, Error> = { status: \"pending\", progress: undefined };\n expect(() => AsyncResult.orThrow(pendingResult)).toThrow(\"Result still pending\");\n});\n\nfunction pending(): AsyncResult<never, never, void> & { status: \"pending\" };\nfunction pending<P>(progress: P): AsyncResult<never, never, P> & { status: \"pending\" };\nfunction pending<P>(progress?: P): AsyncResult<never, never, P> & { status: \"pending\" } {\n return {\n status: \"pending\",\n progress: progress!,\n };\n}\nundefined?.test(\"pending\", ({ expect }) => {\n // Test without progress\n const pendingResult = pending();\n expect(pendingResult.status).toBe(\"pending\");\n expect(pendingResult.progress).toBe(undefined);\n\n // Test with progress\n const progressValue = { loaded: 50, total: 100 };\n const pendingWithProgress = pending(progressValue);\n expect(pendingWithProgress.status).toBe(\"pending\");\n expect(pendingWithProgress.progress).toBe(progressValue);\n});\n\nasync function promiseToResult<T>(promise: Promise<T>): Promise<Result<T>> {\n try {\n const value = await promise;\n return Result.ok(value);\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"promiseToResult\", async ({ expect }) => {\n // Test with resolved promise\n const resolvedPromise = Promise.resolve(42);\n const resolvedResult = await promiseToResult(resolvedPromise);\n expect(resolvedResult.status).toBe(\"ok\");\n if (resolvedResult.status === \"ok\") {\n expect(resolvedResult.data).toBe(42);\n }\n\n // Test with rejected promise\n const error = new Error(\"Test error\");\n const rejectedPromise = Promise.reject(error);\n const rejectedResult = await promiseToResult(rejectedPromise);\n expect(rejectedResult.status).toBe(\"error\");\n if (rejectedResult.status === \"error\") {\n expect(rejectedResult.error).toBe(error);\n }\n});\n\nfunction fromThrowing<T>(fn: () => T): Result<T, unknown> {\n try {\n return Result.ok(fn());\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"fromThrowing\", ({ expect }) => {\n // Test with function that succeeds\n const successFn = () => 42;\n const successResult = fromThrowing(successFn);\n expect(successResult.status).toBe(\"ok\");\n if (successResult.status === \"ok\") {\n expect(successResult.data).toBe(42);\n }\n\n // Test with function that throws\n const error = new Error(\"Test error\");\n const errorFn = () => {\n throw error;\n };\n const errorResult = fromThrowing(errorFn);\n expect(errorResult.status).toBe(\"error\");\n if (errorResult.status === \"error\") {\n expect(errorResult.error).toBe(error);\n }\n});\n\nasync function fromThrowingAsync<T>(fn: () => Promise<T>): Promise<Result<T, unknown>> {\n try {\n return Result.ok(await fn());\n } catch (error) {\n return Result.error(error);\n }\n}\nundefined?.test(\"fromThrowingAsync\", async ({ expect }) => {\n // Test with async function that succeeds\n const successFn = async () => 42;\n const successResult = await fromThrowingAsync(successFn);\n expect(successResult.status).toBe(\"ok\");\n if (successResult.status === \"ok\") {\n expect(successResult.data).toBe(42);\n }\n\n // Test with async function that throws\n const error = new Error(\"Test error\");\n const errorFn = async () => {\n throw error;\n };\n const errorResult = await fromThrowingAsync(errorFn);\n expect(errorResult.status).toBe(\"error\");\n if (errorResult.status === \"error\") {\n expect(errorResult.error).toBe(error);\n }\n});\n\nfunction mapResult<T, U, E = unknown, P = unknown>(result: Result<T, E>, fn: (data: T) => U): Result<U, E>;\nfunction mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P>;\nfunction mapResult<T, U, E = unknown, P = unknown>(result: AsyncResult<T, E, P>, fn: (data: T) => U): AsyncResult<U, E, P> {\n if (result.status === \"error\") return {\n status: \"error\",\n error: result.error,\n };\n if (result.status === \"pending\") return {\n status: \"pending\",\n ...\"progress\" in result ? { progress: result.progress } : {},\n } as any;\n\n return Result.ok(fn(result.data));\n}\nundefined?.test(\"mapResult\", ({ expect }) => {\n // Test with ok result\n const okResult: Result<number, string> = { status: \"ok\", data: 42 };\n const mappedOk = mapResult(okResult, (n: number) => n * 2);\n expect(mappedOk.status).toBe(\"ok\");\n if (mappedOk.status === \"ok\") {\n expect(mappedOk.data).toBe(84);\n }\n\n // Test with error result\n const errorResult: Result<number, string> = { status: \"error\", error: \"error message\" };\n const mappedError = mapResult(errorResult, (n: number) => n * 2);\n expect(mappedError.status).toBe(\"error\");\n if (mappedError.status === \"error\") {\n expect(mappedError.error).toBe(\"error message\");\n }\n\n // Test with pending result (no progress)\n const pendingResult: AsyncResult<number, string, void> = { status: \"pending\", progress: undefined };\n const mappedPending = mapResult(pendingResult, (n: number) => n * 2);\n expect(mappedPending.status).toBe(\"pending\");\n\n // Test with pending result (with progress)\n const progressValue = { loaded: 50, total: 100 };\n const pendingWithProgress: AsyncResult<number, string, typeof progressValue> = {\n status: \"pending\",\n progress: progressValue\n };\n const mappedPendingWithProgress = mapResult(pendingWithProgress, (n: number) => n * 2);\n expect(mappedPendingWithProgress.status).toBe(\"pending\");\n if (mappedPendingWithProgress.status === \"pending\") {\n expect(mappedPendingWithProgress.progress).toBe(progressValue);\n }\n});\n\n\nclass RetryError<E = unknown> extends AggregateError {\n constructor(public readonly errors: E[]) {\n const strings = errors.map(e => nicify(e));\n const isAllSame = strings.length > 1 && strings.every(s => s === strings[0]);\n super(\n errors,\n deindent`\n Error after ${errors.length} attempts.\n \n ${isAllSame ? deindent`\n Attempts 1-${errors.length}:\n ${strings[0]}\n ` : strings.map((s, i) => deindent`\n Attempt ${i + 1}:\n ${s}\n `).join(\"\\n\\n\")}\n `,\n { cause: errors[errors.length - 1] }\n );\n this.name = \"RetryError\";\n }\n\n get attempts() {\n return this.errors.length;\n }\n}\nRetryError.prototype.name = \"RetryError\";\n\nundefined?.test(\"RetryError\", ({ expect }) => {\n // Test with single error\n const singleError = new Error(\"Single error\");\n const retryErrorSingle = new RetryError([singleError]);\n expect(retryErrorSingle.name).toBe(\"RetryError\");\n expect(retryErrorSingle.errors).toEqual([singleError]);\n expect(retryErrorSingle.attempts).toBe(1);\n expect(retryErrorSingle.cause).toBe(singleError);\n expect(retryErrorSingle.message).toContain(\"Error after 1 attempts\");\n\n // Test with multiple different errors\n const error1 = new Error(\"Error 1\");\n const error2 = new Error(\"Error 2\");\n const retryErrorMultiple = new RetryError([error1, error2]);\n expect(retryErrorMultiple.name).toBe(\"RetryError\");\n expect(retryErrorMultiple.errors).toEqual([error1, error2]);\n expect(retryErrorMultiple.attempts).toBe(2);\n expect(retryErrorMultiple.cause).toBe(error2);\n expect(retryErrorMultiple.message).toContain(\"Error after 2 attempts\");\n expect(retryErrorMultiple.message).toContain(\"Attempt 1\");\n expect(retryErrorMultiple.message).toContain(\"Attempt 2\");\n\n // Test with multiple identical errors\n const sameError = new Error(\"Same error\");\n const retryErrorSame = new RetryError([sameError, sameError]);\n expect(retryErrorSame.name).toBe(\"RetryError\");\n expect(retryErrorSame.errors).toEqual([sameError, sameError]);\n expect(retryErrorSame.attempts).toBe(2);\n expect(retryErrorSame.cause).toBe(sameError);\n expect(retryErrorSame.message).toContain(\"Error after 2 attempts\");\n expect(retryErrorSame.message).toContain(\"Attempts 1-2\");\n});\n\nasync function retry<T, E>(\n fn: (attemptIndex: number) => Result<T, E> | Promise<Result<T, E>>,\n totalAttempts: number,\n { exponentialDelayBase = 1000 } = {},\n): Promise<Result<T, RetryError<E>> & { attempts: number }> {\n const errors: E[] = [];\n for (let i = 0; i < totalAttempts; i++) {\n const res = await fn(i);\n if (res.status === \"ok\") {\n return Object.assign(Result.ok(res.data), { attempts: i + 1 });\n } else {\n errors.push(res.error);\n if (i < totalAttempts - 1) {\n await wait((Math.random() + 0.5) * exponentialDelayBase * (2 ** i));\n }\n }\n }\n return Object.assign(Result.error(new RetryError(errors)), { attempts: totalAttempts });\n}\nundefined?.test(\"retry\", async ({ expect }) => {\n // Test successful on first attempt\n const successFn = async () => Result.ok(\"success\");\n const successResult = await retry(successFn, 3, { exponentialDelayBase: 0 });\n expect(successResult).toEqual({ status: \"ok\", data: \"success\", attempts: 1 });\n\n // Test successful after failures\n let attemptCount = 0;\n const eventualSuccessFn = async () => {\n return ++attemptCount < 2 ? Result.error(new Error(`Attempt ${attemptCount} failed`))\n : Result.ok(\"eventual success\");\n };\n const eventualSuccessResult = await retry(eventualSuccessFn, 3, { exponentialDelayBase: 0 });\n expect(eventualSuccessResult).toEqual({ status: \"ok\", data: \"eventual success\", attempts: 2 });\n\n // Test all attempts fail\n const errors = [new Error(\"Error 1\"), new Error(\"Error 2\"), new Error(\"Error 3\")];\n const allFailFn = async (attempt: number) => {\n return Result.error(errors[attempt]);\n };\n const allFailResult = await retry(allFailFn, 3, { exponentialDelayBase: 0 });\n expect(allFailResult).toEqual({ status: \"error\", error: expect.any(RetryError), attempts: 3 });\n const retryError = (allFailResult as any).error as RetryError;\n expect(retryError.errors).toEqual(errors);\n expect(retryError.attempts).toBe(3);\n});\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@stackframe/stack-shared",
3
- "version": "2.8.55",
3
+ "version": "2.8.58",
4
+ "repository": "https://github.com/stack-auth/stack-auth",
4
5
  "files": [
5
6
  "README.md",
6
7
  "dist",