svelte-effect-runtime 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.dist/chunks/{client-BeOE81fW.js → client-zavjI3Qd.js} +9 -9
  2. package/.dist/chunks/client-zavjI3Qd.js.map +1 -0
  3. package/.dist/chunks/{dispatcher-BSg2-ttN.js → dispatcher-g0HYqHOK.js} +3 -3
  4. package/.dist/chunks/{dispatcher-BSg2-ttN.js.map → dispatcher-g0HYqHOK.js.map} +1 -1
  5. package/.dist/chunks/{preprocess-BZyUYWY7.js → preprocess-33aQ41uE.js} +185 -156
  6. package/.dist/chunks/preprocess-33aQ41uE.js.map +1 -0
  7. package/.dist/chunks/{transform-BtlxgJrg.js → transform-B4g76Ur4.js} +337 -113
  8. package/.dist/chunks/transform-B4g76Ur4.js.map +1 -0
  9. package/.dist/dispatcher.js +1 -1
  10. package/.dist/error.d.ts +54 -14
  11. package/.dist/internal/generators.js +1 -1
  12. package/.dist/internal/remote-client.js +1 -1
  13. package/.dist/markup/promise.js +1 -1
  14. package/.dist/markup/run.js +1 -1
  15. package/.dist/markup/transform/expressions.d.ts +8 -0
  16. package/.dist/markup/transform.js +1 -1
  17. package/.dist/markup/value.js +1 -1
  18. package/.dist/mod.d.ts +1 -1
  19. package/.dist/mod.js +2 -2
  20. package/.dist/mod.js.map +1 -1
  21. package/.dist/preprocess/imports.d.ts +1 -2
  22. package/.dist/preprocess/index.d.ts +1 -1
  23. package/.dist/preprocess/lower.d.ts +1 -1
  24. package/.dist/preprocess/runes.d.ts +24 -0
  25. package/.dist/preprocess/runtime-block.d.ts +5 -4
  26. package/.dist/preprocess/types.d.ts +15 -3
  27. package/.dist/preprocess.js +2 -2
  28. package/.dist/remote/client.js +1 -1
  29. package/.dist/remote/server.js +3 -3
  30. package/.dist/remote/server.js.map +1 -1
  31. package/.dist/runtime/preprocess.js +2 -2
  32. package/.dist/server.js +8 -8
  33. package/.dist/server.js.map +1 -1
  34. package/package.json +1 -1
  35. package/.dist/chunks/client-BeOE81fW.js.map +0 -1
  36. package/.dist/chunks/preprocess-BZyUYWY7.js.map +0 -1
  37. package/.dist/chunks/transform-BtlxgJrg.js.map +0 -1
package/.dist/server.js CHANGED
@@ -69,7 +69,7 @@ function normalize_validator(value) {
69
69
  * @since 2.0.0
70
70
  */
71
71
  const RequestEvent = Context.Reference("@ser/RequestEvent", { defaultValue: () => {
72
- throw new Error("RequestEvent is only available during a remote call");
72
+ throw new Error("[REQUEST_EVENT_UNAVAILABLE]: RequestEvent is only available during a remote call");
73
73
  } });
74
74
  /**
75
75
  * Builder for the server-side Effect runtime.
@@ -163,7 +163,7 @@ function run_live_handler_source(value, event) {
163
163
  function to_live_source_effect(value) {
164
164
  if (Stream.isStream(value)) return Stream.toAsyncIterableEffect(value);
165
165
  if (is_native_live_source(value)) return Effect.succeed(value);
166
- if (!Effect.isEffect(value)) return Effect.fail(/* @__PURE__ */ new Error("Query.live handler must return an Effect Stream, Iterable, or AsyncIterable"));
166
+ if (!Effect.isEffect(value)) return Effect.fail(/* @__PURE__ */ new Error("[INVALID_LIVE_QUERY_SOURCE]: Query.live handler must return an Effect Stream, Iterable, or AsyncIterable"));
167
167
  return Effect.flatMap(value, to_live_source_effect);
168
168
  }
