@rikalabs/effect-react 0.0.1

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/dist/actions/http.d.ts +18 -0
  4. package/dist/actions/index.d.ts +4 -0
  5. package/dist/actions/react.d.ts +7 -0
  6. package/dist/actions/service.d.ts +18 -0
  7. package/dist/actions/types.d.ts +33 -0
  8. package/dist/boundary/codecs.d.ts +40 -0
  9. package/dist/boundary/errors.d.ts +22 -0
  10. package/dist/boundary/index.d.ts +2 -0
  11. package/dist/chunk-2GIUCKL2.js +16 -0
  12. package/dist/chunk-2GIUCKL2.js.map +1 -0
  13. package/dist/chunk-2TG7YEVD.js +11 -0
  14. package/dist/chunk-2TG7YEVD.js.map +1 -0
  15. package/dist/chunk-6FI4ROTW.js +152 -0
  16. package/dist/chunk-6FI4ROTW.js.map +1 -0
  17. package/dist/chunk-C5JI7D7W.js +213 -0
  18. package/dist/chunk-C5JI7D7W.js.map +1 -0
  19. package/dist/chunk-EEYASTXR.js +99 -0
  20. package/dist/chunk-EEYASTXR.js.map +1 -0
  21. package/dist/chunk-H7MOLKTU.js +301 -0
  22. package/dist/chunk-H7MOLKTU.js.map +1 -0
  23. package/dist/chunk-IVIYY6S5.js +77 -0
  24. package/dist/chunk-IVIYY6S5.js.map +1 -0
  25. package/dist/chunk-JKN75OYC.js +87 -0
  26. package/dist/chunk-JKN75OYC.js.map +1 -0
  27. package/dist/chunk-M2CJG6T7.js +24 -0
  28. package/dist/chunk-M2CJG6T7.js.map +1 -0
  29. package/dist/chunk-MDGEGQZB.js +206 -0
  30. package/dist/chunk-MDGEGQZB.js.map +1 -0
  31. package/dist/chunk-NI2GNZ7S.js +78 -0
  32. package/dist/chunk-NI2GNZ7S.js.map +1 -0
  33. package/dist/chunk-O7XTA7H3.js +423 -0
  34. package/dist/chunk-O7XTA7H3.js.map +1 -0
  35. package/dist/chunk-S67FHWAR.js +88 -0
  36. package/dist/chunk-S67FHWAR.js.map +1 -0
  37. package/dist/chunk-SKC3HMF3.js +17 -0
  38. package/dist/chunk-SKC3HMF3.js.map +1 -0
  39. package/dist/chunk-TUJZ6XJY.js +127 -0
  40. package/dist/chunk-TUJZ6XJY.js.map +1 -0
  41. package/dist/chunk-WPV3WFMS.js +38 -0
  42. package/dist/chunk-WPV3WFMS.js.map +1 -0
  43. package/dist/chunk-XIBEKS5A.js +301 -0
  44. package/dist/chunk-XIBEKS5A.js.map +1 -0
  45. package/dist/chunk-YG22YP5K.js +68 -0
  46. package/dist/chunk-YG22YP5K.js.map +1 -0
  47. package/dist/chunk-ZMZQBREU.js +262 -0
  48. package/dist/chunk-ZMZQBREU.js.map +1 -0
  49. package/dist/client/index.cjs +191 -0
  50. package/dist/client/index.cjs.map +1 -0
  51. package/dist/client/index.d.ts +8 -0
  52. package/dist/client/index.js +14 -0
  53. package/dist/client/index.js.map +1 -0
  54. package/dist/config/index.cjs +63 -0
  55. package/dist/config/index.cjs.map +1 -0
  56. package/dist/config/index.d.ts +32 -0
  57. package/dist/config/index.js +9 -0
  58. package/dist/config/index.js.map +1 -0
  59. package/dist/data/index.d.ts +3 -0
  60. package/dist/data/react.d.ts +10 -0
  61. package/dist/data/service.d.ts +20 -0
  62. package/dist/data/types.d.ts +31 -0
  63. package/dist/devtools/events.d.ts +37 -0
  64. package/dist/devtools/index.cjs +149 -0
  65. package/dist/devtools/index.cjs.map +1 -0
  66. package/dist/devtools/index.d.ts +2 -0
  67. package/dist/devtools/index.js +18 -0
  68. package/dist/devtools/index.js.map +1 -0
  69. package/dist/devtools/react.d.ts +8 -0
  70. package/dist/form/index.cjs +301 -0
  71. package/dist/form/index.cjs.map +1 -0
  72. package/dist/form/index.d.ts +3 -0
  73. package/dist/form/index.js +14 -0
  74. package/dist/form/index.js.map +1 -0
  75. package/dist/form/react.d.ts +9 -0
  76. package/dist/form/service.d.ts +3 -0
  77. package/dist/form/types.d.ts +41 -0
  78. package/dist/framework/app.d.ts +21 -0
  79. package/dist/framework/cache.d.ts +10 -0
  80. package/dist/framework/contracts.d.ts +32 -0
  81. package/dist/framework/index.cjs +1006 -0
  82. package/dist/framework/index.cjs.map +1 -0
  83. package/dist/framework/index.d.ts +4 -0
  84. package/dist/framework/index.js +35 -0
  85. package/dist/framework/index.js.map +1 -0
  86. package/dist/framework/manifest.d.ts +12 -0
  87. package/dist/framework/vite.d.ts +13 -0
  88. package/dist/framework-vite/index.cjs +163 -0
  89. package/dist/framework-vite/index.cjs.map +1 -0
  90. package/dist/framework-vite/index.d.ts +1 -0
  91. package/dist/framework-vite/index.js +125 -0
  92. package/dist/framework-vite/index.js.map +1 -0
  93. package/dist/grid/grid.d.ts +8 -0
  94. package/dist/grid/index.cjs +238 -0
  95. package/dist/grid/index.cjs.map +1 -0
  96. package/dist/grid/index.d.ts +2 -0
  97. package/dist/grid/index.js +19 -0
  98. package/dist/grid/index.js.map +1 -0
  99. package/dist/grid/types.d.ts +35 -0
  100. package/dist/index.cjs +2512 -0
  101. package/dist/index.cjs.map +1 -0
  102. package/dist/index.d.ts +13 -0
  103. package/dist/index.js +207 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/kernel/app.d.ts +26 -0
  106. package/dist/kernel/index.d.ts +3 -0
  107. package/dist/kernel/runtime.d.ts +5 -0
  108. package/dist/kernel/telemetry.d.ts +37 -0
  109. package/dist/navigation/index.d.ts +4 -0
  110. package/dist/navigation/matcher.d.ts +13 -0
  111. package/dist/navigation/react.d.ts +12 -0
  112. package/dist/navigation/service.d.ts +23 -0
  113. package/dist/navigation/types.d.ts +65 -0
  114. package/dist/query/index.cjs +361 -0
  115. package/dist/query/index.cjs.map +1 -0
  116. package/dist/query/index.d.ts +3 -0
  117. package/dist/query/index.js +30 -0
  118. package/dist/query/index.js.map +1 -0
  119. package/dist/query/react.d.ts +27 -0
  120. package/dist/query/service.d.ts +10 -0
  121. package/dist/query/types.d.ts +5 -0
  122. package/dist/react/index.d.ts +1 -0
  123. package/dist/react/provider.d.ts +10 -0
  124. package/dist/realtime/channel.d.ts +15 -0
  125. package/dist/realtime/index.cjs +117 -0
  126. package/dist/realtime/index.cjs.map +1 -0
  127. package/dist/realtime/index.d.ts +2 -0
  128. package/dist/realtime/index.js +15 -0
  129. package/dist/realtime/index.js.map +1 -0
  130. package/dist/realtime/presence.d.ts +22 -0
  131. package/dist/render/hydration.d.ts +24 -0
  132. package/dist/render/index.d.ts +2 -0
  133. package/dist/render/ssr.d.ts +13 -0
  134. package/dist/router/helpers.d.ts +26 -0
  135. package/dist/router/index.cjs +236 -0
  136. package/dist/router/index.cjs.map +1 -0
  137. package/dist/router/index.d.ts +4 -0
  138. package/dist/router/index.js +40 -0
  139. package/dist/router/index.js.map +1 -0
  140. package/dist/router/react.d.ts +5 -0
  141. package/dist/router/service.d.ts +5 -0
  142. package/dist/router/types.d.ts +1 -0
  143. package/dist/server/index.cjs +174 -0
  144. package/dist/server/index.cjs.map +1 -0
  145. package/dist/server/index.d.ts +16 -0
  146. package/dist/server/index.js +12 -0
  147. package/dist/server/index.js.map +1 -0
  148. package/dist/state/index.cjs +128 -0
  149. package/dist/state/index.cjs.map +1 -0
  150. package/dist/state/index.d.ts +2 -0
  151. package/dist/state/index.js +36 -0
  152. package/dist/state/index.js.map +1 -0
  153. package/dist/state/react.d.ts +3 -0
  154. package/dist/state/service.d.ts +28 -0
  155. package/dist/testing/index.cjs +970 -0
  156. package/dist/testing/index.cjs.map +1 -0
  157. package/dist/testing/index.d.ts +2 -0
  158. package/dist/testing/index.js +13 -0
  159. package/dist/testing/index.js.map +1 -0
  160. package/dist/virtual/index.cjs +160 -0
  161. package/dist/virtual/index.cjs.map +1 -0
  162. package/dist/virtual/index.d.ts +2 -0
  163. package/dist/virtual/index.js +21 -0
  164. package/dist/virtual/index.js.map +1 -0
  165. package/dist/virtual/types.d.ts +25 -0
  166. package/dist/virtual/virtual.d.ts +9 -0
  167. package/package.json +156 -0
