svelte-effect-runtime 3.2.2 → 3.3.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 (47) hide show
  1. package/.dist/chunks/{client-DRjQiULJ.js → client-BYhNKK1i.js} +2 -19
  2. package/.dist/chunks/client-BYhNKK1i.js.map +1 -0
  3. package/.dist/chunks/dispatcher-5WSjtyXR.js +47 -0
  4. package/.dist/chunks/dispatcher-5WSjtyXR.js.map +1 -0
  5. package/.dist/chunks/{dispatcher-CZvLODNK.js → dispatcher-BnitG7p3.js} +155 -24
  6. package/.dist/chunks/dispatcher-BnitG7p3.js.map +1 -0
  7. package/.dist/chunks/{grammars-DwahpmJS.js → grammars-i4CSRxWg.js} +3 -3
  8. package/.dist/chunks/grammars-i4CSRxWg.js.map +1 -0
  9. package/.dist/chunks/{runtime-BgCRz_rL.js → runtime-CPbQxe4W.js} +2 -2
  10. package/.dist/chunks/{runtime-BgCRz_rL.js.map → runtime-CPbQxe4W.js.map} +1 -1
  11. package/.dist/chunks/{transform-B7_CCcvq.js → transform-DHUCirwV.js} +31 -26
  12. package/.dist/chunks/transform-DHUCirwV.js.map +1 -0
  13. package/.dist/dispatcher/fibers.d.ts +2 -0
  14. package/.dist/dispatcher/index.d.ts +27 -2
  15. package/.dist/dispatcher/types.d.ts +140 -0
  16. package/.dist/dispatcher.d.ts +2 -2
  17. package/.dist/dispatcher.js +2 -2
  18. package/.dist/generated/dispatcher.d.ts +49 -2
  19. package/.dist/generators.d.ts +2 -1
  20. package/.dist/grammars.js +1 -1
  21. package/.dist/internal/generators.js +3 -2
  22. package/.dist/internal/remote-client.js +1 -1
  23. package/.dist/markup/promise.js +1 -1
  24. package/.dist/markup/run.js +1 -1
  25. package/.dist/markup/transform/constants.d.ts +2 -3
  26. package/.dist/markup/transform/index.d.ts +5 -4
  27. package/.dist/markup/transform/types.d.ts +27 -3
  28. package/.dist/markup/transform.d.ts +1 -1
  29. package/.dist/markup/transform.js +1 -1
  30. package/.dist/markup/value.js +1 -1
  31. package/.dist/mod.js +2 -2
  32. package/.dist/remote/client/failures.d.ts +1 -16
  33. package/.dist/remote/client.js +1 -1
  34. package/.dist/runtime/transform.d.ts +18 -2
  35. package/.dist/runtime/transform.js +76 -5
  36. package/.dist/runtime/transform.js.map +1 -1
  37. package/.dist/script-transform/types.d.ts +23 -0
  38. package/.dist/server.js +1 -1
  39. package/.dist/vite.js +2 -2
  40. package/.dist/vite.js.map +1 -1
  41. package/package.json +1 -1
  42. package/.dist/chunks/client-DRjQiULJ.js.map +0 -1
  43. package/.dist/chunks/dispatcher-CLSN-Cxn.js +0 -22
  44. package/.dist/chunks/dispatcher-CLSN-Cxn.js.map +0 -1
  45. package/.dist/chunks/dispatcher-CZvLODNK.js.map +0 -1
  46. package/.dist/chunks/grammars-DwahpmJS.js.map +0 -1
  47. package/.dist/chunks/transform-B7_CCcvq.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { D as UnsupportedRemoteFormResponseError, f as RemoteErrorDecodeError, l as InvalidQueryFactoryError, o as InvalidCommandFactoryError, p as RemoteFormEndpointMissingError, s as InvalidLiveQueryFactoryError, u as InvalidRemoteFormResponseError } from "./errors-DppSJ83S.js";
2
- import { n as get_dispatcher } from "./dispatcher-CZvLODNK.js";
2
+ import { n as get_dispatcher } from "./dispatcher-BnitG7p3.js";
3
3
  import { create_remote_http_error, create_remote_transport_error, create_remote_validation_error, is_serialized_remote_failure_envelope } from "../remote/shared.js";
4
4
  import { t as copy_property_descriptors } from "./descriptors-OS4VfJuW.js";
5
5
  import { Effect } from "effect";
@@ -60,21 +60,6 @@ function is_decoded_remote_failure(value) {
60
60
  return typeof value === "object" && value !== null && "_tag" in value;
61
61
  }