169
169
  function is_native_live_source(value) {
@@ -434,7 +434,7 @@ function attach_live_resource_methods(resource, effect) {
434
434
  function QueryRoot(validate_or_handler, maybe_handler) {
435
435
  try {
436
436
  if (maybe_handler) return to_effect_query(query(normalize_validator(validate_or_handler), make_remote_wrapper(maybe_handler, "Query")));
437
- if (is_unchecked(validate_or_handler)) throw new Error("Query('unchecked', handler) requires a handler");
437
+ if (is_unchecked(validate_or_handler)) throw new Error("[MISSING_REMOTE_HANDLER]: Query('unchecked', handler) requires a handler");
438
438
  return to_effect_query(query(make_remote_wrapper(validate_or_handler, "Query")));
439
439
  } catch (error) {
440
440
  throw normalize_remote_helper_error(error, "Query");
@@ -442,7 +442,7 @@ function QueryRoot(validate_or_handler, maybe_handler) {
442
442
  }
443
443
  function QueryBatch(validate_or_handler, maybe_handler) {
444
444
  try {
445
- if (!maybe_handler) throw new Error("Query.batch requires a handler");
445
+ if (!maybe_handler) throw new Error("[MISSING_REMOTE_HANDLER]: Query.batch requires a handler");
446
446
  return to_effect_query(query.batch(normalize_validator(validate_or_handler), make_remote_wrapper(maybe_handler, "Query.batch")));
447
447
  } catch (error) {
448
448
  throw normalize_remote_helper_error(error, "Query.batch");
@@ -451,7 +451,7 @@ function QueryBatch(validate_or_handler, maybe_handler) {
451
451
  function QueryLive(validate_or_handler, maybe_handler) {
452
452
  try {
453
453
  if (maybe_handler) return to_effect_live_query(query.live(normalize_validator(validate_or_handler), make_remote_live_wrapper(maybe_handler, "Query.live")));
454
- if (is_unchecked(validate_or_handler)) throw new Error("Query.live('unchecked', handler) requires a handler");
454
+ if (is_unchecked(validate_or_handler)) throw new Error("[MISSING_REMOTE_HANDLER]: Query.live('unchecked', handler) requires a handler");
455
455
  return to_effect_live_query(query.live(make_remote_live_wrapper(validate_or_handler, "Query.live")));
456
456
  } catch (error) {
457
457
  throw normalize_remote_helper_error(error, "Query.live");
@@ -480,7 +480,7 @@ const Query = Object.assign(QueryRoot, {
480
480
  function Command(validate_or_handler, maybe_handler) {
481
481
  try {
482
482
  if (maybe_handler) return command(normalize_validator(validate_or_handler), make_remote_wrapper(maybe_handler, "Command"));
483
- if (is_unchecked(validate_or_handler)) throw new Error("Command('unchecked', handler) requires a handler");
483
+ if (is_unchecked(validate_or_handler)) throw new Error("[MISSING_REMOTE_HANDLER]: Command('unchecked', handler) requires a handler");
484
484
  return command(make_remote_wrapper(validate_or_handler, "Command"));
485
485
  } catch (error) {
486
486
  throw normalize_remote_helper_error(error, "Command");
@@ -489,7 +489,7 @@ function Command(validate_or_handler, maybe_handler) {
489
489
  function Form(validate_or_handler, maybe_handler) {
490
490
  try {
491
491
  if (maybe_handler) return form(normalize_validator(validate_or_handler), make_remote_form_wrapper(maybe_handler, "Form"));
492
- if (is_unchecked(validate_or_handler)) throw new Error("Form('unchecked', handler) requires a handler");
492
+ if (is_unchecked(validate_or_handler)) throw new Error("[MISSING_REMOTE_HANDLER]: Form('unchecked', handler) requires a handler");
493
493
  const inputless_handler = ({ data, invalid, issue }) => {
494
494
  if (is_handler(validate_or_handler)) return validate_or_handler({
495
495
  data,
@@ -515,7 +515,7 @@ function Form(validate_or_handler, maybe_handler) {
515
515
  function Prerender(validate_or_handler, maybe_handler_or_options, maybe_options) {
516
516
  try {
517
517
  if (is_handler(maybe_handler_or_options)) return prerender(normalize_validator(validate_or_handler), make_remote_wrapper(maybe_handler_or_options, "Prerender"), maybe_options);
518
- if (is_unchecked(validate_or_handler)) throw new Error("Prerender('unchecked', handler) requires a handler");
518
+ if (is_unchecked(validate_or_handler)) throw new Error("[MISSING_REMOTE_HANDLER]: Prerender('unchecked', handler) requires a handler");
519
519
  return prerender(make_remote_wrapper(validate_or_handler, "Prerender"), maybe_handler_or_options);
520
520
  } catch (error) {
521
521
  throw normalize_remote_helper_error(error, "Prerender");
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":["get_native_request_event","get_native_request_event","native_query","native_command","native_form","native_prerender"],"sources":["../../modules/svelte-effect-runtime/src/server/schema.ts","../../modules/svelte-effect-runtime/src/server/runtime.ts","../../modules/svelte-effect-runtime/src/server/effects.ts","../../modules/svelte-effect-runtime/src/server/invalid.ts","../../modules/svelte-effect-runtime/src/server/wrappers.ts","../../modules/svelte-effect-runtime/src/server/factories.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { RemoteHandler, StandardSchema } from \"./types.ts\";\n\n/**\n * Checks whether a value is the string sentinel for unchecked remotes.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is `\"unchecked\"`.\n */\nexport function is_unchecked(value: unknown): value is \"unchecked\" {\n return value === \"unchecked\";\n}\n\n/**\n * Checks whether a value is a remote handler function.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is callable as a handler.\n */\nexport function is_handler(value: unknown): value is RemoteHandler {\n return typeof value === \"function\";\n}\n\n/**\n * Checks whether a value implements the Standard Schema contract.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is a Standard Schema.\n */\nexport function is_standard_schema(value: unknown): value is StandardSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"~standard\" in value\n );\n}\n\n/**\n * Checks whether a value looks like an Effect Schema.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value should be converted to Standard Schema.\n */\nexport function is_effect_schema(\n value: unknown,\n): value is Schema.Schema<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"ast\" in value &&\n \"make\" in value\n );\n}\n\n/**\n * Converts Effect Schema inputs to Standard Schema for SvelteKit.\n *\n * @since 2.0.0\n * @param value - Schema or handler input.\n * @returns Original value or Standard Schema view of an Effect Schema.\n */\nexport function normalize_validator(value: unknown): unknown {\n if (is_standard_schema(value) || !is_effect_schema(value)) {\n return value;\n }\n\n return Schema.toStandardSchemaV1(value as never);\n}\n","import type { RequestEvent as SvelteKitRequestEvent } from \"@sveltejs/kit\";\nimport { Context, Layer, ManagedRuntime } from \"effect\";\n\n/**\n * Subset of SvelteKit's `RequestEvent` that remote handlers typically access.\n *\n * @since 2.0.0\n */\nexport interface RequestEvent extends\n Pick<\n SvelteKitRequestEvent,\n | \"cookies\"\n | \"getClientAddress\"\n | \"locals\"\n | \"params\"\n | \"platform\"\n | \"request\"\n | \"route\"\n | \"url\"\n > {}\n\n/**\n * SvelteKit's `RequestEvent` exposed as an Effect {@link Context.Tag}.\n *\n * @example\n * ```ts\n * const event = yield* RequestEvent;\n * ```\n *\n * @since 2.0.0\n */\nexport const RequestEvent: Context.Reference<RequestEvent> = Context\n .Reference<RequestEvent>(\"@ser/RequestEvent\", {\n defaultValue: () => {\n throw new Error(\"RequestEvent is only available during a remote call\");\n },\n });\n\n/**\n * Builder for the server-side Effect runtime.\n *\n * @example\n * ```ts\n * ServerRuntime.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n */\nexport class ServerRuntime {\n /**\n * Build and cache the server-side `ManagedRuntime`.\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n * @returns The configured ManagedRuntime.\n */\n static make<R = never>(\n layer?: Layer.Layer<R>,\n ): ManagedRuntime.ManagedRuntime<R, never> {\n const runtime = ManagedRuntime.make(\n layer ?? (Layer.empty as unknown as Layer.Layer<R>),\n );\n\n current_server_runtime = runtime as ManagedRuntime.ManagedRuntime<\n unknown,\n never\n >;\n\n return runtime;\n }\n}\n\nlet current_server_runtime:\n | ManagedRuntime.ManagedRuntime<unknown, never>\n | undefined;\n\n/**\n * Returns the active server runtime, creating a default one if needed.\n *\n * @example\n * ```ts\n * const runtime = get_server_runtime_or_throw();\n * ```\n *\n * @since 2.0.0\n * @returns The current ManagedRuntime instance.\n */\nexport function get_server_runtime_or_throw(): ManagedRuntime.ManagedRuntime<\n unknown,\n never\n> {\n if (!current_server_runtime) {\n current_server_runtime = ManagedRuntime.make(\n Layer.empty,\n ) as ManagedRuntime.ManagedRuntime<unknown, never>;\n }\n\n return current_server_runtime;\n}\n","import { run_remote_effect } from \"$/remote/server.ts\";\nimport { error as svelte_error, invalid } from \"@sveltejs/kit\";\nimport { Effect, Stream } from \"effect\";\n\nimport { get_server_runtime_or_throw, RequestEvent } from \"./runtime.ts\";\nimport type { RequestEvent as RequestEventShape } from \"./runtime.ts\";\nimport type { EffectLike, EffectRemoteLiveSource } from \"./types.ts\";\n\ntype ResolvedLiveSource<A> =\n | AsyncIterable<A>\n | AsyncIterator<A>\n | Iterable<A>\n | Iterator<A>;\n\ntype LiveHandlerResult<A> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>;\n\n/**\n * Checks whether a value is an Effect generator return object.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value should be wrapped with `Effect.gen`.\n */\nexport function is_generator_result<A>(\n value: unknown,\n): value is Effect.gen.Return<A, unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { next?: unknown }).next === \"function\"\n );\n}\n\n/**\n * Normalizes an Effect-like handler return value into an Effect.\n *\n * @since 2.0.0\n * @param value - Effect or generator return value.\n * @returns Normalized Effect.\n */\nexport function to_effect<A>(\n value: EffectLike<A>,\n): Effect.Effect<A, unknown, unknown> {\n if (is_generator_result<A>(value)) {\n return Effect.gen(() => value);\n }\n\n return value;\n}\n\n/**\n * Checks whether a value is a live query source SvelteKit can consume.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is an Effect Stream or native iterable source.\n */\nexport function is_live_source<A>(\n value: unknown,\n): value is EffectRemoteLiveSource<A> {\n if (Stream.isStream(value)) {\n return true;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const source = value as {\n readonly next?: unknown;\n readonly [Symbol.asyncIterator]?: unknown;\n readonly [Symbol.iterator]?: unknown;\n };\n\n return (\n typeof source.next === \"function\" ||\n typeof source[Symbol.asyncIterator] === \"function\" ||\n typeof source[Symbol.iterator] === \"function\"\n );\n}\n\n/**\n * Runs and normalizes a live query handler result with request services\n * available to Effect Streams.\n *\n * @since 2.0.0\n * @param value - Live query source or Effect that resolves to one.\n * @param event - SvelteKit request event for this remote call.\n * @returns Promise resolving with a source SvelteKit can stream.\n */\nexport function run_live_handler_source<A>(\n value: LiveHandlerResult<A>,\n event: RequestEventShape,\n): Promise<ResolvedLiveSource<A>> {\n const runtime = get_server_runtime_or_throw();\n const effect = Effect.provideService(\n to_live_source_effect(value),\n RequestEvent,\n event,\n ) as Effect.Effect<ResolvedLiveSource<A>, unknown, unknown>;\n\n return run_remote_effect(\n effect,\n runtime,\n svelte_invalid,\n svelte_remote_error,\n );\n}\n\nfunction to_live_source_effect<A>(\n value: LiveHandlerResult<A>,\n): Effect.Effect<ResolvedLiveSource<A>, unknown, unknown> {\n if (Stream.isStream(value)) {\n return Stream.toAsyncIterableEffect(\n value as Stream.Stream<A, unknown, unknown>,\n ) as Effect.Effect<ResolvedLiveSource<A>, unknown, unknown>;\n }\n\n if (is_native_live_source<A>(value)) {\n return Effect.succeed(value);\n }\n\n if (!Effect.isEffect(value)) {\n return Effect.fail(\n new Error(\n \"Query.live handler must return an Effect Stream, Iterable, or AsyncIterable\",\n ),\n );\n }\n\n return Effect.flatMap(\n value as Effect.Effect<EffectRemoteLiveSource<A>, unknown, unknown>,\n to_live_source_effect,\n );\n}\n\nfunction is_native_live_source<A>(\n value: unknown,\n): value is ResolvedLiveSource<A> {\n return is_live_source<A>(value) && !Stream.isStream(value);\n}\n\n/**\n * Runs a remote handler Effect with the current request event provided.\n *\n * @since 2.0.0\n * @param value - Handler return value.\n * @param event - SvelteKit request event for this remote call.\n * @returns Promise resolving with the handler output.\n */\nexport function run_handler_effect<A>(\n value: EffectLike<A>,\n event: RequestEventShape,\n): Promise<A> {\n const runtime = get_server_runtime_or_throw();\n const effect = Effect.provideService(\n to_effect(value),\n RequestEvent,\n event,\n ) as Effect.Effect<A, unknown, unknown>;\n\n return run_remote_effect(\n effect,\n runtime,\n svelte_invalid,\n svelte_remote_error,\n );\n}\n\nconst svelte_invalid = (_status: number, body: unknown): never => {\n const issues = typeof body === \"object\" && body !== null &&\n Array.isArray((body as { issues?: unknown }).issues)\n ? (body as { issues: unknown[] }).issues\n : [String(body)];\n\n invalid(...(issues as never[]));\n};\n\nconst svelte_remote_error = (status: number, body: unknown): never => {\n svelte_error(status as never, body as never);\n};\n","import { create_form_error } from \"$/remote/shared.ts\";\nimport { Effect } from \"effect\";\nimport type { FormIssue } from \"$/remote/shared.ts\";\n\nimport type { FormInvalid } from \"./types.ts\";\n\n/**\n * Creates a path-aware proxy for remote form validation failures.\n *\n * @since 2.0.0\n * @param path - Current nested form path.\n * @returns Callable invalid proxy for this path.\n */\nexport function make_invalid_proxy(\n path: readonly (string | number)[] = [],\n): FormInvalid {\n const invalid_at_path = (message: string) =>\n Effect.fail(\n create_form_error([{ message, path: [...path] } satisfies FormIssue]),\n );\n\n return new Proxy(invalid_at_path, {\n get(_target, property) {\n if (typeof property === \"symbol\") {\n return undefined;\n }\n\n return make_invalid_proxy([...path, property]);\n },\n }) as FormInvalid;\n}\n","import { getRequestEvent as get_native_request_event } from \"$app/server\";\nimport { normalize_remote_helper_error } from \"$/remote/server.ts\";\n\nimport { run_handler_effect, run_live_handler_source } from \"./effects.ts\";\nimport { make_invalid_proxy } from \"./invalid.ts\";\nimport { is_handler } from \"./schema.ts\";\nimport type { RequestEvent } from \"./runtime.ts\";\nimport type {\n EffectLike,\n EffectRemoteLiveSource,\n RemoteFormHandler,\n RemoteHandler,\n} from \"./types.ts\";\n\ntype RemoteLiveHandler<Input = unknown, A = unknown> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>\n | ((input: Input) =>\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>);\n\nlet running_remote_effect_handlers = 0;\n\n/**\n * Reports whether SER is currently executing user remote handler code.\n *\n * @example\n * ```ts\n * if (is_running_remote_effect_handler()) {\n * return query();\n * }\n * ```\n *\n * @since 2.0.0\n * @returns Whether a remote handler wrapper is currently active.\n * @internal\n */\nexport function is_running_remote_effect_handler(): boolean {\n return running_remote_effect_handlers > 0;\n}\n\n/**\n * Builds the wrapper passed to native query, command, and prerender helpers.\n *\n * @since 2.0.0\n * @param handler - Effect handler or already-built Effect-like value.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit handler wrapper.\n */\nexport function make_remote_wrapper(\n handler: RemoteHandler | EffectLike,\n helper_name: string,\n): (input: unknown) => Promise<unknown> {\n return async (input: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n try {\n const result = is_handler(handler) ? handler(input) : handler;\n\n return run_handler_effect(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\n/**\n * Builds the wrapper passed to native live query helpers.\n *\n * @since 2.0.0\n * @param handler - Effect-aware live source handler.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit live query wrapper.\n */\nexport function make_remote_live_wrapper<Input, A>(\n handler: RemoteLiveHandler<Input, A>,\n helper_name: string,\n): (input: unknown) => Promise<unknown> {\n return async (input: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n try {\n const result = typeof handler === \"function\"\n ? handler(input as Input)\n : handler;\n\n return run_live_handler_source(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\n/**\n * Builds the wrapper passed to native form helpers.\n *\n * @since 2.0.0\n * @param handler - Effect-aware form handler.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit form handler wrapper.\n */\nexport function make_remote_form_wrapper<Input, A>(\n handler: RemoteFormHandler<Input, A>,\n helper_name: string,\n): (data: unknown, issue: unknown) => Promise<unknown> {\n return async (data: unknown, issue: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n const invalid_proxy = make_invalid_proxy();\n\n try {\n const result = handler({\n data: data as Input,\n invalid: invalid_proxy,\n issue,\n });\n\n return run_handler_effect(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\nasync function run_inside_remote_effect_handler<A>(\n run: () => Promise<A>,\n): Promise<A> {\n running_remote_effect_handlers += 1;\n\n try {\n return await run();\n } finally {\n running_remote_effect_handlers -= 1;\n }\n}\n","import {\n command as native_command,\n form as native_form,\n getRequestEvent as get_native_request_event,\n prerender as native_prerender,\n query as native_query,\n} from \"$app/server\";\nimport { copy_property_descriptors } from \"$/internal/descriptors.ts\";\nimport { normalize_remote_helper_error } from \"$/remote/server.ts\";\nimport type { RemoteFormInput } from \"@sveltejs/kit\";\nimport { Effect, type Schema } from \"effect\";\n\nimport { is_handler, is_unchecked, normalize_validator } from \"./schema.ts\";\nimport {\n is_running_remote_effect_handler,\n make_remote_form_wrapper,\n make_remote_live_wrapper,\n make_remote_wrapper,\n} from \"./wrappers.ts\";\nimport type {\n EffectLike,\n EffectRemoteBatchHandler,\n EffectRemoteCommand,\n EffectRemoteForm,\n EffectRemoteLiveQuery,\n EffectRemoteLiveQueryFunction,\n EffectRemoteLiveSource,\n EffectRemoteQuery,\n EffectRemoteQueryFunction,\n PrerenderOptions,\n RemoteFormHandler,\n RemoteHandler,\n SchemaInput,\n} from \"./types.ts\";\n\ntype FormSchemaEncodedInput<S> = S extends Schema.Top\n ? S[\"Encoded\"] extends RemoteFormInput ? S[\"Encoded\"]\n : never\n : never;\n\ntype NativeQueryLike<Input = unknown> = (input: Input) => unknown;\n\ntype EffectRemoteResource<Output> =\n | EffectRemoteLiveQuery<Output>\n | EffectRemoteQuery<Output>;\n\ntype RemoteLiveHandler<Input = unknown, A = unknown> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>\n | ((input: Input) =>\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>);\n\ninterface QueryFactory {\n <A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n ): EffectRemoteQueryFunction<void, A>;\n <Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n ): EffectRemoteQueryFunction<Input, A>;\n <S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n ): EffectRemoteQueryFunction<SchemaInput<S>, A>;\n\n readonly batch: typeof QueryBatch;\n readonly live: typeof QueryLive;\n}\n\nfunction to_effect_query<Input, Output>(\n native: NativeQueryLike<Input>,\n): EffectRemoteQueryFunction<Input, Output> {\n const wrapped = ((input: Input) => {\n if (is_current_remote_request()) {\n return (native as (input: Input) => unknown)(input);\n }\n\n const resource = (native as (input: Input) => unknown)(input);\n const effect = Effect.tryPromise({\n try: () => Promise.resolve(resource),\n catch: (error: unknown) => error,\n }) as unknown as EffectRemoteQuery<Output>;\n\n attach_query_resource_methods(resource, effect);\n\n return effect;\n }) as unknown as EffectRemoteQueryFunction<Input, Output>;\n\n copy_property_descriptors(native, wrapped);\n\n return wrapped;\n}\n\nfunction is_current_remote_request(): boolean {\n if (is_running_remote_effect_handler()) {\n return false;\n }\n\n try {\n const event = get_native_request_event() as { isRemoteRequest?: boolean };\n\n return event.isRemoteRequest === true;\n } catch {\n return false;\n }\n}\n\nfunction to_effect_live_query<Input, Output>(\n native: NativeQueryLike<Input>,\n): EffectRemoteLiveQueryFunction<Input, Output> {\n const wrapped = ((input: Input) => {\n const resource = (native as (input: Input) => unknown)(input);\n const effect = Effect.tryPromise({\n try: () => Promise.resolve(resource),\n catch: (error: unknown) => error,\n }) as unknown as EffectRemoteLiveQuery<Output>;\n\n attach_live_resource_methods(resource, effect);\n\n return effect;\n }) as unknown as EffectRemoteLiveQueryFunction<Input, Output>;\n\n copy_property_descriptors(native, wrapped);\n\n return wrapped;\n}\n\ntype NativeRemoteResource<Output> = {\n readonly current?: Output;\n readonly error?: unknown;\n readonly loading?: boolean;\n readonly ready?: boolean;\n};\n\ntype NativeQueryResource<Output> = NativeRemoteResource<Output> & {\n readonly refresh?: () => Promise<void>;\n readonly set?: (value: Output) => void;\n readonly withOverride?: (update: (current: Output) => Output) => unknown;\n};\n\ntype NativeLiveQueryResource<Output> =\n & NativeRemoteResource<Output>\n & Partial<AsyncIterable<Output>>\n & {\n readonly connected?: boolean;\n readonly done?: boolean;\n readonly reconnect?: () => Promise<void>;\n };\n\nfunction is_query_resource<Output>(\n resource: unknown,\n): resource is NativeQueryResource<Output> {\n const resource_type = typeof resource;\n\n return (\n (resource_type === \"object\" && resource !== null) ||\n resource_type === \"function\"\n );\n}\n\nfunction is_live_resource<Output>(\n resource: unknown,\n): resource is NativeLiveQueryResource<Output> {\n const resource_type = typeof resource;\n\n return (\n (resource_type === \"object\" && resource !== null) ||\n resource_type === \"function\"\n );\n}\n\nfunction attach_remote_resource_getters<Output>(\n resource: unknown,\n effect: EffectRemoteResource<Output>,\n): void {\n const methods = is_query_resource<Output>(resource) ? resource : undefined;\n const keys = [\"current\", \"error\", \"loading\", \"ready\"] as const;\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n}\n\nfunction attach_query_resource_methods<Output>(\n resource: unknown,\n effect: EffectRemoteQuery<Output>,\n): void {\n const methods = is_query_resource<Output>(resource) ? resource : undefined;\n const refresh = methods?.refresh;\n const set = methods?.set;\n const with_override = methods?.withOverride;\n\n attach_remote_resource_getters(resource, effect);\n\n if (!methods) {\n return;\n }\n\n if (typeof refresh === \"function\") {\n Object.defineProperty(effect, \"refresh\", {\n configurable: true,\n value: () =>\n Effect.tryPromise({\n try: () => Promise.resolve(refresh.call(resource)),\n catch: (error: unknown) => error,\n }),\n });\n }\n\n if (typeof set === \"function\") {\n Object.defineProperty(effect, \"set\", {\n configurable: true,\n value: (value: Output) => set.call(resource, value),\n });\n }\n\n if (typeof with_override === \"function\") {\n Object.defineProperty(effect, \"withOverride\", {\n configurable: true,\n value: (update: (current: Output) => Output) =>\n with_override.call(resource, update),\n });\n }\n}\n\nfunction attach_live_resource_methods<Output>(\n resource: unknown,\n effect: EffectRemoteLiveQuery<Output>,\n): void {\n const methods = is_live_resource<Output>(resource) ? resource : undefined;\n const reconnect = methods?.reconnect;\n const async_iterator = methods?.[Symbol.asyncIterator];\n const keys = [\n \"connected\",\n \"current\",\n \"done\",\n \"error\",\n \"loading\",\n \"ready\",\n ] as const;\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n\n if (typeof reconnect === \"function\") {\n Object.defineProperty(effect, \"reconnect\", {\n configurable: true,\n value: () =>\n Effect.tryPromise({\n try: () => Promise.resolve(reconnect.call(resource)),\n catch: (error: unknown) => error,\n }),\n });\n }\n\n if (typeof async_iterator === \"function\") {\n Object.defineProperty(effect, Symbol.asyncIterator, {\n configurable: true,\n value: () => async_iterator.call(resource),\n });\n }\n}\n\n/**\n * Factory for a read-only remote query function.\n *\n * @example\n * ```ts\n * export const getUser = Query(Schema.Struct({ id: Schema.String }), (input) =>\n * Effect.succeed(input.id)\n * );\n * ```\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit query function.\n */\nfunction QueryRoot<A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n): EffectRemoteQueryFunction<void, A>;\nfunction QueryRoot<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n): EffectRemoteQueryFunction<Input, A>;\nfunction QueryRoot<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n): EffectRemoteQueryFunction<SchemaInput<S>, A>;\nfunction QueryRoot(\n validate_or_handler: unknown,\n maybe_handler?: RemoteHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return to_effect_query(native_query(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler, \"Query\") as never,\n ) as ReturnType<typeof native_query>);\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\"Query('unchecked', handler) requires a handler\");\n }\n\n return to_effect_query(native_query(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Query\",\n ) as never,\n ) as ReturnType<typeof native_query>);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query\");\n }\n}\n\n/**\n * Factory for a batched read-only remote query function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema or `\"unchecked\"` sentinel.\n * @param maybe_handler - Handler receiving validated inputs as one batch.\n * @returns A SvelteKit batch query function.\n */\nfunction QueryBatch<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: EffectRemoteBatchHandler<Input, A>,\n): EffectRemoteQueryFunction<Input, A>;\nfunction QueryBatch<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: EffectRemoteBatchHandler<SchemaInput<S>, A>,\n): EffectRemoteQueryFunction<SchemaInput<S>, A>;\nfunction QueryBatch(\n validate_or_handler: unknown,\n maybe_handler?: EffectRemoteBatchHandler,\n): unknown {\n try {\n if (!maybe_handler) {\n throw new Error(\"Query.batch requires a handler\");\n }\n\n return to_effect_query(native_query.batch(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(\n maybe_handler as RemoteHandler,\n \"Query.batch\",\n ) as never,\n ) as NativeQueryLike);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query.batch\");\n }\n}\n\n/**\n * Factory for a live remote query function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg live handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit live query function.\n */\nfunction QueryLive<A>(\n validate_or_handler: RemoteLiveHandler<void, A>,\n): EffectRemoteLiveQueryFunction<void, A>;\nfunction QueryLive<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteLiveHandler<Input, A>,\n): EffectRemoteLiveQueryFunction<Input, A>;\nfunction QueryLive<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteLiveHandler<SchemaInput<S>, A>,\n): EffectRemoteLiveQueryFunction<SchemaInput<S>, A>;\nfunction QueryLive(\n validate_or_handler: unknown,\n maybe_handler?: RemoteLiveHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return to_effect_live_query(native_query.live(\n normalize_validator(validate_or_handler) as never,\n make_remote_live_wrapper(\n maybe_handler,\n \"Query.live\",\n ) as never,\n ) as NativeQueryLike);\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\"Query.live('unchecked', handler) requires a handler\");\n }\n\n return to_effect_live_query(native_query.live(\n make_remote_live_wrapper(\n validate_or_handler as RemoteLiveHandler,\n \"Query.live\",\n ) as never,\n ) as NativeQueryLike);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query.live\");\n }\n}\n\n/**\n * Factory for read-only remote query functions.\n *\n * @example\n * ```ts\n * export const getUser = Query(Schema.Struct({ id: Schema.String }), (input) =>\n * Effect.succeed(input.id)\n * );\n *\n * export const getUserBatch = Query.batch(Schema.String, (ids) =>\n * Effect.succeed((id) => ids.includes(id))\n * );\n * ```\n *\n * @since 2.0.0\n */\nexport const Query: QueryFactory = Object.assign(QueryRoot, {\n batch: QueryBatch,\n live: QueryLive,\n});\n\n/**\n * Factory for a write-oriented remote command function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit command function.\n */\nexport function Command<A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n): EffectRemoteCommand<void, A>;\nexport function Command<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n): EffectRemoteCommand<Input, A>;\nexport function Command<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n): EffectRemoteCommand<SchemaInput<S>, A>;\nexport function Command(\n validate_or_handler: unknown,\n maybe_handler?: RemoteHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return native_command(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler, \"Command\") as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\"Command('unchecked', handler) requires a handler\");\n }\n\n return native_command(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Command\",\n ) as never,\n ) as ReturnType<typeof native_command>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Command\");\n }\n}\n\n/**\n * Factory for a remote form handler.\n *\n * @example\n * ```ts\n * export const SignIn = Form(signInSchema, ({ data, invalid }) =>\n * Effect.gen(function* () {\n * if (!data.email.includes(\"@\")) {\n * return yield* invalid.email(\"Use an email address.\");\n * }\n *\n * return { email: data.email };\n * })\n * );\n * ```\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit form function.\n */\nexport function Form<A>(\n validate_or_handler: EffectLike<A> | RemoteFormHandler<void, A>,\n): EffectRemoteForm<void, A>;\nexport function Form<Input extends RemoteFormInput, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteFormHandler<Input, A>,\n): EffectRemoteForm<Input, A>;\nexport function Form<S extends Schema.Top, A>(\n validate_or_handler: S,\n maybe_handler: RemoteFormHandler<SchemaInput<S>, A>,\n): EffectRemoteForm<FormSchemaEncodedInput<S>, A>;\nexport function Form(\n validate_or_handler: unknown,\n maybe_handler?: RemoteFormHandler<never, unknown>,\n): unknown {\n try {\n if (maybe_handler) {\n return native_form(\n normalize_validator(validate_or_handler) as never,\n make_remote_form_wrapper(maybe_handler, \"Form\") as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\"Form('unchecked', handler) requires a handler\");\n }\n\n const inputless_handler: RemoteFormHandler<void, unknown> = (\n { data, invalid, issue },\n ) => {\n if (is_handler(validate_or_handler)) {\n return validate_or_handler({ data, invalid, issue });\n }\n\n return validate_or_handler as EffectLike;\n };\n\n return native_form(\n make_remote_form_wrapper(inputless_handler, \"Form\") as never,\n ) as unknown as ReturnType<typeof native_form>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Form\");\n }\n}\n\n/**\n * Factory for a prerenderable remote function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler_or_options - Handler or prerender options.\n * @param maybe_options - Prerender options used with a validator.\n * @returns A SvelteKit prerender function.\n */\nexport function Prerender(\n validate_or_handler: unknown,\n maybe_handler_or_options?: RemoteHandler | PrerenderOptions,\n maybe_options?: PrerenderOptions,\n): ReturnType<typeof native_prerender> {\n try {\n if (is_handler(maybe_handler_or_options)) {\n return native_prerender(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler_or_options, \"Prerender\") as never,\n maybe_options as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\"Prerender('unchecked', handler) requires a handler\");\n }\n\n return native_prerender(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Prerender\",\n ) as never,\n maybe_handler_or_options as never,\n ) as ReturnType<typeof native_prerender>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Prerender\");\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":["get_native_request_event","get_native_request_event","native_query","native_command","native_form","native_prerender"],"sources":["../../modules/svelte-effect-runtime/src/server/schema.ts","../../modules/svelte-effect-runtime/src/server/runtime.ts","../../modules/svelte-effect-runtime/src/server/effects.ts","../../modules/svelte-effect-runtime/src/server/invalid.ts","../../modules/svelte-effect-runtime/src/server/wrappers.ts","../../modules/svelte-effect-runtime/src/server/factories.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\nimport type { RemoteHandler, StandardSchema } from \"./types.ts\";\n\n/**\n * Checks whether a value is the string sentinel for unchecked remotes.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is `\"unchecked\"`.\n */\nexport function is_unchecked(value: unknown): value is \"unchecked\" {\n return value === \"unchecked\";\n}\n\n/**\n * Checks whether a value is a remote handler function.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is callable as a handler.\n */\nexport function is_handler(value: unknown): value is RemoteHandler {\n return typeof value === \"function\";\n}\n\n/**\n * Checks whether a value implements the Standard Schema contract.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is a Standard Schema.\n */\nexport function is_standard_schema(value: unknown): value is StandardSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"~standard\" in value\n );\n}\n\n/**\n * Checks whether a value looks like an Effect Schema.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value should be converted to Standard Schema.\n */\nexport function is_effect_schema(\n value: unknown,\n): value is Schema.Schema<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"ast\" in value &&\n \"make\" in value\n );\n}\n\n/**\n * Converts Effect Schema inputs to Standard Schema for SvelteKit.\n *\n * @since 2.0.0\n * @param value - Schema or handler input.\n * @returns Original value or Standard Schema view of an Effect Schema.\n */\nexport function normalize_validator(value: unknown): unknown {\n if (is_standard_schema(value) || !is_effect_schema(value)) {\n return value;\n }\n\n return Schema.toStandardSchemaV1(value as never);\n}\n","import type { RequestEvent as SvelteKitRequestEvent } from \"@sveltejs/kit\";\nimport { Context, Layer, ManagedRuntime } from \"effect\";\n\n/**\n * Subset of SvelteKit's `RequestEvent` that remote handlers typically access.\n *\n * @since 2.0.0\n */\nexport interface RequestEvent extends\n Pick<\n SvelteKitRequestEvent,\n | \"cookies\"\n | \"getClientAddress\"\n | \"locals\"\n | \"params\"\n | \"platform\"\n | \"request\"\n | \"route\"\n | \"url\"\n > {}\n\n/**\n * SvelteKit's `RequestEvent` exposed as an Effect {@link Context.Tag}.\n *\n * @example\n * ```ts\n * const event = yield* RequestEvent;\n * ```\n *\n * @since 2.0.0\n */\nexport const RequestEvent: Context.Reference<RequestEvent> = Context\n .Reference<RequestEvent>(\"@ser/RequestEvent\", {\n defaultValue: () => {\n throw new Error(\n \"[REQUEST_EVENT_UNAVAILABLE]: RequestEvent is only available during a remote call\",\n );\n },\n });\n\n/**\n * Builder for the server-side Effect runtime.\n *\n * @example\n * ```ts\n * ServerRuntime.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n */\nexport class ServerRuntime {\n /**\n * Build and cache the server-side `ManagedRuntime`.\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n * @returns The configured ManagedRuntime.\n */\n static make<R = never>(\n layer?: Layer.Layer<R>,\n ): ManagedRuntime.ManagedRuntime<R, never> {\n const runtime = ManagedRuntime.make(\n layer ?? (Layer.empty as unknown as Layer.Layer<R>),\n );\n\n current_server_runtime = runtime as ManagedRuntime.ManagedRuntime<\n unknown,\n never\n >;\n\n return runtime;\n }\n}\n\nlet current_server_runtime:\n | ManagedRuntime.ManagedRuntime<unknown, never>\n | undefined;\n\n/**\n * Returns the active server runtime, creating a default one if needed.\n *\n * @example\n * ```ts\n * const runtime = get_server_runtime_or_throw();\n * ```\n *\n * @since 2.0.0\n * @returns The current ManagedRuntime instance.\n */\nexport function get_server_runtime_or_throw(): ManagedRuntime.ManagedRuntime<\n unknown,\n never\n> {\n if (!current_server_runtime) {\n current_server_runtime = ManagedRuntime.make(\n Layer.empty,\n ) as ManagedRuntime.ManagedRuntime<unknown, never>;\n }\n\n return current_server_runtime;\n}\n","import { run_remote_effect } from \"$/remote/server.ts\";\nimport { error as svelte_error, invalid } from \"@sveltejs/kit\";\nimport { Effect, Stream } from \"effect\";\n\nimport { get_server_runtime_or_throw, RequestEvent } from \"./runtime.ts\";\nimport type { RequestEvent as RequestEventShape } from \"./runtime.ts\";\nimport type { EffectLike, EffectRemoteLiveSource } from \"./types.ts\";\n\ntype ResolvedLiveSource<A> =\n | AsyncIterable<A>\n | AsyncIterator<A>\n | Iterable<A>\n | Iterator<A>;\n\ntype LiveHandlerResult<A> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>;\n\n/**\n * Checks whether a value is an Effect generator return object.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value should be wrapped with `Effect.gen`.\n */\nexport function is_generator_result<A>(\n value: unknown,\n): value is Effect.gen.Return<A, unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { next?: unknown }).next === \"function\"\n );\n}\n\n/**\n * Normalizes an Effect-like handler return value into an Effect.\n *\n * @since 2.0.0\n * @param value - Effect or generator return value.\n * @returns Normalized Effect.\n */\nexport function to_effect<A>(\n value: EffectLike<A>,\n): Effect.Effect<A, unknown, unknown> {\n if (is_generator_result<A>(value)) {\n return Effect.gen(() => value);\n }\n\n return value;\n}\n\n/**\n * Checks whether a value is a live query source SvelteKit can consume.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value is an Effect Stream or native iterable source.\n */\nexport function is_live_source<A>(\n value: unknown,\n): value is EffectRemoteLiveSource<A> {\n if (Stream.isStream(value)) {\n return true;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const source = value as {\n readonly next?: unknown;\n readonly [Symbol.asyncIterator]?: unknown;\n readonly [Symbol.iterator]?: unknown;\n };\n\n return (\n typeof source.next === \"function\" ||\n typeof source[Symbol.asyncIterator] === \"function\" ||\n typeof source[Symbol.iterator] === \"function\"\n );\n}\n\n/**\n * Runs and normalizes a live query handler result with request services\n * available to Effect Streams.\n *\n * @since 2.0.0\n * @param value - Live query source or Effect that resolves to one.\n * @param event - SvelteKit request event for this remote call.\n * @returns Promise resolving with a source SvelteKit can stream.\n */\nexport function run_live_handler_source<A>(\n value: LiveHandlerResult<A>,\n event: RequestEventShape,\n): Promise<ResolvedLiveSource<A>> {\n const runtime = get_server_runtime_or_throw();\n const effect = Effect.provideService(\n to_live_source_effect(value),\n RequestEvent,\n event,\n ) as Effect.Effect<ResolvedLiveSource<A>, unknown, unknown>;\n\n return run_remote_effect(\n effect,\n runtime,\n svelte_invalid,\n svelte_remote_error,\n );\n}\n\nfunction to_live_source_effect<A>(\n value: LiveHandlerResult<A>,\n): Effect.Effect<ResolvedLiveSource<A>, unknown, unknown> {\n if (Stream.isStream(value)) {\n return Stream.toAsyncIterableEffect(\n value as Stream.Stream<A, unknown, unknown>,\n ) as Effect.Effect<ResolvedLiveSource<A>, unknown, unknown>;\n }\n\n if (is_native_live_source<A>(value)) {\n return Effect.succeed(value);\n }\n\n if (!Effect.isEffect(value)) {\n return Effect.fail(\n new Error(\n \"[INVALID_LIVE_QUERY_SOURCE]: Query.live handler must return an Effect Stream, Iterable, or AsyncIterable\",\n ),\n );\n }\n\n return Effect.flatMap(\n value as Effect.Effect<EffectRemoteLiveSource<A>, unknown, unknown>,\n to_live_source_effect,\n );\n}\n\nfunction is_native_live_source<A>(\n value: unknown,\n): value is ResolvedLiveSource<A> {\n return is_live_source<A>(value) && !Stream.isStream(value);\n}\n\n/**\n * Runs a remote handler Effect with the current request event provided.\n *\n * @since 2.0.0\n * @param value - Handler return value.\n * @param event - SvelteKit request event for this remote call.\n * @returns Promise resolving with the handler output.\n */\nexport function run_handler_effect<A>(\n value: EffectLike<A>,\n event: RequestEventShape,\n): Promise<A> {\n const runtime = get_server_runtime_or_throw();\n const effect = Effect.provideService(\n to_effect(value),\n RequestEvent,\n event,\n ) as Effect.Effect<A, unknown, unknown>;\n\n return run_remote_effect(\n effect,\n runtime,\n svelte_invalid,\n svelte_remote_error,\n );\n}\n\nconst svelte_invalid = (_status: number, body: unknown): never => {\n const issues = typeof body === \"object\" && body !== null &&\n Array.isArray((body as { issues?: unknown }).issues)\n ? (body as { issues: unknown[] }).issues\n : [String(body)];\n\n invalid(...(issues as never[]));\n};\n\nconst svelte_remote_error = (status: number, body: unknown): never => {\n svelte_error(status as never, body as never);\n};\n","import { create_form_error } from \"$/remote/shared.ts\";\nimport { Effect } from \"effect\";\nimport type { FormIssue } from \"$/remote/shared.ts\";\n\nimport type { FormInvalid } from \"./types.ts\";\n\n/**\n * Creates a path-aware proxy for remote form validation failures.\n *\n * @since 2.0.0\n * @param path - Current nested form path.\n * @returns Callable invalid proxy for this path.\n */\nexport function make_invalid_proxy(\n path: readonly (string | number)[] = [],\n): FormInvalid {\n const invalid_at_path = (message: string) =>\n Effect.fail(\n create_form_error([{ message, path: [...path] } satisfies FormIssue]),\n );\n\n return new Proxy(invalid_at_path, {\n get(_target, property) {\n if (typeof property === \"symbol\") {\n return undefined;\n }\n\n return make_invalid_proxy([...path, property]);\n },\n }) as FormInvalid;\n}\n","import { getRequestEvent as get_native_request_event } from \"$app/server\";\nimport { normalize_remote_helper_error } from \"$/remote/server.ts\";\n\nimport { run_handler_effect, run_live_handler_source } from \"./effects.ts\";\nimport { make_invalid_proxy } from \"./invalid.ts\";\nimport { is_handler } from \"./schema.ts\";\nimport type { RequestEvent } from \"./runtime.ts\";\nimport type {\n EffectLike,\n EffectRemoteLiveSource,\n RemoteFormHandler,\n RemoteHandler,\n} from \"./types.ts\";\n\ntype RemoteLiveHandler<Input = unknown, A = unknown> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>\n | ((input: Input) =>\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>);\n\nlet running_remote_effect_handlers = 0;\n\n/**\n * Reports whether SER is currently executing user remote handler code.\n *\n * @example\n * ```ts\n * if (is_running_remote_effect_handler()) {\n * return query();\n * }\n * ```\n *\n * @since 2.0.0\n * @returns Whether a remote handler wrapper is currently active.\n * @internal\n */\nexport function is_running_remote_effect_handler(): boolean {\n return running_remote_effect_handlers > 0;\n}\n\n/**\n * Builds the wrapper passed to native query, command, and prerender helpers.\n *\n * @since 2.0.0\n * @param handler - Effect handler or already-built Effect-like value.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit handler wrapper.\n */\nexport function make_remote_wrapper(\n handler: RemoteHandler | EffectLike,\n helper_name: string,\n): (input: unknown) => Promise<unknown> {\n return async (input: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n try {\n const result = is_handler(handler) ? handler(input) : handler;\n\n return run_handler_effect(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\n/**\n * Builds the wrapper passed to native live query helpers.\n *\n * @since 2.0.0\n * @param handler - Effect-aware live source handler.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit live query wrapper.\n */\nexport function make_remote_live_wrapper<Input, A>(\n handler: RemoteLiveHandler<Input, A>,\n helper_name: string,\n): (input: unknown) => Promise<unknown> {\n return async (input: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n try {\n const result = typeof handler === \"function\"\n ? handler(input as Input)\n : handler;\n\n return run_live_handler_source(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\n/**\n * Builds the wrapper passed to native form helpers.\n *\n * @since 2.0.0\n * @param handler - Effect-aware form handler.\n * @param helper_name - Remote helper name for error normalization.\n * @returns Native SvelteKit form handler wrapper.\n */\nexport function make_remote_form_wrapper<Input, A>(\n handler: RemoteFormHandler<Input, A>,\n helper_name: string,\n): (data: unknown, issue: unknown) => Promise<unknown> {\n return async (data: unknown, issue: unknown) => {\n let event: RequestEvent;\n\n try {\n event = get_native_request_event() as unknown as RequestEvent;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n\n return await run_inside_remote_effect_handler(() => {\n const invalid_proxy = make_invalid_proxy();\n\n try {\n const result = handler({\n data: data as Input,\n invalid: invalid_proxy,\n issue,\n });\n\n return run_handler_effect(result, event);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, helper_name);\n }\n });\n };\n}\n\nasync function run_inside_remote_effect_handler<A>(\n run: () => Promise<A>,\n): Promise<A> {\n running_remote_effect_handlers += 1;\n\n try {\n return await run();\n } finally {\n running_remote_effect_handlers -= 1;\n }\n}\n","import {\n command as native_command,\n form as native_form,\n getRequestEvent as get_native_request_event,\n prerender as native_prerender,\n query as native_query,\n} from \"$app/server\";\nimport { copy_property_descriptors } from \"$/internal/descriptors.ts\";\nimport { normalize_remote_helper_error } from \"$/remote/server.ts\";\nimport type { RemoteFormInput } from \"@sveltejs/kit\";\nimport { Effect, type Schema } from \"effect\";\n\nimport { is_handler, is_unchecked, normalize_validator } from \"./schema.ts\";\nimport {\n is_running_remote_effect_handler,\n make_remote_form_wrapper,\n make_remote_live_wrapper,\n make_remote_wrapper,\n} from \"./wrappers.ts\";\nimport type {\n EffectLike,\n EffectRemoteBatchHandler,\n EffectRemoteCommand,\n EffectRemoteForm,\n EffectRemoteLiveQuery,\n EffectRemoteLiveQueryFunction,\n EffectRemoteLiveSource,\n EffectRemoteQuery,\n EffectRemoteQueryFunction,\n PrerenderOptions,\n RemoteFormHandler,\n RemoteHandler,\n SchemaInput,\n} from \"./types.ts\";\n\ntype FormSchemaEncodedInput<S> = S extends Schema.Top\n ? S[\"Encoded\"] extends RemoteFormInput ? S[\"Encoded\"]\n : never\n : never;\n\ntype NativeQueryLike<Input = unknown> = (input: Input) => unknown;\n\ntype EffectRemoteResource<Output> =\n | EffectRemoteLiveQuery<Output>\n | EffectRemoteQuery<Output>;\n\ntype RemoteLiveHandler<Input = unknown, A = unknown> =\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>\n | ((input: Input) =>\n | EffectLike<EffectRemoteLiveSource<A>>\n | EffectRemoteLiveSource<A>);\n\ninterface QueryFactory {\n <A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n ): EffectRemoteQueryFunction<void, A>;\n <Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n ): EffectRemoteQueryFunction<Input, A>;\n <S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n ): EffectRemoteQueryFunction<SchemaInput<S>, A>;\n\n readonly batch: typeof QueryBatch;\n readonly live: typeof QueryLive;\n}\n\nfunction to_effect_query<Input, Output>(\n native: NativeQueryLike<Input>,\n): EffectRemoteQueryFunction<Input, Output> {\n const wrapped = ((input: Input) => {\n if (is_current_remote_request()) {\n return (native as (input: Input) => unknown)(input);\n }\n\n const resource = (native as (input: Input) => unknown)(input);\n const effect = Effect.tryPromise({\n try: () => Promise.resolve(resource),\n catch: (error: unknown) => error,\n }) as unknown as EffectRemoteQuery<Output>;\n\n attach_query_resource_methods(resource, effect);\n\n return effect;\n }) as unknown as EffectRemoteQueryFunction<Input, Output>;\n\n copy_property_descriptors(native, wrapped);\n\n return wrapped;\n}\n\nfunction is_current_remote_request(): boolean {\n if (is_running_remote_effect_handler()) {\n return false;\n }\n\n try {\n const event = get_native_request_event() as { isRemoteRequest?: boolean };\n\n return event.isRemoteRequest === true;\n } catch {\n return false;\n }\n}\n\nfunction to_effect_live_query<Input, Output>(\n native: NativeQueryLike<Input>,\n): EffectRemoteLiveQueryFunction<Input, Output> {\n const wrapped = ((input: Input) => {\n const resource = (native as (input: Input) => unknown)(input);\n const effect = Effect.tryPromise({\n try: () => Promise.resolve(resource),\n catch: (error: unknown) => error,\n }) as unknown as EffectRemoteLiveQuery<Output>;\n\n attach_live_resource_methods(resource, effect);\n\n return effect;\n }) as unknown as EffectRemoteLiveQueryFunction<Input, Output>;\n\n copy_property_descriptors(native, wrapped);\n\n return wrapped;\n}\n\ntype NativeRemoteResource<Output> = {\n readonly current?: Output;\n readonly error?: unknown;\n readonly loading?: boolean;\n readonly ready?: boolean;\n};\n\ntype NativeQueryResource<Output> = NativeRemoteResource<Output> & {\n readonly refresh?: () => Promise<void>;\n readonly set?: (value: Output) => void;\n readonly withOverride?: (update: (current: Output) => Output) => unknown;\n};\n\ntype NativeLiveQueryResource<Output> =\n & NativeRemoteResource<Output>\n & Partial<AsyncIterable<Output>>\n & {\n readonly connected?: boolean;\n readonly done?: boolean;\n readonly reconnect?: () => Promise<void>;\n };\n\nfunction is_query_resource<Output>(\n resource: unknown,\n): resource is NativeQueryResource<Output> {\n const resource_type = typeof resource;\n\n return (\n (resource_type === \"object\" && resource !== null) ||\n resource_type === \"function\"\n );\n}\n\nfunction is_live_resource<Output>(\n resource: unknown,\n): resource is NativeLiveQueryResource<Output> {\n const resource_type = typeof resource;\n\n return (\n (resource_type === \"object\" && resource !== null) ||\n resource_type === \"function\"\n );\n}\n\nfunction attach_remote_resource_getters<Output>(\n resource: unknown,\n effect: EffectRemoteResource<Output>,\n): void {\n const methods = is_query_resource<Output>(resource) ? resource : undefined;\n const keys = [\"current\", \"error\", \"loading\", \"ready\"] as const;\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n}\n\nfunction attach_query_resource_methods<Output>(\n resource: unknown,\n effect: EffectRemoteQuery<Output>,\n): void {\n const methods = is_query_resource<Output>(resource) ? resource : undefined;\n const refresh = methods?.refresh;\n const set = methods?.set;\n const with_override = methods?.withOverride;\n\n attach_remote_resource_getters(resource, effect);\n\n if (!methods) {\n return;\n }\n\n if (typeof refresh === \"function\") {\n Object.defineProperty(effect, \"refresh\", {\n configurable: true,\n value: () =>\n Effect.tryPromise({\n try: () => Promise.resolve(refresh.call(resource)),\n catch: (error: unknown) => error,\n }),\n });\n }\n\n if (typeof set === \"function\") {\n Object.defineProperty(effect, \"set\", {\n configurable: true,\n value: (value: Output) => set.call(resource, value),\n });\n }\n\n if (typeof with_override === \"function\") {\n Object.defineProperty(effect, \"withOverride\", {\n configurable: true,\n value: (update: (current: Output) => Output) =>\n with_override.call(resource, update),\n });\n }\n}\n\nfunction attach_live_resource_methods<Output>(\n resource: unknown,\n effect: EffectRemoteLiveQuery<Output>,\n): void {\n const methods = is_live_resource<Output>(resource) ? resource : undefined;\n const reconnect = methods?.reconnect;\n const async_iterator = methods?.[Symbol.asyncIterator];\n const keys = [\n \"connected\",\n \"current\",\n \"done\",\n \"error\",\n \"loading\",\n \"ready\",\n ] as const;\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n\n if (typeof reconnect === \"function\") {\n Object.defineProperty(effect, \"reconnect\", {\n configurable: true,\n value: () =>\n Effect.tryPromise({\n try: () => Promise.resolve(reconnect.call(resource)),\n catch: (error: unknown) => error,\n }),\n });\n }\n\n if (typeof async_iterator === \"function\") {\n Object.defineProperty(effect, Symbol.asyncIterator, {\n configurable: true,\n value: () => async_iterator.call(resource),\n });\n }\n}\n\n/**\n * Factory for a read-only remote query function.\n *\n * @example\n * ```ts\n * export const getUser = Query(Schema.Struct({ id: Schema.String }), (input) =>\n * Effect.succeed(input.id)\n * );\n * ```\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit query function.\n */\nfunction QueryRoot<A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n): EffectRemoteQueryFunction<void, A>;\nfunction QueryRoot<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n): EffectRemoteQueryFunction<Input, A>;\nfunction QueryRoot<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n): EffectRemoteQueryFunction<SchemaInput<S>, A>;\nfunction QueryRoot(\n validate_or_handler: unknown,\n maybe_handler?: RemoteHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return to_effect_query(native_query(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler, \"Query\") as never,\n ) as ReturnType<typeof native_query>);\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Query('unchecked', handler) requires a handler\",\n );\n }\n\n return to_effect_query(native_query(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Query\",\n ) as never,\n ) as ReturnType<typeof native_query>);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query\");\n }\n}\n\n/**\n * Factory for a batched read-only remote query function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema or `\"unchecked\"` sentinel.\n * @param maybe_handler - Handler receiving validated inputs as one batch.\n * @returns A SvelteKit batch query function.\n */\nfunction QueryBatch<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: EffectRemoteBatchHandler<Input, A>,\n): EffectRemoteQueryFunction<Input, A>;\nfunction QueryBatch<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: EffectRemoteBatchHandler<SchemaInput<S>, A>,\n): EffectRemoteQueryFunction<SchemaInput<S>, A>;\nfunction QueryBatch(\n validate_or_handler: unknown,\n maybe_handler?: EffectRemoteBatchHandler,\n): unknown {\n try {\n if (!maybe_handler) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Query.batch requires a handler\",\n );\n }\n\n return to_effect_query(native_query.batch(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(\n maybe_handler as RemoteHandler,\n \"Query.batch\",\n ) as never,\n ) as NativeQueryLike);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query.batch\");\n }\n}\n\n/**\n * Factory for a live remote query function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg live handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit live query function.\n */\nfunction QueryLive<A>(\n validate_or_handler: RemoteLiveHandler<void, A>,\n): EffectRemoteLiveQueryFunction<void, A>;\nfunction QueryLive<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteLiveHandler<Input, A>,\n): EffectRemoteLiveQueryFunction<Input, A>;\nfunction QueryLive<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteLiveHandler<SchemaInput<S>, A>,\n): EffectRemoteLiveQueryFunction<SchemaInput<S>, A>;\nfunction QueryLive(\n validate_or_handler: unknown,\n maybe_handler?: RemoteLiveHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return to_effect_live_query(native_query.live(\n normalize_validator(validate_or_handler) as never,\n make_remote_live_wrapper(\n maybe_handler,\n \"Query.live\",\n ) as never,\n ) as NativeQueryLike);\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Query.live('unchecked', handler) requires a handler\",\n );\n }\n\n return to_effect_live_query(native_query.live(\n make_remote_live_wrapper(\n validate_or_handler as RemoteLiveHandler,\n \"Query.live\",\n ) as never,\n ) as NativeQueryLike);\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Query.live\");\n }\n}\n\n/**\n * Factory for read-only remote query functions.\n *\n * @example\n * ```ts\n * export const getUser = Query(Schema.Struct({ id: Schema.String }), (input) =>\n * Effect.succeed(input.id)\n * );\n *\n * export const getUserBatch = Query.batch(Schema.String, (ids) =>\n * Effect.succeed((id) => ids.includes(id))\n * );\n * ```\n *\n * @since 2.0.0\n */\nexport const Query: QueryFactory = Object.assign(QueryRoot, {\n batch: QueryBatch,\n live: QueryLive,\n});\n\n/**\n * Factory for a write-oriented remote command function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit command function.\n */\nexport function Command<A>(\n validate_or_handler: EffectLike<A> | RemoteHandler<void, A>,\n): EffectRemoteCommand<void, A>;\nexport function Command<Input, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteHandler<Input, A>,\n): EffectRemoteCommand<Input, A>;\nexport function Command<S extends Schema.Schema<unknown>, A>(\n validate_or_handler: S,\n maybe_handler: RemoteHandler<SchemaInput<S>, A>,\n): EffectRemoteCommand<SchemaInput<S>, A>;\nexport function Command(\n validate_or_handler: unknown,\n maybe_handler?: RemoteHandler,\n): unknown {\n try {\n if (maybe_handler) {\n return native_command(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler, \"Command\") as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Command('unchecked', handler) requires a handler\",\n );\n }\n\n return native_command(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Command\",\n ) as never,\n ) as ReturnType<typeof native_command>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Command\");\n }\n}\n\n/**\n * Factory for a remote form handler.\n *\n * @example\n * ```ts\n * export const SignIn = Form(signInSchema, ({ data, invalid }) =>\n * Effect.gen(function* () {\n * if (!data.email.includes(\"@\")) {\n * return yield* invalid.email(\"Use an email address.\");\n * }\n *\n * return { email: data.email };\n * })\n * );\n * ```\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler - Handler used when a validator is supplied.\n * @returns A SvelteKit form function.\n */\nexport function Form<A>(\n validate_or_handler: EffectLike<A> | RemoteFormHandler<void, A>,\n): EffectRemoteForm<void, A>;\nexport function Form<Input extends RemoteFormInput, A>(\n validate_or_handler: \"unchecked\",\n maybe_handler: RemoteFormHandler<Input, A>,\n): EffectRemoteForm<Input, A>;\nexport function Form<S extends Schema.Top, A>(\n validate_or_handler: S,\n maybe_handler: RemoteFormHandler<SchemaInput<S>, A>,\n): EffectRemoteForm<FormSchemaEncodedInput<S>, A>;\nexport function Form(\n validate_or_handler: unknown,\n maybe_handler?: RemoteFormHandler<never, unknown>,\n): unknown {\n try {\n if (maybe_handler) {\n return native_form(\n normalize_validator(validate_or_handler) as never,\n make_remote_form_wrapper(maybe_handler, \"Form\") as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Form('unchecked', handler) requires a handler\",\n );\n }\n\n const inputless_handler: RemoteFormHandler<void, unknown> = (\n { data, invalid, issue },\n ) => {\n if (is_handler(validate_or_handler)) {\n return validate_or_handler({ data, invalid, issue });\n }\n\n return validate_or_handler as EffectLike;\n };\n\n return native_form(\n make_remote_form_wrapper(inputless_handler, \"Form\") as never,\n ) as unknown as ReturnType<typeof native_form>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Form\");\n }\n}\n\n/**\n * Factory for a prerenderable remote function.\n *\n * @since 2.0.0\n * @param validate_or_handler - A schema, `\"unchecked\"`, or no-arg handler.\n * @param maybe_handler_or_options - Handler or prerender options.\n * @param maybe_options - Prerender options used with a validator.\n * @returns A SvelteKit prerender function.\n */\nexport function Prerender(\n validate_or_handler: unknown,\n maybe_handler_or_options?: RemoteHandler | PrerenderOptions,\n maybe_options?: PrerenderOptions,\n): ReturnType<typeof native_prerender> {\n try {\n if (is_handler(maybe_handler_or_options)) {\n return native_prerender(\n normalize_validator(validate_or_handler) as never,\n make_remote_wrapper(maybe_handler_or_options, \"Prerender\") as never,\n maybe_options as never,\n );\n }\n\n if (is_unchecked(validate_or_handler)) {\n throw new Error(\n \"[MISSING_REMOTE_HANDLER]: Prerender('unchecked', handler) requires a handler\",\n );\n }\n\n return native_prerender(\n make_remote_wrapper(\n validate_or_handler as RemoteHandler,\n \"Prerender\",\n ) as never,\n maybe_handler_or_options as never,\n ) as ReturnType<typeof native_prerender>;\n } catch (error: unknown) {\n throw normalize_remote_helper_error(error, \"Prerender\");\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-effect-runtime",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Core module that houses the Vite plugin to enable effectful execution.",
5
5
  "license": "BSD-3-Clause",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-BeOE81fW.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/remote/client/failures.ts","../../../modules/svelte-effect-runtime/src/remote/client/responses.ts","../../../modules/svelte-effect-runtime/src/remote/client/effect.ts","../../../modules/svelte-effect-runtime/src/remote/client/utils.ts","../../../modules/svelte-effect-runtime/src/remote/client/command.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-data.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-transport.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-enhance.ts","../../../modules/svelte-effect-runtime/src/remote/client/form.ts","../../../modules/svelte-effect-runtime/src/remote/client/query-result.ts","../../../modules/svelte-effect-runtime/src/remote/client/query.ts"],"sourcesContent":["import {\n create_remote_http_error,\n create_remote_transport_error,\n create_remote_validation_error,\n is_serialized_remote_failure_envelope,\n} from \"$/remote/shared.ts\";\nimport type { FormIssue, RemoteFailure } from \"$/remote/shared.ts\";\nimport { parse } from \"devalue\";\n\n/**\n * Decodes a raw wire value into a remote failure when it uses the runtime\n * failure envelope.\n *\n * @example\n * ```ts\n * const failure = decode_remote_error(body);\n * ```\n *\n * @since 2.0.0\n * @param raw - Raw value received from the network or SvelteKit error body.\n * @param decode - Optional devalue decoder for custom error payloads.\n * @returns The decoded failure/value, or a transport error when decoding fails.\n */\nexport function decode_remote_error(\n raw: unknown,\n decode?: (encoded: string) => unknown,\n): RemoteFailure<unknown> | unknown {\n const embedded = parse_embedded_remote_failure(raw);\n\n if (embedded !== raw) {\n return decode_remote_error(embedded, decode);\n }\n\n if (is_serialized_remote_failure_envelope(raw)) {\n try {\n const decoded = decode ? decode(raw.encoded) : parse(raw.encoded);\n\n return decoded as RemoteFailure<unknown>;\n } catch {\n return create_remote_transport_error(\n new Error(\"Failed to decode remote error payload\"),\n raw,\n );\n }\n }\n\n return raw;\n}\n\nfunction parse_embedded_remote_failure(raw: unknown): unknown {\n if (typeof raw === \"string\") {\n return parse_json_or_original(raw);\n }\n\n if (typeof raw !== \"object\" || raw === null || !(\"message\" in raw)) {\n return raw;\n }\n\n const message = (raw as { message?: unknown }).message;\n\n if (typeof message !== \"string\") {\n return raw;\n }\n\n const parsed = parse_json_or_original(message);\n\n return parsed === message ? raw : parsed;\n}\n\nfunction parse_json_or_original(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\n/**\n * Checks whether a decoded value is a tagged remote failure.\n *\n * @example\n * ```ts\n * if (is_decoded_remote_failure(value)) throw value;\n * ```\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value carries a `_tag` discriminator.\n */\nexport function is_decoded_remote_failure(\n value: unknown,\n): value is RemoteFailure<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value\n );\n}\n\n/**\n * Checks whether a response body represents SvelteKit validation issues.\n *\n * @example\n * ```ts\n * if (is_validation_body(body)) return body.issues;\n * ```\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value contains a form issue list.\n */\nexport function is_validation_body(\n value: unknown,\n): value is { issues: readonly FormIssue[] } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Array.isArray((value as { issues?: unknown }).issues)\n );\n}\n\n/**\n * Normalizes native thrown values into the runtime's remote failure model.\n *\n * @example\n * ```ts\n * const failure = normalize_native_error(error);\n * ```\n *\n * @since 2.0.0\n * @param error - Unknown value thrown by a native remote helper.\n * @returns A typed remote failure.\n */\nexport function normalize_native_error(error: unknown): RemoteFailure<unknown> {\n const body = get_error_body(error);\n const decoded = decode_remote_error(body);\n const status = get_error_status(error);\n\n if (is_decoded_remote_failure(decoded)) {\n return decoded;\n }\n\n if (status === 400 && is_validation_body(body)) {\n return create_remote_validation_error(body.issues, body, status);\n }\n\n if (status !== undefined) {\n return create_remote_http_error(status, body, error);\n }\n\n return create_remote_transport_error(error);\n}\n\nfunction get_error_status(error: unknown): number | undefined {\n if (typeof error !== \"object\" || error === null) {\n return undefined;\n }\n\n const status = (error as { status?: unknown }).status;\n\n return typeof status === \"number\" ? status : undefined;\n}\n\nfunction get_error_body(error: unknown): unknown {\n if (typeof error !== \"object\" || error === null) {\n return undefined;\n }\n\n if (\"body\" in error) {\n return (error as { body?: unknown }).body;\n }\n\n if (\"data\" in error) {\n return (error as { data?: unknown }).data;\n }\n\n return undefined;\n}\n","import {\n create_remote_http_error,\n create_remote_validation_error,\n} from \"$/remote/shared.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\n\nimport {\n decode_remote_error,\n is_decoded_remote_failure,\n is_validation_body,\n} from \"./failures.ts\";\n\n/**\n * Decodes a failed fetch response into the runtime failure model.\n *\n * @example\n * ```ts\n * const failure = await decode_response_failure(response);\n * ```\n *\n * @since 2.0.0\n * @param response - Failed fetch response returned by the remote endpoint.\n * @returns Remote failure represented by the response.\n */\nexport async function decode_response_failure(\n response: Response,\n): Promise<RemoteFailure<unknown>> {\n const body = await response.json().catch(() => undefined);\n const decoded = decode_remote_error(body);\n\n if (is_decoded_remote_failure(decoded)) {\n return decoded;\n }\n\n if (response.status === 400 && is_validation_body(body)) {\n return create_remote_validation_error(body.issues, body, response.status);\n }\n\n return create_remote_http_error(response.status, body);\n}\n\n/**\n * Decodes either a raw value or `Response` returned by a native remote helper.\n *\n * @example\n * ```ts\n * const output = await decode_response_or_value(result, decode_payload);\n * ```\n *\n * @since 2.0.0\n * @param value - Native result value or fetch response.\n * @param decode_payload - Function used to decode successful payloads.\n * @returns Decoded successful output.\n */\nexport async function decode_response_or_value<Output>(\n value: unknown,\n decode_payload: (value: unknown) => unknown,\n): Promise<Output> {\n if (value instanceof Response) {\n if (!value.ok) {\n throw await decode_response_failure(value);\n }\n\n const data = await value.json();\n\n return decode_payload(data) as Output;\n }\n\n return decode_payload(value) as Output;\n}\n","import type { RemoteFailure } from \"$/remote/shared.ts\";\nimport { Effect } from \"effect\";\n\nimport {\n is_decoded_remote_failure,\n normalize_native_error,\n} from \"./failures.ts\";\n\n/**\n * Wraps a promise-producing remote operation in an Effect with failure mapping.\n *\n * @example\n * ```ts\n * const program = make_effect_from_promise(() => native_remote(input));\n * ```\n *\n * @since 2.0.0\n * @param run - Promise-producing operation that invokes a native remote helper.\n * @returns Effect that maps thrown values into remote failures.\n */\nexport function make_effect_from_promise<Output>(\n run: () => Promise<Output>,\n): Effect.Effect<Output, RemoteFailure<unknown>> {\n return Effect.tryPromise({\n try: run,\n catch: (error: unknown) => {\n if (is_decoded_remote_failure(error)) {\n return error;\n }\n\n return normalize_native_error(error);\n },\n }) as Effect.Effect<Output, RemoteFailure<unknown>>;\n}\n","export { copy_property_descriptors } from \"$/internal/descriptors.ts\";\nimport type { NativeMethod } from \"./types.ts\";\n\n/**\n * Checks whether a value has a callable method property.\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @param key - Method key to look up.\n * @returns Whether the value has a function at `key`.\n */\nexport function has_method<K extends PropertyKey>(\n value: unknown,\n key: K,\n): value is Record<K, NativeMethod> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as Record<PropertyKey, unknown>)[key] === \"function\"\n );\n}\n","import type { RemoteFailure } from \"$/remote/shared.ts\";\nimport type { Effect } from \"effect\";\n\nimport { decode_response_or_value } from \"./responses.ts\";\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport { copy_property_descriptors, has_method } from \"./utils.ts\";\nimport type { NativeMethod, Pending } from \"./types.ts\";\n\n/**\n * Creates a remote command adapter. The adapter preserves the native\n * pending getter and turns each invocation into an Effect.\n *\n * @since 2.0.0\n * @param native_factory - SvelteKit's native command function or a legacy\n * response factory used by tests.\n * @param decode_payload - Function to decode the response payload.\n * @param _base - Deprecated transport base retained for compatibility.\n * @param pending - Optional pending counter for legacy response factories.\n * @returns A function returning an Effect of the response.\n * @internal\n */\nexport function create_remote_command_adapter<Input, Output>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n _base = \"\",\n pending?: Pending,\n): (input: Input) => Effect.Effect<Output, RemoteFailure<unknown>> {\n const invoke = has_method(native_factory, \"invoke\")\n ? native_factory.invoke\n : undefined;\n\n if (typeof native_factory !== \"function\" && !invoke) {\n throw new Error(\"Invalid command factory: expected a function\");\n }\n\n const count = pending ?? { value: 0 };\n\n const adapter = (input: Input) =>\n make_effect_from_promise(async () => {\n count.value += 1;\n\n try {\n const result = invoke\n ? await invoke(input)\n : await (native_factory as NativeMethod)(input);\n\n return await decode_response_or_value<Output>(result, decode_payload);\n } finally {\n count.value -= 1;\n }\n });\n\n copy_property_descriptors(native_factory, adapter);\n\n if (!Object.prototype.hasOwnProperty.call(adapter, \"pending\")) {\n Object.defineProperty(adapter, \"pending\", {\n get: () => count.value,\n });\n }\n\n return adapter;\n}\n","/**\n * Encodes remote form input into SvelteKit-compatible form data.\n *\n * @since 2.0.0\n * @param input - Input value supplied to the remote form.\n * @returns FormData payload for the remote endpoint.\n */\nexport function to_form_data(input: unknown): FormData {\n const form_data = new FormData();\n\n append_form_value(form_data, \"\", input);\n\n return form_data;\n}\n\nfunction append_form_value(\n form_data: FormData,\n path: string,\n value: unknown,\n): void {\n if (value === undefined) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n append_form_value(form_data, `${path}[]`, item);\n }\n\n return;\n }\n\n if (value instanceof Blob) {\n form_data.append(path, value);\n\n return;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [key, child] of Object.entries(value)) {\n const child_path = path.length === 0 ? key : `${path}.${key}`;\n\n append_form_value(form_data, child_path, child);\n }\n\n return;\n }\n\n if (typeof value === \"number\") {\n form_data.append(`n:${path}`, String(value));\n\n return;\n }\n\n if (typeof value === \"boolean\") {\n if (value) {\n form_data.append(`b:${path}`, \"on\");\n }\n\n return;\n }\n\n form_data.append(path, value === null ? \"\" : String(value));\n}\n","import {\n create_remote_http_error,\n create_remote_transport_error,\n create_remote_validation_error,\n} from \"$/remote/shared.ts\";\nimport type { FormIssue } from \"$/remote/shared.ts\";\nimport { parse } from \"devalue\";\n\nimport { decode_remote_error, is_decoded_remote_failure } from \"./failures.ts\";\nimport { decode_response_failure } from \"./responses.ts\";\nimport { to_form_data } from \"./form-data.ts\";\nimport type { NativeFormRecord } from \"./types.ts\";\n\n/**\n * Submits a native remote form through the SvelteKit remote endpoint.\n *\n * @since 2.0.0\n * @param form_obj - Native form object being adapted.\n * @param input - Form input value.\n * @param decode_payload - Function to decode successful payloads.\n * @param remote_base - Base URL for the remote endpoint.\n * @returns Decoded form output.\n */\nexport async function submit_remote_form<Output>(\n form_obj: NativeFormRecord,\n input: unknown,\n decode_payload: (value: unknown) => unknown,\n remote_base: string,\n): Promise<Output> {\n const action_id = get_remote_action_id(form_obj);\n\n if (!action_id || remote_base.length === 0) {\n throw create_remote_transport_error(\n new Error(\"Form has no submit method or remote endpoint\"),\n );\n }\n\n const response = await fetch(to_remote_form_url(remote_base, action_id), {\n method: \"POST\",\n body: to_form_data(input),\n });\n\n if (!response.ok) {\n throw await decode_response_failure(response);\n }\n\n const envelope = await response.json();\n\n return decode_form_response<Output>(envelope, decode_payload);\n}\n\n/**\n * Extracts SvelteKit's remote action id from a native form action URL.\n *\n * @since 2.0.0\n * @param form_obj - Native form object being adapted.\n * @returns Remote action id when present.\n */\nexport function get_remote_action_id(\n form_obj: NativeFormRecord,\n): string | undefined {\n const action = form_obj.action;\n\n if (typeof action !== \"string\") {\n return undefined;\n }\n\n const fallback = \"http://localhost/\";\n const href = typeof location === \"undefined\" ? fallback : location.href;\n const url = new URL(action, href);\n\n return url.searchParams.get(\"/remote\") ??\n url.searchParams.get(\"remote\") ??\n undefined;\n}\n\nfunction to_remote_form_url(remote_base: string, action_id: string): string {\n const parts = action_id.split(\"/\");\n const head = parts.slice(0, 2).join(\"/\");\n const tail = parts.slice(2).join(\"/\");\n const normalized_base = remote_base.replace(/\\/$/, \"\");\n\n if (tail.length === 0) {\n return `${normalized_base}/${head}`;\n }\n\n return `${normalized_base}/${head}/${encodeURIComponent(tail)}`;\n}\n\nfunction decode_form_response<Output>(\n envelope: unknown,\n decode_payload: (value: unknown) => unknown,\n): Output {\n if (\n typeof envelope !== \"object\" ||\n envelope === null ||\n !(\"type\" in envelope)\n ) {\n throw create_remote_transport_error(\n new Error(\"Invalid remote form response\"),\n envelope,\n );\n }\n\n const response = envelope as {\n type: string;\n result?: unknown;\n error?: unknown;\n status?: number;\n };\n\n if (response.type === \"error\") {\n const decoded = decode_remote_error(response.error);\n\n if (is_decoded_remote_failure(decoded)) {\n throw decoded;\n }\n\n throw create_remote_http_error(\n response.status ?? 500,\n response.error,\n );\n }\n\n if (response.type !== \"result\" || typeof response.result !== \"string\") {\n throw create_remote_transport_error(\n new Error(\"Unsupported remote form response\"),\n envelope,\n );\n }\n\n const parsed = parse(response.result);\n const decoded = decode_payload(parsed) as {\n issues?: readonly FormIssue[];\n result?: Output;\n };\n\n if (decoded.issues && decoded.issues.length > 0) {\n throw create_remote_validation_error(decoded.issues, decoded, 400);\n }\n\n return decoded.result as Output;\n}\n","import { get_dispatcher } from \"$/dispatcher.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\nimport { Effect } from \"effect\";\n\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport { has_method } from \"./utils.ts\";\nimport type { NativeMethod } from \"./types.ts\";\n\n/**\n * Wraps a remote form enhance callback so Effect return values are run.\n *\n * @since 2.0.0\n * @param callback - Native enhance callback to wrap.\n * @returns Wrapped callback or undefined.\n */\nexport function wrap_enhance_callback(\n callback: NativeMethod | undefined,\n): NativeMethod | undefined {\n if (!callback) {\n return undefined;\n }\n\n return (event: unknown) => {\n const wrapped_event = wrap_submit_callback(event);\n const result = callback(wrapped_event);\n\n if (Effect.isEffect(result)) {\n return get_dispatcher().run(result);\n }\n\n return result;\n };\n}\n\nfunction wrap_submit_callback(event: unknown): unknown {\n if (\n typeof event !== \"object\" || event === null || !has_method(event, \"submit\")\n ) {\n return event;\n }\n\n const original_submit = event.submit;\n const { submit: _submit, ...descriptors } = Object.getOwnPropertyDescriptors(\n event,\n );\n\n void _submit;\n\n return Object.defineProperties({}, {\n ...descriptors,\n submit: {\n configurable: true,\n enumerable: false,\n value: () => make_submit_effect(original_submit),\n },\n });\n}\n\nfunction make_submit_effect(\n original_submit: NativeMethod,\n): Effect.Effect<unknown, RemoteFailure<unknown>> & Record<string, unknown> {\n let updates_args: unknown[] | undefined;\n\n const effect = make_effect_from_promise(async () => {\n const result = original_submit();\n\n if (updates_args && has_method(result, \"updates\")) {\n return await Promise.resolve(result.updates(...updates_args));\n }\n\n return await Promise.resolve(result);\n }) as\n & Effect.Effect<unknown, RemoteFailure<unknown>>\n & Record<string, unknown>;\n\n Object.defineProperty(effect, \"updates\", {\n configurable: true,\n enumerable: false,\n value: (...args: unknown[]) => {\n updates_args ??= args;\n\n return effect;\n },\n });\n\n return effect;\n}\n","import type { RemoteFormInput } from \"@sveltejs/kit\";\n\nimport { decode_response_or_value } from \"./responses.ts\";\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport { get_remote_action_id, submit_remote_form } from \"./form-transport.ts\";\nimport { copy_property_descriptors, has_method } from \"./utils.ts\";\nimport { wrap_enhance_callback } from \"./form-enhance.ts\";\nimport type { EffectRemoteForm, NativeFormRecord } from \"./types.ts\";\n\n/**\n * Creates a remote form adapter. The callable preserves SvelteKit's native\n * form descriptors while wrapping `validate`, `enhance`, and programmatic\n * submission in Effect-returning APIs.\n *\n * @example\n * ```ts\n * const createPost = create_remote_form_adapter(nativeForm, (value) => value);\n * yield* createPost.validate({ includeUntouched: true });\n * ```\n *\n * @since 2.0.0\n * @param native_factory - SvelteKit's native form object.\n * @param decode_payload - Function to decode the response payload.\n * @param remote_base - Base URL for SvelteKit's remote endpoint.\n * @returns A callable form function whose properties mirror the native form.\n * @internal\n */\nexport function create_remote_form_adapter<\n Input extends RemoteFormInput | void,\n Output,\n>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n remote_base = \"\",\n): EffectRemoteForm<Input, Output> {\n const form_obj = native_factory as NativeFormRecord;\n\n const submit_effect = (input: Input) =>\n make_effect_from_promise(async () => {\n const can_use_remote_endpoint = remote_base.length > 0 &&\n get_remote_action_id(form_obj) !== undefined;\n\n if (has_method(form_obj, \"submit\") && !can_use_remote_endpoint) {\n const result = await form_obj.submit(input);\n\n return await decode_response_or_value<Output>(result, decode_payload);\n }\n\n return await submit_remote_form<Output>(\n form_obj,\n input,\n decode_payload,\n remote_base,\n );\n });\n\n const callable = ((input: Input) => submit_effect(input)) as EffectRemoteForm<\n Input,\n Output\n >;\n\n copy_property_descriptors(\n form_obj,\n callable,\n new Set([\"submit\", \"validate\", \"enhance\", \"for\", \"preflight\"]),\n );\n\n Object.defineProperty(callable, \"submit\", {\n configurable: true,\n enumerable: false,\n value: submit_effect,\n });\n\n if (has_method(form_obj, \"validate\")) {\n Object.defineProperty(callable, \"validate\", {\n configurable: true,\n enumerable: false,\n value: (options?: Record<string, unknown>) =>\n make_effect_from_promise(async () => {\n await form_obj.validate(options);\n }),\n });\n }\n\n if (has_method(form_obj, \"enhance\")) {\n Object.defineProperty(callable, \"enhance\", {\n configurable: true,\n enumerable: false,\n value: (callback?: Parameters<typeof wrap_enhance_callback>[0]) =>\n form_obj.enhance(wrap_enhance_callback(callback)),\n });\n }\n\n if (has_method(form_obj, \"for\")) {\n Object.defineProperty(callable, \"for\", {\n configurable: true,\n enumerable: false,\n value: (key: string | number | boolean) =>\n create_remote_form_adapter<Input, Output>(\n form_obj.for(key),\n decode_payload,\n remote_base,\n ),\n });\n }\n\n if (has_method(form_obj, \"preflight\")) {\n Object.defineProperty(callable, \"preflight\", {\n configurable: true,\n enumerable: false,\n value: (schema: unknown) => {\n form_obj.preflight(schema);\n\n return callable;\n },\n });\n }\n\n return callable;\n}\n","import { decode_response_or_value } from \"./responses.ts\";\nimport { has_method } from \"./utils.ts\";\n\n/**\n * Resolves native query results, including SvelteKit run handles.\n *\n * @example\n * ```ts\n * const output = await resolve_query_result(result, decode_payload);\n * ```\n *\n * @since 2.0.0\n * @param value - Native query result or query run handle.\n * @param decode_payload - Function used to decode successful payloads.\n * @returns Decoded query output.\n */\nexport async function resolve_query_result<Output>(\n value: unknown,\n decode_payload: (value: unknown) => unknown,\n): Promise<Output> {\n if (has_method(value, \"then\")) {\n const result = await Promise.resolve(value);\n\n return decode_response_or_value(result, decode_payload);\n }\n\n if (has_method(value, \"run\")) {\n const result = await value.run();\n\n return decode_response_or_value(result, decode_payload);\n }\n\n const result = await Promise.resolve(value);\n\n return decode_response_or_value(result, decode_payload);\n}\n","import type { RemoteFailure } from \"$/remote/shared.ts\";\nimport type { Effect } from \"effect\";\n\nimport { resolve_query_result } from \"./query-result.ts\";\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport { copy_property_descriptors, has_method } from \"./utils.ts\";\nimport type { NativeMethod } from \"./types.ts\";\n\ntype RemoteResourceEffect<Output> =\n & Effect.Effect<Output, RemoteFailure<unknown>>\n & {\n readonly current: Output | undefined;\n readonly error: unknown;\n readonly loading: boolean;\n readonly ready: boolean;\n };\n\ntype RemoteQueryEffect<Output> =\n & RemoteResourceEffect<Output>\n & {\n readonly refresh: () => Effect.Effect<void, unknown, never>;\n readonly set: (value: Output) => void;\n readonly withOverride: (\n update: (current: Output) => Output,\n ) => unknown;\n };\n\ntype RemoteLiveQueryEffect<Output> =\n & RemoteResourceEffect<Output>\n & AsyncIterable<Output>\n & {\n readonly connected: boolean;\n readonly done: boolean;\n readonly reconnect: () => Effect.Effect<void, unknown, never>;\n };\n\ntype NativeRemoteResource<Output> = {\n readonly connected?: boolean;\n readonly current?: Output;\n readonly done?: boolean;\n readonly error?: unknown;\n readonly loading?: boolean;\n readonly ready?: boolean;\n readonly reconnect?: () => Promise<void>;\n readonly refresh?: () => Promise<void>;\n readonly set?: (value: Output) => void;\n readonly withOverride?: (update: (current: Output) => Output) => unknown;\n readonly [Symbol.asyncIterator]?: () => AsyncIterator<Output>;\n};\n\n/**\n * Creates a remote query adapter. The returned function takes input and\n * returns an `Effect` that executes SvelteKit's native query function.\n *\n * @example\n * ```ts\n * const getUser = create_remote_query_adapter(nativeQuery, (value) => value);\n * const user = yield* getUser({ id: 1 });\n * ```\n *\n * @since 2.0.0\n * @param native_factory - SvelteKit's native query function or a legacy\n * response factory used by tests.\n * @param decode_payload - Function to decode the response payload.\n * @param _base - Deprecated transport base retained for compatibility.\n * @returns A function returning an Effect of the response.\n * @internal\n */\nexport function create_remote_query_adapter<Input, Output>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n _base = \"\",\n): (input: Input) => RemoteQueryEffect<Output> {\n const load = has_method(native_factory, \"load\")\n ? native_factory.load\n : undefined;\n const query = typeof native_factory === \"function\"\n ? native_factory as NativeMethod\n : undefined;\n\n if (!query && !load) {\n throw new Error(\"Invalid query factory: expected a function\");\n }\n\n const wrapped = ((input: Input) => {\n if (!query) {\n return make_effect_from_promise(async () => {\n const result = await load?.(input);\n\n return await resolve_query_result<Output>(result, decode_payload);\n }) as RemoteQueryEffect<Output>;\n }\n\n const resource = query(input);\n const effect = make_effect_from_promise(async () =>\n await resolve_query_result<Output>(resource, decode_payload)\n ) as RemoteQueryEffect<Output>;\n\n attach_query_resource(resource, effect);\n\n return effect;\n }) as (input: Input) => RemoteQueryEffect<Output>;\n\n copy_property_descriptors(native_factory, wrapped);\n\n return wrapped;\n}\n\n/**\n * Creates a remote live query adapter. The returned function takes input and\n * returns an `Effect` that awaits the first live value while preserving live\n * stream state and reconnect controls.\n *\n * @example\n * ```ts\n * const getTime = create_remote_live_query_adapter(nativeLive, (value) => value);\n * const time = yield* getTime();\n * ```\n *\n * @since 2.0.0\n * @param native_factory - SvelteKit's native live query function.\n * @param decode_payload - Function to decode the initial response payload.\n * @param _base - Deprecated transport base retained for compatibility.\n * @returns A function returning an Effect-backed live query resource.\n * @internal\n */\nexport function create_remote_live_query_adapter<Input, Output>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n _base = \"\",\n): (input: Input) => RemoteLiveQueryEffect<Output> {\n const query = typeof native_factory === \"function\"\n ? native_factory as NativeMethod\n : undefined;\n\n if (!query) {\n throw new Error(\"Invalid live query factory: expected a function\");\n }\n\n const wrapped = ((input: Input) => {\n const resource = query(input);\n const effect = make_effect_from_promise(async () =>\n await resolve_query_result<Output>(resource, decode_payload)\n ) as RemoteLiveQueryEffect<Output>;\n\n attach_live_query_resource(resource, effect);\n\n return effect;\n }) as (input: Input) => RemoteLiveQueryEffect<Output>;\n\n copy_property_descriptors(native_factory, wrapped);\n\n return wrapped;\n}\n\nfunction is_resource<Output>(\n resource: unknown,\n): resource is NativeRemoteResource<Output> {\n const resource_type = typeof resource;\n\n return (\n (resource_type === \"object\" && resource !== null) ||\n resource_type === \"function\"\n );\n}\n\nfunction attach_resource_getters<Output>(\n resource: unknown,\n effect: RemoteResourceEffect<Output>,\n): void {\n const methods = is_resource<Output>(resource) ? resource : undefined;\n const keys = [\"current\", \"error\", \"loading\", \"ready\"] as const;\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n}\n\nfunction attach_query_resource<Output>(\n resource: unknown,\n effect: RemoteQueryEffect<Output>,\n): void {\n const methods = is_resource<Output>(resource) ? resource : undefined;\n const refresh = methods?.refresh;\n const set = methods?.set;\n const with_override = methods?.withOverride;\n\n attach_resource_getters(resource, effect);\n\n if (!methods) {\n return;\n }\n\n if (typeof refresh === \"function\") {\n Object.defineProperty(effect, \"refresh\", {\n configurable: true,\n value: () =>\n make_effect_from_promise(() => Promise.resolve(refresh.call(resource))),\n });\n }\n\n if (typeof set === \"function\") {\n Object.defineProperty(effect, \"set\", {\n configurable: true,\n value: (value: Output) => set.call(resource, value),\n });\n }\n\n if (typeof with_override === \"function\") {\n Object.defineProperty(effect, \"withOverride\", {\n configurable: true,\n value: (update: (current: Output) => Output) =>\n with_override.call(resource, update),\n });\n }\n}\n\nfunction attach_live_query_resource<Output>(\n resource: unknown,\n effect: RemoteLiveQueryEffect<Output>,\n): void {\n const methods = is_resource<Output>(resource) ? resource : undefined;\n const async_iterator = methods?.[Symbol.asyncIterator];\n const reconnect = methods?.reconnect;\n const keys = [\"connected\", \"done\"] as const;\n\n attach_resource_getters(resource, effect);\n\n if (!methods) {\n return;\n }\n\n for (const key of keys) {\n if (!(key in methods)) {\n continue;\n }\n\n Object.defineProperty(effect, key, {\n configurable: true,\n get: () => methods[key],\n });\n }\n\n if (typeof reconnect === \"function\") {\n Object.defineProperty(effect, \"reconnect\", {\n configurable: true,\n value: () =>\n make_effect_from_promise(() =>\n Promise.resolve(reconnect.call(resource))\n ),\n });\n }\n\n if (typeof async_iterator === \"function\") {\n Object.defineProperty(effect, Symbol.asyncIterator, {\n configurable: true,\n value: () => async_iterator.call(resource),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,oBACd,KACA,QACkC;CAClC,MAAM,WAAW,8BAA8B,IAAI;AAEnD,KAAI,aAAa,IACf,QAAO,oBAAoB,UAAU,OAAO;AAG9C,KAAI,sCAAsC,IAAI,CAC5C,KAAI;AAGF,SAFgB,SAAS,OAAO,IAAI,QAAQ,GAAG,MAAM,IAAI,QAAQ;SAG3D;AACN,SAAO,8CACL,IAAI,MAAM,wCAAwC,EAClD,IACD;;AAIL,QAAO;;AAGT,SAAS,8BAA8B,KAAuB;AAC5D,KAAI,OAAO,QAAQ,SACjB,QAAO,uBAAuB,IAAI;AAGpC,KAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,aAAa,KAC5D,QAAO;CAGT,MAAM,UAAW,IAA8B;AAE/C,KAAI,OAAO,YAAY,SACrB,QAAO;CAGT,MAAM,SAAS,uBAAuB,QAAQ;AAE9C,QAAO,WAAW,UAAU,MAAM;;AAGpC,SAAS,uBAAuB,OAAwB;AACtD,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN,SAAO;;;;;;;;;;;;;;;AAgBX,SAAgB,0BACd,OACiC;AACjC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU;;;;;;;;;;;;;;AAgBd,SAAgB,mBACd,OAC2C;AAC3C,QACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAS,MAA+B,OAAO;;;;;;;;;;;;;;AAgBzD,SAAgB,uBAAuB,OAAwC;CAC7E,MAAM,OAAO,eAAe,MAAM;CAClC,MAAM,UAAU,oBAAoB,KAAK;CACzC,MAAM,SAAS,iBAAiB,MAAM;AAEtC,KAAI,0BAA0B,QAAQ,CACpC,QAAO;AAGT,KAAI,WAAW,OAAO,mBAAmB,KAAK,CAC5C,QAAO,+BAA+B,KAAK,QAAQ,MAAM,OAAO;AAGlE,KAAI,WAAW,KAAA,EACb,QAAO,yBAAyB,QAAQ,MAAM,MAAM;AAGtD,QAAO,8BAA8B,MAAM;;AAG7C,SAAS,iBAAiB,OAAoC;AAC5D,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC;CAGF,MAAM,SAAU,MAA+B;AAE/C,QAAO,OAAO,WAAW,WAAW,SAAS,KAAA;;AAG/C,SAAS,eAAe,OAAyB;AAC/C,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC;AAGF,KAAI,UAAU,MACZ,QAAQ,MAA6B;AAGvC,KAAI,UAAU,MACZ,QAAQ,MAA6B;;;;;;;;;;;;;;;;ACrJzC,eAAsB,wBACpB,UACiC;CACjC,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,KAAA,EAAU;CACzD,MAAM,UAAU,oBAAoB,KAAK;AAEzC,KAAI,0BAA0B,QAAQ,CACpC,QAAO;AAGT,KAAI,SAAS,WAAW,OAAO,mBAAmB,KAAK,CACrD,QAAO,+BAA+B,KAAK,QAAQ,MAAM,SAAS,OAAO;AAG3E,QAAO,yBAAyB,SAAS,QAAQ,KAAK;;;;;;;;;;;;;;;AAgBxD,eAAsB,yBACpB,OACA,gBACiB;AACjB,KAAI,iBAAiB,UAAU;AAC7B,MAAI,CAAC,MAAM,GACT,OAAM,MAAM,wBAAwB,MAAM;AAK5C,SAAO,eAFM,MAAM,MAAM,MAAM,CAEJ;;AAG7B,QAAO,eAAe,MAAM;;;;;;;;;;;;;;;;AChD9B,SAAgB,yBACd,KAC+C;AAC/C,QAAO,OAAO,WAAW;EACvB,KAAK;EACL,QAAQ,UAAmB;AACzB,OAAI,0BAA0B,MAAM,CAClC,QAAO;AAGT,UAAO,uBAAuB,MAAM;;EAEvC,CAAC;;;;;;;;;;;;ACrBJ,SAAgB,WACd,OACA,KACkC;AAClC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAuC,SAAS;;;;;;;;;;;;;;;;;ACG5D,SAAgB,8BACd,gBACA,gBACA,QAAQ,IACR,SACiE;CACjE,MAAM,SAAS,WAAW,gBAAgB,SAAS,GAC/C,eAAe,SACf,KAAA;AAEJ,KAAI,OAAO,mBAAmB,cAAc,CAAC,OAC3C,OAAM,IAAI,MAAM,+CAA+C;CAGjE,MAAM,QAAQ,WAAW,EAAE,OAAO,GAAG;CAErC,MAAM,WAAW,UACf,yBAAyB,YAAY;AACnC,QAAM,SAAS;AAEf,MAAI;AAKF,UAAO,MAAM,yBAJE,SACX,MAAM,OAAO,MAAM,GACnB,MAAO,eAAgC,MAAM,EAEK,eAAe;YAC7D;AACR,SAAM,SAAS;;GAEjB;AAEJ,2BAA0B,gBAAgB,QAAQ;AAElD,KAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,UAAU,CAC3D,QAAO,eAAe,SAAS,WAAW,EACxC,WAAW,MAAM,OAClB,CAAC;AAGJ,QAAO;;;;;;;;;;;ACrDT,SAAgB,aAAa,OAA0B;CACrD,MAAM,YAAY,IAAI,UAAU;AAEhC,mBAAkB,WAAW,IAAI,MAAM;AAEvC,QAAO;;AAGT,SAAS,kBACP,WACA,MACA,OACM;AACN,KAAI,UAAU,KAAA,EACZ;AAGF,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,OAAK,MAAM,QAAQ,MACjB,mBAAkB,WAAW,GAAG,KAAK,KAAK,KAAK;AAGjD;;AAGF,KAAI,iBAAiB,MAAM;AACzB,YAAU,OAAO,MAAM,MAAM;AAE7B;;AAGF,KAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAG9C,mBAAkB,WAFC,KAAK,WAAW,IAAI,MAAM,GAAG,KAAK,GAAG,OAEf,MAAM;AAGjD;;AAGF,KAAI,OAAO,UAAU,UAAU;AAC7B,YAAU,OAAO,KAAK,QAAQ,OAAO,MAAM,CAAC;AAE5C;;AAGF,KAAI,OAAO,UAAU,WAAW;AAC9B,MAAI,MACF,WAAU,OAAO,KAAK,QAAQ,KAAK;AAGrC;;AAGF,WAAU,OAAO,MAAM,UAAU,OAAO,KAAK,OAAO,MAAM,CAAC;;;;;;;;;;;;;;ACvC7D,eAAsB,mBACpB,UACA,OACA,gBACA,aACiB;CACjB,MAAM,YAAY,qBAAqB,SAAS;AAEhD,KAAI,CAAC,aAAa,YAAY,WAAW,EACvC,OAAM,8CACJ,IAAI,MAAM,+CAA+C,CAC1D;CAGH,MAAM,WAAW,MAAM,MAAM,mBAAmB,aAAa,UAAU,EAAE;EACvE,QAAQ;EACR,MAAM,aAAa,MAAM;EAC1B,CAAC;AAEF,KAAI,CAAC,SAAS,GACZ,OAAM,MAAM,wBAAwB,SAAS;AAK/C,QAAO,qBAFU,MAAM,SAAS,MAAM,EAEQ,eAAe;;;;;;;;;AAU/D,SAAgB,qBACd,UACoB;CACpB,MAAM,SAAS,SAAS;AAExB,KAAI,OAAO,WAAW,SACpB;CAIF,MAAM,OAAO,OAAO,aAAa,cADhB,sBACyC,SAAS;CACnE,MAAM,MAAM,IAAI,IAAI,QAAQ,KAAK;AAEjC,QAAO,IAAI,aAAa,IAAI,UAAU,IACpC,IAAI,aAAa,IAAI,SAAS,IAC9B,KAAA;;AAGJ,SAAS,mBAAmB,aAAqB,WAA2B;CAC1E,MAAM,QAAQ,UAAU,MAAM,IAAI;CAClC,MAAM,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;CACxC,MAAM,OAAO,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI;CACrC,MAAM,kBAAkB,YAAY,QAAQ,OAAO,GAAG;AAEtD,KAAI,KAAK,WAAW,EAClB,QAAO,GAAG,gBAAgB,GAAG;AAG/B,QAAO,GAAG,gBAAgB,GAAG,KAAK,GAAG,mBAAmB,KAAK;;AAG/D,SAAS,qBACP,UACA,gBACQ;AACR,KACE,OAAO,aAAa,YACpB,aAAa,QACb,EAAE,UAAU,UAEZ,OAAM,8CACJ,IAAI,MAAM,+BAA+B,EACzC,SACD;CAGH,MAAM,WAAW;AAOjB,KAAI,SAAS,SAAS,SAAS;EAC7B,MAAM,UAAU,oBAAoB,SAAS,MAAM;AAEnD,MAAI,0BAA0B,QAAQ,CACpC,OAAM;AAGR,QAAM,yBACJ,SAAS,UAAU,KACnB,SAAS,MACV;;AAGH,KAAI,SAAS,SAAS,YAAY,OAAO,SAAS,WAAW,SAC3D,OAAM,8CACJ,IAAI,MAAM,mCAAmC,EAC7C,SACD;CAIH,MAAM,UAAU,eADD,MAAM,SAAS,OAAO,CACC;AAKtC,KAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,EAC5C,OAAM,+BAA+B,QAAQ,QAAQ,SAAS,IAAI;AAGpE,QAAO,QAAQ;;;;;;;;;;;AC9HjB,SAAgB,sBACd,UAC0B;AAC1B,KAAI,CAAC,SACH;AAGF,SAAQ,UAAmB;EAEzB,MAAM,SAAS,SADO,qBAAqB,MAAM,CACX;AAEtC,MAAI,OAAO,SAAS,OAAO,CACzB,QAAO,gBAAgB,CAAC,IAAI,OAAO;AAGrC,SAAO;;;AAIX,SAAS,qBAAqB,OAAyB;AACrD,KACE,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,WAAW,OAAO,SAAS,CAE3E,QAAO;CAGT,MAAM,kBAAkB,MAAM;CAC9B,MAAM,EAAE,QAAQ,SAAS,GAAG,gBAAgB,OAAO,0BACjD,MACD;AAID,QAAO,OAAO,iBAAiB,EAAE,EAAE;EACjC,GAAG;EACH,QAAQ;GACN,cAAc;GACd,YAAY;GACZ,aAAa,mBAAmB,gBAAgB;GACjD;EACF,CAAC;;AAGJ,SAAS,mBACP,iBAC0E;CAC1E,IAAI;CAEJ,MAAM,SAAS,yBAAyB,YAAY;EAClD,MAAM,SAAS,iBAAiB;AAEhC,MAAI,gBAAgB,WAAW,QAAQ,UAAU,CAC/C,QAAO,MAAM,QAAQ,QAAQ,OAAO,QAAQ,GAAG,aAAa,CAAC;AAG/D,SAAO,MAAM,QAAQ,QAAQ,OAAO;GACpC;AAIF,QAAO,eAAe,QAAQ,WAAW;EACvC,cAAc;EACd,YAAY;EACZ,QAAQ,GAAG,SAAoB;AAC7B,oBAAiB;AAEjB,UAAO;;EAEV,CAAC;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;;AC1DT,SAAgB,2BAId,gBACA,gBACA,cAAc,IACmB;CACjC,MAAM,WAAW;CAEjB,MAAM,iBAAiB,UACrB,yBAAyB,YAAY;EACnC,MAAM,0BAA0B,YAAY,SAAS,KACnD,qBAAqB,SAAS,KAAK,KAAA;AAErC,MAAI,WAAW,UAAU,SAAS,IAAI,CAAC,wBAGrC,QAAO,MAAM,yBAFE,MAAM,SAAS,OAAO,MAAM,EAEW,eAAe;AAGvE,SAAO,MAAM,mBACX,UACA,OACA,gBACA,YACD;GACD;CAEJ,MAAM,aAAa,UAAiB,cAAc,MAAM;AAKxD,2BACE,UACA,UACA,IAAI,IAAI;EAAC;EAAU;EAAY;EAAW;EAAO;EAAY,CAAC,CAC/D;AAED,QAAO,eAAe,UAAU,UAAU;EACxC,cAAc;EACd,YAAY;EACZ,OAAO;EACR,CAAC;AAEF,KAAI,WAAW,UAAU,WAAW,CAClC,QAAO,eAAe,UAAU,YAAY;EAC1C,cAAc;EACd,YAAY;EACZ,QAAQ,YACN,yBAAyB,YAAY;AACnC,SAAM,SAAS,SAAS,QAAQ;IAChC;EACL,CAAC;AAGJ,KAAI,WAAW,UAAU,UAAU,CACjC,QAAO,eAAe,UAAU,WAAW;EACzC,cAAc;EACd,YAAY;EACZ,QAAQ,aACN,SAAS,QAAQ,sBAAsB,SAAS,CAAC;EACpD,CAAC;AAGJ,KAAI,WAAW,UAAU,MAAM,CAC7B,QAAO,eAAe,UAAU,OAAO;EACrC,cAAc;EACd,YAAY;EACZ,QAAQ,QACN,2BACE,SAAS,IAAI,IAAI,EACjB,gBACA,YACD;EACJ,CAAC;AAGJ,KAAI,WAAW,UAAU,YAAY,CACnC,QAAO,eAAe,UAAU,aAAa;EAC3C,cAAc;EACd,YAAY;EACZ,QAAQ,WAAoB;AAC1B,YAAS,UAAU,OAAO;AAE1B,UAAO;;EAEV,CAAC;AAGJ,QAAO;;;;;;;;;;;;;;;;;ACtGT,eAAsB,qBACpB,OACA,gBACiB;AACjB,KAAI,WAAW,OAAO,OAAO,CAG3B,QAAO,yBAFQ,MAAM,QAAQ,QAAQ,MAAM,EAEH,eAAe;AAGzD,KAAI,WAAW,OAAO,MAAM,CAG1B,QAAO,yBAFQ,MAAM,MAAM,KAAK,EAEQ,eAAe;AAKzD,QAAO,yBAFQ,MAAM,QAAQ,QAAQ,MAAM,EAEH,eAAe;;;;;;;;;;;;;;;;;;;;;;ACkCzD,SAAgB,4BACd,gBACA,gBACA,QAAQ,IACqC;CAC7C,MAAM,OAAO,WAAW,gBAAgB,OAAO,GAC3C,eAAe,OACf,KAAA;CACJ,MAAM,QAAQ,OAAO,mBAAmB,aACpC,iBACA,KAAA;AAEJ,KAAI,CAAC,SAAS,CAAC,KACb,OAAM,IAAI,MAAM,6CAA6C;CAG/D,MAAM,YAAY,UAAiB;AACjC,MAAI,CAAC,MACH,QAAO,yBAAyB,YAAY;AAG1C,UAAO,MAAM,qBAFE,MAAM,OAAO,MAAM,EAEgB,eAAe;IACjE;EAGJ,MAAM,WAAW,MAAM,MAAM;EAC7B,MAAM,SAAS,yBAAyB,YACtC,MAAM,qBAA6B,UAAU,eAAe,CAC7D;AAED,wBAAsB,UAAU,OAAO;AAEvC,SAAO;;AAGT,2BAA0B,gBAAgB,QAAQ;AAElD,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,iCACd,gBACA,gBACA,QAAQ,IACyC;CACjD,MAAM,QAAQ,OAAO,mBAAmB,aACpC,iBACA,KAAA;AAEJ,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,kDAAkD;CAGpE,MAAM,YAAY,UAAiB;EACjC,MAAM,WAAW,MAAM,MAAM;EAC7B,MAAM,SAAS,yBAAyB,YACtC,MAAM,qBAA6B,UAAU,eAAe,CAC7D;AAED,6BAA2B,UAAU,OAAO;AAE5C,SAAO;;AAGT,2BAA0B,gBAAgB,QAAQ;AAElD,QAAO;;AAGT,SAAS,YACP,UAC0C;CAC1C,MAAM,gBAAgB,OAAO;AAE7B,QACG,kBAAkB,YAAY,aAAa,QAC5C,kBAAkB;;AAItB,SAAS,wBACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,SAAS,GAAG,WAAW,KAAA;CAC3D,MAAM,OAAO;EAAC;EAAW;EAAS;EAAW;EAAQ;AAErD,KAAI,CAAC,QACH;AAGF,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,EAAE,OAAO,SACX;AAGF,SAAO,eAAe,QAAQ,KAAK;GACjC,cAAc;GACd,WAAW,QAAQ;GACpB,CAAC;;;AAIN,SAAS,sBACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,SAAS,GAAG,WAAW,KAAA;CAC3D,MAAM,UAAU,SAAS;CACzB,MAAM,MAAM,SAAS;CACrB,MAAM,gBAAgB,SAAS;AAE/B,yBAAwB,UAAU,OAAO;AAEzC,KAAI,CAAC,QACH;AAGF,KAAI,OAAO,YAAY,WACrB,QAAO,eAAe,QAAQ,WAAW;EACvC,cAAc;EACd,aACE,+BAA+B,QAAQ,QAAQ,QAAQ,KAAK,SAAS,CAAC,CAAC;EAC1E,CAAC;AAGJ,KAAI,OAAO,QAAQ,WACjB,QAAO,eAAe,QAAQ,OAAO;EACnC,cAAc;EACd,QAAQ,UAAkB,IAAI,KAAK,UAAU,MAAM;EACpD,CAAC;AAGJ,KAAI,OAAO,kBAAkB,WAC3B,QAAO,eAAe,QAAQ,gBAAgB;EAC5C,cAAc;EACd,QAAQ,WACN,cAAc,KAAK,UAAU,OAAO;EACvC,CAAC;;AAIN,SAAS,2BACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,SAAS,GAAG,WAAW,KAAA;CAC3D,MAAM,iBAAiB,UAAU,OAAO;CACxC,MAAM,YAAY,SAAS;CAC3B,MAAM,OAAO,CAAC,aAAa,OAAO;AAElC,yBAAwB,UAAU,OAAO;AAEzC,KAAI,CAAC,QACH;AAGF,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,EAAE,OAAO,SACX;AAGF,SAAO,eAAe,QAAQ,KAAK;GACjC,cAAc;GACd,WAAW,QAAQ;GACpB,CAAC;;AAGJ,KAAI,OAAO,cAAc,WACvB,QAAO,eAAe,QAAQ,aAAa;EACzC,cAAc;EACd,aACE,+BACE,QAAQ,QAAQ,UAAU,KAAK,SAAS,CAAC,CAC1C;EACJ,CAAC;AAGJ,KAAI,OAAO,mBAAmB,WAC5B,QAAO,eAAe,QAAQ,OAAO,eAAe;EAClD,cAAc;EACd,aAAa,eAAe,KAAK,SAAS;EAC3C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preprocess-BZyUYWY7.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/preprocess/ast.ts","../../../modules/svelte-effect-runtime/src/preprocess/imports.ts","../../../modules/svelte-effect-runtime/src/preprocess/source.ts","../../../modules/svelte-effect-runtime/src/preprocess/lower.ts","../../../modules/svelte-effect-runtime/src/preprocess/runtime-block.ts","../../../modules/svelte-effect-runtime/src/preprocess/index.ts"],"sourcesContent":["import ts from \"typescript\";\n\n/**\n * Checks whether a node is a `yield*` binary expression.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether the node represents `yield * operand`.\n */\nexport function is_yield_star_expression(node: ts.Node): boolean {\n return (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n );\n}\n\n/**\n * Checks whether a node owns its own yield semantics.\n *\n * @since 2.0.0\n * @param node - TypeScript AST node to check.\n * @returns Whether traversal should stop at this function boundary.\n */\nexport function is_function_boundary_node(node: ts.Node): boolean {\n return (\n ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node)\n );\n}\n\n/**\n * Returns `true` if the node tree contains a top-level `await`.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @returns Whether a top-level await expression was found.\n */\nexport function contains_top_level_await(node: ts.Node): boolean {\n if (ts.isAwaitExpression(node)) {\n return true;\n }\n\n return node.getChildren().some(\n (child) =>\n !is_function_boundary_node(child) && contains_top_level_await(child),\n );\n}\n\n/**\n * Collects top-level `yield*` nodes under an expression.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked for each matching yield node.\n * @returns Nothing.\n */\nexport function collect_yield_star_nodes(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n collect_yield_star_nodes(child, on_found);\n });\n}\n\n/**\n * Finds the first top-level `yield*` expression below a node.\n *\n * @since 2.0.0\n * @param node - Root node to search.\n * @param on_found - Callback invoked with the first matching node.\n * @returns Nothing.\n */\nexport function find_yield_star_node(\n node: ts.Node,\n on_found: (node: ts.Node) => void,\n): void {\n if (is_function_boundary_node(node)) {\n return;\n }\n\n if (is_yield_star_expression(node)) {\n on_found(node);\n return;\n }\n\n node.forEachChild((child) => {\n find_yield_star_node(child, on_found);\n });\n}\n\n/**\n * Extracts identifier names from a TypeScript binding name.\n *\n * @since 2.0.0\n * @param name - Binding name node to flatten.\n * @returns Identifier names from identifiers and destructuring patterns.\n */\nexport function extract_binding_names(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) {\n return [name.text];\n }\n\n const result: string[] = [];\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n result.push(...extract_binding_names(element.name));\n }\n\n return result;\n}\n","import ts from \"typescript\";\n\n/**\n * Builds the import statements injected by the script preprocessor.\n *\n * @since 2.0.0\n * @param has_effect_import - Whether the user already imports `Effect`.\n * @param has_onmount_import - Whether the user already imports `onMount`.\n * @param has_dispatcher_import - Whether the user already imports\n * `get_dispatcher`.\n * @returns Newline-separated import statements to inject.\n */\nexport function make_imports(\n has_effect_import: boolean,\n has_onmount_import: boolean,\n has_dispatcher_import: boolean,\n): string {\n return [\n !has_onmount_import && `import { onMount } from \"svelte\";`,\n !has_effect_import && `import { Effect } from \"effect\";`,\n !has_dispatcher_import &&\n `import { get_dispatcher } from \"svelte-effect-runtime/internal/generators\";`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/**\n * Checks whether a source file imports a local binding from a module.\n *\n * @since 2.0.0\n * @param source_file - Parsed TypeScript source file to inspect.\n * @param module_name - Module specifier to match.\n * @param local_name - Local binding name to look for.\n * @returns Whether that binding is already locally available.\n */\nexport function has_local_import_binding(\n source_file: ts.SourceFile,\n module_name: string,\n local_name: string,\n): boolean {\n return source_file.statements.some((stmt) => {\n if (\n !ts.isImportDeclaration(stmt) ||\n !ts.isStringLiteral(stmt.moduleSpecifier) ||\n stmt.moduleSpecifier.text !== module_name\n ) {\n return false;\n }\n\n const clause = stmt.importClause;\n\n if (!clause) {\n return false;\n }\n\n if (clause.name?.text === local_name) {\n return true;\n }\n\n const named_bindings = clause.namedBindings;\n\n if (!named_bindings) {\n return false;\n }\n\n if (ts.isNamespaceImport(named_bindings)) {\n return named_bindings.name.text === local_name;\n }\n\n return named_bindings.elements.some(\n (element) => element.name.text === local_name,\n );\n });\n}\n","import type MagicString from \"magic-string\";\nimport type ts from \"typescript\";\n\n/**\n * Creates a source map from transformed script back to the original block.\n *\n * @since 2.0.0\n * @param magic - MagicString instance holding the transformed source.\n * @param filename - Source filename used for the source map entry.\n * @returns A plain source map object.\n */\nexport function create_source_map(\n magic: MagicString,\n filename: string,\n): Record<string, unknown> {\n const map = magic.generateMap({\n hires: true,\n includeContent: true,\n source: filename,\n });\n\n return map as unknown as Record<string, unknown>;\n}\n\n/**\n * Slices a substring matching a node's full source range.\n *\n * @since 2.0.0\n * @param content - Original source text.\n * @param node - AST node whose full range should be extracted.\n * @returns Source text including leading trivia.\n */\nexport function slice(content: string, node: ts.Node): string {\n return content.slice(node.getFullStart(), node.end);\n}\n\n/**\n * Slices a substring matching a node's source range without leading trivia.\n *\n * @since 2.0.0\n * @param content - Original source text.\n * @param node - AST node whose non-trivia range should be extracted.\n * @returns Source text excluding leading trivia.\n */\nexport function slice_start(content: string, node: ts.Node): string {\n return content.slice(node.getStart(), node.end);\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport ts from \"typescript\";\n\nimport {\n collect_yield_star_nodes,\n extract_binding_names,\n find_yield_star_node,\n is_yield_star_expression,\n} from \"./ast.ts\";\nimport { slice, slice_start } from \"./source.ts\";\nimport type {\n LoweredExpression,\n LoweredStatement,\n ScriptLoweringContext,\n TempBinding,\n} from \"./types.ts\";\n\n/**\n * Delegates a statement to the correct lowerer based on syntax kind.\n *\n * @since 2.0.0\n * @param stmt - Statement to lower.\n * @param content - Original source text.\n * @param context - Lowering services for this transform pass.\n * @returns Lowered statement descriptor.\n */\nexport function lower_statement(\n stmt: ts.Statement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n if (ts.isExpressionStatement(stmt)) {\n return lower_expression_statement(stmt, content, context);\n }\n\n if (ts.isVariableStatement(stmt)) {\n return lower_variable_statement(stmt, content, context);\n }\n\n const text = slice(content, stmt);\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [text],\n range: { start: stmt.getFullStart(), end: stmt.end },\n };\n}\n\nfunction lower_variable_statement(\n stmt: ts.VariableStatement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n const temps: TempBinding[] = [];\n const rewritten_decls: string[] = [];\n const assignments: string[] = [];\n\n const decl_list = stmt.declarationList;\n const kind = (decl_list.flags & ts.NodeFlags.Let) !== 0 ? \"let\" : \"const\";\n let has_bare_yield = false;\n\n for (const decl of decl_list.declarations) {\n if (!decl.initializer || !contains_top_level_yield_star(decl.initializer)) {\n rewritten_decls.push(slice(content, decl).trim());\n continue;\n }\n\n const binding_text = slice(content, decl.name).trim();\n\n if (ts.isIdentifier(decl.name)) {\n const original_name = binding_text;\n\n if (is_yield_star_expression(decl.initializer)) {\n const temp_name = context.next_temp_name(original_name);\n\n temps.push({ name: temp_name });\n has_bare_yield = true;\n rewritten_decls.push(`${original_name} = $derived(${temp_name})`);\n\n const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n\n assignments.push(`${temp_name} = ${yield_text};`);\n } else {\n const lowered = lower_expression_yields(\n decl.initializer,\n content,\n original_name,\n context,\n );\n\n temps.push(...lowered.temps);\n assignments.push(...lowered.effect_assignments);\n\n const rewritten_expr = rewrite_state_rune_as_derived(\n lowered.rewritten_expr,\n );\n\n rewritten_decls.push(`${original_name} = ${rewritten_expr}`);\n }\n } else {\n has_bare_yield = true;\n\n const temp_name = context.next_temp_name(\"destructure\");\n const names = extract_binding_names(decl.name);\n\n temps.push({ name: temp_name });\n temps.push(...names.map((name) => ({ name })));\n\n const yield_text = extract_yield_star_full_text(\n decl.initializer,\n content,\n );\n\n assignments.push(`${temp_name} = ${yield_text};`);\n assignments.push(`(${binding_text} = ${temp_name});`);\n }\n }\n\n const rewritten_text = rewritten_decls.length === 0\n ? \"\"\n : `${has_bare_yield ? \"let\" : kind} ${rewritten_decls.join(\", \")};`;\n\n return {\n temps,\n rewritten_text,\n effect_assignments: assignments,\n range: { start: stmt.getStart(), end: stmt.end },\n };\n}\n\nfunction lower_expression_statement(\n stmt: ts.ExpressionStatement,\n content: string,\n context: ScriptLoweringContext,\n): LoweredStatement {\n const expr = stmt.expression;\n\n if (!contains_top_level_yield_star(expr)) {\n return {\n temps: [],\n rewritten_text: slice(content, stmt).trim(),\n effect_assignments: [],\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n if (is_yield_star_expression(expr)) {\n const text = slice(content, expr).trim();\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [text + \";\"],\n range: { start: stmt.getFullStart(), end: stmt.end },\n };\n }\n\n if (\n ts.isBinaryExpression(expr) &&\n expr.operatorToken.kind === ts.SyntaxKind.EqualsToken\n ) {\n const target = slice(content, expr.left).trim();\n const yield_text = extract_yield_star_full_text(expr, content);\n\n return {\n temps: [],\n rewritten_text: \"\",\n effect_assignments: [`${target} = ${yield_text};`],\n range: { start: stmt.getStart(), end: stmt.end },\n };\n }\n\n const lowered = lower_expression_yields(\n expr,\n content,\n \"call\",\n context,\n );\n\n return {\n temps: lowered.temps,\n rewritten_text: lowered.rewritten_expr + \";\",\n effect_assignments: lowered.effect_assignments,\n range: { start: stmt.getStart(), end: stmt.end },\n };\n}\n\nfunction lower_expression_yields(\n expr: ts.Expression,\n content: string,\n hint: string,\n context: ScriptLoweringContext,\n): LoweredExpression {\n const replacements: Array<{\n start: number;\n end: number;\n text: string;\n }> = [];\n\n const temps: TempBinding[] = [];\n const effect_assignments: string[] = [];\n\n collect_yield_star_nodes(expr, (node) => {\n const temp_name = context.next_temp_name(hint);\n const yield_text = slice_start(content, node).trim();\n\n temps.push({ name: temp_name });\n effect_assignments.push(`${temp_name} = ${yield_text};`);\n replacements.push({\n start: node.getStart(),\n end: node.end,\n text: temp_name,\n });\n });\n\n if (replacements.length === 0) {\n return {\n temps,\n rewritten_expr: slice(content, expr).trim(),\n effect_assignments,\n };\n }\n\n replacements.sort((a, b) => b.start - a.start);\n\n let text = slice(content, expr);\n\n const offset_in_expr = expr.getFullStart();\n\n for (const replacement of replacements) {\n text = text.slice(0, replacement.start - offset_in_expr) +\n replacement.text +\n text.slice(replacement.end - offset_in_expr);\n }\n\n return {\n temps,\n rewritten_expr: text.trim(),\n effect_assignments,\n };\n}\n\nfunction rewrite_state_rune_as_derived(expression: string): string {\n const state_call = expression.match(/^\\$state(?:\\.raw)?\\(([\\s\\S]*)\\)$/);\n\n if (!state_call) {\n return expression;\n }\n\n return `$derived(${state_call[1]})`;\n}\n\nfunction extract_yield_star_full_text(\n expr: ts.Expression,\n content: string,\n): string {\n let found: string | undefined;\n\n find_yield_star_node(expr, (node) => {\n found = slice_start(content, node).trim();\n });\n\n return found ?? \"undefined\";\n}\n","/**\n * Builds the runtime block appended to lowered script effect code.\n *\n * @since 2.0.0\n * @param assignments - Effect-body assignment strings.\n * @returns Full `Effect.gen` plus `onMount` block.\n */\nexport function make_runtime_block(assignments: string[]): string {\n const body = assignments\n .map((assignment) => ` ${assignment}`)\n .join(\"\\n\");\n\n return [\n \"\",\n \"const __SER__program = Effect.gen(function* () {\",\n body,\n \"});\",\n \"\",\n \"onMount(() => {\",\n \" const __SER__dispatcher = get_dispatcher();\",\n \" const __SER__cancel = __SER__dispatcher.fork(__SER__program);\",\n \" import.meta.hot?.dispose(__SER__cancel);\",\n \" return __SER__cancel;\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n","import { contains_top_level_yield_star } from \"$/detect.ts\";\nimport { TopLevelAwaitError } from \"$/error.ts\";\n\nimport MagicString from \"magic-string\";\nimport ts from \"typescript\";\n\nimport { contains_top_level_await } from \"./ast.ts\";\nimport { has_local_import_binding, make_imports } from \"./imports.ts\";\nimport { lower_statement } from \"./lower.ts\";\nimport { make_runtime_block } from \"./runtime-block.ts\";\nimport { create_source_map, slice } from \"./source.ts\";\nimport type { BlockRef, ScriptTransformResult } from \"./types.ts\";\n\nexport type { BlockRef, ScriptTransformResult } from \"./types.ts\";\n\n/**\n * Transforms a `<script effect>` body by extracting top-level `yield*`\n * expressions into `$state` temp bindings and wrapping the lowered\n * assignments in an `Effect.gen` block that runs on mount.\n *\n * @example\n * ```ts\n * const result = transform_script_effect(\n * `let user = $state(yield* getUser(id));`,\n * \"App.svelte\",\n * );\n * ```\n *\n * @since 2.0.0\n * @param content - The raw `<script effect>` body content.\n * @param filename - The source filename, used in error messages.\n * @returns The transformed code and any block references.\n */\nexport function transform_script_effect(\n content: string,\n filename: string,\n): ScriptTransformResult {\n let temp_counter = 0;\n\n const source_file = ts.createSourceFile(\n filename,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const magic = new MagicString(content);\n const effect_assignments: string[] = [];\n const block_refs: BlockRef[] = [];\n\n let has_effect = false;\n\n const context = {\n next_temp_name(hint?: string) {\n const suffix = temp_counter === 0 ? \"\" : `_${temp_counter}`;\n const name = hint ? `__SER__${hint}${suffix}` : `__SER__${temp_counter}`;\n\n temp_counter += 1;\n\n return name;\n },\n };\n\n /** Phase 1: detect imports already provided by the user. */\n const has_effect_import = has_local_import_binding(\n source_file,\n \"effect\",\n \"Effect\",\n );\n\n const has_onmount_import = has_local_import_binding(\n source_file,\n \"svelte\",\n \"onMount\",\n );\n\n const has_dispatcher_import = has_local_import_binding(\n source_file,\n \"svelte-effect-runtime/internal/generators\",\n \"get_dispatcher\",\n );\n\n /** Phase 2: lower every top-level statement that contains `yield*`. */\n for (const stmt of source_file.statements) {\n if (contains_top_level_await(stmt)) {\n const text = slice(content, stmt);\n throw new TopLevelAwaitError(filename, text);\n }\n\n if (!contains_top_level_yield_star(stmt)) {\n continue;\n }\n\n has_effect = true;\n const lowered = lower_statement(stmt, content, context);\n\n magic.overwrite(\n lowered.range.start,\n lowered.range.end,\n lowered.rewritten_text,\n );\n\n if (lowered.temps.length > 0) {\n const prefix = lowered.temps\n .map((temp) => `let ${temp.name} = $state(undefined);`)\n .join(\"\\n\");\n\n magic.appendLeft(lowered.range.start, prefix + \"\\n\");\n }\n\n effect_assignments.push(...lowered.effect_assignments);\n }\n\n if (!has_effect) {\n block_refs.push({ id: filename, kind: \"script\" });\n\n return { code: content, blocks: block_refs };\n }\n\n /** Phase 3: inject runtime imports after the last user import. */\n const imports = make_imports(\n has_effect_import,\n has_onmount_import,\n has_dispatcher_import,\n );\n\n const last_import = [...source_file.statements]\n .reverse()\n .find(ts.isImportDeclaration);\n\n if (last_import) {\n magic.appendRight(last_import.end, \"\\n\" + imports);\n } else {\n magic.prepend(imports + \"\\n\");\n }\n\n /** Phase 4: append the runtime program and lifecycle wiring. */\n const runtime_block = make_runtime_block(effect_assignments);\n magic.append(\"\\n\" + runtime_block);\n\n block_refs.push({ id: filename, kind: \"script\" });\n\n return {\n code: magic.toString(),\n blocks: block_refs,\n map: create_source_map(magic, filename),\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform-BtlxgJrg.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/markup/transform/constants.ts","../../../modules/svelte-effect-runtime/src/markup/transform/apply.ts","../../../modules/svelte-effect-runtime/src/markup/transform/classify.ts","../../../modules/svelte-effect-runtime/src/markup/transform/expressions.ts","../../../modules/svelte-effect-runtime/src/markup/transform/emit.ts","../../../modules/svelte-effect-runtime/src/error.ts","../../../modules/svelte-effect-runtime/src/markup/transform/scan.ts","../../../modules/svelte-effect-runtime/src/markup/transform/index.ts"],"sourcesContent":["export const HELPERS = {\n value: \"__ser_markup_value\",\n promise: \"__ser_markup_promise\",\n run: \"__ser_markup_run\",\n} as const;\n","import type MagicString from \"magic-string\";\n\nimport { HELPERS } from \"./constants.ts\";\nimport type {\n HelperDeclaration,\n Insertion,\n MarkupRelocation,\n PendingRelocation,\n Replacement,\n} from \"./types.ts\";\n\nexport function create_source_map(\n magic: MagicString,\n filename: string,\n): Record<string, unknown> {\n const map = magic.generateMap({\n hires: true,\n includeContent: true,\n source: filename,\n });\n\n return map as unknown as Record<string, unknown>;\n}\n\nexport function blank_script_blocks(content: string): string {\n return content.replace(\n /<script\\b[^>]*>[\\s\\S]*?<\\/script\\s*>/gi,\n (match) => {\n const lines = match.split(\"\\n\");\n return lines.map((l) => \" \".repeat(l.length)).join(\"\\n\");\n },\n );\n}\n\nexport function inject_helpers(\n magic: MagicString,\n content: string,\n helpers: HelperDeclaration[] = [],\n): Insertion | undefined {\n if (content.includes(HELPERS.value)) {\n return undefined;\n }\n\n const helper_segments: Array<{\n text: string;\n relocation?: PendingRelocation;\n }> = [\n `import { value as ${HELPERS.value} } from \"svelte-effect-runtime/internal/generators\";`,\n `import { promise as ${HELPERS.promise} } from \"svelte-effect-runtime/internal/generators\";`,\n `import { run as ${HELPERS.run} } from \"svelte-effect-runtime/internal/generators\";`,\n ...helpers,\n ].map((helper) =>\n typeof helper === \"string\" ? { text: helper } : helper\n );\n\n const helper_block = helper_segments.map((segment) => segment.text).join(\n \"\\n\",\n );\n\n const script_tag = find_instance_script_tag(content);\n\n if (script_tag) {\n const text = `\\n${helper_block}\\n`;\n\n magic.appendLeft(script_tag.end, text);\n\n return {\n start: script_tag.end,\n text,\n relocations: make_insertion_relocations(helper_segments, \"\\n\"),\n };\n } else {\n const text = `<script>\\n${helper_block}\\n</script>\\n\\n`;\n\n magic.prepend(text);\n\n return {\n start: 0,\n text,\n relocations: make_insertion_relocations(helper_segments, \"<script>\\n\"),\n };\n }\n}\n\nexport function create_relocations(\n replacements: Replacement[],\n helper_insertion: Insertion | undefined,\n): MarkupRelocation[] {\n const edits = [\n helper_insertion && {\n start: helper_insertion.start,\n removedLength: 0,\n insertedLength: helper_insertion.text.length,\n },\n ...replacements.map((replacement) => ({\n start: replacement.start,\n removedLength: replacement.end - replacement.start,\n insertedLength: replacement.text.length,\n })),\n ].filter(Boolean) as Array<{\n start: number;\n removedLength: number;\n insertedLength: number;\n }>;\n\n const replacement_relocations = replacements.flatMap((replacement) => {\n if (!replacement.relocation) {\n return [];\n }\n\n const delta_before = edits\n .filter((edit) => edit.start < replacement.start)\n .reduce(\n (total, edit) => total + edit.insertedLength - edit.removedLength,\n 0,\n );\n const generated_start = replacement.start + delta_before;\n\n return [{\n originalStart: replacement.relocation.originalStart,\n originalEnd: replacement.relocation.originalEnd,\n generatedStart: generated_start +\n replacement.relocation.generatedStartInReplacement,\n generatedEnd: generated_start +\n replacement.relocation.generatedEndInReplacement,\n }];\n });\n\n const helper_relocations = helper_insertion?.relocations?.map(\n (relocation) => ({\n originalStart: relocation.originalStart,\n originalEnd: relocation.originalEnd,\n generatedStart: helper_insertion.start +\n relocation.generatedStartInReplacement,\n generatedEnd: helper_insertion.start +\n relocation.generatedEndInReplacement,\n }),\n ) ?? [];\n\n return [\n ...replacement_relocations,\n ...helper_relocations,\n ];\n}\n\nfunction make_insertion_relocations(\n segments: Array<{\n text: string;\n relocation?: PendingRelocation;\n }>,\n prefix: string,\n): PendingRelocation[] {\n const relocations: PendingRelocation[] = [];\n let offset = prefix.length;\n\n for (const segment of segments) {\n if (segment.relocation) {\n relocations.push({\n originalStart: segment.relocation.originalStart,\n originalEnd: segment.relocation.originalEnd,\n generatedStartInReplacement: offset +\n segment.relocation.generatedStartInReplacement,\n generatedEndInReplacement: offset +\n segment.relocation.generatedEndInReplacement,\n });\n }\n\n offset += segment.text.length + 1;\n }\n\n return relocations;\n}\n\nfunction find_instance_script_tag(\n content: string,\n): { start: number; end: number } | undefined {\n const pattern = /<script\\b([^>]*)>([\\s\\S]*?)<\\/script\\s*>/gi;\n\n for (const match of content.matchAll(pattern)) {\n if (match.index === undefined) continue;\n\n const attrs = match[1] ?? \"\";\n if (\n /\\bcontext\\s*=\\s*[\"']module[\"']/.test(attrs) ||\n /\\bmodule\\b/.test(attrs)\n ) {\n continue;\n }\n\n const open_end = match[0].indexOf(\">\") + 1;\n return {\n start: match.index + open_end,\n end: match.index + match[0].length - \"</script>\".length,\n };\n }\n\n return undefined;\n}\n","import type { AST } from \"svelte/compiler\";\n\nimport type { MarkupCandidate, TagKind } from \"./types.ts\";\n\n/**\n * Matches sanitized placeholders back to their Svelte AST context.\n *\n * @since 2.0.0\n * @param ast - Parsed Svelte AST for the sanitized component markup.\n * @param candidates - Placeholder candidates produced by the scanner.\n * @returns Candidates paired with the markup context that determines how they\n * should be emitted.\n */\nexport function classify_candidates(\n ast: AST.Root,\n candidates: MarkupCandidate[],\n): Array<{ candidate: MarkupCandidate; kind: TagKind }> {\n const by_placeholder = new Map(\n candidates.map((candidate) => [candidate.placeholder, candidate]),\n );\n\n const classified: Array<{ candidate: MarkupCandidate; kind: TagKind }> = [];\n const matched = new Set<string>();\n\n walk_ast(ast.fragment, by_placeholder, matched, classified);\n\n return classified;\n}\n\nfunction walk_ast(\n fragment: AST.Fragment,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const node of fragment.nodes) {\n visit_ast_node(node, candidates, matched, classified);\n }\n}\n\nfunction visit_ast_node(\n node: AST.Fragment[\"nodes\"][number],\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n switch (node.type) {\n case \"ExpressionTag\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"IfBlock\":\n classify_expression(node.test, \"plain\", candidates, matched, classified);\n walk_ast(node.consequent, candidates, matched, classified);\n if (node.alternate) {\n walk_ast(node.alternate, candidates, matched, classified);\n }\n return;\n\n case \"EachBlock\":\n classify_expression(\n node.expression,\n \"each\",\n candidates,\n matched,\n classified,\n );\n walk_ast(node.body, candidates, matched, classified);\n if (node.fallback) {\n walk_ast(node.fallback, candidates, matched, classified);\n }\n return;\n\n case \"AwaitBlock\":\n classify_expression(\n node.expression,\n \"await\",\n candidates,\n matched,\n classified,\n );\n if (node.pending) {\n walk_ast(node.pending, candidates, matched, classified);\n }\n if (node.then) walk_ast(node.then, candidates, matched, classified);\n if (node.catch) walk_ast(node.catch, candidates, matched, classified);\n return;\n\n case \"RenderTag\":\n classify_expression(\n node.expression,\n \"render\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"HtmlTag\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n return;\n\n case \"DebugTag\":\n classify_debug_tag(node, candidates, matched, classified);\n return;\n\n case \"ConstTag\":\n case \"DeclarationTag\":\n classify_declaration_tag(node, candidates, matched, classified);\n return;\n\n case \"KeyBlock\":\n classify_expression(\n node.expression,\n \"plain\",\n candidates,\n matched,\n classified,\n );\n walk_ast(node.fragment, candidates, matched, classified);\n return;\n\n case \"RegularElement\":\n case \"Component\":\n case \"TitleElement\":\n case \"SlotElement\":\n case \"SvelteBody\":\n case \"SvelteBoundary\":\n case \"SvelteComponent\":\n case \"SvelteDocument\":\n case \"SvelteElement\":\n case \"SvelteFragment\":\n case \"SvelteHead\":\n case \"SvelteSelf\":\n case \"SvelteWindow\":\n visit_element_attributes(node, candidates, matched, classified);\n walk_ast(node.fragment, candidates, matched, classified);\n return;\n\n default:\n return;\n }\n}\n\nfunction classify_debug_tag(\n node: Extract<AST.Fragment[\"nodes\"][number], { type: \"DebugTag\" }>,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n const idents = node.identifiers;\n\n if (!idents || idents.length === 0) {\n return;\n }\n\n for (const ident of idents) {\n classify_expression(ident, \"plain\", candidates, matched, classified);\n }\n}\n\nfunction classify_declaration_tag(\n node: Extract<\n AST.Fragment[\"nodes\"][number],\n { type: \"ConstTag\" | \"DeclarationTag\" }\n >,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const decl of node.declaration.declarations) {\n if (!decl.init) {\n continue;\n }\n\n classify_expression(decl.init, \"plain\", candidates, matched, classified);\n }\n}\n\ninterface ElementLikeNode {\n attributes: Array<{\n type: string;\n name?: string;\n value?: unknown;\n expression?: unknown;\n }>;\n fragment: AST.Fragment;\n}\n\nfunction visit_element_attributes(\n node: ElementLikeNode,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n for (const attr of node.attributes) {\n if (\n attr.type === \"Attribute\" &&\n attr.name &&\n (attr.name.startsWith(\"on:\") || /^on[a-z]/.test(attr.name))\n ) {\n visit_attribute_value(\n attr.value as\n | true\n | AST.ExpressionTag\n | Array<AST.Text | AST.ExpressionTag>,\n \"event\",\n candidates,\n matched,\n classified,\n );\n continue;\n }\n\n if (attr.type === \"OnDirective\" && attr.expression) {\n classify_expression(\n attr.expression as ExpressionLike,\n \"event\",\n candidates,\n matched,\n classified,\n );\n continue;\n }\n }\n}\n\nfunction visit_attribute_value(\n value: true | AST.ExpressionTag | Array<AST.Text | AST.ExpressionTag>,\n kind: TagKind,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n if (value === true) {\n return;\n }\n\n if (Array.isArray(value)) {\n for (const part of value) {\n if (part.type === \"ExpressionTag\") {\n classify_expression(\n part.expression,\n kind,\n candidates,\n matched,\n classified,\n );\n }\n }\n return;\n }\n\n classify_expression(\n value.expression,\n kind,\n candidates,\n matched,\n classified,\n );\n}\n\ntype ExpressionLike = {\n type: string;\n name?: string;\n callee?: { type: string; name?: string };\n};\n\nfunction classify_expression(\n expression: ExpressionLike | null | undefined,\n kind: TagKind,\n candidates: Map<string, MarkupCandidate>,\n matched: Set<string>,\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): void {\n if (!expression) {\n return;\n }\n\n const candidate = find_candidate(expression, candidates);\n\n if (!candidate || matched.has(candidate.placeholder)) {\n return;\n }\n\n matched.add(candidate.placeholder);\n classified.push({ candidate, kind });\n}\n\nfunction find_candidate(\n expression: ExpressionLike,\n candidates: Map<string, MarkupCandidate>,\n): MarkupCandidate | undefined {\n if (expression.type === \"Identifier\" && expression.name) {\n return candidates.get(expression.name);\n }\n\n if (\n expression.type === \"CallExpression\" &&\n expression.callee?.type === \"Identifier\" &&\n expression.callee.name\n ) {\n return candidates.get(expression.callee.name);\n }\n\n return undefined;\n}\n","import ts from \"typescript\";\n\n/**\n * Strips an event handler arrow function down to its executable body.\n *\n * @since 2.0.0\n * @param expr - Event handler expression text from the original markup.\n * @returns Handler parameters, body text, and body offsets inside `expr`.\n */\nexport function strip_arrow_function(\n expr: string,\n): { params: string; body: string; body_start: number; body_end: number } {\n const arrow_idx = expr.indexOf(\"=>\");\n\n if (arrow_idx === -1) {\n return { params: \"()\", body: expr, body_start: 0, body_end: expr.length };\n }\n\n const params = expr.slice(0, arrow_idx).trim();\n const raw_body = expr.slice(arrow_idx + 2);\n const leading_ws = raw_body.length - raw_body.trimStart().length;\n let body_start = arrow_idx + 2 + leading_ws;\n let body_end = expr.length - (raw_body.length - raw_body.trimEnd().length);\n let body = expr.slice(body_start, body_end);\n\n if (body.startsWith(\"{\") && body.endsWith(\"}\")) {\n body_start += 1;\n body_end -= 1;\n body = body.slice(1, -1);\n }\n\n const body_leading_ws = body.length - body.trimStart().length;\n const body_trailing_ws = body.length - body.trimEnd().length;\n\n body_start += body_leading_ws;\n body_end -= body_trailing_ws;\n body = body.trim();\n\n if (body.endsWith(\";\")) {\n body = body.slice(0, -1);\n body_end -= 1;\n }\n\n return { params, body, body_start, body_end };\n}\n\n/**\n * Classifies `yield*` placement inside an event handler body.\n *\n * @example\n * ```ts\n * analyze_event_body_yield_star(\"yield* save()\");\n * ```\n *\n * @since 2.0.0\n * @param body - Event handler body text after the outer arrow has been\n * stripped.\n * @returns Whether the body has top-level yield* expressions and whether any\n * yield* appears inside a nested non-generator callback.\n */\nexport function analyze_event_body_yield_star(body: string): {\n has_top_level_yield_star: boolean;\n has_nested_invalid_yield_star: boolean;\n} {\n const wrapped = `function* __ser_event() { ${body}; }`;\n const sf = ts.createSourceFile(\n \"event.ts\",\n wrapped,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const stmt = sf.statements[0];\n\n if (!ts.isFunctionDeclaration(stmt) || !stmt.body) {\n return {\n has_top_level_yield_star: false,\n has_nested_invalid_yield_star: /\\byield\\s*\\*/.test(body),\n };\n }\n\n const result = {\n has_top_level_yield_star: false,\n has_nested_invalid_yield_star: false,\n };\n\n visit_event_body(stmt.body, \"top_level\", result);\n\n return result;\n}\n\n/**\n * Collects free identifiers that must be captured as reactive dependencies.\n *\n * @since 2.0.0\n * @param expr_text - Markup expression text to inspect.\n * @returns Identifier names referenced by the expression.\n */\nexport function collect_free_identifiers(expr_text: string): string[] {\n const wrapped = `function* __w() { return (${expr_text}); }`;\n let sf: ts.SourceFile;\n\n try {\n sf = ts.createSourceFile(\n \"expr.ts\",\n wrapped,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n } catch {\n return [];\n }\n\n const fn = sf.statements[0];\n\n if (!ts.isFunctionDeclaration(fn) || !fn.body) {\n return [];\n }\n\n const ids: string[] = [];\n const seen = new Set<string>();\n\n visit_ids(fn.body, seen, ids);\n\n return ids;\n}\n\nfunction visit_ids(\n node: ts.Node,\n seen: Set<string>,\n ids: string[],\n): void {\n if (\n ts.isArrowFunction(node) ||\n ts.isFunctionExpression(node) ||\n ts.isFunctionDeclaration(node)\n ) {\n return;\n }\n\n if (ts.isIdentifier(node)) {\n if (\n node.text === \"yield\" ||\n node.text === \"undefined\" ||\n node.text === \"null\" ||\n node.text === \"true\" ||\n node.text === \"false\" ||\n node.text === \"this\"\n ) {\n return;\n }\n\n if (is_property_access_name(node)) {\n return;\n }\n\n if (!seen.has(node.text)) {\n seen.add(node.text);\n ids.push(node.text);\n }\n return;\n }\n\n node.forEachChild((child) => visit_ids(child, seen, ids));\n}\n\ntype EventYieldContext = \"top_level\" | \"nested_generator\" | \"nested_invalid\";\n\ninterface EventYieldAnalysis {\n has_top_level_yield_star: boolean;\n has_nested_invalid_yield_star: boolean;\n}\n\nfunction visit_event_body(\n node: ts.Node,\n context: EventYieldContext,\n result: EventYieldAnalysis,\n): void {\n if (is_yield_star_expression(node)) {\n if (context === \"top_level\") {\n result.has_top_level_yield_star = true;\n } else if (context === \"nested_invalid\") {\n result.has_nested_invalid_yield_star = true;\n }\n\n node.forEachChild((child) => visit_event_body(child, context, result));\n return;\n }\n\n if (is_nested_function_boundary(node)) {\n const next_context = is_generator_function_boundary(node)\n ? \"nested_generator\"\n : \"nested_invalid\";\n\n node.forEachChild((child) => visit_event_body(child, next_context, result));\n return;\n }\n\n node.forEachChild((child) => visit_event_body(child, context, result));\n}\n\nfunction is_nested_function_boundary(node: ts.Node): boolean {\n return (\n ts.isArrowFunction(node) ||\n ts.isFunctionExpression(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node)\n );\n}\n\nfunction is_generator_function_boundary(node: ts.Node): boolean {\n return (\n (ts.isFunctionExpression(node) || ts.isFunctionDeclaration(node) ||\n ts.isMethodDeclaration(node)) &&\n node.asteriskToken !== undefined\n );\n}\n\nfunction is_yield_star_expression(node: ts.Node): boolean {\n if (ts.isYieldExpression(node)) {\n return node.asteriskToken !== undefined;\n }\n\n return (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n );\n}\n\nfunction is_property_access_name(node: ts.Identifier): boolean {\n const parent = node.parent;\n\n return (\n (ts.isPropertyAccessExpression(parent) && parent.name === node) ||\n (ts.isPropertyAssignment(parent) && parent.name === node) ||\n (ts.isBindingElement(parent) && parent.propertyName === node) ||\n ts.isImportSpecifier(parent) ||\n ts.isExportSpecifier(parent)\n );\n}\n","import { HELPERS } from \"./constants.ts\";\nimport {\n collect_free_identifiers,\n strip_arrow_function,\n} from \"./expressions.ts\";\nimport type {\n HelperDeclaration,\n MarkupCandidate,\n PendingRelocation,\n Replacement,\n TagKind,\n} from \"./types.ts\";\n\n/**\n * Emits source edits for classified markup Effect expressions.\n *\n * @since 2.0.0\n * @param classified - Candidates paired with their Svelte markup context.\n * @returns Replacements ready to apply to the original component source.\n */\nexport function emit_replacements(\n classified: Array<{ candidate: MarkupCandidate; kind: TagKind }>,\n): Replacement[] {\n return classified.map(({ candidate, kind }) =>\n emit_replacement(candidate, kind)\n );\n}\n\nfunction emit_replacement(\n candidate: MarkupCandidate,\n kind: TagKind,\n): Replacement {\n const id = make_cache_id(candidate);\n const id_text = JSON.stringify(id);\n const helper_name = make_helper_name(candidate);\n\n let replacement_text: string;\n let helpers: HelperDeclaration[];\n let relocation: PendingRelocation | undefined;\n\n if (kind === \"await\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_promise_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"render\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_render_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"each\") {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_each_expression(id_text, effect);\n helpers = [effect.helper];\n } else if (kind === \"event\") {\n const event = strip_arrow_function(candidate.expr_text);\n replacement_text =\n `${event.params} => { void ${HELPERS.run}(function* () { ${event.body}; }); }`;\n helpers = [];\n relocation = make_relocation(candidate, replacement_text, {\n originalStart: event.body_start,\n originalEnd: event.body_end,\n generatedText: event.body,\n });\n } else {\n const effect = make_effect_helper(candidate, helper_name);\n\n replacement_text = emit_each_expression(id_text, effect);\n helpers = [effect.helper];\n }\n\n return {\n start: candidate.start,\n end: candidate.end,\n text: replacement_text,\n helpers,\n relocation,\n };\n}\n\nfunction emit_promise_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `${HELPERS.promise}(${id_text}, ${effect.deps_text}, () => ${effect.call})`;\n}\n\nfunction emit_render_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `(await ${emit_promise_expression(id_text, effect)})()`;\n}\n\nfunction emit_each_expression(\n id_text: string,\n effect: EffectHelper,\n): string {\n return `await ${emit_promise_expression(id_text, effect)}`;\n}\n\ninterface EffectHelper {\n helper: HelperDeclaration;\n call: string;\n deps_text: string;\n}\n\nfunction make_effect_helper(\n candidate: MarkupCandidate,\n helper_name: string,\n): EffectHelper {\n const deps = collect_free_identifiers(candidate.expr_text);\n const params_text = deps.join(\", \");\n const args_text = deps.join(\", \");\n const deps_text = deps.length === 0 ? \"[]\" : `[${args_text}]`;\n const call = `${helper_name}(${args_text})`;\n const text =\n `function* ${helper_name}(${params_text}) { return (${candidate.expr_text}); }`;\n const generated_start = text.indexOf(candidate.expr_text);\n\n return {\n call,\n deps_text,\n helper: {\n text,\n relocation: {\n originalStart: candidate.start,\n originalEnd: candidate.end,\n generatedStartInReplacement: generated_start,\n generatedEndInReplacement: generated_start +\n candidate.expr_text.length,\n },\n },\n };\n}\n\nfunction make_cache_id(candidate: MarkupCandidate): string {\n return `${candidate.filename}:${candidate.start}:${candidate.end}`;\n}\n\nfunction make_helper_name(candidate: MarkupCandidate): string {\n return `__ser_markup_effect_${candidate.start}_${candidate.end}`;\n}\n\nfunction make_relocation(\n candidate: MarkupCandidate,\n replacement_text: string,\n inner: {\n originalStart: number;\n originalEnd: number;\n generatedText: string;\n },\n): PendingRelocation | undefined {\n const generated_start = replacement_text.indexOf(inner.generatedText);\n\n if (generated_start === -1) {\n return undefined;\n }\n\n return {\n originalStart: candidate.start + inner.originalStart,\n originalEnd: candidate.start + inner.originalEnd,\n generatedStartInReplacement: generated_start,\n generatedEndInReplacement: generated_start + inner.generatedText.length,\n };\n}\n","/**\n * Base error class for all preprocessor errors emitted during script and\n * markup transformation. Carries the source filename so error messages can\n * reference the affected file.\n *\n * @since 2.0.0\n */\nexport class PreprocessError extends Error {\n /**\n * The source filename that triggered this error.\n *\n * @since 2.0.0\n */\n readonly filename: string;\n\n constructor(message: string, filename: string) {\n super(message);\n this.name = \"PreprocessError\";\n this.filename = filename;\n }\n}\n\n/**\n * Thrown when `await` is used at the top level of a `<script effect>` block.\n * Top-level `await` is not supported — users should use\n * `yield* Effect.promise(...)` or `yield* Effect.tryPromise(...)` instead.\n *\n * @since 2.0.0\n */\nexport class TopLevelAwaitError extends PreprocessError {\n /**\n * The full text of the problematic statement containing the `await`.\n *\n * @since 2.0.0\n */\n readonly statement_text: string;\n\n constructor(filename: string, statement_text: string) {\n super(\n [\n `${filename}: top-level await is not supported in <script effect>.`,\n `Use yield* Effect.promise(...) or yield* Effect.tryPromise(...) instead.`,\n \"\",\n `Problematic statement:`,\n statement_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"TopLevelAwaitError\";\n this.statement_text = statement_text;\n }\n}\n\n/**\n * Thrown when `yield*` appears inside a Svelte rune whose semantics do not\n * support async expressions. Users should extract the `yield*` into a\n * separate `$state` binding and feed the resolved value into the rune.\n *\n * @since 2.0.0\n */\nexport class YieldStarInRuneError extends PreprocessError {\n /**\n * The name of the rune that contained the yield* expression.\n *\n * @since 2.0.0\n */\n readonly rune_name: string;\n\n /**\n * The full text of the expression that triggered the error.\n *\n * @since 2.0.0\n */\n readonly expression_text: string;\n\n constructor(rune_name: string, expression_text: string, filename: string) {\n super(\n [\n `${filename}: yield* cannot be used inside ${rune_name}().`,\n `${rune_name}() expects a synchronous expression. Extract the yield* into a separate $state binding instead:`,\n \"\",\n ` let __temp = $state(yield* yourEffect());`,\n ` ${rune_name}(__temp);`,\n \"\",\n `Problematic expression:`,\n expression_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"YieldStarInRuneError\";\n this.rune_name = rune_name;\n this.expression_text = expression_text;\n }\n}\n\n/**\n * Thrown when an event handler contains `yield*` inside a nested callback that\n * is not itself a generator function.\n *\n * @example\n * ```ts\n * throw new NestedYieldStarInEventHandlerError(\n * \"Component.svelte\",\n * \"Effect.try(() => yield* save())\",\n * );\n * ```\n *\n * @since 2.0.0\n */\nexport class NestedYieldStarInEventHandlerError extends PreprocessError {\n /**\n * The full text of the problematic event handler body.\n *\n * @since 2.0.0\n */\n readonly expression_text: string;\n\n constructor(filename: string, expression_text: string) {\n super(\n [\n `${filename}: yield* cannot be used inside a nested non-generator callback in a markup event handler.`,\n `Move the yield* to the event handler body. Effect.try and Effect.sync callbacks are plain synchronous JavaScript; do not call Effect-returning functions inside them.`,\n \"\",\n `Run the remote Effect directly:`,\n ` onclick={() => yield* UpvotePost(id)}`,\n \"\",\n `Recover from remote failures by composing the Effect value:`,\n ` onclick={() => yield* UpvotePost(id).pipe(Effect.catch(() => Effect.void))}`,\n \"\",\n `Problematic expression:`,\n expression_text,\n ].join(\"\\n\"),\n filename,\n );\n this.name = \"NestedYieldStarInEventHandlerError\";\n this.expression_text = expression_text;\n }\n}\n","import { NestedYieldStarInEventHandlerError } from \"$/error.ts\";\nimport { contains_top_level_yield_star } from \"$/detect.ts\";\nimport MagicString from \"magic-string\";\nimport ts from \"typescript\";\n\nimport {\n analyze_event_body_yield_star,\n strip_arrow_function,\n} from \"./expressions.ts\";\nimport type { MarkupCandidate, TagKind } from \"./types.ts\";\n\ninterface SanitizeResult {\n code: string;\n candidates: MarkupCandidate[];\n}\n\ninterface DeclarationInitializer {\n start: number;\n end: number;\n expr_text: string;\n}\n\nexport function sanitize_markup(\n content: string,\n filename: string,\n): SanitizeResult {\n const candidates: MarkupCandidate[] = [];\n const magic = new MagicString(content);\n let helper_index = 0;\n let cursor = 0;\n\n while (cursor < content.length) {\n const open = content.indexOf(\"{\", cursor);\n if (open === -1) break;\n\n /** Skip braces inside <script> and <style> blocks. */\n if (is_inside_excluded_block(content, open)) {\n cursor = open + 1;\n continue;\n }\n\n /** Find the matching closing brace. */\n const close = find_closing_brace(content, open + 1);\n if (close === -1) {\n cursor = open + 1;\n continue;\n }\n\n const inner = content.slice(open + 1, close);\n\n const trimmed = inner.trimStart();\n const leading_ws = inner.length - trimmed.length;\n\n const tag_info = get_tag_info(trimmed);\n\n const declaration_initializers = collect_declaration_initializers(\n content,\n open,\n leading_ws,\n trimmed,\n );\n\n if (declaration_initializers.length > 0) {\n for (const initializer of declaration_initializers) {\n const placeholder = `__ser_markup_placeholder_${helper_index}`;\n helper_index += 1;\n\n candidates.push({\n placeholder,\n start: initializer.start,\n end: initializer.end,\n expr_text: initializer.expr_text,\n filename,\n key: \"plain\",\n });\n\n magic.overwrite(initializer.start, initializer.end, placeholder);\n }\n\n cursor = close + 1;\n continue;\n }\n\n let expr_body = trimmed.slice(tag_info.prefix_length);\n\n /** For @const, only use the RHS after `=` as the expression body. */\n const equal_idx = tag_info.kind === \"plain\" && trimmed.startsWith(\"@const \")\n ? expr_body.indexOf(\"=\")\n : -1;\n\n /** Check if this is an event handler (arrow function containing yield*). */\n const is_event = is_event_expression(inner);\n\n /** Determine if this brace contains yield* that needs lowering. */\n const event_yield = is_event\n ? analyze_event_yield(inner, filename)\n : undefined;\n const has_yield = event_yield?.has_top_level_yield_star ??\n contains_yield_star_in_text(expr_body);\n\n if (!has_yield) {\n cursor = close + 1;\n continue;\n }\n\n /** The expression starts after the tag prefix. For @const, after the `=`. */\n let extra_prefix = 0;\n\n if (equal_idx !== -1) {\n const after_eq_raw = expr_body.slice(equal_idx + 1);\n expr_body = after_eq_raw.trimStart();\n extra_prefix = equal_idx + 1 + (after_eq_raw.length - expr_body.length);\n }\n\n const expr_start = open + 1 + leading_ws + tag_info.prefix_length +\n extra_prefix;\n\n /** For each/await, the expression ends before ` as ` or ` then `/` catch `. */\n let expr_end = close;\n\n const key = tag_info.kind;\n\n if (key === \"each\") {\n const as_idx = expr_body.lastIndexOf(\" as \");\n if (as_idx !== -1) expr_end = expr_start + as_idx;\n }\n\n if (key === \"await\") {\n const then_idx = expr_body.indexOf(\" then \");\n const catch_idx = expr_body.indexOf(\" catch \");\n const boundary = Math.min(\n then_idx === -1 ? Infinity : then_idx,\n catch_idx === -1 ? Infinity : catch_idx,\n );\n if (boundary !== Infinity) expr_end = expr_start + boundary;\n }\n\n const expr_text = content.slice(expr_start, expr_end).trim();\n\n if (expr_text.length === 0) {\n cursor = close + 1;\n continue;\n }\n\n /** Create a placeholder and replace the expression (preserving tag prefixes). */\n const placeholder = `__ser_markup_placeholder_${helper_index}`;\n helper_index += 1;\n\n candidates.push({\n placeholder,\n start: expr_start,\n end: expr_end,\n expr_text,\n filename,\n key,\n });\n\n magic.overwrite(\n expr_start,\n expr_end,\n key === \"render\" ? `${placeholder}()` : placeholder,\n );\n\n cursor = close + 1;\n }\n\n return { code: magic.toString(), candidates };\n}\n\nfunction is_inside_excluded_block(content: string, pos: number): boolean {\n const script = find_tag_end(content, \"script\", pos);\n const style = find_tag_end(content, \"style\", pos);\n\n return (\n (script !== undefined && pos < script.end && pos > script.start) ||\n (style !== undefined && pos < style.end && pos > style.start)\n );\n}\n\nfunction find_tag_end(\n content: string,\n tag: string,\n after_pos: number,\n): { start: number; end: number } | undefined {\n const pattern = new RegExp(\n `<${tag}\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/${tag}\\\\s*>`,\n \"gi\",\n );\n\n for (const match of content.matchAll(pattern)) {\n if (match.index === undefined) continue;\n const end_pos = match.index + match[0].length;\n if (match.index <= after_pos && after_pos < end_pos) {\n return { start: match.index, end: end_pos };\n }\n }\n\n return undefined;\n}\n\n/** Brace matching helpers for extracting complete markup expressions. */\n\nfunction find_closing_brace(content: string, start: number): number {\n let depth = 0;\n\n for (let i = start; i < content.length; i += 1) {\n const ch = content[i];\n\n if (ch === \"{\" && content[i - 1] !== \"$\") {\n depth += 1;\n } else if (ch === \"}\") {\n if (depth === 0) return i;\n depth -= 1;\n } else if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n i = skip_string(content, i, ch);\n if (i === -1) return -1;\n } else if (ch === \"/\" && content[i + 1] === \"/\") {\n i = skip_line_comment(content, i);\n } else if (ch === \"/\" && content[i + 1] === \"*\") {\n i = skip_block_comment(content, i);\n if (i === -1) return -1;\n }\n }\n\n return -1;\n}\n\nfunction skip_string(content: string, start: number, quote: string): number {\n for (let i = start + 1; i < content.length; i += 1) {\n if (content[i] === \"\\\\\") {\n i += 1;\n continue;\n }\n if (content[i] === quote) return i;\n }\n return -1;\n}\n\nfunction skip_line_comment(content: string, start: number): number {\n for (let i = start + 2; i < content.length; i += 1) {\n if (content[i] === \"\\n\") return i;\n }\n return content.length;\n}\n\nfunction skip_block_comment(content: string, start: number): number {\n for (let i = start + 2; i < content.length; i += 1) {\n if (content[i] === \"*\" && content[i + 1] === \"/\") return i + 1;\n }\n return -1;\n}\n\ninterface TagInfo {\n kind: TagKind;\n prefix_length: number;\n}\n\nfunction get_tag_info(trimmed: string): TagInfo {\n if (trimmed.startsWith(\"#each \")) {\n return { kind: \"each\", prefix_length: \"#each \".length };\n }\n if (trimmed.startsWith(\"#await \")) {\n return { kind: \"await\", prefix_length: \"#await \".length };\n }\n if (trimmed.startsWith(\"@render \")) {\n return { kind: \"render\", prefix_length: \"@render \".length };\n }\n\n /** Strip prefix-only tags — the expression starts after the tag keyword. */\n if (trimmed.startsWith(\"#if \")) {\n return { kind: \"plain\", prefix_length: \"#if \".length };\n }\n if (trimmed.startsWith(\":else if \")) {\n return { kind: \"plain\", prefix_length: \":else if \".length };\n }\n if (trimmed.startsWith(\"#key \")) {\n return { kind: \"plain\", prefix_length: \"#key \".length };\n }\n if (trimmed.startsWith(\"@const \")) {\n return { kind: \"plain\", prefix_length: \"@const \".length };\n }\n if (trimmed.startsWith(\"@html \")) {\n return { kind: \"plain\", prefix_length: \"@html \".length };\n }\n if (trimmed.startsWith(\"@debug \")) {\n return { kind: \"plain\", prefix_length: \"@debug \".length };\n }\n\n return { kind: \"plain\", prefix_length: 0 };\n}\n\nfunction collect_declaration_initializers(\n content: string,\n open: number,\n leading_ws: number,\n trimmed: string,\n): DeclarationInitializer[] {\n if (!is_declaration_tag_text(trimmed)) {\n return [];\n }\n\n const source_file = ts.createSourceFile(\n \"declaration-tag.ts\",\n `${trimmed};`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const stmt = source_file.statements[0];\n\n if (!stmt || !ts.isVariableStatement(stmt)) {\n return [];\n }\n\n const tag_start = open + 1 + leading_ws;\n\n return stmt.declarationList.declarations\n .filter((decl) =>\n decl.initializer && contains_top_level_yield_star(decl.initializer)\n )\n .map((decl) => {\n const initializer = decl.initializer as ts.Expression;\n const start = tag_start + initializer.getStart(source_file);\n const end = tag_start + initializer.end;\n const expr_text = content.slice(start, end).trim();\n\n return {\n start,\n end,\n expr_text,\n };\n });\n}\n\nfunction is_declaration_tag_text(trimmed: string): boolean {\n return /^(?:const|let)\\s/.test(trimmed);\n}\n\nfunction is_event_expression(inner: string): boolean {\n const trimmed = inner.trimStart();\n\n return /^(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>/.test(trimmed);\n}\n\nfunction analyze_event_yield(\n inner: string,\n filename: string,\n): {\n has_top_level_yield_star: boolean;\n} {\n const event = strip_arrow_function(inner);\n const analysis = analyze_event_body_yield_star(event.body);\n\n if (analysis.has_nested_invalid_yield_star) {\n throw new NestedYieldStarInEventHandlerError(filename, event.body);\n }\n\n return {\n has_top_level_yield_star: analysis.has_top_level_yield_star,\n };\n}\n\nfunction contains_yield_star_in_text(text: string): boolean {\n if (!/\\byield\\s*\\*/.test(text)) return false;\n\n try {\n const sf = ts.createSourceFile(\n \"expr.ts\",\n `const x = ${text};`,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n const stmt = sf.statements[0];\n if (!ts.isVariableStatement(stmt)) return false;\n const decl = stmt.declarationList.declarations[0];\n if (!decl?.initializer) return false;\n return contains_top_level_yield_star(decl.initializer);\n } catch {\n return true;\n }\n}\n\n/** Free identifier collection helpers for generated closures. */\n","import { type AST, parse } from \"svelte/compiler\";\n\nimport MagicString from \"magic-string\";\n\nimport {\n blank_script_blocks,\n create_relocations,\n create_source_map,\n inject_helpers,\n} from \"./apply.ts\";\nimport { classify_candidates } from \"./classify.ts\";\nimport { emit_replacements } from \"./emit.ts\";\nimport { sanitize_markup } from \"./scan.ts\";\nimport type { MarkupTransformResult } from \"./types.ts\";\n\nexport type { MarkupRelocation, MarkupTransformResult } from \"./types.ts\";\n\n/**\n * Transforms Svelte markup containing `{yield* expr}` brace expressions\n * into calls to the markup runtime helpers (`value`, `promise`, `run`).\n *\n * Strategy: first find all brace expressions containing `yield*` via\n * character scanning, replace them with placeholder identifiers, then\n * parse the sanitized markup with Svelte's AST to determine the correct\n * context for each placeholder (plain expression, #each, #await, event\n * handler, etc.).\n *\n * @since 2.0.0\n * @param content - The raw `.svelte` file content.\n * @param filename - The source filename, used in error messages.\n * @returns The transformed markup and a flag indicating whether yield* was\n * found.\n */\nexport function transform_markup_effect(\n content: string,\n filename: string,\n): MarkupTransformResult {\n if (!/\\byield\\s*\\*/.test(content)) {\n return { code: content, has_yield: false };\n }\n\n /** Find all brace expressions containing yield* and replace with placeholders. */\n const work = sanitize_markup(content, filename);\n\n if (work.candidates.length === 0) {\n return { code: content, has_yield: false };\n }\n\n /** Parse the sanitized markup with Svelte's AST. Strip <script> blocks\n * first so TypeScript syntax (import type, etc.) doesn't break the parser. */\n const clean = blank_script_blocks(work.code);\n const ast = parse(clean, { filename, modern: true }) as AST.Root;\n\n /** Match placeholders to their AST context and build replacements. */\n const classified = classify_candidates(\n ast,\n work.candidates,\n );\n const replacements = emit_replacements(classified);\n const helpers = replacements.flatMap((replacement) =>\n replacement.helpers ?? []\n );\n\n const magic = new MagicString(content);\n\n replacements.sort((a, b) => b.start - a.start);\n\n for (const r of replacements) {\n magic.overwrite(r.start, r.end, r.text);\n }\n\n const helper_insertion = inject_helpers(magic, content, helpers);\n const relocations = create_relocations(replacements, helper_insertion);\n\n return {\n code: magic.toString(),\n has_yield: true,\n map: create_source_map(magic, filename),\n relocations,\n };\n}\n"],"mappings":"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"}