svelte-effect-runtime 2.6.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dist/chunks/{client-Cj2X9lY-.js → client-Cruhk6Oo.js} +12 -5
- package/.dist/chunks/client-Cruhk6Oo.js.map +1 -0
- package/.dist/chunks/{dispatcher-BVkm8qbG.js → dispatcher-CgCdn6bj.js} +12 -2
- package/.dist/chunks/{dispatcher-BVkm8qbG.js.map → dispatcher-CgCdn6bj.js.map} +1 -1
- package/.dist/chunks/dispatcher-FCsx1Hlh.js +22 -0
- package/.dist/chunks/dispatcher-FCsx1Hlh.js.map +1 -0
- package/.dist/chunks/runtime-Sl685BVb.js +79 -0
- package/.dist/chunks/runtime-Sl685BVb.js.map +1 -0
- package/.dist/chunks/{transform-PXwkylXd.js → transform-CebZMD6u.js} +14 -9
- package/.dist/chunks/transform-CebZMD6u.js.map +1 -0
- package/.dist/dispatcher.js +1 -1
- package/.dist/error.d.ts +1 -1
- package/.dist/generated/dispatcher.d.ts +13 -0
- package/.dist/generators.d.ts +4 -4
- package/.dist/internal/generators.d.ts +1 -1
- package/.dist/internal/generators.js +1 -1
- package/.dist/internal/remote-client.js +1 -1
- package/.dist/markup/promise.d.ts +1 -1
- package/.dist/markup/promise.js +2 -2
- package/.dist/markup/promise.js.map +1 -1
- package/.dist/markup/run.d.ts +1 -1
- package/.dist/markup/run.js +2 -2
- package/.dist/markup/run.js.map +1 -1
- package/.dist/markup/transform/types.d.ts +1 -1
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.d.ts +1 -1
- package/.dist/markup/value.js +2 -2
- package/.dist/markup/value.js.map +1 -1
- package/.dist/mod.d.ts +1 -40
- package/.dist/mod.js +2 -27
- package/.dist/mod.js.map +1 -1
- package/.dist/remote/client.js +1 -1
- package/.dist/remote/server.js +5 -1
- package/.dist/remote/server.js.map +1 -1
- package/.dist/runtime/transform.d.ts +3 -1
- package/.dist/{chunks/preprocess-D84Ngmby.js → runtime/transform.js} +62 -8
- package/.dist/runtime/transform.js.map +1 -0
- package/.dist/{preprocess → script-transform}/imports.d.ts +1 -1
- package/.dist/{preprocess → script-transform}/types.d.ts +2 -2
- package/.dist/server/factories.d.ts +5 -1
- package/.dist/server/index.d.ts +1 -1
- package/.dist/server/runtime.d.ts +14 -0
- package/.dist/server/types.d.ts +44 -1
- package/.dist/server.d.ts +1 -1
- package/.dist/server.js +2 -56
- package/.dist/server.js.map +1 -1
- package/.dist/vite.js +9 -13
- package/.dist/vite.js.map +1 -1
- package/package.json +4 -4
- package/.dist/chunks/client-Cj2X9lY-.js.map +0 -1
- package/.dist/chunks/preprocess-D84Ngmby.js.map +0 -1
- package/.dist/chunks/transform-CHAnW68p.js +0 -72
- package/.dist/chunks/transform-CHAnW68p.js.map +0 -1
- package/.dist/chunks/transform-PXwkylXd.js.map +0 -1
- package/.dist/preprocess.d.ts +0 -2
- package/.dist/preprocess.js +0 -3
- package/.dist/runtime/preprocess.d.ts +0 -39
- package/.dist/runtime/preprocess.js +0 -31
- package/.dist/runtime/preprocess.js.map +0 -1
- /package/.dist/{preprocess → script-transform}/ast.d.ts +0 -0
- /package/.dist/{preprocess → script-transform}/index.d.ts +0 -0
- /package/.dist/{preprocess → script-transform}/lower.d.ts +0 -0
- /package/.dist/{preprocess → script-transform}/runes.d.ts +0 -0
- /package/.dist/{preprocess → script-transform}/runtime-block.d.ts +0 -0
- /package/.dist/{preprocess → script-transform}/source.d.ts +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as get_dispatcher } from "./dispatcher-
|
|
1
|
+
import { n as get_dispatcher } from "./dispatcher-CgCdn6bj.js";
|
|
2
2
|
import { create_remote_http_error, create_remote_transport_error, create_remote_validation_error, is_serialized_remote_failure_envelope } from "../remote/shared.js";
|
|
3
3
|
import { t as copy_property_descriptors } from "./descriptors-OS4VfJuW.js";
|
|
4
4
|
import { Effect } from "effect";
|
|
@@ -141,10 +141,16 @@ async function decode_response_failure(response) {
|
|
|
141
141
|
async function decode_response_or_value(value, decode_payload) {
|
|
142
142
|
if (value instanceof Response) {
|
|
143
143
|
if (!value.ok) throw await decode_response_failure(value);
|
|
144
|
-
return decode_payload(await value
|
|
144
|
+
return decode_payload(await decode_success_response_body(value));
|
|
145
145
|
}
|
|
146
146
|
return decode_payload(value);
|
|
147
147
|
}
|
|
148
|
+
async function decode_success_response_body(response) {
|
|
149
|
+
if (response.status === 204 || response.status === 205) return;
|
|
150
|
+
const text = await response.text();
|
|
151
|
+
if (text.length === 0) return;
|
|
152
|
+
return JSON.parse(text);
|
|
153
|
+
}
|
|
148
154
|
//#endregion
|
|
149
155
|
//#region src/remote/client/effect.ts
|
|
150
156
|
/**
|
|
@@ -302,8 +308,9 @@ function decode_form_response(envelope, decode_payload) {
|
|
|
302
308
|
if (is_decoded_remote_failure(decoded)) throw decoded;
|
|
303
309
|
throw create_remote_http_error(response.status ?? 500, response.error);
|
|
304
310
|
}
|
|
305
|
-
|
|
306
|
-
|
|
311
|
+
const result_text = typeof response.result === "string" ? response.result : typeof response.data === "string" ? response.data : void 0;
|
|
312
|
+
if (response.type !== "result" || result_text === void 0) throw create_remote_transport_error(/* @__PURE__ */ new Error("[REMOTE_FORM_RESPONSE_UNSUPPORTED]: Unsupported remote form response"), envelope);
|
|
313
|
+
const decoded = decode_payload(parse(result_text));
|
|
307
314
|
if (decoded.issues && decoded.issues.length > 0) throw create_remote_validation_error(decoded.issues, decoded, 400);
|
|
308
315
|
return decoded.result;
|
|
309
316
|
}
|
|
@@ -568,4 +575,4 @@ function make_live_query_resource(resource) {
|
|
|
568
575
|
//#endregion
|
|
569
576
|
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 };
|
|
570
577
|
|
|
571
|
-
//# sourceMappingURL=client-
|
|
578
|
+
//# sourceMappingURL=client-Cruhk6Oo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-Cruhk6Oo.js","names":[],"sources":["../../../modules/svelte-effect-runtime/src/remote/client/failures.ts","../../../modules/svelte-effect-runtime/src/remote/client/responses.ts","../../../modules/svelte-effect-runtime/src/remote/client/effect.ts","../../../modules/svelte-effect-runtime/src/remote/client/utils.ts","../../../modules/svelte-effect-runtime/src/remote/client/command.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-data.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-transport.ts","../../../modules/svelte-effect-runtime/src/remote/client/form-enhance.ts","../../../modules/svelte-effect-runtime/src/remote/client/form.ts","../../../modules/svelte-effect-runtime/src/remote/client/query-result.ts","../../../modules/svelte-effect-runtime/src/remote/client/query.ts"],"sourcesContent":["import {\n create_remote_http_error,\n create_remote_transport_error,\n create_remote_validation_error,\n is_serialized_remote_failure_envelope,\n} from \"$/remote/shared.ts\";\nimport type { FormIssue, RemoteFailure } from \"$/remote/shared.ts\";\nimport { parse } from \"devalue\";\n\n/**\n * Decodes a raw wire value into a remote failure when it uses the runtime\n * failure envelope.\n *\n * @example\n * ```ts\n * const failure = decode_remote_error(body);\n * ```\n *\n * @since 2.0.0\n * @param raw - Raw value received from the network or SvelteKit error body.\n * @param decode - Optional devalue decoder for custom error payloads.\n * @returns The decoded failure/value, or a transport error when decoding fails.\n */\nexport function decode_remote_error<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 Error(\n \"[REMOTE_ERROR_DECODE_FAILED]: Failed to decode remote error payload\",\n ),\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 * Checks whether a response body represents SvelteKit validation issues.\n *\n * @example\n * ```ts\n * if (is_validation_body(body)) return body.issues;\n * ```\n *\n * @since 2.0.0\n * @param value - Value to inspect.\n * @returns Whether the value contains a form issue list.\n */\nexport function is_validation_body(\n value: unknown,\n): value is { issues: readonly FormIssue[] } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Array.isArray((value as { issues?: unknown }).issues)\n );\n}\n\n/**\n * Normalizes native thrown values into the runtime's remote failure model.\n *\n * @example\n * ```ts\n * const failure = normalize_native_error(error);\n * ```\n *\n * @since 2.0.0\n * @param error - Unknown value thrown by a native remote helper.\n * @returns A typed remote failure.\n */\nexport function normalize_native_error<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 === 400 && is_validation_body(body)) {\n return create_remote_validation_error(body.issues, body, status);\n }\n\n if (status !== undefined) {\n return create_remote_http_error(status, body, error);\n }\n\n return create_remote_transport_error(error);\n}\n\nfunction get_error_status(error: unknown): number | undefined {\n if (typeof error !== \"object\" || error === null) {\n return undefined;\n }\n\n const status = (error as { status?: unknown }).status;\n\n return typeof status === \"number\" ? status : undefined;\n}\n\nfunction get_error_body(error: unknown): unknown {\n if (typeof error !== \"object\" || error === null) {\n return undefined;\n }\n\n if (\"body\" in error) {\n return (error as { body?: unknown }).body;\n }\n\n if (\"data\" in error) {\n return (error as { data?: unknown }).data;\n }\n\n return undefined;\n}\n","import {\n create_remote_http_error,\n create_remote_validation_error,\n} from \"$/remote/shared.ts\";\nimport type { RemoteFailure } from \"$/remote/shared.ts\";\n\nimport {\n decode_remote_error,\n is_decoded_remote_failure,\n is_validation_body,\n} from \"./failures.ts\";\n\n/**\n * Decodes a failed fetch response into the runtime failure model.\n *\n * @example\n * ```ts\n * const failure = await decode_response_failure(response);\n * ```\n *\n * @since 2.0.0\n * @param response - Failed fetch response returned by the remote endpoint.\n * @returns Remote failure represented by the response.\n */\nexport async function decode_response_failure<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 if (response.status === 400 && is_validation_body(body)) {\n return create_remote_validation_error(body.issues, body, response.status);\n }\n\n return create_remote_http_error(response.status, body);\n}\n\n/**\n * Decodes either a raw value or `Response` returned by a native remote helper.\n *\n * @example\n * ```ts\n * const output = await decode_response_or_value(result, decode_payload);\n * ```\n *\n * @since 2.0.0\n * @param value - Native result value or fetch response.\n * @param decode_payload - Function used to decode successful payloads.\n * @returns Decoded successful output.\n */\nexport async function decode_response_or_value<Output, 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 { 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 Error(\n \"[INVALID_COMMAND_FACTORY]: Invalid command factory: expected a function\",\n );\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 type { FormIssue } from \"$/remote/shared.ts\";\nimport { parse } from \"devalue\";\n\nimport { decode_remote_error, is_decoded_remote_failure } from \"./failures.ts\";\nimport { decode_response_failure } from \"./responses.ts\";\nimport { to_form_data } from \"./form-data.ts\";\nimport type { NativeFormRecord } from \"./types.ts\";\n\n/**\n * Submits a native remote form through the SvelteKit remote endpoint.\n *\n * @since 2.0.0\n * @param form_obj - Native form object being adapted.\n * @param input - Form input value.\n * @param decode_payload - Function to decode successful payloads.\n * @param remote_base - Base URL for the remote endpoint.\n * @returns Decoded form output.\n */\nexport async function submit_remote_form<Output>(\n form_obj: NativeFormRecord,\n input: unknown,\n decode_payload: (value: unknown) => unknown,\n remote_base: string,\n): Promise<Output> {\n const action_id = get_remote_action_id(form_obj);\n\n if (!action_id || remote_base.length === 0) {\n throw create_remote_transport_error(\n new Error(\n \"[REMOTE_FORM_ENDPOINT_MISSING]: Form has no submit method or remote endpoint\",\n ),\n );\n }\n\n const response = await fetch(to_remote_form_url(remote_base, action_id), {\n method: \"POST\",\n body: to_form_data(input),\n });\n\n if (!response.ok) {\n throw await decode_response_failure(response);\n }\n\n const envelope = await response.json();\n\n return decode_form_response<Output>(envelope, decode_payload);\n}\n\n/**\n * Extracts SvelteKit's remote action id from a native form action URL.\n *\n * @since 2.0.0\n * @param form_obj - Native form object being adapted.\n * @returns Remote action id when present.\n */\nexport function get_remote_action_id(\n form_obj: NativeFormRecord,\n): string | undefined {\n const action = form_obj.action;\n\n if (typeof action !== \"string\") {\n return undefined;\n }\n\n const fallback = \"http://localhost/\";\n const href = typeof location === \"undefined\" ? fallback : location.href;\n const url = new URL(action, href);\n\n return url.searchParams.get(\"/remote\") ??\n url.searchParams.get(\"remote\") ??\n undefined;\n}\n\nfunction to_remote_form_url(remote_base: string, action_id: string): string {\n const parts = action_id.split(\"/\");\n const head = parts.slice(0, 2).join(\"/\");\n const tail = parts.slice(2).join(\"/\");\n const normalized_base = remote_base.replace(/\\/$/, \"\");\n\n if (tail.length === 0) {\n return `${normalized_base}/${head}`;\n }\n\n return `${normalized_base}/${head}/${encodeURIComponent(tail)}`;\n}\n\nfunction decode_form_response<Output>(\n envelope: unknown,\n decode_payload: (value: unknown) => unknown,\n): Output {\n if (\n typeof envelope !== \"object\" ||\n envelope === null ||\n !(\"type\" in envelope)\n ) {\n throw create_remote_transport_error(\n new Error(\n \"[REMOTE_FORM_RESPONSE_INVALID]: Invalid remote form response\",\n ),\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 Error(\n \"[REMOTE_FORM_RESPONSE_UNSUPPORTED]: Unsupported remote form response\",\n ),\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 { 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 Error(\n \"[INVALID_QUERY_FACTORY]: Invalid query factory: expected a function\",\n );\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 Error(\n \"[INVALID_LIVE_QUERY_FACTORY]: Invalid live query factory: expected a function\",\n );\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":"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"}
|
|
@@ -251,7 +251,12 @@ var Dispatcher = class Dispatcher {
|
|
|
251
251
|
*/
|
|
252
252
|
run(effect) {
|
|
253
253
|
if (this.#disposed) return Promise.reject(/* @__PURE__ */ new Error("[DISPATCHER_DISPOSED]: Dispatcher has been disposed"));
|
|
254
|
-
|
|
254
|
+
const exit_effect = Effect.exit(effect);
|
|
255
|
+
return this.#runtime.runPromise(exit_effect).then((exit) => {
|
|
256
|
+
const result = exit;
|
|
257
|
+
if (Exit.isSuccess(result)) return result.value;
|
|
258
|
+
if (Cause.hasInterruptsOnly(result.cause)) return;
|
|
259
|
+
const error = Cause.squash(result.cause);
|
|
255
260
|
queueMicrotask(() => {
|
|
256
261
|
throw error;
|
|
257
262
|
});
|
|
@@ -276,6 +281,11 @@ var Dispatcher = class Dispatcher {
|
|
|
276
281
|
this.#values.clear();
|
|
277
282
|
this.#value_ids.clear();
|
|
278
283
|
this.#promise_ids.clear();
|
|
284
|
+
this.#runtime.dispose().catch((error) => {
|
|
285
|
+
queueMicrotask(() => {
|
|
286
|
+
throw error;
|
|
287
|
+
});
|
|
288
|
+
});
|
|
279
289
|
}
|
|
280
290
|
#make_value_cache_key(id, deps) {
|
|
281
291
|
return `value:${id}::${hash_deps(deps)}`;
|
|
@@ -356,4 +366,4 @@ function reset_dispatcher() {
|
|
|
356
366
|
//#endregion
|
|
357
367
|
export { get_dispatcher as n, reset_dispatcher as r, Dispatcher as t };
|
|
358
368
|
|
|
359
|
-
//# sourceMappingURL=dispatcher-
|
|
369
|
+
//# sourceMappingURL=dispatcher-CgCdn6bj.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatcher-BVkm8qbG.js","names":["#runtime","#disposed","#next_fiber_id","#fibers","#make_value_cache_key","#value_ids","#interrupt_cached_fiber","#should_start_value_fiber","#start_value_fiber","#values","#make_promise_cache_key","#promise_ids","#start_promise_fiber"],"sources":["../../../modules/svelte-effect-runtime/src/dispatcher/fibers.ts","../../../modules/svelte-effect-runtime/src/dispatcher/deps.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}\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 { runtime, fiber, on_complete, on_success } = options;\n\n runtime.runFork(\n Effect.flatMap(Fiber.await(fiber), (exit) =>\n Effect.sync(() => {\n on_complete?.();\n\n if (Exit.isSuccess(exit)) {\n on_success?.(exit.value as A);\n\n return;\n }\n\n if (!Cause.hasInterruptsOnly(exit.cause)) {\n queueMicrotask(() => {\n throw Cause.squash(exit.cause);\n });\n }\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 { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from \"effect\";\nimport type { Fiber as FiberType } from \"effect/Fiber\";\nimport type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\n\nimport { interrupt_fiber, watch_fiber_exit } from \"./fibers.ts\";\nimport { hash_deps } from \"./deps.ts\";\nimport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\n\nexport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\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 /** Resolved values and pending promises keyed by cache id. */\n #values = new Map<string, 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 * 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 const cache_key = this.#make_value_cache_key(options.id, options.deps);\n const old_key = this.#value_ids.get(options.id);\n\n if (old_key !== undefined && old_key !== cache_key) {\n this.#interrupt_cached_fiber(old_key);\n }\n\n this.#value_ids.set(options.id, cache_key);\n\n if (this.#should_start_value_fiber(cache_key)) {\n this.#start_value_fiber(cache_key, options);\n }\n\n if (this.#values.has(cache_key)) {\n return this.#values.get(cache_key) as A;\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(\n new Error(\"[DISPATCHER_DISPOSED]: Dispatcher has been disposed\"),\n );\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.#values.delete(old_key);\n }\n\n this.#promise_ids.set(options.id, cache_key);\n\n const existing = this.#values.get(cache_key);\n\n if (existing instanceof Promise) {\n return existing as Promise<A>;\n }\n\n const promise = this.#start_promise_fiber(cache_key, options);\n\n this.#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(\n new Error(\"[DISPATCHER_DISPOSED]: Dispatcher has been disposed\"),\n );\n }\n\n return this.#runtime\n .runPromise(effect as Effect.Effect<unknown, unknown, unknown>)\n .catch((error: unknown) => {\n queueMicrotask(() => {\n throw error;\n });\n\n throw error;\n }) as Promise<A>;\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.#values.clear();\n this.#value_ids.clear();\n this.#promise_ids.clear();\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 #interrupt_cached_fiber(cache_key: string): void {\n const old_fiber = this.#fibers.get(cache_key);\n\n if (!old_fiber) {\n return;\n }\n\n interrupt_fiber(this.#runtime, old_fiber);\n this.#fibers.delete(cache_key);\n }\n\n #should_start_value_fiber(cache_key: string): boolean {\n return (\n !this.#disposed &&\n !this.#fibers.has(cache_key) &&\n !this.#values.has(cache_key)\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 watch_fiber_exit({\n runtime: this.#runtime,\n fiber,\n on_complete: () => this.#fibers.delete(cache_key),\n on_success: (value) => this.#values.set(cache_key, value),\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 this.#fibers.delete(cache_key);\n this.#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 if (Exit.isSuccess(exit)) {\n return exit.value as A;\n }\n\n throw Cause.squash(exit.cause);\n })),\n );\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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"}
|
|
1
|
+
{"version":3,"file":"dispatcher-CgCdn6bj.js","names":["#runtime","#disposed","#next_fiber_id","#fibers","#make_value_cache_key","#value_ids","#interrupt_cached_fiber","#should_start_value_fiber","#start_value_fiber","#values","#make_promise_cache_key","#promise_ids","#start_promise_fiber"],"sources":["../../../modules/svelte-effect-runtime/src/dispatcher/fibers.ts","../../../modules/svelte-effect-runtime/src/dispatcher/deps.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}\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 { runtime, fiber, on_complete, on_success } = options;\n\n runtime.runFork(\n Effect.flatMap(Fiber.await(fiber), (exit) =>\n Effect.sync(() => {\n on_complete?.();\n\n if (Exit.isSuccess(exit)) {\n on_success?.(exit.value as A);\n\n return;\n }\n\n if (!Cause.hasInterruptsOnly(exit.cause)) {\n queueMicrotask(() => {\n throw Cause.squash(exit.cause);\n });\n }\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 { Cause, Effect, Exit, Fiber, Layer, ManagedRuntime } from \"effect\";\nimport type { Fiber as FiberType } from \"effect/Fiber\";\nimport type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\n\nimport { interrupt_fiber, watch_fiber_exit } from \"./fibers.ts\";\nimport { hash_deps } from \"./deps.ts\";\nimport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\n\nexport type { Dispose, PromiseOptions, ValueOptions } from \"./types.ts\";\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 /** Resolved values and pending promises keyed by cache id. */\n #values = new Map<string, 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 * 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 const cache_key = this.#make_value_cache_key(options.id, options.deps);\n const old_key = this.#value_ids.get(options.id);\n\n if (old_key !== undefined && old_key !== cache_key) {\n this.#interrupt_cached_fiber(old_key);\n }\n\n this.#value_ids.set(options.id, cache_key);\n\n if (this.#should_start_value_fiber(cache_key)) {\n this.#start_value_fiber(cache_key, options);\n }\n\n if (this.#values.has(cache_key)) {\n return this.#values.get(cache_key) as A;\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(\n new Error(\"[DISPATCHER_DISPOSED]: Dispatcher has been disposed\"),\n );\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.#values.delete(old_key);\n }\n\n this.#promise_ids.set(options.id, cache_key);\n\n const existing = this.#values.get(cache_key);\n\n if (existing instanceof Promise) {\n return existing as Promise<A>;\n }\n\n const promise = this.#start_promise_fiber(cache_key, options);\n\n this.#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(\n new Error(\"[DISPATCHER_DISPOSED]: Dispatcher has been disposed\"),\n );\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 /**\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.#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 #interrupt_cached_fiber(cache_key: string): void {\n const old_fiber = this.#fibers.get(cache_key);\n\n if (!old_fiber) {\n return;\n }\n\n interrupt_fiber(this.#runtime, old_fiber);\n this.#fibers.delete(cache_key);\n }\n\n #should_start_value_fiber(cache_key: string): boolean {\n return (\n !this.#disposed &&\n !this.#fibers.has(cache_key) &&\n !this.#values.has(cache_key)\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 watch_fiber_exit({\n runtime: this.#runtime,\n fiber,\n on_complete: () => this.#fibers.delete(cache_key),\n on_success: (value) => this.#values.set(cache_key, value),\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 this.#fibers.delete(cache_key);\n this.#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 if (Exit.isSuccess(exit)) {\n return exit.value as A;\n }\n\n throw Cause.squash(exit.cause);\n })),\n );\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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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { n as get_dispatcher$1 } from "./dispatcher-CgCdn6bj.js";
|
|
2
|
+
import { r as get_server_dispatcher } from "./runtime-Sl685BVb.js";
|
|
3
|
+
//#region src/generated/dispatcher.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns the dispatcher appropriate for generated component code.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const dispatcher = get_dispatcher();
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* @since 3.0.1
|
|
13
|
+
* @returns The server dispatcher during SSR, otherwise the client dispatcher.
|
|
14
|
+
*/
|
|
15
|
+
function get_dispatcher() {
|
|
16
|
+
if (typeof document === "undefined") return get_server_dispatcher();
|
|
17
|
+
return get_dispatcher$1();
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { get_dispatcher as t };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=dispatcher-FCsx1Hlh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher-FCsx1Hlh.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 { Dispatcher } from \"$/dispatcher.ts\";\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(): Dispatcher {\n if (typeof document === \"undefined\") {\n return get_server_dispatcher();\n }\n\n return get_client_dispatcher();\n}\n"],"mappings":";;;;;;;;;;;;;;AAeA,SAAgB,iBAA6B;CAC3C,IAAI,OAAO,aAAa,aACtB,OAAO,sBAAsB;CAG/B,OAAOA,iBAAsB;AAC/B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { t as Dispatcher } from "./dispatcher-CgCdn6bj.js";
|
|
2
|
+
import { Context, Layer, ManagedRuntime } from "effect";
|
|
3
|
+
//#region src/server/runtime.ts
|
|
4
|
+
/**
|
|
5
|
+
* SvelteKit's `RequestEvent` exposed as an Effect {@link Context.Tag}.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const event = yield* RequestEvent;
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* @since 2.0.0
|
|
13
|
+
*/
|
|
14
|
+
const RequestEvent = Context.Reference("@ser/RequestEvent", { defaultValue: () => {
|
|
15
|
+
throw new Error("[REQUEST_EVENT_UNAVAILABLE]: RequestEvent is only available during a remote call");
|
|
16
|
+
} });
|
|
17
|
+
/**
|
|
18
|
+
* Builder for the server-side Effect runtime.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* ServerRuntime.make(Db.Live);
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @since 2.0.0
|
|
26
|
+
*/
|
|
27
|
+
var ServerRuntime = class {
|
|
28
|
+
/**
|
|
29
|
+
* Build and cache the server-side `ManagedRuntime`.
|
|
30
|
+
*
|
|
31
|
+
* @since 2.0.0
|
|
32
|
+
* @param layer - Optional Effect layer to provide to the runtime.
|
|
33
|
+
* @returns The configured ManagedRuntime.
|
|
34
|
+
*/
|
|
35
|
+
static make(layer) {
|
|
36
|
+
const runtime = ManagedRuntime.make(layer ?? Layer.empty);
|
|
37
|
+
current_server_runtime = runtime;
|
|
38
|
+
current_server_dispatcher?.dispose();
|
|
39
|
+
current_server_dispatcher = new Dispatcher(runtime);
|
|
40
|
+
return runtime;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
let current_server_runtime;
|
|
44
|
+
let current_server_dispatcher;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the active server runtime, creating a default one if needed.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* const runtime = get_server_runtime_or_throw();
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @since 2.0.0
|
|
54
|
+
* @returns The current ManagedRuntime instance.
|
|
55
|
+
*/
|
|
56
|
+
function get_server_runtime_or_throw() {
|
|
57
|
+
if (!current_server_runtime) current_server_runtime = ManagedRuntime.make(Layer.empty);
|
|
58
|
+
return current_server_runtime;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns a dispatcher backed by the active server runtime.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const dispatcher = get_server_dispatcher();
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* @since 3.0.1
|
|
69
|
+
* @returns The cached server dispatcher, creating one from the current server
|
|
70
|
+
* runtime when needed.
|
|
71
|
+
*/
|
|
72
|
+
function get_server_dispatcher() {
|
|
73
|
+
current_server_dispatcher ??= new Dispatcher(get_server_runtime_or_throw());
|
|
74
|
+
return current_server_dispatcher;
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { get_server_runtime_or_throw as i, ServerRuntime as n, get_server_dispatcher as r, RequestEvent as t };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=runtime-Sl685BVb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-Sl685BVb.js","names":["InternalDispatcher"],"sources":["../../../modules/svelte-effect-runtime/src/server/runtime.ts"],"sourcesContent":["import type { RequestEvent as SvelteKitRequestEvent } from \"@sveltejs/kit\";\nimport { Context, Layer, ManagedRuntime } from \"effect\";\nimport { Dispatcher as InternalDispatcher } from \"$/dispatcher.ts\";\nimport type { ManagedRuntime as ManagedRuntimeType } from \"effect/ManagedRuntime\";\n\n/**\n * Subset of SvelteKit's `RequestEvent` that remote handlers typically access.\n *\n * @since 2.0.0\n */\nexport interface RequestEvent extends\n Pick<\n SvelteKitRequestEvent,\n | \"cookies\"\n | \"getClientAddress\"\n | \"locals\"\n | \"params\"\n | \"platform\"\n | \"request\"\n | \"route\"\n | \"url\"\n > {}\n\n/**\n * SvelteKit's `RequestEvent` exposed as an Effect {@link Context.Tag}.\n *\n * @example\n * ```ts\n * const event = yield* RequestEvent;\n * ```\n *\n * @since 2.0.0\n */\nexport const RequestEvent: Context.Reference<RequestEvent> = Context\n .Reference<RequestEvent>(\"@ser/RequestEvent\", {\n defaultValue: () => {\n throw new Error(\n \"[REQUEST_EVENT_UNAVAILABLE]: RequestEvent is only available during a remote call\",\n );\n },\n });\n\n/**\n * Builder for the server-side Effect runtime.\n *\n * @example\n * ```ts\n * ServerRuntime.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n */\nexport class ServerRuntime {\n /**\n * Build and cache the server-side `ManagedRuntime`.\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n * @returns The configured ManagedRuntime.\n */\n static make<R = never>(\n layer?: Layer.Layer<R>,\n ): ManagedRuntime.ManagedRuntime<R, never> {\n const runtime = ManagedRuntime.make(\n layer ?? (Layer.empty as unknown as Layer.Layer<R>),\n );\n\n current_server_runtime = runtime as ManagedRuntime.ManagedRuntime<\n unknown,\n never\n >;\n current_server_dispatcher?.dispose();\n current_server_dispatcher = new InternalDispatcher(\n runtime as unknown as ManagedRuntimeType<unknown, unknown>,\n );\n\n return runtime;\n }\n}\n\nlet current_server_runtime:\n | ManagedRuntime.ManagedRuntime<unknown, never>\n | undefined;\nlet current_server_dispatcher: InternalDispatcher | undefined;\n\n/**\n * Returns the active server runtime, creating a default one if needed.\n *\n * @example\n * ```ts\n * const runtime = get_server_runtime_or_throw();\n * ```\n *\n * @since 2.0.0\n * @returns The current ManagedRuntime instance.\n */\nexport function get_server_runtime_or_throw(): ManagedRuntime.ManagedRuntime<\n unknown,\n never\n> {\n if (!current_server_runtime) {\n current_server_runtime = ManagedRuntime.make(\n Layer.empty,\n ) as ManagedRuntime.ManagedRuntime<unknown, never>;\n }\n\n return current_server_runtime;\n}\n\n/**\n * Returns a dispatcher backed by the active server runtime.\n *\n * @example\n * ```ts\n * const dispatcher = get_server_dispatcher();\n * ```\n *\n * @since 3.0.1\n * @returns The cached server dispatcher, creating one from the current server\n * runtime when needed.\n */\nexport function get_server_dispatcher(): InternalDispatcher {\n current_server_dispatcher ??= new InternalDispatcher(\n get_server_runtime_or_throw() as unknown as ManagedRuntimeType<\n unknown,\n unknown\n >,\n );\n\n return current_server_dispatcher;\n}\n"],"mappings":";;;;;;;;;;;;;AAiCA,MAAa,eAAgD,QAC1D,UAAwB,qBAAqB,EAC5C,oBAAoB;CAClB,MAAM,IAAI,MACR,kFACF;AACF,EACF,CAAC;;;;;;;;;;;AAYH,IAAa,gBAAb,MAA2B;;;;;;;;CAQzB,OAAO,KACL,OACyC;EACzC,MAAM,UAAU,eAAe,KAC7B,SAAU,MAAM,KAClB;EAEA,yBAAyB;EAIzB,2BAA2B,QAAQ;EACnC,4BAA4B,IAAIA,WAC9B,OACF;EAEA,OAAO;CACT;AACF;AAEA,IAAI;AAGJ,IAAI;;;;;;;;;;;;AAaJ,SAAgB,8BAGd;CACA,IAAI,CAAC,wBACH,yBAAyB,eAAe,KACtC,MAAM,KACR;CAGF,OAAO;AACT;;;;;;;;;;;;;AAcA,SAAgB,wBAA4C;CAC1D,8BAA8B,IAAIA,WAChC,4BAA4B,CAI9B;CAEA,OAAO;AACT"}
|
|
@@ -2,9 +2,9 @@ import { contains_top_level_yield_star } from "../detect.js";
|
|
|
2
2
|
import { parse } from "svelte/compiler";
|
|
3
3
|
import MagicString from "magic-string";
|
|
4
4
|
import ts from "typescript";
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/script-transform/imports.ts
|
|
6
6
|
/**
|
|
7
|
-
* Builds the import statements injected by the script
|
|
7
|
+
* Builds the import statements injected by the script transform.
|
|
8
8
|
*
|
|
9
9
|
* @since 2.0.0
|
|
10
10
|
* @param has_effect_import - Whether the user already imports `Effect`.
|
|
@@ -113,12 +113,13 @@ function inject_helpers(magic, content, helpers = [], bindings = HELPERS) {
|
|
|
113
113
|
const import_helpers = unique_import_helpers(helpers);
|
|
114
114
|
const local_helpers = helpers.filter((helper) => !is_import_helper(helper));
|
|
115
115
|
const helper_segments = [
|
|
116
|
-
`import { value as ${bindings.value} } from "svelte-effect-runtime/internal/generators"
|
|
117
|
-
`import { promise as ${bindings.promise} } from "svelte-effect-runtime/internal/generators"
|
|
118
|
-
`import { run as ${bindings.run} } from "svelte-effect-runtime/internal/generators"
|
|
116
|
+
make_import_helper(content, `import { value as ${bindings.value} } from "svelte-effect-runtime/internal/generators";`),
|
|
117
|
+
make_import_helper(content, `import { promise as ${bindings.promise} } from "svelte-effect-runtime/internal/generators";`),
|
|
118
|
+
make_import_helper(content, `import { run as ${bindings.run} } from "svelte-effect-runtime/internal/generators";`),
|
|
119
119
|
...import_helpers,
|
|
120
120
|
...local_helpers
|
|
121
|
-
].map((helper) => typeof helper === "string" ? { text: helper } : helper);
|
|
121
|
+
].filter((helper) => helper !== void 0).map((helper) => typeof helper === "string" ? { text: helper } : helper);
|
|
122
|
+
if (helper_segments.length === 0) return;
|
|
122
123
|
const helper_block = helper_segments.map((segment) => segment.text).join("\n");
|
|
123
124
|
const script_tag = find_instance_script_tag(content);
|
|
124
125
|
if (script_tag) {
|
|
@@ -180,6 +181,10 @@ function create_relocations(replacements, helper_insertion) {
|
|
|
180
181
|
})) ?? [];
|
|
181
182
|
return [...replacement_relocations, ...helper_relocations];
|
|
182
183
|
}
|
|
184
|
+
function make_import_helper(content, import_text) {
|
|
185
|
+
if (content.includes(import_text)) return;
|
|
186
|
+
return import_text;
|
|
187
|
+
}
|
|
183
188
|
function make_insertion_relocations(segments, prefix) {
|
|
184
189
|
const relocations = [];
|
|
185
190
|
let offset = prefix.length;
|
|
@@ -541,7 +546,7 @@ function make_error_message(code, message) {
|
|
|
541
546
|
return `[${code}]: ${message}`;
|
|
542
547
|
}
|
|
543
548
|
/**
|
|
544
|
-
* Base error class for all
|
|
549
|
+
* Base error class for all transform errors emitted during script and
|
|
545
550
|
* markup transformation. Carries the source filename so error messages can
|
|
546
551
|
* reference the affected file.
|
|
547
552
|
*
|
|
@@ -1251,7 +1256,7 @@ function make_relocation(candidate, replacement_text, inner) {
|
|
|
1251
1256
|
};
|
|
1252
1257
|
}
|
|
1253
1258
|
//#endregion
|
|
1254
|
-
//#region src/
|
|
1259
|
+
//#region src/script-transform/ast.ts
|
|
1255
1260
|
/**
|
|
1256
1261
|
* Checks whether a node is a `yield*` binary expression.
|
|
1257
1262
|
*
|
|
@@ -1676,4 +1681,4 @@ function transform_markup_effect(content, filename) {
|
|
|
1676
1681
|
//#endregion
|
|
1677
1682
|
export { find_yield_star_node as a, AsyncEffectInSyncRuneError as c, collect_top_level_binding_names as d, has_local_import_binding as f, extract_binding_names as i, AwaitInEffectWorkError as l, collect_yield_star_nodes as n, is_yield_star_expression as o, make_imports as p, contains_top_level_await as r, collect_free_identifiers as s, transform_markup_effect as t, PreprocessError as u };
|
|
1678
1683
|
|
|
1679
|
-
//# sourceMappingURL=transform-
|
|
1684
|
+
//# sourceMappingURL=transform-CebZMD6u.js.map
|