svelte-effect-runtime 1.4.0 → 1.5.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.
- package/dist/chunks/{effect-CL8GJs8A.js → effect-Cx8OzrcW.js} +3 -3
- package/dist/chunks/{effect-CL8GJs8A.js.map → effect-Cx8OzrcW.js.map} +1 -1
- package/dist/chunks/effect-compat-BhW0YPIs.js.map +1 -1
- package/dist/chunks/{markup-BpSHnnYD.js → markup-BMn2sQOB.js} +3 -1
- package/dist/chunks/{markup-BpSHnnYD.js.map → markup-BMn2sQOB.js.map} +1 -1
- package/dist/chunks/{preprocess-CtLrnJcK.js → preprocess-CGKEA3Py.js} +13 -8
- package/dist/chunks/preprocess-CGKEA3Py.js.map +1 -0
- package/dist/chunks/{server-7YVuxUNk.js → server-Dea1CJuY.js} +33 -3
- package/dist/chunks/server-Dea1CJuY.js.map +1 -0
- package/dist/chunks/{vite-DqjXRZd4.js → vite-C8ujN78r.js} +14 -5
- package/dist/chunks/vite-C8ujN78r.js.map +1 -0
- package/dist/effect.js +1 -1
- package/dist/internal/markup.js +1 -1
- package/dist/internal/remote-client.d.ts +1 -1
- package/dist/internal/remote-client.js +81 -62
- package/dist/internal/remote-client.js.map +1 -1
- package/dist/internal/transform.js +1 -1
- package/dist/internal/transform.js.map +1 -1
- package/dist/language-server.js +1 -1
- package/dist/preprocess.js +1 -1
- package/dist/root-node.js +2 -2
- package/dist/root-node.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/v4/effect.js +1 -1
- package/dist/v4/preprocess.js +1 -1
- package/dist/v4/server.js +1 -1
- package/dist/v4/vite.js +1 -1
- package/dist/vite.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/preprocess-CtLrnJcK.js.map +0 -1
- package/dist/chunks/server-7YVuxUNk.js.map +0 -1
- package/dist/chunks/vite-DqjXRZd4.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-client.js","names":[],"sources":["../../../modules/svelte-effect-runtime/internal/remote-client.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { tick } from \"svelte\";\nimport { create_remote_effect_from_promise } from \"$/client.ts\";\nimport { create_async_effect } from \"$internal/effect-compat.ts\";\nimport {\n create_remote_http_error,\n create_remote_transport_error,\n create_remote_validation_error,\n type FormIssue,\n is_remote_validation_issue,\n is_serialized_remote_failure_envelope,\n REMOTE_ERROR_DECODER,\n type RemoteFailure,\n} from \"$internal/remote-shared.ts\";\n\ntype AnyCallable = (...args: Array<unknown>) => unknown;\n\ntype Decode_remote_payload = <ErrorType = unknown>(\n encoded: string,\n) => ErrorType;\n\ninterface HttpErrorLike {\n readonly body?: unknown;\n readonly status?: number;\n}\n\ninterface RedirectLike {\n readonly location: string;\n readonly status: number;\n}\n\ninterface Remote_request_dependencies {\n readonly app?: {\n readonly decoders?: Record<string, unknown>;\n readonly hooks?: {\n readonly transport?: Record<string, unknown>;\n };\n };\n readonly app_dir: string;\n readonly apply_refreshes?: (value: string) => void;\n readonly base: string;\n readonly get_remote_request_headers: () => HeadersInit;\n readonly remote_request: (\n url: string,\n headers: HeadersInit,\n ) => Promise<string>;\n readonly stringify_remote_arg: (\n value: unknown,\n transport: unknown,\n sort?: boolean,\n ) => string;\n}\n\ntype Query_adapter_mode = \"query\" | \"query_batch\" | \"prerender\";\n\ntype Form_request_dependencies = Remote_request_dependencies & {\n readonly app: {\n readonly decoders?: Record<string, unknown>;\n readonly encoders?: Record<string, unknown>;\n };\n readonly app_dir: string;\n readonly apply_refreshes: (value: string) => void;\n readonly base: string;\n readonly binary_form_content_type: string;\n readonly goto: (url: string, options?: unknown, code?: number) => void;\n readonly invalidate_all: () => Promise<void> | void;\n readonly serialize_binary_form: (\n data: unknown,\n meta: Record<string, unknown>,\n ) => {\n readonly blob: Blob;\n };\n};\n\ninterface Attached_form_tracker {\n current: HTMLFormElement | null;\n}\n\nfunction is_development_environment(): boolean {\n const vite_environment = (\n import.meta as ImportMeta & {\n env?: {\n DEV?: boolean;\n };\n }\n ).env;\n\n if (typeof vite_environment?.DEV === \"boolean\") {\n return vite_environment.DEV;\n }\n\n const node_process = (globalThis as typeof globalThis & {\n process?: {\n env?: {\n DEV?: string;\n NODE_ENV?: string;\n SVELTE_EFFECT_RUNTIME_DEBUG?: string;\n };\n };\n }).process;\n\n return (\n node_process?.env?.SVELTE_EFFECT_RUNTIME_DEBUG === \"1\" ||\n node_process?.env?.DEV === \"1\" ||\n node_process?.env?.NODE_ENV === \"development\"\n );\n}\n\nconst ENABLE_REMOTE_CLIENT_DEBUG_LOGS = is_development_environment();\n\nfunction log_remote_client_step(\n step: string,\n details?: Record<string, unknown>,\n): void {\n if (!ENABLE_REMOTE_CLIENT_DEBUG_LOGS) {\n return;\n }\n\n console.log(\"[svelte-effect-runtime][remote-client]\", step, details ?? {});\n}\n\nfunction define_hidden_property<Value extends object, Property>(\n value: Value,\n key: string | symbol,\n property: Property,\n): Value {\n Object.defineProperty(value, key, {\n value: property,\n enumerable: false,\n });\n\n return value;\n}\n\nfunction define_remote_error_decoder<Value extends object>(\n value: Value,\n decode_payload: Decode_remote_payload,\n): Value {\n return define_hidden_property(value, REMOTE_ERROR_DECODER, decode_payload);\n}\n\nfunction is_http_error_like(value: unknown): value is HttpErrorLike {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { status?: unknown }).status === \"number\",\n );\n}\n\nfunction is_redirect_like(value: unknown): value is RedirectLike {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { location?: unknown }).location === \"string\" &&\n typeof (value as { status?: unknown }).status === \"number\",\n );\n}\n\nfunction get_error_status(value: unknown): number {\n return is_http_error_like(value) ? value.status ?? 500 : 500;\n}\n\nfunction decode_remote_error<ErrorType>(\n error: unknown,\n decode_payload: Decode_remote_payload,\n): RemoteFailure<ErrorType> {\n log_remote_client_step(\"decode_remote_error:start\", {\n error,\n });\n\n if (is_http_error_like(error)) {\n const body = error.body;\n\n if (is_serialized_remote_failure_envelope(body)) {\n try {\n return decode_payload<ErrorType>(\n body.encoded,\n ) as RemoteFailure<ErrorType>;\n } catch (cause) {\n return create_remote_transport_error(cause, body);\n }\n }\n\n if (get_error_status(error) === 400) {\n return create_remote_validation_error([], {\n body,\n status: 400,\n });\n }\n\n return create_remote_http_error(error, {\n body,\n status: get_error_status(error),\n });\n }\n\n const decoded = create_remote_http_error(error);\n log_remote_client_step(\"decode_remote_error:http_error\", {\n decoded,\n });\n return decoded;\n}\n\nfunction create_effect_call<Success, ErrorType>(\n create_promise: () => PromiseLike<Success>,\n decode_payload: Decode_remote_payload,\n): Effect.Effect<Success, RemoteFailure<ErrorType>, never> {\n return create_remote_effect_from_promise<Success, ErrorType>(\n () => {\n log_remote_client_step(\"create_effect_call:start\");\n return create_promise();\n },\n (error) => decode_remote_error<ErrorType>(error, decode_payload),\n );\n}\n\nfunction create_decoded_native_callable(\n native: AnyCallable,\n decode_payload: Decode_remote_payload,\n): AnyCallable {\n const wrapped = ((...args: Array<unknown>) => {\n const result = native(...args);\n\n if (\n result && (typeof result === \"object\" || typeof result === \"function\")\n ) {\n define_remote_error_decoder(result as object, decode_payload);\n }\n\n return result;\n }) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native);\n define_remote_error_decoder(wrapped as object, decode_payload);\n\n return wrapped;\n}\n\nfunction get_transport(\n dependencies?: Remote_request_dependencies,\n): Record<string, unknown> {\n return dependencies?.app?.hooks?.transport ?? {};\n}\n\nfunction stringify_remote_payload(\n arg: unknown,\n dependencies: Remote_request_dependencies,\n sort = true,\n): string {\n if (arg === undefined) {\n return \"\";\n }\n\n return dependencies.stringify_remote_arg(\n arg,\n get_transport(dependencies),\n sort,\n );\n}\n\nasync function execute_query_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${\n payload ? `?payload=${payload}` : \"\"\n }`;\n const encoded = await dependencies.remote_request(\n url,\n dependencies.get_remote_request_headers(),\n );\n\n return decode_payload<Success>(encoded);\n}\n\nasync function execute_query_batch_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const response = await fetch(\n `${dependencies.base}/${dependencies.app_dir}/remote/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n payloads: [payload],\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n ...dependencies.get_remote_request_headers(),\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to execute batch query\");\n }\n\n const result = await response.json() as {\n readonly type: string;\n readonly result?: string;\n readonly status?: number;\n readonly error?: unknown;\n readonly location?: string;\n };\n\n if (result.type === \"error\") {\n throw {\n body: result.error,\n status: result.status ?? 500,\n };\n }\n\n if (result.type === \"redirect\") {\n throw {\n location: result.location,\n status: 307,\n };\n }\n\n const entries = decode_payload<\n Array<{\n readonly data?: Success;\n readonly error?: unknown;\n readonly status?: number;\n readonly type: string;\n }>\n >(result.result ?? \"\");\n const first = entries[0];\n\n if (!first) {\n throw new Error(\"Batch query returned no entries.\");\n }\n\n if (first.type === \"error\") {\n throw {\n body: first.error,\n status: first.status ?? 500,\n };\n }\n\n return first.data as Success;\n}\n\nasync function execute_prerender_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${\n payload ? `/${payload}` : \"\"\n }`;\n const encoded = await dependencies.remote_request(\n url,\n dependencies.get_remote_request_headers(),\n );\n\n return decode_payload<Success>(encoded);\n}\n\nfunction create_query_request<Success>(\n mode: Query_adapter_mode,\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n native_with_decoder?: AnyCallable,\n): Promise<Success> {\n if (!dependencies || !native_with_decoder) {\n return Promise.resolve(native_with_decoder?.(arg) as Success);\n }\n\n switch (mode) {\n case \"query\":\n return execute_query_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n case \"query_batch\":\n return execute_query_batch_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n case \"prerender\":\n return execute_prerender_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n }\n}\n\nasync function execute_command_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const response = await fetch(\n `${dependencies.base}/${dependencies.app_dir}/remote/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n payload: stringify_remote_payload(arg, dependencies, false),\n refreshes: [],\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n ...dependencies.get_remote_request_headers(),\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to execute remote command\");\n }\n\n const result = await response.json() as {\n readonly type: string;\n readonly result?: string;\n readonly status?: number;\n readonly error?: unknown;\n readonly refreshes?: string;\n };\n\n if (result.type === \"error\") {\n throw {\n body: result.error,\n status: result.status ?? 500,\n };\n }\n\n if (result.type === \"redirect\") {\n throw new Error(\n \"Redirects are not allowed in commands. Return a result instead and use goto on the client.\",\n );\n }\n\n if (result.refreshes) {\n dependencies.apply_refreshes?.(result.refreshes);\n }\n\n return decode_payload<Success>(result.result ?? \"\");\n}\n\nexport function create_remote_query_adapter(\n native_query_factory: (id: string) => AnyCallable,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n mode: Query_adapter_mode = \"query\",\n) {\n return (id: string) => {\n const native = native_query_factory(id);\n const native_with_decoder = create_decoded_native_callable(\n native,\n decode_payload,\n );\n const wrapped = ((arg?: unknown) =>\n create_effect_call(\n () =>\n create_query_request(\n mode,\n id,\n arg,\n decode_payload,\n dependencies,\n native_with_decoder,\n ),\n decode_payload,\n )) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native_with_decoder);\n\n return wrapped;\n };\n}\n\nexport function create_remote_command_adapter(\n native_command_factory: (id: string) => AnyCallable,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n) {\n return (id: string) => {\n const native = native_command_factory(id);\n const native_with_decoder = create_decoded_native_callable(\n native,\n decode_payload,\n );\n let local_pending = 0;\n const wrapped = ((arg?: unknown) =>\n create_effect_call(\n async () => {\n local_pending += 1;\n\n try {\n if (!dependencies) {\n return await Promise.resolve(native_with_decoder(arg));\n }\n\n return await execute_command_request(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n } finally {\n local_pending -= 1;\n }\n },\n decode_payload,\n )) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native_with_decoder);\n Object.defineProperty(wrapped, \"pending\", {\n get: () =>\n ((native as { pending?: number }).pending ?? 0) + local_pending,\n });\n\n return wrapped;\n };\n}\n\nfunction normalize_form_issues(issues: unknown): ReadonlyArray<FormIssue> {\n if (!Array.isArray(issues)) {\n return [];\n }\n\n return issues.flatMap((issue) =>\n is_remote_validation_issue(issue)\n ? [{\n message: issue.message,\n path: [...issue.path],\n }]\n : []\n );\n}\n\nfunction get_root_form_issues(\n native: {\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n },\n): ReadonlyArray<FormIssue> {\n return normalize_form_issues(native.fields?.allIssues);\n}\n\nfunction get_attachment(\n value: Record<string | symbol, unknown>,\n): (form: HTMLFormElement) => void | (() => void) {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n const candidate = value[symbol];\n\n if (typeof candidate === \"function\") {\n return candidate as (form: HTMLFormElement) => void | (() => void);\n }\n }\n\n throw new Error(\n \"Failed to find the Svelte attachment for the remote form enhancement.\",\n );\n}\n\nfunction build_form_field_name(path: ReadonlyArray<string | number>): string {\n let name = \"\";\n\n for (const segment of path) {\n if (typeof segment === \"number\") {\n name += `[${segment}]`;\n continue;\n }\n\n name += name === \"\" ? segment : `.${segment}`;\n }\n\n return name;\n}\n\nfunction append_hidden_input(\n form: HTMLFormElement,\n name: string,\n value: string,\n): void {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n input.value = value;\n form.append(input);\n}\n\nfunction append_file_input(\n form: HTMLFormElement,\n name: string,\n value: File,\n): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.name = name;\n\n if (typeof DataTransfer === \"function\") {\n const transfer = new DataTransfer();\n transfer.items.add(value);\n\n try {\n input.files = transfer.files;\n } catch {\n // ignore and fall back below\n }\n }\n\n if (input.files?.length) {\n form.append(input);\n return;\n }\n\n append_hidden_input(form, name, value.name);\n}\n\nfunction append_form_value(\n form: HTMLFormElement,\n value: unknown,\n path: ReadonlyArray<string | number>,\n): void {\n if (value === undefined) {\n return;\n }\n\n if (value instanceof File) {\n append_file_input(form, build_form_field_name(path), value);\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n append_form_value(form, entry, [...path, index]);\n });\n return;\n }\n\n if (value && typeof value === \"object\") {\n for (\n const [key, entry] of Object.entries(value as Record<string, unknown>)\n ) {\n append_form_value(form, entry, [...path, key]);\n }\n return;\n }\n\n const base_name = build_form_field_name(path);\n\n if (typeof value === \"number\") {\n append_hidden_input(form, `n:${base_name}`, String(value));\n return;\n }\n\n if (typeof value === \"boolean\") {\n append_hidden_input(form, `b:${base_name}`, value ? \"on\" : \"\");\n return;\n }\n\n append_hidden_input(\n form,\n base_name,\n value === null ? \"\" : String(value),\n );\n}\n\nfunction apply_input_to_fields(fields: unknown, input: unknown): void {\n if (!fields || typeof fields !== \"object\") {\n return;\n }\n\n const maybe_field = fields as {\n readonly set?: (value: unknown) => void;\n };\n\n if (typeof maybe_field.set === \"function\") {\n maybe_field.set(input);\n return;\n }\n\n if (!input || typeof input !== \"object\") {\n return;\n }\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n apply_input_to_fields(\n (fields as Record<string, unknown>)[key],\n value,\n );\n }\n}\n\ntype Submitter_like = {\n click(): void;\n} & Record<string, unknown>;\n\nfunction is_submitter_like(value: unknown): value is Submitter_like {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { click?: unknown }).click === \"function\",\n );\n}\n\nfunction get_submitter(\n form: HTMLFormElement,\n): Submitter_like | undefined {\n const submitter = form.querySelector(\"button:not([type]), [type='submit']\");\n return is_submitter_like(submitter) ? submitter : undefined;\n}\n\nfunction request_form_submit(form: HTMLFormElement): void {\n const submitter = get_submitter(form);\n log_remote_client_step(\"request_form_submit\", {\n action: form.action,\n has_submitter: Boolean(submitter),\n submitter,\n });\n\n if (typeof SubmitEvent === \"function\") {\n form.dispatchEvent(\n new SubmitEvent(\"submit\", {\n bubbles: true,\n cancelable: true,\n submitter: submitter as HTMLElement | null | undefined,\n }),\n );\n return;\n }\n\n const event = new Event(\"submit\", {\n bubbles: true,\n cancelable: true,\n }) as Event & {\n readonly submitter?: Submitter_like;\n };\n Object.defineProperty(event, \"submitter\", {\n configurable: true,\n value: submitter,\n });\n form.dispatchEvent(event);\n}\n\nasync function wait_for_pending_settle(\n native: {\n readonly pending?: number;\n },\n): Promise<void> {\n await tick();\n\n while ((native.pending ?? 0) > 0) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n await tick();\n}\n\nasync function submit_attached_form<Success, ErrorType>(\n form: {\n readonly native: {\n readonly fields?: {\n readonly allIssues?: unknown;\n } & Record<string, unknown>;\n readonly pending?: number;\n readonly result?: Success;\n };\n },\n element: HTMLFormElement,\n input: unknown,\n): Promise<Effect.Effect<Success, RemoteFailure<ErrorType>, never>> {\n log_remote_client_step(\"submit_attached_form:start\", {\n action: element.action,\n input,\n });\n\n if (input !== undefined) {\n apply_input_to_fields(form.native.fields, input);\n }\n\n await tick();\n request_form_submit(element);\n await wait_for_pending_settle(form.native);\n\n const issues = get_root_form_issues(form.native);\n log_remote_client_step(\"submit_attached_form:after_submit\", {\n issues,\n pending: form.native.pending ?? 0,\n result: form.native.result,\n });\n\n if (issues.length > 0) {\n return Effect.fail(\n create_remote_validation_error(issues, {\n body: issues,\n status: 400,\n }),\n );\n }\n\n return Effect.succeed(form.native.result as Success);\n}\n\nfunction create_form_submit_effect<Success, ErrorType>(\n form: {\n readonly native: {\n readonly action: string;\n readonly result?: Success;\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n enhance(\n callback: (args: {\n readonly form: HTMLFormElement;\n readonly data: unknown;\n readonly submit: () => Promise<unknown>;\n }) => Promise<void> | void,\n ): Record<string | symbol, unknown>;\n };\n },\n input: unknown,\n decode_payload: Decode_remote_payload,\n attached_form_tracker: Attached_form_tracker,\n _dependencies: Form_request_dependencies,\n): Effect.Effect<Success, RemoteFailure<ErrorType>, never> {\n return create_async_effect<Success, RemoteFailure<ErrorType>>((resume) => {\n log_remote_client_step(\"create_form_submit_effect:start\", {\n action: form.native.action,\n input,\n attached: Boolean(attached_form_tracker.current),\n });\n\n if (typeof document === \"undefined\") {\n resume(\n Effect.fail(\n create_remote_http_error(\n new Error(\"Programmatic remote form submission requires a DOM.\"),\n ),\n ),\n );\n return;\n }\n\n let settled = false;\n let dispose_attachment: void | (() => void);\n const temp_form = document.createElement(\"form\");\n temp_form.method = \"POST\";\n temp_form.action = form.native.action;\n temp_form.hidden = true;\n document.body.append(temp_form);\n\n const cleanup = () => {\n if (typeof dispose_attachment === \"function\") {\n dispose_attachment();\n }\n\n temp_form.remove();\n };\n\n const finish = (\n effect: Effect.Effect<Success, RemoteFailure<ErrorType>, never>,\n ) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n resume(effect);\n };\n\n try {\n const attached_form = attached_form_tracker.current;\n\n if (attached_form) {\n log_remote_client_step(\n \"create_form_submit_effect:attached_form_branch\",\n {\n action: attached_form.action,\n },\n );\n void submit_attached_form<Success, ErrorType>(\n form,\n attached_form,\n input,\n ).then(finish, (error) => {\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n });\n return;\n }\n\n log_remote_client_step(\n \"create_form_submit_effect:detached_fallback_branch\",\n {\n action: form.native.action,\n },\n );\n const enhanced = form.native.enhance(async ({ submit }) => {\n try {\n log_remote_client_step(\n \"create_form_submit_effect:fallback_submit:start\",\n {\n action: form.native.action,\n },\n );\n await submit();\n const issues = get_root_form_issues(form.native);\n log_remote_client_step(\n \"create_form_submit_effect:fallback_submit:after\",\n {\n issues,\n result: form.native.result,\n },\n );\n\n if (issues.length > 0) {\n finish(\n Effect.fail(\n create_remote_validation_error(issues, {\n body: issues,\n status: 400,\n }),\n ),\n );\n return;\n }\n\n finish(Effect.succeed(form.native.result as Success));\n } catch (error) {\n if (is_redirect_like(error)) {\n finish(Effect.die(error));\n return;\n }\n\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n }\n });\n\n dispose_attachment = get_attachment(enhanced)(temp_form);\n\n if (input && typeof input === \"object\") {\n append_form_value(temp_form, input, []);\n }\n\n const submitter = document.createElement(\"button\");\n submitter.type = \"submit\";\n temp_form.append(submitter);\n if (typeof temp_form.requestSubmit === \"function\") {\n temp_form.requestSubmit(submitter);\n } else {\n submitter.click();\n }\n } catch (error) {\n log_remote_client_step(\"create_form_submit_effect:error\", {\n error,\n });\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n }\n });\n}\n\nfunction wrap_native_form(\n native: Record<string, unknown>,\n decode_payload: Decode_remote_payload,\n dependencies: Form_request_dependencies,\n) {\n const attached_form_tracker: Attached_form_tracker = {\n current: null,\n };\n const wrapped_symbol_properties = new Map<symbol, unknown>();\n const proxy_target: Record<string, unknown> = {};\n Object.defineProperty(proxy_target, \"native\", {\n configurable: true,\n enumerable: false,\n value: native,\n writable: false,\n });\n const wrapped = new Proxy(proxy_target, {\n get(_target, property, receiver) {\n if (property === \"native\") {\n return native;\n }\n\n if (property === \"submit\") {\n return (input: unknown) =>\n create_form_submit_effect(\n receiver as {\n readonly native: {\n readonly action: string;\n readonly result?: unknown;\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n enhance(\n callback: (args: {\n readonly form: HTMLFormElement;\n readonly data: unknown;\n readonly submit: () => Promise<unknown>;\n }) => Promise<void> | void,\n ): Record<string | symbol, unknown>;\n };\n },\n input,\n decode_payload,\n attached_form_tracker,\n dependencies,\n );\n }\n\n if (typeof property === \"symbol\") {\n if (wrapped_symbol_properties.has(property)) {\n return wrapped_symbol_properties.get(property);\n }\n\n const native_value = Reflect.get(native, property, native);\n\n if (typeof native_value === \"function\") {\n const wrapped_attachment = (element: HTMLFormElement) => {\n log_remote_client_step(\"wrap_native_form:attach\", {\n action: element.action,\n native_action: (native as { action?: unknown }).action,\n });\n attached_form_tracker.current = element;\n const cleanup = native_value.call(native, element);\n\n return () => {\n log_remote_client_step(\"wrap_native_form:detach\", {\n action: element.action,\n });\n if (attached_form_tracker.current === element) {\n attached_form_tracker.current = null;\n }\n\n if (typeof cleanup === \"function\") {\n cleanup();\n }\n };\n };\n\n wrapped_symbol_properties.set(property, wrapped_attachment);\n return wrapped_attachment;\n }\n }\n\n if (property === \"for\") {\n const native_for = Reflect.get(native, property, native);\n\n if (typeof native_for === \"function\") {\n return (key: string | number) =>\n wrap_native_form(\n native_for.call(native, key) as Record<string, unknown>,\n decode_payload,\n dependencies,\n );\n }\n }\n\n return Reflect.get(native, property, native);\n },\n has(_target, property) {\n if (\n property === \"native\" ||\n property === \"submit\" ||\n property === \"for\"\n ) {\n return true;\n }\n\n return Reflect.has(native, property);\n },\n ownKeys() {\n return Array.from(\n new Set([\n ...Reflect.ownKeys(native),\n \"native\",\n \"submit\",\n \"for\",\n ...wrapped_symbol_properties.keys(),\n ]),\n );\n },\n getOwnPropertyDescriptor(\n _target,\n property,\n ): PropertyDescriptor | undefined {\n if (property === \"native\") {\n return Reflect.getOwnPropertyDescriptor(proxy_target, property);\n }\n\n if (property === \"submit\" || property === \"for\") {\n return {\n configurable: true,\n enumerable: false,\n writable: false,\n };\n }\n\n const descriptor = Reflect.getOwnPropertyDescriptor(native, property);\n\n if (!descriptor) {\n return descriptor;\n }\n\n return {\n ...descriptor,\n configurable: true,\n };\n },\n });\n\n return wrapped as Record<string, unknown>;\n}\n\nexport function create_remote_form_adapter(\n native_form_factory: (id: string) => Record<string, unknown>,\n decode_payload: Decode_remote_payload,\n dependencies: Form_request_dependencies,\n) {\n return (id: string) => {\n const native = native_form_factory(id);\n return wrap_native_form(native, decode_payload, dependencies);\n };\n}\n"],"mappings":";;;;;;;AA8EA,SAAS,6BAAsC;CAC7C,MAAM,mBACJ,OAAO,KAKP;AAEF,KAAI,OAAO,kBAAkB,QAAQ,UACnC,QAAO,iBAAiB;CAG1B,MAAM,eAAgB,WAQnB;AAEH,QACE,cAAc,KAAK,gCAAgC,OACnD,cAAc,KAAK,QAAQ,OAC3B,cAAc,KAAK,aAAa;;AAIpC,MAAM,kCAAkC,4BAA4B;AAEpE,SAAS,uBACP,MACA,SACM;AACN,KAAI,CAAC,gCACH;AAGF,SAAQ,IAAI,0CAA0C,MAAM,WAAW,EAAE,CAAC;;AAG5E,SAAS,uBACP,OACA,KACA,UACO;AACP,QAAO,eAAe,OAAO,KAAK;EAChC,OAAO;EACP,YAAY;EACb,CAAC;AAEF,QAAO;;AAGT,SAAS,4BACP,OACA,gBACO;AACP,QAAO,uBAAuB,OAAO,sBAAsB,eAAe;;AAG5E,SAAS,mBAAmB,OAAwC;AAClE,QAAO,QACL,SACE,OAAO,UAAU,YACjB,OAAQ,MAA+B,WAAW,SACrD;;AAGH,SAAS,iBAAiB,OAAuC;AAC/D,QAAO,QACL,SACE,OAAO,UAAU,YACjB,OAAQ,MAAiC,aAAa,YACtD,OAAQ,MAA+B,WAAW,SACrD;;AAGH,SAAS,iBAAiB,OAAwB;AAChD,QAAO,mBAAmB,MAAM,GAAG,MAAM,UAAU,MAAM;;AAG3D,SAAS,oBACP,OACA,gBAC0B;AAC1B,wBAAuB,6BAA6B,EAClD,OACD,CAAC;AAEF,KAAI,mBAAmB,MAAM,EAAE;EAC7B,MAAM,OAAO,MAAM;AAEnB,MAAI,sCAAsC,KAAK,CAC7C,KAAI;AACF,UAAO,eACL,KAAK,QACN;WACM,OAAO;AACd,UAAO,8BAA8B,OAAO,KAAK;;AAIrD,MAAI,iBAAiB,MAAM,KAAK,IAC9B,QAAO,+BAA+B,EAAE,EAAE;GACxC;GACA,QAAQ;GACT,CAAC;AAGJ,SAAO,yBAAyB,OAAO;GACrC;GACA,QAAQ,iBAAiB,MAAM;GAChC,CAAC;;CAGJ,MAAM,UAAU,yBAAyB,MAAM;AAC/C,wBAAuB,kCAAkC,EACvD,SACD,CAAC;AACF,QAAO;;AAGT,SAAS,mBACP,gBACA,gBACyD;AACzD,QAAO,wCACC;AACJ,yBAAuB,2BAA2B;AAClD,SAAO,gBAAgB;KAExB,UAAU,oBAA+B,OAAO,eAAe,CACjE;;AAGH,SAAS,+BACP,QACA,gBACa;CACb,MAAM,YAAY,GAAG,SAAyB;EAC5C,MAAM,SAAS,OAAO,GAAG,KAAK;AAE9B,MACE,WAAW,OAAO,WAAW,YAAY,OAAO,WAAW,YAE3D,6BAA4B,QAAkB,eAAe;AAG/D,SAAO;;AAGT,wBAAuB,SAAS,UAAU,OAAO;AACjD,6BAA4B,SAAmB,eAAe;AAE9D,QAAO;;AAGT,SAAS,cACP,cACyB;AACzB,QAAO,cAAc,KAAK,OAAO,aAAa,EAAE;;AAGlD,SAAS,yBACP,KACA,cACA,OAAO,MACC;AACR,KAAI,QAAQ,KAAA,EACV,QAAO;AAGT,QAAO,aAAa,qBAClB,KACA,cAAc,aAAa,EAC3B,KACD;;AAGH,eAAe,sBACb,IACA,KACA,gBACA,cACkB;CAClB,MAAM,UAAU,yBAAyB,KAAK,aAAa;CAC3D,MAAM,MAAM,GAAG,aAAa,KAAK,GAAG,aAAa,QAAQ,UAAU,KACjE,UAAU,YAAY,YAAY;AAOpC,QAAO,eALS,MAAM,aAAa,eACjC,KACA,aAAa,4BAA4B,CAC1C,CAEsC;;AAGzC,eAAe,4BACb,IACA,KACA,gBACA,cACkB;CAClB,MAAM,UAAU,yBAAyB,KAAK,aAAa;CAC3D,MAAM,WAAW,MAAM,MACrB,GAAG,aAAa,KAAK,GAAG,aAAa,QAAQ,UAAU,MACvD;EACE,QAAQ;EACR,MAAM,KAAK,UAAU,EACnB,UAAU,CAAC,QAAQ,EACpB,CAAC;EACF,SAAS;GACP,gBAAgB;GAChB,GAAG,aAAa,4BAA4B;GAC7C;EACF,CACF;AAED,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,gCAAgC;CAGlD,MAAM,SAAS,MAAM,SAAS,MAAM;AAQpC,KAAI,OAAO,SAAS,QAClB,OAAM;EACJ,MAAM,OAAO;EACb,QAAQ,OAAO,UAAU;EAC1B;AAGH,KAAI,OAAO,SAAS,WAClB,OAAM;EACJ,UAAU,OAAO;EACjB,QAAQ;EACT;CAWH,MAAM,QARU,eAOd,OAAO,UAAU,GAAG,CACA;AAEtB,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,mCAAmC;AAGrD,KAAI,MAAM,SAAS,QACjB,OAAM;EACJ,MAAM,MAAM;EACZ,QAAQ,MAAM,UAAU;EACzB;AAGH,QAAO,MAAM;;AAGf,eAAe,0BACb,IACA,KACA,gBACA,cACkB;CAClB,MAAM,UAAU,yBAAyB,KAAK,aAAa;CAC3D,MAAM,MAAM,GAAG,aAAa,KAAK,GAAG,aAAa,QAAQ,UAAU,KACjE,UAAU,IAAI,YAAY;AAO5B,QAAO,eALS,MAAM,aAAa,eACjC,KACA,aAAa,4BAA4B,CAC1C,CAEsC;;AAGzC,SAAS,qBACP,MACA,IACA,KACA,gBACA,cACA,qBACkB;AAClB,KAAI,CAAC,gBAAgB,CAAC,oBACpB,QAAO,QAAQ,QAAQ,sBAAsB,IAAI,CAAY;AAG/D,SAAQ,MAAR;EACE,KAAK,QACH,QAAO,sBACL,IACA,KACA,gBACA,aACD;EACH,KAAK,cACH,QAAO,4BACL,IACA,KACA,gBACA,aACD;EACH,KAAK,YACH,QAAO,0BACL,IACA,KACA,gBACA,aACD;;;AAIP,eAAe,wBACb,IACA,KACA,gBACA,cACkB;CAClB,MAAM,WAAW,MAAM,MACrB,GAAG,aAAa,KAAK,GAAG,aAAa,QAAQ,UAAU,MACvD;EACE,QAAQ;EACR,MAAM,KAAK,UAAU;GACnB,SAAS,yBAAyB,KAAK,cAAc,MAAM;GAC3D,WAAW,EAAE;GACd,CAAC;EACF,SAAS;GACP,gBAAgB;GAChB,GAAG,aAAa,4BAA4B;GAC7C;EACF,CACF;AAED,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,mCAAmC;CAGrD,MAAM,SAAS,MAAM,SAAS,MAAM;AAQpC,KAAI,OAAO,SAAS,QAClB,OAAM;EACJ,MAAM,OAAO;EACb,QAAQ,OAAO,UAAU;EAC1B;AAGH,KAAI,OAAO,SAAS,WAClB,OAAM,IAAI,MACR,6FACD;AAGH,KAAI,OAAO,UACT,cAAa,kBAAkB,OAAO,UAAU;AAGlD,QAAO,eAAwB,OAAO,UAAU,GAAG;;AAGrD,SAAgB,4BACd,sBACA,gBACA,cACA,OAA2B,SAC3B;AACA,SAAQ,OAAe;EAErB,MAAM,sBAAsB,+BADb,qBAAqB,GAAG,EAGrC,eACD;EACD,MAAM,YAAY,QAChB,yBAEI,qBACE,MACA,IACA,KACA,gBACA,cACA,oBACD,EACH,eACD;AAEH,yBAAuB,SAAS,UAAU,oBAAoB;AAE9D,SAAO;;;AAIX,SAAgB,8BACd,wBACA,gBACA,cACA;AACA,SAAQ,OAAe;EACrB,MAAM,SAAS,uBAAuB,GAAG;EACzC,MAAM,sBAAsB,+BAC1B,QACA,eACD;EACD,IAAI,gBAAgB;EACpB,MAAM,YAAY,QAChB,mBACE,YAAY;AACV,oBAAiB;AAEjB,OAAI;AACF,QAAI,CAAC,aACH,QAAO,MAAM,QAAQ,QAAQ,oBAAoB,IAAI,CAAC;AAGxD,WAAO,MAAM,wBACX,IACA,KACA,gBACA,aACD;aACO;AACR,qBAAiB;;KAGrB,eACD;AAEH,yBAAuB,SAAS,UAAU,oBAAoB;AAC9D,SAAO,eAAe,SAAS,WAAW,EACxC,YACI,OAAgC,WAAW,KAAK,eACrD,CAAC;AAEF,SAAO;;;AAIX,SAAS,sBAAsB,QAA2C;AACxE,KAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,QAAO,EAAE;AAGX,QAAO,OAAO,SAAS,UACrB,2BAA2B,MAAM,GAC7B,CAAC;EACD,SAAS,MAAM;EACf,MAAM,CAAC,GAAG,MAAM,KAAK;EACtB,CAAC,GACA,EAAE,CACP;;AAGH,SAAS,qBACP,QAK0B;AAC1B,QAAO,sBAAsB,OAAO,QAAQ,UAAU;;AAGxD,SAAS,eACP,OACgD;AAChD,MAAK,MAAM,UAAU,OAAO,sBAAsB,MAAM,EAAE;EACxD,MAAM,YAAY,MAAM;AAExB,MAAI,OAAO,cAAc,WACvB,QAAO;;AAIX,OAAM,IAAI,MACR,wEACD;;AAGH,SAAS,sBAAsB,MAA8C;CAC3E,IAAI,OAAO;AAEX,MAAK,MAAM,WAAW,MAAM;AAC1B,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAQ,IAAI,QAAQ;AACpB;;AAGF,UAAQ,SAAS,KAAK,UAAU,IAAI;;AAGtC,QAAO;;AAGT,SAAS,oBACP,MACA,MACA,OACM;CACN,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,OAAM,OAAO;AACb,OAAM,OAAO;AACb,OAAM,QAAQ;AACd,MAAK,OAAO,MAAM;;AAGpB,SAAS,kBACP,MACA,MACA,OACM;CACN,MAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,OAAM,OAAO;AACb,OAAM,OAAO;AAEb,KAAI,OAAO,iBAAiB,YAAY;EACtC,MAAM,WAAW,IAAI,cAAc;AACnC,WAAS,MAAM,IAAI,MAAM;AAEzB,MAAI;AACF,SAAM,QAAQ,SAAS;UACjB;;AAKV,KAAI,MAAM,OAAO,QAAQ;AACvB,OAAK,OAAO,MAAM;AAClB;;AAGF,qBAAoB,MAAM,MAAM,MAAM,KAAK;;AAG7C,SAAS,kBACP,MACA,OACA,MACM;AACN,KAAI,UAAU,KAAA,EACZ;AAGF,KAAI,iBAAiB,MAAM;AACzB,oBAAkB,MAAM,sBAAsB,KAAK,EAAE,MAAM;AAC3D;;AAGF,KAAI,MAAM,QAAQ,MAAM,EAAE;AACxB,QAAM,SAAS,OAAO,UAAU;AAC9B,qBAAkB,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;IAChD;AACF;;AAGF,KAAI,SAAS,OAAO,UAAU,UAAU;AACtC,OACE,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAiC,CAEtE,mBAAkB,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;AAEhD;;CAGF,MAAM,YAAY,sBAAsB,KAAK;AAE7C,KAAI,OAAO,UAAU,UAAU;AAC7B,sBAAoB,MAAM,KAAK,aAAa,OAAO,MAAM,CAAC;AAC1D;;AAGF,KAAI,OAAO,UAAU,WAAW;AAC9B,sBAAoB,MAAM,KAAK,aAAa,QAAQ,OAAO,GAAG;AAC9D;;AAGF,qBACE,MACA,WACA,UAAU,OAAO,KAAK,OAAO,MAAM,CACpC;;AAGH,SAAS,sBAAsB,QAAiB,OAAsB;AACpE,KAAI,CAAC,UAAU,OAAO,WAAW,SAC/B;CAGF,MAAM,cAAc;AAIpB,KAAI,OAAO,YAAY,QAAQ,YAAY;AACzC,cAAY,IAAI,MAAM;AACtB;;AAGF,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B;AAGF,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAiC,CACzE,uBACG,OAAmC,MACpC,MACD;;AAQL,SAAS,kBAAkB,OAAyC;AAClE,QAAO,QACL,SACE,OAAO,UAAU,YACjB,OAAQ,MAA8B,UAAU,WACnD;;AAGH,SAAS,cACP,MAC4B;CAC5B,MAAM,YAAY,KAAK,cAAc,sCAAsC;AAC3E,QAAO,kBAAkB,UAAU,GAAG,YAAY,KAAA;;AAGpD,SAAS,oBAAoB,MAA6B;CACxD,MAAM,YAAY,cAAc,KAAK;AACrC,wBAAuB,uBAAuB;EAC5C,QAAQ,KAAK;EACb,eAAe,QAAQ,UAAU;EACjC;EACD,CAAC;AAEF,KAAI,OAAO,gBAAgB,YAAY;AACrC,OAAK,cACH,IAAI,YAAY,UAAU;GACxB,SAAS;GACT,YAAY;GACD;GACZ,CAAC,CACH;AACD;;CAGF,MAAM,QAAQ,IAAI,MAAM,UAAU;EAChC,SAAS;EACT,YAAY;EACb,CAAC;AAGF,QAAO,eAAe,OAAO,aAAa;EACxC,cAAc;EACd,OAAO;EACR,CAAC;AACF,MAAK,cAAc,MAAM;;AAG3B,eAAe,wBACb,QAGe;AACf,OAAM,MAAM;AAEZ,SAAQ,OAAO,WAAW,KAAK,EAC7B,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;AAGxD,OAAM,MAAM;;AAGd,eAAe,qBACb,MASA,SACA,OACkE;AAClE,wBAAuB,8BAA8B;EACnD,QAAQ,QAAQ;EAChB;EACD,CAAC;AAEF,KAAI,UAAU,KAAA,EACZ,uBAAsB,KAAK,OAAO,QAAQ,MAAM;AAGlD,OAAM,MAAM;AACZ,qBAAoB,QAAQ;AAC5B,OAAM,wBAAwB,KAAK,OAAO;CAE1C,MAAM,SAAS,qBAAqB,KAAK,OAAO;AAChD,wBAAuB,qCAAqC;EAC1D;EACA,SAAS,KAAK,OAAO,WAAW;EAChC,QAAQ,KAAK,OAAO;EACrB,CAAC;AAEF,KAAI,OAAO,SAAS,EAClB,QAAO,OAAO,KACZ,+BAA+B,QAAQ;EACrC,MAAM;EACN,QAAQ;EACT,CAAC,CACH;AAGH,QAAO,OAAO,QAAQ,KAAK,OAAO,OAAkB;;AAGtD,SAAS,0BACP,MAgBA,OACA,gBACA,uBACA,eACyD;AACzD,QAAO,qBAAwD,WAAW;AACxE,yBAAuB,mCAAmC;GACxD,QAAQ,KAAK,OAAO;GACpB;GACA,UAAU,QAAQ,sBAAsB,QAAQ;GACjD,CAAC;AAEF,MAAI,OAAO,aAAa,aAAa;AACnC,UACE,OAAO,KACL,yCACE,IAAI,MAAM,sDAAsD,CACjE,CACF,CACF;AACD;;EAGF,IAAI,UAAU;EACd,IAAI;EACJ,MAAM,YAAY,SAAS,cAAc,OAAO;AAChD,YAAU,SAAS;AACnB,YAAU,SAAS,KAAK,OAAO;AAC/B,YAAU,SAAS;AACnB,WAAS,KAAK,OAAO,UAAU;EAE/B,MAAM,gBAAgB;AACpB,OAAI,OAAO,uBAAuB,WAChC,qBAAoB;AAGtB,aAAU,QAAQ;;EAGpB,MAAM,UACJ,WACG;AACH,OAAI,QACF;AAGF,aAAU;AACV,YAAS;AACT,UAAO,OAAO;;AAGhB,MAAI;GACF,MAAM,gBAAgB,sBAAsB;AAE5C,OAAI,eAAe;AACjB,2BACE,kDACA,EACE,QAAQ,cAAc,QACvB,CACF;AACI,yBACH,MACA,eACA,MACD,CAAC,KAAK,SAAS,UAAU;AACxB,YACE,OAAO,KAAK,oBAA+B,OAAO,eAAe,CAAC,CACnE;MACD;AACF;;AAGF,0BACE,sDACA,EACE,QAAQ,KAAK,OAAO,QACrB,CACF;AA4CD,wBAAqB,eA3CJ,KAAK,OAAO,QAAQ,OAAO,EAAE,aAAa;AACzD,QAAI;AACF,4BACE,mDACA,EACE,QAAQ,KAAK,OAAO,QACrB,CACF;AACD,WAAM,QAAQ;KACd,MAAM,SAAS,qBAAqB,KAAK,OAAO;AAChD,4BACE,mDACA;MACE;MACA,QAAQ,KAAK,OAAO;MACrB,CACF;AAED,SAAI,OAAO,SAAS,GAAG;AACrB,aACE,OAAO,KACL,+BAA+B,QAAQ;OACrC,MAAM;OACN,QAAQ;OACT,CAAC,CACH,CACF;AACD;;AAGF,YAAO,OAAO,QAAQ,KAAK,OAAO,OAAkB,CAAC;aAC9C,OAAO;AACd,SAAI,iBAAiB,MAAM,EAAE;AAC3B,aAAO,OAAO,IAAI,MAAM,CAAC;AACzB;;AAGF,YACE,OAAO,KAAK,oBAA+B,OAAO,eAAe,CAAC,CACnE;;KAEH,CAE2C,CAAC,UAAU;AAExD,OAAI,SAAS,OAAO,UAAU,SAC5B,mBAAkB,WAAW,OAAO,EAAE,CAAC;GAGzC,MAAM,YAAY,SAAS,cAAc,SAAS;AAClD,aAAU,OAAO;AACjB,aAAU,OAAO,UAAU;AAC3B,OAAI,OAAO,UAAU,kBAAkB,WACrC,WAAU,cAAc,UAAU;OAElC,WAAU,OAAO;WAEZ,OAAO;AACd,0BAAuB,mCAAmC,EACxD,OACD,CAAC;AACF,UACE,OAAO,KAAK,oBAA+B,OAAO,eAAe,CAAC,CACnE;;GAEH;;AAGJ,SAAS,iBACP,QACA,gBACA,cACA;CACA,MAAM,wBAA+C,EACnD,SAAS,MACV;CACD,MAAM,4CAA4B,IAAI,KAAsB;CAC5D,MAAM,eAAwC,EAAE;AAChD,QAAO,eAAe,cAAc,UAAU;EAC5C,cAAc;EACd,YAAY;EACZ,OAAO;EACP,UAAU;EACX,CAAC;AAsIF,QArIgB,IAAI,MAAM,cAAc;EACtC,IAAI,SAAS,UAAU,UAAU;AAC/B,OAAI,aAAa,SACf,QAAO;AAGT,OAAI,aAAa,SACf,SAAQ,UACN,0BACE,UAgBA,OACA,gBACA,uBACA,aACD;AAGL,OAAI,OAAO,aAAa,UAAU;AAChC,QAAI,0BAA0B,IAAI,SAAS,CACzC,QAAO,0BAA0B,IAAI,SAAS;IAGhD,MAAM,eAAe,QAAQ,IAAI,QAAQ,UAAU,OAAO;AAE1D,QAAI,OAAO,iBAAiB,YAAY;KACtC,MAAM,sBAAsB,YAA6B;AACvD,6BAAuB,2BAA2B;OAChD,QAAQ,QAAQ;OAChB,eAAgB,OAAgC;OACjD,CAAC;AACF,4BAAsB,UAAU;MAChC,MAAM,UAAU,aAAa,KAAK,QAAQ,QAAQ;AAElD,mBAAa;AACX,8BAAuB,2BAA2B,EAChD,QAAQ,QAAQ,QACjB,CAAC;AACF,WAAI,sBAAsB,YAAY,QACpC,uBAAsB,UAAU;AAGlC,WAAI,OAAO,YAAY,WACrB,UAAS;;;AAKf,+BAA0B,IAAI,UAAU,mBAAmB;AAC3D,YAAO;;;AAIX,OAAI,aAAa,OAAO;IACtB,MAAM,aAAa,QAAQ,IAAI,QAAQ,UAAU,OAAO;AAExD,QAAI,OAAO,eAAe,WACxB,SAAQ,QACN,iBACE,WAAW,KAAK,QAAQ,IAAI,EAC5B,gBACA,aACD;;AAIP,UAAO,QAAQ,IAAI,QAAQ,UAAU,OAAO;;EAE9C,IAAI,SAAS,UAAU;AACrB,OACE,aAAa,YACb,aAAa,YACb,aAAa,MAEb,QAAO;AAGT,UAAO,QAAQ,IAAI,QAAQ,SAAS;;EAEtC,UAAU;AACR,UAAO,MAAM,KACX,IAAI,IAAI;IACN,GAAG,QAAQ,QAAQ,OAAO;IAC1B;IACA;IACA;IACA,GAAG,0BAA0B,MAAM;IACpC,CAAC,CACH;;EAEH,yBACE,SACA,UACgC;AAChC,OAAI,aAAa,SACf,QAAO,QAAQ,yBAAyB,cAAc,SAAS;AAGjE,OAAI,aAAa,YAAY,aAAa,MACxC,QAAO;IACL,cAAc;IACd,YAAY;IACZ,UAAU;IACX;GAGH,MAAM,aAAa,QAAQ,yBAAyB,QAAQ,SAAS;AAErE,OAAI,CAAC,WACH,QAAO;AAGT,UAAO;IACL,GAAG;IACH,cAAc;IACf;;EAEJ,CAAC;;AAKJ,SAAgB,2BACd,qBACA,gBACA,cACA;AACA,SAAQ,OAAe;AAErB,SAAO,iBADQ,oBAAoB,GAAG,EACN,gBAAgB,aAAa"}
|
|
1
|
+
{"version":3,"file":"remote-client.js","names":[],"sources":["../../../modules/svelte-effect-runtime/internal/remote-client.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { tick } from \"svelte\";\nimport { create_remote_effect_from_promise } from \"$/client.ts\";\nimport { create_async_effect } from \"$internal/effect-compat.ts\";\nimport {\n create_remote_http_error,\n create_remote_transport_error,\n create_remote_validation_error,\n type FormIssue,\n is_remote_validation_issue,\n is_serialized_remote_failure_envelope,\n REMOTE_ERROR_DECODER,\n type RemoteFailure,\n} from \"$internal/remote-shared.ts\";\n\ntype AnyCallable = (...args: Array<unknown>) => unknown;\n\ntype Decode_remote_payload = <ErrorType = unknown>(\n encoded: string,\n) => ErrorType;\n\ninterface HttpErrorLike {\n readonly body?: unknown;\n readonly status?: number;\n}\n\ninterface RedirectLike {\n readonly location: string;\n readonly status: number;\n}\n\ninterface Remote_request_dependencies {\n readonly app?: {\n readonly decoders?: Record<string, unknown>;\n readonly hooks?: {\n readonly transport?: Record<string, unknown>;\n };\n };\n readonly app_dir: string;\n readonly apply_refreshes?: (value: string) => void;\n readonly base: string;\n readonly get_remote_request_headers: () => HeadersInit;\n readonly remote_request: (\n url: string,\n headers: HeadersInit,\n ) => Promise<string>;\n readonly stringify_remote_arg: (\n value: unknown,\n transport: unknown,\n sort?: boolean,\n ) => string;\n}\n\ntype Query_adapter_mode = \"query\" | \"query_batch\" | \"prerender\";\n\ntype Form_request_dependencies = Remote_request_dependencies & {\n readonly app: {\n readonly decoders?: Record<string, unknown>;\n readonly encoders?: Record<string, unknown>;\n };\n readonly app_dir: string;\n readonly apply_refreshes: (value: string) => void;\n readonly base: string;\n readonly binary_form_content_type: string;\n readonly goto: (url: string, options?: unknown, code?: number) => void;\n readonly invalidate_all: () => Promise<void> | void;\n readonly serialize_binary_form: (\n data: unknown,\n meta: Record<string, unknown>,\n ) => {\n readonly blob: Blob;\n };\n};\n\ninterface Attached_form_tracker {\n current: HTMLFormElement | null;\n}\n\nfunction is_development_environment(): boolean {\n const vite_environment = (\n import.meta as ImportMeta & {\n env?: {\n DEV?: boolean;\n };\n }\n ).env;\n\n if (typeof vite_environment?.DEV === \"boolean\") {\n return vite_environment.DEV;\n }\n\n const node_process = (globalThis as typeof globalThis & {\n process?: {\n env?: {\n DEV?: string;\n NODE_ENV?: string;\n SVELTE_EFFECT_RUNTIME_DEBUG?: string;\n };\n };\n }).process;\n\n return (\n node_process?.env?.SVELTE_EFFECT_RUNTIME_DEBUG === \"1\" ||\n node_process?.env?.DEV === \"1\" ||\n node_process?.env?.NODE_ENV === \"development\"\n );\n}\n\nconst ENABLE_REMOTE_CLIENT_DEBUG_LOGS = is_development_environment();\n\nfunction log_remote_client_step(\n step: string,\n details?: Record<string, unknown>,\n): void {\n if (!ENABLE_REMOTE_CLIENT_DEBUG_LOGS) {\n return;\n }\n\n console.log(\"[svelte-effect-runtime][remote-client]\", step, details ?? {});\n}\n\nfunction define_hidden_property<Value extends object, Property>(\n value: Value,\n key: string | symbol,\n property: Property,\n): Value {\n Object.defineProperty(value, key, {\n value: property,\n enumerable: false,\n });\n\n return value;\n}\n\nfunction define_remote_error_decoder<Value extends object>(\n value: Value,\n decode_payload: Decode_remote_payload,\n): Value {\n return define_hidden_property(value, REMOTE_ERROR_DECODER, decode_payload);\n}\n\nfunction is_http_error_like(value: unknown): value is HttpErrorLike {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { status?: unknown }).status === \"number\",\n );\n}\n\nfunction is_redirect_like(value: unknown): value is RedirectLike {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { location?: unknown }).location === \"string\" &&\n typeof (value as { status?: unknown }).status === \"number\",\n );\n}\n\nfunction get_error_status(value: unknown): number {\n return is_http_error_like(value) ? value.status ?? 500 : 500;\n}\n\nfunction decode_remote_error<ErrorType>(\n error: unknown,\n decode_payload: Decode_remote_payload,\n): RemoteFailure<ErrorType> {\n log_remote_client_step(\"decode_remote_error:start\", {\n error,\n });\n\n if (is_http_error_like(error)) {\n const body = error.body;\n\n if (is_serialized_remote_failure_envelope(body)) {\n try {\n return decode_payload<ErrorType>(\n body.encoded,\n ) as RemoteFailure<ErrorType>;\n } catch (cause) {\n return create_remote_transport_error(cause, body);\n }\n }\n\n if (get_error_status(error) === 400) {\n return create_remote_validation_error([], {\n body,\n status: 400,\n });\n }\n\n return create_remote_http_error(error, {\n body,\n status: get_error_status(error),\n });\n }\n\n const decoded = create_remote_http_error(error);\n log_remote_client_step(\"decode_remote_error:http_error\", {\n decoded,\n });\n return decoded;\n}\n\nfunction create_effect_call<Success, ErrorType>(\n create_promise: () => PromiseLike<Success>,\n decode_payload: Decode_remote_payload,\n): Effect.Effect<Success, RemoteFailure<ErrorType>, never> {\n return create_remote_effect_from_promise<Success, ErrorType>(\n () => {\n log_remote_client_step(\"create_effect_call:start\");\n return create_promise();\n },\n (error) => decode_remote_error<ErrorType>(error, decode_payload),\n );\n}\n\nfunction create_decoded_native_callable(\n native: AnyCallable,\n decode_payload: Decode_remote_payload,\n): AnyCallable {\n const wrapped = ((...args: Array<unknown>) => {\n const result = native(...args);\n\n if (\n result && (typeof result === \"object\" || typeof result === \"function\")\n ) {\n define_remote_error_decoder(result as object, decode_payload);\n }\n\n return result;\n }) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native);\n define_remote_error_decoder(wrapped as object, decode_payload);\n\n return wrapped;\n}\n\nfunction get_transport(\n dependencies?: Remote_request_dependencies,\n): Record<string, unknown> {\n return dependencies?.app?.hooks?.transport ?? {};\n}\n\nfunction stringify_remote_payload(\n arg: unknown,\n dependencies: Remote_request_dependencies,\n sort = true,\n): string {\n if (arg === undefined) {\n return \"\";\n }\n\n return dependencies.stringify_remote_arg(\n arg,\n get_transport(dependencies),\n sort,\n );\n}\n\nasync function execute_query_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${\n payload ? `?payload=${payload}` : \"\"\n }`;\n const encoded = await dependencies.remote_request(\n url,\n dependencies.get_remote_request_headers(),\n );\n\n return decode_payload<Success>(encoded);\n}\n\nasync function execute_query_batch_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const response = await fetch(\n `${dependencies.base}/${dependencies.app_dir}/remote/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n payloads: [payload],\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n ...dependencies.get_remote_request_headers(),\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to execute batch query\");\n }\n\n const result = await response.json() as {\n readonly type: string;\n readonly result?: string;\n readonly status?: number;\n readonly error?: unknown;\n readonly location?: string;\n };\n\n if (result.type === \"error\") {\n throw {\n body: result.error,\n status: result.status ?? 500,\n };\n }\n\n if (result.type === \"redirect\") {\n throw {\n location: result.location,\n status: 307,\n };\n }\n\n const entries = decode_payload<\n Array<{\n readonly data?: Success;\n readonly error?: unknown;\n readonly status?: number;\n readonly type: string;\n }>\n >(result.result ?? \"\");\n const first = entries[0];\n\n if (!first) {\n throw new Error(\"Batch query returned no entries.\");\n }\n\n if (first.type === \"error\") {\n throw {\n body: first.error,\n status: first.status ?? 500,\n };\n }\n\n return first.data as Success;\n}\n\nasync function execute_prerender_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const payload = stringify_remote_payload(arg, dependencies);\n const url = `${dependencies.base}/${dependencies.app_dir}/remote/${id}${\n payload ? `/${payload}` : \"\"\n }`;\n const encoded = await dependencies.remote_request(\n url,\n dependencies.get_remote_request_headers(),\n );\n\n return decode_payload<Success>(encoded);\n}\n\nfunction create_query_request<Success>(\n mode: Query_adapter_mode,\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n native_with_decoder?: AnyCallable,\n): Promise<Success> {\n if (!dependencies || !native_with_decoder) {\n return Promise.resolve(native_with_decoder?.(arg) as Success);\n }\n\n switch (mode) {\n case \"query\":\n return execute_query_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n case \"query_batch\":\n return execute_query_batch_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n case \"prerender\":\n return execute_prerender_request<Success>(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n }\n}\n\nasync function execute_command_request<Success>(\n id: string,\n arg: unknown,\n decode_payload: Decode_remote_payload,\n dependencies: Remote_request_dependencies,\n): Promise<Success> {\n const response = await fetch(\n `${dependencies.base}/${dependencies.app_dir}/remote/${id}`,\n {\n method: \"POST\",\n body: JSON.stringify({\n payload: stringify_remote_payload(arg, dependencies, false),\n refreshes: [],\n }),\n headers: {\n \"Content-Type\": \"application/json\",\n ...dependencies.get_remote_request_headers(),\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to execute remote command\");\n }\n\n const result = await response.json() as {\n readonly type: string;\n readonly result?: string;\n readonly status?: number;\n readonly error?: unknown;\n readonly refreshes?: string;\n };\n\n if (result.type === \"error\") {\n throw {\n body: result.error,\n status: result.status ?? 500,\n };\n }\n\n if (result.type === \"redirect\") {\n throw new Error(\n \"Redirects are not allowed in commands. Return a result instead and use goto on the client.\",\n );\n }\n\n if (result.refreshes) {\n dependencies.apply_refreshes?.(result.refreshes);\n }\n\n return decode_payload<Success>(result.result ?? \"\");\n}\n\nexport function create_remote_query_adapter(\n native_query_factory: (id: string) => AnyCallable,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n mode: Query_adapter_mode = \"query\",\n) {\n return (id: string) => {\n const native = native_query_factory(id);\n const native_with_decoder = create_decoded_native_callable(\n native,\n decode_payload,\n );\n const wrapped = ((arg?: unknown) =>\n create_effect_call(\n () =>\n create_query_request(\n mode,\n id,\n arg,\n decode_payload,\n dependencies,\n native_with_decoder,\n ),\n decode_payload,\n )) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native_with_decoder);\n\n return wrapped;\n };\n}\n\nexport function create_remote_command_adapter(\n native_command_factory: (id: string) => AnyCallable,\n decode_payload: Decode_remote_payload,\n dependencies?: Remote_request_dependencies,\n) {\n return (id: string) => {\n const native = native_command_factory(id);\n const native_with_decoder = create_decoded_native_callable(\n native,\n decode_payload,\n );\n let local_pending = 0;\n const wrapped = ((arg?: unknown) =>\n create_effect_call(\n async () => {\n local_pending += 1;\n\n try {\n if (!dependencies) {\n return await Promise.resolve(native_with_decoder(arg));\n }\n\n return await execute_command_request(\n id,\n arg,\n decode_payload,\n dependencies,\n );\n } finally {\n local_pending -= 1;\n }\n },\n decode_payload,\n )) as AnyCallable;\n\n define_hidden_property(wrapped, \"native\", native_with_decoder);\n Object.defineProperty(wrapped, \"pending\", {\n get: () =>\n ((native as { pending?: number }).pending ?? 0) + local_pending,\n });\n\n return wrapped;\n };\n}\n\nfunction normalize_form_issues(issues: unknown): ReadonlyArray<FormIssue> {\n if (!Array.isArray(issues)) {\n return [];\n }\n\n return issues.flatMap((issue) =>\n is_remote_validation_issue(issue)\n ? [{\n message: issue.message,\n path: [...issue.path],\n }]\n : []\n );\n}\n\nfunction get_root_form_issues(\n native: {\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n },\n): ReadonlyArray<FormIssue> {\n return normalize_form_issues(native.fields?.allIssues);\n}\n\nfunction get_attachment(\n value: Record<string | symbol, unknown>,\n): (form: HTMLFormElement) => void | (() => void) {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n const candidate = value[symbol];\n\n if (typeof candidate === \"function\") {\n return candidate as (form: HTMLFormElement) => void | (() => void);\n }\n }\n\n throw new Error(\n \"Failed to find the Svelte attachment for the remote form enhancement.\",\n );\n}\n\nfunction build_form_field_name(path: ReadonlyArray<string | number>): string {\n let name = \"\";\n\n for (const segment of path) {\n if (typeof segment === \"number\") {\n name += `[${segment}]`;\n continue;\n }\n\n name += name === \"\" ? segment : `.${segment}`;\n }\n\n return name;\n}\n\nfunction append_hidden_input(\n form: HTMLFormElement,\n name: string,\n value: string,\n): void {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n input.name = name;\n input.value = value;\n form.append(input);\n}\n\nfunction append_file_input(\n form: HTMLFormElement,\n name: string,\n value: File,\n): void {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.name = name;\n\n if (typeof DataTransfer === \"function\") {\n const transfer = new DataTransfer();\n transfer.items.add(value);\n\n try {\n input.files = transfer.files;\n } catch {\n // ignore and fall back below\n }\n }\n\n if (input.files?.length) {\n form.append(input);\n return;\n }\n\n append_hidden_input(form, name, value.name);\n}\n\nfunction append_form_value(\n form: HTMLFormElement,\n value: unknown,\n path: ReadonlyArray<string | number>,\n): void {\n if (value === undefined) {\n return;\n }\n\n if (value instanceof File) {\n append_file_input(form, build_form_field_name(path), value);\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n append_form_value(form, entry, [...path, index]);\n });\n return;\n }\n\n if (value && typeof value === \"object\") {\n for (\n const [key, entry] of Object.entries(value as Record<string, unknown>)\n ) {\n append_form_value(form, entry, [...path, key]);\n }\n return;\n }\n\n const base_name = build_form_field_name(path);\n\n if (typeof value === \"number\") {\n append_hidden_input(form, `n:${base_name}`, String(value));\n return;\n }\n\n if (typeof value === \"boolean\") {\n append_hidden_input(form, `b:${base_name}`, value ? \"on\" : \"\");\n return;\n }\n\n append_hidden_input(\n form,\n base_name,\n value === null ? \"\" : String(value),\n );\n}\n\nfunction apply_input_to_fields(fields: unknown, input: unknown): void {\n if (!fields || typeof fields !== \"object\") {\n return;\n }\n\n const maybe_field = fields as {\n readonly set?: (value: unknown) => void;\n };\n\n if (typeof maybe_field.set === \"function\") {\n maybe_field.set(input);\n return;\n }\n\n if (!input || typeof input !== \"object\") {\n return;\n }\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n apply_input_to_fields(\n (fields as Record<string, unknown>)[key],\n value,\n );\n }\n}\n\ntype Submitter_like = {\n click(): void;\n} & Record<string, unknown>;\n\nfunction is_submitter_like(value: unknown): value is Submitter_like {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n typeof (value as { click?: unknown }).click === \"function\",\n );\n}\n\nfunction get_submitter(\n form: HTMLFormElement,\n): Submitter_like | undefined {\n const submitter = form.querySelector(\"button:not([type]), [type='submit']\");\n return is_submitter_like(submitter) ? submitter : undefined;\n}\n\nfunction request_form_submit(form: HTMLFormElement): void {\n const submitter = get_submitter(form);\n log_remote_client_step(\"request_form_submit\", {\n action: form.action,\n has_submitter: Boolean(submitter),\n submitter,\n });\n\n if (typeof SubmitEvent === \"function\") {\n form.dispatchEvent(\n new SubmitEvent(\"submit\", {\n bubbles: true,\n cancelable: true,\n submitter: submitter as HTMLElement | null | undefined,\n }),\n );\n return;\n }\n\n const event = new Event(\"submit\", {\n bubbles: true,\n cancelable: true,\n }) as Event & {\n readonly submitter?: Submitter_like;\n };\n Object.defineProperty(event, \"submitter\", {\n configurable: true,\n value: submitter,\n });\n form.dispatchEvent(event);\n}\n\nasync function wait_for_pending_settle(\n native: {\n readonly pending?: number;\n },\n): Promise<void> {\n await tick();\n\n while ((native.pending ?? 0) > 0) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n\n await tick();\n}\n\nasync function submit_attached_form<Success, ErrorType>(\n form: {\n readonly native: {\n readonly fields?: {\n readonly allIssues?: unknown;\n } & Record<string, unknown>;\n readonly pending?: number;\n readonly result?: Success;\n };\n },\n element: HTMLFormElement,\n input: unknown,\n): Promise<Effect.Effect<Success, RemoteFailure<ErrorType>, never>> {\n log_remote_client_step(\"submit_attached_form:start\", {\n action: element.action,\n input,\n });\n\n if (input !== undefined) {\n apply_input_to_fields(form.native.fields, input);\n }\n\n await tick();\n request_form_submit(element);\n await wait_for_pending_settle(form.native);\n\n const issues = get_root_form_issues(form.native);\n log_remote_client_step(\"submit_attached_form:after_submit\", {\n issues,\n pending: form.native.pending ?? 0,\n result: form.native.result,\n });\n\n if (issues.length > 0) {\n return Effect.fail(\n create_remote_validation_error(issues, {\n body: issues,\n status: 400,\n }),\n );\n }\n\n return Effect.succeed(form.native.result as Success);\n}\n\nfunction create_form_submit_effect<Success, ErrorType>(\n form: {\n readonly native: {\n readonly action: string;\n readonly result?: Success;\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n enhance(\n callback: (args: {\n readonly form: HTMLFormElement;\n readonly data: unknown;\n readonly submit: () => Promise<unknown>;\n }) => Promise<void> | void,\n ): Record<string | symbol, unknown>;\n };\n },\n input: unknown,\n decode_payload: Decode_remote_payload,\n attached_form_tracker: Attached_form_tracker,\n _dependencies: Form_request_dependencies,\n): Effect.Effect<Success, RemoteFailure<ErrorType>, never> {\n return create_async_effect<Success, RemoteFailure<ErrorType>>((resume) => {\n log_remote_client_step(\"create_form_submit_effect:start\", {\n action: form.native.action,\n input,\n attached: Boolean(attached_form_tracker.current),\n });\n\n if (typeof document === \"undefined\") {\n resume(\n Effect.fail(\n create_remote_http_error(\n new Error(\"Programmatic remote form submission requires a DOM.\"),\n ),\n ),\n );\n return;\n }\n\n let settled = false;\n let dispose_attachment: void | (() => void);\n const temp_form = document.createElement(\"form\");\n temp_form.method = \"POST\";\n temp_form.action = form.native.action;\n temp_form.hidden = true;\n document.body.append(temp_form);\n\n const cleanup = () => {\n if (typeof dispose_attachment === \"function\") {\n dispose_attachment();\n }\n\n temp_form.remove();\n };\n\n const finish = (\n effect: Effect.Effect<Success, RemoteFailure<ErrorType>, never>,\n ) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n resume(effect);\n };\n\n try {\n const attached_form = attached_form_tracker.current;\n\n if (attached_form) {\n log_remote_client_step(\n \"create_form_submit_effect:attached_form_branch\",\n {\n action: attached_form.action,\n },\n );\n void submit_attached_form<Success, ErrorType>(\n form,\n attached_form,\n input,\n ).then(finish, (error) => {\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n });\n return;\n }\n\n log_remote_client_step(\n \"create_form_submit_effect:detached_fallback_branch\",\n {\n action: form.native.action,\n },\n );\n const enhanced = form.native.enhance(async ({ submit }) => {\n try {\n log_remote_client_step(\n \"create_form_submit_effect:fallback_submit:start\",\n {\n action: form.native.action,\n },\n );\n await submit();\n const issues = get_root_form_issues(form.native);\n log_remote_client_step(\n \"create_form_submit_effect:fallback_submit:after\",\n {\n issues,\n result: form.native.result,\n },\n );\n\n if (issues.length > 0) {\n finish(\n Effect.fail(\n create_remote_validation_error(issues, {\n body: issues,\n status: 400,\n }),\n ),\n );\n return;\n }\n\n finish(Effect.succeed(form.native.result as Success));\n } catch (error) {\n if (is_redirect_like(error)) {\n finish(Effect.die(error));\n return;\n }\n\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n }\n });\n\n dispose_attachment = get_attachment(enhanced)(temp_form);\n\n if (input && typeof input === \"object\") {\n append_form_value(temp_form, input, []);\n }\n\n const submitter = document.createElement(\"button\");\n submitter.type = \"submit\";\n temp_form.append(submitter);\n if (typeof temp_form.requestSubmit === \"function\") {\n temp_form.requestSubmit(submitter);\n } else {\n submitter.click();\n }\n } catch (error) {\n log_remote_client_step(\"create_form_submit_effect:error\", {\n error,\n });\n finish(\n Effect.fail(decode_remote_error<ErrorType>(error, decode_payload)),\n );\n }\n });\n}\n\nfunction wrap_attachment(\n native_attachment: (element: HTMLFormElement) => void | (() => void),\n native: Record<string, unknown>,\n tracker: Attached_form_tracker,\n): (element: HTMLFormElement) => () => void {\n return (element: HTMLFormElement) => {\n log_remote_client_step(\"wrap_native_form:attach\", {\n action: element.action,\n native_action: (native as { action?: unknown }).action,\n });\n tracker.current = element;\n const cleanup = native_attachment.call(native, element);\n\n return () => {\n log_remote_client_step(\"wrap_native_form:detach\", {\n action: element.action,\n });\n if (tracker.current === element) {\n tracker.current = null;\n }\n\n if (typeof cleanup === \"function\") {\n cleanup();\n }\n };\n };\n}\n\nfunction copy_native_descriptors(\n source: Record<string | symbol, unknown>,\n target: Record<string | symbol, unknown>,\n options: {\n readonly native: Record<string, unknown>;\n readonly tracker: Attached_form_tracker;\n readonly wrap_for?: (key: string | number) => Record<string, unknown>;\n readonly wrap_enhance?: (\n callback: (args: {\n readonly form: HTMLFormElement;\n readonly data: unknown;\n readonly submit: () => Promise<unknown>;\n }) => Promise<void> | void,\n ) => Record<string | symbol, unknown>;\n },\n): void {\n for (const key of Reflect.ownKeys(source)) {\n const descriptor = Object.getOwnPropertyDescriptor(source, key);\n if (!descriptor) {\n continue;\n }\n\n if (\n key === \"for\" &&\n typeof descriptor.value === \"function\" &&\n options.wrap_for\n ) {\n Object.defineProperty(target, key, {\n configurable: descriptor.configurable ?? true,\n enumerable: descriptor.enumerable ?? false,\n writable: descriptor.writable ?? false,\n value: options.wrap_for,\n });\n continue;\n }\n\n if (\n key === \"enhance\" &&\n typeof descriptor.value === \"function\" &&\n options.wrap_enhance\n ) {\n Object.defineProperty(target, key, {\n configurable: descriptor.configurable ?? true,\n enumerable: descriptor.enumerable ?? false,\n writable: descriptor.writable ?? false,\n value: options.wrap_enhance,\n });\n continue;\n }\n\n if (typeof key === \"symbol\" && typeof descriptor.value === \"function\") {\n Object.defineProperty(target, key, {\n configurable: descriptor.configurable ?? true,\n enumerable: descriptor.enumerable ?? true,\n writable: descriptor.writable ?? true,\n value: wrap_attachment(\n descriptor.value as (\n element: HTMLFormElement,\n ) => void | (() => void),\n options.native,\n options.tracker,\n ),\n });\n continue;\n }\n\n Object.defineProperty(target, key, descriptor);\n }\n}\n\nfunction wrap_enhanced(\n enhanced: Record<string | symbol, unknown>,\n native: Record<string, unknown>,\n tracker: Attached_form_tracker,\n): Record<string | symbol, unknown> {\n const wrapped: Record<string | symbol, unknown> = {};\n copy_native_descriptors(enhanced, wrapped, { native, tracker });\n return wrapped;\n}\n\nfunction wrap_native_form(\n native: Record<string, unknown>,\n decode_payload: Decode_remote_payload,\n dependencies: Form_request_dependencies,\n): Record<string | symbol, unknown> {\n const tracker: Attached_form_tracker = { current: null };\n const wrapped: Record<string | symbol, unknown> = {};\n\n copy_native_descriptors(\n native as Record<string | symbol, unknown>,\n wrapped,\n {\n native,\n tracker,\n wrap_for: (key: string | number) => {\n const native_for = (native as { for?: unknown }).for;\n if (typeof native_for !== \"function\") {\n throw new Error(\n \"Underlying SvelteKit form does not expose a `for` method.\",\n );\n }\n return wrap_native_form(\n (native_for as (key: string | number) => Record<string, unknown>)\n .call(native, key),\n decode_payload,\n dependencies,\n ) as Record<string, unknown>;\n },\n wrap_enhance: (callback) => {\n const native_enhance = (native as { enhance?: unknown }).enhance;\n if (typeof native_enhance !== \"function\") {\n throw new Error(\n \"Underlying SvelteKit form does not expose an `enhance` method.\",\n );\n }\n const enhanced = (native_enhance as (\n cb: typeof callback,\n ) => Record<string | symbol, unknown>).call(native, callback);\n return wrap_enhanced(enhanced, native, tracker);\n },\n },\n );\n\n Object.defineProperty(wrapped, \"native\", {\n configurable: true,\n enumerable: false,\n value: native,\n writable: false,\n });\n\n Object.defineProperty(wrapped, \"submit\", {\n configurable: true,\n enumerable: false,\n writable: false,\n value: (input: unknown) =>\n create_form_submit_effect(\n wrapped as {\n readonly native: {\n readonly action: string;\n readonly result?: unknown;\n readonly fields?: {\n readonly allIssues?: unknown;\n };\n enhance(\n callback: (args: {\n readonly form: HTMLFormElement;\n readonly data: unknown;\n readonly submit: () => Promise<unknown>;\n }) => Promise<void> | void,\n ): Record<string | symbol, unknown>;\n };\n },\n input,\n decode_payload,\n tracker,\n dependencies,\n ),\n });\n\n define_remote_error_decoder(wrapped, decode_payload);\n\n return wrapped;\n}\n\nexport function create_remote_form_adapter(\n native_form_factory: (id: string) => Record<string, unknown>,\n decode_payload: Decode_remote_payload,\n dependencies: Form_request_dependencies,\n) {\n return (id: string) => {\n const native = native_form_factory(id);\n return wrap_native_form(native, decode_payload, dependencies);\n };\n}\n"],"mappings":"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"}
|
|
@@ -309,7 +309,7 @@ function makeInjectedImports(options) {
|
|
|
309
309
|
return lines.join("\n");
|
|
310
310
|
}
|
|
311
311
|
function makeTypedStateBinding(name, stateTypeText) {
|
|
312
|
-
return `let ${name}: ${stateTypeText}
|
|
312
|
+
return `let ${name}: ${stateTypeText} = $state(undefined as unknown as ${stateTypeText});`;
|
|
313
313
|
}
|
|
314
314
|
function create_lowered_declaration_helper(declaration, content) {
|
|
315
315
|
if (declaration.type || !declaration.initializer) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","names":[],"sources":["../../../modules/svelte-effect-runtime/internal/transform.ts"],"sourcesContent":["import MagicString, { type SourceMap } from \"magic-string\";\nimport ts from \"typescript\";\nimport type { EffectPreprocessOptions } from \"$/preprocess.ts\";\n\nconst DEFAULT_RUNTIME_MODULE_ID = \"svelte-effect-runtime\";\nconst DEFAULT_EFFECT_MODULE_ID = \"effect\";\nconst DEFAULT_SVELTE_MODULE_ID = \"svelte\";\n\nconst RUNE_IDENTIFIERS = new Set([\n \"$bindable\",\n \"$derived\",\n \"$effect\",\n \"$host\",\n \"$inspect\",\n \"$props\",\n \"$state\",\n]);\n\ninterface TransformEffectScriptOptions extends EffectPreprocessOptions {\n filename: string;\n}\n\ninterface TransformEffectScriptResult {\n code: string;\n map: SourceMap;\n relocations: Array<TransformRelocation>;\n}\n\ninterface VariableStatementTransform {\n effectTexts: string[];\n hoistedText: string;\n loweredBindings: string[];\n pendingRelocations: Array<PendingRelocation>;\n usesPendingYieldHelper: boolean;\n}\n\ninterface TransformRelocation {\n originalStart: number;\n originalEnd: number;\n generatedStart: number;\n generatedEnd: number;\n}\n\ninterface PendingRelocation {\n originalStart: number;\n originalEnd: number;\n generatedSnippet: string;\n generatedInnerStart: number;\n generatedInnerEnd: number;\n}\n\ninterface StateDeclarationTransform {\n code: string;\n pendingRelocations: Array<PendingRelocation>;\n}\n\ninterface LoweredDeclarationHelper {\n declarationText: string;\n stateTypeText: string;\n assignmentExpression: string;\n expressionRelocation: PendingRelocation;\n tempName?: string;\n}\n\nconst HOISTED_KINDS = new Set<ts.SyntaxKind>([\n ts.SyntaxKind.ClassDeclaration,\n ts.SyntaxKind.EmptyStatement,\n ts.SyntaxKind.EnumDeclaration,\n ts.SyntaxKind.ExportAssignment,\n ts.SyntaxKind.ExportDeclaration,\n ts.SyntaxKind.FunctionDeclaration,\n ts.SyntaxKind.ImportDeclaration,\n ts.SyntaxKind.ImportEqualsDeclaration,\n ts.SyntaxKind.InterfaceDeclaration,\n ts.SyntaxKind.ModuleDeclaration,\n ts.SyntaxKind.TypeAliasDeclaration,\n]);\n\nconst HOISTED_CALL_IDENTIFIERS = new Set([\n \"$effect\",\n \"__svelteEffectRuntimeMarkupOnDestroy\",\n \"onDestroy\",\n]);\n\nexport function transformEffectScript(\n content: string,\n options: TransformEffectScriptOptions,\n): TransformEffectScriptResult {\n const sourceFile = ts.createSourceFile(\n options.filename,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const effectStatements: Array<{ node: ts.Statement; text: string }> = [];\n const runtimeStatements: string[] = [];\n const pendingRelocations: Array<PendingRelocation> = [];\n const magicString = new MagicString(content);\n const effectBoundBindings = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (ts.isVariableStatement(statement)) {\n if (isGeneratedMarkupHelperStatement(statement, content)) {\n continue;\n }\n\n const transformed = transformVariableStatement(\n statement,\n content,\n options.filename,\n effectBoundBindings,\n );\n\n if (transformed.hoistedText.length === 0) {\n magicString.remove(statement.getFullStart(), statement.end);\n } else {\n magicString.overwrite(\n statement.getStart(sourceFile),\n statement.end,\n transformed.hoistedText,\n );\n }\n\n runtimeStatements.push(...transformed.effectTexts);\n pendingRelocations.push(...transformed.pendingRelocations);\n for (const bindingName of transformed.loweredBindings) {\n effectBoundBindings.add(bindingName);\n }\n continue;\n }\n\n if (isHoistedExpressionStatement(statement)) {\n continue;\n }\n\n if (isHoistedStatement(statement)) {\n continue;\n }\n\n if (containsTopLevelAwait(statement)) {\n throw new Error(\n `${options.filename}: top-level await is not supported in <script effect>. Use yield* Effect.promise(...) or yield* Effect.tryPromise(...) instead.`,\n );\n }\n\n effectStatements.push({\n node: statement,\n text: normalizeStatementText(sliceNode(content, statement)),\n });\n pendingRelocations.push({\n originalStart: statement.getStart(sourceFile),\n originalEnd: statement.end,\n generatedSnippet: normalizeStatementText(sliceNode(content, statement)),\n generatedInnerStart: 0,\n generatedInnerEnd: normalizeStatementText(sliceNode(content, statement))\n .length,\n });\n }\n\n for (const statement of [...effectStatements].reverse()) {\n magicString.remove(statement.node.getFullStart(), statement.node.end);\n }\n\n const allRuntimeStatements = [\n ...runtimeStatements,\n ...effectStatements.map((statement) => statement.text),\n ];\n\n if (allRuntimeStatements.length > 0) {\n magicString.prepend(makeInjectedImports(options));\n magicString.append(makeRuntimeBlock(allRuntimeStatements));\n }\n\n const code = magicString.toString();\n\n return {\n code,\n map: magicString.generateMap({\n hires: true,\n includeContent: true,\n source: options.filename,\n }),\n relocations: resolvePendingRelocations(pendingRelocations, code),\n };\n}\n\nfunction isHoistedStatement(statement: ts.Statement): boolean {\n return HOISTED_KINDS.has(statement.kind);\n}\n\nfunction isHoistedExpressionStatement(statement: ts.Statement): boolean {\n if (!ts.isExpressionStatement(statement)) {\n return false;\n }\n\n if (!ts.isCallExpression(statement.expression)) {\n return false;\n }\n\n return getCalledIdentifierText(statement.expression.expression) !==\n undefined &&\n HOISTED_CALL_IDENTIFIERS.has(\n getCalledIdentifierText(statement.expression.expression)!,\n );\n}\n\nfunction getCalledIdentifierText(\n expression: ts.Expression,\n): string | undefined {\n if (ts.isIdentifier(expression)) {\n return expression.text;\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n const base = getCalledIdentifierText(expression.expression);\n return base ? `${base}.${expression.name.text}` : expression.name.text;\n }\n\n return undefined;\n}\n\nfunction transformVariableStatement(\n statement: ts.VariableStatement,\n content: string,\n filename: string,\n effectBoundBindings: ReadonlySet<string>,\n): VariableStatementTransform {\n if ((statement.modifiers?.length ?? 0) > 0) {\n validateModifiedVariableStatement(statement, content, filename);\n return {\n effectTexts: [],\n hoistedText: normalizeStatementText(sliceNode(content, statement)),\n loweredBindings: [],\n pendingRelocations: [],\n usesPendingYieldHelper: false,\n };\n }\n\n const effectTexts: string[] = [];\n const hoistedDeclarations: string[] = [];\n const loweredBindings: string[] = [];\n const pendingRelocations: Array<PendingRelocation> = [];\n\n for (const declaration of statement.declarationList.declarations) {\n if (\n declaration.initializer && containsTopLevelAwait(declaration.initializer)\n ) {\n const statementText = normalizeStatementText(\n sliceNode(content, statement),\n );\n\n throw new Error(\n `${filename}: declarations in <script effect> cannot depend on await.\\nUse yield* Effect.promise(...) or yield* Effect.tryPromise(...) instead.\\n\\nProblematic statement:\\n${statementText}`,\n );\n }\n\n if (declaration.initializer && isRuneInitializer(declaration.initializer)) {\n const renderedDeclaration =\n `${getDeclarationKind(statement.declarationList.flags)} ${\n normalizeStatementText(sliceNode(content, declaration))\n };`;\n hoistedDeclarations.push(renderedDeclaration);\n pendingRelocations.push(\n ...make_declaration_relocations(declaration, renderedDeclaration, content),\n );\n continue;\n }\n\n if (\n shouldHoistDeclaration(\n statement.declarationList.flags,\n declaration,\n effectBoundBindings,\n )\n ) {\n const renderedDeclaration =\n `${getDeclarationKind(statement.declarationList.flags)} ${\n normalizeStatementText(sliceNode(content, declaration))\n };`;\n hoistedDeclarations.push(renderedDeclaration);\n pendingRelocations.push(\n ...make_declaration_relocations(declaration, renderedDeclaration, content),\n );\n continue;\n }\n\n const bindingNames = extractBindingNames(declaration.name);\n const helper = create_lowered_declaration_helper(declaration, content);\n\n if (helper) {\n hoistedDeclarations.push(helper.declarationText);\n pendingRelocations.push(helper.expressionRelocation);\n }\n\n if (helper?.tempName) {\n hoistedDeclarations.push(\n makeTypedStateBinding(helper.tempName, helper.stateTypeText),\n );\n }\n\n for (const bindingName of bindingNames) {\n const stateDeclaration = makeStateDeclaration(\n bindingName,\n declaration,\n content,\n helper?.tempName ? null : helper?.stateTypeText,\n );\n hoistedDeclarations.push(stateDeclaration.code);\n pendingRelocations.push(...stateDeclaration.pendingRelocations);\n }\n loweredBindings.push(...bindingNames);\n\n if (declaration.initializer) {\n if (helper?.tempName) {\n effectTexts.push(`${helper.tempName} = ${helper.assignmentExpression};`);\n effectTexts.push(\n makeEffectAssignment(\n declaration.name,\n helper.tempName,\n content,\n ),\n );\n } else {\n const effectAssignment = helper\n ? `${bindingNames[0]} = ${helper.assignmentExpression};`\n : makeEffectAssignment(\n declaration.name,\n declaration.initializer,\n content,\n );\n effectTexts.push(effectAssignment);\n if (!helper) {\n pendingRelocations.push(\n makeEffectAssignmentRelocation(\n declaration.initializer,\n effectAssignment,\n content,\n ),\n );\n }\n }\n }\n }\n\n return {\n effectTexts,\n hoistedText: hoistedDeclarations.join(\"\\n\"),\n loweredBindings,\n pendingRelocations,\n usesPendingYieldHelper: false,\n };\n}\n\nfunction shouldHoistDeclaration(\n flags: ts.NodeFlags,\n declaration: ts.VariableDeclaration,\n effectBoundBindings: ReadonlySet<string>,\n): boolean {\n if ((flags & ts.NodeFlags.Const) === 0) {\n return false;\n }\n\n if (!declaration.initializer) {\n return false;\n }\n\n if (\n containsYieldStar(declaration.initializer) ||\n containsTopLevelAwait(declaration.initializer)\n ) {\n return false;\n }\n\n return !referencesEffectBoundBindings(\n declaration.initializer,\n effectBoundBindings,\n );\n}\n\nfunction referencesEffectBoundBindings(\n node: ts.Node,\n effectBoundBindings: ReadonlySet<string>,\n): boolean {\n const localScopes: Array<Set<string>> = [new Set()];\n let found = false;\n\n const visit = (current: ts.Node): void => {\n if (found) {\n return;\n }\n\n if (\n ts.isArrowFunction(current) || ts.isFunctionDeclaration(current) ||\n ts.isFunctionExpression(current)\n ) {\n const scope = new Set<string>();\n\n if (current.name) {\n scope.add(current.name.text);\n }\n\n for (const parameter of current.parameters) {\n declareBindingInto(scope, parameter.name);\n }\n\n localScopes.unshift(scope);\n current.forEachChild(visit);\n localScopes.shift();\n return;\n }\n\n if (ts.isIdentifier(current)) {\n if (\n !isSkippedReference(current) &&\n effectBoundBindings.has(current.text) &&\n !localScopes.some((scope) => scope.has(current.text))\n ) {\n found = true;\n }\n\n return;\n }\n\n current.forEachChild(visit);\n };\n\n const declareBindingInto = (\n scope: Set<string>,\n name: ts.BindingName,\n ): void => {\n if (ts.isIdentifier(name)) {\n scope.add(name.text);\n return;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n declareBindingInto(scope, element.name);\n }\n };\n\n visit(node);\n return found;\n}\n\nfunction isSkippedReference(identifier: ts.Identifier): boolean {\n const parent = identifier.parent;\n\n return ts.isPropertyAccessExpression(parent) && parent.name === identifier ||\n ts.isPropertyAssignment(parent) && parent.name === identifier ||\n ts.isShorthandPropertyAssignment(parent) &&\n parent.objectAssignmentInitializer === identifier ||\n ts.isBindingElement(parent) && parent.propertyName === identifier ||\n ts.isImportSpecifier(parent) ||\n ts.isExportSpecifier(parent) ||\n ts.isLabeledStatement(parent) && parent.label === identifier;\n}\n\nfunction isGeneratedMarkupHelperStatement(\n statement: ts.VariableStatement,\n content: string,\n): boolean {\n return statement.declarationList.declarations.every((declaration) =>\n extractBindingNames(declaration.name).every((name) =>\n name.startsWith(\"__svelteEffectRuntimeMarkup\")\n ) ||\n normalizeStatementText(sliceNode(content, declaration)).startsWith(\n \"__svelteEffectRuntimeMarkup\",\n )\n );\n}\n\nfunction validateModifiedVariableStatement(\n statement: ts.VariableStatement,\n content: string,\n filename: string,\n): void {\n for (const declaration of statement.declarationList.declarations) {\n if (\n declaration.initializer &&\n (containsYieldStar(declaration.initializer) ||\n containsTopLevelAwait(declaration.initializer))\n ) {\n const statementText = normalizeStatementText(\n sliceNode(content, statement),\n );\n\n throw new Error(\n `${filename}: declarations with modifiers cannot depend on yield* or await in <script effect> right now.\\nSplit the declaration into a plain top-level binding and assign inside the effect body instead.\\n\\nProblematic statement:\\n${statementText}`,\n );\n }\n }\n}\n\nfunction getDeclarationKind(flags: ts.NodeFlags): \"const\" | \"let\" | \"var\" {\n if ((flags & ts.NodeFlags.Const) !== 0) {\n return \"const\";\n }\n\n if ((flags & ts.NodeFlags.Let) !== 0) {\n return \"let\";\n }\n\n return \"var\";\n}\n\nfunction makeStateDeclaration(\n name: string,\n declaration: ts.VariableDeclaration,\n content: string,\n inferredTypeText?: string | null,\n): StateDeclarationTransform {\n let stateTypeText: string | null = null;\n\n if (ts.isIdentifier(declaration.name) && declaration.type) {\n stateTypeText = normalizeStatementText(\n sliceNode(content, declaration.type),\n );\n } else if (inferredTypeText) {\n stateTypeText = inferredTypeText;\n }\n\n const code = stateTypeText\n ? makeTypedStateBinding(name, stateTypeText)\n : `let ${name} = $state<any>(undefined);`;\n\n const nameStart = code.indexOf(name);\n const pendingRelocations: Array<PendingRelocation> = [{\n originalStart: find_binding_name_start(declaration.name, name),\n originalEnd: find_binding_name_end(declaration.name, name),\n generatedSnippet: \"\",\n generatedInnerStart: nameStart,\n generatedInnerEnd: nameStart + name.length,\n }];\n\n pendingRelocations[0] = {\n ...pendingRelocations[0],\n generatedSnippet: code,\n };\n\n return {\n code,\n pendingRelocations,\n };\n}\n\nfunction makeEffectAssignment(\n name: ts.BindingName,\n initializer: ts.Expression | string,\n content: string,\n): string {\n const target = normalizeStatementText(sliceNode(content, name));\n const expression = typeof initializer === \"string\"\n ? initializer\n : normalizeStatementText(sliceNode(content, initializer));\n\n if (ts.isIdentifier(name)) {\n return `${target} = ${expression};`;\n }\n\n return `(${target} = ${expression});`;\n}\n\nfunction makeEffectAssignmentRelocation(\n initializer: ts.Expression,\n effectAssignment: string,\n content: string,\n): PendingRelocation {\n const expression = normalizeStatementText(sliceNode(content, initializer));\n const generatedInnerStart = effectAssignment.lastIndexOf(expression);\n\n return {\n originalStart: initializer.getStart(),\n originalEnd: initializer.end,\n generatedSnippet: effectAssignment,\n generatedInnerStart,\n generatedInnerEnd: generatedInnerStart + expression.length,\n };\n}\n\nfunction extractBindingNames(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) {\n return [name.text];\n }\n\n const names: string[] = [];\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n names.push(...extractBindingNames(element.name));\n }\n\n return names;\n}\n\nfunction isRuneInitializer(expression: ts.Expression): boolean {\n if (!ts.isCallExpression(expression)) {\n return false;\n }\n\n return isRuneCallee(expression.expression);\n}\n\nfunction isRuneCallee(expression: ts.Expression): boolean {\n if (ts.isIdentifier(expression)) {\n return RUNE_IDENTIFIERS.has(expression.text);\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n return isRuneCallee(expression.expression);\n }\n\n return false;\n}\n\nfunction containsYieldStar(node: ts.Node): boolean {\n if (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n ) {\n return true;\n }\n\n return node.getChildren().some((child) =>\n isFunctionBoundary(child) ? false : containsYieldStar(child)\n );\n}\n\nfunction getYieldOperand(node: ts.Node | undefined): ts.Expression | null {\n if (\n node &&\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n ) {\n return node.right;\n }\n\n return null;\n}\n\nfunction containsTopLevelAwait(node: ts.Node): boolean {\n if (ts.isAwaitExpression(node)) {\n return true;\n }\n\n return node.getChildren().some((child) =>\n isFunctionBoundary(child) ? false : containsTopLevelAwait(child)\n );\n}\n\nfunction isFunctionBoundary(node: ts.Node): boolean {\n return ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node);\n}\n\nfunction sliceNode(content: string, node: ts.Node): string {\n return content.slice(node.getFullStart(), node.end);\n}\n\nfunction normalizeStatementText(text: string): string {\n return text.trim();\n}\n\nfunction indentBlock(text: string, indent: string): string {\n return text.split(\"\\n\").map((line) =>\n line.length > 0 ? `${indent}${line}` : line\n ).join(\"\\n\");\n}\n\nfunction makeInjectedImports(\n options: TransformEffectScriptOptions,\n): string {\n const runtimeModuleId = options.runtimeModuleId ?? DEFAULT_RUNTIME_MODULE_ID;\n const effectModuleId = options.effectModuleId ?? DEFAULT_EFFECT_MODULE_ID;\n const svelteModuleId = options.svelteModuleId ?? DEFAULT_SVELTE_MODULE_ID;\n\n const lines = [\n `import { onMount as __svelteEffectRuntimeOnMount } from \"${svelteModuleId}\";`,\n `import { Effect as __svelteEffectRuntimeEffect } from \"${effectModuleId}\";`,\n `import { get_effect_runtime_or_throw as __svelteEffectRuntimeGetRuntime, run_component_effect as __svelteEffectRuntimeRunComponentEffect } from \"${runtimeModuleId}\";`,\n `type __svelteEffectRuntimeYielded<T> = T extends __svelteEffectRuntimeEffect.Effect<infer A, any, any> ? A : T;`,\n ];\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction makeTypedStateBinding(name: string, stateTypeText: string): string {\n return `let ${name}: ${stateTypeText} | undefined = $state(undefined as ${stateTypeText} | undefined);`;\n}\n\nfunction create_lowered_declaration_helper(\n declaration: ts.VariableDeclaration,\n content: string,\n): LoweredDeclarationHelper | null {\n if (declaration.type || !declaration.initializer) {\n return null;\n }\n\n const bindingNames = extractBindingNames(declaration.name);\n const suffix = declaration.getStart();\n const baseName = bindingNames[0] ?? \"binding\";\n const helperName = `__svelteEffectRuntime_${baseName}_${suffix}`;\n const expressionNode = getYieldOperand(declaration.initializer) ??\n declaration.initializer;\n const expressionText = normalizeStatementText(sliceNode(content, expressionNode));\n const declarationText = `const ${helperName} = () => ${expressionText};`;\n const yieldedExpression = getYieldOperand(declaration.initializer);\n const stateTypeText = yieldedExpression\n ? `__svelteEffectRuntimeYielded<ReturnType<typeof ${helperName}>>`\n : `ReturnType<typeof ${helperName}>`;\n const assignmentExpression = yieldedExpression\n ? `yield* ${helperName}()`\n : `${helperName}()`;\n\n return {\n declarationText,\n stateTypeText,\n assignmentExpression,\n tempName: ts.isIdentifier(declaration.name)\n ? undefined\n : `__svelteEffectRuntimeTemp_${suffix}`,\n expressionRelocation: {\n originalStart: expressionNode.getStart(),\n originalEnd: expressionNode.end,\n generatedSnippet: declarationText,\n generatedInnerStart: declarationText.lastIndexOf(expressionText),\n generatedInnerEnd: declarationText.lastIndexOf(expressionText) +\n expressionText.length,\n },\n };\n}\n\nfunction make_declaration_relocations(\n declaration: ts.VariableDeclaration,\n renderedDeclaration: string,\n content: string,\n): Array<PendingRelocation> {\n const relocations: Array<PendingRelocation> = [];\n\n if (ts.isIdentifier(declaration.name)) {\n const nameStart = renderedDeclaration.indexOf(declaration.name.text);\n relocations.push({\n originalStart: declaration.name.getStart(),\n originalEnd: declaration.name.end,\n generatedSnippet: renderedDeclaration,\n generatedInnerStart: nameStart,\n generatedInnerEnd: nameStart + declaration.name.text.length,\n });\n }\n\n if (declaration.initializer) {\n const initializerText = normalizeStatementText(\n sliceNode(content, declaration.initializer),\n );\n const initializerStart = renderedDeclaration.lastIndexOf(initializerText);\n if (initializerStart >= 0) {\n relocations.push({\n originalStart: declaration.initializer.getStart(),\n originalEnd: declaration.initializer.end,\n generatedSnippet: renderedDeclaration,\n generatedInnerStart: initializerStart,\n generatedInnerEnd: initializerStart + initializerText.length,\n });\n }\n }\n\n return relocations;\n}\n\nfunction find_binding_name_start(name: ts.BindingName, bindingName: string): number {\n if (ts.isIdentifier(name)) {\n return name.text === bindingName ? name.getStart() : -1;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n const start = find_binding_name_start(element.name, bindingName);\n if (start !== -1) {\n return start;\n }\n }\n\n return -1;\n}\n\nfunction find_binding_name_end(name: ts.BindingName, bindingName: string): number {\n if (ts.isIdentifier(name)) {\n return name.text === bindingName ? name.end : -1;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n const end = find_binding_name_end(element.name, bindingName);\n if (end !== -1) {\n return end;\n }\n }\n\n return -1;\n}\n\nfunction makeRuntimeBlock(statements: string[]): string {\n const body = statements.map((statement) => indentBlock(statement, \" \"))\n .join(\"\\n\\n\");\n\n return [\n \"\",\n \"const __svelteEffectRuntimeProgram = __svelteEffectRuntimeEffect.gen(function* () {\",\n body,\n \"});\",\n \"\",\n \"__svelteEffectRuntimeOnMount(() => {\",\n \" const __svelteEffectRuntimeCleanup = __svelteEffectRuntimeRunComponentEffect(\",\n \" __svelteEffectRuntimeGetRuntime(),\",\n \" __svelteEffectRuntimeProgram,\",\n \" );\",\n \"\",\n \" import.meta.hot?.dispose(__svelteEffectRuntimeCleanup);\",\n \" return __svelteEffectRuntimeCleanup;\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction resolvePendingRelocations(\n pendingRelocations: Array<PendingRelocation>,\n code: string,\n): Array<TransformRelocation> {\n const relocations: Array<TransformRelocation> = [];\n let searchStart = 0;\n\n for (const relocation of pendingRelocations) {\n const generatedStart = code.indexOf(relocation.generatedSnippet, searchStart);\n\n if (generatedStart === -1) {\n continue;\n }\n\n searchStart = generatedStart + relocation.generatedSnippet.length;\n relocations.push({\n originalStart: relocation.originalStart,\n originalEnd: relocation.originalEnd,\n generatedStart: generatedStart + relocation.generatedInnerStart,\n generatedEnd: generatedStart + relocation.generatedInnerEnd,\n });\n }\n\n return relocations;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transform.js","names":[],"sources":["../../../modules/svelte-effect-runtime/internal/transform.ts"],"sourcesContent":["import MagicString, { type SourceMap } from \"magic-string\";\nimport ts from \"typescript\";\nimport type { EffectPreprocessOptions } from \"$/preprocess.ts\";\n\nconst DEFAULT_RUNTIME_MODULE_ID = \"svelte-effect-runtime\";\nconst DEFAULT_EFFECT_MODULE_ID = \"effect\";\nconst DEFAULT_SVELTE_MODULE_ID = \"svelte\";\n\nconst RUNE_IDENTIFIERS = new Set([\n \"$bindable\",\n \"$derived\",\n \"$effect\",\n \"$host\",\n \"$inspect\",\n \"$props\",\n \"$state\",\n]);\n\ninterface TransformEffectScriptOptions extends EffectPreprocessOptions {\n filename: string;\n}\n\ninterface TransformEffectScriptResult {\n code: string;\n map: SourceMap;\n relocations: Array<TransformRelocation>;\n}\n\ninterface VariableStatementTransform {\n effectTexts: string[];\n hoistedText: string;\n loweredBindings: string[];\n pendingRelocations: Array<PendingRelocation>;\n usesPendingYieldHelper: boolean;\n}\n\ninterface TransformRelocation {\n originalStart: number;\n originalEnd: number;\n generatedStart: number;\n generatedEnd: number;\n}\n\ninterface PendingRelocation {\n originalStart: number;\n originalEnd: number;\n generatedSnippet: string;\n generatedInnerStart: number;\n generatedInnerEnd: number;\n}\n\ninterface StateDeclarationTransform {\n code: string;\n pendingRelocations: Array<PendingRelocation>;\n}\n\ninterface LoweredDeclarationHelper {\n declarationText: string;\n stateTypeText: string;\n assignmentExpression: string;\n expressionRelocation: PendingRelocation;\n tempName?: string;\n}\n\nconst HOISTED_KINDS = new Set<ts.SyntaxKind>([\n ts.SyntaxKind.ClassDeclaration,\n ts.SyntaxKind.EmptyStatement,\n ts.SyntaxKind.EnumDeclaration,\n ts.SyntaxKind.ExportAssignment,\n ts.SyntaxKind.ExportDeclaration,\n ts.SyntaxKind.FunctionDeclaration,\n ts.SyntaxKind.ImportDeclaration,\n ts.SyntaxKind.ImportEqualsDeclaration,\n ts.SyntaxKind.InterfaceDeclaration,\n ts.SyntaxKind.ModuleDeclaration,\n ts.SyntaxKind.TypeAliasDeclaration,\n]);\n\nconst HOISTED_CALL_IDENTIFIERS = new Set([\n \"$effect\",\n \"__svelteEffectRuntimeMarkupOnDestroy\",\n \"onDestroy\",\n]);\n\nexport function transformEffectScript(\n content: string,\n options: TransformEffectScriptOptions,\n): TransformEffectScriptResult {\n const sourceFile = ts.createSourceFile(\n options.filename,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS,\n );\n\n const effectStatements: Array<{ node: ts.Statement; text: string }> = [];\n const runtimeStatements: string[] = [];\n const pendingRelocations: Array<PendingRelocation> = [];\n const magicString = new MagicString(content);\n const effectBoundBindings = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (ts.isVariableStatement(statement)) {\n if (isGeneratedMarkupHelperStatement(statement, content)) {\n continue;\n }\n\n const transformed = transformVariableStatement(\n statement,\n content,\n options.filename,\n effectBoundBindings,\n );\n\n if (transformed.hoistedText.length === 0) {\n magicString.remove(statement.getFullStart(), statement.end);\n } else {\n magicString.overwrite(\n statement.getStart(sourceFile),\n statement.end,\n transformed.hoistedText,\n );\n }\n\n runtimeStatements.push(...transformed.effectTexts);\n pendingRelocations.push(...transformed.pendingRelocations);\n for (const bindingName of transformed.loweredBindings) {\n effectBoundBindings.add(bindingName);\n }\n continue;\n }\n\n if (isHoistedExpressionStatement(statement)) {\n continue;\n }\n\n if (isHoistedStatement(statement)) {\n continue;\n }\n\n if (containsTopLevelAwait(statement)) {\n throw new Error(\n `${options.filename}: top-level await is not supported in <script effect>. Use yield* Effect.promise(...) or yield* Effect.tryPromise(...) instead.`,\n );\n }\n\n effectStatements.push({\n node: statement,\n text: normalizeStatementText(sliceNode(content, statement)),\n });\n pendingRelocations.push({\n originalStart: statement.getStart(sourceFile),\n originalEnd: statement.end,\n generatedSnippet: normalizeStatementText(sliceNode(content, statement)),\n generatedInnerStart: 0,\n generatedInnerEnd: normalizeStatementText(sliceNode(content, statement))\n .length,\n });\n }\n\n for (const statement of [...effectStatements].reverse()) {\n magicString.remove(statement.node.getFullStart(), statement.node.end);\n }\n\n const allRuntimeStatements = [\n ...runtimeStatements,\n ...effectStatements.map((statement) => statement.text),\n ];\n\n if (allRuntimeStatements.length > 0) {\n magicString.prepend(makeInjectedImports(options));\n magicString.append(makeRuntimeBlock(allRuntimeStatements));\n }\n\n const code = magicString.toString();\n\n return {\n code,\n map: magicString.generateMap({\n hires: true,\n includeContent: true,\n source: options.filename,\n }),\n relocations: resolvePendingRelocations(pendingRelocations, code),\n };\n}\n\nfunction isHoistedStatement(statement: ts.Statement): boolean {\n return HOISTED_KINDS.has(statement.kind);\n}\n\nfunction isHoistedExpressionStatement(statement: ts.Statement): boolean {\n if (!ts.isExpressionStatement(statement)) {\n return false;\n }\n\n if (!ts.isCallExpression(statement.expression)) {\n return false;\n }\n\n return getCalledIdentifierText(statement.expression.expression) !==\n undefined &&\n HOISTED_CALL_IDENTIFIERS.has(\n getCalledIdentifierText(statement.expression.expression)!,\n );\n}\n\nfunction getCalledIdentifierText(\n expression: ts.Expression,\n): string | undefined {\n if (ts.isIdentifier(expression)) {\n return expression.text;\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n const base = getCalledIdentifierText(expression.expression);\n return base ? `${base}.${expression.name.text}` : expression.name.text;\n }\n\n return undefined;\n}\n\nfunction transformVariableStatement(\n statement: ts.VariableStatement,\n content: string,\n filename: string,\n effectBoundBindings: ReadonlySet<string>,\n): VariableStatementTransform {\n if ((statement.modifiers?.length ?? 0) > 0) {\n validateModifiedVariableStatement(statement, content, filename);\n return {\n effectTexts: [],\n hoistedText: normalizeStatementText(sliceNode(content, statement)),\n loweredBindings: [],\n pendingRelocations: [],\n usesPendingYieldHelper: false,\n };\n }\n\n const effectTexts: string[] = [];\n const hoistedDeclarations: string[] = [];\n const loweredBindings: string[] = [];\n const pendingRelocations: Array<PendingRelocation> = [];\n\n for (const declaration of statement.declarationList.declarations) {\n if (\n declaration.initializer && containsTopLevelAwait(declaration.initializer)\n ) {\n const statementText = normalizeStatementText(\n sliceNode(content, statement),\n );\n\n throw new Error(\n `${filename}: declarations in <script effect> cannot depend on await.\\nUse yield* Effect.promise(...) or yield* Effect.tryPromise(...) instead.\\n\\nProblematic statement:\\n${statementText}`,\n );\n }\n\n if (declaration.initializer && isRuneInitializer(declaration.initializer)) {\n const renderedDeclaration = `${\n getDeclarationKind(statement.declarationList.flags)\n } ${normalizeStatementText(sliceNode(content, declaration))};`;\n hoistedDeclarations.push(renderedDeclaration);\n pendingRelocations.push(\n ...make_declaration_relocations(\n declaration,\n renderedDeclaration,\n content,\n ),\n );\n continue;\n }\n\n if (\n shouldHoistDeclaration(\n statement.declarationList.flags,\n declaration,\n effectBoundBindings,\n )\n ) {\n const renderedDeclaration = `${\n getDeclarationKind(statement.declarationList.flags)\n } ${normalizeStatementText(sliceNode(content, declaration))};`;\n hoistedDeclarations.push(renderedDeclaration);\n pendingRelocations.push(\n ...make_declaration_relocations(\n declaration,\n renderedDeclaration,\n content,\n ),\n );\n continue;\n }\n\n const bindingNames = extractBindingNames(declaration.name);\n const helper = create_lowered_declaration_helper(declaration, content);\n\n if (helper) {\n hoistedDeclarations.push(helper.declarationText);\n pendingRelocations.push(helper.expressionRelocation);\n }\n\n if (helper?.tempName) {\n hoistedDeclarations.push(\n makeTypedStateBinding(helper.tempName, helper.stateTypeText),\n );\n }\n\n for (const bindingName of bindingNames) {\n const stateDeclaration = makeStateDeclaration(\n bindingName,\n declaration,\n content,\n helper?.tempName ? null : helper?.stateTypeText,\n );\n hoistedDeclarations.push(stateDeclaration.code);\n pendingRelocations.push(...stateDeclaration.pendingRelocations);\n }\n loweredBindings.push(...bindingNames);\n\n if (declaration.initializer) {\n if (helper?.tempName) {\n effectTexts.push(\n `${helper.tempName} = ${helper.assignmentExpression};`,\n );\n effectTexts.push(\n makeEffectAssignment(\n declaration.name,\n helper.tempName,\n content,\n ),\n );\n } else {\n const effectAssignment = helper\n ? `${bindingNames[0]} = ${helper.assignmentExpression};`\n : makeEffectAssignment(\n declaration.name,\n declaration.initializer,\n content,\n );\n effectTexts.push(effectAssignment);\n if (!helper) {\n pendingRelocations.push(\n makeEffectAssignmentRelocation(\n declaration.initializer,\n effectAssignment,\n content,\n ),\n );\n }\n }\n }\n }\n\n return {\n effectTexts,\n hoistedText: hoistedDeclarations.join(\"\\n\"),\n loweredBindings,\n pendingRelocations,\n usesPendingYieldHelper: false,\n };\n}\n\nfunction shouldHoistDeclaration(\n flags: ts.NodeFlags,\n declaration: ts.VariableDeclaration,\n effectBoundBindings: ReadonlySet<string>,\n): boolean {\n if ((flags & ts.NodeFlags.Const) === 0) {\n return false;\n }\n\n if (!declaration.initializer) {\n return false;\n }\n\n if (\n containsYieldStar(declaration.initializer) ||\n containsTopLevelAwait(declaration.initializer)\n ) {\n return false;\n }\n\n return !referencesEffectBoundBindings(\n declaration.initializer,\n effectBoundBindings,\n );\n}\n\nfunction referencesEffectBoundBindings(\n node: ts.Node,\n effectBoundBindings: ReadonlySet<string>,\n): boolean {\n const localScopes: Array<Set<string>> = [new Set()];\n let found = false;\n\n const visit = (current: ts.Node): void => {\n if (found) {\n return;\n }\n\n if (\n ts.isArrowFunction(current) || ts.isFunctionDeclaration(current) ||\n ts.isFunctionExpression(current)\n ) {\n const scope = new Set<string>();\n\n if (current.name) {\n scope.add(current.name.text);\n }\n\n for (const parameter of current.parameters) {\n declareBindingInto(scope, parameter.name);\n }\n\n localScopes.unshift(scope);\n current.forEachChild(visit);\n localScopes.shift();\n return;\n }\n\n if (ts.isIdentifier(current)) {\n if (\n !isSkippedReference(current) &&\n effectBoundBindings.has(current.text) &&\n !localScopes.some((scope) => scope.has(current.text))\n ) {\n found = true;\n }\n\n return;\n }\n\n current.forEachChild(visit);\n };\n\n const declareBindingInto = (\n scope: Set<string>,\n name: ts.BindingName,\n ): void => {\n if (ts.isIdentifier(name)) {\n scope.add(name.text);\n return;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n declareBindingInto(scope, element.name);\n }\n };\n\n visit(node);\n return found;\n}\n\nfunction isSkippedReference(identifier: ts.Identifier): boolean {\n const parent = identifier.parent;\n\n return ts.isPropertyAccessExpression(parent) && parent.name === identifier ||\n ts.isPropertyAssignment(parent) && parent.name === identifier ||\n ts.isShorthandPropertyAssignment(parent) &&\n parent.objectAssignmentInitializer === identifier ||\n ts.isBindingElement(parent) && parent.propertyName === identifier ||\n ts.isImportSpecifier(parent) ||\n ts.isExportSpecifier(parent) ||\n ts.isLabeledStatement(parent) && parent.label === identifier;\n}\n\nfunction isGeneratedMarkupHelperStatement(\n statement: ts.VariableStatement,\n content: string,\n): boolean {\n return statement.declarationList.declarations.every((declaration) =>\n extractBindingNames(declaration.name).every((name) =>\n name.startsWith(\"__svelteEffectRuntimeMarkup\")\n ) ||\n normalizeStatementText(sliceNode(content, declaration)).startsWith(\n \"__svelteEffectRuntimeMarkup\",\n )\n );\n}\n\nfunction validateModifiedVariableStatement(\n statement: ts.VariableStatement,\n content: string,\n filename: string,\n): void {\n for (const declaration of statement.declarationList.declarations) {\n if (\n declaration.initializer &&\n (containsYieldStar(declaration.initializer) ||\n containsTopLevelAwait(declaration.initializer))\n ) {\n const statementText = normalizeStatementText(\n sliceNode(content, statement),\n );\n\n throw new Error(\n `${filename}: declarations with modifiers cannot depend on yield* or await in <script effect> right now.\\nSplit the declaration into a plain top-level binding and assign inside the effect body instead.\\n\\nProblematic statement:\\n${statementText}`,\n );\n }\n }\n}\n\nfunction getDeclarationKind(flags: ts.NodeFlags): \"const\" | \"let\" | \"var\" {\n if ((flags & ts.NodeFlags.Const) !== 0) {\n return \"const\";\n }\n\n if ((flags & ts.NodeFlags.Let) !== 0) {\n return \"let\";\n }\n\n return \"var\";\n}\n\nfunction makeStateDeclaration(\n name: string,\n declaration: ts.VariableDeclaration,\n content: string,\n inferredTypeText?: string | null,\n): StateDeclarationTransform {\n let stateTypeText: string | null = null;\n\n if (ts.isIdentifier(declaration.name) && declaration.type) {\n stateTypeText = normalizeStatementText(\n sliceNode(content, declaration.type),\n );\n } else if (inferredTypeText) {\n stateTypeText = inferredTypeText;\n }\n\n const code = stateTypeText\n ? makeTypedStateBinding(name, stateTypeText)\n : `let ${name} = $state<any>(undefined);`;\n\n const nameStart = code.indexOf(name);\n const pendingRelocations: Array<PendingRelocation> = [{\n originalStart: find_binding_name_start(declaration.name, name),\n originalEnd: find_binding_name_end(declaration.name, name),\n generatedSnippet: \"\",\n generatedInnerStart: nameStart,\n generatedInnerEnd: nameStart + name.length,\n }];\n\n pendingRelocations[0] = {\n ...pendingRelocations[0],\n generatedSnippet: code,\n };\n\n return {\n code,\n pendingRelocations,\n };\n}\n\nfunction makeEffectAssignment(\n name: ts.BindingName,\n initializer: ts.Expression | string,\n content: string,\n): string {\n const target = normalizeStatementText(sliceNode(content, name));\n const expression = typeof initializer === \"string\"\n ? initializer\n : normalizeStatementText(sliceNode(content, initializer));\n\n if (ts.isIdentifier(name)) {\n return `${target} = ${expression};`;\n }\n\n return `(${target} = ${expression});`;\n}\n\nfunction makeEffectAssignmentRelocation(\n initializer: ts.Expression,\n effectAssignment: string,\n content: string,\n): PendingRelocation {\n const expression = normalizeStatementText(sliceNode(content, initializer));\n const generatedInnerStart = effectAssignment.lastIndexOf(expression);\n\n return {\n originalStart: initializer.getStart(),\n originalEnd: initializer.end,\n generatedSnippet: effectAssignment,\n generatedInnerStart,\n generatedInnerEnd: generatedInnerStart + expression.length,\n };\n}\n\nfunction extractBindingNames(name: ts.BindingName): string[] {\n if (ts.isIdentifier(name)) {\n return [name.text];\n }\n\n const names: string[] = [];\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n names.push(...extractBindingNames(element.name));\n }\n\n return names;\n}\n\nfunction isRuneInitializer(expression: ts.Expression): boolean {\n if (!ts.isCallExpression(expression)) {\n return false;\n }\n\n return isRuneCallee(expression.expression);\n}\n\nfunction isRuneCallee(expression: ts.Expression): boolean {\n if (ts.isIdentifier(expression)) {\n return RUNE_IDENTIFIERS.has(expression.text);\n }\n\n if (ts.isPropertyAccessExpression(expression)) {\n return isRuneCallee(expression.expression);\n }\n\n return false;\n}\n\nfunction containsYieldStar(node: ts.Node): boolean {\n if (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n ) {\n return true;\n }\n\n return node.getChildren().some((child) =>\n isFunctionBoundary(child) ? false : containsYieldStar(child)\n );\n}\n\nfunction getYieldOperand(node: ts.Node | undefined): ts.Expression | null {\n if (\n node &&\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AsteriskToken &&\n ts.isIdentifier(node.left) &&\n node.left.text === \"yield\"\n ) {\n return node.right;\n }\n\n return null;\n}\n\nfunction containsTopLevelAwait(node: ts.Node): boolean {\n if (ts.isAwaitExpression(node)) {\n return true;\n }\n\n return node.getChildren().some((child) =>\n isFunctionBoundary(child) ? false : containsTopLevelAwait(child)\n );\n}\n\nfunction isFunctionBoundary(node: ts.Node): boolean {\n return ts.isArrowFunction(node) ||\n ts.isFunctionDeclaration(node) ||\n ts.isFunctionExpression(node) ||\n ts.isMethodDeclaration(node) ||\n ts.isGetAccessorDeclaration(node) ||\n ts.isSetAccessorDeclaration(node);\n}\n\nfunction sliceNode(content: string, node: ts.Node): string {\n return content.slice(node.getFullStart(), node.end);\n}\n\nfunction normalizeStatementText(text: string): string {\n return text.trim();\n}\n\nfunction indentBlock(text: string, indent: string): string {\n return text.split(\"\\n\").map((line) =>\n line.length > 0 ? `${indent}${line}` : line\n ).join(\"\\n\");\n}\n\nfunction makeInjectedImports(\n options: TransformEffectScriptOptions,\n): string {\n const runtimeModuleId = options.runtimeModuleId ?? DEFAULT_RUNTIME_MODULE_ID;\n const effectModuleId = options.effectModuleId ?? DEFAULT_EFFECT_MODULE_ID;\n const svelteModuleId = options.svelteModuleId ?? DEFAULT_SVELTE_MODULE_ID;\n\n const lines = [\n `import { onMount as __svelteEffectRuntimeOnMount } from \"${svelteModuleId}\";`,\n `import { Effect as __svelteEffectRuntimeEffect } from \"${effectModuleId}\";`,\n `import { get_effect_runtime_or_throw as __svelteEffectRuntimeGetRuntime, run_component_effect as __svelteEffectRuntimeRunComponentEffect } from \"${runtimeModuleId}\";`,\n `type __svelteEffectRuntimeYielded<T> = T extends __svelteEffectRuntimeEffect.Effect<infer A, any, any> ? A : T;`,\n ];\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction makeTypedStateBinding(name: string, stateTypeText: string): string {\n return `let ${name}: ${stateTypeText} = $state(undefined as unknown as ${stateTypeText});`;\n}\n\nfunction create_lowered_declaration_helper(\n declaration: ts.VariableDeclaration,\n content: string,\n): LoweredDeclarationHelper | null {\n if (declaration.type || !declaration.initializer) {\n return null;\n }\n\n const bindingNames = extractBindingNames(declaration.name);\n const suffix = declaration.getStart();\n const baseName = bindingNames[0] ?? \"binding\";\n const helperName = `__svelteEffectRuntime_${baseName}_${suffix}`;\n const expressionNode = getYieldOperand(declaration.initializer) ??\n declaration.initializer;\n const expressionText = normalizeStatementText(\n sliceNode(content, expressionNode),\n );\n const declarationText = `const ${helperName} = () => ${expressionText};`;\n const yieldedExpression = getYieldOperand(declaration.initializer);\n const stateTypeText = yieldedExpression\n ? `__svelteEffectRuntimeYielded<ReturnType<typeof ${helperName}>>`\n : `ReturnType<typeof ${helperName}>`;\n const assignmentExpression = yieldedExpression\n ? `yield* ${helperName}()`\n : `${helperName}()`;\n\n return {\n declarationText,\n stateTypeText,\n assignmentExpression,\n tempName: ts.isIdentifier(declaration.name)\n ? undefined\n : `__svelteEffectRuntimeTemp_${suffix}`,\n expressionRelocation: {\n originalStart: expressionNode.getStart(),\n originalEnd: expressionNode.end,\n generatedSnippet: declarationText,\n generatedInnerStart: declarationText.lastIndexOf(expressionText),\n generatedInnerEnd: declarationText.lastIndexOf(expressionText) +\n expressionText.length,\n },\n };\n}\n\nfunction make_declaration_relocations(\n declaration: ts.VariableDeclaration,\n renderedDeclaration: string,\n content: string,\n): Array<PendingRelocation> {\n const relocations: Array<PendingRelocation> = [];\n\n if (ts.isIdentifier(declaration.name)) {\n const nameStart = renderedDeclaration.indexOf(declaration.name.text);\n relocations.push({\n originalStart: declaration.name.getStart(),\n originalEnd: declaration.name.end,\n generatedSnippet: renderedDeclaration,\n generatedInnerStart: nameStart,\n generatedInnerEnd: nameStart + declaration.name.text.length,\n });\n }\n\n if (declaration.initializer) {\n const initializerText = normalizeStatementText(\n sliceNode(content, declaration.initializer),\n );\n const initializerStart = renderedDeclaration.lastIndexOf(initializerText);\n if (initializerStart >= 0) {\n relocations.push({\n originalStart: declaration.initializer.getStart(),\n originalEnd: declaration.initializer.end,\n generatedSnippet: renderedDeclaration,\n generatedInnerStart: initializerStart,\n generatedInnerEnd: initializerStart + initializerText.length,\n });\n }\n }\n\n return relocations;\n}\n\nfunction find_binding_name_start(\n name: ts.BindingName,\n bindingName: string,\n): number {\n if (ts.isIdentifier(name)) {\n return name.text === bindingName ? name.getStart() : -1;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n const start = find_binding_name_start(element.name, bindingName);\n if (start !== -1) {\n return start;\n }\n }\n\n return -1;\n}\n\nfunction find_binding_name_end(\n name: ts.BindingName,\n bindingName: string,\n): number {\n if (ts.isIdentifier(name)) {\n return name.text === bindingName ? name.end : -1;\n }\n\n for (const element of name.elements) {\n if (ts.isOmittedExpression(element)) {\n continue;\n }\n\n const end = find_binding_name_end(element.name, bindingName);\n if (end !== -1) {\n return end;\n }\n }\n\n return -1;\n}\n\nfunction makeRuntimeBlock(statements: string[]): string {\n const body = statements.map((statement) => indentBlock(statement, \" \"))\n .join(\"\\n\\n\");\n\n return [\n \"\",\n \"const __svelteEffectRuntimeProgram = __svelteEffectRuntimeEffect.gen(function* () {\",\n body,\n \"});\",\n \"\",\n \"__svelteEffectRuntimeOnMount(() => {\",\n \" const __svelteEffectRuntimeCleanup = __svelteEffectRuntimeRunComponentEffect(\",\n \" __svelteEffectRuntimeGetRuntime(),\",\n \" __svelteEffectRuntimeProgram,\",\n \" );\",\n \"\",\n \" import.meta.hot?.dispose(__svelteEffectRuntimeCleanup);\",\n \" return __svelteEffectRuntimeCleanup;\",\n \"});\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction resolvePendingRelocations(\n pendingRelocations: Array<PendingRelocation>,\n code: string,\n): Array<TransformRelocation> {\n const relocations: Array<TransformRelocation> = [];\n let searchStart = 0;\n\n for (const relocation of pendingRelocations) {\n const generatedStart = code.indexOf(\n relocation.generatedSnippet,\n searchStart,\n );\n\n if (generatedStart === -1) {\n continue;\n }\n\n searchStart = generatedStart + relocation.generatedSnippet.length;\n relocations.push({\n originalStart: relocation.originalStart,\n originalEnd: relocation.originalEnd,\n generatedStart: generatedStart + relocation.generatedInnerStart,\n generatedEnd: generatedStart + relocation.generatedInnerEnd,\n });\n }\n\n return relocations;\n}\n"],"mappings":"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"}
|
package/dist/language-server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as transformEffectMarkup } from "./chunks/markup-
|
|
1
|
+
import { t as transformEffectMarkup } from "./chunks/markup-BMn2sQOB.js";
|
|
2
2
|
import { transformEffectScript } from "./internal/transform.js";
|
|
3
3
|
import { effect_preprocess } from "./preprocess.js";
|
|
4
4
|
export { effect_preprocess, transformEffectMarkup as transform_effect_markup, transformEffectScript as transform_effect_script };
|
package/dist/preprocess.js
CHANGED
package/dist/root-node.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as run_component_effect, c as to_native, o as run_inline_effect, r as get_effect_runtime_or_throw, s as to_effect, t as ClientRuntime } from "./chunks/client-vV6UAwoP.js";
|
|
2
2
|
import "./chunks/v3-D0c0MKPf.js";
|
|
3
|
-
import { a as RequestEvent$1, c as get_server_runtime_or_throw$1, i as Query$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "./chunks/server-
|
|
4
|
-
import { t as effect } from "./chunks/effect-
|
|
3
|
+
import { a as RequestEvent$1, c as get_server_runtime_or_throw$1, i as Query$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "./chunks/server-Dea1CJuY.js";
|
|
4
|
+
import { t as effect } from "./chunks/effect-Cx8OzrcW.js";
|
|
5
5
|
//#region v3/root-node.ts
|
|
6
6
|
/**
|
|
7
7
|
* Define a read-only remote function that returns an `Effect` on the client.
|
package/dist/root-node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-node.js","names":["Server_module.Query","Server_module.Command","Server_module.Form","Server_module.Prerender","Server_module.RequestEvent","Server_module.ServerRuntime","Server_module.create_effect_transport","Server_module.get_server_runtime_or_throw"],"sources":["../../modules/svelte-effect-runtime/v3/root-node.ts"],"sourcesContent":["import * as Server_module from \"$/v3/server.ts\";\n\nexport * from \"$/v3/mod.ts\";\nexport type * from \"$/v3/server.ts\";\nexport type { EffectPluginOptions } from \"$/v3/effect.ts\";\nexport { effect } from \"$/v3/effect.ts\";\n\n/**\n * Define a read-only remote function that returns an `Effect` on the client.\n *\n * @see https://ser.barekey.dev/content/remote-functions/query\n */\nexport const Query: typeof Server_module.Query = Server_module.Query;\n/**\n * Define a write-oriented remote function that returns an `Effect` on the\n * client.\n *\n * @see https://ser.barekey.dev/content/remote-functions/command\n */\nexport const Command: typeof Server_module.Command = Server_module.Command;\n/**\n * Define a remote form handler that maps submitted data into an Effect\n * program.\n *\n * @see https://ser.barekey.dev/content/remote-functions/form\n */\nexport const Form: typeof Server_module.Form = Server_module.Form;\n/**\n * Define a prerenderable remote function backed by an Effect program.\n *\n * @see https://ser.barekey.dev/content/remote-functions/prerender\n */\nexport const Prerender: typeof Server_module.Prerender
|
|
1
|
+
{"version":3,"file":"root-node.js","names":["Server_module.Query","Server_module.Command","Server_module.Form","Server_module.Prerender","Server_module.RequestEvent","Server_module.ServerRuntime","Server_module.create_effect_transport","Server_module.get_server_runtime_or_throw"],"sources":["../../modules/svelte-effect-runtime/v3/root-node.ts"],"sourcesContent":["import * as Server_module from \"$/v3/server.ts\";\n\nexport * from \"$/v3/mod.ts\";\nexport type * from \"$/v3/server.ts\";\nexport type { EffectPluginOptions } from \"$/v3/effect.ts\";\nexport { effect } from \"$/v3/effect.ts\";\n\n/**\n * Define a read-only remote function that returns an `Effect` on the client.\n *\n * @see https://ser.barekey.dev/content/remote-functions/query\n */\nexport const Query: typeof Server_module.Query = Server_module.Query;\n/**\n * Define a write-oriented remote function that returns an `Effect` on the\n * client.\n *\n * @see https://ser.barekey.dev/content/remote-functions/command\n */\nexport const Command: typeof Server_module.Command = Server_module.Command;\n/**\n * Define a remote form handler that maps submitted data into an Effect\n * program.\n *\n * @see https://ser.barekey.dev/content/remote-functions/form\n */\nexport const Form: typeof Server_module.Form = Server_module.Form;\n/**\n * Define a prerenderable remote function backed by an Effect program.\n *\n * @see https://ser.barekey.dev/content/remote-functions/prerender\n */\nexport const Prerender: typeof Server_module.Prerender =\n Server_module.Prerender;\n/**\n * Effect `Context.Tag` for the current SvelteKit `RequestEvent`.\n *\n * @see https://ser.barekey.dev/content/runtimes/server\n */\nexport const RequestEvent: typeof Server_module.RequestEvent =\n Server_module.RequestEvent;\n/**\n * Server-side runtime builder used to provide long-lived Effect services to\n * remote functions.\n *\n * @see https://ser.barekey.dev/content/reference/server-runtime\n */\nexport const ServerRuntime: typeof Server_module.ServerRuntime =\n Server_module.ServerRuntime;\n/**\n * Build a devalue transport table from Effect schemas so remote payloads can\n * round-trip custom data across the client/server boundary.\n *\n * @see https://ser.barekey.dev/content/reference/transport\n */\nexport const create_effect_transport:\n typeof Server_module.create_effect_transport =\n Server_module.create_effect_transport;\n/**\n * Resolve the active server runtime, lazily creating a default empty runtime\n * when no explicit one has been registered.\n *\n * @internal Internal - do not use.\n * @see https://ser.barekey.dev/content/reference/server-runtime\n */\nexport const get_server_runtime_or_throw:\n typeof Server_module.get_server_runtime_or_throw =\n Server_module.get_server_runtime_or_throw;\n"],"mappings":";;;;;;;;;;AAYA,MAAa,QAAoCA;;;;;;;AAOjD,MAAa,UAAwCC;;;;;;;AAOrD,MAAa,OAAkCC;;;;;;AAM/C,MAAa,YACXC;;;;;;AAMF,MAAa,eACXC;;;;;;;AAOF,MAAa,gBACXC;;;;;;;AAOF,MAAa,0BAETC;;;;;;;;AAQJ,MAAa,8BAETC"}
|
package/dist/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as RequestEvent$1, c as get_server_runtime_or_throw$1, i as Query$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "./chunks/server-
|
|
1
|
+
import { a as RequestEvent$1, c as get_server_runtime_or_throw$1, i as Query$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "./chunks/server-Dea1CJuY.js";
|
|
2
2
|
//#region server.ts
|
|
3
3
|
/**
|
|
4
4
|
* Default server-side entrypoint for `svelte-effect-runtime`.
|
package/dist/v4/effect.js
CHANGED
package/dist/v4/preprocess.js
CHANGED
package/dist/v4/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as make_context_key } from "../chunks/effect-compat-BhW0YPIs.js";
|
|
2
|
-
import { c as get_server_runtime_or_throw$1, i as Query$1, l as normalize_remote_helper_error$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "../chunks/server-
|
|
2
|
+
import { c as get_server_runtime_or_throw$1, i as Query$1, l as normalize_remote_helper_error$1, n as Form$1, o as ServerRuntime$1, r as Prerender$1, s as create_effect_transport$1, t as Command$1 } from "../chunks/server-Dea1CJuY.js";
|
|
3
3
|
//#region v4/server.ts
|
|
4
4
|
/**
|
|
5
5
|
* v4 flavour of {@link import("$/v3/server.ts").Query} - define a read-only
|
package/dist/v4/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as sveltekit_effect_runtime$1, t as svelte_effect_runtime$1 } from "../chunks/vite-
|
|
1
|
+
import { n as sveltekit_effect_runtime$1, t as svelte_effect_runtime$1 } from "../chunks/vite-C8ujN78r.js";
|
|
2
2
|
import { with_v4_effect_preprocess_options } from "./preprocess.js";
|
|
3
3
|
//#region v4/vite.ts
|
|
4
4
|
/**
|
package/dist/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as sveltekit_effect_runtime$1, t as svelte_effect_runtime$1 } from "./chunks/vite-
|
|
1
|
+
import { n as sveltekit_effect_runtime$1, t as svelte_effect_runtime$1 } from "./chunks/vite-C8ujN78r.js";
|
|
2
2
|
//#region vite.ts
|
|
3
3
|
/**
|
|
4
4
|
* Compose the low-level Svelte preprocessor directly into a plain Vite +
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preprocess-CtLrnJcK.js","names":[],"sources":["../../../modules/svelte-effect-runtime/v3/preprocess.ts"],"sourcesContent":["/**\n * Low-level Svelte preprocessing primitives for `svelte-effect-runtime`.\n *\n * @example\n * ```ts\n * import { effect_preprocess } from \"svelte-effect-runtime/preprocess\";\n *\n * const preprocess = effect_preprocess();\n * ```\n *\n * @module\n */\nimport type { PreprocessorGroup } from \"svelte/compiler\";\nimport { transformEffectMarkup } from \"$internal/markup.ts\";\nimport { transformEffectScript } from \"$internal/transform.ts\";\n\n/** Options that control how generated helper imports are emitted. */\nexport interface EffectPreprocessOptions {\n runtimeModuleId?: string;\n effectModuleId?: string;\n svelteModuleId?: string;\n}\n\n/**\n * Low-level Svelte preprocessor for `<script effect>` and supported markup\n * `yield*` transforms.\n *\n * Advanced entry point used by tooling and custom build setups.\n *\n * @see https://ser.barekey.dev/content/reference/preprocess\n */\nexport function effect_preprocess(\n options: EffectPreprocessOptions = {},\n): PreprocessorGroup {\n return {\n name: \"svelte-effect-runtime\",\n markup({ content, filename }) {\n const transformed = transformEffectMarkup(content, {\n ...options,\n filename: filename ?? \"Component.svelte\",\n });\n\n if (transformed.code === content) {\n return;\n }\n\n return {\n code: transformed.code,\n map: transformed.map,\n };\n },\n script({ content, attributes, filename }) {\n if (\n attributes.context === \"module\" || !Object.hasOwn(attributes, \"effect\")\n ) {\n return;\n }\n\n const { effect: _effect, ...nextAttributes } = attributes;\n const transformed = transformEffectScript(content, {\n ...options,\n filename: filename ?? \"Component.svelte\",\n });\n\n return {\n code: transformed.code,\n map: transformed.map,\n attributes: nextAttributes,\n };\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AA+BA,SAAgB,kBACd,UAAmC,EAAE,EAClB;AACnB,QAAO;EACL,MAAM;EACN,OAAO,EAAE,SAAS,YAAY;GAC5B,MAAM,cAAc,sBAAsB,SAAS;IACjD,GAAG;IACH,UAAU,YAAY;IACvB,CAAC;AAEF,OAAI,YAAY,SAAS,QACvB;AAGF,UAAO;IACL,MAAM,YAAY;IAClB,KAAK,YAAY;IAClB;;EAEH,OAAO,EAAE,SAAS,YAAY,YAAY;AACxC,OACE,WAAW,YAAY,YAAY,CAAC,OAAO,OAAO,YAAY,SAAS,CAEvE;GAGF,MAAM,EAAE,QAAQ,SAAS,GAAG,mBAAmB;GAC/C,MAAM,cAAc,sBAAsB,SAAS;IACjD,GAAG;IACH,UAAU,YAAY;IACvB,CAAC;AAEF,UAAO;IACL,MAAM,YAAY;IAClB,KAAK,YAAY;IACjB,YAAY;IACb;;EAEJ"}
|