effective-rsc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/LLMS.md +382 -0
  3. package/README.md +235 -0
  4. package/bin/ersc.js +3 -0
  5. package/dist/application/component.d.ts +15 -0
  6. package/dist/application/component.js +20 -0
  7. package/dist/application/component.js.map +1 -0
  8. package/dist/application/definition.d.ts +31 -0
  9. package/dist/application/definition.js +57 -0
  10. package/dist/application/definition.js.map +1 -0
  11. package/dist/application/ersc-identity.d.ts +25 -0
  12. package/dist/application/ersc-identity.js +23 -0
  13. package/dist/application/ersc-identity.js.map +1 -0
  14. package/dist/application/ersc.d.ts +28 -0
  15. package/dist/application/ersc.js +72 -0
  16. package/dist/application/ersc.js.map +1 -0
  17. package/dist/application/layout.d.ts +18 -0
  18. package/dist/application/layout.js +17 -0
  19. package/dist/application/layout.js.map +1 -0
  20. package/dist/application/loading.d.ts +17 -0
  21. package/dist/application/loading.js +14 -0
  22. package/dist/application/loading.js.map +1 -0
  23. package/dist/application/middleware.d.ts +36 -0
  24. package/dist/application/middleware.js +46 -0
  25. package/dist/application/middleware.js.map +1 -0
  26. package/dist/application/page.d.ts +58 -0
  27. package/dist/application/page.js +50 -0
  28. package/dist/application/page.js.map +1 -0
  29. package/dist/application/render-runtime.d.ts +9 -0
  30. package/dist/application/render-runtime.js +28 -0
  31. package/dist/application/render-runtime.js.map +1 -0
  32. package/dist/application/route-graph.d.ts +22 -0
  33. package/dist/application/route-graph.js +68 -0
  34. package/dist/application/route-graph.js.map +1 -0
  35. package/dist/application/route-path.d.ts +31 -0
  36. package/dist/application/route-path.js +67 -0
  37. package/dist/application/route-path.js.map +1 -0
  38. package/dist/application/routes.d.ts +66 -0
  39. package/dist/application/routes.js +159 -0
  40. package/dist/application/routes.js.map +1 -0
  41. package/dist/application/server-fn.d.ts +30 -0
  42. package/dist/application/server-fn.js +58 -0
  43. package/dist/application/server-fn.js.map +1 -0
  44. package/dist/build/build.d.ts +26 -0
  45. package/dist/build/build.js +59 -0
  46. package/dist/build/build.js.map +1 -0
  47. package/dist/build/compiled-server.d.ts +53 -0
  48. package/dist/build/compiled-server.js +77 -0
  49. package/dist/build/compiled-server.js.map +1 -0
  50. package/dist/build/contract.d.ts +23 -0
  51. package/dist/build/contract.js +41 -0
  52. package/dist/build/contract.js.map +1 -0
  53. package/dist/build/dev-channel.d.ts +20 -0
  54. package/dist/build/dev-channel.js +71 -0
  55. package/dist/build/dev-channel.js.map +1 -0
  56. package/dist/build/dev.d.ts +41 -0
  57. package/dist/build/dev.js +186 -0
  58. package/dist/build/dev.js.map +1 -0
  59. package/dist/build/rsc-entry.d.ts +4 -0
  60. package/dist/build/rsc-entry.js +17 -0
  61. package/dist/build/rsc-entry.js.map +1 -0
  62. package/dist/build/rspack-config.d.ts +17 -0
  63. package/dist/build/rspack-config.js +259 -0
  64. package/dist/build/rspack-config.js.map +1 -0
  65. package/dist/build/rspack.d.ts +45 -0
  66. package/dist/build/rspack.js +231 -0
  67. package/dist/build/rspack.js.map +1 -0
  68. package/dist/build/terminal.d.ts +9 -0
  69. package/dist/build/terminal.js +17 -0
  70. package/dist/build/terminal.js.map +1 -0
  71. package/dist/cli.d.ts +14 -0
  72. package/dist/cli.js +116 -0
  73. package/dist/cli.js.map +1 -0
  74. package/dist/client/application.d.ts +2 -0
  75. package/dist/client/application.js +73 -0
  76. package/dist/client/application.js.map +1 -0
  77. package/dist/client/browser-capabilities.d.ts +9 -0
  78. package/dist/client/browser-capabilities.js +20 -0
  79. package/dist/client/browser-capabilities.js.map +1 -0
  80. package/dist/client/browser-effect-runner.d.ts +13 -0
  81. package/dist/client/browser-effect-runner.js +13 -0
  82. package/dist/client/browser-effect-runner.js.map +1 -0
  83. package/dist/client/browser-renderer.d.ts +70 -0
  84. package/dist/client/browser-renderer.js +159 -0
  85. package/dist/client/browser-renderer.js.map +1 -0
  86. package/dist/client/browser-screen.d.ts +2 -0
  87. package/dist/client/browser-screen.js +215 -0
  88. package/dist/client/browser-screen.js.map +1 -0
  89. package/dist/client/call-server.d.ts +8 -0
  90. package/dist/client/call-server.js +151 -0
  91. package/dist/client/call-server.js.map +1 -0
  92. package/dist/client/client-router.d.ts +6 -0
  93. package/dist/client/client-router.js +588 -0
  94. package/dist/client/client-router.js.map +1 -0
  95. package/dist/client/entry.d.ts +1 -0
  96. package/dist/client/entry.js +12 -0
  97. package/dist/client/entry.js.map +1 -0
  98. package/dist/client/flight-client.d.ts +83 -0
  99. package/dist/client/flight-client.js +146 -0
  100. package/dist/client/flight-client.js.map +1 -0
  101. package/dist/client/initial-flight-stream.d.ts +18 -0
  102. package/dist/client/initial-flight-stream.js +60 -0
  103. package/dist/client/initial-flight-stream.js.map +1 -0
  104. package/dist/client/navigation-api.d.ts +34 -0
  105. package/dist/client/navigation-api.js +25 -0
  106. package/dist/client/navigation-api.js.map +1 -0
  107. package/dist/client/navigation-routing.d.ts +3 -0
  108. package/dist/client/navigation-routing.js +8 -0
  109. package/dist/client/navigation-routing.js.map +1 -0
  110. package/dist/client/react-dom-renderer.d.ts +20 -0
  111. package/dist/client/react-dom-renderer.js +101 -0
  112. package/dist/client/react-dom-renderer.js.map +1 -0
  113. package/dist/client/route-loader.d.ts +81 -0
  114. package/dist/client/route-loader.js +128 -0
  115. package/dist/client/route-loader.js.map +1 -0
  116. package/dist/client/route-refresh.d.ts +31 -0
  117. package/dist/client/route-refresh.js +132 -0
  118. package/dist/client/route-refresh.js.map +1 -0
  119. package/dist/client/route-tree.d.ts +7 -0
  120. package/dist/client/route-tree.js +34 -0
  121. package/dist/client/route-tree.js.map +1 -0
  122. package/dist/dev/channel.d.ts +18 -0
  123. package/dist/dev/channel.js +30 -0
  124. package/dist/dev/channel.js.map +1 -0
  125. package/dist/dev/client.d.ts +3 -0
  126. package/dist/dev/client.js +132 -0
  127. package/dist/dev/client.js.map +1 -0
  128. package/dist/dev/hmr-update.d.ts +20 -0
  129. package/dist/dev/hmr-update.js +28 -0
  130. package/dist/dev/hmr-update.js.map +1 -0
  131. package/dist/dev/panel.d.ts +41 -0
  132. package/dist/dev/panel.js +9946 -0
  133. package/dist/dev/panel.js.map +1 -0
  134. package/dist/dev/runtime-failure.d.ts +11 -0
  135. package/dist/dev/runtime-failure.js +32 -0
  136. package/dist/dev/runtime-failure.js.map +1 -0
  137. package/dist/index.d.ts +1 -0
  138. package/dist/index.js +6 -0
  139. package/dist/index.js.map +1 -0
  140. package/dist/rsc/flight.d.ts +16 -0
  141. package/dist/rsc/flight.js +6 -0
  142. package/dist/rsc/flight.js.map +1 -0
  143. package/dist/rsc/render-route-tree.d.ts +11 -0
  144. package/dist/rsc/render-route-tree.js +52 -0
  145. package/dist/rsc/render-route-tree.js.map +1 -0
  146. package/dist/rsc/route-tree.d.ts +6 -0
  147. package/dist/rsc/route-tree.js +5 -0
  148. package/dist/rsc/route-tree.js.map +1 -0
  149. package/dist/server/application.d.ts +17 -0
  150. package/dist/server/application.js +178 -0
  151. package/dist/server/application.js.map +1 -0
  152. package/dist/server/flight-html-stream.d.ts +19 -0
  153. package/dist/server/flight-html-stream.js +193 -0
  154. package/dist/server/flight-html-stream.js.map +1 -0
  155. package/dist/server/flight-renderer.d.ts +31 -0
  156. package/dist/server/flight-renderer.js +47 -0
  157. package/dist/server/flight-renderer.js.map +1 -0
  158. package/dist/server/html-renderer.d.ts +28 -0
  159. package/dist/server/html-renderer.js +82 -0
  160. package/dist/server/html-renderer.js.map +1 -0
  161. package/dist/server/request-outcome.d.ts +8 -0
  162. package/dist/server/request-outcome.js +5 -0
  163. package/dist/server/request-outcome.js.map +1 -0
  164. package/dist/server/server-config.d.ts +17 -0
  165. package/dist/server/server-config.js +18 -0
  166. package/dist/server/server-config.js.map +1 -0
  167. package/dist/server/server-fn-outcome.d.ts +13 -0
  168. package/dist/server/server-fn-outcome.js +24 -0
  169. package/dist/server/server-fn-outcome.js.map +1 -0
  170. package/dist/server/server-fn-request.d.ts +24 -0
  171. package/dist/server/server-fn-request.js +160 -0
  172. package/dist/server/server-fn-request.js.map +1 -0
  173. package/dist/unsupported.d.ts +0 -0
  174. package/dist/unsupported.js +5 -0
  175. package/dist/unsupported.js.map +1 -0
  176. package/docs/01-getting-started/01_first-application.tsx +26 -0
  177. package/docs/01-getting-started/20_styling.tsx +6 -0
  178. package/docs/01-getting-started/index.md +27 -0
  179. package/docs/01-getting-started/styles.css +1 -0
  180. package/docs/02-guides/01-server-functions/10_ersc.ts +6 -0
  181. package/docs/02-guides/01-server-functions/20_follow-author.ts +15 -0
  182. package/docs/02-guides/01-server-functions/30_follow-author-button.tsx +19 -0
  183. package/docs/02-guides/01-server-functions/40_application.tsx +30 -0
  184. package/docs/02-guides/01-server-functions/index.md +19 -0
  185. package/docs/02-guides/02-services/10_catalog.ts +22 -0
  186. package/docs/02-guides/02-services/20_application.tsx +44 -0
  187. package/docs/02-guides/02-services/index.md +17 -0
  188. package/docs/02-guides/03-routing/10_ersc.ts +6 -0
  189. package/docs/02-guides/03-routing/10_layouts.tsx +36 -0
  190. package/docs/02-guides/03-routing/20_pages.tsx +23 -0
  191. package/docs/02-guides/03-routing/30_routes.tsx +17 -0
  192. package/docs/02-guides/03-routing/40_application.ts +7 -0
  193. package/docs/02-guides/03-routing/index.md +22 -0
  194. package/docs/02-guides/04-middleware/10_auth.ts +27 -0
  195. package/docs/02-guides/04-middleware/20_account-page.tsx +13 -0
  196. package/docs/02-guides/04-middleware/30_update-profile.ts +16 -0
  197. package/docs/02-guides/04-middleware/40_application.tsx +20 -0
  198. package/docs/02-guides/04-middleware/index.md +25 -0
  199. package/docs/02-guides/05-http/10_application-layer.tsx +60 -0
  200. package/docs/02-guides/05-http/index.md +23 -0
  201. package/docs/02-guides/index.md +11 -0
  202. package/docs/03-advanced/01-request-runtime-and-lifetimes/index.md +13 -0
  203. package/docs/03-advanced/02-client-navigation/index.md +61 -0
  204. package/docs/03-advanced/03-server-function-execution-and-refresh/index.md +17 -0
  205. package/docs/03-advanced/index.md +11 -0
  206. package/docs/04-api-reference/01-application/index.md +8 -0
  207. package/docs/04-api-reference/02-page/index.md +12 -0
  208. package/docs/04-api-reference/03-layout/index.md +4 -0
  209. package/docs/04-api-reference/04-loading/index.md +4 -0
  210. package/docs/04-api-reference/05-component/10_component.tsx +18 -0
  211. package/docs/04-api-reference/05-component/index.md +10 -0
  212. package/docs/04-api-reference/06-middleware/index.md +33 -0
  213. package/docs/04-api-reference/07-routes/index.md +20 -0
  214. package/docs/04-api-reference/08-server-fn/index.md +43 -0
  215. package/docs/04-api-reference/index.md +17 -0
  216. package/docs/environment.d.ts +1 -0
  217. package/docs/index.md +15 -0
  218. package/logo-dark.svg +6 -0
  219. package/logo.svg +6 -0
  220. package/package.json +87 -0
