@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 @@
1
+ {"version":3,"sources":["../../src/framework/index.ts","../../src/actions/types.ts","../../src/actions/service.ts","../../src/boundary/codecs.ts","../../src/boundary/errors.ts","../../src/kernel/telemetry.ts","../../src/actions/http.ts","../../src/kernel/app.ts","../../src/data/types.ts","../../src/data/service.ts","../../src/navigation/types.ts","../../src/navigation/matcher.ts","../../src/navigation/service.ts","../../src/kernel/runtime.ts","../../src/framework/manifest.ts","../../src/config/index.ts","../../src/framework/app.ts","../../src/framework/cache.ts","../../src/framework/contracts.ts"],"sourcesContent":["export * from \"./app\";\nexport * from \"./cache\";\nexport * from \"./contracts\";\nexport * from \"./manifest\";\n","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 { 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","import { Context, Effect, Layer, PubSub, Stream } from \"effect\";\n\nexport type TelemetryEvent =\n | {\n readonly _tag: \"query\";\n readonly phase: \"start\" | \"success\" | \"failure\" | \"invalidate\";\n readonly key: string;\n readonly timestamp: number;\n readonly detail?: unknown;\n }\n | {\n readonly _tag: \"navigation\";\n readonly phase: \"start\" | \"success\" | \"failure\" | \"cancel\";\n readonly pathname: string;\n readonly routeId?: string;\n readonly timestamp: number;\n readonly detail?: unknown;\n }\n | {\n readonly _tag: \"action\";\n readonly phase: \"start\" | \"success\" | \"failure\" | \"transport\";\n readonly name: string;\n readonly timestamp: number;\n readonly detail?: unknown;\n }\n | {\n readonly _tag: \"boundary\";\n readonly phase: \"decode-failure\" | \"protocol-failure\" | \"transport-failure\";\n readonly source: string;\n readonly timestamp: number;\n readonly detail?: unknown;\n };\n\nexport interface TelemetryService {\n readonly emit: (event: TelemetryEvent) => Effect.Effect<void>;\n readonly stream: Stream.Stream<TelemetryEvent>;\n}\n\nexport class Telemetry extends Context.Tag(\"EffectReact/Telemetry\")<\n Telemetry,\n TelemetryService\n>() {}\n\nexport const TelemetryLive = Layer.effect(\n Telemetry,\n Effect.map(PubSub.unbounded<TelemetryEvent>(), (pubsub) => ({\n emit: (event) => PubSub.publish(pubsub, event).pipe(Effect.asVoid),\n stream: Stream.fromPubSub(pubsub),\n })),\n);\n\nexport const emitTelemetry = (event: TelemetryEvent): Effect.Effect<void, never, Telemetry> =>\n Effect.flatMap(Telemetry, (service) => service.emit(event));\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 type { Duration, Effect, Schema } from \"effect\";\nimport type { BoundaryDecodeError } from \"../boundary\";\nimport type { BoundaryProtocolError } from \"../boundary/errors\";\n\nexport interface QueryDefinition<\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n> {\n readonly name: Name;\n readonly input: Schema.Schema<Input, InputEncoded, never>;\n readonly output: Schema.Schema<Output, OutputEncoded, never>;\n readonly run: (input: Input) => Effect.Effect<Output, E, never>;\n readonly key?: (input: Input) => unknown;\n}\n\nexport const defineQuery = <\n Name extends string,\n Input,\n Output,\n E,\n InputEncoded = Input,\n OutputEncoded = Output,\n>(\n definition: QueryDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded>,\n): QueryDefinition<Name, Input, Output, E, InputEncoded, OutputEncoded> => definition;\n\nexport type QueryPhase = \"initial\" | \"loading\" | \"success\" | \"failure\";\n\nexport interface QuerySnapshot<Output, E> {\n readonly key: string;\n readonly phase: QueryPhase;\n readonly data: Output | undefined;\n readonly error: E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError | undefined;\n readonly updatedAt: number | null | undefined;\n}\n\nexport interface QueryRunOptions {\n readonly forceRefresh?: boolean;\n}\n\nexport interface QueryRuntimeOptions {\n readonly capacity?: number;\n readonly timeToLive?: Duration.DurationInput;\n}\n\nexport class QueryRuntimeError extends Error {\n readonly _tag = \"QueryRuntimeError\" as const;\n\n constructor(readonly messageText: string) {\n super(messageText);\n this.name = \"QueryRuntimeError\";\n }\n}\n","import {\n Cache,\n Context,\n Effect,\n Layer,\n SubscriptionRef,\n type Stream,\n} from \"effect\";\nimport { Boundary, type BoundaryDecodeError } from \"../boundary\";\nimport type { BoundaryProtocolError } from \"../boundary/errors\";\nimport { Telemetry } from \"../kernel/telemetry\";\nimport {\n type QueryDefinition,\n type QueryRunOptions,\n type QueryRuntimeOptions,\n type QuerySnapshot,\n QueryRuntimeError,\n} from \"./types\";\n\nconst defaultRuntimeOptions: Required<QueryRuntimeOptions> = {\n capacity: 2048,\n timeToLive: \"5 minutes\",\n};\n\nconst stableStringify = (value: unknown): string => {\n if (value === null || value === undefined) {\n return String(value);\n }\n\n if (typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n return `{${entries.map(([key, nested]) => `${JSON.stringify(key)}:${stableStringify(nested)}`).join(\",\")}}`;\n};\n\nconst initialSnapshot = <Output, E>(key: string): QuerySnapshot<Output, E> => ({\n key,\n phase: \"initial\",\n data: undefined,\n error: undefined,\n updatedAt: null,\n});\n\nexport interface DataService {\n readonly fetch: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options?: QueryRunOptions,\n ) => Effect.Effect<Output, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, never>;\n readonly prefetch: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<void, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, never>;\n readonly invalidate: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<void, QueryRuntimeError, never>;\n readonly getSnapshot: <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ) => Effect.Effect<QuerySnapshot<Output, E>, never, never>;\n readonly getAllSnapshots: Effect.Effect<ReadonlyMap<string, QuerySnapshot<unknown, unknown>>, never, never>;\n readonly hydrateSnapshots: (\n snapshots: ReadonlyMap<string, QuerySnapshot<unknown, unknown>>,\n ) => Effect.Effect<void, never, never>;\n readonly snapshots: Stream.Stream<ReadonlyMap<string, QuerySnapshot<unknown, unknown>>>;\n}\n\nexport class Data extends Context.Tag(\"EffectReact/Data\")<Data, DataService>() {}\n\nexport const makeDataLayer = (\n options: QueryRuntimeOptions = {},\n): Layer.Layer<Data, never, Boundary | Telemetry> => {\n const merged = {\n ...defaultRuntimeOptions,\n ...options,\n };\n\n return Layer.effect(\n Data,\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const telemetry = yield* Telemetry;\n const lookups = new Map<string, Effect.Effect<unknown, unknown, never>>();\n const snapshots = yield* SubscriptionRef.make(\n new Map<string, QuerySnapshot<unknown, unknown>>() as ReadonlyMap<\n string,\n QuerySnapshot<unknown, unknown>\n >,\n );\n\n const cache = yield* Cache.make<string, unknown, unknown>({\n capacity: merged.capacity,\n timeToLive: merged.timeToLive,\n lookup: (key) =>\n Effect.suspend(() => {\n const lookup = lookups.get(key);\n if (lookup === undefined) {\n return Effect.fail(new QueryRuntimeError(`No query executor registered for ${key}`));\n }\n return lookup;\n }),\n });\n\n const setSnapshot = <Output, E>(\n key: string,\n update: (previous: QuerySnapshot<Output, E>) => QuerySnapshot<Output, E>,\n ): Effect.Effect<void> =>\n SubscriptionRef.update(snapshots, (current) => {\n const next = new Map(current);\n const previous =\n (next.get(key) as QuerySnapshot<Output, E> | undefined) ?? initialSnapshot<Output, E>(key);\n next.set(key, update(previous));\n return next;\n }).pipe(Effect.asVoid);\n\n const buildKey = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: Input,\n ): string => {\n const base = definition.key ? definition.key(input) : input;\n return `${definition.name}:${stableStringify(base)}`;\n };\n\n const fetch = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n runOptions?: QueryRunOptions,\n ): Effect.Effect<\n Output,\n E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError,\n never\n > =>\n Effect.gen(function* () {\n const decodedInput = yield* boundary.decodeUnknown({\n source: `query:${definition.name}:input`,\n schema: definition.input,\n value: input,\n });\n\n const key = buildKey(definition, decodedInput);\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"start\",\n key,\n timestamp: Date.now(),\n });\n\n yield* setSnapshot(key, (previous) => ({\n ...previous,\n phase: \"loading\",\n error: undefined,\n }));\n\n lookups.set(\n key,\n definition\n .run(decodedInput)\n .pipe(\n Effect.flatMap((output) =>\n boundary.decodeUnknown({\n source: `query:${definition.name}:output`,\n schema: definition.output,\n value: output,\n }),\n ),\n ) as Effect.Effect<unknown, unknown, never>,\n );\n\n if (runOptions?.forceRefresh === true) {\n yield* cache.refresh(key).pipe(Effect.ignore);\n }\n\n const value = yield* cache.get(key).pipe(\n Effect.mapError(\n (error) =>\n error as E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError,\n ),\n );\n\n yield* setSnapshot(key, () => ({\n key,\n phase: \"success\",\n data: value,\n error: undefined,\n updatedAt: Date.now(),\n }));\n\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"success\",\n key,\n timestamp: Date.now(),\n });\n\n return value as Output;\n }).pipe(\n Effect.tapError((error) =>\n Effect.gen(function* () {\n const decodedInput = yield* boundary.decodeUnknown({\n source: `query:${definition.name}:input`,\n schema: definition.input,\n value: input,\n });\n const key = buildKey(definition, decodedInput);\n yield* setSnapshot(key, (previous) => ({\n ...previous,\n phase: \"failure\",\n error,\n updatedAt: previous.updatedAt,\n }));\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"failure\",\n key,\n timestamp: Date.now(),\n detail: error,\n });\n }),\n ),\n );\n\n const prefetch: DataService[\"prefetch\"] = (definition, input) =>\n fetch(definition, input).pipe(Effect.asVoid);\n\n const invalidate: DataService[\"invalidate\"] = (definition, input) =>\n Effect.gen(function* () {\n const key = `${definition.name}:${stableStringify(input)}`;\n yield* cache.invalidate(key);\n yield* SubscriptionRef.update(snapshots, (current) => {\n const next = new Map(current);\n next.delete(key);\n return next;\n }).pipe(Effect.asVoid);\n yield* telemetry.emit({\n _tag: \"query\",\n phase: \"invalidate\",\n key,\n timestamp: Date.now(),\n });\n });\n\n const getSnapshot = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n ): Effect.Effect<QuerySnapshot<Output, E>, never, never> =>\n Effect.gen(function* () {\n const key = `${definition.name}:${stableStringify(input)}`;\n const current = yield* SubscriptionRef.get(snapshots);\n const snapshot = current.get(key);\n if (snapshot === undefined) {\n return initialSnapshot<Output, E>(key);\n }\n return snapshot as QuerySnapshot<Output, E>;\n });\n\n return {\n fetch,\n prefetch,\n invalidate,\n getSnapshot,\n getAllSnapshots: SubscriptionRef.get(snapshots),\n hydrateSnapshots: (nextSnapshots) => SubscriptionRef.set(snapshots, new Map(nextSnapshots)),\n snapshots: snapshots.changes,\n } satisfies DataService;\n }),\n );\n};\n\nexport const fetchQuery = <Name extends string, Input, Output, E>(\n definition: QueryDefinition<Name, Input, Output, E>,\n input: unknown,\n options?: QueryRunOptions,\n): Effect.Effect<Output, E | BoundaryDecodeError | BoundaryProtocolError | QueryRuntimeError, Data> =>\n Effect.flatMap(Data, (service) => service.fetch(definition, input, options));\n","import type { Effect, Schedule, Schema } from \"effect\";\nimport type { BoundaryDecodeError } from \"../boundary\";\n\nexport interface RouteDefinition<Path extends string, Search, SearchEncoded = Search> {\n readonly id: string;\n readonly path: Path;\n readonly search?: Schema.Schema<Search, SearchEncoded, never>;\n}\n\nexport const defineRoute = <Path extends string, Search = Record<never, never>, SearchEncoded = Search>(\n route: RouteDefinition<Path, Search, SearchEncoded>,\n): RouteDefinition<Path, Search, SearchEncoded> => route;\n\nexport interface AnyRouteDefinition {\n readonly id: string;\n readonly path: string;\n readonly search?: Schema.Schema.All;\n}\n\nexport interface RouteMatch<TRoute extends AnyRouteDefinition> {\n readonly route: TRoute;\n readonly pathname: string;\n readonly params: Readonly<Record<string, string>>;\n readonly search: unknown;\n}\n\nexport interface LoaderContext<TRoute extends AnyRouteDefinition> {\n readonly route: TRoute;\n readonly pathname: string;\n readonly searchText: string;\n readonly params: Readonly<Record<string, string>>;\n readonly search: unknown;\n readonly dependencyResults: Readonly<Record<string, unknown>>;\n}\n\nexport interface LoaderDefinition<\n Name extends string,\n RouteId extends string,\n Output,\n E,\n TRoute extends AnyRouteDefinition = AnyRouteDefinition,\n> {\n readonly name: Name;\n readonly routeId: RouteId;\n readonly dependsOn?: readonly string[];\n readonly retry?: Schedule.Schedule<unknown, E, never>;\n readonly run: (context: LoaderContext<TRoute>) => Effect.Effect<Output, E, never>;\n}\n\nexport const defineLoader = <\n Name extends string,\n RouteId extends string,\n Output,\n E,\n TRoute extends AnyRouteDefinition = AnyRouteDefinition,\n>(\n loader: LoaderDefinition<Name, RouteId, Output, E, TRoute>,\n): LoaderDefinition<Name, RouteId, Output, E, TRoute> => loader;\n\nexport type AnyLoaderDefinition = LoaderDefinition<string, string, unknown, never, AnyRouteDefinition>;\n\nexport type LoaderSnapshotEntry =\n | {\n readonly _tag: \"pending\";\n }\n | {\n readonly _tag: \"success\";\n readonly value: unknown;\n }\n | {\n readonly _tag: \"failure\";\n readonly error: unknown;\n };\n\nexport interface NavigationSnapshot {\n readonly pathname: string;\n readonly searchText: string;\n readonly href: string;\n readonly status: \"idle\" | \"loading\" | \"success\" | \"failure\";\n readonly match: RouteMatch<AnyRouteDefinition> | null;\n readonly loaders: Readonly<Record<string, LoaderSnapshotEntry>>;\n readonly error: unknown;\n}\n\nexport class NavigationRuntimeError extends Error {\n readonly _tag = \"NavigationRuntimeError\" as const;\n\n constructor(readonly messageText: string) {\n super(messageText);\n this.name = \"NavigationRuntimeError\";\n }\n}\n\nexport class NavigationCancelledError extends Error {\n readonly _tag = \"NavigationCancelledError\" as const;\n\n constructor(readonly pathname: string) {\n super(`Navigation cancelled for ${pathname}`);\n this.name = \"NavigationCancelledError\";\n }\n}\n\nexport type NavigationError =\n | NavigationRuntimeError\n | NavigationCancelledError\n | BoundaryDecodeError;\n","import type { AnyRouteDefinition, RouteMatch } from \"./types\";\n\nconst normalizePathname = (pathname: string): string => {\n if (pathname.length === 0) {\n return \"/\";\n }\n const withSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (withSlash.length > 1 && withSlash.endsWith(\"/\")) {\n return withSlash.slice(0, -1);\n }\n return withSlash;\n};\n\nconst scoreRoute = (path: string): number => {\n if (path === \"/\") {\n return 10;\n }\n return path\n .split(\"/\")\n .filter((segment) => segment.length > 0)\n .reduce((score, segment) => {\n if (segment === \"*\") {\n return score;\n }\n if (segment.startsWith(\":\")) {\n return score + 2;\n }\n return score + 5;\n }, 0);\n};\n\nconst splitSegments = (path: string): readonly string[] =>\n normalizePathname(path)\n .split(\"/\")\n .filter((segment) => segment.length > 0);\n\nconst matchRoutePath = (\n routePath: string,\n pathname: string,\n): Readonly<Record<string, string>> | null => {\n const routeSegments = splitSegments(routePath);\n const pathSegments = splitSegments(pathname);\n\n const params: Record<string, string> = {};\n let i = 0;\n let j = 0;\n\n while (i < routeSegments.length && j < pathSegments.length) {\n const routeSegment = routeSegments[i]!;\n const pathSegment = pathSegments[j]!;\n\n if (routeSegment === \"*\") {\n return params;\n }\n\n if (routeSegment.startsWith(\":\")) {\n params[routeSegment.slice(1)] = decodeURIComponent(pathSegment);\n i += 1;\n j += 1;\n continue;\n }\n\n if (routeSegment !== pathSegment) {\n return null;\n }\n\n i += 1;\n j += 1;\n }\n\n if (i < routeSegments.length && routeSegments[i] === \"*\") {\n return params;\n }\n\n if (i !== routeSegments.length || j !== pathSegments.length) {\n return null;\n }\n\n return params;\n};\n\nexport interface MatchInput {\n readonly routes: readonly AnyRouteDefinition[];\n readonly pathname: string;\n readonly search: unknown;\n}\n\nexport const matchRoute = ({ routes, pathname, search }: MatchInput): RouteMatch<AnyRouteDefinition> | null => {\n const normalized = normalizePathname(pathname);\n const sorted = [...routes].sort((a, b) => scoreRoute(b.path) - scoreRoute(a.path));\n\n for (const route of sorted) {\n const params = matchRoutePath(route.path, normalized);\n if (params !== null) {\n return {\n route,\n pathname: normalized,\n params,\n search,\n };\n }\n }\n\n return null;\n};\n\nexport const buildHref = (pathname: string, searchText: string): string =>\n searchText.length > 0 ? `${normalizePathname(pathname)}${searchText}` : normalizePathname(pathname);\n\nexport const normalizeSearchText = (searchText: string): string => {\n if (searchText.length === 0 || searchText === \"?\") {\n return \"\";\n }\n return searchText.startsWith(\"?\") ? searchText : `?${searchText}`;\n};\n\nexport const parseHref = (href: string): { readonly pathname: string; readonly searchText: string } => {\n const [pathPart, ...searchParts] = href.split(\"?\");\n return {\n pathname: normalizePathname(pathPart ?? \"/\"),\n searchText: normalizeSearchText(searchParts.length === 0 ? \"\" : searchParts.join(\"?\")),\n };\n};\n","import {\n Cause,\n Context,\n Effect,\n Fiber,\n Layer,\n Option,\n Ref,\n type Schema,\n type Stream,\n SubscriptionRef,\n} from \"effect\";\nimport { Boundary } from \"../boundary\";\nimport { Telemetry } from \"../kernel/telemetry\";\nimport { buildHref, matchRoute, normalizeSearchText, parseHref } from \"./matcher\";\nimport {\n type AnyLoaderDefinition,\n type AnyRouteDefinition,\n type LoaderSnapshotEntry,\n NavigationCancelledError,\n type NavigationSnapshot,\n NavigationRuntimeError,\n} from \"./types\";\nimport type { NavigationError } from \"./types\";\n\nconst describeUnknown = (value: unknown): string => {\n if (value instanceof Error) {\n return `${value.name}: ${value.message}`;\n }\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\nconst initialSnapshot: NavigationSnapshot = {\n pathname: \"/\",\n searchText: \"\",\n href: \"/\",\n status: \"idle\",\n match: null,\n loaders: {},\n error: undefined,\n};\n\nconst toLoadersByName = (loaders: readonly AnyLoaderDefinition[]): ReadonlyMap<string, AnyLoaderDefinition> =>\n new Map(loaders.map((loader) => [loader.name, loader] as const));\n\nconst planLoaderBatches = (\n loaders: readonly AnyLoaderDefinition[],\n): Effect.Effect<readonly (readonly AnyLoaderDefinition[])[], NavigationRuntimeError, never> => {\n const byName = toLoadersByName(loaders);\n const depthByName = new Map<string, number>();\n const visiting = new Set<string>();\n\n const resolveDepth = (name: string): Effect.Effect<number, NavigationRuntimeError, never> => {\n const cached = depthByName.get(name);\n if (cached !== undefined) {\n return Effect.succeed(cached);\n }\n\n if (visiting.has(name)) {\n return Effect.fail(new NavigationRuntimeError(`Cyclic loader dependency detected at ${name}`));\n }\n\n const loader = byName.get(name);\n if (loader === undefined) {\n return Effect.fail(new NavigationRuntimeError(`Loader dependency '${name}' is not registered`));\n }\n\n visiting.add(name);\n\n const dependencies = loader.dependsOn ?? [];\n return Effect.forEach(dependencies, resolveDepth).pipe(\n Effect.map((depths) => {\n const depth = depths.length === 0 ? 0 : Math.max(...depths) + 1;\n depthByName.set(name, depth);\n visiting.delete(name);\n return depth;\n }),\n Effect.catchAll((error) => {\n visiting.delete(name);\n return Effect.fail(error);\n }),\n );\n };\n\n return Effect.gen(function* () {\n const entries = yield* Effect.forEach(loaders, (loader) =>\n Effect.map(resolveDepth(loader.name), (depth) => [depth, loader] as const),\n );\n\n const grouped = new Map<number, AnyLoaderDefinition[]>();\n for (const [depth, loader] of entries) {\n const existing = grouped.get(depth);\n if (existing === undefined) {\n grouped.set(depth, [loader]);\n } else {\n existing.push(loader);\n }\n }\n\n const depths = Array.from(grouped.keys()).sort((a, b) => a - b);\n return depths.map((depth) => grouped.get(depth) ?? []);\n });\n};\n\nexport interface NavigationService {\n readonly navigate: (href: string) => Effect.Effect<NavigationSnapshot, NavigationError, never>;\n readonly revalidate: () => Effect.Effect<NavigationSnapshot, NavigationError, never>;\n readonly getSnapshot: Effect.Effect<NavigationSnapshot, never, never>;\n readonly hydrateSnapshot: (snapshot: NavigationSnapshot) => Effect.Effect<void, never, never>;\n readonly snapshots: Stream.Stream<NavigationSnapshot>;\n}\n\nexport class Navigation extends Context.Tag(\"EffectReact/Navigation\")<\n Navigation,\n NavigationService\n>() {}\n\nexport interface MakeNavigationLayerOptions {\n readonly routes: readonly AnyRouteDefinition[];\n readonly loaders?: readonly AnyLoaderDefinition[];\n readonly initialHref?: string;\n}\n\nexport const makeNavigationLayer = (\n options: MakeNavigationLayerOptions,\n): Layer.Layer<Navigation, never, Boundary | Telemetry> => {\n const loaders = options.loaders ?? [];\n const initial = parseHref(options.initialHref ?? \"/\");\n\n return Layer.effect(\n Navigation,\n Effect.gen(function* () {\n const boundary = yield* Boundary;\n const telemetry = yield* Telemetry;\n const snapshotsRef = yield* SubscriptionRef.make<NavigationSnapshot>({\n ...initialSnapshot,\n pathname: initial.pathname,\n searchText: initial.searchText,\n href: buildHref(initial.pathname, initial.searchText),\n });\n const activeFiberRef = yield* Ref.make<Option.Option<Fiber.RuntimeFiber<NavigationSnapshot, NavigationError>>>(Option.none());\n\n const runLoaders = (\n snapshot: NavigationSnapshot,\n ): Effect.Effect<Readonly<Record<string, LoaderSnapshotEntry>>, NavigationRuntimeError, never> =>\n Effect.gen(function* () {\n if (snapshot.match === null) {\n return {};\n }\n\n const routeLoaders = loaders.filter((loader) => loader.routeId === snapshot.match!.route.id);\n if (routeLoaders.length === 0) {\n return {};\n }\n\n const batches = yield* planLoaderBatches(routeLoaders);\n const results: Record<string, unknown> = {};\n const states: Record<string, LoaderSnapshotEntry> = {};\n\n for (const loader of routeLoaders) {\n states[loader.name] = { _tag: \"pending\" };\n }\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n loaders: {\n ...current.loaders,\n ...states,\n },\n }));\n\n for (const batch of batches) {\n const exits = yield* Effect.all(\n batch.map((loader) => {\n const base = loader.run({\n route: snapshot.match!.route,\n pathname: snapshot.pathname,\n searchText: snapshot.searchText,\n params: snapshot.match!.params,\n search: snapshot.match!.search,\n dependencyResults: results,\n });\n\n const withRetry = loader.retry ? Effect.retry(base, loader.retry) : base;\n return Effect.exit(withRetry).pipe(Effect.map((exit) => [loader, exit] as const));\n }),\n {\n concurrency: \"unbounded\",\n },\n );\n\n for (const [loader, exit] of exits) {\n if (exit._tag === \"Success\") {\n results[loader.name] = exit.value;\n states[loader.name] = {\n _tag: \"success\",\n value: exit.value,\n };\n continue;\n }\n\n const failure = Cause.failureOption(exit.cause);\n states[loader.name] = {\n _tag: \"failure\",\n error: failure._tag === \"Some\" ? failure.value : Cause.pretty(exit.cause),\n };\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n status: \"failure\",\n loaders: {\n ...current.loaders,\n ...states,\n },\n error: states[loader.name],\n }) satisfies NavigationSnapshot);\n\n return yield* Effect.fail(\n new NavigationRuntimeError(`Loader '${loader.name}' failed for route '${snapshot.match!.route.id}'`),\n );\n }\n\n yield* SubscriptionRef.update(snapshotsRef, (current) => ({\n ...current,\n loaders: {\n ...current.loaders,\n ...states,\n },\n }) satisfies NavigationSnapshot);\n }\n\n return states;\n });\n\n const performNavigation = (\n href: string,\n ): Effect.Effect<NavigationSnapshot, NavigationError, never> =>\n Effect.gen(function* () {\n const { pathname, searchText } = parseHref(href);\n const searchParams = new URLSearchParams(searchText);\n\n const candidate = options.routes.find((route) => matchRoute({\n routes: [route],\n pathname,\n search: {},\n }) !== null);\n\n const decodedSearch =\n candidate?.search === undefined\n ? Effect.succeed({} as unknown)\n : boundary.decodeUnknown({\n source: `route:${candidate.id}:search`,\n schema: candidate.search as Schema.Schema<unknown, unknown, never>,\n value: Object.fromEntries(searchParams.entries()),\n });\n\n const search = yield* decodedSearch;\n const matched = matchRoute({\n routes: options.routes,\n pathname,\n search,\n });\n\n if (matched === null) {\n return yield* Effect.fail(\n new NavigationRuntimeError(`No route matched pathname '${pathname}'`),\n );\n }\n\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"start\",\n pathname,\n routeId: matched.route.id,\n timestamp: Date.now(),\n });\n\n const loadingSnapshot: NavigationSnapshot = {\n pathname,\n searchText: normalizeSearchText(searchText),\n href: buildHref(pathname, normalizeSearchText(searchText)),\n status: \"loading\",\n match: matched,\n loaders: {},\n error: undefined,\n };\n\n yield* SubscriptionRef.set(snapshotsRef, loadingSnapshot);\n\n const loaderStates = yield* runLoaders(loadingSnapshot);\n\n const completed: NavigationSnapshot = {\n ...loadingSnapshot,\n status: \"success\",\n loaders: loaderStates,\n error: undefined,\n };\n\n yield* SubscriptionRef.set(snapshotsRef, completed);\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"success\",\n pathname,\n routeId: matched.route.id,\n timestamp: Date.now(),\n });\n\n return completed;\n });\n\n const navigate: NavigationService[\"navigate\"] = (href) =>\n Effect.gen(function* () {\n const previous = yield* Ref.getAndSet(activeFiberRef, Option.none());\n if (Option.isSome(previous)) {\n yield* Fiber.interrupt(previous.value);\n yield* telemetry.emit({\n _tag: \"navigation\",\n phase: \"cancel\",\n pathname: href,\n timestamp: Date.now(),\n });\n }\n\n const fiber = yield* Effect.fork(performNavigation(href));\n yield* Ref.set(activeFiberRef, Option.some(fiber));\n\n const exit = yield* Effect.exit(Fiber.join(fiber));\n\n const current = yield* Ref.get(activeFiberRef);\n if (Option.isSome(current) && current.value === fiber) {\n yield* Ref.set(activeFiberRef, Option.none());\n }\n\n if (exit._tag === \"Success\") {\n return exit.value;\n }\n\n if (Cause.isInterruptedOnly(exit.cause)) {\n return yield* Effect.fail(new NavigationCancelledError(href));\n }\n\n const failure = Cause.failureOption(exit.cause);\n if (failure._tag === \"Some\") {\n return yield* Effect.fail(\n failure.value instanceof NavigationRuntimeError\n ? failure.value\n : new NavigationRuntimeError(describeUnknown(failure.value)),\n );\n }\n\n return yield* Effect.fail(new NavigationRuntimeError(Cause.pretty(exit.cause)));\n }).pipe(\n Effect.tapError((error) =>\n telemetry.emit({\n _tag: \"navigation\",\n phase: \"failure\",\n pathname: href,\n timestamp: Date.now(),\n detail: error,\n }),\n ),\n );\n\n const revalidate: NavigationService[\"revalidate\"] =\n () =>\n Effect.gen(function* () {\n const snapshot = yield* SubscriptionRef.get(snapshotsRef);\n return yield* navigate(snapshot.href);\n });\n\n return {\n navigate,\n revalidate,\n getSnapshot: SubscriptionRef.get(snapshotsRef),\n hydrateSnapshot: (snapshot) => SubscriptionRef.set(snapshotsRef, snapshot),\n snapshots: snapshotsRef.changes,\n } satisfies NavigationService;\n }),\n );\n};\n\nexport const navigateTo = (\n href: string,\n): Effect.Effect<NavigationSnapshot, NavigationError, Navigation> =>\n Effect.flatMap(Navigation, (service) => service.navigate(href));\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","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","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":["import_effect","import_effect","import_effect","import_effect","import_effect","fetch","import_effect","initialSnapshot","import_effect"]}
@@ -0,0 +1,4 @@
1
+ export * from "./app";
2
+ export * from "./cache";
3
+ export * from "./contracts";
4
+ export * from "./manifest";
@@ -0,0 +1,35 @@
1
+ import {
2
+ cachePolicy,
3
+ createApp,
4
+ defineAction,
5
+ defineLayout,
6
+ defineManifest,
7
+ defineMiddleware,
8
+ definePage,
9
+ loadersFromManifest,
10
+ noStore,
11
+ routesFromManifest
12
+ } from "../chunk-XIBEKS5A.js";
13
+ import "../chunk-C5JI7D7W.js";
14
+ import {
15
+ defineLoader,
16
+ defineRoute
17
+ } from "../chunk-O7XTA7H3.js";
18
+ import "../chunk-YG22YP5K.js";
19
+ import "../chunk-WPV3WFMS.js";
20
+ import "../chunk-SKC3HMF3.js";
21
+ export {
22
+ cachePolicy,
23
+ createApp,
24
+ defineAction,
25
+ defineLayout,
26
+ defineLoader,
27
+ defineManifest,
28
+ defineMiddleware,
29
+ definePage,
30
+ defineRoute,
31
+ loadersFromManifest,
32
+ noStore,
33
+ routesFromManifest
34
+ };
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,12 @@
1
+ import type { AnyActionDefinition } from "../actions";
2
+ import type { AnyLoaderDefinition, AnyRouteDefinition } from "../navigation";
3
+ import type { AnyPageDefinition, LayoutDefinition, MiddlewareDefinition } from "./contracts";
4
+ export interface AppManifest {
5
+ readonly pages: readonly AnyPageDefinition[];
6
+ readonly actions?: readonly AnyActionDefinition[];
7
+ readonly layouts?: readonly LayoutDefinition[];
8
+ readonly middleware?: MiddlewareDefinition;
9
+ }
10
+ export declare const defineManifest: (manifest: AppManifest) => AppManifest;
11
+ export declare const routesFromManifest: (manifest: AppManifest) => readonly AnyRouteDefinition[];
12
+ export declare const loadersFromManifest: (manifest: AppManifest) => readonly AnyLoaderDefinition[];
@@ -0,0 +1,13 @@
1
+ import type { Plugin } from "vite";
2
+ export interface EffectReactVitePluginOptions {
3
+ readonly appDir?: string;
4
+ readonly virtualManifestId?: string;
5
+ }
6
+ export interface DiscoveredAppModules {
7
+ readonly pages: readonly string[];
8
+ readonly layouts: readonly string[];
9
+ readonly actions: readonly string[];
10
+ readonly middleware?: string;
11
+ }
12
+ export declare const discoverAppModules: (root: string, appDir?: string) => Promise<DiscoveredAppModules>;
13
+ export declare const effectReactVitePlugin: (options?: EffectReactVitePluginOptions) => Plugin;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/framework-vite/index.ts
31
+ var framework_vite_exports = {};
32
+ __export(framework_vite_exports, {
33
+ discoverAppModules: () => discoverAppModules,
34
+ effectReactVitePlugin: () => effectReactVitePlugin
35
+ });
36
+ module.exports = __toCommonJS(framework_vite_exports);
37
+
38
+ // src/framework/vite.ts
39
+ var import_promises = require("fs/promises");
40
+ var import_node_path = __toESM(require("path"), 1);
41
+ var normalize = (value) => value.split(import_node_path.default.sep).join("/");
42
+ var hasSuffix = (value, suffixes) => suffixes.some((suffix) => value.endsWith(suffix));
43
+ var collectFiles = async (directory) => {
44
+ const entries = await (0, import_promises.readdir)(directory, {
45
+ withFileTypes: true
46
+ });
47
+ const files = [];
48
+ for (const entry of entries) {
49
+ const absolute = import_node_path.default.join(directory, entry.name);
50
+ if (entry.isDirectory()) {
51
+ const nested = await collectFiles(absolute);
52
+ files.push(...nested);
53
+ continue;
54
+ }
55
+ if (entry.isFile()) {
56
+ files.push(absolute);
57
+ }
58
+ }
59
+ return files;
60
+ };
61
+ var discoverAppModules = async (root, appDir = "app") => {
62
+ const absoluteAppDir = import_node_path.default.resolve(root, appDir);
63
+ const files = await collectFiles(absoluteAppDir);
64
+ const relative = files.map((file) => normalize(import_node_path.default.relative(root, file)));
65
+ const pages = relative.filter(
66
+ (file) => hasSuffix(file, ["/page.tsx", "/page.ts", "/page.jsx", "/page.js"])
67
+ );
68
+ const layouts = relative.filter(
69
+ (file) => hasSuffix(file, ["/layout.tsx", "/layout.ts", "/layout.jsx", "/layout.js"])
70
+ );
71
+ const actions = relative.filter(
72
+ (file) => file.startsWith(`${normalize(appDir)}/actions/`) && hasSuffix(file, [".ts", ".tsx", ".js", ".jsx"])
73
+ );
74
+ const middleware = relative.find(
75
+ (file) => [
76
+ `${normalize(appDir)}/middleware.ts`,
77
+ `${normalize(appDir)}/middleware.tsx`,
78
+ `${normalize(appDir)}/middleware.js`,
79
+ `${normalize(appDir)}/middleware.jsx`
80
+ ].includes(file)
81
+ );
82
+ return {
83
+ pages,
84
+ layouts,
85
+ actions,
86
+ ...middleware !== void 0 ? { middleware } : {}
87
+ };
88
+ };
89
+ var toImportPath = (value) => `/${normalize(value)}`;
90
+ var buildManifestModule = (modules) => {
91
+ const lines = [
92
+ "import { defineManifest } from '@rikalabs/effect-react/framework';"
93
+ ];
94
+ modules.pages.forEach((modulePath, index) => {
95
+ lines.push(`import * as PageModule${String(index)} from '${toImportPath(modulePath)}';`);
96
+ });
97
+ modules.actions.forEach((modulePath, index) => {
98
+ lines.push(`import * as ActionModule${String(index)} from '${toImportPath(modulePath)}';`);
99
+ });
100
+ modules.layouts.forEach((modulePath, index) => {
101
+ lines.push(`import * as LayoutModule${String(index)} from '${toImportPath(modulePath)}';`);
102
+ });
103
+ if (modules.middleware !== void 0) {
104
+ lines.push(`import MiddlewareModule from '${toImportPath(modules.middleware)}';`);
105
+ }
106
+ lines.push(
107
+ "",
108
+ "const pages = [",
109
+ ...modules.pages.map(
110
+ (_, index) => ` PageModule${String(index)}.default ?? PageModule${String(index)}.page,`
111
+ ),
112
+ "];",
113
+ "",
114
+ "const actions = [",
115
+ ...modules.actions.map(
116
+ (_, index) => ` ...Object.values(ActionModule${String(index)}).filter((value) => typeof value === 'object' && value !== null && 'name' in value),`
117
+ ),
118
+ "];",
119
+ "",
120
+ "const layouts = [",
121
+ ...modules.layouts.map(
122
+ (_, index) => ` LayoutModule${String(index)}.default ?? LayoutModule${String(index)}.layout,`
123
+ ),
124
+ "];",
125
+ "",
126
+ "export default defineManifest({",
127
+ " pages,",
128
+ " actions,",
129
+ " layouts,",
130
+ ...modules.middleware !== void 0 ? [" middleware: MiddlewareModule,"] : [],
131
+ "});"
132
+ );
133
+ return `${lines.join("\n")}
134
+ `;
135
+ };
136
+ var effectReactVitePlugin = (options = {}) => {
137
+ const appDir = options.appDir ?? "app";
138
+ const virtualManifestId = options.virtualManifestId ?? "virtual:effect-react/manifest";
139
+ const resolvedManifestId = `\0${virtualManifestId}`;
140
+ return {
141
+ name: "effect-react-framework",
142
+ enforce: "pre",
143
+ resolveId(id) {
144
+ if (id === virtualManifestId) {
145
+ return resolvedManifestId;
146
+ }
147
+ return null;
148
+ },
149
+ async load(id) {
150
+ if (id !== resolvedManifestId) {
151
+ return null;
152
+ }
153
+ const discovered = await discoverAppModules(process.cwd(), appDir);
154
+ return buildManifestModule(discovered);
155
+ }
156
+ };
157
+ };
158
+ // Annotate the CommonJS export names for ESM import in node:
159
+ 0 && (module.exports = {
160
+ discoverAppModules,
161
+ effectReactVitePlugin
162
+ });
163
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/framework-vite/index.ts","../../src/framework/vite.ts"],"sourcesContent":["export {\n discoverAppModules,\n effectReactVitePlugin,\n type DiscoveredAppModules,\n type EffectReactVitePluginOptions,\n} from \"../framework/vite\";\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nexport interface EffectReactVitePluginOptions {\n readonly appDir?: string;\n readonly virtualManifestId?: string;\n}\n\nexport interface DiscoveredAppModules {\n readonly pages: readonly string[];\n readonly layouts: readonly string[];\n readonly actions: readonly string[];\n readonly middleware?: string;\n}\n\nconst normalize = (value: string): string => value.split(path.sep).join(\"/\");\n\nconst hasSuffix = (value: string, suffixes: readonly string[]): boolean =>\n suffixes.some((suffix) => value.endsWith(suffix));\n\nconst collectFiles = async (directory: string): Promise<readonly string[]> => {\n const entries = await readdir(directory, {\n withFileTypes: true,\n });\n\n const files: string[] = [];\n for (const entry of entries) {\n const absolute = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n const nested = await collectFiles(absolute);\n files.push(...nested);\n continue;\n }\n\n if (entry.isFile()) {\n files.push(absolute);\n }\n }\n\n return files;\n};\n\nexport const discoverAppModules = async (\n root: string,\n appDir = \"app\",\n): Promise<DiscoveredAppModules> => {\n const absoluteAppDir = path.resolve(root, appDir);\n const files = await collectFiles(absoluteAppDir);\n\n const relative = files.map((file) => normalize(path.relative(root, file)));\n\n const pages = relative.filter((file) =>\n hasSuffix(file, [\"/page.tsx\", \"/page.ts\", \"/page.jsx\", \"/page.js\"]),\n );\n\n const layouts = relative.filter((file) =>\n hasSuffix(file, [\"/layout.tsx\", \"/layout.ts\", \"/layout.jsx\", \"/layout.js\"]),\n );\n\n const actions = relative.filter((file) =>\n file.startsWith(`${normalize(appDir)}/actions/`) &&\n hasSuffix(file, [\".ts\", \".tsx\", \".js\", \".jsx\"]),\n );\n\n const middleware = relative.find((file) =>\n [\n `${normalize(appDir)}/middleware.ts`,\n `${normalize(appDir)}/middleware.tsx`,\n `${normalize(appDir)}/middleware.js`,\n `${normalize(appDir)}/middleware.jsx`,\n ].includes(file),\n );\n\n return {\n pages,\n layouts,\n actions,\n ...(middleware !== undefined ? { middleware } : {}),\n };\n};\n\nconst toImportPath = (value: string): string => `/${normalize(value)}`;\n\nconst buildManifestModule = (modules: DiscoveredAppModules): string => {\n const lines: string[] = [\n \"import { defineManifest } from '@rikalabs/effect-react/framework';\",\n ];\n\n modules.pages.forEach((modulePath, index) => {\n lines.push(`import * as PageModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n modules.actions.forEach((modulePath, index) => {\n lines.push(`import * as ActionModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n modules.layouts.forEach((modulePath, index) => {\n lines.push(`import * as LayoutModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n if (modules.middleware !== undefined) {\n lines.push(`import MiddlewareModule from '${toImportPath(modules.middleware)}';`);\n }\n\n lines.push(\n \"\",\n \"const pages = [\",\n ...modules.pages.map((_, index) =>\n ` PageModule${String(index)}.default ?? PageModule${String(index)}.page,`,\n ),\n \"];\",\n \"\",\n \"const actions = [\",\n ...modules.actions.map((_, index) =>\n ` ...Object.values(ActionModule${String(index)}).filter((value) => typeof value === 'object' && value !== null && 'name' in value),`,\n ),\n \"];\",\n \"\",\n \"const layouts = [\",\n ...modules.layouts.map((_, index) =>\n ` LayoutModule${String(index)}.default ?? LayoutModule${String(index)}.layout,`,\n ),\n \"];\",\n \"\",\n \"export default defineManifest({\",\n \" pages,\",\n \" actions,\",\n \" layouts,\",\n ...(modules.middleware !== undefined ? [\" middleware: MiddlewareModule,\"] : []),\n \"});\",\n );\n\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nexport const effectReactVitePlugin = (\n options: EffectReactVitePluginOptions = {},\n): Plugin => {\n const appDir = options.appDir ?? \"app\";\n const virtualManifestId = options.virtualManifestId ?? \"virtual:effect-react/manifest\";\n const resolvedManifestId = `\\0${virtualManifestId}`;\n\n return {\n name: \"effect-react-framework\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === virtualManifestId) {\n return resolvedManifestId;\n }\n return null;\n },\n async load(id) {\n if (id !== resolvedManifestId) {\n return null;\n }\n\n const discovered = await discoverAppModules(process.cwd(), appDir);\n return buildManifestModule(discovered);\n },\n };\n};\n"],"mappings":"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","names":["path"]}
@@ -0,0 +1 @@
1
+ export { discoverAppModules, effectReactVitePlugin, type DiscoveredAppModules, type EffectReactVitePluginOptions, } from "../framework/vite";
@@ -0,0 +1,125 @@
1
+ // src/framework/vite.ts
2
+ import { readdir } from "fs/promises";
3
+ import path from "path";
4
+ var normalize = (value) => value.split(path.sep).join("/");
5
+ var hasSuffix = (value, suffixes) => suffixes.some((suffix) => value.endsWith(suffix));
6
+ var collectFiles = async (directory) => {
7
+ const entries = await readdir(directory, {
8
+ withFileTypes: true
9
+ });
10
+ const files = [];
11
+ for (const entry of entries) {
12
+ const absolute = path.join(directory, entry.name);
13
+ if (entry.isDirectory()) {
14
+ const nested = await collectFiles(absolute);
15
+ files.push(...nested);
16
+ continue;
17
+ }
18
+ if (entry.isFile()) {
19
+ files.push(absolute);
20
+ }
21
+ }
22
+ return files;
23
+ };
24
+ var discoverAppModules = async (root, appDir = "app") => {
25
+ const absoluteAppDir = path.resolve(root, appDir);
26
+ const files = await collectFiles(absoluteAppDir);
27
+ const relative = files.map((file) => normalize(path.relative(root, file)));
28
+ const pages = relative.filter(
29
+ (file) => hasSuffix(file, ["/page.tsx", "/page.ts", "/page.jsx", "/page.js"])
30
+ );
31
+ const layouts = relative.filter(
32
+ (file) => hasSuffix(file, ["/layout.tsx", "/layout.ts", "/layout.jsx", "/layout.js"])
33
+ );
34
+ const actions = relative.filter(
35
+ (file) => file.startsWith(`${normalize(appDir)}/actions/`) && hasSuffix(file, [".ts", ".tsx", ".js", ".jsx"])
36
+ );
37
+ const middleware = relative.find(
38
+ (file) => [
39
+ `${normalize(appDir)}/middleware.ts`,
40
+ `${normalize(appDir)}/middleware.tsx`,
41
+ `${normalize(appDir)}/middleware.js`,
42
+ `${normalize(appDir)}/middleware.jsx`
43
+ ].includes(file)
44
+ );
45
+ return {
46
+ pages,
47
+ layouts,
48
+ actions,
49
+ ...middleware !== void 0 ? { middleware } : {}
50
+ };
51
+ };
52
+ var toImportPath = (value) => `/${normalize(value)}`;
53
+ var buildManifestModule = (modules) => {
54
+ const lines = [
55
+ "import { defineManifest } from '@rikalabs/effect-react/framework';"
56
+ ];
57
+ modules.pages.forEach((modulePath, index) => {
58
+ lines.push(`import * as PageModule${String(index)} from '${toImportPath(modulePath)}';`);
59
+ });
60
+ modules.actions.forEach((modulePath, index) => {
61
+ lines.push(`import * as ActionModule${String(index)} from '${toImportPath(modulePath)}';`);
62
+ });
63
+ modules.layouts.forEach((modulePath, index) => {
64
+ lines.push(`import * as LayoutModule${String(index)} from '${toImportPath(modulePath)}';`);
65
+ });
66
+ if (modules.middleware !== void 0) {
67
+ lines.push(`import MiddlewareModule from '${toImportPath(modules.middleware)}';`);
68
+ }
69
+ lines.push(
70
+ "",
71
+ "const pages = [",
72
+ ...modules.pages.map(
73
+ (_, index) => ` PageModule${String(index)}.default ?? PageModule${String(index)}.page,`
74
+ ),
75
+ "];",
76
+ "",
77
+ "const actions = [",
78
+ ...modules.actions.map(
79
+ (_, index) => ` ...Object.values(ActionModule${String(index)}).filter((value) => typeof value === 'object' && value !== null && 'name' in value),`
80
+ ),
81
+ "];",
82
+ "",
83
+ "const layouts = [",
84
+ ...modules.layouts.map(
85
+ (_, index) => ` LayoutModule${String(index)}.default ?? LayoutModule${String(index)}.layout,`
86
+ ),
87
+ "];",
88
+ "",
89
+ "export default defineManifest({",
90
+ " pages,",
91
+ " actions,",
92
+ " layouts,",
93
+ ...modules.middleware !== void 0 ? [" middleware: MiddlewareModule,"] : [],
94
+ "});"
95
+ );
96
+ return `${lines.join("\n")}
97
+ `;
98
+ };
99
+ var effectReactVitePlugin = (options = {}) => {
100
+ const appDir = options.appDir ?? "app";
101
+ const virtualManifestId = options.virtualManifestId ?? "virtual:effect-react/manifest";
102
+ const resolvedManifestId = `\0${virtualManifestId}`;
103
+ return {
104
+ name: "effect-react-framework",
105
+ enforce: "pre",
106
+ resolveId(id) {
107
+ if (id === virtualManifestId) {
108
+ return resolvedManifestId;
109
+ }
110
+ return null;
111
+ },
112
+ async load(id) {
113
+ if (id !== resolvedManifestId) {
114
+ return null;
115
+ }
116
+ const discovered = await discoverAppModules(process.cwd(), appDir);
117
+ return buildManifestModule(discovered);
118
+ }
119
+ };
120
+ };
121
+ export {
122
+ discoverAppModules,
123
+ effectReactVitePlugin
124
+ };
125
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/framework/vite.ts"],"sourcesContent":["import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Plugin } from \"vite\";\n\nexport interface EffectReactVitePluginOptions {\n readonly appDir?: string;\n readonly virtualManifestId?: string;\n}\n\nexport interface DiscoveredAppModules {\n readonly pages: readonly string[];\n readonly layouts: readonly string[];\n readonly actions: readonly string[];\n readonly middleware?: string;\n}\n\nconst normalize = (value: string): string => value.split(path.sep).join(\"/\");\n\nconst hasSuffix = (value: string, suffixes: readonly string[]): boolean =>\n suffixes.some((suffix) => value.endsWith(suffix));\n\nconst collectFiles = async (directory: string): Promise<readonly string[]> => {\n const entries = await readdir(directory, {\n withFileTypes: true,\n });\n\n const files: string[] = [];\n for (const entry of entries) {\n const absolute = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n const nested = await collectFiles(absolute);\n files.push(...nested);\n continue;\n }\n\n if (entry.isFile()) {\n files.push(absolute);\n }\n }\n\n return files;\n};\n\nexport const discoverAppModules = async (\n root: string,\n appDir = \"app\",\n): Promise<DiscoveredAppModules> => {\n const absoluteAppDir = path.resolve(root, appDir);\n const files = await collectFiles(absoluteAppDir);\n\n const relative = files.map((file) => normalize(path.relative(root, file)));\n\n const pages = relative.filter((file) =>\n hasSuffix(file, [\"/page.tsx\", \"/page.ts\", \"/page.jsx\", \"/page.js\"]),\n );\n\n const layouts = relative.filter((file) =>\n hasSuffix(file, [\"/layout.tsx\", \"/layout.ts\", \"/layout.jsx\", \"/layout.js\"]),\n );\n\n const actions = relative.filter((file) =>\n file.startsWith(`${normalize(appDir)}/actions/`) &&\n hasSuffix(file, [\".ts\", \".tsx\", \".js\", \".jsx\"]),\n );\n\n const middleware = relative.find((file) =>\n [\n `${normalize(appDir)}/middleware.ts`,\n `${normalize(appDir)}/middleware.tsx`,\n `${normalize(appDir)}/middleware.js`,\n `${normalize(appDir)}/middleware.jsx`,\n ].includes(file),\n );\n\n return {\n pages,\n layouts,\n actions,\n ...(middleware !== undefined ? { middleware } : {}),\n };\n};\n\nconst toImportPath = (value: string): string => `/${normalize(value)}`;\n\nconst buildManifestModule = (modules: DiscoveredAppModules): string => {\n const lines: string[] = [\n \"import { defineManifest } from '@rikalabs/effect-react/framework';\",\n ];\n\n modules.pages.forEach((modulePath, index) => {\n lines.push(`import * as PageModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n modules.actions.forEach((modulePath, index) => {\n lines.push(`import * as ActionModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n modules.layouts.forEach((modulePath, index) => {\n lines.push(`import * as LayoutModule${String(index)} from '${toImportPath(modulePath)}';`);\n });\n\n if (modules.middleware !== undefined) {\n lines.push(`import MiddlewareModule from '${toImportPath(modules.middleware)}';`);\n }\n\n lines.push(\n \"\",\n \"const pages = [\",\n ...modules.pages.map((_, index) =>\n ` PageModule${String(index)}.default ?? PageModule${String(index)}.page,`,\n ),\n \"];\",\n \"\",\n \"const actions = [\",\n ...modules.actions.map((_, index) =>\n ` ...Object.values(ActionModule${String(index)}).filter((value) => typeof value === 'object' && value !== null && 'name' in value),`,\n ),\n \"];\",\n \"\",\n \"const layouts = [\",\n ...modules.layouts.map((_, index) =>\n ` LayoutModule${String(index)}.default ?? LayoutModule${String(index)}.layout,`,\n ),\n \"];\",\n \"\",\n \"export default defineManifest({\",\n \" pages,\",\n \" actions,\",\n \" layouts,\",\n ...(modules.middleware !== undefined ? [\" middleware: MiddlewareModule,\"] : []),\n \"});\",\n );\n\n return `${lines.join(\"\\n\")}\\n`;\n};\n\nexport const effectReactVitePlugin = (\n options: EffectReactVitePluginOptions = {},\n): Plugin => {\n const appDir = options.appDir ?? \"app\";\n const virtualManifestId = options.virtualManifestId ?? \"virtual:effect-react/manifest\";\n const resolvedManifestId = `\\0${virtualManifestId}`;\n\n return {\n name: \"effect-react-framework\",\n enforce: \"pre\",\n resolveId(id) {\n if (id === virtualManifestId) {\n return resolvedManifestId;\n }\n return null;\n },\n async load(id) {\n if (id !== resolvedManifestId) {\n return null;\n }\n\n const discovered = await discoverAppModules(process.cwd(), appDir);\n return buildManifestModule(discovered);\n },\n };\n};\n"],"mappings":"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","names":[]}
@@ -0,0 +1,8 @@
1
+ import type { GridColumn, GridColumnId, GridFilter, GridPage, GridPagination, GridRowProjection, GridSort } from "./types";
2
+ export declare const defineColumns: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[] = readonly GridColumn<Row, string, unknown>[]>(columns: Columns) => Columns;
3
+ export declare const projectRow: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(row: Row, columns: Columns) => GridRowProjection<Columns>;
4
+ export declare const projectRows: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(rows: readonly Row[], columns: Columns) => readonly GridRowProjection<Columns>[];
5
+ export declare const mapRows: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(rows: readonly Row[], columns: Columns) => readonly GridRowProjection<Columns>[];
6
+ export declare const sortRows: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(rows: readonly Row[], columns: Columns, sorts: readonly GridSort<GridColumnId<Columns>>[]) => readonly Row[];
7
+ export declare const filterRows: <Row, const Columns extends readonly GridColumn<Row, string, unknown>[]>(rows: readonly Row[], columns: Columns, filters: readonly GridFilter<GridColumnId<Columns>>[]) => readonly Row[];
8
+ export declare const paginateRows: <Row>(rows: readonly Row[], pagination: GridPagination) => GridPage<Row>;