svelte-effect-runtime 3.3.1 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dist/chunks/{client-BYhNKK1i.js → client-7MXXouwb.js} +3 -3
- package/.dist/chunks/{client-BYhNKK1i.js.map → client-7MXXouwb.js.map} +1 -1
- package/.dist/chunks/{dispatcher-5WSjtyXR.js → dispatcher-KxyCmCbv.js} +3 -3
- package/.dist/chunks/{dispatcher-5WSjtyXR.js.map → dispatcher-KxyCmCbv.js.map} +1 -1
- package/.dist/chunks/{dispatcher-BnitG7p3.js → dispatcher-s46GfT6n.js} +3 -2
- package/.dist/chunks/dispatcher-s46GfT6n.js.map +1 -0
- package/.dist/chunks/{errors-DppSJ83S.js → errors-0PaWf7Bq.js} +58 -2
- package/.dist/chunks/errors-0PaWf7Bq.js.map +1 -0
- package/.dist/chunks/{runtime-CPbQxe4W.js → runtime-BXbxv4Ai.js} +4 -4
- package/.dist/chunks/runtime-BXbxv4Ai.js.map +1 -0
- package/.dist/chunks/{transform-DHUCirwV.js → transform-Cdsx7ygD.js} +132 -43
- package/.dist/chunks/transform-Cdsx7ygD.js.map +1 -0
- package/.dist/chunks/vite-DTeo70MK.js +479 -0
- package/.dist/chunks/vite-DTeo70MK.js.map +1 -0
- package/.dist/diagnostics.d.ts +21 -0
- package/.dist/dispatcher.js +1 -1
- package/.dist/errors.d.ts +40 -0
- package/.dist/internal/generators.js +2 -2
- package/.dist/internal/remote-client.js +1 -1
- package/.dist/markup/promise.js +1 -1
- package/.dist/markup/run.js +1 -1
- package/.dist/markup/transform/emit.d.ts +2 -2
- package/.dist/markup/transform.js +1 -1
- package/.dist/markup/value.js +1 -1
- package/.dist/mod.d.ts +1 -2
- package/.dist/mod.js +4 -5
- package/.dist/mod.js.map +1 -1
- package/.dist/remote/client.js +1 -1
- package/.dist/remote/server.js +1 -1
- package/.dist/runtime/transform.js +45 -230
- package/.dist/runtime/transform.js.map +1 -1
- package/.dist/script-transform/index.d.ts +3 -3
- package/.dist/script-transform/runes.d.ts +0 -12
- package/.dist/script-transform/types.d.ts +1 -1
- package/.dist/server/index.d.ts +1 -0
- package/.dist/server/runtime.d.ts +13 -0
- package/.dist/server.js +2 -2
- package/.dist/vite.d.ts +3 -3
- package/.dist/vite.js +1 -172
- package/package.json +2 -7
- package/.dist/chunks/dispatcher-BnitG7p3.js.map +0 -1
- package/.dist/chunks/errors-DppSJ83S.js.map +0 -1
- package/.dist/chunks/grammars-i4CSRxWg.js +0 -181
- package/.dist/chunks/grammars-i4CSRxWg.js.map +0 -1
- package/.dist/chunks/runtime-CPbQxe4W.js.map +0 -1
- package/.dist/chunks/transform-DHUCirwV.js.map +0 -1
- package/.dist/grammars/textmate.d.ts +0 -105
- package/.dist/grammars/tree-sitter.d.ts +0 -22
- package/.dist/grammars.d.ts +0 -2
- package/.dist/grammars.js +0 -2
- package/.dist/vite.js.map +0 -1
package/.dist/markup/promise.js
CHANGED
package/.dist/markup/run.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EffectCallbackRewriteContext } from "./effect-bindings.js";
|
|
2
|
-
import type { MarkupCandidate, MarkupHelperBindings, MarkupNameAllocator, Replacement, TagKind } from "./types.js";
|
|
2
|
+
import type { MarkupCandidate, MarkupHelperBindings, MarkupNameAllocator, MarkupTransformTarget, Replacement, TagKind } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Emits source edits for classified markup Effect expressions.
|
|
5
5
|
*
|
|
@@ -12,4 +12,4 @@ import type { MarkupCandidate, MarkupHelperBindings, MarkupNameAllocator, Replac
|
|
|
12
12
|
export declare function emit_replacements(classified: Array<{
|
|
13
13
|
candidate: MarkupCandidate;
|
|
14
14
|
kind: TagKind;
|
|
15
|
-
}>, effect_context: EffectCallbackRewriteContext, helper_bindings: MarkupHelperBindings, name_allocator: MarkupNameAllocator): Replacement[];
|
|
15
|
+
}>, effect_context: EffectCallbackRewriteContext, helper_bindings: MarkupHelperBindings, name_allocator: MarkupNameAllocator, target: MarkupTransformTarget): Replacement[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as transform_markup_effect } from "../chunks/transform-
|
|
1
|
+
import { t as transform_markup_effect } from "../chunks/transform-Cdsx7ygD.js";
|
|
2
2
|
export { transform_markup_effect };
|
package/.dist/markup/value.js
CHANGED
package/.dist/mod.d.ts
CHANGED
|
@@ -171,8 +171,7 @@ export declare const RequestEvent: Context.Reference<RequestEventShape>;
|
|
|
171
171
|
export declare const get_server_runtime_or_throw: () => ManagedRuntime.ManagedRuntime<unknown, never>;
|
|
172
172
|
/** Re-export error types users need for typed catch handlers. */
|
|
173
173
|
export type { FormError, FormIssue, RemoteFailure, RemoteHttpError, RemoteTransportError, RemoteValidationError, } from "./remote/shared.js";
|
|
174
|
-
export {
|
|
175
|
-
export { AsyncEffectInEventCallbackError, AsyncEffectInSyncRuneError, AwaitInEffectWorkError, BatchQueryHandlerMissingError, DispatcherDisposedError, InvalidCommandFactoryError, InvalidLiveQueryFactoryError, InvalidLiveQueryReturnError, InvalidQueryFactoryError, InvalidRemoteFormResponseError, PreprocessError, RemoteErrorDecodeError, RemoteFormEndpointMissingError, RemoteHelperContextError, RemoteHelperError, RequestEventUnavailableError, RuntimeError, ServerOnlyImportError, SvelteKitServerExportUnavailableError, UncheckedCommandHandlerMissingError, UncheckedFormHandlerMissingError, UncheckedLiveQueryHandlerMissingError, UncheckedPrerenderHandlerMissingError, UncheckedQueryHandlerMissingError, UnknownRuntimeError, UnsupportedMarkupEffectPositionError, UnsupportedRemoteFormResponseError, YieldStarInEventCallbackError, } from "./errors.js";
|
|
174
|
+
export { AsyncEffectInEventCallbackError, AsyncEffectInSyncRuneError, AwaitInEffectWorkError, BatchQueryHandlerMissingError, DispatcherDisposedError, InvalidCommandFactoryError, InvalidLiveQueryFactoryError, InvalidLiveQueryReturnError, InvalidQueryFactoryError, InvalidRemoteFormResponseError, PreprocessError, RemoteErrorDecodeError, RemoteFormEndpointMissingError, RemoteHelperContextError, RemoteHelperError, RequestEventUnavailableError, RuntimeAlreadyInitializedError, RuntimeError, ServerOnlyImportError, SvelteKitServerExportUnavailableError, UncheckedCommandHandlerMissingError, UncheckedFormHandlerMissingError, UncheckedLiveQueryHandlerMissingError, UncheckedPrerenderHandlerMissingError, UncheckedQueryHandlerMissingError, UnknownRuntimeError, UnsupportedMarkupEffectPositionError, UnsupportedRemoteFormResponseError, VitePreTransformPluginConflictError, YieldStarInEventCallbackError, } from "./errors.js";
|
|
176
175
|
export { is_form_error, is_remote_http_error, is_remote_transport_error, is_remote_validation_error, } from "./remote/shared.js";
|
|
177
176
|
/** Re-export app setup helpers so users can import them from root. */
|
|
178
177
|
export { effect, type EffectOptions } from "./vite.js";
|
package/.dist/mod.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
import { t as Dispatcher } from "./chunks/dispatcher-
|
|
3
|
-
import { n as textmate, r as textmate_language, t as tree_sitter } from "./chunks/grammars-i4CSRxWg.js";
|
|
1
|
+
import { A as YieldStarInEventCallbackError, C as UncheckedLiveQueryHandlerMissingError, D as UnsupportedMarkupEffectPositionError, E as UnknownRuntimeError, O as UnsupportedRemoteFormResponseError, S as UncheckedFormHandlerMissingError, T as UncheckedQueryHandlerMissingError, _ as RuntimeAlreadyInitializedError, a as DispatcherDisposedError, b as SvelteKitServerExportUnavailableError, c as InvalidLiveQueryReturnError, d as PreprocessError, f as RemoteErrorDecodeError, g as RequestEventUnavailableError, h as RemoteHelperError, i as BatchQueryHandlerMissingError, k as VitePreTransformPluginConflictError, l as InvalidQueryFactoryError, m as RemoteHelperContextError, n as AsyncEffectInSyncRuneError, o as InvalidCommandFactoryError, p as RemoteFormEndpointMissingError, r as AwaitInEffectWorkError, s as InvalidLiveQueryFactoryError, t as AsyncEffectInEventCallbackError, u as InvalidRemoteFormResponseError, v as RuntimeError, w as UncheckedPrerenderHandlerMissingError, x as UncheckedCommandHandlerMissingError, y as ServerOnlyImportError } from "./chunks/errors-0PaWf7Bq.js";
|
|
2
|
+
import { t as Dispatcher } from "./chunks/dispatcher-s46GfT6n.js";
|
|
4
3
|
import { is_form_error, is_remote_http_error, is_remote_transport_error, is_remote_validation_error } from "./remote/shared.js";
|
|
5
|
-
import { effect } from "./vite.js";
|
|
4
|
+
import { t as effect } from "./chunks/vite-DTeo70MK.js";
|
|
6
5
|
//#region src/mod.ts
|
|
7
6
|
/**
|
|
8
7
|
* Public API surface for `svelte-effect-runtime`.
|
|
@@ -192,6 +191,6 @@ function make_server_only_error(name) {
|
|
|
192
191
|
return new ServerOnlyImportError(name);
|
|
193
192
|
}
|
|
194
193
|
//#endregion
|
|
195
|
-
export { AsyncEffectInEventCallbackError, AsyncEffectInSyncRuneError, AwaitInEffectWorkError, BatchQueryHandlerMissingError, ClientRuntime, Command, DispatcherDisposedError, Error, Form, InvalidCommandFactoryError, InvalidLiveQueryFactoryError, InvalidLiveQueryReturnError, InvalidQueryFactoryError, InvalidRemoteFormResponseError, PreprocessError, Prerender, Query, Redirect, RemoteErrorDecodeError, RemoteFormEndpointMissingError, RemoteHelperContextError, RemoteHelperError, RequestEvent, RequestEventUnavailableError, RuntimeError, ServerOnlyImportError, ServerRuntime, SvelteKitServerExportUnavailableError,
|
|
194
|
+
export { AsyncEffectInEventCallbackError, AsyncEffectInSyncRuneError, AwaitInEffectWorkError, BatchQueryHandlerMissingError, ClientRuntime, Command, DispatcherDisposedError, Error, Form, InvalidCommandFactoryError, InvalidLiveQueryFactoryError, InvalidLiveQueryReturnError, InvalidQueryFactoryError, InvalidRemoteFormResponseError, PreprocessError, Prerender, Query, Redirect, RemoteErrorDecodeError, RemoteFormEndpointMissingError, RemoteHelperContextError, RemoteHelperError, RequestEvent, RequestEventUnavailableError, RuntimeAlreadyInitializedError, RuntimeError, ServerOnlyImportError, ServerRuntime, SvelteKitServerExportUnavailableError, UncheckedCommandHandlerMissingError, UncheckedFormHandlerMissingError, UncheckedLiveQueryHandlerMissingError, UncheckedPrerenderHandlerMissingError, UncheckedQueryHandlerMissingError, UnknownRuntimeError, UnsupportedMarkupEffectPositionError, UnsupportedRemoteFormResponseError, VitePreTransformPluginConflictError, YieldStarInEventCallbackError, effect, get_server_runtime_or_throw, is_form_error, is_remote_http_error, is_remote_transport_error, is_remote_validation_error };
|
|
196
195
|
|
|
197
196
|
//# sourceMappingURL=mod.js.map
|
package/.dist/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","names":[],"sources":["../../modules/svelte-effect-runtime/src/mod.ts"],"sourcesContent":["import { Dispatcher as InternalDispatcher } from \"$/dispatcher.ts\";\nimport { ServerOnlyImportError } from \"$/errors.ts\";\nimport type {\n ErrorEffectFactory,\n RedirectEffectFactory,\n} from \"$/server/control-flow.ts\";\nimport type { RequestEvent as RequestEventShape } from \"$/server/runtime.ts\";\nimport type {\n CommandFactory,\n FormFactory,\n PrerenderFactory,\n QueryFactory,\n ServerRuntimeFactory,\n} from \"$/server/types.ts\";\nimport type { Context, Layer, ManagedRuntime } from \"effect\";\n\n/**\n * Public API surface for `svelte-effect-runtime`.\n *\n * Call {@link ClientRuntime.make} in `hooks.client.ts`, call\n * {@link ServerRuntime.make} in `hooks.server.ts`, and let the Vite plugin\n * route server-only helpers to the server entrypoint automatically.\n *\n * @module\n */\n\n/**\n * Client-side runtime singleton. Call `ClientRuntime.make(layer?)` once\n * in `hooks.client.ts` to provide services to every component's effect\n * blocks.\n *\n * If never called, a default empty-layer runtime is created lazily on\n * the first `yield*` expression.\n *\n * @example\n * ```ts\n * import { ClientRuntime } from \"svelte-effect-runtime\";\n * import { Db } from \"./db.ts\";\n *\n * ClientRuntime.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n */\nexport class ClientRuntime {\n /**\n * Build and cache the client-side dispatcher runtime.\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n */\n static make<R = never>(layer?: Layer.Layer<R>): void {\n InternalDispatcher.make(layer);\n }\n}\n\n/**\n * Server-side runtime singleton export. In SvelteKit server files the Vite\n * plugin rewrites root imports to `svelte-effect-runtime/server`, so this\n * name resolves to the real server implementation before it is evaluated.\n *\n * @example\n * ```ts\n * import { ServerRuntime } from \"svelte-effect-runtime\";\n *\n * ServerRuntime.make();\n * ```\n *\n * @since 2.0.0\n */\nexport const ServerRuntime: ServerRuntimeFactory = make_server_only_class(\n \"ServerRuntime\",\n) as never;\n\n/**\n * Remote query factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Query } from \"svelte-effect-runtime\";\n *\n * export const GetPosts = Query(Effect.succeed([]));\n * ```\n *\n * @since 2.0.0\n */\nexport const Query: QueryFactory = Object.assign(\n make_server_only_function(\"Query\"),\n {\n batch: make_server_only_function(\"Query.batch\"),\n live: make_server_only_function(\"Query.live\"),\n },\n) as never;\n\n/**\n * Remote command factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Command } from \"svelte-effect-runtime\";\n *\n * export const SavePost = Command(Schema.String, (id) => Effect.succeed(id));\n * ```\n *\n * @since 2.0.0\n */\nexport const Command: CommandFactory = make_server_only_function(\n \"Command\",\n) as never;\n\n/**\n * SvelteKit HTTP error control-flow export for `.remote.ts` files imported\n * from the root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Error } from \"svelte-effect-runtime\";\n *\n * return yield* Error(\"NotFound\", \"Post not found\");\n * ```\n *\n * @since 2.3.0\n */\nexport const Error: ErrorEffectFactory = make_server_only_function(\n \"Error\",\n) as never;\n\n/**\n * Remote form factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Form } from \"svelte-effect-runtime\";\n *\n * export const CreatePost = Form(PostInput, ({ data }) => Effect.succeed(data));\n * ```\n *\n * @since 2.0.0\n */\nexport const Form: FormFactory = make_server_only_function(\n \"Form\",\n) as never;\n\n/**\n * Remote prerender factory export for `.remote.ts` files imported from the\n * root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Prerender } from \"svelte-effect-runtime\";\n *\n * export const GetBuildInfo = Prerender(() => Effect.succeed(\"ready\"));\n * ```\n *\n * @since 2.0.0\n */\nexport const Prerender: PrerenderFactory = make_server_only_function(\n \"Prerender\",\n) as never;\n\n/**\n * SvelteKit redirect control-flow export for `.remote.ts` files imported from\n * the root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Redirect } from \"svelte-effect-runtime\";\n *\n * return yield* Redirect(\"SeeOther\", \"/posts\");\n * ```\n *\n * @since 2.3.0\n */\nexport const Redirect: RedirectEffectFactory = make_server_only_function(\n \"Redirect\",\n) as never;\n\n/**\n * Current SvelteKit request event service export for `.remote.ts` files\n * imported from the root entrypoint. The Vite plugin rewrites it to the real\n * server implementation.\n *\n * @example\n * ```ts\n * import { RequestEvent } from \"svelte-effect-runtime\";\n *\n * const event = yield* RequestEvent;\n * ```\n *\n * @since 2.0.0\n */\nexport const RequestEvent: Context.Reference<RequestEventShape> =\n make_server_only_function(\"RequestEvent\") as never;\n\n/**\n * Returns the active server runtime when imported from a server file. The Vite\n * plugin rewrites root imports to the real server implementation.\n *\n * @example\n * ```ts\n * import { get_server_runtime_or_throw } from \"svelte-effect-runtime\";\n *\n * const runtime = get_server_runtime_or_throw();\n * ```\n *\n * @since 2.0.0\n */\nexport const get_server_runtime_or_throw: () => ManagedRuntime.ManagedRuntime<\n unknown,\n never\n> = make_server_only_function(\"get_server_runtime_or_throw\") as never;\n\n/** Re-export error types users need for typed catch handlers. */\nexport type {\n FormError,\n FormIssue,\n RemoteFailure,\n RemoteHttpError,\n RemoteTransportError,\n RemoteValidationError,\n} from \"$/remote/shared.ts\";\n\nexport {\n TextMate,\n textmate,\n textmate_language,\n type TextMateCaptureMap,\n type TextMateGrammarBundle,\n type TextMateLanguageRegistration,\n type TextMateRawRule,\n type TextMateRepository,\n tree_sitter,\n TreesitterQuery,\n type TreeSitterQueryBundle,\n} from \"./grammars.ts\";\n\nexport {\n AsyncEffectInEventCallbackError,\n AsyncEffectInSyncRuneError,\n AwaitInEffectWorkError,\n BatchQueryHandlerMissingError,\n DispatcherDisposedError,\n InvalidCommandFactoryError,\n InvalidLiveQueryFactoryError,\n InvalidLiveQueryReturnError,\n InvalidQueryFactoryError,\n InvalidRemoteFormResponseError,\n PreprocessError,\n RemoteErrorDecodeError,\n RemoteFormEndpointMissingError,\n RemoteHelperContextError,\n RemoteHelperError,\n RequestEventUnavailableError,\n RuntimeError,\n ServerOnlyImportError,\n SvelteKitServerExportUnavailableError,\n UncheckedCommandHandlerMissingError,\n UncheckedFormHandlerMissingError,\n UncheckedLiveQueryHandlerMissingError,\n UncheckedPrerenderHandlerMissingError,\n UncheckedQueryHandlerMissingError,\n UnknownRuntimeError,\n UnsupportedMarkupEffectPositionError,\n UnsupportedRemoteFormResponseError,\n YieldStarInEventCallbackError,\n} from \"$/errors.ts\";\n\nexport {\n is_form_error,\n is_remote_http_error,\n is_remote_transport_error,\n is_remote_validation_error,\n} from \"$/remote/shared.ts\";\n\n/** Re-export app setup helpers so users can import them from root. */\nexport { effect, type EffectOptions } from \"$/vite.ts\";\n\n/** Re-export server helper types from the root entrypoint. */\nexport type {\n ErrorEffectFactory,\n ErrorStatus,\n ErrorStatusName,\n RedirectEffectFactory,\n RedirectStatus,\n RedirectStatusName,\n} from \"$/server/control-flow.ts\";\n\n/** Re-export server helper types from the root entrypoint. */\nexport type {\n CommandFactory,\n EffectLike,\n EffectRemoteBatchHandler,\n EffectRemoteCommand,\n EffectRemoteForm,\n EffectRemoteFunction,\n EffectRemoteLiveQuery,\n EffectRemoteLiveQueryFunction,\n EffectRemoteLiveQueryResource,\n EffectRemoteLiveSource,\n EffectRemoteQuery,\n EffectRemoteQueryFunction,\n FormFactory,\n FormInvalid,\n PrerenderFactory,\n PrerenderOptions,\n QueryBatchFactory,\n QueryFactory,\n QueryLiveFactory,\n RemoteFormHandler,\n RemoteHandler,\n RemoteLiveHandler,\n SchemaEncodedInput,\n SchemaInput,\n ServerRuntimeFactory,\n StandardSchema,\n StandardSchemaInput,\n StandardSchemaOutput,\n} from \"$/server/types.ts\";\n\nfunction make_server_only_class(name: string): unknown {\n return class ServerOnlyRuntime {\n static make(): never {\n throw make_server_only_error(name);\n }\n };\n}\n\nfunction make_server_only_function(\n name: string,\n): (...args: unknown[]) => never {\n return (..._args: unknown[]): never => {\n throw make_server_only_error(name);\n };\n}\n\nfunction make_server_only_error(name: string): globalThis.Error {\n return new ServerOnlyImportError(name);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,IAAa,gBAAb,MAA2B;;;;;;;CAOzB,OAAO,KAAgB,OAA8B;EACnD,WAAmB,KAAK,KAAK;CAC/B;AACF;;;;;;;;;;;;;;;AAgBA,MAAa,gBAAsC,uBACjD,eACF;;;;;;;;;;;;;;AAeA,MAAa,QAAsB,OAAO,OACxC,0BAA0B,OAAO,GACjC;CACE,OAAO,0BAA0B,aAAa;CAC9C,MAAM,0BAA0B,YAAY;AAC9C,CACF;;;;;;;;;;;;;;AAeA,MAAa,UAA0B,0BACrC,SACF;;;;;;;;;;;;;;;AAgBA,MAAa,QAA4B,0BACvC,OACF;;;;;;;;;;;;;;AAeA,MAAa,OAAoB,0BAC/B,MACF;;;;;;;;;;;;;;;AAgBA,MAAa,YAA8B,0BACzC,WACF;;;;;;;;;;;;;;;AAgBA,MAAa,WAAkC,0BAC7C,UACF;;;;;;;;;;;;;;;AAgBA,MAAa,eACX,0BAA0B,cAAc;;;;;;;;;;;;;;AAe1C,MAAa,8BAGT,0BAA0B,6BAA6B;AA6G3D,SAAS,uBAAuB,MAAuB;CACrD,OAAO,MAAM,kBAAkB;EAC7B,OAAO,OAAc;GACnB,MAAM,uBAAuB,IAAI;EACnC;CACF;AACF;AAEA,SAAS,0BACP,MAC+B;CAC/B,QAAQ,GAAG,UAA4B;EACrC,MAAM,uBAAuB,IAAI;CACnC;AACF;AAEA,SAAS,uBAAuB,MAAgC;CAC9D,OAAO,IAAI,sBAAsB,IAAI;AACvC"}
|
|
1
|
+
{"version":3,"file":"mod.js","names":[],"sources":["../../modules/svelte-effect-runtime/src/mod.ts"],"sourcesContent":["import { Dispatcher as InternalDispatcher } from \"$/dispatcher.ts\";\nimport { ServerOnlyImportError } from \"$/errors.ts\";\nimport type {\n ErrorEffectFactory,\n RedirectEffectFactory,\n} from \"$/server/control-flow.ts\";\nimport type { RequestEvent as RequestEventShape } from \"$/server/runtime.ts\";\nimport type {\n CommandFactory,\n FormFactory,\n PrerenderFactory,\n QueryFactory,\n ServerRuntimeFactory,\n} from \"$/server/types.ts\";\nimport type { Context, Layer, ManagedRuntime } from \"effect\";\n\n/**\n * Public API surface for `svelte-effect-runtime`.\n *\n * Call {@link ClientRuntime.make} in `hooks.client.ts`, call\n * {@link ServerRuntime.make} in `hooks.server.ts`, and let the Vite plugin\n * route server-only helpers to the server entrypoint automatically.\n *\n * @module\n */\n\n/**\n * Client-side runtime singleton. Call `ClientRuntime.make(layer?)` once\n * in `hooks.client.ts` to provide services to every component's effect\n * blocks.\n *\n * If never called, a default empty-layer runtime is created lazily on\n * the first `yield*` expression.\n *\n * @example\n * ```ts\n * import { ClientRuntime } from \"svelte-effect-runtime\";\n * import { Db } from \"./db.ts\";\n *\n * ClientRuntime.make(Db.Live);\n * ```\n *\n * @since 2.0.0\n */\nexport class ClientRuntime {\n /**\n * Build and cache the client-side dispatcher runtime.\n *\n * @since 2.0.0\n * @param layer - Optional Effect layer to provide to the runtime.\n */\n static make<R = never>(layer?: Layer.Layer<R>): void {\n InternalDispatcher.make(layer);\n }\n}\n\n/**\n * Server-side runtime singleton export. In SvelteKit server files the Vite\n * plugin rewrites root imports to `svelte-effect-runtime/server`, so this\n * name resolves to the real server implementation before it is evaluated.\n *\n * @example\n * ```ts\n * import { ServerRuntime } from \"svelte-effect-runtime\";\n *\n * ServerRuntime.make();\n * ```\n *\n * @since 2.0.0\n */\nexport const ServerRuntime: ServerRuntimeFactory = make_server_only_class(\n \"ServerRuntime\",\n) as never;\n\n/**\n * Remote query factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Query } from \"svelte-effect-runtime\";\n *\n * export const GetPosts = Query(Effect.succeed([]));\n * ```\n *\n * @since 2.0.0\n */\nexport const Query: QueryFactory = Object.assign(\n make_server_only_function(\"Query\"),\n {\n batch: make_server_only_function(\"Query.batch\"),\n live: make_server_only_function(\"Query.live\"),\n },\n) as never;\n\n/**\n * Remote command factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Command } from \"svelte-effect-runtime\";\n *\n * export const SavePost = Command(Schema.String, (id) => Effect.succeed(id));\n * ```\n *\n * @since 2.0.0\n */\nexport const Command: CommandFactory = make_server_only_function(\n \"Command\",\n) as never;\n\n/**\n * SvelteKit HTTP error control-flow export for `.remote.ts` files imported\n * from the root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Error } from \"svelte-effect-runtime\";\n *\n * return yield* Error(\"NotFound\", \"Post not found\");\n * ```\n *\n * @since 2.3.0\n */\nexport const Error: ErrorEffectFactory = make_server_only_function(\n \"Error\",\n) as never;\n\n/**\n * Remote form factory export for `.remote.ts` files imported from the root\n * entrypoint. The Vite plugin rewrites it to the real server implementation.\n *\n * @example\n * ```ts\n * import { Form } from \"svelte-effect-runtime\";\n *\n * export const CreatePost = Form(PostInput, ({ data }) => Effect.succeed(data));\n * ```\n *\n * @since 2.0.0\n */\nexport const Form: FormFactory = make_server_only_function(\n \"Form\",\n) as never;\n\n/**\n * Remote prerender factory export for `.remote.ts` files imported from the\n * root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Prerender } from \"svelte-effect-runtime\";\n *\n * export const GetBuildInfo = Prerender(() => Effect.succeed(\"ready\"));\n * ```\n *\n * @since 2.0.0\n */\nexport const Prerender: PrerenderFactory = make_server_only_function(\n \"Prerender\",\n) as never;\n\n/**\n * SvelteKit redirect control-flow export for `.remote.ts` files imported from\n * the root entrypoint. The Vite plugin rewrites it to the real server\n * implementation.\n *\n * @example\n * ```ts\n * import { Redirect } from \"svelte-effect-runtime\";\n *\n * return yield* Redirect(\"SeeOther\", \"/posts\");\n * ```\n *\n * @since 2.3.0\n */\nexport const Redirect: RedirectEffectFactory = make_server_only_function(\n \"Redirect\",\n) as never;\n\n/**\n * Current SvelteKit request event service export for `.remote.ts` files\n * imported from the root entrypoint. The Vite plugin rewrites it to the real\n * server implementation.\n *\n * @example\n * ```ts\n * import { RequestEvent } from \"svelte-effect-runtime\";\n *\n * const event = yield* RequestEvent;\n * ```\n *\n * @since 2.0.0\n */\nexport const RequestEvent: Context.Reference<RequestEventShape> =\n make_server_only_function(\"RequestEvent\") as never;\n\n/**\n * Returns the active server runtime when imported from a server file. The Vite\n * plugin rewrites root imports to the real server implementation.\n *\n * @example\n * ```ts\n * import { get_server_runtime_or_throw } from \"svelte-effect-runtime\";\n *\n * const runtime = get_server_runtime_or_throw();\n * ```\n *\n * @since 2.0.0\n */\nexport const get_server_runtime_or_throw: () => ManagedRuntime.ManagedRuntime<\n unknown,\n never\n> = make_server_only_function(\"get_server_runtime_or_throw\") as never;\n\n/** Re-export error types users need for typed catch handlers. */\nexport type {\n FormError,\n FormIssue,\n RemoteFailure,\n RemoteHttpError,\n RemoteTransportError,\n RemoteValidationError,\n} from \"$/remote/shared.ts\";\n\nexport {\n AsyncEffectInEventCallbackError,\n AsyncEffectInSyncRuneError,\n AwaitInEffectWorkError,\n BatchQueryHandlerMissingError,\n DispatcherDisposedError,\n InvalidCommandFactoryError,\n InvalidLiveQueryFactoryError,\n InvalidLiveQueryReturnError,\n InvalidQueryFactoryError,\n InvalidRemoteFormResponseError,\n PreprocessError,\n RemoteErrorDecodeError,\n RemoteFormEndpointMissingError,\n RemoteHelperContextError,\n RemoteHelperError,\n RequestEventUnavailableError,\n RuntimeAlreadyInitializedError,\n RuntimeError,\n ServerOnlyImportError,\n SvelteKitServerExportUnavailableError,\n UncheckedCommandHandlerMissingError,\n UncheckedFormHandlerMissingError,\n UncheckedLiveQueryHandlerMissingError,\n UncheckedPrerenderHandlerMissingError,\n UncheckedQueryHandlerMissingError,\n UnknownRuntimeError,\n UnsupportedMarkupEffectPositionError,\n UnsupportedRemoteFormResponseError,\n VitePreTransformPluginConflictError,\n YieldStarInEventCallbackError,\n} from \"$/errors.ts\";\n\nexport {\n is_form_error,\n is_remote_http_error,\n is_remote_transport_error,\n is_remote_validation_error,\n} from \"$/remote/shared.ts\";\n\n/** Re-export app setup helpers so users can import them from root. */\nexport { effect, type EffectOptions } from \"$/vite.ts\";\n\n/** Re-export server helper types from the root entrypoint. */\nexport type {\n ErrorEffectFactory,\n ErrorStatus,\n ErrorStatusName,\n RedirectEffectFactory,\n RedirectStatus,\n RedirectStatusName,\n} from \"$/server/control-flow.ts\";\n\n/** Re-export server helper types from the root entrypoint. */\nexport type {\n CommandFactory,\n EffectLike,\n EffectRemoteBatchHandler,\n EffectRemoteCommand,\n EffectRemoteForm,\n EffectRemoteFunction,\n EffectRemoteLiveQuery,\n EffectRemoteLiveQueryFunction,\n EffectRemoteLiveQueryResource,\n EffectRemoteLiveSource,\n EffectRemoteQuery,\n EffectRemoteQueryFunction,\n FormFactory,\n FormInvalid,\n PrerenderFactory,\n PrerenderOptions,\n QueryBatchFactory,\n QueryFactory,\n QueryLiveFactory,\n RemoteFormHandler,\n RemoteHandler,\n RemoteLiveHandler,\n SchemaEncodedInput,\n SchemaInput,\n ServerRuntimeFactory,\n StandardSchema,\n StandardSchemaInput,\n StandardSchemaOutput,\n} from \"$/server/types.ts\";\n\nfunction make_server_only_class(name: string): unknown {\n return class ServerOnlyRuntime {\n static make(): never {\n throw make_server_only_error(name);\n }\n };\n}\n\nfunction make_server_only_function(\n name: string,\n): (...args: unknown[]) => never {\n return (..._args: unknown[]): never => {\n throw make_server_only_error(name);\n };\n}\n\nfunction make_server_only_error(name: string): globalThis.Error {\n return new ServerOnlyImportError(name);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,IAAa,gBAAb,MAA2B;;;;;;;CAOzB,OAAO,KAAgB,OAA8B;EACnD,WAAmB,KAAK,KAAK;CAC/B;AACF;;;;;;;;;;;;;;;AAgBA,MAAa,gBAAsC,uBACjD,eACF;;;;;;;;;;;;;;AAeA,MAAa,QAAsB,OAAO,OACxC,0BAA0B,OAAO,GACjC;CACE,OAAO,0BAA0B,aAAa;CAC9C,MAAM,0BAA0B,YAAY;AAC9C,CACF;;;;;;;;;;;;;;AAeA,MAAa,UAA0B,0BACrC,SACF;;;;;;;;;;;;;;;AAgBA,MAAa,QAA4B,0BACvC,OACF;;;;;;;;;;;;;;AAeA,MAAa,OAAoB,0BAC/B,MACF;;;;;;;;;;;;;;;AAgBA,MAAa,YAA8B,0BACzC,WACF;;;;;;;;;;;;;;;AAgBA,MAAa,WAAkC,0BAC7C,UACF;;;;;;;;;;;;;;;AAgBA,MAAa,eACX,0BAA0B,cAAc;;;;;;;;;;;;;;AAe1C,MAAa,8BAGT,0BAA0B,6BAA6B;AAiG3D,SAAS,uBAAuB,MAAuB;CACrD,OAAO,MAAM,kBAAkB;EAC7B,OAAO,OAAc;GACnB,MAAM,uBAAuB,IAAI;EACnC;CACF;AACF;AAEA,SAAS,0BACP,MAC+B;CAC/B,QAAQ,GAAG,UAA4B;EACrC,MAAM,uBAAuB,IAAI;CACnC;AACF;AAEA,SAAS,uBAAuB,MAAgC;CAC9D,OAAO,IAAI,sBAAsB,IAAI;AACvC"}
|
package/.dist/remote/client.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as create_remote_command_adapter, n as create_remote_query_adapter, r as create_remote_form_adapter, t as create_remote_live_query_adapter } from "../chunks/client-
|
|
1
|
+
import { i as create_remote_command_adapter, n as create_remote_query_adapter, r as create_remote_form_adapter, t as create_remote_live_query_adapter } from "../chunks/client-7MXXouwb.js";
|
|
2
2
|
export { create_remote_command_adapter, create_remote_form_adapter, create_remote_live_query_adapter, create_remote_query_adapter };
|
package/.dist/remote/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { h as RemoteHelperError, m as RemoteHelperContextError } from "../chunks/errors-
|
|
1
|
+
import { h as RemoteHelperError, m as RemoteHelperContextError } from "../chunks/errors-0PaWf7Bq.js";
|
|
2
2
|
import { create_serialized_remote_failure_envelope } from "./shared.js";
|
|
3
3
|
import { Cause, Effect, Exit } from "effect";
|
|
4
4
|
import { isHttpError, isRedirect, isValidationError } from "@sveltejs/kit";
|
|
@@ -1,47 +1,8 @@
|
|
|
1
|
-
import { d as PreprocessError,
|
|
2
|
-
import { a as
|
|
1
|
+
import { d as PreprocessError, r as AwaitInEffectWorkError } from "../chunks/errors-0PaWf7Bq.js";
|
|
2
|
+
import { a as is_yield_star_expression, c as slice, d as collect_top_level_binding_names, f as has_local_import_binding, i as find_yield_star_node, l as slice_start, n as collect_yield_star_nodes, o as validate_rune_yield_usage, p as make_imports, r as contains_top_level_await, s as create_source_map, t as transform_markup_effect, u as collect_free_identifiers } from "../chunks/transform-Cdsx7ygD.js";
|
|
3
3
|
import { contains_top_level_yield_star } from "../detect.js";
|
|
4
4
|
import MagicString from "magic-string";
|
|
5
5
|
import ts from "typescript";
|
|
6
|
-
//#region src/script-transform/source.ts
|
|
7
|
-
/**
|
|
8
|
-
* Creates a source map from transformed script back to the original block.
|
|
9
|
-
*
|
|
10
|
-
* @since 2.0.0
|
|
11
|
-
* @param magic - MagicString instance holding the transformed source.
|
|
12
|
-
* @param filename - Source filename used for the source map entry.
|
|
13
|
-
* @returns A plain source map object.
|
|
14
|
-
*/
|
|
15
|
-
function create_source_map(magic, filename) {
|
|
16
|
-
return magic.generateMap({
|
|
17
|
-
hires: true,
|
|
18
|
-
includeContent: true,
|
|
19
|
-
source: filename
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Slices a substring matching a node's full source range.
|
|
24
|
-
*
|
|
25
|
-
* @since 2.0.0
|
|
26
|
-
* @param content - Original source text.
|
|
27
|
-
* @param node - AST node whose full range should be extracted.
|
|
28
|
-
* @returns Source text including leading trivia.
|
|
29
|
-
*/
|
|
30
|
-
function slice(content, node) {
|
|
31
|
-
return content.slice(node.getFullStart(), node.end);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Slices a substring matching a node's source range without leading trivia.
|
|
35
|
-
*
|
|
36
|
-
* @since 2.0.0
|
|
37
|
-
* @param content - Original source text.
|
|
38
|
-
* @param node - AST node whose non-trivia range should be extracted.
|
|
39
|
-
* @returns Source text excluding leading trivia.
|
|
40
|
-
*/
|
|
41
|
-
function slice_start(content, node) {
|
|
42
|
-
return content.slice(node.getStart(), node.end);
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
6
|
//#region src/script-transform/runtime-block.ts
|
|
46
7
|
/**
|
|
47
8
|
* Builds the runtime blocks appended to lowered script effect code with
|
|
@@ -80,81 +41,6 @@ function merge_effect_blocks(blocks) {
|
|
|
80
41
|
};
|
|
81
42
|
}
|
|
82
43
|
//#endregion
|
|
83
|
-
//#region src/script-transform/runes.ts
|
|
84
|
-
const ASYNC_EXPRESSION_RUNES = new Set([
|
|
85
|
-
"$derived",
|
|
86
|
-
"$inspect",
|
|
87
|
-
"$state",
|
|
88
|
-
"$state.raw"
|
|
89
|
-
]);
|
|
90
|
-
const CALLBACK_RUNES = new Set([
|
|
91
|
-
"$derived.by",
|
|
92
|
-
"$effect",
|
|
93
|
-
"$effect.pre",
|
|
94
|
-
"$effect.root"
|
|
95
|
-
]);
|
|
96
|
-
/**
|
|
97
|
-
* Validates that `yield*` only appears in rune positions the script-effect
|
|
98
|
-
* transform can lower without changing the rune's normal Svelte contract.
|
|
99
|
-
*
|
|
100
|
-
* @since 2.0.0
|
|
101
|
-
* @param node - AST node to scan.
|
|
102
|
-
* @param content - Original script source used for diagnostics.
|
|
103
|
-
* @param filename - Source filename used for diagnostics.
|
|
104
|
-
* @returns Nothing.
|
|
105
|
-
*/
|
|
106
|
-
function validate_rune_yield_usage(node, content, filename) {
|
|
107
|
-
visit_rune_yield_usage(node, content, filename);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Identifies `$state(...)` and `$state.raw(...)` initializer calls.
|
|
111
|
-
*
|
|
112
|
-
* @since 2.0.0
|
|
113
|
-
* @param expr - Expression to classify.
|
|
114
|
-
* @param content - Original script source used to preserve argument text.
|
|
115
|
-
* @returns State rune details when the expression is a state initializer.
|
|
116
|
-
*/
|
|
117
|
-
function get_state_rune_initializer(expr, content) {
|
|
118
|
-
if (!ts.isCallExpression(expr)) return;
|
|
119
|
-
const rune_name = get_rune_name(expr.expression);
|
|
120
|
-
if (rune_name !== "$state" && rune_name !== "$state.raw") return;
|
|
121
|
-
const first_arg = expr.arguments[0];
|
|
122
|
-
if (!first_arg) return;
|
|
123
|
-
return {
|
|
124
|
-
rune_name,
|
|
125
|
-
value_text: slice(content, first_arg).trim()
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function visit_rune_yield_usage(node, content, filename) {
|
|
129
|
-
if (ts.isCallExpression(node)) validate_call_expression(node, content, filename);
|
|
130
|
-
node.forEachChild((child) => {
|
|
131
|
-
visit_rune_yield_usage(child, content, filename);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
function validate_call_expression(call, content, filename) {
|
|
135
|
-
const rune_name = get_rune_name(call.expression);
|
|
136
|
-
if (!rune_name) return;
|
|
137
|
-
if (!ASYNC_EXPRESSION_RUNES.has(rune_name) && contains_top_level_yield_star(call)) throw new AsyncEffectInSyncRuneError(rune_name, slice(content, call), filename);
|
|
138
|
-
if (!CALLBACK_RUNES.has(rune_name)) return;
|
|
139
|
-
const callback = call.arguments[0];
|
|
140
|
-
if (!callback || !callback_has_top_level_yield_star(callback)) return;
|
|
141
|
-
throw new AsyncEffectInSyncRuneError(rune_name, slice(content, call), filename);
|
|
142
|
-
}
|
|
143
|
-
function callback_has_top_level_yield_star(node) {
|
|
144
|
-
if ((ts.isArrowFunction(node) || ts.isFunctionExpression(node)) && node.body !== void 0) return contains_top_level_yield_star(node.body);
|
|
145
|
-
return contains_top_level_yield_star(node);
|
|
146
|
-
}
|
|
147
|
-
function get_rune_name(expr) {
|
|
148
|
-
if (ts.isIdentifier(expr) && is_rune_root(expr.text)) return expr.text;
|
|
149
|
-
if (!ts.isPropertyAccessExpression(expr)) return;
|
|
150
|
-
const root_name = get_rune_name(expr.expression);
|
|
151
|
-
if (!root_name) return;
|
|
152
|
-
return `${root_name}.${expr.name.text}`;
|
|
153
|
-
}
|
|
154
|
-
function is_rune_root(name) {
|
|
155
|
-
return name === "$bindable" || name === "$derived" || name === "$effect" || name === "$host" || name === "$inspect" || name === "$props" || name === "$state";
|
|
156
|
-
}
|
|
157
|
-
//#endregion
|
|
158
44
|
//#region src/script-transform/lower.ts
|
|
159
45
|
/**
|
|
160
46
|
* Delegates a statement to the correct lowerer based on syntax kind.
|
|
@@ -180,103 +66,26 @@ function lower_statement(stmt, content, context) {
|
|
|
180
66
|
};
|
|
181
67
|
}
|
|
182
68
|
function lower_variable_statement(stmt, content, context) {
|
|
183
|
-
const
|
|
184
|
-
const type_helpers = [];
|
|
69
|
+
const helper_declarations = [];
|
|
185
70
|
const rewritten_decls = [];
|
|
186
|
-
const statements = [];
|
|
187
|
-
const deps = [];
|
|
188
71
|
const decl_list = stmt.declarationList;
|
|
189
72
|
const kind = (decl_list.flags & ts.NodeFlags.Let) !== 0 ? "let" : "const";
|
|
190
|
-
let has_bare_yield = false;
|
|
191
73
|
let uses_dispatcher_promise = false;
|
|
192
74
|
for (const decl of decl_list.declarations) {
|
|
193
|
-
if (!
|
|
194
|
-
if (contains_top_level_yield_star(decl.name)) {
|
|
195
|
-
has_bare_yield = true;
|
|
196
|
-
const binding_text = slice(content, decl.name).trim();
|
|
197
|
-
const initializer_text = decl.initializer ? slice(content, decl.initializer).trim() : "undefined";
|
|
198
|
-
const names = extract_binding_names(decl.name);
|
|
199
|
-
const statement = `(${binding_text} = ${initializer_text});`;
|
|
200
|
-
temps.push(...names.map((name) => make_unknown_temp(name, context)));
|
|
201
|
-
statements.push(statement);
|
|
202
|
-
deps.push(...collect_deps(statement, names));
|
|
203
|
-
continue;
|
|
204
|
-
}
|
|
75
|
+
if (!contains_top_level_yield_star(decl)) {
|
|
205
76
|
rewritten_decls.push(slice(content, decl).trim());
|
|
206
77
|
continue;
|
|
207
78
|
}
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (kind === "const") {
|
|
213
|
-
const awaited = make_awaited_yield_initializer(decl.initializer, content, original_name, context);
|
|
214
|
-
type_helpers.push(awaited.declaration);
|
|
215
|
-
rewritten_decls.push(`${original_name} = ${awaited.expression}`);
|
|
216
|
-
uses_dispatcher_promise = true;
|
|
217
|
-
continue;
|
|
218
|
-
}
|
|
219
|
-
const temp_name = context.next_temp_name(original_name);
|
|
220
|
-
const yield_text = extract_yield_star_full_text(decl.initializer, content);
|
|
221
|
-
const type_helper = make_yield_type_helper(yield_text, original_name, context);
|
|
222
|
-
if (type_helper) {
|
|
223
|
-
type_helpers.push(type_helper.declaration);
|
|
224
|
-
temps.push({
|
|
225
|
-
name: temp_name,
|
|
226
|
-
type: type_helper.type
|
|
227
|
-
});
|
|
228
|
-
} else temps.push({ name: temp_name });
|
|
229
|
-
has_bare_yield = true;
|
|
230
|
-
rewritten_decls.push(`${original_name} = $derived(${temp_name})`);
|
|
231
|
-
statements.push(`${temp_name} = ${yield_text};`);
|
|
232
|
-
deps.push(...collect_deps(yield_text));
|
|
233
|
-
} else {
|
|
234
|
-
const state_rune = get_state_rune_initializer(decl.initializer, content);
|
|
235
|
-
if (state_rune) {
|
|
236
|
-
const state_type = extract_yield_star_full_text(decl.initializer, content) === state_rune.value_text ? make_yield_type_helper(state_rune.value_text, original_name, context) : void 0;
|
|
237
|
-
if (state_type) type_helpers.push(state_type.declaration);
|
|
238
|
-
has_bare_yield = true;
|
|
239
|
-
rewritten_decls.push(`${original_name} = ${make_state_placeholder(state_rune.rune_name, state_type?.type, context)}`);
|
|
240
|
-
statements.push(`${original_name} = ${state_rune.value_text};`);
|
|
241
|
-
deps.push(...collect_deps(state_rune.value_text));
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
const lowered = lower_expression_yields(decl.initializer, content, original_name, context);
|
|
245
|
-
temps.push(...lowered.temps);
|
|
246
|
-
type_helpers.push(...lowered.type_helpers ?? []);
|
|
247
|
-
for (const block of lowered.effect_blocks) {
|
|
248
|
-
statements.push(...block.statements);
|
|
249
|
-
deps.push(...block.deps);
|
|
250
|
-
}
|
|
251
|
-
const rewritten_expr = rewrite_state_rune_as_derived(lowered.rewritten_expr);
|
|
252
|
-
const final_expr = should_wrap_complex_initializer_as_derived(decl.initializer, content) ? `$derived(${rewritten_expr})` : rewritten_expr;
|
|
253
|
-
if (final_expr !== rewritten_expr) has_bare_yield = true;
|
|
254
|
-
rewritten_decls.push(`${original_name} = ${final_expr}`);
|
|
255
|
-
}
|
|
256
|
-
} else {
|
|
257
|
-
has_bare_yield = true;
|
|
258
|
-
const temp_name = context.next_temp_name("destructure");
|
|
259
|
-
const names = extract_binding_names(decl.name);
|
|
260
|
-
const yield_text = extract_yield_star_full_text(decl.initializer, content);
|
|
261
|
-
const type_helper = make_yield_type_helper(yield_text, "destructure", context);
|
|
262
|
-
if (type_helper) {
|
|
263
|
-
type_helpers.push(type_helper.declaration);
|
|
264
|
-
temps.push({
|
|
265
|
-
name: temp_name,
|
|
266
|
-
type: type_helper.type
|
|
267
|
-
});
|
|
268
|
-
} else temps.push({ name: temp_name });
|
|
269
|
-
temps.push(...names.map((name) => make_unknown_temp(name, context)));
|
|
270
|
-
statements.push(`${temp_name} = ${yield_text};`);
|
|
271
|
-
statements.push(`(${binding_text} = ${temp_name});`);
|
|
272
|
-
deps.push(...collect_deps(yield_text));
|
|
273
|
-
}
|
|
79
|
+
const lowered = lower_node_yields_to_await(decl, content, make_binding_hint(decl.name), context);
|
|
80
|
+
helper_declarations.push(...lowered.helper_declarations);
|
|
81
|
+
rewritten_decls.push(lowered.rewritten_text);
|
|
82
|
+
uses_dispatcher_promise ||= lowered.uses_dispatcher_promise;
|
|
274
83
|
}
|
|
275
84
|
return {
|
|
276
|
-
temps,
|
|
277
|
-
type_helpers,
|
|
278
|
-
rewritten_text:
|
|
279
|
-
effect_blocks:
|
|
85
|
+
temps: [],
|
|
86
|
+
type_helpers: helper_declarations,
|
|
87
|
+
rewritten_text: `${kind} ${rewritten_decls.join(", ")};`,
|
|
88
|
+
effect_blocks: [],
|
|
280
89
|
uses_dispatcher_promise,
|
|
281
90
|
range: {
|
|
282
91
|
start: stmt.getStart(),
|
|
@@ -401,10 +210,32 @@ function lower_expression_yields(expr, content, hint, context) {
|
|
|
401
210
|
effect_blocks: [make_effect_block(statements, deps)]
|
|
402
211
|
};
|
|
403
212
|
}
|
|
404
|
-
function
|
|
405
|
-
const
|
|
213
|
+
function lower_node_yields_to_await(node, content, hint, context) {
|
|
214
|
+
const helper_declarations = [];
|
|
215
|
+
const replacements = [];
|
|
216
|
+
collect_yield_star_nodes(node, (yield_node) => {
|
|
217
|
+
const awaited = make_awaited_yield_expression(yield_node, content, hint, context);
|
|
218
|
+
helper_declarations.push(awaited.declaration);
|
|
219
|
+
replacements.push({
|
|
220
|
+
start: yield_node.getStart(),
|
|
221
|
+
end: yield_node.end,
|
|
222
|
+
text: awaited.expression
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
replacements.sort((a, b) => b.start - a.start);
|
|
226
|
+
let text = slice_start(content, node);
|
|
227
|
+
const offset_in_node = node.getStart();
|
|
228
|
+
for (const replacement of replacements) text = text.slice(0, replacement.start - offset_in_node) + replacement.text + text.slice(replacement.end - offset_in_node);
|
|
229
|
+
return {
|
|
230
|
+
helper_declarations,
|
|
231
|
+
rewritten_text: text.trim(),
|
|
232
|
+
uses_dispatcher_promise: replacements.length > 0
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function make_awaited_yield_expression(node, content, hint, context) {
|
|
236
|
+
const yield_text = slice_start(content, node).trim();
|
|
406
237
|
const helper_name = context.next_helper_name(`effect_${hint}`);
|
|
407
|
-
const helper_id = make_script_effect_id(
|
|
238
|
+
const helper_id = make_script_effect_id(node, context);
|
|
408
239
|
const deps_text = `[${collect_deps(yield_text).join(", ")}]`;
|
|
409
240
|
return {
|
|
410
241
|
declaration: `function* ${helper_name}() { return (${yield_text}); }`,
|
|
@@ -425,32 +256,12 @@ function make_yield_type_helper(yield_text, hint, context) {
|
|
|
425
256
|
type: `${context.effect_name}.Success<ReturnType<typeof ${helper_name}>> | undefined`
|
|
426
257
|
};
|
|
427
258
|
}
|
|
428
|
-
function make_unknown_temp(name, context) {
|
|
429
|
-
return {
|
|
430
|
-
name,
|
|
431
|
-
type: context.emit_types ? "unknown" : void 0
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
function make_state_placeholder(rune_name, type, context) {
|
|
435
|
-
if (type) return `${rune_name}<${type}>(undefined)`;
|
|
436
|
-
if (context.emit_types) return `${rune_name}<unknown>(undefined)`;
|
|
437
|
-
return `${rune_name}(undefined)`;
|
|
438
|
-
}
|
|
439
259
|
function strip_yield_star(yield_text) {
|
|
440
260
|
return yield_text.replace(/^yield\*\s*/, "");
|
|
441
261
|
}
|
|
442
262
|
function make_script_effect_id(expr, context) {
|
|
443
263
|
return `${context.filename}:${expr.getStart()}:${expr.end}`;
|
|
444
264
|
}
|
|
445
|
-
function rewrite_state_rune_as_derived(expression) {
|
|
446
|
-
const state_call = expression.match(/^\$state(?:\.raw)?\(([\s\S]*)\)$/);
|
|
447
|
-
if (!state_call) return expression;
|
|
448
|
-
return `$derived(${state_call[1]})`;
|
|
449
|
-
}
|
|
450
|
-
function should_wrap_complex_initializer_as_derived(expr, content) {
|
|
451
|
-
const text = slice(content, expr).trim();
|
|
452
|
-
return !/^\$derived(?:\.by)?\(/.test(text) && !/^\$inspect(?:\.trace)?\(/.test(text);
|
|
453
|
-
}
|
|
454
265
|
function is_assignment_operator(expr) {
|
|
455
266
|
return expr.operatorToken.kind >= ts.SyntaxKind.FirstAssignment && expr.operatorToken.kind <= ts.SyntaxKind.LastAssignment;
|
|
456
267
|
}
|
|
@@ -463,6 +274,10 @@ function is_top_level_rune_call(expr) {
|
|
|
463
274
|
function make_temp_hint(target) {
|
|
464
275
|
return target.match(/[A-Za-z_$][\w$]*$/)?.[0] ?? "assignment";
|
|
465
276
|
}
|
|
277
|
+
function make_binding_hint(name) {
|
|
278
|
+
if (ts.isIdentifier(name)) return name.text;
|
|
279
|
+
return "destructure";
|
|
280
|
+
}
|
|
466
281
|
function extract_yield_star_full_text(expr, content) {
|
|
467
282
|
let found;
|
|
468
283
|
find_yield_star_node(expr, (node) => {
|
|
@@ -496,9 +311,9 @@ function collect_assignment_target_names(node) {
|
|
|
496
311
|
//#endregion
|
|
497
312
|
//#region src/script-transform/index.ts
|
|
498
313
|
/**
|
|
499
|
-
* Transforms a `<script effect>` body by
|
|
500
|
-
* expressions into
|
|
501
|
-
*
|
|
314
|
+
* Transforms a `<script effect>` body by lowering top-level `yield*`
|
|
315
|
+
* expressions into Svelte-compatible async rendering declarations or into
|
|
316
|
+
* dependency-tracked `$effect` blocks for effectful statements.
|
|
502
317
|
*
|
|
503
318
|
* @example
|
|
504
319
|
* ```ts
|
|
@@ -563,9 +378,9 @@ function transform_script_effect(content, filename, options = {}) {
|
|
|
563
378
|
validate_rune_yield_usage(stmt, content, filename);
|
|
564
379
|
validate_script_yield_boundaries(stmt, content, filename);
|
|
565
380
|
if (!contains_top_level_yield_star(stmt)) continue;
|
|
566
|
-
if (contains_top_level_await(stmt)) throw new AwaitInEffectWorkError(filename, slice(content, stmt));
|
|
567
381
|
has_effect = true;
|
|
568
382
|
const lowered = lower_statement(stmt, content, context);
|
|
383
|
+
if (lowered.effect_blocks.length > 0 && contains_top_level_await(stmt)) throw new AwaitInEffectWorkError(filename, slice(content, stmt));
|
|
569
384
|
magic.overwrite(lowered.range.start, lowered.range.end, lowered.rewritten_text);
|
|
570
385
|
if (lowered.temps.length > 0 || lowered.type_helpers?.length) {
|
|
571
386
|
const temp_declarations = lowered.temps.map((temp) => temp.type ? `let ${temp.name} = $state<${temp.type}>(undefined);` : `let ${temp.name} = $state(undefined);`);
|