@@ -0,0 +1,231 @@
1
+ import core from "@rspack/core";
2
+ import { Context, Effect, Layer, Queue, Schema, Stream } from "effect";
3
+ import { ServerEntryName } from "./contract.js";
4
+ import { Terminal, formatDuration } from "./terminal.js";
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ class RspackError extends Schema.TaggedError()('RspackError', {
15
+ message: Schema.String,
16
+ cause: Schema.Defect(),
17
+ reason: Schema.Literals([
18
+ 'CreateFailed',
19
+ 'CompileFailed',
20
+ 'BuildFailed',
21
+ 'CloseFailed'
22
+ ])
23
+ }) {
24
+ }
25
+ const failureMessage = (message)=>`${Terminal.red('✗')} ${message}`;
26
+ const buildDuration = (stats)=>{
27
+ const compilations = stats.stats;
28
+ const starts = compilations.flatMap(({ startTime })=>startTime === undefined ? [] : [
29
+ startTime
30
+ ]);
31
+ const ends = compilations.flatMap(({ endTime })=>endTime === undefined ? [] : [
32
+ endTime
33
+ ]);
34
+ if (starts.length !== compilations.length || ends.length !== compilations.length) {
35
+ return undefined;
36
+ }
37
+ return Math.max(...ends) - Math.min(...starts);
38
+ };
39
+ const compilerSummary = (stats)=>{
40
+ const { endTime, startTime } = stats;
41
+ return {
42
+ ...startTime !== undefined && endTime !== undefined ? {
43
+ duration: endTime - startTime
44
+ } : {},
45
+ name: stats.compilation.name ?? 'compiler'
46
+ };
47
+ };
48
+ const closeCompiler = Effect.fnUntraced(function*(compiler) {
49
+ yield* Effect.callback((resume)=>{
50
+ compiler.close((cause)=>{
51
+ resume(cause ? Effect.fail(new RspackError({
52
+ message: failureMessage('Rspack failed to close the compiler.'),
53
+ cause,
54
+ reason: 'CloseFailed'
55
+ })) : Effect["void"]);
56
+ });
57
+ });
58
+ });
59
+ const closeWatching = Effect.fnUntraced(function*(watching) {
60
+ yield* Effect.callback((resume)=>{
61
+ watching.close((cause)=>{
62
+ resume(cause ? Effect.fail(new RspackError({
63
+ message: failureMessage('Rspack failed to stop watching the application.'),
64
+ cause,
65
+ reason: 'CloseFailed'
66
+ })) : Effect["void"]);
67
+ });
68
+ });
69
+ });
70
+ const acquireCompiler = (configs)=>Effect.acquireRelease(Effect["try"]({
71
+ try: ()=>core([
72
+ ...configs
73
+ ]),
74
+ catch: (cause)=>new RspackError({
75
+ message: failureMessage('Rspack failed to create the application compiler.'),
76
+ cause,
77
+ reason: 'CreateFailed'
78
+ })
79
+ }), (compiler)=>closeCompiler(compiler).pipe(Effect.orDie));
80
+ const compilationError = (cause)=>new RspackError({
81
+ message: failureMessage('Rspack failed while compiling the application.'),
82
+ cause,
83
+ reason: 'CompileFailed'
84
+ });
85
+ const missingStatsError = ()=>new RspackError({
86
+ message: failureMessage('Rspack completed without returning compilation statistics.'),
87
+ cause: new Error('Missing Rspack compilation statistics.'),
88
+ reason: 'CompileFailed'
89
+ });
90
+ const statsDiagnostics = (stats, colors = true)=>stats.toString({
91
+ colors,
92
+ preset: 'errors-warnings'
93
+ });
94
+ const failedWatchEvent = (error, diagnostics = Bun.stripANSI(error.message))=>({
95
+ _tag: 'Failed',
96
+ diagnostics,
97
+ error
98
+ });
99
+ const failedStatsError = (diagnostics)=>new RspackError({
100
+ message: failureMessage('Rspack compiled the application with errors.'),
101
+ cause: new Error(diagnostics),
102
+ reason: 'BuildFailed'
103
+ });
104
+ const emittedServerBundle = (stats)=>{
105
+ const serverStats = stats.stats.find(({ compilation })=>compilation.name === 'server');
106
+ const output = serverStats?.toJson({
107
+ all: false,
108
+ chunks: true,
109
+ entrypoints: true,
110
+ ids: true,
111
+ outputPath: true
112
+ });
113
+ const entryChunkIds = output?.entrypoints?.[ServerEntryName]?.chunks ?? [];
114
+ const filenames = output?.chunks?.flatMap((chunk)=>chunk.entry && chunk.id !== undefined && entryChunkIds.includes(chunk.id) ? (chunk.files ?? []).filter((filename)=>filename.endsWith('.js')) : []) ?? [];
115
+ const filename = filenames[0];
116
+ return output?.outputPath && filename !== undefined && filenames.length === 1 ? {
117
+ filename,
118
+ outputPath: output.outputPath
119
+ } : undefined;
120
+ };
121
+ const missingServerBundleError = ()=>new RspackError({
122
+ message: failureMessage('Rspack did not emit exactly one server entry bundle.'),
123
+ cause: new Error('Missing or ambiguous server entry bundle in Rspack compilation statistics.'),
124
+ reason: 'BuildFailed'
125
+ });
126
+ const missingClientHashError = ()=>new RspackError({
127
+ message: failureMessage('Rspack did not emit a client compilation hash.'),
128
+ cause: new Error('Missing client compilation hash in Rspack statistics.'),
129
+ reason: 'BuildFailed'
130
+ });
131
+ const clientCompilationHash = (stats)=>stats.stats.find(({ compilation })=>compilation.name === 'client')?.hash;
132
+ const watchEvent = (cause, stats)=>{
133
+ if (cause) {
134
+ return failedWatchEvent(compilationError(cause), Bun.stripANSI(cause.stack ?? cause.message));
135
+ }
136
+ if (!stats) {
137
+ return failedWatchEvent(missingStatsError());
138
+ }
139
+ if (stats.hasErrors()) {
140
+ return failedWatchEvent(failedStatsError(statsDiagnostics(stats)), statsDiagnostics(stats, false));
141
+ }
142
+ const serverBundle = emittedServerBundle(stats);
143
+ if (!serverBundle) {
144
+ return failedWatchEvent(missingServerBundleError());
145
+ }
146
+ const clientHash = clientCompilationHash(stats);
147
+ if (typeof clientHash !== 'string') {
148
+ return failedWatchEvent(missingClientHashError());
149
+ }
150
+ const duration = buildDuration(stats);
151
+ return {
152
+ _tag: 'Compiled',
153
+ clientHash,
154
+ compilers: stats.stats.map(compilerSummary),
155
+ ...duration === undefined ? {} : {
156
+ duration
157
+ },
158
+ hash: stats.hash,
159
+ serverBundle,
160
+ ...stats.hasWarnings() ? {
161
+ warnings: statsDiagnostics(stats)
162
+ } : {}
163
+ };
164
+ };
165
+ const runCompiler = Effect.fnUntraced(function*(compiler) {
166
+ return yield* Effect.callback((resume)=>{
167
+ compiler.run((cause, stats)=>{
168
+ if (cause) {
169
+ resume(Effect.fail(compilationError(cause)));
170
+ return;
171
+ }
172
+ if (!stats) {
173
+ resume(Effect.fail(missingStatsError()));
174
+ return;
175
+ }
176
+ resume(Effect.succeed(stats));
177
+ });
178
+ });
179
+ });
180
+ const reportStats = Effect.fnUntraced(function*(stats) {
181
+ if (stats.hasErrors()) {
182
+ return yield* failedStatsError(statsDiagnostics(stats));
183
+ }
184
+ if (stats.hasWarnings()) {
185
+ yield* Effect.logWarning(`${Terminal.yellow('▲')} Rspack compiled the application with warnings.\n${statsDiagnostics(stats)}`);
186
+ }
187
+ const duration = buildDuration(stats);
188
+ yield* Effect.logInfo(duration === undefined ? `${Terminal.green('✓')} Build finished successfully.` : `${Terminal.green('✓')} Build finished successfully in ${formatDuration(duration)}.`);
189
+ });
190
+ const watchCompiler = (configs)=>Stream.callback((queue)=>Effect.gen(function*() {
191
+ const compiler = yield* acquireCompiler(configs);
192
+ // The RSC client plugin mutates its own ignored predicate during watch setup.
193
+ const watchOptions = configs.map(()=>({}));
194
+ let watchState = 'Idle';
195
+ compiler.hooks.watchRun.tap({
196
+ name: 'ersc:watch-state',
197
+ stage: -10000
198
+ }, (childCompiler)=>{
199
+ if (watchState === 'Idle') {
200
+ watchState = 'Building';
201
+ Queue.offerUnsafe(queue, {
202
+ _tag: 'Building',
203
+ changedFiles: Array.from(childCompiler.modifiedFiles ?? [])
204
+ });
205
+ }
206
+ });
207
+ yield* Effect.acquireRelease(Effect["try"]({
208
+ try: ()=>compiler.watch(watchOptions, (cause, stats)=>{
209
+ watchState = 'Idle';
210
+ Queue.offerUnsafe(queue, watchEvent(cause, stats));
211
+ }),
212
+ catch: (cause)=>compilationError(cause)
213
+ }), (watching)=>closeWatching(watching).pipe(Effect.orDie));
214
+ }));
215
+ class Rspack extends Context.Service()('ersc/build/Rspack', {
216
+ make: Effect.succeed({
217
+ build: Effect.fn('Rspack.build')(function*(configs) {
218
+ yield* Effect.logInfo(`${Terminal.cyan('●')} Building application with Rspack...`);
219
+ const compiler = yield* acquireCompiler(configs);
220
+ const stats = yield* runCompiler(compiler);
221
+ yield* reportStats(stats);
222
+ }),
223
+ watch: watchCompiler
224
+ })
225
+ }) {
226
+ static layer = Layer.effect(this, this.make);
227
+ }
228
+
229
+ export { Rspack, RspackError };
230
+
231
+ //# sourceMappingURL=rspack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build/rspack.js","sources":["../../src/build/rspack.ts"],"sourcesContent":["import rspack, {\n type Compiler,\n type Configuration,\n type MultiCompiler,\n type MultiStats,\n type Stats,\n} from '@rspack/core';\nimport { Context, Effect, Layer, Queue, Schema, Stream } from 'effect';\n\nimport { ServerEntryName } from './contract';\nimport { formatDuration, Terminal } from './terminal';\n\nexport class RspackError extends Schema.TaggedError<RspackError>()('RspackError', {\n message: Schema.String,\n cause: Schema.Defect(),\n reason: Schema.Literals(['CreateFailed', 'CompileFailed', 'BuildFailed', 'CloseFailed']),\n}) {}\n\ntype RspackCompiler = MultiCompiler;\ntype RspackStats = MultiStats;\ntype RspackWatching = ReturnType<RspackCompiler['watch']>;\n\nexport type RspackWatchEvent =\n | {\n readonly _tag: 'Building';\n readonly changedFiles: ReadonlyArray<string>;\n }\n | {\n readonly _tag: 'Compiled';\n readonly clientHash: string;\n readonly compilers: ReadonlyArray<{\n readonly duration?: number;\n readonly name: string;\n }>;\n readonly duration?: number;\n readonly hash: string;\n readonly serverBundle: {\n readonly filename: string;\n readonly outputPath: string;\n };\n readonly warnings?: string;\n }\n | {\n readonly _tag: 'Failed';\n readonly diagnostics: string;\n readonly error: RspackError;\n };\n\nconst failureMessage = (message: string) => `${Terminal.red('✗')} ${message}`;\n\nconst buildDuration = (stats: RspackStats) => {\n const compilations = stats.stats;\n const starts = compilations.flatMap(({ startTime }) =>\n startTime === undefined ? [] : [startTime],\n );\n const ends = compilations.flatMap(({ endTime }) => (endTime === undefined ? [] : [endTime]));\n\n if (starts.length !== compilations.length || ends.length !== compilations.length) {\n return undefined;\n }\n\n return Math.max(...ends) - Math.min(...starts);\n};\n\nconst compilerSummary = (stats: Stats) => {\n const { endTime, startTime } = stats;\n\n return {\n ...(startTime !== undefined && endTime !== undefined ? { duration: endTime - startTime } : {}),\n name: stats.compilation.name ?? 'compiler',\n };\n};\n\nconst closeCompiler = Effect.fnUntraced(function* (compiler: RspackCompiler) {\n yield* Effect.callback<void, RspackError>((resume) => {\n compiler.close((cause) => {\n resume(\n cause\n ? Effect.fail(\n new RspackError({\n message: failureMessage('Rspack failed to close the compiler.'),\n cause,\n reason: 'CloseFailed',\n }),\n )\n : Effect.void,\n );\n });\n });\n});\n\nconst closeWatching = Effect.fnUntraced(function* (watching: RspackWatching) {\n yield* Effect.callback<void, RspackError>((resume) => {\n watching.close((cause) => {\n resume(\n cause\n ? Effect.fail(\n new RspackError({\n message: failureMessage('Rspack failed to stop watching the application.'),\n cause,\n reason: 'CloseFailed',\n }),\n )\n : Effect.void,\n );\n });\n });\n});\n\nconst acquireCompiler = (configs: ReadonlyArray<Configuration>) =>\n Effect.acquireRelease(\n Effect.try({\n try: () => rspack([...configs]),\n catch: (cause) =>\n new RspackError({\n message: failureMessage('Rspack failed to create the application compiler.'),\n cause,\n reason: 'CreateFailed',\n }),\n }),\n (compiler) => closeCompiler(compiler).pipe(Effect.orDie),\n );\n\nconst compilationError = (cause: unknown) =>\n new RspackError({\n message: failureMessage('Rspack failed while compiling the application.'),\n cause,\n reason: 'CompileFailed',\n });\n\nconst missingStatsError = () =>\n new RspackError({\n message: failureMessage('Rspack completed without returning compilation statistics.'),\n cause: new Error('Missing Rspack compilation statistics.'),\n reason: 'CompileFailed',\n });\n\nconst statsDiagnostics = (stats: RspackStats, colors = true) =>\n stats.toString({\n colors,\n preset: 'errors-warnings',\n });\n\nconst failedWatchEvent = (\n error: RspackError,\n diagnostics = Bun.stripANSI(error.message),\n): RspackWatchEvent => ({\n _tag: 'Failed',\n diagnostics,\n error,\n});\n\nconst failedStatsError = (diagnostics: string) =>\n new RspackError({\n message: failureMessage('Rspack compiled the application with errors.'),\n cause: new Error(diagnostics),\n reason: 'BuildFailed',\n });\n\nconst emittedServerBundle = (stats: RspackStats) => {\n const serverStats = stats.stats.find(({ compilation }) => compilation.name === 'server');\n const output = serverStats?.toJson({\n all: false,\n chunks: true,\n entrypoints: true,\n ids: true,\n outputPath: true,\n });\n const entryChunkIds = output?.entrypoints?.[ServerEntryName]?.chunks ?? [];\n const filenames =\n output?.chunks?.flatMap((chunk) =>\n chunk.entry && chunk.id !== undefined && entryChunkIds.includes(chunk.id)\n ? (chunk.files ?? []).filter((filename) => filename.endsWith('.js'))\n : [],\n ) ?? [];\n const filename = filenames[0];\n\n return output?.outputPath && filename !== undefined && filenames.length === 1\n ? { filename, outputPath: output.outputPath }\n : undefined;\n};\n\nconst missingServerBundleError = () =>\n new RspackError({\n message: failureMessage('Rspack did not emit exactly one server entry bundle.'),\n cause: new Error('Missing or ambiguous server entry bundle in Rspack compilation statistics.'),\n reason: 'BuildFailed',\n });\n\nconst missingClientHashError = () =>\n new RspackError({\n message: failureMessage('Rspack did not emit a client compilation hash.'),\n cause: new Error('Missing client compilation hash in Rspack statistics.'),\n reason: 'BuildFailed',\n });\n\nconst clientCompilationHash = (stats: RspackStats) =>\n stats.stats.find(({ compilation }) => compilation.name === 'client')?.hash;\n\nconst watchEvent = (cause: Error | null, stats?: RspackStats): RspackWatchEvent => {\n if (cause) {\n return failedWatchEvent(compilationError(cause), Bun.stripANSI(cause.stack ?? cause.message));\n }\n if (!stats) {\n return failedWatchEvent(missingStatsError());\n }\n if (stats.hasErrors()) {\n return failedWatchEvent(\n failedStatsError(statsDiagnostics(stats)),\n statsDiagnostics(stats, false),\n );\n }\n const serverBundle = emittedServerBundle(stats);\n if (!serverBundle) {\n return failedWatchEvent(missingServerBundleError());\n }\n const clientHash = clientCompilationHash(stats);\n if (typeof clientHash !== 'string') {\n return failedWatchEvent(missingClientHashError());\n }\n const duration = buildDuration(stats);\n\n return {\n _tag: 'Compiled',\n clientHash,\n compilers: stats.stats.map(compilerSummary),\n ...(duration === undefined ? {} : { duration }),\n hash: stats.hash,\n serverBundle,\n ...(stats.hasWarnings() ? { warnings: statsDiagnostics(stats) } : {}),\n };\n};\n\nconst runCompiler = Effect.fnUntraced(function* (compiler: RspackCompiler) {\n return yield* Effect.callback<RspackStats, RspackError>((resume) => {\n compiler.run((cause, stats) => {\n if (cause) {\n resume(Effect.fail(compilationError(cause)));\n return;\n }\n if (!stats) {\n resume(Effect.fail(missingStatsError()));\n return;\n }\n\n resume(Effect.succeed(stats));\n });\n });\n});\n\nconst reportStats = Effect.fnUntraced(function* (stats: RspackStats) {\n if (stats.hasErrors()) {\n return yield* failedStatsError(statsDiagnostics(stats));\n }\n if (stats.hasWarnings()) {\n yield* Effect.logWarning(\n `${Terminal.yellow('▲')} Rspack compiled the application with warnings.\\n${statsDiagnostics(stats)}`,\n );\n }\n\n const duration = buildDuration(stats);\n\n yield* Effect.logInfo(\n duration === undefined\n ? `${Terminal.green('✓')} Build finished successfully.`\n : `${Terminal.green('✓')} Build finished successfully in ${formatDuration(duration)}.`,\n );\n});\n\nconst watchCompiler = (configs: ReadonlyArray<Configuration>) =>\n Stream.callback<RspackWatchEvent, RspackError>((queue) =>\n Effect.gen(function* () {\n const compiler = yield* acquireCompiler(configs);\n // The RSC client plugin mutates its own ignored predicate during watch setup.\n const watchOptions = configs.map(() => ({}));\n let watchState: 'Idle' | 'Building' = 'Idle';\n\n compiler.hooks.watchRun.tap(\n { name: 'ersc:watch-state', stage: -10_000 },\n (childCompiler: Compiler) => {\n if (watchState === 'Idle') {\n watchState = 'Building';\n Queue.offerUnsafe(queue, {\n _tag: 'Building',\n changedFiles: Array.from(childCompiler.modifiedFiles ?? []),\n });\n }\n },\n );\n\n yield* Effect.acquireRelease(\n Effect.try({\n try: () =>\n compiler.watch(watchOptions, (cause, stats) => {\n watchState = 'Idle';\n Queue.offerUnsafe(queue, watchEvent(cause, stats));\n }),\n catch: (cause) => compilationError(cause),\n }),\n (watching) => closeWatching(watching).pipe(Effect.orDie),\n );\n }),\n );\n\nexport class Rspack extends Context.Service<Rspack>()('ersc/build/Rspack', {\n make: Effect.succeed({\n build: Effect.fn('Rspack.build')(function* (configs: ReadonlyArray<Configuration>) {\n yield* Effect.logInfo(`${Terminal.cyan('●')} Building application with Rspack...`);\n\n const compiler = yield* acquireCompiler(configs);\n const stats = yield* runCompiler(compiler);\n\n yield* reportStats(stats);\n }),\n watch: watchCompiler,\n }),\n}) {\n static readonly layer = Layer.effect(this, this.make);\n}\n"],"names":["rspack","Context","Effect","Layer","Queue","Schema","Stream","ServerEntryName","formatDuration","Terminal","RspackError","failureMessage","message","buildDuration","stats","compilations","starts","startTime","undefined","ends","endTime","Math","compilerSummary","closeCompiler","compiler","resume","cause","closeWatching","watching","acquireCompiler","configs","compilationError","missingStatsError","Error","statsDiagnostics","colors","failedWatchEvent","error","diagnostics","Bun","failedStatsError","emittedServerBundle","serverStats","compilation","output","entryChunkIds","filenames","chunk","filename","missingServerBundleError","missingClientHashError","clientCompilationHash","watchEvent","serverBundle","clientHash","duration","runCompiler","reportStats","watchCompiler","queue","watchOptions","watchState","childCompiler","Array","Rspack"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const Terminal: {
2
+ readonly cyan: (text: string) => string;
3
+ readonly dim: (text: string) => string;
4
+ readonly green: (text: string) => string;
5
+ readonly magenta: (text: string) => string;
6
+ readonly red: (text: string) => string;
7
+ readonly yellow: (text: string) => string;
8
+ };
9
+ export declare const formatDuration: (milliseconds: number) => string;
@@ -0,0 +1,17 @@
1
+ import { styleText } from "node:util";
2
+
3
+
4
+
5
+ const Terminal = {
6
+ cyan: (text)=>styleText('cyan', text),
7
+ dim: (text)=>styleText('dim', text),
8
+ green: (text)=>styleText('green', text),
9
+ magenta: (text)=>styleText('magenta', text),
10
+ red: (text)=>styleText('red', text),
11
+ yellow: (text)=>styleText('yellow', text)
12
+ };
13
+ const formatDuration = (milliseconds)=>milliseconds < 1000 ? `${milliseconds} ms` : `${(milliseconds / 1000).toFixed(2)} s`;
14
+
15
+ export { Terminal, formatDuration };
16
+
17
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build/terminal.js","sources":["../../src/build/terminal.ts"],"sourcesContent":["import { styleText } from 'node:util';\n\nexport const Terminal = {\n cyan: (text: string) => styleText('cyan', text),\n dim: (text: string) => styleText('dim', text),\n green: (text: string) => styleText('green', text),\n magenta: (text: string) => styleText('magenta', text),\n red: (text: string) => styleText('red', text),\n yellow: (text: string) => styleText('yellow', text),\n} as const;\n\nexport const formatDuration = (milliseconds: number) =>\n milliseconds < 1_000 ? `${milliseconds} ms` : `${(milliseconds / 1_000).toFixed(2)} s`;\n"],"names":["styleText","Terminal","text","formatDuration","milliseconds"],"mappings":";;;AAAsC;AAE/B,MAAMC,QAAQA,GAAG;IACtB,MAAM,CAACC,OAAiBF,SAASA,CAAC,QAAQE;IAC1C,KAAK,CAACA,OAAiBF,SAASA,CAAC,OAAOE;IACxC,OAAO,CAACA,OAAiBF,SAASA,CAAC,SAASE;IAC5C,SAAS,CAACA,OAAiBF,SAASA,CAAC,WAAWE;IAChD,KAAK,CAACA,OAAiBF,SAASA,CAAC,OAAOE;IACxC,QAAQ,CAACA,OAAiBF,SAASA,CAAC,UAAUE;AAChD,EAAW;AAEJ,MAAMC,cAAcA,GAAG,CAACC,eAC7BA,eAAe,OAAQ,GAAGA,aAAa,GAAG,CAAC,GAAG,GAAIA,CAAAA,eAAe,IAAI,EAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Schema } from 'effect';
2
+ declare const BuildModuleLoadError_base: Schema.Class<BuildModuleLoadError, Schema.TaggedStruct<"BuildModuleLoadError", {
3
+ readonly message: Schema.String;
4
+ readonly cause: Schema.Defect;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ export declare class BuildModuleLoadError extends BuildModuleLoadError_base {
7
+ }
8
+ declare const DevModuleLoadError_base: Schema.Class<DevModuleLoadError, Schema.TaggedStruct<"DevModuleLoadError", {
9
+ readonly message: Schema.String;
10
+ readonly cause: Schema.Defect;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ export declare class DevModuleLoadError extends DevModuleLoadError_base {
13
+ }
14
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,116 @@
1
+ import { Config, Effect, Layer, Schema } from "effect";
2
+ import package_0 from "../package.json" with {"type":"json"};
3
+ import { loadCompiledServer, makeRunnableServerLayer } from "./build/compiled-server.js";
4
+ import { EnvironmentConfig } from "./build/contract.js";
5
+ import { ApplicationIdleTimeoutSeconds, ApplicationMaxRequestBodySizeBytes, DefaultApplicationHostname, DefaultApplicationPort } from "./server/server-config.js";
6
+
7
+ import * as __rspack_external__effect_platform_bun_BunHttpServer_0e4f7bbb from "@effect/platform-bun/BunHttpServer";
8
+ import * as __rspack_external__effect_platform_bun_BunRuntime_e8fbdd23 from "@effect/platform-bun/BunRuntime";
9
+ import * as __rspack_external__effect_platform_bun_BunServices_112addf2 from "@effect/platform-bun/BunServices";
10
+ import * as __rspack_external_effect_unstable_cli_Command_ef1b8bde from "effect/unstable/cli/Command";
11
+ import * as __rspack_external_effect_unstable_cli_Flag_7320ac06 from "effect/unstable/cli/Flag";
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+ class BuildModuleLoadError extends Schema.TaggedError()('BuildModuleLoadError', {
33
+ message: Schema.String,
34
+ cause: Schema.Defect()
35
+ }) {
36
+ }
37
+ class DevModuleLoadError extends Schema.TaggedError()('DevModuleLoadError', {
38
+ message: Schema.String,
39
+ cause: Schema.Defect()
40
+ }) {
41
+ }
42
+ const start = Effect.fn('ersc/cli/start')(function*({ hostname, port, root }) {
43
+ const bundle = yield* loadCompiledServer(root);
44
+ const ServerLayer = yield* makeRunnableServerLayer({
45
+ bundle,
46
+ clientAssetsCacheControl: EnvironmentConfig.production.clientAssetsCacheControl,
47
+ clientOutputDir: EnvironmentConfig.production.clientOutputDir,
48
+ hostname,
49
+ port,
50
+ root
51
+ });
52
+ return yield* Layer.launch(ServerLayer);
53
+ });
54
+ const runBuild = Effect.fnUntraced(function*() {
55
+ const { buildApplication } = yield* Effect.tryPromise({
56
+ try: ()=>import("./build/build.js"),
57
+ catch: (cause)=>new BuildModuleLoadError({
58
+ message: 'Failed to load the effective-rsc application compiler.',
59
+ cause
60
+ })
61
+ });
62
+ yield* buildApplication({
63
+ root: process.cwd()
64
+ });
65
+ });
66
+ const buildCommand = __rspack_external_effect_unstable_cli_Command_ef1b8bde.make('build').pipe(__rspack_external_effect_unstable_cli_Command_ef1b8bde.withDescription('Compile an effective-rsc application with Rspack.'), __rspack_external_effect_unstable_cli_Command_ef1b8bde.withHandler(runBuild));
67
+ const cli_hostname = __rspack_external_effect_unstable_cli_Flag_7320ac06.string('hostname').pipe(__rspack_external_effect_unstable_cli_Flag_7320ac06.withDescription('Hostname to bind (defaults to HOST or localhost)'), __rspack_external_effect_unstable_cli_Flag_7320ac06.withFallbackConfig(Config.string('HOST').pipe(Config.withDefault(DefaultApplicationHostname))), __rspack_external_effect_unstable_cli_Flag_7320ac06.withSchema(Schema.NonEmptyString));
68
+ const cli_port = __rspack_external_effect_unstable_cli_Flag_7320ac06.integer('port').pipe(__rspack_external_effect_unstable_cli_Flag_7320ac06.withDescription(`Port to bind (defaults to PORT or ${DefaultApplicationPort})`), __rspack_external_effect_unstable_cli_Flag_7320ac06.withFallbackConfig(Config.int('PORT').pipe(Config.withDefault(DefaultApplicationPort))), __rspack_external_effect_unstable_cli_Flag_7320ac06.withSchema(Schema.Int.check(Schema.isBetween({
69
+ minimum: 1,
70
+ maximum: 65535
71
+ }))));
72
+ const runDev = Effect.fnUntraced(function*({ hostname, port }) {
73
+ const { devApplication } = yield* Effect.tryPromise({
74
+ try: ()=>import("./build/dev.js"),
75
+ catch: (cause)=>new DevModuleLoadError({
76
+ message: 'Failed to load the effective-rsc development compiler.',
77
+ cause
78
+ })
79
+ });
80
+ yield* devApplication({
81
+ hostname,
82
+ port,
83
+ root: process.cwd()
84
+ }).pipe(Effect.provide(__rspack_external__effect_platform_bun_BunHttpServer_0e4f7bbb.layer({
85
+ development: true,
86
+ hostname,
87
+ idleTimeout: ApplicationIdleTimeoutSeconds,
88
+ maxRequestBodySize: ApplicationMaxRequestBodySizeBytes,
89
+ port
90
+ })), Effect.scoped);
91
+ });
92
+ const devCommand = __rspack_external_effect_unstable_cli_Command_ef1b8bde.make('dev', {
93
+ hostname: cli_hostname,
94
+ port: cli_port
95
+ }).pipe(__rspack_external_effect_unstable_cli_Command_ef1b8bde.withDescription('Start an effective-rsc application in development mode.'), __rspack_external_effect_unstable_cli_Command_ef1b8bde.withHandler(runDev));
96
+ const startCommand = __rspack_external_effect_unstable_cli_Command_ef1b8bde.make('start', {
97
+ hostname: cli_hostname,
98
+ port: cli_port
99
+ }).pipe(__rspack_external_effect_unstable_cli_Command_ef1b8bde.withDescription('Start the compiled application with Bun.'), __rspack_external_effect_unstable_cli_Command_ef1b8bde.withHandler(({ hostname, port })=>start({
100
+ hostname,
101
+ port,
102
+ root: process.cwd()
103
+ })));
104
+ const cli = __rspack_external_effect_unstable_cli_Command_ef1b8bde.make('ersc').pipe(__rspack_external_effect_unstable_cli_Command_ef1b8bde.withDescription('Build and run an effective-rsc application.'), __rspack_external_effect_unstable_cli_Command_ef1b8bde.withSubcommands([
105
+ devCommand,
106
+ buildCommand,
107
+ startCommand
108
+ ]));
109
+ const program = __rspack_external_effect_unstable_cli_Command_ef1b8bde.run(cli, {
110
+ version: package_0.version
111
+ }).pipe(Effect.provide(__rspack_external__effect_platform_bun_BunServices_112addf2.layer));
112
+ __rspack_external__effect_platform_bun_BunRuntime_e8fbdd23.runMain(program);
113
+
114
+ export { BuildModuleLoadError, DevModuleLoadError };
115
+
116
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import * as BunHttpServer from '@effect/platform-bun/BunHttpServer';\nimport * as BunRuntime from '@effect/platform-bun/BunRuntime';\nimport * as BunServices from '@effect/platform-bun/BunServices';\nimport { Config, Effect, Layer, Schema } from 'effect';\nimport * as Command from 'effect/unstable/cli/Command';\nimport * as Flag from 'effect/unstable/cli/Flag';\n\nimport PackageJson from '../package.json' with { type: 'json' };\nimport { loadCompiledServer, makeRunnableServerLayer } from './build/compiled-server';\nimport { EnvironmentConfig } from './build/contract';\nimport {\n ApplicationIdleTimeoutSeconds,\n ApplicationMaxRequestBodySizeBytes,\n DefaultApplicationHostname,\n DefaultApplicationPort,\n} from './server/server-config';\n\nexport class BuildModuleLoadError extends Schema.TaggedError<BuildModuleLoadError>()(\n 'BuildModuleLoadError',\n {\n message: Schema.String,\n cause: Schema.Defect(),\n },\n) {}\n\nexport class DevModuleLoadError extends Schema.TaggedError<DevModuleLoadError>()(\n 'DevModuleLoadError',\n {\n message: Schema.String,\n cause: Schema.Defect(),\n },\n) {}\n\nconst start = Effect.fn('ersc/cli/start')(function* ({\n hostname,\n port,\n root,\n}: {\n readonly hostname: string;\n readonly port: number;\n readonly root: string;\n}) {\n const bundle = yield* loadCompiledServer(root);\n const ServerLayer = yield* makeRunnableServerLayer({\n bundle,\n clientAssetsCacheControl: EnvironmentConfig.production.clientAssetsCacheControl,\n clientOutputDir: EnvironmentConfig.production.clientOutputDir,\n hostname,\n port,\n root,\n });\n\n return yield* Layer.launch(ServerLayer);\n});\n\nconst runBuild = Effect.fnUntraced(function* () {\n const { buildApplication } = yield* Effect.tryPromise({\n try: () => import('./build/build'),\n catch: (cause) =>\n new BuildModuleLoadError({\n message: 'Failed to load the effective-rsc application compiler.',\n cause,\n }),\n });\n\n yield* buildApplication({ root: process.cwd() });\n});\n\nconst buildCommand = Command.make('build').pipe(\n Command.withDescription('Compile an effective-rsc application with Rspack.'),\n Command.withHandler(runBuild),\n);\n\nconst hostname = Flag.string('hostname').pipe(\n Flag.withDescription('Hostname to bind (defaults to HOST or localhost)'),\n Flag.withFallbackConfig(\n Config.string('HOST').pipe(Config.withDefault(DefaultApplicationHostname)),\n ),\n Flag.withSchema(Schema.NonEmptyString),\n);\n\nconst port = Flag.integer('port').pipe(\n Flag.withDescription(`Port to bind (defaults to PORT or ${DefaultApplicationPort})`),\n Flag.withFallbackConfig(Config.int('PORT').pipe(Config.withDefault(DefaultApplicationPort))),\n Flag.withSchema(\n Schema.Int.check(\n Schema.isBetween({\n minimum: 1,\n maximum: 65_535,\n }),\n ),\n ),\n);\n\nconst runDev = Effect.fnUntraced(function* ({\n hostname,\n port,\n}: {\n readonly hostname: string;\n readonly port: number;\n}) {\n const { devApplication } = yield* Effect.tryPromise({\n try: () => import('./build/dev'),\n catch: (cause) =>\n new DevModuleLoadError({\n message: 'Failed to load the effective-rsc development compiler.',\n cause,\n }),\n });\n\n yield* devApplication({\n hostname,\n port,\n root: process.cwd(),\n }).pipe(\n Effect.provide(\n BunHttpServer.layer({\n development: true,\n hostname,\n idleTimeout: ApplicationIdleTimeoutSeconds,\n maxRequestBodySize: ApplicationMaxRequestBodySizeBytes,\n port,\n }),\n ),\n Effect.scoped,\n );\n});\n\nconst devCommand = Command.make('dev', { hostname, port }).pipe(\n Command.withDescription('Start an effective-rsc application in development mode.'),\n Command.withHandler(runDev),\n);\n\nconst startCommand = Command.make('start', { hostname, port }).pipe(\n Command.withDescription('Start the compiled application with Bun.'),\n Command.withHandler(({ hostname, port }) => start({ hostname, port, root: process.cwd() })),\n);\n\nconst cli = Command.make('ersc').pipe(\n Command.withDescription('Build and run an effective-rsc application.'),\n Command.withSubcommands([devCommand, buildCommand, startCommand]),\n);\n\nconst program = Command.run(cli, { version: PackageJson.version }).pipe(\n Effect.provide(BunServices.layer),\n);\n\nBunRuntime.runMain(program);\n"],"names":["BunHttpServer","BunRuntime","BunServices","Config","Effect","Layer","Schema","Command","Flag","PackageJson","loadCompiledServer","makeRunnableServerLayer","EnvironmentConfig","ApplicationIdleTimeoutSeconds","ApplicationMaxRequestBodySizeBytes","DefaultApplicationHostname","DefaultApplicationPort","BuildModuleLoadError","DevModuleLoadError","start","hostname","port","root","bundle","ServerLayer","runBuild","buildApplication","cause","process","buildCommand","runDev","devApplication","devCommand","startCommand","cli","program"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Effect } from 'effect';
2
+ export declare const browserMain: Effect.Effect<never, never, never>;
@@ -0,0 +1,73 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { checkBrowserCapabilities } from "./browser-capabilities.js";
3
+ import { BrowserEffectRunner } from "./browser-effect-runner.js";
4
+ import { BrowserRenderer } from "./browser-renderer.js";
5
+ import { showBrowserFailure } from "./browser-screen.js";
6
+ import { installCallServer } from "./call-server.js";
7
+ import { installClientRouter } from "./client-router.js";
8
+ import { FlightClient } from "./flight-client.js";
9
+ import { InitialFlightStream } from "./initial-flight-stream.js";
10
+ import { NavigationApi } from "./navigation-api.js";
11
+ import { ReactDOMRenderer } from "./react-dom-renderer.js";
12
+ import { RouteLoader } from "./route-loader.js";
13
+ import { RouteRefresher, installRouteRefresh } from "./route-refresh.js";
14
+
15
+ import * as __rspack_external__effect_platform_browser_BrowserHttpClient_04160dce from "@effect/platform-browser/BrowserHttpClient";
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+ // oxlint-disable effecttsgo/process-env, effecttsgo/process-env-in-effect -- Rspack replaces NODE_ENV at compile time.
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ const BrowserServicesLayer = Layer.mergeAll(BrowserEffectRunner.layer, BrowserRenderer.layer, FlightClient.layer, NavigationApi.layer).pipe(Layer.provide(InitialFlightStream.layer));
46
+ const BrowserLayer = Layer.mergeAll(ReactDOMRenderer.layer, RouteLoader.layer, RouteRefresher.layer).pipe(Layer.provideMerge(BrowserServicesLayer), Layer.provide(__rspack_external__effect_platform_browser_BrowserHttpClient_04160dce.layerFetch));
47
+ const renderBrowserFailure = Effect.sync(showBrowserFailure);
48
+ const skipHydration = (missingApi)=>process.env.NODE_ENV === 'development' ? Effect.logWarning(`effective-rsc did not hydrate because this browser does not provide ${missingApi}. The server-rendered document remains a plain multi-page application.`) : Effect["void"];
49
+ const activateClientNavigation = Effect.gen(function*() {
50
+ const routeLoader = yield* RouteLoader;
51
+ const reactDOMRenderer = yield* ReactDOMRenderer;
52
+ const initialPayload = yield* routeLoader.loadInitial;
53
+ yield* reactDOMRenderer.hydrate(document, initialPayload);
54
+ yield* installClientRouter;
55
+ yield* installRouteRefresh;
56
+ yield* installCallServer;
57
+ });
58
+ const browserMain = Effect.scoped(Effect.gen(function*() {
59
+ if (process.env.NODE_ENV === 'development') {
60
+ yield* Effect.tryPromise(()=>import("../dev/client.js")).pipe(Effect.flatMap(({ startDevClient })=>startDevClient), Effect["catch"]((cause)=>Effect.logError('Development client stopped.', cause)), Effect.forkScoped);
61
+ }
62
+ yield* checkBrowserCapabilities.pipe(Effect.andThen(activateClientNavigation), Effect.catchTags({
63
+ FlightLoadError: ()=>renderBrowserFailure,
64
+ ReactDOMHydrationError: ()=>renderBrowserFailure,
65
+ NavigationApiUnavailableError: ()=>skipHydration('the Navigation API'),
66
+ NavigationPrecommitUnavailableError: ()=>skipHydration('NavigationPrecommitController')
67
+ }));
68
+ return yield* Effect.never;
69
+ })).pipe(Effect.provide(BrowserLayer));
70
+
71
+ export { browserMain };
72
+
73
+ //# sourceMappingURL=application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client/application.js","sources":["../../src/client/application.ts"],"sourcesContent":["// oxlint-disable effecttsgo/process-env, effecttsgo/process-env-in-effect -- Rspack replaces NODE_ENV at compile time.\nimport * as BrowserHttpClient from '@effect/platform-browser/BrowserHttpClient';\nimport { Effect, Layer } from 'effect';\n\nimport { checkBrowserCapabilities } from './browser-capabilities';\nimport { BrowserEffectRunner } from './browser-effect-runner';\nimport { BrowserRenderer } from './browser-renderer';\nimport { showBrowserFailure } from './browser-screen';\nimport { installCallServer } from './call-server';\nimport { installClientRouter } from './client-router';\nimport { FlightClient } from './flight-client';\nimport { InitialFlightStream } from './initial-flight-stream';\nimport { NavigationApi } from './navigation-api';\nimport { ReactDOMRenderer } from './react-dom-renderer';\nimport { RouteLoader } from './route-loader';\nimport { installRouteRefresh, RouteRefresher } from './route-refresh';\n\nconst BrowserServicesLayer = Layer.mergeAll(\n BrowserEffectRunner.layer,\n BrowserRenderer.layer,\n FlightClient.layer,\n NavigationApi.layer,\n).pipe(Layer.provide(InitialFlightStream.layer));\n\nconst BrowserLayer = Layer.mergeAll(\n ReactDOMRenderer.layer,\n RouteLoader.layer,\n RouteRefresher.layer,\n).pipe(Layer.provideMerge(BrowserServicesLayer), Layer.provide(BrowserHttpClient.layerFetch));\n\nconst renderBrowserFailure = Effect.sync(showBrowserFailure);\n\nconst skipHydration = (missingApi: string) =>\n process.env.NODE_ENV === 'development'\n ? Effect.logWarning(\n `effective-rsc did not hydrate because this browser does not provide ${missingApi}. The server-rendered document remains a plain multi-page application.`,\n )\n : Effect.void;\n\nconst activateClientNavigation = Effect.gen(function* () {\n const routeLoader = yield* RouteLoader;\n const reactDOMRenderer = yield* ReactDOMRenderer;\n\n const initialPayload = yield* routeLoader.loadInitial;\n yield* reactDOMRenderer.hydrate(document, initialPayload);\n yield* installClientRouter;\n yield* installRouteRefresh;\n yield* installCallServer;\n});\n\nexport const browserMain = Effect.scoped(\n Effect.gen(function* () {\n if (process.env.NODE_ENV === 'development') {\n yield* Effect.tryPromise(() => import('../dev/client')).pipe(\n Effect.flatMap(({ startDevClient }) => startDevClient),\n Effect.catch((cause) => Effect.logError('Development client stopped.', cause)),\n Effect.forkScoped,\n );\n }\n\n yield* checkBrowserCapabilities.pipe(\n Effect.andThen(activateClientNavigation),\n Effect.catchTags({\n FlightLoadError: () => renderBrowserFailure,\n ReactDOMHydrationError: () => renderBrowserFailure,\n NavigationApiUnavailableError: () => skipHydration('the Navigation API'),\n NavigationPrecommitUnavailableError: () => skipHydration('NavigationPrecommitController'),\n }),\n );\n return yield* Effect.never;\n }),\n).pipe(Effect.provide(BrowserLayer));\n"],"names":["BrowserHttpClient","Effect","Layer","checkBrowserCapabilities","BrowserEffectRunner","BrowserRenderer","showBrowserFailure","installCallServer","installClientRouter","FlightClient","InitialFlightStream","NavigationApi","ReactDOMRenderer","RouteLoader","installRouteRefresh","RouteRefresher","BrowserServicesLayer","BrowserLayer","renderBrowserFailure","skipHydration","missingApi","process","activateClientNavigation","routeLoader","reactDOMRenderer","initialPayload","document","browserMain","startDevClient","cause"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uHAAuH;AACvC;AACzC;AAE2B;AACJ;AACT;AACC;AACJ;AACI;AACP;AACe;AACb;AACO;AACX;AACyB;AAEtE,MAAMgB,oBAAoBA,GAAGd,cAAc,CACzCE,yBAAyB,EACzBC,qBAAqB,EACrBI,kBAAkB,EAClBE,mBAAmB,EACnB,IAAI,CAACT,aAAa,CAACQ,yBAAyB;AAE9C,MAAMO,YAAYA,GAAGf,cAAc,CACjCU,sBAAsB,EACtBC,iBAAiB,EACjBE,oBAAoB,EACpB,IAAI,CAACb,kBAAkB,CAACc,oBAAoBA,GAAGd,aAAa,CAACF,gFAA4B;AAE3F,MAAMkB,oBAAoBA,GAAGjB,WAAW,CAACK,kBAAkBA;AAE3D,MAAMa,aAAaA,GAAG,CAACC,aACrBC,QAAQ,GAAG,CAAC,QAAQ,KAAK,gBACrBpB,iBAAiB,CACf,CAAC,oEAAoE,EAAEmB,WAAW,sEAAsE,CAAC,IAE3JnB,cAAW;AAEjB,MAAMqB,wBAAwBA,GAAGrB,UAAU,CAAC;IAC1C,MAAMsB,cAAc,OAAOV,WAAWA;IACtC,MAAMW,mBAAmB,OAAOZ,gBAAgBA;IAEhD,MAAMa,iBAAiB,OAAOF,YAAY,WAAW;IACrD,OAAOC,iBAAiB,OAAO,CAACE,UAAUD;IAC1C,OAAOjB,mBAAmBA;IAC1B,OAAOM,mBAAmBA;IAC1B,OAAOP,iBAAiBA;AAC1B;AAEO,MAAMoB,WAAWA,GAAG1B,aAAa,CACtCA,UAAU,CAAC;IACT,IAAIoB,QAAQ,GAAG,CAAC,QAAQ,KAAK,eAAe;QAC1C,OAAOpB,iBAAiB,CAAC,IAAM,0BAAuB,EAAE,IAAI,CAC1DA,cAAc,CAAC,CAAC,EAAE2B,cAAc,EAAE,GAAKA,iBACvC3B,eAAY,CAAC,CAAC4B,QAAU5B,eAAe,CAAC,+BAA+B4B,SACvE5B,iBAAiB;IAErB;IAEA,OAAOE,6BAA6B,CAClCF,cAAc,CAACqB,wBAAwBA,GACvCrB,gBAAgB,CAAC;QACf,iBAAiB,IAAMiB,oBAAoBA;QAC3C,wBAAwB,IAAMA,oBAAoBA;QAClD,+BAA+B,IAAMC,aAAaA,CAAC;QACnD,qCAAqC,IAAMA,aAAaA,CAAC;IAC3D;IAEF,OAAO,OAAOlB,YAAY;AAC5B,IACA,IAAI,CAACA,cAAc,CAACgB,YAAYA,GAAG"}
@@ -0,0 +1,9 @@
1
+ import { Effect, Schema } from 'effect';
2
+ declare const NavigationApiUnavailableError_base: Schema.Class<NavigationApiUnavailableError, Schema.TaggedStruct<"NavigationApiUnavailableError", {}>, import("effect/Cause").YieldableError>;
3
+ export declare class NavigationApiUnavailableError extends NavigationApiUnavailableError_base {
4
+ }
5
+ declare const NavigationPrecommitUnavailableError_base: Schema.Class<NavigationPrecommitUnavailableError, Schema.TaggedStruct<"NavigationPrecommitUnavailableError", {}>, import("effect/Cause").YieldableError>;
6
+ export declare class NavigationPrecommitUnavailableError extends NavigationPrecommitUnavailableError_base {
7
+ }
8
+ export declare const checkBrowserCapabilities: Effect.Effect<undefined, NavigationApiUnavailableError | NavigationPrecommitUnavailableError, never>;
9
+ export {};
@@ -0,0 +1,20 @@
1
+ import { Effect, Schema } from "effect";
2
+
3
+
4
+
5
+ class NavigationApiUnavailableError extends Schema.TaggedError()('NavigationApiUnavailableError', {}) {
6
+ }
7
+ class NavigationPrecommitUnavailableError extends Schema.TaggedError()('NavigationPrecommitUnavailableError', {}) {
8
+ }
9
+ const checkBrowserCapabilities = Effect.gen(function*() {
10
+ if (window.navigation === undefined) {
11
+ return yield* new NavigationApiUnavailableError();
12
+ }
13
+ if (window.NavigationPrecommitController === undefined) {
14
+ return yield* new NavigationPrecommitUnavailableError();
15
+ }
16
+ });
17
+
18
+ export { NavigationApiUnavailableError, NavigationPrecommitUnavailableError, checkBrowserCapabilities };
19
+
20
+ //# sourceMappingURL=browser-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client/browser-capabilities.js","sources":["../../src/client/browser-capabilities.ts"],"sourcesContent":["import { Effect, Schema } from 'effect';\n\nexport class NavigationApiUnavailableError extends Schema.TaggedError<NavigationApiUnavailableError>()(\n 'NavigationApiUnavailableError',\n {},\n) {}\n\nexport class NavigationPrecommitUnavailableError extends Schema.TaggedError<NavigationPrecommitUnavailableError>()(\n 'NavigationPrecommitUnavailableError',\n {},\n) {}\n\nexport const checkBrowserCapabilities = Effect.gen(function* () {\n if (window.navigation === undefined) {\n return yield* new NavigationApiUnavailableError();\n }\n if (window.NavigationPrecommitController === undefined) {\n return yield* new NavigationPrecommitUnavailableError();\n }\n});\n"],"names":["Effect","Schema","NavigationApiUnavailableError","NavigationPrecommitUnavailableError","checkBrowserCapabilities","window","undefined"],"mappings":";;;AAAwC;AAEjC,MAAME,6BAA6BA,SAASD,kBAAkB,GACnE,iCACA,CAAC;AACA;AAEI,MAAME,mCAAmCA,SAASF,kBAAkB,GACzE,uCACA,CAAC;AACA;AAEI,MAAMG,wBAAwBA,GAAGJ,UAAU,CAAC;IACjD,IAAIK,OAAO,UAAU,KAAKC,WAAW;QACnC,OAAO,OAAO,IAAIJ,6BAA6BA;IACjD;IACA,IAAIG,OAAO,6BAA6B,KAAKC,WAAW;QACtD,OAAO,OAAO,IAAIH,mCAAmCA;IACvD;AACF,GAAG"}
@@ -0,0 +1,13 @@
1
+ import { Context, Layer, Scope } from 'effect';
2
+ import { HttpClient } from 'effect/unstable/http';
3
+ declare const BrowserEffectRunner_base: Context.ServiceClass<BrowserEffectRunner, "ersc/client/BrowserEffectRunner", <XE extends unknown, XA extends unknown>(effect: import("effect/Effect").Effect<XA, XE, HttpClient.HttpClient | Scope.Scope>, options?: (import("effect/Effect").RunOptions & {
4
+ readonly propagateInterruption?: boolean | undefined;
5
+ }) | undefined) => Promise<XA>> & {
6
+ readonly make: import("effect/Effect").Effect<<XE extends unknown, XA extends unknown>(effect: import("effect/Effect").Effect<XA, XE, HttpClient.HttpClient | Scope.Scope>, options?: (import("effect/Effect").RunOptions & {
7
+ readonly propagateInterruption?: boolean | undefined;
8
+ }) | undefined) => Promise<XA>, never, HttpClient.HttpClient | Scope.Scope>;
9
+ };
10
+ export declare class BrowserEffectRunner extends BrowserEffectRunner_base {
11
+ static readonly layer: Layer.Layer<BrowserEffectRunner, never, HttpClient.HttpClient>;
12
+ }
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import { Context, FiberSet, Layer } from "effect";
2
+
3
+
4
+
5
+ class BrowserEffectRunner extends Context.Service()('ersc/client/BrowserEffectRunner', {
6
+ make: FiberSet.makeRuntimePromise()
7
+ }) {
8
+ static layer = Layer.effect(this, this.make);
9
+ }
10
+
11
+ export { BrowserEffectRunner };
12
+
13
+ //# sourceMappingURL=browser-effect-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client/browser-effect-runner.js","sources":["../../src/client/browser-effect-runner.ts"],"sourcesContent":["import { Context, FiberSet, Layer, Scope } from 'effect';\nimport { HttpClient } from 'effect/unstable/http';\n\nexport class BrowserEffectRunner extends Context.Service<BrowserEffectRunner>()(\n 'ersc/client/BrowserEffectRunner',\n {\n make: FiberSet.makeRuntimePromise<HttpClient.HttpClient | Scope.Scope>(),\n },\n) {\n static readonly layer = Layer.effect(this, this.make);\n}\n"],"names":["Context","FiberSet","Layer","BrowserEffectRunner"],"mappings":";;;AAAyD;AAGlD,MAAMG,mBAAmBA,SAASH,eAAe,GACtD,mCACA;IACE,MAAMC,2BAA2B;AACnC;IAEA,OAAgB,QAAQC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACxD"}