62
62
  /**
63
- * Checks whether a response body represents SvelteKit validation issues.
64
- *
65
- * @example
66
- * ```ts
67
- * if (is_validation_body(body)) return body.issues;
68
- * ```
69
- *
70
- * @since 2.0.0
71
- * @param value - Value to inspect.
72
- * @returns Whether the value contains a form issue list.
73
- */
74
- function is_validation_body(value) {
75
- return typeof value === "object" && value !== null && Array.isArray(value.issues);
76
- }
77
- /**
78
63
  * Normalizes native thrown values into the runtime's remote failure model.
79
64
  *
80
65
  * @example
@@ -91,7 +76,6 @@ function normalize_native_error(error) {
91
76
  const decoded = decode_remote_error(body);
92
77
  const status = get_error_status(error);
93
78
  if (is_decoded_remote_failure(decoded)) return decoded;
94
- if (status === 400 && is_validation_body(body)) return create_remote_validation_error(body.issues, body, status);
95
79
  if (status !== void 0) return create_remote_http_error(status, body, error);
96
80
  return create_remote_transport_error(error);
97
81
  }
@@ -123,7 +107,6 @@ async function decode_response_failure(response) {
123
107
  const body = await response.json().catch(() => void 0);
124
108
  const decoded = decode_remote_error(body);
125
109
  if (is_decoded_remote_failure(decoded)) return decoded;
126
- if (response.status === 400 && is_validation_body(body)) return create_remote_validation_error(body.issues, body, response.status);
127
110
  return create_remote_http_error(response.status, body);
128
111
  }
129
112
  /**
@@ -576,4 +559,4 @@ function make_live_query_resource(resource) {
576
559
  //#endregion
577
560
  export { create_remote_command_adapter as i, create_remote_query_adapter as n, create_remote_form_adapter as r, create_remote_live_query_adapter as t };
578
561
 
579
- //# sourceMappingURL=client-DRjQiULJ.js.map
562
+ //# sourceMappingURL=client-BYhNKK1i.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-BYhNKK1i.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 is_serialized_remote_failure_envelope,\n} from \"$/remote/shared.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\nimport { RemoteErrorDecodeError } from \"$/errors.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<ErrorType = never>(\n raw: unknown,\n decode?: (encoded: string) => unknown,\n): RemoteFailure<ErrorType> | unknown {\n const embedded = parse_embedded_remote_failure(raw);\n\n if (embedded !== raw) {\n return decode_remote_error<ErrorType>(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<ErrorType>;\n } catch {\n return create_remote_transport_error(\n new RemoteErrorDecodeError(raw),\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<never> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value\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<ErrorType = never>(\n error: unknown,\n): RemoteFailure<ErrorType> {\n const body = get_error_body(error);\n const decoded = decode_remote_error<ErrorType>(body);\n const status = get_error_status(error);\n\n if (is_decoded_remote_failure(decoded)) {\n return decoded;\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 { create_remote_http_error } from \"$/remote/shared.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\n\nimport { decode_remote_error, is_decoded_remote_failure } 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<ErrorType = never>(\n response: Response,\n): Promise<RemoteFailure<ErrorType>> {\n const body = await response.json().catch(() => undefined);\n const decoded = decode_remote_error<ErrorType>(body);\n\n if (is_decoded_remote_failure(decoded)) {\n return decoded;\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, ErrorType = never>(\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<ErrorType>(value);\n }\n\n const data = await decode_success_response_body(value);\n\n return decode_payload(data) as Output;\n }\n\n return decode_payload(value) as Output;\n}\n\nasync function decode_success_response_body(\n response: Response,\n): Promise<unknown> {\n if (response.status === 204 || response.status === 205) {\n return undefined;\n }\n\n const text = await response.text();\n\n if (text.length === 0) {\n return undefined;\n }\n\n return JSON.parse(text);\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, ErrorType = never>(\n run: () => Promise<Output>,\n): Effect.Effect<Output, RemoteFailure<ErrorType>> {\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<ErrorType>(error);\n },\n }) as Effect.Effect<Output, RemoteFailure<ErrorType>>;\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 { InvalidCommandFactoryError } from \"$/errors.ts\";\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\ntype EffectRemoteCommandAdapter<Input, Output, ErrorType = never> =\n & ((\n input: undefined extends Input ? Input | void : Input,\n ) => Effect.Effect<Output, RemoteFailure<ErrorType>>)\n & {\n readonly pending: number;\n };\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<\n Input,\n Output,\n ErrorType = never,\n>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n _base = \"\",\n pending?: Pending,\n): EffectRemoteCommandAdapter<Input, Output, ErrorType> {\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 InvalidCommandFactoryError();\n }\n\n const count = pending ?? { value: 0 };\n\n const adapter = (input: undefined extends Input ? Input | void : Input) =>\n make_effect_from_promise<Output, ErrorType>(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, ErrorType>(\n result,\n decode_payload,\n );\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 as EffectRemoteCommandAdapter<Input, Output, ErrorType>;\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 {\n InvalidRemoteFormResponseError,\n RemoteFormEndpointMissingError,\n UnsupportedRemoteFormResponseError,\n} from \"$/errors.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 RemoteFormEndpointMissingError(),\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 InvalidRemoteFormResponseError(envelope),\n envelope,\n );\n }\n\n const response = envelope as {\n data?: unknown;\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 const result_text = typeof response.result === \"string\"\n ? response.result\n : typeof response.data === \"string\"\n ? response.data\n : undefined;\n\n if (response.type !== \"result\" || result_text === undefined) {\n throw create_remote_transport_error(\n new UnsupportedRemoteFormResponseError(envelope),\n envelope,\n );\n }\n\n const parsed = parse(result_text);\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 { Effect } from \"effect\";\n\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport { has_method } from \"./utils.ts\";\nimport type { EffectRemoteFormSubmit, 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<Output, ErrorType = never>(\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<Output, ErrorType>(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<Output, ErrorType>(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: () =>\n make_submit_effect<Output, ErrorType>(original_submit, event),\n },\n });\n}\n\nfunction make_submit_effect<Output, ErrorType>(\n original_submit: NativeMethod,\n event: unknown,\n): EffectRemoteFormSubmit<Output, ErrorType> {\n let updates_args: unknown[] | undefined;\n\n const effect = make_effect_from_promise<Output | undefined, ErrorType>(\n async (): Promise<Output | undefined> => {\n const result = original_submit();\n const value = updates_args && has_method(result, \"updates\")\n ? await Promise.resolve(result.updates(...updates_args))\n : await Promise.resolve(result);\n\n if (typeof value === \"boolean\") {\n return read_submit_result<Output>(event);\n }\n\n return value as Output;\n },\n ) as EffectRemoteFormSubmit<Output, ErrorType>;\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\nfunction read_submit_result<Output>(event: unknown): Output | undefined {\n if (typeof event !== \"object\" || event === null || !(\"result\" in event)) {\n return undefined;\n }\n\n return Reflect.get(event, \"result\") as Output | undefined;\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 {\n EffectRemoteForm,\n NativeFormRecord,\n NativeMethod,\n} from \"./types.ts\";\n\ntype RemoteInput<Input> = undefined extends Input ? Input | void : Input;\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 ErrorType = never,\n>(\n native_factory: unknown,\n decode_payload: (value: unknown) => unknown,\n remote_base = \"\",\n): EffectRemoteForm<Input, Output, ErrorType> {\n const form_obj = native_factory as NativeFormRecord;\n\n const submit_effect = (input?: RemoteInput<Input>) =>\n make_effect_from_promise<Output, ErrorType>(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 =\n ((input?: RemoteInput<Input>) => submit_effect(input)) as EffectRemoteForm<\n Input,\n Output,\n ErrorType\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<void, ErrorType>(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?: NativeMethod) =>\n form_obj.enhance(\n wrap_enhance_callback<Output, ErrorType>(callback),\n ),\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, ErrorType>(\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 {\n InvalidLiveQueryFactoryError,\n InvalidQueryFactoryError,\n} from \"$/errors.ts\";\nimport { copy_property_descriptors, has_method } from \"./utils.ts\";\nimport { normalize_native_error } from \"./failures.ts\";\nimport { resolve_query_result } from \"./query-result.ts\";\nimport { make_effect_from_promise } from \"./effect.ts\";\nimport type { EffectRemoteQueryUpdateBrand, NativeMethod } from \"./types.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\nimport { Effect } from \"effect\";\n\ntype RemoteInput<Input> = undefined extends Input ? Input | void : Input;\n\ntype DecodePayload<Output> = (value: unknown) => Output;\n\ntype NativeQueryFactory<Input> =\n | ((input: RemoteInput<Input>) => unknown)\n | {\n readonly load: (input: RemoteInput<Input>) => unknown;\n };\n\ntype RemoteResourceEffect<Output, ErrorType = never> =\n & Effect.Effect<Output, RemoteFailure<ErrorType>>\n & {\n readonly current: Output | undefined;\n readonly error: unknown;\n readonly loading: boolean;\n readonly ready: boolean;\n };\n\ntype RemoteResourceLike<Output, ErrorType = never> =\n | RemoteResourceEffect<Output, ErrorType>\n | RemoteLiveQueryResource<Output>;\n\ntype RemoteQueryEffect<Output, ErrorType = never> =\n & RemoteResourceEffect<Output, ErrorType>\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, ErrorType = never> = Effect.Effect<\n RemoteLiveQueryResource<Output>,\n RemoteFailure<ErrorType>\n>;\n\ntype RemoteLiveQueryResource<Output> =\n & {\n readonly connected: boolean;\n readonly current: Output | undefined;\n readonly done: boolean;\n readonly error: unknown;\n readonly loading: boolean;\n readonly ready: boolean;\n readonly reconnect: () => Effect.Effect<void, unknown, never>;\n }\n & AsyncIterable<Output>;\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<\n Input,\n Output,\n ErrorType = never,\n>(\n native_factory: NativeQueryFactory<Input>,\n decode_payload: DecodePayload<Output>,\n _base?: string,\n):\n & EffectRemoteQueryUpdateBrand\n & ((input: RemoteInput<Input>) => RemoteQueryEffect<Output, ErrorType>);\nexport function create_remote_query_adapter<\n Input,\n Output,\n ErrorType = never,\n>(\n native_factory: NativeQueryFactory<Input>,\n decode_payload: (value: unknown) => unknown,\n _base?: string,\n):\n & EffectRemoteQueryUpdateBrand\n & ((input: RemoteInput<Input>) => RemoteQueryEffect<Output, ErrorType>);\nexport function create_remote_query_adapter<\n Input,\n Output,\n ErrorType = never,\n>(\n native_factory: unknown,\n decode_payload: DecodePayload<Output>,\n _base = \"\",\n):\n & EffectRemoteQueryUpdateBrand\n & ((input: RemoteInput<Input>) => RemoteQueryEffect<Output, ErrorType>) {\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 InvalidQueryFactoryError();\n }\n\n const wrapped = ((input: RemoteInput<Input>) => {\n if (!query) {\n return make_effect_from_promise<Output, ErrorType>(async () => {\n const result = await load?.(input);\n\n return await resolve_query_result<Output>(result, decode_payload);\n }) as RemoteQueryEffect<Output, ErrorType>;\n }\n\n const resource = query(input);\n const effect = make_effect_from_promise<Output, ErrorType>(async () =>\n await resolve_query_result<Output>(resource, decode_payload)\n ) as RemoteQueryEffect<Output, ErrorType>;\n\n attach_query_resource(resource, effect);\n\n return effect;\n }) as\n & EffectRemoteQueryUpdateBrand\n & ((input: RemoteInput<Input>) => RemoteQueryEffect<Output, ErrorType>);\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 resolves to a live query resource with stream state\n * 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 * const current = time.current;\n * ```\n *\n * @since 2.0.0\n * @param native_factory - SvelteKit's native live query function.\n * @param _decode_payload - Deprecated payload decoder retained for parity with\n * other remote adapters.\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<\n Input,\n Output,\n ErrorType = never,\n>(\n native_factory: unknown,\n _decode_payload: (value: unknown) => unknown,\n _base = \"\",\n):\n & EffectRemoteQueryUpdateBrand\n & ((input: RemoteInput<Input>) => RemoteLiveQueryEffect<Output, ErrorType>) {\n const query = typeof native_factory === \"function\"\n ? native_factory as NativeMethod\n : undefined;\n\n if (!query) {\n throw new InvalidLiveQueryFactoryError();\n }\n\n const wrapped = ((input: Input) =>\n Effect.try({\n try: () => {\n const resource = query(input);\n\n return make_live_query_resource<Output>(resource);\n },\n catch: normalize_native_error,\n }) as RemoteLiveQueryEffect<Output>) as\n & EffectRemoteQueryUpdateBrand\n & ((\n input: RemoteInput<Input>,\n ) => RemoteLiveQueryEffect<Output, ErrorType>);\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, ErrorType = never>(\n resource: unknown,\n effect: RemoteResourceLike<Output, ErrorType>,\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, ErrorType = never>(\n resource: unknown,\n effect: RemoteQueryEffect<Output, ErrorType>,\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: RemoteLiveQueryResource<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\nfunction make_live_query_resource<Output>(\n resource: unknown,\n): RemoteLiveQueryResource<Output> {\n const live_resource = {} as RemoteLiveQueryResource<Output>;\n\n attach_live_query_resource(resource, live_resource);\n\n return live_resource;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,oBACd,KACA,QACoC;CACpC,MAAM,WAAW,8BAA8B,GAAG;CAElD,IAAI,aAAa,KACf,OAAO,oBAA+B,UAAU,MAAM;CAGxD,IAAI,sCAAsC,GAAG,GAC3C,IAAI;EAGF,OAFgB,SAAS,OAAO,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO;CAGlE,QAAQ;EACN,OAAO,8BACL,IAAI,uBAAuB,GAAG,GAC9B,GACF;CACF;CAGF,OAAO;AACT;AAEA,SAAS,8BAA8B,KAAuB;CAC5D,IAAI,OAAO,QAAQ,UACjB,OAAO,uBAAuB,GAAG;CAGnC,IAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,EAAE,aAAa,MAC5D,OAAO;CAGT,MAAM,UAAW,IAA8B;CAE/C,IAAI,OAAO,YAAY,UACrB,OAAO;CAGT,MAAM,SAAS,uBAAuB,OAAO;CAE7C,OAAO,WAAW,UAAU,MAAM;AACpC;AAEA,SAAS,uBAAuB,OAAwB;CACtD,IAAI;EACF,OAAO,KAAK,MAAM,KAAK;CACzB,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;;;;;;AAcA,SAAgB,0BACd,OAC+B;CAC/B,OACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU;AAEd;;;;;;;;;;;;;AAcA,SAAgB,uBACd,OAC0B;CAC1B,MAAM,OAAO,eAAe,KAAK;CACjC,MAAM,UAAU,oBAA+B,IAAI;CACnD,MAAM,SAAS,iBAAiB,KAAK;CAErC,IAAI,0BAA0B,OAAO,GACnC,OAAO;CAGT,IAAI,WAAW,KAAA,GACb,OAAO,yBAAyB,QAAQ,MAAM,KAAK;CAGrD,OAAO,8BAA8B,KAAK;AAC5C;AAEA,SAAS,iBAAiB,OAAoC;CAC5D,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAGF,MAAM,SAAU,MAA+B;CAE/C,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;AAC/C;AAEA,SAAS,eAAe,OAAyB;CAC/C,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC;CAGF,IAAI,UAAU,OACZ,OAAQ,MAA6B;CAGvC,IAAI,UAAU,OACZ,OAAQ,MAA6B;AAIzC;;;;;;;;;;;;;;;ACxIA,eAAsB,wBACpB,UACmC;CACnC,MAAM,OAAO,MAAM,SAAS,KAAK,EAAE,YAAY,KAAA,CAAS;CACxD,MAAM,UAAU,oBAA+B,IAAI;CAEnD,IAAI,0BAA0B,OAAO,GACnC,OAAO;CAGT,OAAO,yBAAyB,SAAS,QAAQ,IAAI;AACvD;;;;;;;;;;;;;;AAeA,eAAsB,yBACpB,OACA,gBACiB;CACjB,IAAI,iBAAiB,UAAU;EAC7B,IAAI,CAAC,MAAM,IACT,MAAM,MAAM,wBAAmC,KAAK;EAKtD,OAAO,eAAe,MAFH,6BAA6B,KAAK,CAE3B;CAC5B;CAEA,OAAO,eAAe,KAAK;AAC7B;AAEA,eAAe,6BACb,UACkB;CAClB,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KACjD;CAGF,MAAM,OAAO,MAAM,SAAS,KAAK;CAEjC,IAAI,KAAK,WAAW,GAClB;CAGF,OAAO,KAAK,MAAM,IAAI;AACxB;;;;;;;;;;;;;;;ACtDA,SAAgB,yBACd,KACiD;CACjD,OAAO,OAAO,WAAW;EACvB,KAAK;EACL,QAAQ,UAAmB;GACzB,IAAI,0BAA0B,KAAK,GACjC,OAAO;GAGT,OAAO,uBAAkC,KAAK;EAChD;CACF,CAAC;AACH;;;;;;;;;;;ACtBA,SAAgB,WACd,OACA,KACkC;CAClC,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAuC,SAAS;AAE5D;;;;;;;;;;;;;;;;ACUA,SAAgB,8BAKd,gBACA,gBACA,QAAQ,IACR,SACsD;CACtD,MAAM,SAAS,WAAW,gBAAgB,QAAQ,IAC9C,eAAe,SACf,KAAA;CAEJ,IAAI,OAAO,mBAAmB,cAAc,CAAC,QAC3C,MAAM,IAAI,2BAA2B;CAGvC,MAAM,QAAQ,WAAW,EAAE,OAAO,EAAE;CAEpC,MAAM,WAAW,UACf,yBAA4C,YAAY;EACtD,MAAM,SAAS;EAEf,IAAI;GAKF,OAAO,MAAM,yBAJE,SACX,MAAM,OAAO,KAAK,IAClB,MAAO,eAAgC,KAAK,GAI9C,cACF;EACF,UAAU;GACR,MAAM,SAAS;EACjB;CACF,CAAC;CAEH,0BAA0B,gBAAgB,OAAO;CAEjD,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,SAAS,GAC1D,OAAO,eAAe,SAAS,WAAW,EACxC,WAAW,MAAM,MACnB,CAAC;CAGH,OAAO;AACT;;;;;;;;;;ACtEA,SAAgB,aAAa,OAA0B;CACrD,MAAM,YAAY,IAAI,SAAS;CAE/B,kBAAkB,WAAW,IAAI,KAAK;CAEtC,OAAO;AACT;AAEA,SAAS,kBACP,WACA,MACA,OACM;CACN,IAAI,UAAU,KAAA,GACZ;CAGF,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxB,KAAK,MAAM,QAAQ,OACjB,kBAAkB,WAAW,GAAG,KAAK,KAAK,IAAI;EAGhD;CACF;CAEA,IAAI,iBAAiB,MAAM;EACzB,UAAU,OAAO,MAAM,KAAK;EAE5B;CACF;CAEA,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAC/C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAG7C,kBAAkB,WAFC,KAAK,WAAW,IAAI,MAAM,GAAG,KAAK,GAAG,OAEf,KAAK;EAGhD;CACF;CAEA,IAAI,OAAO,UAAU,UAAU;EAC7B,UAAU,OAAO,KAAK,QAAQ,OAAO,KAAK,CAAC;EAE3C;CACF;CAEA,IAAI,OAAO,UAAU,WAAW;EAC9B,IAAI,OACF,UAAU,OAAO,KAAK,QAAQ,IAAI;EAGpC;CACF;CAEA,UAAU,OAAO,MAAM,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;AAC5D;;;;;;;;;;;;;ACnCA,eAAsB,mBACpB,UACA,OACA,gBACA,aACiB;CACjB,MAAM,YAAY,qBAAqB,QAAQ;CAE/C,IAAI,CAAC,aAAa,YAAY,WAAW,GACvC,MAAM,8BACJ,IAAI,+BAA+B,CACrC;CAGF,MAAM,WAAW,MAAM,MAAM,mBAAmB,aAAa,SAAS,GAAG;EACvE,QAAQ;EACR,MAAM,aAAa,KAAK;CAC1B,CAAC;CAED,IAAI,CAAC,SAAS,IACZ,MAAM,MAAM,wBAAwB,QAAQ;CAK9C,OAAO,qBAA6B,MAFb,SAAS,KAAK,GAES,cAAc;AAC9D;;;;;;;;AASA,SAAgB,qBACd,UACoB;CACpB,MAAM,SAAS,SAAS;CAExB,IAAI,OAAO,WAAW,UACpB;CAIF,MAAM,OAAO,OAAO,aAAa,cAAc,sBAAW,SAAS;CACnE,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAEhC,OAAO,IAAI,aAAa,IAAI,SAAS,KACnC,IAAI,aAAa,IAAI,QAAQ,KAC7B,KAAA;AACJ;AAEA,SAAS,mBAAmB,aAAqB,WAA2B;CAC1E,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;CACvC,MAAM,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;CACpC,MAAM,kBAAkB,YAAY,QAAQ,OAAO,EAAE;CAErD,IAAI,KAAK,WAAW,GAClB,OAAO,GAAG,gBAAgB,GAAG;CAG/B,OAAO,GAAG,gBAAgB,GAAG,KAAK,GAAG,mBAAmB,IAAI;AAC9D;AAEA,SAAS,qBACP,UACA,gBACQ;CACR,IACE,OAAO,aAAa,YACpB,aAAa,QACb,EAAE,UAAU,WAEZ,MAAM,8BACJ,IAAI,+BAA+B,QAAQ,GAC3C,QACF;CAGF,MAAM,WAAW;CAQjB,IAAI,SAAS,SAAS,SAAS;EAC7B,MAAM,UAAU,oBAAoB,SAAS,KAAK;EAElD,IAAI,0BAA0B,OAAO,GACnC,MAAM;EAGR,MAAM,yBACJ,SAAS,UAAU,KACnB,SAAS,KACX;CACF;CAEA,MAAM,cAAc,OAAO,SAAS,WAAW,WAC3C,SAAS,SACT,OAAO,SAAS,SAAS,WACzB,SAAS,OACT,KAAA;CAEJ,IAAI,SAAS,SAAS,YAAY,gBAAgB,KAAA,GAChD,MAAM,8BACJ,IAAI,mCAAmC,QAAQ,GAC/C,QACF;CAIF,MAAM,UAAU,eADD,MAAM,WACe,CAAC;CAKrC,IAAI,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAC5C,MAAM,+BAA+B,QAAQ,QAAQ,SAAS,GAAG;CAGnE,OAAO,QAAQ;AACjB;;;;;;;;;;AC5IA,SAAgB,sBACd,UAC0B;CAC1B,IAAI,CAAC,UACH;CAGF,QAAQ,UAAmB;EAEzB,MAAM,SAAS,SADO,qBAAwC,KAC1B,CAAC;EAErC,IAAI,OAAO,SAAS,MAAM,GACxB,OAAO,eAAe,EAAE,IAAI,MAAM;EAGpC,OAAO;CACT;AACF;AAEA,SAAS,qBAAwC,OAAyB;CACxE,IACE,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,WAAW,OAAO,QAAQ,GAE1E,OAAO;CAGT,MAAM,kBAAkB,MAAM;CAC9B,MAAM,EAAE,QAAQ,SAAS,GAAG,gBAAgB,OAAO,0BACjD,KACF;CAIA,OAAO,OAAO,iBAAiB,CAAC,GAAG;EACjC,GAAG;EACH,QAAQ;GACN,cAAc;GACd,YAAY;GACZ,aACE,mBAAsC,iBAAiB,KAAK;EAChE;CACF,CAAC;AACH;AAEA,SAAS,mBACP,iBACA,OAC2C;CAC3C,IAAI;CAEJ,MAAM,SAAS,yBACb,YAAyC;EACvC,MAAM,SAAS,gBAAgB;EAC/B,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,SAAS,IACtD,MAAM,QAAQ,QAAQ,OAAO,QAAQ,GAAG,YAAY,CAAC,IACrD,MAAM,QAAQ,QAAQ,MAAM;EAEhC,IAAI,OAAO,UAAU,WACnB,OAAO,mBAA2B,KAAK;EAGzC,OAAO;CACT,CACF;CAEA,OAAO,eAAe,QAAQ,WAAW;EACvC,cAAc;EACd,YAAY;EACZ,QAAQ,GAAG,SAAoB;GAC7B,iBAAiB;GAEjB,OAAO;EACT;CACF,CAAC;CAED,OAAO;AACT;AAEA,SAAS,mBAA2B,OAAoC;CACtE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,YAAY,QAC/D;CAGF,OAAO,QAAQ,IAAI,OAAO,QAAQ;AACpC;;;;;;;;;;;;;;;;;;;;;ACjEA,SAAgB,2BAKd,gBACA,gBACA,cAAc,IAC8B;CAC5C,MAAM,WAAW;CAEjB,MAAM,iBAAiB,UACrB,yBAA4C,YAAY;EACtD,MAAM,0BAA0B,YAAY,SAAS,KACnD,qBAAqB,QAAQ,MAAM,KAAA;EAErC,IAAI,WAAW,UAAU,QAAQ,KAAK,CAAC,yBAGrC,OAAO,MAAM,yBAAiC,MAFzB,SAAS,OAAO,KAAK,GAEY,cAAc;EAGtE,OAAO,MAAM,mBACX,UACA,OACA,gBACA,WACF;CACF,CAAC;CAEH,MAAM,aACF,UAA+B,cAAc,KAAK;CAMtD,0BACE,UACA,UACA,IAAI,IAAI;EAAC;EAAU;EAAY;EAAW;EAAO;CAAW,CAAC,CAC/D;CAEA,OAAO,eAAe,UAAU,UAAU;EACxC,cAAc;EACd,YAAY;EACZ,OAAO;CACT,CAAC;CAED,IAAI,WAAW,UAAU,UAAU,GACjC,OAAO,eAAe,UAAU,YAAY;EAC1C,cAAc;EACd,YAAY;EACZ,QAAQ,YACN,yBAA0C,YAAY;GACpD,MAAM,SAAS,SAAS,OAAO;EACjC,CAAC;CACL,CAAC;CAGH,IAAI,WAAW,UAAU,SAAS,GAChC,OAAO,eAAe,UAAU,WAAW;EACzC,cAAc;EACd,YAAY;EACZ,QAAQ,aACN,SAAS,QACP,sBAAyC,QAAQ,CACnD;CACJ,CAAC;CAGH,IAAI,WAAW,UAAU,KAAK,GAC5B,OAAO,eAAe,UAAU,OAAO;EACrC,cAAc;EACd,YAAY;EACZ,QAAQ,QACN,2BACE,SAAS,IAAI,GAAG,GAChB,gBACA,WACF;CACJ,CAAC;CAGH,IAAI,WAAW,UAAU,WAAW,GAClC,OAAO,eAAe,UAAU,aAAa;EAC3C,cAAc;EACd,YAAY;EACZ,QAAQ,WAAoB;GAC1B,SAAS,UAAU,MAAM;GAEzB,OAAO;EACT;CACF,CAAC;CAGH,OAAO;AACT;;;;;;;;;;;;;;;;AClHA,eAAsB,qBACpB,OACA,gBACiB;CACjB,IAAI,WAAW,OAAO,MAAM,GAG1B,OAAO,yBAAyB,MAFX,QAAQ,QAAQ,KAAK,GAEF,cAAc;CAGxD,IAAI,WAAW,OAAO,KAAK,GAGzB,OAAO,yBAAyB,MAFX,MAAM,IAAI,GAES,cAAc;CAKxD,OAAO,yBAAyB,MAFX,QAAQ,QAAQ,KAAK,GAEF,cAAc;AACxD;;;ACiFA,SAAgB,4BAKd,gBACA,gBACA,QAAQ,IAGgE;CACxE,MAAM,OAAO,WAAW,gBAAgB,MAAM,IAC1C,eAAe,OACf,KAAA;CACJ,MAAM,QAAQ,OAAO,mBAAmB,aACpC,iBACA,KAAA;CAEJ,IAAI,CAAC,SAAS,CAAC,MACb,MAAM,IAAI,yBAAyB;CAGrC,MAAM,YAAY,UAA8B;EAC9C,IAAI,CAAC,OACH,OAAO,yBAA4C,YAAY;GAG7D,OAAO,MAAM,qBAA6B,MAFrB,OAAO,KAAK,GAEiB,cAAc;EAClE,CAAC;EAGH,MAAM,WAAW,MAAM,KAAK;EAC5B,MAAM,SAAS,yBAA4C,YACzD,MAAM,qBAA6B,UAAU,cAAc,CAC7D;EAEA,sBAAsB,UAAU,MAAM;EAEtC,OAAO;CACT;CAIA,0BAA0B,gBAAgB,OAAO;CAEjD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,iCAKd,gBACA,iBACA,QAAQ,IAGoE;CAC5E,MAAM,QAAQ,OAAO,mBAAmB,aACpC,iBACA,KAAA;CAEJ,IAAI,CAAC,OACH,MAAM,IAAI,6BAA6B;CAGzC,MAAM,YAAY,UAChB,OAAO,IAAI;EACT,WAAW;GAGT,OAAO,yBAFU,MAAM,KAEwB,CAAC;EAClD;EACA,OAAO;CACT,CAAC;CAMH,0BAA0B,gBAAgB,OAAO;CAEjD,OAAO;AACT;AAEA,SAAS,YACP,UAC0C;CAC1C,MAAM,gBAAgB,OAAO;CAE7B,OACG,kBAAkB,YAAY,aAAa,QAC5C,kBAAkB;AAEtB;AAEA,SAAS,wBACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,QAAQ,IAAI,WAAW,KAAA;CAC3D,MAAM,OAAO;EAAC;EAAW;EAAS;EAAW;CAAO;CAEpD,IAAI,CAAC,SACH;CAGF,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,EAAE,OAAO,UACX;EAGF,OAAO,eAAe,QAAQ,KAAK;GACjC,cAAc;GACd,WAAW,QAAQ;EACrB,CAAC;CACH;AACF;AAEA,SAAS,sBACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,QAAQ,IAAI,WAAW,KAAA;CAC3D,MAAM,UAAU,SAAS;CACzB,MAAM,MAAM,SAAS;CACrB,MAAM,gBAAgB,SAAS;CAE/B,wBAAwB,UAAU,MAAM;CAExC,IAAI,CAAC,SACH;CAGF,IAAI,OAAO,YAAY,YACrB,OAAO,eAAe,QAAQ,WAAW;EACvC,cAAc;EACd,aACE,+BAA+B,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,CAAC,CAAC;CAC1E,CAAC;CAGH,IAAI,OAAO,QAAQ,YACjB,OAAO,eAAe,QAAQ,OAAO;EACnC,cAAc;EACd,QAAQ,UAAkB,IAAI,KAAK,UAAU,KAAK;CACpD,CAAC;CAGH,IAAI,OAAO,kBAAkB,YAC3B,OAAO,eAAe,QAAQ,gBAAgB;EAC5C,cAAc;EACd,QAAQ,WACN,cAAc,KAAK,UAAU,MAAM;CACvC,CAAC;AAEL;AAEA,SAAS,2BACP,UACA,QACM;CACN,MAAM,UAAU,YAAoB,QAAQ,IAAI,WAAW,KAAA;CAC3D,MAAM,iBAAiB,UAAU,OAAO;CACxC,MAAM,YAAY,SAAS;CAC3B,MAAM,OAAO,CAAC,aAAa,MAAM;CAEjC,wBAAwB,UAAU,MAAM;CAExC,IAAI,CAAC,SACH;CAGF,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,EAAE,OAAO,UACX;EAGF,OAAO,eAAe,QAAQ,KAAK;GACjC,cAAc;GACd,WAAW,QAAQ;EACrB,CAAC;CACH;CAEA,IAAI,OAAO,cAAc,YACvB,OAAO,eAAe,QAAQ,aAAa;EACzC,cAAc;EACd,aACE,+BACE,QAAQ,QAAQ,UAAU,KAAK,QAAQ,CAAC,CAC1C;CACJ,CAAC;CAGH,IAAI,OAAO,mBAAmB,YAC5B,OAAO,eAAe,QAAQ,OAAO,eAAe;EAClD,cAAc;EACd,aAAa,eAAe,KAAK,QAAQ;CAC3C,CAAC;AAEL;AAEA,SAAS,yBACP,UACiC;CACjC,MAAM,gBAAgB,CAAC;CAEvB,2BAA2B,UAAU,aAAa;CAElD,OAAO;AACT"}
@@ -0,0 +1,47 @@
1
+ import { n as get_dispatcher$1 } from "./dispatcher-BnitG7p3.js";
2
+ import { r as get_server_dispatcher } from "./runtime-CPbQxe4W.js";
3
+ //#region src/generated/dispatcher.ts
4
+ /**
5
+ * Facade used by transform-generated component code to dispatch runtime
6
+ * events through the current client or server dispatcher.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const value = Dispatcher.emit({
11
+ * type: Code.Markup.Value,
12
+ * id: "Component.svelte:1:2",
13
+ * deps: [],
14
+ * fallback: undefined,
15
+ * fn: function* () {
16
+ * return yield* Effect.succeed(1);
17
+ * },
18
+ * });
19
+ * ```
20
+ *
21
+ * @since 3.3.0
22
+ * @internal
23
+ */
24
+ var Dispatcher = class {
25
+ static emit(event) {
26
+ return get_dispatcher().emit(event);
27
+ }
28
+ };
29
+ /**
30
+ * Returns the dispatcher appropriate for generated component code.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const dispatcher = get_dispatcher();
35
+ * ```
36
+ *
37
+ * @since 3.0.1
38
+ * @returns The server dispatcher during SSR, otherwise the client dispatcher.
39
+ */
40
+ function get_dispatcher() {
41
+ if (typeof document === "undefined") return get_server_dispatcher();
42
+ return get_dispatcher$1();
43
+ }
44
+ //#endregion
45
+ export { get_dispatcher as n, Dispatcher as t };
46
+
47
+ //# sourceMappingURL=dispatcher-5WSjtyXR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher-5WSjtyXR.js","names":["get_client_dispatcher"],"sources":["../../../modules/svelte-effect-runtime/src/generated/dispatcher.ts"],"sourcesContent":["import { get_dispatcher as get_client_dispatcher } from \"$/dispatcher.ts\";\nimport { get_server_dispatcher } from \"$/server/runtime.ts\";\nimport type {\n Dispatcher as RuntimeDispatcher,\n DispatcherEvent,\n MarkupPromiseEvent,\n MarkupRunEvent,\n MarkupValueEvent,\n} from \"$/dispatcher.ts\";\n\nexport { Code } from \"$/dispatcher.ts\";\nexport type {\n DispatcherEvent,\n MarkupPromiseEvent,\n MarkupPromiseOptions,\n MarkupRunEvent,\n MarkupValueEvent,\n} from \"$/dispatcher.ts\";\n\n/**\n * Facade used by transform-generated component code to dispatch runtime\n * events through the current client or server dispatcher.\n *\n * @example\n * ```ts\n * const value = Dispatcher.emit({\n * type: Code.Markup.Value,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fallback: undefined,\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * });\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport class Dispatcher {\n /**\n * Emits a transform-generated dispatcher event.\n *\n * @example\n * ```ts\n * const promise = Dispatcher.emit({\n * type: Code.Markup.Promise,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * });\n * ```\n *\n * @since 3.3.0\n * @param event - Generated event describing the dispatcher operation to run.\n * @returns The result produced by the active dispatcher.\n */\n static emit<A, F>(event: MarkupValueEvent<A, F>): A | F;\n static emit<A>(event: MarkupPromiseEvent<A>): Promise<A>;\n static emit<A>(event: MarkupRunEvent<A>): Promise<A>;\n static emit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A>;\n static emit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A> {\n return get_dispatcher().emit(event);\n }\n}\n\n/**\n * Returns the dispatcher appropriate for generated component code.\n *\n * @example\n * ```ts\n * const dispatcher = get_dispatcher();\n * ```\n *\n * @since 3.0.1\n * @returns The server dispatcher during SSR, otherwise the client dispatcher.\n */\nexport function get_dispatcher(): RuntimeDispatcher {\n if (typeof document === \"undefined\") {\n return get_server_dispatcher();\n }\n\n return get_client_dispatcher();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,aAAb,MAAwB;CAwBtB,OAAO,KAAW,OAAkD;EAClE,OAAO,eAAe,EAAE,KAAK,KAAK;CACpC;AACF;;;;;;;;;;;;AAaA,SAAgB,iBAAoC;CAClD,IAAI,OAAO,aAAa,aACtB,OAAO,sBAAsB;CAG/B,OAAOA,iBAAsB;AAC/B"}
@@ -1,5 +1,6 @@
1
1
  import { a as DispatcherDisposedError } from "./errors-DppSJ83S.js";
