@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.
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/dist/actions/http.d.ts +18 -0
- package/dist/actions/index.d.ts +4 -0
- package/dist/actions/react.d.ts +7 -0
- package/dist/actions/service.d.ts +18 -0
- package/dist/actions/types.d.ts +33 -0
- package/dist/boundary/codecs.d.ts +40 -0
- package/dist/boundary/errors.d.ts +22 -0
- package/dist/boundary/index.d.ts +2 -0
- package/dist/chunk-2GIUCKL2.js +16 -0
- package/dist/chunk-2GIUCKL2.js.map +1 -0
- package/dist/chunk-2TG7YEVD.js +11 -0
- package/dist/chunk-2TG7YEVD.js.map +1 -0
- package/dist/chunk-6FI4ROTW.js +152 -0
- package/dist/chunk-6FI4ROTW.js.map +1 -0
- package/dist/chunk-C5JI7D7W.js +213 -0
- package/dist/chunk-C5JI7D7W.js.map +1 -0
- package/dist/chunk-EEYASTXR.js +99 -0
- package/dist/chunk-EEYASTXR.js.map +1 -0
- package/dist/chunk-H7MOLKTU.js +301 -0
- package/dist/chunk-H7MOLKTU.js.map +1 -0
- package/dist/chunk-IVIYY6S5.js +77 -0
- package/dist/chunk-IVIYY6S5.js.map +1 -0
- package/dist/chunk-JKN75OYC.js +87 -0
- package/dist/chunk-JKN75OYC.js.map +1 -0
- package/dist/chunk-M2CJG6T7.js +24 -0
- package/dist/chunk-M2CJG6T7.js.map +1 -0
- package/dist/chunk-MDGEGQZB.js +206 -0
- package/dist/chunk-MDGEGQZB.js.map +1 -0
- package/dist/chunk-NI2GNZ7S.js +78 -0
- package/dist/chunk-NI2GNZ7S.js.map +1 -0
- package/dist/chunk-O7XTA7H3.js +423 -0
- package/dist/chunk-O7XTA7H3.js.map +1 -0
- package/dist/chunk-S67FHWAR.js +88 -0
- package/dist/chunk-S67FHWAR.js.map +1 -0
- package/dist/chunk-SKC3HMF3.js +17 -0
- package/dist/chunk-SKC3HMF3.js.map +1 -0
- package/dist/chunk-TUJZ6XJY.js +127 -0
- package/dist/chunk-TUJZ6XJY.js.map +1 -0
- package/dist/chunk-WPV3WFMS.js +38 -0
- package/dist/chunk-WPV3WFMS.js.map +1 -0
- package/dist/chunk-XIBEKS5A.js +301 -0
- package/dist/chunk-XIBEKS5A.js.map +1 -0
- package/dist/chunk-YG22YP5K.js +68 -0
- package/dist/chunk-YG22YP5K.js.map +1 -0
- package/dist/chunk-ZMZQBREU.js +262 -0
- package/dist/chunk-ZMZQBREU.js.map +1 -0
- package/dist/client/index.cjs +191 -0
- package/dist/client/index.cjs.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.js +14 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/index.cjs +63 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.ts +32 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/data/react.d.ts +10 -0
- package/dist/data/service.d.ts +20 -0
- package/dist/data/types.d.ts +31 -0
- package/dist/devtools/events.d.ts +37 -0
- package/dist/devtools/index.cjs +149 -0
- package/dist/devtools/index.cjs.map +1 -0
- package/dist/devtools/index.d.ts +2 -0
- package/dist/devtools/index.js +18 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/devtools/react.d.ts +8 -0
- package/dist/form/index.cjs +301 -0
- package/dist/form/index.cjs.map +1 -0
- package/dist/form/index.d.ts +3 -0
- package/dist/form/index.js +14 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/react.d.ts +9 -0
- package/dist/form/service.d.ts +3 -0
- package/dist/form/types.d.ts +41 -0
- package/dist/framework/app.d.ts +21 -0
- package/dist/framework/cache.d.ts +10 -0
- package/dist/framework/contracts.d.ts +32 -0
- package/dist/framework/index.cjs +1006 -0
- package/dist/framework/index.cjs.map +1 -0
- package/dist/framework/index.d.ts +4 -0
- package/dist/framework/index.js +35 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/manifest.d.ts +12 -0
- package/dist/framework/vite.d.ts +13 -0
- package/dist/framework-vite/index.cjs +163 -0
- package/dist/framework-vite/index.cjs.map +1 -0
- package/dist/framework-vite/index.d.ts +1 -0
- package/dist/framework-vite/index.js +125 -0
- package/dist/framework-vite/index.js.map +1 -0
- package/dist/grid/grid.d.ts +8 -0
- package/dist/grid/index.cjs +238 -0
- package/dist/grid/index.cjs.map +1 -0
- package/dist/grid/index.d.ts +2 -0
- package/dist/grid/index.js +19 -0
- package/dist/grid/index.js.map +1 -0
- package/dist/grid/types.d.ts +35 -0
- package/dist/index.cjs +2512 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/app.d.ts +26 -0
- package/dist/kernel/index.d.ts +3 -0
- package/dist/kernel/runtime.d.ts +5 -0
- package/dist/kernel/telemetry.d.ts +37 -0
- package/dist/navigation/index.d.ts +4 -0
- package/dist/navigation/matcher.d.ts +13 -0
- package/dist/navigation/react.d.ts +12 -0
- package/dist/navigation/service.d.ts +23 -0
- package/dist/navigation/types.d.ts +65 -0
- package/dist/query/index.cjs +361 -0
- package/dist/query/index.cjs.map +1 -0
- package/dist/query/index.d.ts +3 -0
- package/dist/query/index.js +30 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/react.d.ts +27 -0
- package/dist/query/service.d.ts +10 -0
- package/dist/query/types.d.ts +5 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/provider.d.ts +10 -0
- package/dist/realtime/channel.d.ts +15 -0
- package/dist/realtime/index.cjs +117 -0
- package/dist/realtime/index.cjs.map +1 -0
- package/dist/realtime/index.d.ts +2 -0
- package/dist/realtime/index.js +15 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/presence.d.ts +22 -0
- package/dist/render/hydration.d.ts +24 -0
- package/dist/render/index.d.ts +2 -0
- package/dist/render/ssr.d.ts +13 -0
- package/dist/router/helpers.d.ts +26 -0
- package/dist/router/index.cjs +236 -0
- package/dist/router/index.cjs.map +1 -0
- package/dist/router/index.d.ts +4 -0
- package/dist/router/index.js +40 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/react.d.ts +5 -0
- package/dist/router/service.d.ts +5 -0
- package/dist/router/types.d.ts +1 -0
- package/dist/server/index.cjs +174 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/state/index.cjs +128 -0
- package/dist/state/index.cjs.map +1 -0
- package/dist/state/index.d.ts +2 -0
- package/dist/state/index.js +36 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/react.d.ts +3 -0
- package/dist/state/service.d.ts +28 -0
- package/dist/testing/index.cjs +970 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +13 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/virtual/index.cjs +160 -0
- package/dist/virtual/index.cjs.map +1 -0
- package/dist/virtual/index.d.ts +2 -0
- package/dist/virtual/index.js +21 -0
- package/dist/virtual/index.js.map +1 -0
- package/dist/virtual/types.d.ts +25 -0
- package/dist/virtual/virtual.d.ts +9 -0
- package/package.json +156 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/index.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"],"sourcesContent":["import { createApp, type CreateAppOptions } from \"../framework\";\n\nexport const createTestApp = (options: CreateAppOptions) => createApp(options);\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"],"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,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createTestApp
|
|
3
|
+
} from "../chunk-2TG7YEVD.js";
|
|
4
|
+
import "../chunk-XIBEKS5A.js";
|
|
5
|
+
import "../chunk-C5JI7D7W.js";
|
|
6
|
+
import "../chunk-O7XTA7H3.js";
|
|
7
|
+
import "../chunk-YG22YP5K.js";
|
|
8
|
+
import "../chunk-WPV3WFMS.js";
|
|
9
|
+
import "../chunk-SKC3HMF3.js";
|
|
10
|
+
export {
|
|
11
|
+
createTestApp
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/virtual/index.ts
|
|
21
|
+
var virtual_exports = {};
|
|
22
|
+
__export(virtual_exports, {
|
|
23
|
+
calculateOffsetForIndex: () => calculateOffsetForIndex,
|
|
24
|
+
calculateOffsets: () => calculateOffsets,
|
|
25
|
+
calculateTotalSize: () => calculateTotalSize,
|
|
26
|
+
calculateVisibleRange: () => calculateVisibleRange,
|
|
27
|
+
getOffsetForIndex: () => getOffsetForIndex,
|
|
28
|
+
getTotalSize: () => getTotalSize,
|
|
29
|
+
getVisibleRange: () => getVisibleRange,
|
|
30
|
+
measureVirtualItems: () => measureVirtualItems
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(virtual_exports);
|
|
33
|
+
|
|
34
|
+
// src/virtual/virtual.ts
|
|
35
|
+
var import_effect = require("effect");
|
|
36
|
+
var normalizeNonNegativeInteger = (value) => {
|
|
37
|
+
if (!Number.isFinite(value)) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
return Math.max(0, Math.floor(value));
|
|
41
|
+
};
|
|
42
|
+
var normalizeNonNegativeNumber = (value) => {
|
|
43
|
+
if (!Number.isFinite(value)) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
return Math.max(0, value);
|
|
47
|
+
};
|
|
48
|
+
var normalizePositiveNumber = (value, fallback) => {
|
|
49
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
50
|
+
return fallback;
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
};
|
|
54
|
+
var normalizeCount = (count) => normalizeNonNegativeInteger(count);
|
|
55
|
+
var normalizeEstimateSize = (estimateSize) => normalizePositiveNumber(estimateSize, 1);
|
|
56
|
+
var resolveItemSize = (sizes, index, estimateSize) => normalizePositiveNumber(sizes?.[index] ?? estimateSize, estimateSize);
|
|
57
|
+
var measureVirtualItems = (input) => {
|
|
58
|
+
const count = normalizeCount(input.count);
|
|
59
|
+
const estimateSize = normalizeEstimateSize(input.estimateSize);
|
|
60
|
+
const items = [];
|
|
61
|
+
let offset = 0;
|
|
62
|
+
for (let index = 0; index < count; index += 1) {
|
|
63
|
+
const size = resolveItemSize(input.sizes, index, estimateSize);
|
|
64
|
+
const start = offset;
|
|
65
|
+
const end = start + size;
|
|
66
|
+
items[index] = {
|
|
67
|
+
index,
|
|
68
|
+
size,
|
|
69
|
+
start,
|
|
70
|
+
end
|
|
71
|
+
};
|
|
72
|
+
offset = end;
|
|
73
|
+
}
|
|
74
|
+
return items;
|
|
75
|
+
};
|
|
76
|
+
var calculateOffsets = (input) => (0, import_effect.pipe)(
|
|
77
|
+
measureVirtualItems(input),
|
|
78
|
+
import_effect.Array.map((item) => item.start)
|
|
79
|
+
);
|
|
80
|
+
var calculateTotalSize = (input) => {
|
|
81
|
+
const items = measureVirtualItems(input);
|
|
82
|
+
if (items.length === 0) {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
return items[items.length - 1].end;
|
|
86
|
+
};
|
|
87
|
+
var calculateOffsetForIndex = (input) => {
|
|
88
|
+
const count = normalizeCount(input.count);
|
|
89
|
+
const index = normalizeNonNegativeInteger(input.index);
|
|
90
|
+
if (count === 0 || index === 0) {
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
if (index >= count) {
|
|
94
|
+
return calculateTotalSize(input);
|
|
95
|
+
}
|
|
96
|
+
const estimateSize = normalizeEstimateSize(input.estimateSize);
|
|
97
|
+
let offset = 0;
|
|
98
|
+
for (let currentIndex = 0; currentIndex < index; currentIndex += 1) {
|
|
99
|
+
offset += resolveItemSize(input.sizes, currentIndex, estimateSize);
|
|
100
|
+
}
|
|
101
|
+
return offset;
|
|
102
|
+
};
|
|
103
|
+
var calculateVisibleRange = (input) => {
|
|
104
|
+
const count = normalizeCount(input.count);
|
|
105
|
+
if (count === 0) {
|
|
106
|
+
return {
|
|
107
|
+
startIndex: 0,
|
|
108
|
+
endIndex: -1,
|
|
109
|
+
overscanStartIndex: 0,
|
|
110
|
+
overscanEndIndex: -1
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const viewportSize = normalizeNonNegativeNumber(input.viewportSize);
|
|
114
|
+
const scrollOffset = normalizeNonNegativeNumber(input.scrollOffset);
|
|
115
|
+
const overscan = normalizeNonNegativeInteger(input.overscan ?? 0);
|
|
116
|
+
const viewportEnd = scrollOffset + viewportSize;
|
|
117
|
+
const measurements = measureVirtualItems(input);
|
|
118
|
+
let startIndex = count - 1;
|
|
119
|
+
let endIndex = count - 1;
|
|
120
|
+
let foundStart = false;
|
|
121
|
+
for (const item of measurements) {
|
|
122
|
+
if (!foundStart && item.end > scrollOffset) {
|
|
123
|
+
startIndex = item.index;
|
|
124
|
+
foundStart = true;
|
|
125
|
+
}
|
|
126
|
+
if (item.start < viewportEnd) {
|
|
127
|
+
endIndex = item.index;
|
|
128
|
+
}
|
|
129
|
+
if (foundStart && item.start >= viewportEnd) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (!foundStart) {
|
|
134
|
+
startIndex = count - 1;
|
|
135
|
+
endIndex = count - 1;
|
|
136
|
+
} else if (viewportSize <= 0) {
|
|
137
|
+
endIndex = startIndex;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
startIndex,
|
|
141
|
+
endIndex,
|
|
142
|
+
overscanStartIndex: Math.max(0, startIndex - overscan),
|
|
143
|
+
overscanEndIndex: Math.min(count - 1, endIndex + overscan)
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
var getOffsetForIndex = calculateOffsetForIndex;
|
|
147
|
+
var getTotalSize = calculateTotalSize;
|
|
148
|
+
var getVisibleRange = calculateVisibleRange;
|
|
149
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
150
|
+
0 && (module.exports = {
|
|
151
|
+
calculateOffsetForIndex,
|
|
152
|
+
calculateOffsets,
|
|
153
|
+
calculateTotalSize,
|
|
154
|
+
calculateVisibleRange,
|
|
155
|
+
getOffsetForIndex,
|
|
156
|
+
getTotalSize,
|
|
157
|
+
getVisibleRange,
|
|
158
|
+
measureVirtualItems
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/virtual/index.ts","../../src/virtual/virtual.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./virtual\";\n","import { Array as EffectArray, pipe } from \"effect\";\nimport type {\n VirtualItemMeasurement,\n VirtualOffsetInput,\n VirtualRange,\n VirtualRangeInput,\n VirtualSizeInput,\n} from \"./types\";\n\nconst normalizeNonNegativeInteger = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.floor(value));\n};\n\nconst normalizeNonNegativeNumber = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, value);\n};\n\nconst normalizePositiveNumber = (value: number, fallback: number): number => {\n if (!Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return value;\n};\n\nconst normalizeCount = (count: number): number => normalizeNonNegativeInteger(count);\nconst normalizeEstimateSize = (estimateSize: number): number => normalizePositiveNumber(estimateSize, 1);\n\nconst resolveItemSize = (\n sizes: readonly number[] | undefined,\n index: number,\n estimateSize: number,\n): number => normalizePositiveNumber(sizes?.[index] ?? estimateSize, estimateSize);\n\nexport const measureVirtualItems = (input: VirtualSizeInput): readonly VirtualItemMeasurement[] => {\n const count = normalizeCount(input.count);\n const estimateSize = normalizeEstimateSize(input.estimateSize);\n const items: VirtualItemMeasurement[] = [];\n\n let offset = 0;\n\n for (let index = 0; index < count; index += 1) {\n const size = resolveItemSize(input.sizes, index, estimateSize);\n const start = offset;\n const end = start + size;\n\n items[index] = {\n index,\n size,\n start,\n end,\n };\n\n offset = end;\n }\n\n return items;\n};\n\nexport const calculateOffsets = (input: VirtualSizeInput): readonly number[] =>\n pipe(\n measureVirtualItems(input),\n EffectArray.map((item) => item.start),\n );\n\nexport const calculateTotalSize = (input: VirtualSizeInput): number => {\n const items = measureVirtualItems(input);\n if (items.length === 0) {\n return 0;\n }\n return items[items.length - 1]!.end;\n};\n\nexport const calculateOffsetForIndex = (input: VirtualOffsetInput): number => {\n const count = normalizeCount(input.count);\n const index = normalizeNonNegativeInteger(input.index);\n\n if (count === 0 || index === 0) {\n return 0;\n }\n\n if (index >= count) {\n return calculateTotalSize(input);\n }\n\n const estimateSize = normalizeEstimateSize(input.estimateSize);\n let offset = 0;\n\n for (let currentIndex = 0; currentIndex < index; currentIndex += 1) {\n offset += resolveItemSize(input.sizes, currentIndex, estimateSize);\n }\n\n return offset;\n};\n\nexport const calculateVisibleRange = (input: VirtualRangeInput): VirtualRange => {\n const count = normalizeCount(input.count);\n\n if (count === 0) {\n return {\n startIndex: 0,\n endIndex: -1,\n overscanStartIndex: 0,\n overscanEndIndex: -1,\n };\n }\n\n const viewportSize = normalizeNonNegativeNumber(input.viewportSize);\n const scrollOffset = normalizeNonNegativeNumber(input.scrollOffset);\n const overscan = normalizeNonNegativeInteger(input.overscan ?? 0);\n const viewportEnd = scrollOffset + viewportSize;\n\n const measurements = measureVirtualItems(input);\n let startIndex = count - 1;\n let endIndex = count - 1;\n let foundStart = false;\n\n for (const item of measurements) {\n if (!foundStart && item.end > scrollOffset) {\n startIndex = item.index;\n foundStart = true;\n }\n\n if (item.start < viewportEnd) {\n endIndex = item.index;\n }\n\n if (foundStart && item.start >= viewportEnd) {\n break;\n }\n }\n\n if (!foundStart) {\n startIndex = count - 1;\n endIndex = count - 1;\n } else if (viewportSize <= 0) {\n endIndex = startIndex;\n }\n\n return {\n startIndex,\n endIndex,\n overscanStartIndex: Math.max(0, startIndex - overscan),\n overscanEndIndex: Math.min(count - 1, endIndex + overscan),\n };\n};\n\nexport const getOffsetForIndex = calculateOffsetForIndex;\nexport const getTotalSize = calculateTotalSize;\nexport const getVisibleRange = calculateVisibleRange;\n"],"mappings":"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","names":["EffectArray"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
calculateOffsetForIndex,
|
|
3
|
+
calculateOffsets,
|
|
4
|
+
calculateTotalSize,
|
|
5
|
+
calculateVisibleRange,
|
|
6
|
+
getOffsetForIndex,
|
|
7
|
+
getTotalSize,
|
|
8
|
+
getVisibleRange,
|
|
9
|
+
measureVirtualItems
|
|
10
|
+
} from "../chunk-TUJZ6XJY.js";
|
|
11
|
+
export {
|
|
12
|
+
calculateOffsetForIndex,
|
|
13
|
+
calculateOffsets,
|
|
14
|
+
calculateTotalSize,
|
|
15
|
+
calculateVisibleRange,
|
|
16
|
+
getOffsetForIndex,
|
|
17
|
+
getTotalSize,
|
|
18
|
+
getVisibleRange,
|
|
19
|
+
measureVirtualItems
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface VirtualSizeInput {
|
|
2
|
+
readonly count: number;
|
|
3
|
+
readonly estimateSize: number;
|
|
4
|
+
readonly sizes?: readonly number[];
|
|
5
|
+
}
|
|
6
|
+
export interface VirtualOffsetInput extends VirtualSizeInput {
|
|
7
|
+
readonly index: number;
|
|
8
|
+
}
|
|
9
|
+
export interface VirtualRangeInput extends VirtualSizeInput {
|
|
10
|
+
readonly scrollOffset: number;
|
|
11
|
+
readonly viewportSize: number;
|
|
12
|
+
readonly overscan?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface VirtualRange {
|
|
15
|
+
readonly startIndex: number;
|
|
16
|
+
readonly endIndex: number;
|
|
17
|
+
readonly overscanStartIndex: number;
|
|
18
|
+
readonly overscanEndIndex: number;
|
|
19
|
+
}
|
|
20
|
+
export interface VirtualItemMeasurement {
|
|
21
|
+
readonly index: number;
|
|
22
|
+
readonly size: number;
|
|
23
|
+
readonly start: number;
|
|
24
|
+
readonly end: number;
|
|
25
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VirtualItemMeasurement, VirtualOffsetInput, VirtualRange, VirtualRangeInput, VirtualSizeInput } from "./types";
|
|
2
|
+
export declare const measureVirtualItems: (input: VirtualSizeInput) => readonly VirtualItemMeasurement[];
|
|
3
|
+
export declare const calculateOffsets: (input: VirtualSizeInput) => readonly number[];
|
|
4
|
+
export declare const calculateTotalSize: (input: VirtualSizeInput) => number;
|
|
5
|
+
export declare const calculateOffsetForIndex: (input: VirtualOffsetInput) => number;
|
|
6
|
+
export declare const calculateVisibleRange: (input: VirtualRangeInput) => VirtualRange;
|
|
7
|
+
export declare const getOffsetForIndex: (input: VirtualOffsetInput) => number;
|
|
8
|
+
export declare const getTotalSize: (input: VirtualSizeInput) => number;
|
|
9
|
+
export declare const getVisibleRange: (input: VirtualRangeInput) => VirtualRange;
|
package/package.json
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rikalabs/effect-react",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Effect-native full-stack React meta-framework",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"effect",
|
|
7
|
+
"react",
|
|
8
|
+
"framework",
|
|
9
|
+
"meta-framework",
|
|
10
|
+
"schema",
|
|
11
|
+
"typed-errors",
|
|
12
|
+
"ssr",
|
|
13
|
+
"caching"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/Rika-Labs/effect-react",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/Rika-Labs/effect-react/issues"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/Rika-Labs/effect-react"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE",
|
|
31
|
+
"package.json"
|
|
32
|
+
],
|
|
33
|
+
"type": "module",
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"main": "./dist/index.cjs",
|
|
36
|
+
"module": "./dist/index.js",
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"require": "./dist/index.cjs"
|
|
43
|
+
},
|
|
44
|
+
"./framework": {
|
|
45
|
+
"types": "./dist/framework/index.d.ts",
|
|
46
|
+
"import": "./dist/framework/index.js",
|
|
47
|
+
"require": "./dist/framework/index.cjs"
|
|
48
|
+
},
|
|
49
|
+
"./framework/vite": {
|
|
50
|
+
"types": "./dist/framework-vite/index.d.ts",
|
|
51
|
+
"import": "./dist/framework-vite/index.js",
|
|
52
|
+
"require": "./dist/framework-vite/index.cjs"
|
|
53
|
+
},
|
|
54
|
+
"./config": {
|
|
55
|
+
"types": "./dist/config/index.d.ts",
|
|
56
|
+
"import": "./dist/config/index.js",
|
|
57
|
+
"require": "./dist/config/index.cjs"
|
|
58
|
+
},
|
|
59
|
+
"./server": {
|
|
60
|
+
"types": "./dist/server/index.d.ts",
|
|
61
|
+
"import": "./dist/server/index.js",
|
|
62
|
+
"require": "./dist/server/index.cjs"
|
|
63
|
+
},
|
|
64
|
+
"./client": {
|
|
65
|
+
"types": "./dist/client/index.d.ts",
|
|
66
|
+
"import": "./dist/client/index.js",
|
|
67
|
+
"require": "./dist/client/index.cjs"
|
|
68
|
+
},
|
|
69
|
+
"./testing": {
|
|
70
|
+
"types": "./dist/testing/index.d.ts",
|
|
71
|
+
"import": "./dist/testing/index.js",
|
|
72
|
+
"require": "./dist/testing/index.cjs"
|
|
73
|
+
},
|
|
74
|
+
"./state": {
|
|
75
|
+
"types": "./dist/state/index.d.ts",
|
|
76
|
+
"import": "./dist/state/index.js",
|
|
77
|
+
"require": "./dist/state/index.cjs"
|
|
78
|
+
},
|
|
79
|
+
"./query": {
|
|
80
|
+
"types": "./dist/query/index.d.ts",
|
|
81
|
+
"import": "./dist/query/index.js",
|
|
82
|
+
"require": "./dist/query/index.cjs"
|
|
83
|
+
},
|
|
84
|
+
"./router": {
|
|
85
|
+
"types": "./dist/router/index.d.ts",
|
|
86
|
+
"import": "./dist/router/index.js",
|
|
87
|
+
"require": "./dist/router/index.cjs"
|
|
88
|
+
},
|
|
89
|
+
"./form": {
|
|
90
|
+
"types": "./dist/form/index.d.ts",
|
|
91
|
+
"import": "./dist/form/index.js",
|
|
92
|
+
"require": "./dist/form/index.cjs"
|
|
93
|
+
},
|
|
94
|
+
"./grid": {
|
|
95
|
+
"types": "./dist/grid/index.d.ts",
|
|
96
|
+
"import": "./dist/grid/index.js",
|
|
97
|
+
"require": "./dist/grid/index.cjs"
|
|
98
|
+
},
|
|
99
|
+
"./virtual": {
|
|
100
|
+
"types": "./dist/virtual/index.d.ts",
|
|
101
|
+
"import": "./dist/virtual/index.js",
|
|
102
|
+
"require": "./dist/virtual/index.cjs"
|
|
103
|
+
},
|
|
104
|
+
"./realtime": {
|
|
105
|
+
"types": "./dist/realtime/index.d.ts",
|
|
106
|
+
"import": "./dist/realtime/index.js",
|
|
107
|
+
"require": "./dist/realtime/index.cjs"
|
|
108
|
+
},
|
|
109
|
+
"./devtools": {
|
|
110
|
+
"types": "./dist/devtools/index.d.ts",
|
|
111
|
+
"import": "./dist/devtools/index.js",
|
|
112
|
+
"require": "./dist/devtools/index.cjs"
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"scripts": {
|
|
116
|
+
"build": "bun run build:js && bun run build:types",
|
|
117
|
+
"build:js": "NODE_OPTIONS=--max-old-space-size=4096 tsup",
|
|
118
|
+
"build:types": "tsc -p tsconfig.build.json",
|
|
119
|
+
"repo-lint": "repo-lint check --config .repo-lint.yaml",
|
|
120
|
+
"effect:check": "bun run scripts/check-effect-standards.ts",
|
|
121
|
+
"typecheck": "tsc --noEmit",
|
|
122
|
+
"lint": "oxlint src/index.ts src/framework src/framework-vite src/config src/server src/client src/testing src/state src/query src/router src/form src/grid src/virtual src/realtime src/devtools src/kernel src/boundary src/data src/navigation src/actions src/render src/react src/__tests__ scripts/check-effect-standards.ts vitest.config.ts tsup.config.ts --type-aware --type-check --deny-warnings",
|
|
123
|
+
"lint:fix": "oxlint src/index.ts src/framework src/framework-vite src/config src/server src/client src/testing src/state src/query src/router src/form src/grid src/virtual src/realtime src/devtools src/kernel src/boundary src/data src/navigation src/actions src/render src/react src/__tests__ scripts/check-effect-standards.ts vitest.config.ts tsup.config.ts --type-aware --type-check --fix",
|
|
124
|
+
"format": "oxfmt --write .",
|
|
125
|
+
"format:check": "oxfmt --check .",
|
|
126
|
+
"test": "vitest run --coverage",
|
|
127
|
+
"test:watch": "vitest"
|
|
128
|
+
},
|
|
129
|
+
"dependencies": {},
|
|
130
|
+
"devDependencies": {
|
|
131
|
+
"@rikalabs/repo-lint": "^2.1.3",
|
|
132
|
+
"@testing-library/react": "^16.3.0",
|
|
133
|
+
"@types/node": "^22.16.5",
|
|
134
|
+
"@types/react": "^19.1.8",
|
|
135
|
+
"@types/react-dom": "^19.1.6",
|
|
136
|
+
"@typescript/native-preview": "^7.0.0-dev.20260205.1",
|
|
137
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
138
|
+
"effect": "3.19.16",
|
|
139
|
+
"jsdom": "^25.0.1",
|
|
140
|
+
"markdownlint-cli2": "^0.20.0",
|
|
141
|
+
"oxfmt": "^0.28.0",
|
|
142
|
+
"oxlint": "^1.43.0",
|
|
143
|
+
"oxlint-tsgolint": "^0.11.4",
|
|
144
|
+
"react": "^19.1.1",
|
|
145
|
+
"react-dom": "^19.1.1",
|
|
146
|
+
"tsup": "^8.3.5",
|
|
147
|
+
"typescript": "^5.9.2",
|
|
148
|
+
"vite": "^7.3.1",
|
|
149
|
+
"vitest": "^2.1.9"
|
|
150
|
+
},
|
|
151
|
+
"peerDependencies": {
|
|
152
|
+
"effect": "^3.19.16",
|
|
153
|
+
"react": "^19.1.1",
|
|
154
|
+
"react-dom": "^19.1.1"
|
|
155
|
+
}
|
|
156
|
+
}
|