@@ -0,0 +1,127 @@
1
+ // src/virtual/virtual.ts
2
+ import { Array as EffectArray, pipe } from "effect";
3
+ var normalizeNonNegativeInteger = (value) => {
4
+ if (!Number.isFinite(value)) {
5
+ return 0;
6
+ }
7
+ return Math.max(0, Math.floor(value));
8
+ };
9
+ var normalizeNonNegativeNumber = (value) => {
10
+ if (!Number.isFinite(value)) {
11
+ return 0;
12
+ }
13
+ return Math.max(0, value);
14
+ };
15
+ var normalizePositiveNumber = (value, fallback) => {
16
+ if (!Number.isFinite(value) || value <= 0) {
17
+ return fallback;
18
+ }
19
+ return value;
20
+ };
21
+ var normalizeCount = (count) => normalizeNonNegativeInteger(count);
22
+ var normalizeEstimateSize = (estimateSize) => normalizePositiveNumber(estimateSize, 1);
23
+ var resolveItemSize = (sizes, index, estimateSize) => normalizePositiveNumber(sizes?.[index] ?? estimateSize, estimateSize);
24
+ var measureVirtualItems = (input) => {
25
+ const count = normalizeCount(input.count);
26
+ const estimateSize = normalizeEstimateSize(input.estimateSize);
27
+ const items = [];
28
+ let offset = 0;
29
+ for (let index = 0; index < count; index += 1) {
30
+ const size = resolveItemSize(input.sizes, index, estimateSize);
31
+ const start = offset;
32
+ const end = start + size;
33
+ items[index] = {
34
+ index,
35
+ size,
36
+ start,
37
+ end
38
+ };
39
+ offset = end;
40
+ }
41
+ return items;
42
+ };
43
+ var calculateOffsets = (input) => pipe(
44
+ measureVirtualItems(input),
45
+ EffectArray.map((item) => item.start)
46
+ );
47
+ var calculateTotalSize = (input) => {
48
+ const items = measureVirtualItems(input);
49
+ if (items.length === 0) {
50
+ return 0;
51
+ }
52
+ return items[items.length - 1].end;
53
+ };
54
+ var calculateOffsetForIndex = (input) => {
55
+ const count = normalizeCount(input.count);
56
+ const index = normalizeNonNegativeInteger(input.index);
57
+ if (count === 0 || index === 0) {
58
+ return 0;
59
+ }
60
+ if (index >= count) {
61
+ return calculateTotalSize(input);
62
+ }
63
+ const estimateSize = normalizeEstimateSize(input.estimateSize);
64
+ let offset = 0;
65
+ for (let currentIndex = 0; currentIndex < index; currentIndex += 1) {
66
+ offset += resolveItemSize(input.sizes, currentIndex, estimateSize);
67
+ }
68
+ return offset;
69
+ };
70
+ var calculateVisibleRange = (input) => {
71
+ const count = normalizeCount(input.count);
72
+ if (count === 0) {
73
+ return {
74
+ startIndex: 0,
75
+ endIndex: -1,
76
+ overscanStartIndex: 0,
77
+ overscanEndIndex: -1
78
+ };
79
+ }
80
+ const viewportSize = normalizeNonNegativeNumber(input.viewportSize);
81
+ const scrollOffset = normalizeNonNegativeNumber(input.scrollOffset);
82
+ const overscan = normalizeNonNegativeInteger(input.overscan ?? 0);
83
+ const viewportEnd = scrollOffset + viewportSize;
84
+ const measurements = measureVirtualItems(input);
85
+ let startIndex = count - 1;
86
+ let endIndex = count - 1;
87
+ let foundStart = false;
88
+ for (const item of measurements) {
89
+ if (!foundStart && item.end > scrollOffset) {
90
+ startIndex = item.index;
91
+ foundStart = true;
92
+ }
93
+ if (item.start < viewportEnd) {
94
+ endIndex = item.index;
95
+ }
96
+ if (foundStart && item.start >= viewportEnd) {
97
+ break;
98
+ }
99
+ }
100
+ if (!foundStart) {
101
+ startIndex = count - 1;
102
+ endIndex = count - 1;
103
+ } else if (viewportSize <= 0) {
104
+ endIndex = startIndex;
105
+ }
106
+ return {
107
+ startIndex,
108
+ endIndex,
109
+ overscanStartIndex: Math.max(0, startIndex - overscan),
110
+ overscanEndIndex: Math.min(count - 1, endIndex + overscan)
111
+ };
112
+ };
113
+ var getOffsetForIndex = calculateOffsetForIndex;
114
+ var getTotalSize = calculateTotalSize;
115
+ var getVisibleRange = calculateVisibleRange;
116
+
117
+ export {
118
+ measureVirtualItems,
119
+ calculateOffsets,
120
+ calculateTotalSize,
121
+ calculateOffsetForIndex,
122
+ calculateVisibleRange,
123
+ getOffsetForIndex,
124
+ getTotalSize,
125
+ getVisibleRange
126
+ };
127
+ //# sourceMappingURL=chunk-TUJZ6XJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/virtual/virtual.ts"],"sourcesContent":["import { Array as EffectArray, pipe } from \"effect\";\nimport type {\n VirtualItemMeasurement,\n VirtualOffsetInput,\n VirtualRange,\n VirtualRangeInput,\n VirtualSizeInput,\n} from \"./types\";\n\nconst normalizeNonNegativeInteger = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.floor(value));\n};\n\nconst normalizeNonNegativeNumber = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, value);\n};\n\nconst normalizePositiveNumber = (value: number, fallback: number): number => {\n if (!Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return value;\n};\n\nconst normalizeCount = (count: number): number => normalizeNonNegativeInteger(count);\nconst normalizeEstimateSize = (estimateSize: number): number => normalizePositiveNumber(estimateSize, 1);\n\nconst resolveItemSize = (\n sizes: readonly number[] | undefined,\n index: number,\n estimateSize: number,\n): number => normalizePositiveNumber(sizes?.[index] ?? estimateSize, estimateSize);\n\nexport const measureVirtualItems = (input: VirtualSizeInput): readonly VirtualItemMeasurement[] => {\n const count = normalizeCount(input.count);\n const estimateSize = normalizeEstimateSize(input.estimateSize);\n const items: VirtualItemMeasurement[] = [];\n\n let offset = 0;\n\n for (let index = 0; index < count; index += 1) {\n const size = resolveItemSize(input.sizes, index, estimateSize);\n const start = offset;\n const end = start + size;\n\n items[index] = {\n index,\n size,\n start,\n end,\n };\n\n offset = end;\n }\n\n return items;\n};\n\nexport const calculateOffsets = (input: VirtualSizeInput): readonly number[] =>\n pipe(\n measureVirtualItems(input),\n EffectArray.map((item) => item.start),\n );\n\nexport const calculateTotalSize = (input: VirtualSizeInput): number => {\n const items = measureVirtualItems(input);\n if (items.length === 0) {\n return 0;\n }\n return items[items.length - 1]!.end;\n};\n\nexport const calculateOffsetForIndex = (input: VirtualOffsetInput): number => {\n const count = normalizeCount(input.count);\n const index = normalizeNonNegativeInteger(input.index);\n\n if (count === 0 || index === 0) {\n return 0;\n }\n\n if (index >= count) {\n return calculateTotalSize(input);\n }\n\n const estimateSize = normalizeEstimateSize(input.estimateSize);\n let offset = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex += 1) {\n offset += resolveItemSize(input.sizes, currentIndex, estimateSize);\n }\n\n return offset;\n};\n\nexport const calculateVisibleRange = (input: VirtualRangeInput): VirtualRange => {\n const count = normalizeCount(input.count);\n\n if (count === 0) {\n return {\n startIndex: 0,\n endIndex: -1,\n overscanStartIndex: 0,\n overscanEndIndex: -1,\n };\n }\n\n const viewportSize = normalizeNonNegativeNumber(input.viewportSize);\n const scrollOffset = normalizeNonNegativeNumber(input.scrollOffset);\n const overscan = normalizeNonNegativeInteger(input.overscan ?? 0);\n const viewportEnd = scrollOffset + viewportSize;\n\n const measurements = measureVirtualItems(input);\n let startIndex = count - 1;\n let endIndex = count - 1;\n let foundStart = false;\n\n for (const item of measurements) {\n if (!foundStart && item.end > scrollOffset) {\n startIndex = item.index;\n foundStart = true;\n }\n\n if (item.start < viewportEnd) {\n endIndex = item.index;\n }\n\n if (foundStart && item.start >= viewportEnd) {\n break;\n }\n }\n\n if (!foundStart) {\n startIndex = count - 1;\n endIndex = count - 1;\n } else if (viewportSize <= 0) {\n endIndex = startIndex;\n }\n\n return {\n startIndex,\n endIndex,\n overscanStartIndex: Math.max(0, startIndex - overscan),\n overscanEndIndex: Math.min(count - 1, endIndex + overscan),\n };\n};\n\nexport const getOffsetForIndex = calculateOffsetForIndex;\nexport const getTotalSize = calculateTotalSize;\nexport const getVisibleRange = calculateVisibleRange;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,38 @@
1
+ // src/config/index.ts
2
+ var defaultConfig = {
3
+ appDir: "app",
4
+ adapters: ["node", "bun"],
5
+ ssr: {
6
+ streaming: true
7
+ },
8
+ cache: {
9
+ defaultPolicy: "no-store",
10
+ routeSegmentDefaults: "explicit"
11
+ },
12
+ strict: {
13
+ boundarySchemas: true,
14
+ typedErrors: true
15
+ }
16
+ };
17
+ var defineConfig = (config) => config;
18
+ var resolveConfig = (config = {}) => ({
19
+ appDir: config.appDir ?? defaultConfig.appDir,
20
+ adapters: config.adapters ?? defaultConfig.adapters,
21
+ ssr: {
22
+ streaming: config.ssr?.streaming ?? defaultConfig.ssr.streaming
23
+ },
24
+ cache: {
25
+ defaultPolicy: config.cache?.defaultPolicy ?? defaultConfig.cache.defaultPolicy,
26
+ routeSegmentDefaults: config.cache?.routeSegmentDefaults ?? defaultConfig.cache.routeSegmentDefaults
27
+ },
28
+ strict: {
29
+ boundarySchemas: config.strict?.boundarySchemas ?? defaultConfig.strict.boundarySchemas,
30
+ typedErrors: config.strict?.typedErrors ?? defaultConfig.strict.typedErrors
31
+ }
32
+ });
33
+
34
+ export {
35
+ defineConfig,
36
+ resolveConfig
37
+ };
38
+ //# sourceMappingURL=chunk-WPV3WFMS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/index.ts"],"sourcesContent":["export interface EffectReactConfig {\n readonly appDir?: string;\n readonly adapters?: readonly (\"node\" | \"bun\")[];\n readonly ssr?: {\n readonly streaming?: boolean;\n };\n readonly cache?: {\n readonly defaultPolicy?: \"no-store\" | \"force-cache\";\n readonly routeSegmentDefaults?: \"explicit\";\n };\n readonly strict?: {\n readonly boundarySchemas?: boolean;\n readonly typedErrors?: boolean;\n };\n}\n\nexport interface EffectReactResolvedConfig {\n readonly appDir: string;\n readonly adapters: readonly (\"node\" | \"bun\")[];\n readonly ssr: {\n readonly streaming: boolean;\n };\n readonly cache: {\n readonly defaultPolicy: \"no-store\" | \"force-cache\";\n readonly routeSegmentDefaults: \"explicit\";\n };\n readonly strict: {\n readonly boundarySchemas: boolean;\n readonly typedErrors: boolean;\n };\n}\n\nconst defaultConfig: EffectReactResolvedConfig = {\n appDir: \"app\",\n adapters: [\"node\", \"bun\"],\n ssr: {\n streaming: true,\n },\n cache: {\n defaultPolicy: \"no-store\",\n routeSegmentDefaults: \"explicit\",\n },\n strict: {\n boundarySchemas: true,\n typedErrors: true,\n },\n};\n\nexport const defineConfig = (config: EffectReactConfig): EffectReactConfig => config;\n\nexport const resolveConfig = (\n config: EffectReactConfig = {},\n): EffectReactResolvedConfig => ({\n appDir: config.appDir ?? defaultConfig.appDir,\n adapters: config.adapters ?? defaultConfig.adapters,\n ssr: {\n streaming: config.ssr?.streaming ?? defaultConfig.ssr.streaming,\n },\n cache: {\n defaultPolicy: config.cache?.defaultPolicy ?? defaultConfig.cache.defaultPolicy,\n routeSegmentDefaults:\n config.cache?.routeSegmentDefaults ?? defaultConfig.cache.routeSegmentDefaults,\n },\n strict: {\n boundarySchemas:\n config.strict?.boundarySchemas ?? defaultConfig.strict.boundarySchemas,\n typedErrors: config.strict?.typedErrors ?? defaultConfig.strict.typedErrors,\n },\n});\n"],"mappings":";AAgCA,IAAM,gBAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,UAAU,CAAC,QAAQ,KAAK;AAAA,EACxB,KAAK;AAAA,IACH,WAAW;AAAA,EACb;AAAA,EACA,OAAO;AAAA,IACL,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB;AAAA,EACA,QAAQ;AAAA,IACN,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEO,IAAM,eAAe,CAAC,WAAiD;AAEvE,IAAM,gBAAgB,CAC3B,SAA4B,CAAC,OACE;AAAA,EAC/B,QAAQ,OAAO,UAAU,cAAc;AAAA,EACvC,UAAU,OAAO,YAAY,cAAc;AAAA,EAC3C,KAAK;AAAA,IACH,WAAW,OAAO,KAAK,aAAa,cAAc,IAAI;AAAA,EACxD;AAAA,EACA,OAAO;AAAA,IACL,eAAe,OAAO,OAAO,iBAAiB,cAAc,MAAM;AAAA,IAClE,sBACE,OAAO,OAAO,wBAAwB,cAAc,MAAM;AAAA,EAC9D;AAAA,EACA,QAAQ;AAAA,IACN,iBACE,OAAO,QAAQ,mBAAmB,cAAc,OAAO;AAAA,IACzD,aAAa,OAAO,QAAQ,eAAe,cAAc,OAAO;AAAA,EAClE;AACF;","names":[]}
@@ -0,0 +1,301 @@
1
+ import {
2
+ makeDataLayer
3
+ } from "./chunk-C5JI7D7W.js";
4
+ import {
5
+ makeNavigationLayer,
6
+ matchRoute,
7
+ parseHref
8
+ } from "./chunk-O7XTA7H3.js";
9
+ import {
10
+ Boundary,
11
+ BoundaryDecodeError,
12
+ BoundaryLive,
13
+ BoundaryProtocolError
14
+ } from "./chunk-YG22YP5K.js";
15
+ import {
16
+ resolveConfig
17
+ } from "./chunk-WPV3WFMS.js";
18
+ import {
19
+ Telemetry,
20
+ TelemetryLive
21
+ } from "./chunk-SKC3HMF3.js";
22
+
23
+ // src/actions/types.ts
24
+ var defineAction = (definition) => definition;
25
+
26
+ // src/actions/service.ts
27
+ import { Cause, Context, Effect, Layer } from "effect";
28
+ var toFailureDetail = (error) => {
29
+ if (error instanceof Error) {
30
+ return `${error.name}: ${error.message}`;
31
+ }
32
+ return String(error);
33
+ };
34
+ var Actions = class extends Context.Tag("EffectReact/Actions")() {
35
+ };
36
+ var makeActionsLayer = (options) => Layer.effect(
37
+ Actions,
38
+ Effect.gen(function* () {
39
+ const boundary = yield* Boundary;
40
+ const telemetry = yield* Telemetry;
41
+ const actionMap = new Map(
42
+ options.actions.map((action) => [action.name, action])
43
+ );
44
+ const run = (definition, input) => Effect.gen(function* () {
45
+ yield* telemetry.emit({
46
+ _tag: "action",
47
+ phase: "start",
48
+ name: definition.name,
49
+ timestamp: Date.now()
50
+ });
51
+ const decodedInput = yield* boundary.decodeUnknown({
52
+ source: `action:${definition.name}:input`,
53
+ schema: definition.input,
54
+ value: input
55
+ });
56
+ const value = yield* definition.handler(decodedInput);
57
+ const decodedOutput = yield* boundary.decodeUnknown({
58
+ source: `action:${definition.name}:output`,
59
+ schema: definition.output,
60
+ value
61
+ });
62
+ yield* telemetry.emit({
63
+ _tag: "action",
64
+ phase: "success",
65
+ name: definition.name,
66
+ timestamp: Date.now()
67
+ });
68
+ return decodedOutput;
69
+ }).pipe(
70
+ Effect.tapError(
71
+ (error) => telemetry.emit({
72
+ _tag: "action",
73
+ phase: "failure",
74
+ name: definition.name,
75
+ timestamp: Date.now(),
76
+ detail: error
77
+ })
78
+ )
79
+ );
80
+ const dispatch = (name, input) => Effect.gen(function* () {
81
+ const definition = actionMap.get(name);
82
+ if (definition === void 0) {
83
+ return {
84
+ _tag: "defect",
85
+ message: `Unknown action: ${name}`
86
+ };
87
+ }
88
+ const decodedInput = yield* boundary.decodeUnknown({
89
+ source: `action:${name}:dispatch-input`,
90
+ schema: definition.input,
91
+ value: input
92
+ });
93
+ const handler = definition.handler;
94
+ const result = yield* Effect.exit(handler(decodedInput));
95
+ if (result._tag === "Success") {
96
+ const encoded = yield* boundary.encode({
97
+ source: `action:${name}:wire-success`,
98
+ schema: definition.output,
99
+ value: result.value
100
+ });
101
+ return {
102
+ _tag: "success",
103
+ value: encoded
104
+ };
105
+ }
106
+ const failure = Cause.failureOption(result.cause);
107
+ if (failure._tag === "Some") {
108
+ const value = failure.value;
109
+ if (value instanceof BoundaryDecodeError || value instanceof BoundaryProtocolError) {
110
+ return {
111
+ _tag: "defect",
112
+ message: toFailureDetail(value)
113
+ };
114
+ }
115
+ const encodedError = yield* boundary.encode({
116
+ source: `action:${name}:wire-failure`,
117
+ schema: definition.error,
118
+ value
119
+ }).pipe(
120
+ Effect.catchAll(() => Effect.succeed(value))
121
+ );
122
+ return {
123
+ _tag: "failure",
124
+ error: encodedError
125
+ };
126
+ }
127
+ return {
128
+ _tag: "defect",
129
+ message: Cause.pretty(result.cause)
130
+ };
131
+ }).pipe(
132
+ Effect.catchAll(
133
+ (error) => Effect.succeed({
134
+ _tag: "defect",
135
+ message: toFailureDetail(error)
136
+ })
137
+ )
138
+ );
139
+ return {
140
+ run,
141
+ dispatch
142
+ };
143
+ })
144
+ );
145
+
146
+ // src/actions/http.ts
147
+ import { Effect as Effect2, Schema } from "effect";
148
+ var ActionRequestSchema = Schema.Struct({
149
+ name: Schema.String,
150
+ input: Schema.Unknown
151
+ });
152
+ var ActionWireResultSchema = Schema.Union(
153
+ Schema.Struct({ _tag: Schema.Literal("success"), value: Schema.Unknown }),
154
+ Schema.Struct({ _tag: Schema.Literal("failure"), error: Schema.Unknown }),
155
+ Schema.Struct({ _tag: Schema.Literal("defect"), message: Schema.String })
156
+ );
157
+ var ActionTransportError = class extends Error {
158
+ constructor(messageText, causeValue) {
159
+ super(messageText);
160
+ this.messageText = messageText;
161
+ this.causeValue = causeValue;
162
+ this.name = "ActionTransportError";
163
+ }
164
+ _tag = "ActionTransportError";
165
+ };
166
+ var jsonResponse = (status, body) => new Response(JSON.stringify(body), {
167
+ status,
168
+ headers: {
169
+ "content-type": "application/json"
170
+ }
171
+ });
172
+ var createActionHttpHandlerEffect = () => (request) => Effect2.gen(function* () {
173
+ if (request.method.toUpperCase() !== "POST") {
174
+ return jsonResponse(405, { error: "Method Not Allowed" });
175
+ }
176
+ const rawBody = yield* Effect2.tryPromise({
177
+ try: () => request.text(),
178
+ catch: (cause) => new ActionTransportError("Failed to read request body", cause)
179
+ });
180
+ const boundary = yield* Boundary;
181
+ const payload = yield* boundary.decodeTextJson({
182
+ source: "action:http:request",
183
+ schema: ActionRequestSchema,
184
+ text: rawBody
185
+ });
186
+ const actions = yield* Actions;
187
+ const result = yield* actions.dispatch(payload.name, payload.input);
188
+ return jsonResponse(200, result);
189
+ }).pipe(
190
+ Effect2.catchAll(
191
+ (error) => Effect2.succeed(
192
+ jsonResponse(500, {
193
+ error: error instanceof Error ? error.message : String(error)
194
+ })
195
+ )
196
+ )
197
+ );
198
+ var createActionHttpHandler = () => {
199
+ const handleEffect = createActionHttpHandlerEffect();
200
+ return (runtimeRun) => (request) => runtimeRun(handleEffect(request));
201
+ };
202
+
203
+ // src/kernel/app.ts
204
+ import { Layer as Layer2 } from "effect";
205
+
206
+ // src/kernel/runtime.ts
207
+ import { ManagedRuntime } from "effect";
208
+ var createManagedRuntime = (layer) => ManagedRuntime.make(layer);
209
+
210
+ // src/kernel/app.ts
211
+ var createAppLayer = (options) => {
212
+ const boundaryLayer = BoundaryLive;
213
+ const telemetryLayer = TelemetryLive;
214
+ const dataLayer = makeDataLayer(options.data).pipe(
215
+ Layer2.provide([boundaryLayer, telemetryLayer])
216
+ );
217
+ const actionsLayer = makeActionsLayer({
218
+ actions: options.actions ?? []
219
+ }).pipe(Layer2.provide([boundaryLayer, telemetryLayer]));
220
+ const navigationLayer = makeNavigationLayer({
221
+ routes: options.routes,
222
+ ...options.loaders !== void 0 ? { loaders: options.loaders } : {},
223
+ ...options.initialHref !== void 0 ? { initialHref: options.initialHref } : {}
224
+ }).pipe(Layer2.provide([boundaryLayer, telemetryLayer]));
225
+ return Layer2.mergeAll(boundaryLayer, telemetryLayer, dataLayer, actionsLayer, navigationLayer);
226
+ };
227
+ var createAppRuntime = (options) => createManagedRuntime(createAppLayer(options));
228
+
229
+ // src/framework/manifest.ts
230
+ var defineManifest = (manifest) => manifest;
231
+ var routesFromManifest = (manifest) => manifest.pages.map((page) => page.route);
232
+ var loadersFromManifest = (manifest) => {
233
+ const pageLoaders = manifest.pages.map((page) => page.loader).filter((loader) => loader !== void 0);
234
+ const layoutLoaders = (manifest.layouts ?? []).map((layout) => layout.loader).filter((loader) => loader !== void 0);
235
+ return [...pageLoaders, ...layoutLoaders];
236
+ };
237
+
238
+ // src/framework/app.ts
239
+ var createPageMatcher = (pages) => {
240
+ const routes = pages.map((page) => page.route);
241
+ return (href) => {
242
+ const parsed = parseHref(href);
243
+ const matched = matchRoute({
244
+ routes,
245
+ pathname: parsed.pathname,
246
+ search: {}
247
+ });
248
+ if (matched === null) {
249
+ return void 0;
250
+ }
251
+ return pages.find((page) => page.route.id === matched.route.id);
252
+ };
253
+ };
254
+ var createApp = (options) => {
255
+ const manifest = options.manifest;
256
+ const routes = routesFromManifest(manifest);
257
+ const loaders = loadersFromManifest(manifest);
258
+ const actions = manifest.actions ?? [];
259
+ const runtime = createAppRuntime({
260
+ routes,
261
+ actions,
262
+ loaders,
263
+ ...options.initialHref !== void 0 ? { initialHref: options.initialHref } : {}
264
+ });
265
+ const actionHandlerFactory = createActionHttpHandler();
266
+ const handleActionRequest = actionHandlerFactory((effect) => runtime.runPromise(effect));
267
+ return {
268
+ manifest,
269
+ config: resolveConfig(options.config),
270
+ runtime,
271
+ actions,
272
+ matchPage: createPageMatcher(manifest.pages),
273
+ handleActionRequest,
274
+ dispose: () => runtime.dispose()
275
+ };
276
+ };
277
+
278
+ // src/framework/cache.ts
279
+ var cachePolicy = (policy) => policy;
280
+ var noStore = () => ({
281
+ mode: "no-store"
282
+ });
283
+
284
+ // src/framework/contracts.ts
285
+ var definePage = (page) => page;
286
+ var defineLayout = (layout) => layout;
287
+ var defineMiddleware = (middleware) => middleware;
288
+
289
+ export {
290
+ defineAction,
291
+ defineManifest,
292
+ routesFromManifest,
293
+ loadersFromManifest,
294
+ createApp,
295
+ cachePolicy,
296
+ noStore,
297
+ definePage,
298
+ defineLayout,
299
+ defineMiddleware
300
+ };
301
+ //# sourceMappingURL=chunk-XIBEKS5A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/actions/types.ts","../src/actions/service.ts","../src/actions/http.ts","../src/kernel/app.ts","../src/kernel/runtime.ts","../src/framework/manifest.ts","../src/framework/app.ts","../src/framework/cache.ts","../src/framework/contracts.ts"],"sourcesContent":["import type { Effect, Schema } from \"effect\";\nimport type { BoundaryError } from \"../boundary\";\n\nexport interface ActionDefinition<\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n ErrorEncoded = E,\n> {\n readonly name: Name;\n readonly input: Schema.Schema<Input, InputEncoded, never>;\n readonly output: Schema.Schema<Output, OutputEncoded, never>;\n readonly error: Schema.Schema<E, ErrorEncoded, never>;\n readonly handler: (input: Input) => Effect.Effect<Output, E, never>;\n}\n\nexport const defineAction = <\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n ErrorEncoded = E,\n>(\n definition: ActionDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded, ErrorEncoded>,\n): ActionDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded, ErrorEncoded> =>\n definition;\n\nexport interface AnyActionDefinition {\n readonly name: string;\n readonly input: Schema.Schema.All;\n readonly output: Schema.Schema.All;\n readonly error: Schema.Schema.All;\n readonly handler: (input: never) => Effect.Effect<unknown, unknown, never>;\n}\n\nexport type ActionError<E> = E | BoundaryError | ActionRuntimeError;\n\nexport class ActionRuntimeError extends Error {\n readonly _tag = \"ActionRuntimeError\" as const;\n\n constructor(readonly messageText: string) {\n super(messageText);\n this.name = \"ActionRuntimeError\";\n }\n}\n\nexport type ActionWireResult =\n | {\n readonly _tag: \"success\";\n readonly value: unknown;\n }\n | {\n readonly _tag: \"failure\";\n readonly error: unknown;\n }\n | {\n readonly _tag: \"defect\";\n readonly message: string;\n };\n","import { Cause, Context, Effect, Layer } from \"effect\";\nimport { Boundary, BoundaryDecodeError } from \"../boundary\";\nimport { BoundaryProtocolError } from \"../boundary/errors\";\nimport { Telemetry } from \"../kernel/telemetry\";\nimport {\n type ActionDefinition,\n type ActionError,\n type ActionWireResult,\n type AnyActionDefinition,\n} from \"./types\";\n\nconst toFailureDetail = (error: unknown): string => {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n return String(error);\n};\n\nexport interface ActionService {\n readonly run: <Name extends string, Input, Output, E>(\n definition: ActionDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<Output, ActionError<E>, never>;\n readonly dispatch: (name: string, input: unknown) => Effect.Effect<ActionWireResult, never, never>;\n}\n\nexport class Actions extends Context.Tag(\"EffectReact/Actions\")<Actions, ActionService>() {}\n\nexport interface MakeActionsLayerOptions {\n readonly actions: readonly AnyActionDefinition[];\n}\n\nexport const makeActionsLayer = (\n options: MakeActionsLayerOptions,\n): Layer.Layer<Actions, never, Boundary | Telemetry> =>\n Layer.effect(\n Actions,\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const telemetry = yield* Telemetry;\n const actionMap = new Map<string, AnyActionDefinition>(\n options.actions.map((action) => [action.name, action] as const),\n );\n\n const run: ActionService[\"run\"] = (definition, input) =>\n Effect.gen(function* () {\n yield* telemetry.emit({\n _tag: \"action\",\n phase: \"start\",\n name: definition.name,\n timestamp: Date.now(),\n });\n\n const decodedInput = yield* boundary.decodeUnknown({\n source: `action:${definition.name}:input`,\n schema: definition.input,\n value: input,\n });\n\n const value = yield* definition.handler(decodedInput);\n\n const decodedOutput = yield* boundary.decodeUnknown({\n source: `action:${definition.name}:output`,\n schema: definition.output,\n value,\n });\n\n yield* telemetry.emit({\n _tag: \"action\",\n phase: \"success\",\n name: definition.name,\n timestamp: Date.now(),\n });\n\n return decodedOutput;\n }).pipe(\n Effect.tapError((error) =>\n telemetry.emit({\n _tag: \"action\",\n phase: \"failure\",\n name: definition.name,\n timestamp: Date.now(),\n detail: error,\n }),\n ),\n );\n\n const dispatch: ActionService[\"dispatch\"] = (name, input) =>\n Effect.gen(function* () {\n const definition = actionMap.get(name);\n if (definition === undefined) {\n return {\n _tag: \"defect\",\n message: `Unknown action: ${name}`,\n } satisfies ActionWireResult;\n }\n\n const decodedInput = yield* boundary.decodeUnknown({\n source: `action:${name}:dispatch-input`,\n schema: definition.input as never,\n value: input,\n });\n\n const handler = definition.handler as (input: unknown) => Effect.Effect<unknown, unknown, never>;\n const result = yield* Effect.exit(handler(decodedInput));\n if (result._tag === \"Success\") {\n const encoded = yield* boundary.encode({\n source: `action:${name}:wire-success`,\n schema: definition.output as never,\n value: result.value,\n });\n\n return {\n _tag: \"success\",\n value: encoded,\n } satisfies ActionWireResult;\n }\n\n const failure = Cause.failureOption(result.cause);\n if (failure._tag === \"Some\") {\n const value = failure.value;\n if (value instanceof BoundaryDecodeError || value instanceof BoundaryProtocolError) {\n return {\n _tag: \"defect\",\n message: toFailureDetail(value),\n } satisfies ActionWireResult;\n }\n\n const encodedError = yield* boundary.encode({\n source: `action:${name}:wire-failure`,\n schema: definition.error as never,\n value,\n }).pipe(\n Effect.catchAll(() => Effect.succeed(value)),\n );\n\n return {\n _tag: \"failure\",\n error: encodedError,\n } satisfies ActionWireResult;\n }\n\n return {\n _tag: \"defect\",\n message: Cause.pretty(result.cause),\n } satisfies ActionWireResult;\n }).pipe(\n Effect.catchAll((error) =>\n Effect.succeed({\n _tag: \"defect\",\n message: toFailureDetail(error),\n } satisfies ActionWireResult),\n ),\n );\n\n return {\n run,\n dispatch,\n } satisfies ActionService;\n }),\n );\n\nexport const runAction = <Name extends string, Input, Output, E>(\n definition: ActionDefinition<Name, Input, Output, E>,\n input: unknown,\n): Effect.Effect<Output, ActionError<E>, Actions> =>\n Effect.flatMap(Actions, (service) => service.run(definition, input));\n\nexport const dispatchAction = (\n name: string,\n input: unknown,\n): Effect.Effect<ActionWireResult, never, Actions> =>\n Effect.flatMap(Actions, (service) => service.dispatch(name, input));\n","import { Effect, Schema } from \"effect\";\nimport { Boundary } from \"../boundary\";\nimport { Actions } from \"./service\";\nimport { type ActionDefinition, type ActionError, type ActionWireResult } from \"./types\";\n\nconst ActionRequestSchema = Schema.Struct({\n name: Schema.String,\n input: Schema.Unknown,\n});\n\nconst ActionWireResultSchema = Schema.Union(\n Schema.Struct({ _tag: Schema.Literal(\"success\"), value: Schema.Unknown }),\n Schema.Struct({ _tag: Schema.Literal(\"failure\"), error: Schema.Unknown }),\n Schema.Struct({ _tag: Schema.Literal(\"defect\"), message: Schema.String }),\n);\n\nexport class ActionTransportError extends Error {\n readonly _tag = \"ActionTransportError\" as const;\n\n constructor(\n readonly messageText: string,\n readonly causeValue?: unknown,\n ) {\n super(messageText);\n this.name = \"ActionTransportError\";\n }\n}\n\nconst jsonResponse = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: {\n \"content-type\": \"application/json\",\n },\n });\n\nexport const createActionHttpHandlerEffect = (): ((\n request: Request,\n) => Effect.Effect<Response, never, Boundary | Actions>) =>\n (request) =>\n Effect.gen(function* () {\n if (request.method.toUpperCase() !== \"POST\") {\n return jsonResponse(405, { error: \"Method Not Allowed\" });\n }\n\n const rawBody = yield* Effect.tryPromise({\n try: () => request.text(),\n catch: (cause) => new ActionTransportError(\"Failed to read request body\", cause),\n });\n\n const boundary = yield* Boundary;\n const payload = yield* boundary.decodeTextJson({\n source: \"action:http:request\",\n schema: ActionRequestSchema,\n text: rawBody,\n });\n\n const actions = yield* Actions;\n const result = yield* actions.dispatch(payload.name, payload.input);\n\n return jsonResponse(200, result);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.succeed(\n jsonResponse(500, {\n error: error instanceof Error ? error.message : String(error),\n }),\n ),\n ),\n );\n\nexport const createActionHttpHandler = () => {\n const handleEffect = createActionHttpHandlerEffect();\n return (runtimeRun: <A>(effect: Effect.Effect<A, unknown, Boundary | Actions>) => Promise<A>) =>\n (request: Request): Promise<Response> => runtimeRun(handleEffect(request));\n};\n\nexport const callActionWire = <Name extends string, Input, Output, E>(\n definition: ActionDefinition<Name, Input, Output, E>,\n options: {\n readonly endpoint: string;\n readonly input: Input;\n readonly fetcher?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n readonly signal?: AbortSignal;\n },\n): Effect.Effect<Output, ActionError<E> | ActionTransportError, Boundary> =>\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const fetcher = options.fetcher ?? fetch;\n\n const encodedInput = yield* boundary.encode({\n source: `action:${definition.name}:client-input`,\n schema: definition.input,\n value: options.input,\n });\n\n const body = JSON.stringify({\n name: definition.name,\n input: encodedInput,\n });\n\n const response = yield* Effect.tryPromise({\n try: () =>\n fetcher(options.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body,\n ...(options.signal !== undefined ? { signal: options.signal } : {}),\n }),\n catch: (cause) => new ActionTransportError(`Failed to call ${definition.name}`, cause),\n });\n\n if (!response.ok) {\n return yield* Effect.fail(\n new ActionTransportError(\n `Action endpoint returned status ${String(response.status)} for ${definition.name}`,\n response.status,\n ),\n );\n }\n\n const rawText = yield* Effect.tryPromise({\n try: () => response.text(),\n catch: (cause) =>\n new ActionTransportError(`Failed to read response for ${definition.name}`, cause),\n });\n\n const wire = yield* boundary.decodeTextJson({\n source: `action:${definition.name}:wire`,\n schema: ActionWireResultSchema,\n text: rawText,\n });\n\n const typedWire = wire as ActionWireResult;\n\n if (typedWire._tag === \"success\") {\n return yield* boundary.decodeUnknown({\n source: `action:${definition.name}:client-output`,\n schema: definition.output,\n value: typedWire.value,\n });\n }\n\n if (typedWire._tag === \"failure\") {\n const decodedError = yield* boundary.decodeUnknown({\n source: `action:${definition.name}:client-error`,\n schema: definition.error,\n value: typedWire.error,\n });\n return yield* Effect.fail(decodedError as E);\n }\n\n return yield* Effect.fail(new ActionTransportError(typedWire.message));\n });\n","import { Layer } from \"effect\";\nimport { type AnyActionDefinition, makeActionsLayer } from \"../actions\";\nimport type { Actions } from \"../actions\";\nimport { BoundaryLive } from \"../boundary\";\nimport type { Boundary } from \"../boundary\";\nimport { makeDataLayer, type QueryRuntimeOptions } from \"../data\";\nimport type { Data } from \"../data\";\nimport {\n makeNavigationLayer,\n type AnyLoaderDefinition,\n type AnyRouteDefinition,\n} from \"../navigation\";\nimport type { Navigation } from \"../navigation\";\nimport { createManagedRuntime, type AppManagedRuntime } from \"./runtime\";\nimport { TelemetryLive, type TelemetryEvent } from \"./telemetry\";\nimport type { Telemetry } from \"./telemetry\";\nimport type { Stream } from \"effect\";\n\nexport interface CreateAppLayerOptions {\n readonly routes: readonly AnyRouteDefinition[];\n readonly actions?: readonly AnyActionDefinition[];\n readonly loaders?: readonly AnyLoaderDefinition[];\n readonly initialHref?: string;\n readonly data?: QueryRuntimeOptions;\n}\n\nexport type AppServices = Boundary | Data | Actions | Navigation | Telemetry;\n\nexport type AppLayer = Layer.Layer<\n AppServices,\n never,\n never\n>;\n\nexport const createAppLayer = (options: CreateAppLayerOptions): AppLayer => {\n const boundaryLayer = BoundaryLive;\n const telemetryLayer = TelemetryLive;\n\n const dataLayer = makeDataLayer(options.data).pipe(\n Layer.provide([boundaryLayer, telemetryLayer]),\n );\n\n const actionsLayer = makeActionsLayer({\n actions: options.actions ?? [],\n }).pipe(Layer.provide([boundaryLayer, telemetryLayer]));\n\n const navigationLayer = makeNavigationLayer({\n routes: options.routes,\n ...(options.loaders !== undefined ? { loaders: options.loaders } : {}),\n ...(options.initialHref !== undefined ? { initialHref: options.initialHref } : {}),\n }).pipe(Layer.provide([boundaryLayer, telemetryLayer]));\n\n return Layer.mergeAll(boundaryLayer, telemetryLayer, dataLayer, actionsLayer, navigationLayer);\n};\n\nexport const createAppRuntime = (options: CreateAppLayerOptions): AppManagedRuntime<AppServices> =>\n createManagedRuntime(createAppLayer(options));\n\nexport interface FrameworkEventStream {\n readonly stream: Stream.Stream<TelemetryEvent>;\n}\n","import { ManagedRuntime, type Runtime } from \"effect\";\nimport type { Layer } from \"effect\";\n\nexport type AppManagedRuntime<R> = ManagedRuntime.ManagedRuntime<R, never>;\n\nexport const createManagedRuntime = <R>(layer: Layer.Layer<R, never, never>): AppManagedRuntime<R> =>\n ManagedRuntime.make(layer);\n\nexport type RuntimeHandle<R> = Runtime.Runtime<R>;\n","import type { AnyActionDefinition } from \"../actions\";\nimport type { AnyLoaderDefinition, AnyRouteDefinition } from \"../navigation\";\nimport type {\n AnyPageDefinition,\n LayoutDefinition,\n MiddlewareDefinition,\n} from \"./contracts\";\n\nexport interface AppManifest {\n readonly pages: readonly AnyPageDefinition[];\n readonly actions?: readonly AnyActionDefinition[];\n readonly layouts?: readonly LayoutDefinition[];\n readonly middleware?: MiddlewareDefinition;\n}\n\nexport const defineManifest = (manifest: AppManifest): AppManifest => manifest;\n\nexport const routesFromManifest = (\n manifest: AppManifest,\n): readonly AnyRouteDefinition[] => manifest.pages.map((page) => page.route);\n\nexport const loadersFromManifest = (\n manifest: AppManifest,\n): readonly AnyLoaderDefinition[] => {\n const pageLoaders = manifest.pages\n .map((page) => page.loader)\n .filter((loader) => loader !== undefined);\n\n const layoutLoaders = (manifest.layouts ?? [])\n .map((layout) => layout.loader)\n .filter((loader) => loader !== undefined);\n\n return [...pageLoaders, ...layoutLoaders];\n};\n","import { createActionHttpHandler, type AnyActionDefinition } from \"../actions\";\nimport { createAppRuntime, type AppServices } from \"../kernel/app\";\nimport type { AppManagedRuntime } from \"../kernel/runtime\";\nimport { matchRoute, parseHref } from \"../navigation/matcher\";\nimport {\n loadersFromManifest,\n routesFromManifest,\n type AppManifest,\n} from \"./manifest\";\nimport { resolveConfig, type EffectReactConfig, type EffectReactResolvedConfig } from \"../config\";\nimport type { AnyPageDefinition } from \"./contracts\";\n\nexport interface CreateAppOptions {\n readonly manifest: AppManifest;\n readonly config?: EffectReactConfig;\n readonly initialHref?: string;\n}\n\nexport interface EffectReactApp {\n readonly manifest: AppManifest;\n readonly config: EffectReactResolvedConfig;\n readonly runtime: AppManagedRuntime<AppServices>;\n readonly actions: readonly AnyActionDefinition[];\n readonly matchPage: (href: string) => AnyPageDefinition | undefined;\n readonly handleActionRequest: (request: Request) => Promise<Response>;\n readonly dispose: () => Promise<void>;\n}\n\nconst createPageMatcher = (pages: readonly AnyPageDefinition[]) => {\n const routes = pages.map((page) => page.route);\n\n return (href: string): AnyPageDefinition | undefined => {\n const parsed = parseHref(href);\n const matched = matchRoute({\n routes,\n pathname: parsed.pathname,\n search: {},\n });\n\n if (matched === null) {\n return undefined;\n }\n\n return pages.find((page) => page.route.id === matched.route.id);\n };\n};\n\nexport const createApp = (options: CreateAppOptions): EffectReactApp => {\n const manifest = options.manifest;\n const routes = routesFromManifest(manifest);\n const loaders = loadersFromManifest(manifest);\n const actions = manifest.actions ?? [];\n\n const runtime = createAppRuntime({\n routes,\n actions,\n loaders,\n ...(options.initialHref !== undefined ? { initialHref: options.initialHref } : {}),\n });\n\n const actionHandlerFactory = createActionHttpHandler();\n const handleActionRequest = actionHandlerFactory((effect) => runtime.runPromise(effect));\n\n return {\n manifest,\n config: resolveConfig(options.config),\n runtime,\n actions,\n matchPage: createPageMatcher(manifest.pages),\n handleActionRequest,\n dispose: () => runtime.dispose(),\n };\n};\n","import type { Duration } from \"effect\";\n\nexport type CacheMode = \"no-store\" | \"force-cache\";\n\nexport interface CachePolicy {\n readonly mode: CacheMode;\n readonly ttl?: Duration.DurationInput;\n readonly tags?: readonly string[];\n readonly key?: string;\n}\n\nexport const cachePolicy = (policy: CachePolicy): CachePolicy => policy;\n\nexport const noStore = (): CachePolicy => ({\n mode: \"no-store\",\n});\n","import type { Effect, Layer } from \"effect\";\nimport type { ComponentType } from \"react\";\nimport type {\n AnyLoaderDefinition,\n AnyRouteDefinition,\n} from \"../navigation\";\nimport type { CachePolicy } from \"./cache\";\n\nexport interface PageDefinition<TRoute extends AnyRouteDefinition = AnyRouteDefinition> {\n readonly id: string;\n readonly route: TRoute;\n readonly loader?: AnyLoaderDefinition;\n readonly cache?: CachePolicy;\n readonly component: ComponentType;\n}\n\nexport type AnyPageDefinition = PageDefinition<AnyRouteDefinition>;\n\nexport interface LayoutDefinition {\n readonly id: string;\n readonly component: ComponentType<{\n readonly children?: unknown;\n }>;\n readonly loader?: AnyLoaderDefinition;\n}\n\nexport interface MiddlewareDefinition<R = never> {\n readonly provide?: Layer.Layer<R, never, never>;\n readonly use: (options: {\n readonly request: Request;\n readonly next: () => Effect.Effect<Response, unknown, R>;\n }) => Effect.Effect<Response, unknown, R>;\n}\n\nexport const definePage = <TRoute extends AnyRouteDefinition>(\n page: PageDefinition<TRoute>,\n): PageDefinition<TRoute> => page;\n\nexport const defineLayout = (layout: LayoutDefinition): LayoutDefinition => layout;\n\nexport const defineMiddleware = <R>(\n middleware: MiddlewareDefinition<R>,\n): MiddlewareDefinition<R> => middleware;\n\nexport type { CachePolicy } from \"./cache\";\n\nexport {\n defineRoute,\n defineLoader,\n type RouteDefinition,\n type LoaderDefinition,\n type AnyRouteDefinition,\n type AnyLoaderDefinition,\n} from \"../navigation\";\n\nexport {\n defineAction,\n type ActionDefinition,\n type AnyActionDefinition,\n} from \"../actions\";\n"],"mappings":"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","names":["Effect","Effect","Layer","Layer"]}
@@ -0,0 +1,68 @@
1
+ // src/boundary/codecs.ts
2
+ import { Cause, Context, Effect, Layer, Schema } from "effect";
3
+
4
+ // src/boundary/errors.ts
5
+ var BoundaryDecodeError = class extends Error {
6
+ constructor(source, messageText, causeValue) {
7
+ super(`Boundary decode failed at ${source}: ${messageText}`);
8
+ this.source = source;
9
+ this.messageText = messageText;
10
+ this.causeValue = causeValue;
11
+ this.name = "BoundaryDecodeError";
12
+ }
13
+ _tag = "BoundaryDecodeError";
14
+ };
15
+ var BoundaryTransportError = class extends Error {
16
+ constructor(source, messageText, causeValue) {
17
+ super(`Boundary transport failed at ${source}: ${messageText}`);
18
+ this.source = source;
19
+ this.messageText = messageText;
20
+ this.causeValue = causeValue;
21
+ this.name = "BoundaryTransportError";
22
+ }
23
+ _tag = "BoundaryTransportError";
24
+ };
25
+ var BoundaryProtocolError = class extends Error {
26
+ constructor(source, messageText) {
27
+ super(`Boundary protocol violation at ${source}: ${messageText}`);
28
+ this.source = source;
29
+ this.messageText = messageText;
30
+ this.name = "BoundaryProtocolError";
31
+ }
32
+ _tag = "BoundaryProtocolError";
33
+ };
34
+
35
+ // src/boundary/codecs.ts
36
+ var Boundary = class extends Context.Tag("EffectReact/Boundary")() {
37
+ };
38
+ var parseErrorMessage = (error) => Cause.pretty(Cause.fail(error)).trim();
39
+ var makeBoundaryService = () => ({
40
+ decodeUnknown: ({ source, schema, value }) => Schema.decodeUnknown(schema)(value).pipe(
41
+ Effect.mapError(
42
+ (error) => new BoundaryDecodeError(source, parseErrorMessage(error), error)
43
+ )
44
+ ),
45
+ decodeTextJson: ({ source, schema, text }) => Effect.gen(function* () {
46
+ const payload = yield* Effect.try({
47
+ try: () => JSON.parse(text),
48
+ catch: (cause) => new BoundaryTransportError(source, "failed to parse JSON payload", cause)
49
+ });
50
+ return yield* Schema.decodeUnknown(schema)(payload).pipe(
51
+ Effect.mapError(
52
+ (error) => new BoundaryDecodeError(source, parseErrorMessage(error), error)
53
+ )
54
+ );
55
+ }),
56
+ encode: ({ source, schema, value }) => Schema.encode(schema)(value).pipe(
57
+ Effect.mapError((error) => new BoundaryProtocolError(source, parseErrorMessage(error)))
58
+ )
59
+ });
60
+ var BoundaryLive = Layer.succeed(Boundary, makeBoundaryService());
61
+
62
+ export {
63
+ BoundaryDecodeError,
64
+ BoundaryProtocolError,
65
+ Boundary,
66
+ BoundaryLive
67
+ };
68
+ //# sourceMappingURL=chunk-YG22YP5K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/boundary/codecs.ts","../src/boundary/errors.ts"],"sourcesContent":["import { Cause, Context, Effect, Layer, Schema } from \"effect\";\nimport type { ParseResult } from \"effect\";\nimport {\n BoundaryDecodeError,\n BoundaryProtocolError,\n BoundaryTransportError,\n type BoundaryError,\n} from \"./errors\";\n\nexport interface BoundaryService {\n readonly decodeUnknown: <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly value: unknown;\n }) => Effect.Effect<A, BoundaryDecodeError, never>;\n readonly decodeTextJson: <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly text: string;\n }) => Effect.Effect<A, BoundaryError, never>;\n readonly encode: <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly value: A;\n }) => Effect.Effect<I, BoundaryError, never>;\n}\n\nexport class Boundary extends Context.Tag(\"EffectReact/Boundary\")<Boundary, BoundaryService>() {}\n\nconst parseErrorMessage = (error: ParseResult.ParseError): string =>\n Cause.pretty(Cause.fail(error)).trim();\n\nexport const makeBoundaryService = (): BoundaryService => ({\n decodeUnknown: ({ source, schema, value }) =>\n Schema.decodeUnknown(schema)(value).pipe(\n Effect.mapError(\n (error) => new BoundaryDecodeError(source, parseErrorMessage(error), error),\n ),\n ),\n decodeTextJson: ({ source, schema, text }) =>\n Effect.gen(function* () {\n const payload = yield* Effect.try({\n try: () => JSON.parse(text) as unknown,\n catch: (cause) =>\n new BoundaryTransportError(source, \"failed to parse JSON payload\", cause),\n });\n\n return yield* Schema.decodeUnknown(schema)(payload).pipe(\n Effect.mapError(\n (error) => new BoundaryDecodeError(source, parseErrorMessage(error), error),\n ),\n );\n }),\n encode: ({ source, schema, value }) =>\n Schema.encode(schema)(value).pipe(\n Effect.mapError((error) => new BoundaryProtocolError(source, parseErrorMessage(error))),\n ),\n});\n\nexport const BoundaryLive = Layer.succeed(Boundary, makeBoundaryService());\n\nexport const decodeUnknown = <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly value: unknown;\n}): Effect.Effect<A, BoundaryDecodeError, Boundary> =>\n Effect.flatMap(Boundary, (service) => service.decodeUnknown(options));\n\nexport const decodeTextJson = <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly text: string;\n}): Effect.Effect<A, BoundaryError, Boundary> =>\n Effect.flatMap(Boundary, (service) => service.decodeTextJson(options));\n\nexport const encode = <A, I>(options: {\n readonly source: string;\n readonly schema: Schema.Schema<A, I, never>;\n readonly value: A;\n}): Effect.Effect<I, BoundaryError, Boundary> =>\n Effect.flatMap(Boundary, (service) => service.encode(options));\n","import type { ParseResult } from \"effect\";\n\nexport class BoundaryDecodeError extends Error {\n readonly _tag = \"BoundaryDecodeError\" as const;\n\n constructor(\n readonly source: string,\n readonly messageText: string,\n readonly causeValue?: ParseResult.ParseError,\n ) {\n super(`Boundary decode failed at ${source}: ${messageText}`);\n this.name = \"BoundaryDecodeError\";\n }\n}\n\nexport class BoundaryTransportError extends Error {\n readonly _tag = \"BoundaryTransportError\" as const;\n\n constructor(\n readonly source: string,\n readonly messageText: string,\n readonly causeValue?: unknown,\n ) {\n super(`Boundary transport failed at ${source}: ${messageText}`);\n this.name = \"BoundaryTransportError\";\n }\n}\n\nexport class BoundaryProtocolError extends Error {\n readonly _tag = \"BoundaryProtocolError\" as const;\n\n constructor(\n readonly source: string,\n readonly messageText: string,\n ) {\n super(`Boundary protocol violation at ${source}: ${messageText}`);\n this.name = \"BoundaryProtocolError\";\n }\n}\n\nexport type BoundaryError = BoundaryDecodeError | BoundaryTransportError | BoundaryProtocolError;\n"],"mappings":";AAAA,SAAS,OAAO,SAAS,QAAQ,OAAO,cAAc;;;ACE/C,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAG7C,YACW,QACA,aACA,YACT;AACA,UAAM,6BAA6B,MAAM,KAAK,WAAW,EAAE;AAJlD;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EATS,OAAO;AAUlB;AAEO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAGhD,YACW,QACA,aACA,YACT;AACA,UAAM,gCAAgC,MAAM,KAAK,WAAW,EAAE;AAJrD;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EATS,OAAO;AAUlB;AAEO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAG/C,YACW,QACA,aACT;AACA,UAAM,kCAAkC,MAAM,KAAK,WAAW,EAAE;AAHvD;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EARS,OAAO;AASlB;;;ADXO,IAAM,WAAN,cAAuB,QAAQ,IAAI,sBAAsB,EAA6B,EAAE;AAAC;AAEhG,IAAM,oBAAoB,CAAC,UACzB,MAAM,OAAO,MAAM,KAAK,KAAK,CAAC,EAAE,KAAK;AAEhC,IAAM,sBAAsB,OAAwB;AAAA,EACzD,eAAe,CAAC,EAAE,QAAQ,QAAQ,MAAM,MACtC,OAAO,cAAc,MAAM,EAAE,KAAK,EAAE;AAAA,IAClC,OAAO;AAAA,MACL,CAAC,UAAU,IAAI,oBAAoB,QAAQ,kBAAkB,KAAK,GAAG,KAAK;AAAA,IAC5E;AAAA,EACF;AAAA,EACF,gBAAgB,CAAC,EAAE,QAAQ,QAAQ,KAAK,MACtC,OAAO,IAAI,aAAa;AACtB,UAAM,UAAU,OAAO,OAAO,IAAI;AAAA,MAChC,KAAK,MAAM,KAAK,MAAM,IAAI;AAAA,MAC1B,OAAO,CAAC,UACN,IAAI,uBAAuB,QAAQ,gCAAgC,KAAK;AAAA,IAC5E,CAAC;AAED,WAAO,OAAO,OAAO,cAAc,MAAM,EAAE,OAAO,EAAE;AAAA,MAClD,OAAO;AAAA,QACL,CAAC,UAAU,IAAI,oBAAoB,QAAQ,kBAAkB,KAAK,GAAG,KAAK;AAAA,MAC5E;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EACH,QAAQ,CAAC,EAAE,QAAQ,QAAQ,MAAM,MAC/B,OAAO,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,IAC3B,OAAO,SAAS,CAAC,UAAU,IAAI,sBAAsB,QAAQ,kBAAkB,KAAK,CAAC,CAAC;AAAA,EACxF;AACJ;AAEO,IAAM,eAAe,MAAM,QAAQ,UAAU,oBAAoB,CAAC;","names":[]}