2
2
  import { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from "effect";
3
+ import { createSubscriber } from "svelte/reactivity";
3
4
  //#region src/dispatcher/fibers.ts
4
5
  /**
5
6
  * Interrupts a dispatcher fiber through its managed runtime.
@@ -33,16 +34,21 @@ function interrupt_fiber(runtime, fiber) {
33
34
  * @internal
34
35
  */
35
36
  function watch_fiber_exit(options) {
36
- const { runtime, fiber, on_complete, on_success } = options;
37
+ const { runtime, fiber, on_complete, on_success, on_failure, surface_failure = true } = options;
37
38
  runtime.runFork(Effect.flatMap(Fiber.await(fiber), (exit) => Effect.sync(() => {
38
- on_complete?.();
39
39
  if (Exit.isSuccess(exit)) {
40
40
  on_success?.(exit.value);
41
+ on_complete?.();
41
42
  return;
42
43
  }
43
- if (!Cause.hasInterruptsOnly(exit.cause)) queueMicrotask(() => {
44
- throw Cause.squash(exit.cause);
45
- });
44
+ if (!Cause.hasInterruptsOnly(exit.cause)) {
45
+ const error = Cause.squash(exit.cause);
46
+ on_failure?.(error);
47
+ if (surface_failure) queueMicrotask(() => {
48
+ throw error;
49
+ });
50
+ }
51
+ on_complete?.();
46
52
  })));
47
53
  }
48
54
  //#endregion
@@ -97,6 +103,24 @@ function hash_object_dep(dep) {
97
103
  return `o:${id}`;
98
104
  }
99
105
  //#endregion
106
+ //#region src/dispatcher/types.ts
107
+ /**
108
+ * Stable operation codes used by transform-generated dispatcher events.
109
+ *
110
+ * @example
111
+ * ```ts
112
+ * const type = Code.Markup.Promise;
113
+ * ```
114
+ *
115
+ * @since 3.3.0
116
+ * @internal
117
+ */
118
+ const Code = { Markup: {
119
+ Promise: "MarkupPromise",
120
+ Run: "MarkupRun",
121
+ Value: "MarkupValue"
122
+ } };
123
+ //#endregion
100
124
  //#region src/dispatcher/index.ts
101
125
  /**
102
126
  * Unified effect block dispatcher. Manages the fiber lifecycle of every
@@ -117,8 +141,20 @@ var Dispatcher = class Dispatcher {
117
141
  #runtime;
118
142
  /** Active fibers keyed by cache id or generated fork id. */
119
143
  #fibers = /* @__PURE__ */ new Map();
120
- /** Resolved values and pending promises keyed by cache id. */
121
- #values = /* @__PURE__ */ new Map();
144
+ /** Reactive value cells keyed by value cache id. */
145
+ #value_cells = /* @__PURE__ */ new Map();
146
+ /** Notifies subscribed Svelte template effects when value cells change. */
147
+ #notify_value_cells = () => {};
148
+ /** Subscribes the current Svelte tracking scope to value cell changes. */
149
+ #subscribe_value_cells = createSubscriber((update) => {
150
+ this.#notify_value_cells = update;
151
+ return () => {
152
+ if (this.#notify_value_cells !== update) return;
153
+ this.#notify_value_cells = () => {};
154
+ };
155
+ });
156
+ /** Pending promises keyed by promise cache id. */
157
+ #promise_values = /* @__PURE__ */ new Map();
122
158
  /** Current cache key per value block id. */
123
159
  #value_ids = /* @__PURE__ */ new Map();
124
160
  /** Current cache key per promise block id. */
@@ -160,6 +196,13 @@ var Dispatcher = class Dispatcher {
160
196
  constructor(runtime) {
161
197
  this.#runtime = runtime ?? ManagedRuntime.make(Layer.empty);
162
198
  }
199
+ emit(event) {
200
+ switch (event.type) {
201
+ case Code.Markup.Value: return this.#emit_markup_value(event);
202
+ case Code.Markup.Promise: return this.#emit_markup_promise(event);
203
+ case Code.Markup.Run: return this.#emit_markup_run(event);
204
+ }
205
+ }
163
206
  /**
164
207
  * Forks an effect as a managed fiber and returns a cleanup function.
165
208
  *
@@ -203,12 +246,19 @@ var Dispatcher = class Dispatcher {
203
246
  * @returns The cached value if resolved, otherwise the fallback.
204
247
  */
205
248
  value(options) {
249
+ if (this.#disposed) return options.fallback;
206
250
  const cache_key = this.#make_value_cache_key(options.id, options.deps);
207
251
  const old_key = this.#value_ids.get(options.id);
208
- if (old_key !== void 0 && old_key !== cache_key) this.#interrupt_cached_fiber(old_key);
252
+ this.#subscribe_value_cells();
253
+ const cell = this.#value_cells.get(cache_key);
254
+ if (old_key !== void 0 && old_key !== cache_key) {
255
+ const old_fiber = this.#interrupt_cached_fiber(old_key);
256
+ this.#clear_pending_value_cell(old_key, old_fiber);
257
+ }
209
258
  this.#value_ids.set(options.id, cache_key);
210
- if (this.#should_start_value_fiber(cache_key)) this.#start_value_fiber(cache_key, options);
211
- if (this.#values.has(cache_key)) return this.#values.get(cache_key);
259
+ if (this.#should_start_value_fiber(cache_key, cell)) this.#start_value_fiber(cache_key, options);
260
+ if (cell?.status === "success") return cell.value;
261
+ if (cell?.status === "failure") throw cell.error;
212
262
  return options.fallback;
213
263
  }
214
264
  /**
@@ -229,13 +279,13 @@ var Dispatcher = class Dispatcher {
229
279
  const old_key = this.#promise_ids.get(options.id);
230
280
  if (old_key !== void 0 && old_key !== cache_key) {
231
281
  this.#interrupt_cached_fiber(old_key);
232
- this.#values.delete(old_key);
282
+ this.#promise_values.delete(old_key);
233
283
  }
234
284
  this.#promise_ids.set(options.id, cache_key);
235
- const existing = this.#values.get(cache_key);
236
- if (existing instanceof Promise) return existing;
285
+ const existing = this.#promise_values.get(cache_key);
286
+ if (existing) return existing;
237
287
  const promise = this.#start_promise_fiber(cache_key, options);
238
- this.#values.set(cache_key, promise);
288
+ this.#promise_values.set(cache_key, promise);
239
289
  return promise;
240
290
  }
241
291
  /**
@@ -264,6 +314,30 @@ var Dispatcher = class Dispatcher {
264
314
  throw error;
265
315
  });
266
316
  }
317
+ #emit_markup_value(event) {
318
+ if (this.#is_server_render()) return event.fallback;
319
+ return this.value({
320
+ id: event.id,
321
+ deps: event.deps,
322
+ fallback: event.fallback,
323
+ factory: event.fn
324
+ });
325
+ }
326
+ #emit_markup_promise(event) {
327
+ if (this.#is_server_render()) {
328
+ if (event.options?.ssr === "pending") return new Promise(() => {});
329
+ if ("ssr_fallback" in event) return Promise.resolve(event.ssr_fallback);
330
+ }
331
+ return this.promise({
332
+ id: event.id,
333
+ deps: event.deps,
334
+ factory: event.fn
335
+ });
336
+ }
337
+ #emit_markup_run(event) {
338
+ const effect = Effect.gen(event.fn);
339
+ return this.run(effect);
340
+ }
267
341
  /**
268
342
  * Cancels all running fibers and releases cached values.
269
343
  *
@@ -279,7 +353,8 @@ var Dispatcher = class Dispatcher {
279
353
  this.#disposed = true;
280
354
  for (const fiber of this.#fibers.values()) interrupt_fiber(this.#runtime, fiber);
281
355
  this.#fibers.clear();
282
- this.#values.clear();
356
+ this.#clear_value_cells();
357
+ this.#promise_values.clear();
283
358
  this.#value_ids.clear();
284
359
  this.#promise_ids.clear();
285
360
  this.#runtime.dispose().catch((error) => {
@@ -294,14 +369,18 @@ var Dispatcher = class Dispatcher {
294
369
  #make_promise_cache_key(id, deps) {
295
370
  return `promise:${id}::${hash_deps(deps)}`;
296
371
  }
372
+ #is_server_render() {
373
+ return typeof document === "undefined";
374
+ }
297
375
  #interrupt_cached_fiber(cache_key) {
298
376
  const old_fiber = this.#fibers.get(cache_key);
299
377
  if (!old_fiber) return;
300
378
  interrupt_fiber(this.#runtime, old_fiber);
301
379
  this.#fibers.delete(cache_key);
380
+ return old_fiber;
302
381
  }
303
- #should_start_value_fiber(cache_key) {
304
- return !this.#disposed && !this.#fibers.has(cache_key) && !this.#values.has(cache_key);
382
+ #should_start_value_fiber(cache_key, cell) {
383
+ return !this.#disposed && !this.#fibers.has(cache_key) && cell === void 0;
305
384
  }
306
385
  #start_value_fiber(cache_key, options) {
307
386
  const program = Effect.gen(function* () {
@@ -309,11 +388,21 @@ var Dispatcher = class Dispatcher {
309
388
  });
310
389
  const fiber = this.#runtime.runFork(program);
311
390
  this.#fibers.set(cache_key, fiber);
391
+ queueMicrotask(() => {
392
+ if (!this.#is_current_fiber(cache_key, fiber)) return;
393
+ if (this.#value_cells.has(cache_key)) return;
394
+ this.#set_value_cell(cache_key, {
395
+ status: "pending",
396
+ fiber
397
+ });
398
+ });
312
399
  watch_fiber_exit({
313
400
  runtime: this.#runtime,
314
401
  fiber,
315
- on_complete: () => this.#fibers.delete(cache_key),
316
- on_success: (value) => this.#values.set(cache_key, value)
402
+ surface_failure: false,
403
+ on_complete: () => this.#complete_fiber(cache_key, fiber),
404
+ on_success: (value) => this.#publish_value_success(cache_key, fiber, value),
405
+ on_failure: (error) => this.#publish_value_failure(cache_key, fiber, error)
317
406
  });
318
407
  }
319
408
  #start_promise_fiber(cache_key, options) {
@@ -323,13 +412,55 @@ var Dispatcher = class Dispatcher {
323
412
  const fiber = this.#runtime.runFork(program);
324
413
  this.#fibers.set(cache_key, fiber);
325
414
  return this.#runtime.runPromise(Effect.flatMap(Fiber.await(fiber), (exit) => Effect.sync(() => {
326
- this.#fibers.delete(cache_key);
327
- this.#values.delete(cache_key);
328
- if (this.#promise_ids.get(options.id) === cache_key) this.#promise_ids.delete(options.id);
415
+ if (this.#is_current_fiber(cache_key, fiber)) {
416
+ this.#fibers.delete(cache_key);
417
+ this.#promise_values.delete(cache_key);
418
+ if (this.#promise_ids.get(options.id) === cache_key) this.#promise_ids.delete(options.id);
419
+ }
329
420
  if (Exit.isSuccess(exit)) return exit.value;
330
421
  throw Cause.squash(exit.cause);
331
422
  })));
332
423
  }
424
+ #clear_pending_value_cell(cache_key, fiber) {
425
+ const cell = this.#value_cells.get(cache_key);
426
+ if (cell?.status !== "pending") return;
427
+ if (fiber !== void 0 && cell.fiber !== fiber) return;
428
+ this.#delete_value_cell(cache_key);
429
+ }
430
+ #complete_fiber(cache_key, fiber) {
431
+ if (!this.#is_current_fiber(cache_key, fiber)) return;
432
+ this.#fibers.delete(cache_key);
433
+ }
434
+ #publish_value_success(cache_key, fiber, value) {
435
+ if (!this.#is_current_fiber(cache_key, fiber)) return;
436
+ this.#set_value_cell(cache_key, {
437
+ status: "success",
438
+ value
439
+ });
440
+ }
441
+ #publish_value_failure(cache_key, fiber, error) {
442
+ if (!this.#is_current_fiber(cache_key, fiber)) return;
443
+ this.#set_value_cell(cache_key, {
444
+ status: "failure",
445
+ error
446
+ });
447
+ }
448
+ #set_value_cell(cache_key, cell) {
449
+ this.#value_cells.set(cache_key, cell);
450
+ this.#notify_value_cells();
451
+ }
452
+ #delete_value_cell(cache_key) {
453
+ if (!this.#value_cells.delete(cache_key)) return;
454
+ this.#notify_value_cells();
455
+ }
456
+ #clear_value_cells() {
457
+ if (this.#value_cells.size === 0) return;
458
+ this.#value_cells.clear();
459
+ this.#notify_value_cells();
460
+ }
461
+ #is_current_fiber(cache_key, fiber) {
462
+ return !this.#disposed && this.#fibers.get(cache_key) === fiber;
463
+ }
333
464
  };
334
465
  let current_dispatcher = null;
335
466
  /**
@@ -365,6 +496,6 @@ function reset_dispatcher() {
365
496
  current_dispatcher = null;
366
497
  }
367
498
  //#endregion
368
- export { get_dispatcher as n, reset_dispatcher as r, Dispatcher as t };
499
+ export { Code as i, get_dispatcher as n, reset_dispatcher as r, Dispatcher as t };
369
500
 
370
- //# sourceMappingURL=dispatcher-CZvLODNK.js.map
501
+ //# sourceMappingURL=dispatcher-BnitG7p3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher-BnitG7p3.js","names":["#notify_value_cells","#runtime","#emit_markup_value","#emit_markup_promise","#emit_markup_run","#disposed","#next_fiber_id","#fibers","#make_value_cache_key","#value_ids","#subscribe_value_cells","#value_cells","#interrupt_cached_fiber","#clear_pending_value_cell","#should_start_value_fiber","#start_value_fiber","#make_promise_cache_key","#promise_ids","#promise_values","#start_promise_fiber","#is_server_render","#clear_value_cells","#is_current_fiber","#set_value_cell","#complete_fiber","#publish_value_success","#publish_value_failure","#delete_value_cell"],"sources":["../../../modules/svelte-effect-runtime/src/dispatcher/fibers.ts","../../../modules/svelte-effect-runtime/src/dispatcher/deps.ts","../../../modules/svelte-effect-runtime/src/dispatcher/types.ts","../../../modules/svelte-effect-runtime/src/dispatcher/index.ts"],"sourcesContent":["import { Cause, Effect, Exit, Fiber } from \"effect\";\nimport type { Fiber as FiberType } from \"effect/Fiber\";\nimport type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\n\n/**\n * Callbacks fired when a watched dispatcher fiber completes.\n *\n * @example\n * ```ts\n * const callbacks: FiberWatchCallbacks<number> = {\n * on_success: (value) => cache.set(key, value),\n * };\n * ```\n *\n * @since 2.0.0\n * @internal\n */\nexport interface FiberWatchCallbacks<A> {\n on_complete?: () => void;\n on_success?: (value: A) => void;\n on_failure?: (error: unknown) => void;\n surface_failure?: boolean;\n}\n\n/**\n * Interrupts a dispatcher fiber through its managed runtime.\n *\n * @example\n * ```ts\n * interrupt_fiber(runtime, fiber);\n * ```\n *\n * @since 2.0.0\n * @param runtime - Managed runtime that owns the fiber.\n * @param fiber - Fiber to interrupt.\n * @returns Nothing.\n * @internal\n */\nexport function interrupt_fiber(\n runtime: ManagedRuntimeType<unknown, unknown>,\n fiber: FiberType<unknown, unknown>,\n): void {\n runtime.runFork(\n Fiber.interrupt(fiber) as Effect.Effect<unknown, unknown, unknown>,\n );\n}\n\n/**\n * Watches a dispatcher fiber, runs completion callbacks, and surfaces\n * non-interrupt failures on the microtask queue.\n *\n * @example\n * ```ts\n * watch_fiber_exit({ runtime, fiber, on_complete: cleanup });\n * ```\n *\n * @since 2.0.0\n * @param options - Runtime, fiber, and callbacks used for the watcher.\n * @returns Nothing.\n * @internal\n */\nexport function watch_fiber_exit<A>(\n options: {\n runtime: ManagedRuntimeType<unknown, unknown>;\n fiber: FiberType<unknown, unknown>;\n } & FiberWatchCallbacks<A>,\n): void {\n const {\n runtime,\n fiber,\n on_complete,\n on_success,\n on_failure,\n surface_failure = true,\n } = options;\n\n runtime.runFork(\n Effect.flatMap(Fiber.await(fiber), (exit) =>\n Effect.sync(() => {\n if (Exit.isSuccess(exit)) {\n on_success?.(exit.value as A);\n on_complete?.();\n\n return;\n }\n\n if (!Cause.hasInterruptsOnly(exit.cause)) {\n const error = Cause.squash(exit.cause);\n\n on_failure?.(error);\n\n if (surface_failure) {\n queueMicrotask(() => {\n throw error;\n });\n }\n }\n\n on_complete?.();\n })),\n );\n}\n","const object_dep_ids = new WeakMap<object, number>();\nconst symbol_dep_ids = new Map<symbol, number>();\n\nlet next_object_dep_id = 0;\nlet next_symbol_dep_id = 0;\n\n/**\n * Builds a deterministic cache key from a dependency array.\n *\n * @example\n * ```ts\n * const key = hash_deps([user_id, filters]);\n * ```\n *\n * @since 2.0.0\n * @param deps - Dependency array to encode for cache lookup.\n * @returns A structured string key suitable for Map lookups.\n * @internal\n */\nexport function hash_deps(deps: readonly unknown[]): string {\n const parts = deps.map((dep) => {\n if (dep === null) {\n return \"l:null\";\n }\n\n if (dep === undefined) {\n return \"u:undefined\";\n }\n\n const type = typeof dep;\n\n if (type === \"string\") {\n return [\"s\", dep];\n }\n\n if (type === \"number\") {\n return `n:${Object.is(dep, -0) ? \"-0\" : String(dep)}`;\n }\n\n if (type === \"bigint\") {\n return `b:${dep}`;\n }\n\n if (type === \"boolean\") {\n return dep ? \"t:true\" : \"f:false\";\n }\n\n if (type === \"symbol\") {\n return hash_symbol_dep(dep as symbol);\n }\n\n return hash_object_dep(dep as object);\n });\n\n return JSON.stringify(parts);\n}\n\nfunction hash_symbol_dep(dep: symbol): string {\n let id = symbol_dep_ids.get(dep);\n\n if (id === undefined) {\n next_symbol_dep_id += 1;\n id = next_symbol_dep_id;\n symbol_dep_ids.set(dep, id);\n }\n\n return `y:${id}`;\n}\n\nfunction hash_object_dep(dep: object): string {\n let id = object_dep_ids.get(dep);\n\n if (id === undefined) {\n next_object_dep_id += 1;\n id = next_object_dep_id;\n object_dep_ids.set(dep, id);\n }\n\n return `o:${id}`;\n}\n","import type { Effect } from \"effect\";\n\n/**\n * Stable operation codes used by transform-generated dispatcher events.\n *\n * @example\n * ```ts\n * const type = Code.Markup.Promise;\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport const Code = {\n Markup: {\n Promise: \"MarkupPromise\",\n Run: \"MarkupRun\",\n Value: \"MarkupValue\",\n },\n} as const;\n\n/**\n * Options for markup promise behavior during server rendering.\n *\n * @example\n * ```ts\n * const options: MarkupPromiseOptions = { ssr: \"pending\" };\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport interface MarkupPromiseOptions {\n /** Keep the SSR promise pending so Svelte renders an await block fallback. */\n ssr?: \"pending\";\n}\n\n/**\n * Minimal cleanup handle returned by dispatcher lifecycle hooks.\n *\n * @example\n * ```ts\n * const dispose: Dispose = dispatcher.fork(program);\n * dispose();\n * ```\n *\n * @since 2.0.0\n * @internal\n */\nexport type Dispose = () => void;\n\n/**\n * Options for a cached dispatcher value block.\n *\n * @example\n * ```ts\n * const options: ValueOptions<number> = {\n * id: \"count\",\n * deps: [],\n * fallback: 0,\n * factory: () => Effect.succeed(1),\n * };\n * ```\n *\n * @since 2.0.0\n * @internal\n */\nexport interface ValueOptions<A> {\n /** Stable cache key for this value block. */\n id: string;\n /** Reactive dependency array. */\n deps: readonly unknown[];\n /** Value returned synchronously while the effect is running or during SSR. */\n fallback: A;\n /** Generator function that yields the effect to run. */\n factory: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\n/**\n * Options for a cached dispatcher promise block.\n *\n * @example\n * ```ts\n * const options: PromiseOptions<number> = {\n * id: \"count\",\n * deps: [],\n * factory: () => Effect.succeed(1),\n * };\n * ```\n *\n * @since 2.0.0\n * @internal\n */\nexport interface PromiseOptions<A> {\n /** Stable cache key for this promise block. */\n id: string;\n /** Reactive dependency array. */\n deps: readonly unknown[];\n /** Generator function that yields the effect to run. */\n factory: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\n/**\n * Generated event that reads a markup expression through the cached value\n * channel.\n *\n * @example\n * ```ts\n * const event: MarkupValueEvent<number, undefined> = {\n * type: Code.Markup.Value,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fallback: undefined,\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * };\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport interface MarkupValueEvent<A, F> {\n /** Dispatcher code identifying a markup value read. */\n type: typeof Code.Markup.Value;\n /** Stable identifier generated from the expression's source position. */\n id: string;\n /** Reactive dependency array captured from free identifiers. */\n deps: readonly unknown[];\n /** Value returned synchronously while the effect is pending. */\n fallback: F;\n /** Generator function that yields the effect to run. */\n fn: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\n/**\n * Generated event that reads a markup expression through the cached promise\n * channel.\n *\n * @example\n * ```ts\n * const event: MarkupPromiseEvent<number> = {\n * type: Code.Markup.Promise,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * };\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport interface MarkupPromiseEvent<A> {\n /** Dispatcher code identifying a markup promise read. */\n type: typeof Code.Markup.Promise;\n /** Stable identifier generated from the expression's source position. */\n id: string;\n /** Reactive dependency array captured from free identifiers. */\n deps: readonly unknown[];\n /** Generator function that yields the effect to run. */\n fn: () => Effect.gen.Return<A, unknown, unknown>;\n /** Value resolved during SSR when a fallback is required. */\n ssr_fallback?: A;\n /** Optional SSR behavior for await blocks and similar contexts. */\n options?: MarkupPromiseOptions;\n}\n\n/**\n * Generated event that runs an event-handler Effect.\n *\n * @example\n * ```ts\n * const event: MarkupRunEvent<void> = {\n * type: Code.Markup.Run,\n * fn: function* () {\n * yield* Effect.void;\n * },\n * };\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport interface MarkupRunEvent<A> {\n /** Dispatcher code identifying a markup event-handler run. */\n type: typeof Code.Markup.Run;\n /** Generator function that yields the effect to run. */\n fn: () => Effect.gen.Return<A, unknown, unknown>;\n}\n\n/**\n * Union of generated dispatcher events.\n *\n * @example\n * ```ts\n * const event: DispatcherEvent<number, undefined> = {\n * type: Code.Markup.Value,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fallback: undefined,\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * };\n * ```\n *\n * @since 3.3.0\n * @internal\n */\nexport type DispatcherEvent<A, F = A> =\n | MarkupPromiseEvent<A>\n | MarkupRunEvent<A>\n | MarkupValueEvent<A, F>;\n","import type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\nimport { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from \"effect\";\nimport { createSubscriber } from \"svelte/reactivity\";\nimport type { Fiber as FiberType } from \"effect/Fiber\";\n\nimport { DispatcherDisposedError } from \"$/errors.ts\";\nimport { interrupt_fiber, watch_fiber_exit } from \"./fibers.ts\";\nimport { hash_deps } from \"./deps.ts\";\nimport { Code } from \"./types.ts\";\nimport type {\n DispatcherEvent,\n Dispose,\n MarkupPromiseEvent,\n MarkupRunEvent,\n MarkupValueEvent,\n PromiseOptions,\n ValueOptions,\n} from \"./types.ts\";\n\nexport { Code } from \"./types.ts\";\nexport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\n\ntype ValueCell<A> =\n | {\n readonly status: \"pending\";\n readonly fiber: FiberType<unknown, unknown>;\n }\n | {\n readonly status: \"success\";\n readonly value: A;\n }\n | {\n readonly status: \"failure\";\n readonly error: unknown;\n };\n\n/**\n * Unified effect block dispatcher. Manages the fiber lifecycle of every\n * effect block and wires results into reactive channels.\n *\n * @example\n * ```ts\n * const dispatcher = new Dispatcher();\n * const cancel = dispatcher.fork(Effect.log(\"running\"));\n * cancel();\n * ```\n *\n * @since 2.0.0\n * @internal\n */\nexport class Dispatcher {\n /** The underlying Effect runtime that executes forked programs. */\n #runtime: ManagedRuntimeType<unknown, unknown>;\n /** Active fibers keyed by cache id or generated fork id. */\n #fibers = new Map<string, FiberType<unknown, unknown>>();\n /** Reactive value cells keyed by value cache id. */\n #value_cells = new Map<string, ValueCell<unknown>>();\n /** Notifies subscribed Svelte template effects when value cells change. */\n #notify_value_cells = (): void => {};\n /** Subscribes the current Svelte tracking scope to value cell changes. */\n #subscribe_value_cells = createSubscriber((update) => {\n this.#notify_value_cells = update;\n\n return () => {\n if (this.#notify_value_cells !== update) {\n return;\n }\n\n this.#notify_value_cells = (): void => {};\n };\n });\n /** Pending promises keyed by promise cache id. */\n #promise_values = new Map<string, Promise<unknown>>();\n /** Current cache key per value block id. */\n #value_ids = new Map<string, string>();\n /** Current cache key per promise block id. */\n #promise_ids = new Map<string, string>();\n /** Whether dispose has been called, blocking new work. */\n #disposed = false;\n /** Monotonically increasing counter for unnamed fiber keys. */\n #next_fiber_id = 0;\n\n /**\n * Creates a dispatcher with an optional layer and installs it as the global\n * singleton returned by {@link get_dispatcher}.\n *\n * @example\n * ```ts\n * const dispatcher = Dispatcher.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n * @returns The newly created dispatcher.\n */\n static make<R = never>(\n layer?: Layer.Layer<R>,\n ): Dispatcher {\n const runtime = ManagedRuntime.make(\n layer ?? (Layer.empty as unknown as Layer.Layer<R>),\n );\n\n const dispatcher = new Dispatcher(\n runtime as ManagedRuntimeType<unknown, unknown>,\n );\n current_dispatcher = dispatcher;\n\n return dispatcher;\n }\n\n /**\n * Creates a dispatcher backed by the provided managed runtime.\n *\n * @example\n * ```ts\n * const dispatcher = new Dispatcher(runtime);\n * ```\n *\n * @since 2.0.0\n * @param runtime - Managed runtime to use, or an empty-layer runtime when\n * omitted.\n */\n constructor(runtime?: ManagedRuntimeType<unknown, unknown>) {\n this.#runtime = runtime ??\n ManagedRuntime.make(Layer.empty) as unknown as ManagedRuntimeType<\n unknown,\n unknown\n >;\n }\n\n /**\n * Handles a transform-generated dispatcher event.\n *\n * @example\n * ```ts\n * const value = dispatcher.emit({\n * type: Code.Markup.Value,\n * id: \"Component.svelte:1:2\",\n * deps: [],\n * fallback: undefined,\n * fn: function* () {\n * return yield* Effect.succeed(1);\n * },\n * });\n * ```\n *\n * @since 3.3.0\n * @param event - Generated event describing the dispatcher operation to run.\n * @returns The operation result for the emitted dispatcher event.\n */\n emit<A, F>(event: MarkupValueEvent<A, F>): A | F;\n emit<A>(event: MarkupPromiseEvent<A>): Promise<A>;\n emit<A>(event: MarkupRunEvent<A>): Promise<A>;\n emit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A>;\n emit<A, F>(event: DispatcherEvent<A, F>): A | F | Promise<A> {\n switch (event.type) {\n case Code.Markup.Value:\n return this.#emit_markup_value(event);\n\n case Code.Markup.Promise:\n return this.#emit_markup_promise(event);\n\n case Code.Markup.Run:\n return this.#emit_markup_run(event);\n }\n }\n\n /**\n * Forks an effect as a managed fiber and returns a cleanup function.\n *\n * @example\n * ```ts\n * const dispose = dispatcher.fork(Effect.log(\"clicked\"));\n * ```\n *\n * @since 2.0.0\n * @param effect - Effect to fork.\n * @returns A function that interrupts the fiber.\n */\n fork<A, E, R>(effect: Effect.Effect<A, E, R>): Dispose {\n if (this.#disposed) {\n return () => {};\n }\n\n const fiber = this.#runtime.runFork(\n effect as Effect.Effect<unknown, unknown, unknown>,\n );\n const key = `fork:${this.#next_fiber_id}`;\n\n this.#next_fiber_id += 1;\n this.#fibers.set(key, fiber);\n watch_fiber_exit({\n runtime: this.#runtime,\n fiber,\n on_complete: () => this.#fibers.delete(key),\n });\n\n let disposed = false;\n\n return (): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n interrupt_fiber(this.#runtime, fiber);\n };\n }\n\n /**\n * Forks an effect and exposes its result as a cached reactive value.\n *\n * @example\n * ```ts\n * const user = dispatcher.value({ id, deps, fallback, factory });\n * ```\n *\n * @since 2.0.0\n * @param options - Value id, dependency array, fallback, and effect factory.\n * @returns The cached value if resolved, otherwise the fallback.\n */\n value<A>(options: ValueOptions<A>): A {\n if (this.#disposed) {\n return options.fallback;\n }\n\n const cache_key = this.#make_value_cache_key(options.id, options.deps);\n const old_key = this.#value_ids.get(options.id);\n\n this.#subscribe_value_cells();\n\n const cell = this.#value_cells.get(cache_key);\n\n if (old_key !== undefined && old_key !== cache_key) {\n const old_fiber = this.#interrupt_cached_fiber(old_key);\n\n this.#clear_pending_value_cell(old_key, old_fiber);\n }\n\n this.#value_ids.set(options.id, cache_key);\n\n if (this.#should_start_value_fiber(cache_key, cell)) {\n this.#start_value_fiber(cache_key, options);\n }\n\n if (cell?.status === \"success\") {\n return cell.value as A;\n }\n\n if (cell?.status === \"failure\") {\n throw cell.error;\n }\n\n return options.fallback;\n }\n\n /**\n * Forks an effect and exposes its completion as a cached promise.\n *\n * @example\n * ```ts\n * const promise = dispatcher.promise({ id, deps, factory });\n * ```\n *\n * @since 2.0.0\n * @param options - Promise id, dependency array, and effect factory.\n * @returns A promise that resolves with the effect result.\n */\n promise<A>(options: PromiseOptions<A>): Promise<A> {\n if (this.#disposed) {\n return Promise.reject(new DispatcherDisposedError());\n }\n\n const cache_key = this.#make_promise_cache_key(options.id, options.deps);\n const old_key = this.#promise_ids.get(options.id);\n\n if (old_key !== undefined && old_key !== cache_key) {\n this.#interrupt_cached_fiber(old_key);\n this.#promise_values.delete(old_key);\n }\n\n this.#promise_ids.set(options.id, cache_key);\n\n const existing = this.#promise_values.get(cache_key);\n\n if (existing) {\n return existing as Promise<A>;\n }\n\n const promise = this.#start_promise_fiber(cache_key, options);\n\n this.#promise_values.set(cache_key, promise);\n\n return promise;\n }\n\n /**\n * Runs an event-handler effect and surfaces failures to Svelte.\n *\n * @example\n * ```ts\n * await dispatcher.run(Effect.log(\"submit\"));\n * ```\n *\n * @since 2.0.0\n * @param effect - Effect to execute.\n * @returns A promise that resolves or rejects when the effect completes.\n */\n run<A, E, R>(effect: Effect.Effect<A, E, R>): Promise<A> {\n if (this.#disposed) {\n return Promise.reject(new DispatcherDisposedError());\n }\n\n const exit_effect = Effect.exit(effect) as Effect.Effect<\n unknown,\n unknown,\n unknown\n >;\n\n return this.#runtime\n .runPromise(exit_effect)\n .then((exit: unknown) => {\n const result = exit as Exit.Exit<A, E>;\n\n if (Exit.isSuccess(result)) {\n return result.value;\n }\n\n if (Cause.hasInterruptsOnly(result.cause)) {\n return undefined as A;\n }\n\n const error = Cause.squash(result.cause);\n\n queueMicrotask(() => {\n throw error;\n });\n\n throw error;\n });\n }\n\n #emit_markup_value<A, F>(event: MarkupValueEvent<A, F>): A | F {\n if (this.#is_server_render()) {\n return event.fallback;\n }\n\n return this.value<A | F>({\n id: event.id,\n deps: event.deps,\n fallback: event.fallback,\n factory: event.fn,\n });\n }\n\n #emit_markup_promise<A>(event: MarkupPromiseEvent<A>): Promise<A> {\n if (this.#is_server_render()) {\n if (event.options?.ssr === \"pending\") {\n return new Promise<A>(() => {});\n }\n\n if (\"ssr_fallback\" in event) {\n return Promise.resolve(event.ssr_fallback as A);\n }\n }\n\n return this.promise({\n id: event.id,\n deps: event.deps,\n factory: event.fn,\n });\n }\n\n #emit_markup_run<A>(event: MarkupRunEvent<A>): Promise<A> {\n const effect = Effect.gen(event.fn);\n\n return this.run(effect);\n }\n\n /**\n * Cancels all running fibers and releases cached values.\n *\n * @example\n * ```ts\n * dispatcher.dispose();\n * ```\n *\n * @since 2.0.0\n * @returns Nothing.\n */\n dispose(): void {\n this.#disposed = true;\n\n for (const fiber of this.#fibers.values()) {\n interrupt_fiber(this.#runtime, fiber);\n }\n\n this.#fibers.clear();\n this.#clear_value_cells();\n this.#promise_values.clear();\n this.#value_ids.clear();\n this.#promise_ids.clear();\n\n void this.#runtime.dispose().catch((error: unknown) => {\n queueMicrotask(() => {\n throw error;\n });\n });\n }\n\n #make_value_cache_key(id: string, deps: readonly unknown[]): string {\n return `value:${id}::${hash_deps(deps)}`;\n }\n\n #make_promise_cache_key(id: string, deps: readonly unknown[]): string {\n return `promise:${id}::${hash_deps(deps)}`;\n }\n\n #is_server_render(): boolean {\n return typeof document === \"undefined\";\n }\n\n #interrupt_cached_fiber(\n cache_key: string,\n ): FiberType<unknown, unknown> | undefined {\n const old_fiber = this.#fibers.get(cache_key);\n\n if (!old_fiber) {\n return undefined;\n }\n\n interrupt_fiber(this.#runtime, old_fiber);\n this.#fibers.delete(cache_key);\n\n return old_fiber;\n }\n\n #should_start_value_fiber(\n cache_key: string,\n cell: ValueCell<unknown> | undefined,\n ): boolean {\n return (\n !this.#disposed &&\n !this.#fibers.has(cache_key) &&\n cell === undefined\n );\n }\n\n #start_value_fiber<A>(cache_key: string, options: ValueOptions<A>): void {\n const program = Effect.gen(function* () {\n const result = yield* Effect.gen(options.factory);\n\n return result;\n });\n const fiber = this.#runtime.runFork(\n program as Effect.Effect<unknown, unknown, unknown>,\n );\n\n this.#fibers.set(cache_key, fiber);\n\n queueMicrotask(() => {\n if (!this.#is_current_fiber(cache_key, fiber)) {\n return;\n }\n\n if (this.#value_cells.has(cache_key)) {\n return;\n }\n\n this.#set_value_cell(cache_key, {\n status: \"pending\",\n fiber,\n });\n });\n\n watch_fiber_exit({\n runtime: this.#runtime,\n fiber,\n surface_failure: false,\n on_complete: () => this.#complete_fiber(cache_key, fiber),\n on_success: (value) =>\n this.#publish_value_success(\n cache_key,\n fiber,\n value,\n ),\n on_failure: (error) =>\n this.#publish_value_failure(\n cache_key,\n fiber,\n error,\n ),\n });\n }\n\n #start_promise_fiber<A>(\n cache_key: string,\n options: PromiseOptions<A>,\n ): Promise<A> {\n const program = Effect.gen(function* () {\n const result = yield* Effect.gen(options.factory);\n\n return result;\n });\n const fiber = this.#runtime.runFork(\n program as Effect.Effect<unknown, unknown, unknown>,\n );\n\n this.#fibers.set(cache_key, fiber);\n\n return this.#runtime.runPromise(\n Effect.flatMap(Fiber.await(fiber), (exit) =>\n Effect.sync(() => {\n const is_current = this.#is_current_fiber(cache_key, fiber);\n\n if (is_current) {\n this.#fibers.delete(cache_key);\n this.#promise_values.delete(cache_key);\n\n if (this.#promise_ids.get(options.id) === cache_key) {\n this.#promise_ids.delete(options.id);\n }\n }\n\n if (Exit.isSuccess(exit)) {\n return exit.value as A;\n }\n\n throw Cause.squash(exit.cause);\n })),\n );\n }\n\n #clear_pending_value_cell(\n cache_key: string,\n fiber: FiberType<unknown, unknown> | undefined,\n ): void {\n const cell = this.#value_cells.get(cache_key);\n\n if (cell?.status !== \"pending\") {\n return;\n }\n\n if (fiber !== undefined && cell.fiber !== fiber) {\n return;\n }\n\n this.#delete_value_cell(cache_key);\n }\n\n #complete_fiber(\n cache_key: string,\n fiber: FiberType<unknown, unknown>,\n ): void {\n if (!this.#is_current_fiber(cache_key, fiber)) {\n return;\n }\n\n this.#fibers.delete(cache_key);\n }\n\n #publish_value_success<A>(\n cache_key: string,\n fiber: FiberType<unknown, unknown>,\n value: A,\n ): void {\n if (!this.#is_current_fiber(cache_key, fiber)) {\n return;\n }\n\n this.#set_value_cell(cache_key, {\n status: \"success\",\n value,\n });\n }\n\n #publish_value_failure(\n cache_key: string,\n fiber: FiberType<unknown, unknown>,\n error: unknown,\n ): void {\n if (!this.#is_current_fiber(cache_key, fiber)) {\n return;\n }\n\n this.#set_value_cell(cache_key, {\n status: \"failure\",\n error,\n });\n }\n\n #set_value_cell(\n cache_key: string,\n cell: ValueCell<unknown>,\n ): void {\n this.#value_cells.set(cache_key, cell);\n this.#notify_value_cells();\n }\n\n #delete_value_cell(cache_key: string): void {\n const deleted = this.#value_cells.delete(cache_key);\n\n if (!deleted) {\n return;\n }\n\n this.#notify_value_cells();\n }\n\n #clear_value_cells(): void {\n if (this.#value_cells.size === 0) {\n return;\n }\n\n this.#value_cells.clear();\n this.#notify_value_cells();\n }\n\n #is_current_fiber(\n cache_key: string,\n fiber: FiberType<unknown, unknown>,\n ): boolean {\n return !this.#disposed && this.#fibers.get(cache_key) === fiber;\n }\n}\n\nlet current_dispatcher: Dispatcher | null = null;\n\n/**\n * Resolves the active dispatcher, creating a default one if necessary.\n *\n * @example\n * ```ts\n * const dispatcher = get_dispatcher();\n * ```\n *\n * @since 2.0.0\n * @returns The active dispatcher singleton.\n * @internal\n */\nexport function get_dispatcher(): Dispatcher {\n current_dispatcher ??= new Dispatcher();\n\n return current_dispatcher;\n}\n\n/**\n * Resets the internal singleton dispatcher used by source-level tests.\n *\n * @example\n * ```ts\n * reset_dispatcher();\n * ```\n *\n * @since 2.0.0\n * @returns Nothing.\n * @internal\n */\nexport function reset_dispatcher(): void {\n current_dispatcher?.dispose();\n current_dispatcher = null;\n}\n"],"mappings":"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"}
@@ -29,8 +29,8 @@ const textmate_language = {
29
29
  ],
30
30
  repository: {
31
31
  "ser-script-effect-attribute": {
32
- match: "(<script\\b(?=[^>]*\\s+effect(?:\\s*=|\\s|>|$))[^>]*?)(\\s+)(effect)(?=(?:\\s*=|\\s|>|$))",
33
- captures: { "3": { name: "storage.modifier.effect.ser.svelte" } }
32
+ match: "(?<=<script\\b[^>]*\\s)(effect)(?=(?:\\s*=|\\s|>|$))",
33
+ captures: { "1": { name: "storage.modifier.effect.ser.svelte" } }
34
34
  },
35
35
  "ser-yield-star": {
36
36
  match: "\\byield\\s*(\\*)",
@@ -178,4 +178,4 @@ const tree_sitter = {
178
178
  //#endregion
179
179
  export { textmate as n, textmate_language as r, tree_sitter as t };
180
180
 
181
- //# sourceMappingURL=grammars-DwahpmJS.js.map
181
+ //# sourceMappingURL=grammars-i4CSRxWg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammars-i4CSRxWg.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/grammars/textmate.ts","../../../modules/svelte-effect-runtime/src/grammars/tree-sitter.ts"],"sourcesContent":["/**\n * JSON-compatible TextMate capture map used by raw grammar rules.\n *\n * @example\n * ```ts\n * const captures: TextMateCaptureMap = {\n * \"1\": { name: \"keyword.control.ser.svelte\" },\n * };\n * ```\n *\n * @since 3.2.0\n */\nexport interface TextMateCaptureMap {\n readonly [capture_id: string]: TextMateRawRule;\n}\n\n/**\n * JSON-compatible TextMate repository map used by raw grammar rules.\n *\n * @example\n * ```ts\n * const repository: TextMateRepository = {\n * \"ser-yield-star\": { match: \"\\\\byield\\\\s*\\\\*\" },\n * };\n * ```\n *\n * @since 3.2.0\n */\nexport interface TextMateRepository {\n readonly [rule_name: string]: TextMateRawRule;\n}\n\n/**\n * JSON-compatible subset of a TextMate grammar rule.\n *\n * @example\n * ```ts\n * const rule: TextMateRawRule = {\n * match: \"\\\\byield\\\\s*(\\\\*)\",\n * name: \"keyword.control.yield.ser.svelte\",\n * };\n * ```\n *\n * @since 3.2.0\n */\nexport interface TextMateRawRule {\n readonly include?: string;\n readonly name?: string;\n readonly contentName?: string;\n readonly match?: string;\n readonly captures?: TextMateCaptureMap;\n readonly begin?: string;\n readonly beginCaptures?: TextMateCaptureMap;\n readonly end?: string;\n readonly endCaptures?: TextMateCaptureMap;\n readonly patterns?: readonly TextMateRawRule[];\n readonly repository?: TextMateRepository;\n}\n\n/**\n * Shiki-compatible TextMate language registration for a raw grammar.\n *\n * @example\n * ```ts\n * const language: TextMateLanguageRegistration = textmate.language;\n * ```\n *\n * @since 3.2.0\n */\nexport interface TextMateLanguageRegistration {\n readonly name: string;\n readonly displayName: string;\n readonly scopeName: string;\n readonly injectionSelector: string;\n readonly injectTo: readonly string[];\n readonly embeddedLangs: readonly string[];\n readonly patterns: readonly TextMateRawRule[];\n readonly repository: TextMateRepository;\n}\n\n/**\n * Public TextMate grammar bundle for SER-aware Svelte highlighting.\n *\n * @example\n * ```ts\n * await highlighter.loadLanguage(textmate.language);\n * ```\n *\n * @since 3.2.0\n */\nexport interface TextMateGrammarBundle {\n readonly language: TextMateLanguageRegistration;\n readonly scope_name: string;\n readonly target_scope_name: string;\n readonly injection_selector: string;\n}\n\nconst punctuation_begin: TextMateRawRule = {\n name: \"punctuation.section.embedded.begin.svelte\",\n};\n\nconst punctuation_end: TextMateRawRule = {\n name: \"punctuation.section.embedded.end.svelte\",\n};\n\nconst directive_punctuation: TextMateRawRule = {\n name: \"punctuation.definition.tag.ser.svelte\",\n};\n\nconst expression_patterns: readonly TextMateRawRule[] = [\n { include: \"#ser-yield-star\" },\n { include: \"source.ts\" },\n];\n\n/**\n * Shiki-ready TextMate injection grammar that adds SER syntax to the stock\n * Svelte grammar without replacing Svelte's own grammar.\n *\n * @since 3.2.0\n */\nexport const textmate_language: TextMateLanguageRegistration = {\n name: \"svelte-effect-runtime\",\n displayName: \"Svelte Effect Runtime\",\n scopeName: \"source.svelte.ser.injection\",\n injectionSelector: \"L:source.svelte -comment -string\",\n injectTo: [\"source.svelte\"],\n embeddedLangs: [\"typescript\"],\n patterns: [\n { include: \"#ser-script-effect-attribute\" },\n { include: \"#ser-declaration-tag\" },\n { include: \"#ser-const-directive\" },\n { include: \"#ser-block-directive\" },\n { include: \"#ser-else-if-directive\" },\n { include: \"#ser-expression-directive\" },\n { include: \"#ser-event-attribute\" },\n { include: \"#ser-yield-expression\" },\n { include: \"#ser-yield-star\" },\n ],\n repository: {\n \"ser-script-effect-attribute\": {\n match: \"(?<=<script\\\\b[^>]*\\\\s)(effect)(?=(?:\\\\s*=|\\\\s|>|$))\",\n captures: {\n \"1\": { name: \"storage.modifier.effect.ser.svelte\" },\n },\n },\n\n \"ser-yield-star\": {\n match: \"\\\\byield\\\\s*(\\\\*)\",\n name: \"keyword.control.yield.ser.svelte\",\n captures: {\n \"1\": { name: \"keyword.operator.yield.star.ser.svelte\" },\n },\n },\n\n \"ser-yield-expression\": {\n begin: \"(\\\\{)(?=\\\\s*yield\\\\s*\\\\*)\",\n beginCaptures: {\n \"1\": punctuation_begin,\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.expression.yield.ser.svelte\",\n patterns: expression_patterns,\n },\n\n \"ser-declaration-tag\": {\n begin: \"(\\\\{)(\\\\s*)(?=(?:const|let)\\\\b)\",\n beginCaptures: {\n \"1\": punctuation_begin,\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.declaration.ser.svelte\",\n patterns: [\n {\n match: \"\\\\b(?:const|let)\\\\b\",\n name: \"storage.type.declaration.ser.svelte\",\n },\n ...expression_patterns,\n ],\n },\n\n \"ser-const-directive\": {\n begin: \"(\\\\{)(\\\\s*)(@)(const)\\\\b\",\n beginCaptures: {\n \"1\": punctuation_begin,\n \"3\": directive_punctuation,\n \"4\": { name: \"storage.type.declaration.ser.svelte\" },\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.directive.const.ser.svelte\",\n patterns: expression_patterns,\n },\n\n \"ser-block-directive\": {\n begin: \"(\\\\{)(\\\\s*)(#)(each|await|if|key)\\\\b\",\n beginCaptures: {\n \"1\": punctuation_begin,\n \"3\": directive_punctuation,\n \"4\": { name: \"keyword.control.block.ser.svelte\" },\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.directive.block.ser.svelte\",\n patterns: expression_patterns,\n },\n\n \"ser-else-if-directive\": {\n begin: \"(\\\\{)(\\\\s*)(:)(else\\\\s+if)\\\\b\",\n beginCaptures: {\n \"1\": punctuation_begin,\n \"3\": directive_punctuation,\n \"4\": { name: \"keyword.control.conditional.ser.svelte\" },\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.directive.else-if.ser.svelte\",\n patterns: expression_patterns,\n },\n\n \"ser-expression-directive\": {\n begin: \"(\\\\{)(\\\\s*)(@)(render|html|debug)\\\\b\",\n beginCaptures: {\n \"1\": punctuation_begin,\n \"3\": directive_punctuation,\n \"4\": { name: \"keyword.control.directive.ser.svelte\" },\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.directive.expression.ser.svelte\",\n patterns: expression_patterns,\n },\n\n \"ser-event-attribute\": {\n begin:\n \"(\\\\b(?:on:[A-Za-z_$][\\\\w$-]*|on[A-Za-z_$][\\\\w$-]*)\\\\b)(\\\\s*=\\\\s*)(\\\\{)(?=\\\\s*yield\\\\s*\\\\*)\",\n beginCaptures: {\n \"1\": { name: \"entity.other.attribute-name.event.ser.svelte\" },\n \"3\": punctuation_begin,\n },\n end: \"(\\\\})\",\n endCaptures: {\n \"1\": punctuation_end,\n },\n name: \"meta.embedded.attribute.event.ser.svelte\",\n patterns: expression_patterns,\n },\n },\n};\n\n/**\n * TextMate grammar bundle exported by `svelte-effect-runtime/grammars`.\n *\n * @since 3.2.0\n */\nexport const textmate: TextMateGrammarBundle = {\n language: textmate_language,\n scope_name: textmate_language.scopeName,\n target_scope_name: \"source.svelte\",\n injection_selector: textmate_language.injectionSelector,\n};\n","/**\n * Tree-sitter query strings for SER-aware Svelte tooling.\n *\n * @example\n * ```ts\n * const highlights = tree_sitter.highlights_query;\n * const injections = tree_sitter.injections_query;\n * ```\n *\n * @since 3.2.0\n */\nexport interface TreeSitterQueryBundle {\n readonly name: string;\n readonly highlights_query: string;\n readonly injections_query: string;\n}\n\n/**\n * Query strings that describe SER's extensions for tree-sitter-svelte clients.\n *\n * @since 3.2.0\n */\nexport const tree_sitter: TreeSitterQueryBundle = {\n name: \"svelte-effect-runtime\",\n highlights_query: String.raw`\n; Highlight the SER-only effect marker on <script effect>.\n((script_element\n (start_tag\n (attribute\n (attribute_name) @storage.modifier.effect.ser)))\n (#eq? @storage.modifier.effect.ser \"effect\"))\n\n; Highlight yielded Effect expressions after TypeScript has been injected.\n(yield_expression\n \"*\" @keyword.operator.yield.star.ser) @keyword.control.yield.ser\n\n; Highlight bare SER declaration tags such as {const value = yield* load()}.\n((expression) @meta.embedded.declaration.ser\n (#match? @meta.embedded.declaration.ser \"^\\\\s*(const|let)\\\\s\"))\n`,\n injections_query: String.raw`\n; Treat <script lang=\"ts\" effect> as TypeScript just like stock Svelte script tags.\n((script_element\n (start_tag\n (attribute\n (attribute_name) @_lang_name\n (quoted_attribute_value\n (attribute_value) @_lang_value))\n (attribute\n (attribute_name) @_effect_name))\n (raw_text) @injection.content)\n (#eq? @_lang_name \"lang\")\n (#any-of? @_lang_value \"ts\" \"typescript\")\n (#eq? @_effect_name \"effect\")\n (#set! injection.language \"typescript\"))\n\n; Inject TypeScript into SER markup expressions that stock queries may not see.\n((expression) @injection.content\n (#match? @injection.content \"^\\\\s*(yield\\\\s*\\\\*|(const|let)\\\\s|[#@:](each|await|if|key|else\\\\s+if|render|html|debug|const)\\\\b)\")\n (#set! injection.language \"typescript\"))\n`,\n};\n"],"mappings":";AAiGA,MAAM,oBAAqC,EACzC,MAAM,4CACR;AAEA,MAAM,kBAAmC,EACvC,MAAM,0CACR;AAEA,MAAM,wBAAyC,EAC7C,MAAM,wCACR;AAEA,MAAM,sBAAkD,CACtD,EAAE,SAAS,kBAAkB,GAC7B,EAAE,SAAS,YAAY,CACzB;;;;;;;AAQA,MAAa,oBAAkD;CAC7D,MAAM;CACN,aAAa;CACb,WAAW;CACX,mBAAmB;CACnB,UAAU,CAAC,eAAe;CAC1B,eAAe,CAAC,YAAY;CAC5B,UAAU;EACR,EAAE,SAAS,+BAA+B;EAC1C,EAAE,SAAS,uBAAuB;EAClC,EAAE,SAAS,uBAAuB;EAClC,EAAE,SAAS,uBAAuB;EAClC,EAAE,SAAS,yBAAyB;EACpC,EAAE,SAAS,4BAA4B;EACvC,EAAE,SAAS,uBAAuB;EAClC,EAAE,SAAS,wBAAwB;EACnC,EAAE,SAAS,kBAAkB;CAC/B;CACA,YAAY;EACV,+BAA+B;GAC7B,OAAO;GACP,UAAU,EACR,KAAK,EAAE,MAAM,qCAAqC,EACpD;EACF;EAEA,kBAAkB;GAChB,OAAO;GACP,MAAM;GACN,UAAU,EACR,KAAK,EAAE,MAAM,yCAAyC,EACxD;EACF;EAEA,wBAAwB;GACtB,OAAO;GACP,eAAe,EACb,KAAK,kBACP;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;EAEA,uBAAuB;GACrB,OAAO;GACP,eAAe,EACb,KAAK,kBACP;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU,CACR;IACE,OAAO;IACP,MAAM;GACR,GACA,GAAG,mBACL;EACF;EAEA,uBAAuB;GACrB,OAAO;GACP,eAAe;IACb,KAAK;IACL,KAAK;IACL,KAAK,EAAE,MAAM,sCAAsC;GACrD;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;EAEA,uBAAuB;GACrB,OAAO;GACP,eAAe;IACb,KAAK;IACL,KAAK;IACL,KAAK,EAAE,MAAM,mCAAmC;GAClD;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;EAEA,yBAAyB;GACvB,OAAO;GACP,eAAe;IACb,KAAK;IACL,KAAK;IACL,KAAK,EAAE,MAAM,yCAAyC;GACxD;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;EAEA,4BAA4B;GAC1B,OAAO;GACP,eAAe;IACb,KAAK;IACL,KAAK;IACL,KAAK,EAAE,MAAM,uCAAuC;GACtD;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;EAEA,uBAAuB;GACrB,OACE;GACF,eAAe;IACb,KAAK,EAAE,MAAM,+CAA+C;IAC5D,KAAK;GACP;GACA,KAAK;GACL,aAAa,EACX,KAAK,gBACP;GACA,MAAM;GACN,UAAU;EACZ;CACF;AACF;;;;;;AAOA,MAAa,WAAkC;CAC7C,UAAU;CACV,YAAY,kBAAkB;CAC9B,mBAAmB;CACnB,oBAAoB,kBAAkB;AACxC;;;;;;;;AC3PA,MAAa,cAAqC;CAChD,MAAM;CACN,kBAAkB,OAAO,GAAG;;;;;;;;;;;;;;;;CAgB5B,kBAAkB,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;AAqB9B"}