foldkit 0.22.0 → 0.23.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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Context, Effect, Schema, Stream } from 'effect';
|
|
1
|
+
import { Context, Effect, Layer, Schema, Stream } from 'effect';
|
|
2
2
|
import type { Command } from '../command';
|
|
3
3
|
import { Html } from '../html';
|
|
4
4
|
import { Url } from '../url';
|
|
@@ -17,96 +17,111 @@ export type BrowserConfig<Message> = {
|
|
|
17
17
|
readonly onUrlChange: (url: Url) => Message;
|
|
18
18
|
};
|
|
19
19
|
/** Full runtime configuration including model schema, flags, init, update, view, and optional browser/stream config. */
|
|
20
|
-
export interface RuntimeConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags> {
|
|
20
|
+
export interface RuntimeConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never> {
|
|
21
21
|
Model: Schema.Schema<Model, any, never>;
|
|
22
22
|
Flags: Schema.Schema<Flags, any, never>;
|
|
23
23
|
readonly flags: Effect.Effect<Flags>;
|
|
24
|
-
readonly init: (flags: Flags, url?: Url) => [Model, ReadonlyArray<Command<Message>>];
|
|
25
|
-
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
|
|
24
|
+
readonly init: (flags: Flags, url?: Url) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
25
|
+
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
26
26
|
readonly view: (model: Model) => Html;
|
|
27
|
-
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap>;
|
|
27
|
+
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap, Resources>;
|
|
28
28
|
readonly container: HTMLElement;
|
|
29
29
|
readonly browser?: BrowserConfig<Message>;
|
|
30
30
|
readonly errorView?: (error: Error) => Html;
|
|
31
|
+
/**
|
|
32
|
+
* An Effect Layer providing long-lived resources that persist across command
|
|
33
|
+
* invocations. Use this for browser resources with lifecycle (AudioContext,
|
|
34
|
+
* RTCPeerConnection, CanvasRenderingContext2D) — not for stateless utilities
|
|
35
|
+
* (HttpClient, JSON encoding) which should be provided per-command.
|
|
36
|
+
*
|
|
37
|
+
* The runtime memoizes the layer, ensuring a single shared instance for all
|
|
38
|
+
* commands and subscriptions throughout the application's lifetime.
|
|
39
|
+
*/
|
|
40
|
+
readonly resources?: Layer.Layer<Resources>;
|
|
31
41
|
}
|
|
32
|
-
interface BaseElementConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
42
|
+
interface BaseElementConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never> {
|
|
33
43
|
readonly Model: Schema.Schema<Model, any, never>;
|
|
34
|
-
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
|
|
44
|
+
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
35
45
|
readonly view: (model: Model) => Html;
|
|
36
|
-
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap>;
|
|
46
|
+
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap, Resources>;
|
|
37
47
|
readonly container: HTMLElement;
|
|
38
48
|
readonly errorView?: (error: Error) => Html;
|
|
49
|
+
readonly resources?: Layer.Layer<Resources>;
|
|
39
50
|
}
|
|
40
51
|
/** Configuration for `makeElement` when the element receives initial data via flags. */
|
|
41
|
-
export interface ElementConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags> extends BaseElementConfig<Model, Message, StreamDepsMap> {
|
|
52
|
+
export interface ElementConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never> extends BaseElementConfig<Model, Message, StreamDepsMap, Resources> {
|
|
42
53
|
readonly Flags: Schema.Schema<Flags, any, never>;
|
|
43
54
|
readonly flags: Effect.Effect<Flags>;
|
|
44
|
-
readonly init: (flags: Flags) => [Model, ReadonlyArray<Command<Message>>];
|
|
55
|
+
readonly init: (flags: Flags) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
45
56
|
}
|
|
46
57
|
/** Configuration for `makeElement` without flags. */
|
|
47
|
-
export interface ElementConfigWithoutFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
48
|
-
readonly init: () => [
|
|
58
|
+
export interface ElementConfigWithoutFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never> extends BaseElementConfig<Model, Message, StreamDepsMap, Resources> {
|
|
59
|
+
readonly init: () => [
|
|
60
|
+
Model,
|
|
61
|
+
ReadonlyArray<Command<Message, never, Resources>>
|
|
62
|
+
];
|
|
49
63
|
}
|
|
50
|
-
interface BaseApplicationConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
64
|
+
interface BaseApplicationConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never> {
|
|
51
65
|
readonly Model: Schema.Schema<Model, any, never>;
|
|
52
|
-
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
|
|
66
|
+
readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
53
67
|
readonly view: (model: Model) => Html;
|
|
54
|
-
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap>;
|
|
68
|
+
readonly subscriptions?: Subscriptions<Model, Message, StreamDepsMap, Resources>;
|
|
55
69
|
readonly container: HTMLElement;
|
|
56
70
|
readonly browser: BrowserConfig<Message>;
|
|
57
71
|
readonly errorView?: (error: Error) => Html;
|
|
72
|
+
readonly resources?: Layer.Layer<Resources>;
|
|
58
73
|
}
|
|
59
74
|
/** Configuration for `makeApplication` when the application receives initial data via flags. */
|
|
60
|
-
export interface ApplicationConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags> extends BaseApplicationConfig<Model, Message, StreamDepsMap> {
|
|
75
|
+
export interface ApplicationConfigWithFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never> extends BaseApplicationConfig<Model, Message, StreamDepsMap, Resources> {
|
|
61
76
|
readonly Flags: Schema.Schema<Flags, any, never>;
|
|
62
77
|
readonly flags: Effect.Effect<Flags>;
|
|
63
|
-
readonly init: (flags: Flags, url: Url) => [Model, ReadonlyArray<Command<Message>>];
|
|
78
|
+
readonly init: (flags: Flags, url: Url) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
64
79
|
}
|
|
65
80
|
/** Configuration for `makeApplication` without flags. */
|
|
66
|
-
export interface ApplicationConfigWithoutFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
67
|
-
readonly init: (url: Url) => [Model, ReadonlyArray<Command<Message>>];
|
|
81
|
+
export interface ApplicationConfigWithoutFlags<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never> extends BaseApplicationConfig<Model, Message, StreamDepsMap, Resources> {
|
|
82
|
+
readonly init: (url: Url) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
68
83
|
}
|
|
69
84
|
/** The `init` function type for elements, with an optional `flags` parameter when `Flags` is not `void`. */
|
|
70
|
-
export type ElementInit<Model, Message, Flags = void> = Flags extends void ? () => [Model, ReadonlyArray<Command<Message>>] : (flags: Flags) => [Model, ReadonlyArray<Command<Message>>];
|
|
85
|
+
export type ElementInit<Model, Message, Flags = void, Resources = never> = Flags extends void ? () => [Model, ReadonlyArray<Command<Message, never, Resources>>] : (flags: Flags) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
71
86
|
/** The `init` function type for applications, receives the current URL and optional flags. */
|
|
72
|
-
export type ApplicationInit<Model, Message, Flags = void> = Flags extends void ? (url: Url) => [Model, ReadonlyArray<Command<Message>>] : (flags: Flags, url: Url) => [Model, ReadonlyArray<Command<Message>>];
|
|
87
|
+
export type ApplicationInit<Model, Message, Flags = void, Resources = never> = Flags extends void ? (url: Url) => [Model, ReadonlyArray<Command<Message, never, Resources>>] : (flags: Flags, url: Url) => [Model, ReadonlyArray<Command<Message, never, Resources>>];
|
|
73
88
|
/** A reactive binding between model state and a long-running stream of commands. */
|
|
74
|
-
export type Subscription<Model, Message, StreamDeps> = {
|
|
89
|
+
export type Subscription<Model, Message, StreamDeps, Resources = never> = {
|
|
75
90
|
readonly modelToDeps: (model: Model) => StreamDeps;
|
|
76
|
-
readonly depsToStream: (deps: StreamDeps) => Stream.Stream<Command<Message>>;
|
|
91
|
+
readonly depsToStream: (deps: StreamDeps) => Stream.Stream<Command<Message, never, Resources>>;
|
|
77
92
|
};
|
|
78
|
-
type SubscriptionConfig<Model, Message, StreamDeps> = {
|
|
93
|
+
type SubscriptionConfig<Model, Message, StreamDeps, Resources = never> = {
|
|
79
94
|
readonly schema: Schema.Schema<StreamDeps>;
|
|
80
|
-
} & Subscription<Model, Message, StreamDeps>;
|
|
95
|
+
} & Subscription<Model, Message, StreamDeps, Resources>;
|
|
81
96
|
/** A record of named subscription configurations, keyed by dependency field name. */
|
|
82
|
-
export type Subscriptions<Model, Message, SubscriptionDeps extends Schema.Struct<any
|
|
83
|
-
readonly [K in keyof Schema.Schema.Type<SubscriptionDeps>]: SubscriptionConfig<Model, Message, Schema.Schema.Type<SubscriptionDeps>[K]>;
|
|
97
|
+
export type Subscriptions<Model, Message, SubscriptionDeps extends Schema.Struct<any>, Resources = never> = {
|
|
98
|
+
readonly [K in keyof Schema.Schema.Type<SubscriptionDeps>]: SubscriptionConfig<Model, Message, Schema.Schema.Type<SubscriptionDeps>[K], Resources>;
|
|
84
99
|
};
|
|
85
100
|
/** Creates type-safe subscription configurations from a dependency schema. */
|
|
86
|
-
export declare const makeSubscriptions: <SubscriptionDeps extends Schema.Struct<any>>(SubscriptionDeps: SubscriptionDeps) => <Model, Message>(configs: { [K in keyof Schema.Schema.Type<SubscriptionDeps>]: {
|
|
101
|
+
export declare const makeSubscriptions: <SubscriptionDeps extends Schema.Struct<any>>(SubscriptionDeps: SubscriptionDeps) => <Model, Message, Resources = never>(configs: { [K in keyof Schema.Schema.Type<SubscriptionDeps>]: {
|
|
87
102
|
modelToDeps: (model: Model) => Schema.Schema.Type<SubscriptionDeps>[K];
|
|
88
|
-
depsToStream: (deps: Schema.Schema.Type<SubscriptionDeps>[K]) => Stream.Stream<Command<Message>>;
|
|
103
|
+
depsToStream: (deps: Schema.Schema.Type<SubscriptionDeps>[K]) => Stream.Stream<Command<Message, never, Resources>>;
|
|
89
104
|
}; }) => Record<string, {
|
|
90
105
|
schema: any;
|
|
91
106
|
modelToDeps: (model: Model) => Schema.Schema.Type<SubscriptionDeps>[K];
|
|
92
|
-
depsToStream: (deps: Schema.Schema.Type<SubscriptionDeps>[K]) => Stream.Stream<Command<Message>>;
|
|
107
|
+
depsToStream: (deps: Schema.Schema.Type<SubscriptionDeps>[K]) => Stream.Stream<Command<Message, never, Resources>>;
|
|
93
108
|
}>;
|
|
94
109
|
/** A configured Foldkit runtime returned by `makeElement` or `makeApplication`, passed to `run` to start the application. */
|
|
95
110
|
export type MakeRuntimeReturn = (hmrModel?: unknown) => Effect.Effect<void>;
|
|
96
111
|
/** Creates a Foldkit element (no URL routing) and returns a runtime that can be passed to `run`. */
|
|
97
112
|
export declare function makeElement<Model, Message extends {
|
|
98
113
|
_tag: string;
|
|
99
|
-
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags>(config: ElementConfigWithFlags<Model, Message, StreamDepsMap, Flags>): MakeRuntimeReturn;
|
|
114
|
+
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never>(config: ElementConfigWithFlags<Model, Message, StreamDepsMap, Flags, Resources>): MakeRuntimeReturn;
|
|
100
115
|
export declare function makeElement<Model, Message extends {
|
|
101
116
|
_tag: string;
|
|
102
|
-
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
117
|
+
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never>(config: ElementConfigWithoutFlags<Model, Message, StreamDepsMap, Resources>): MakeRuntimeReturn;
|
|
103
118
|
/** Creates a Foldkit application with URL routing and returns a runtime that can be passed to `run`. */
|
|
104
119
|
export declare function makeApplication<Model, Message extends {
|
|
105
120
|
_tag: string;
|
|
106
|
-
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags>(config: ApplicationConfigWithFlags<Model, Message, StreamDepsMap, Flags>): MakeRuntimeReturn;
|
|
121
|
+
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Flags, Resources = never>(config: ApplicationConfigWithFlags<Model, Message, StreamDepsMap, Flags, Resources>): MakeRuntimeReturn;
|
|
107
122
|
export declare function makeApplication<Model, Message extends {
|
|
108
123
|
_tag: string;
|
|
109
|
-
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields
|
|
124
|
+
}, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>, Resources = never>(config: ApplicationConfigWithoutFlags<Model, Message, StreamDepsMap, Resources>): MakeRuntimeReturn;
|
|
110
125
|
/** Starts a Foldkit runtime, with HMR support for development. */
|
|
111
126
|
export declare const run: (foldkitRuntime: MakeRuntimeReturn) => void;
|
|
112
127
|
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EACP,MAAM,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/runtime.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BrowserRuntime } from '@effect/platform-browser/index';
|
|
2
|
-
import { Cause, Context, Effect, Either, Function, Option, Predicate, Queue, Record, Ref, Runtime, Schema, Stream, SubscriptionRef, pipe, } from 'effect';
|
|
2
|
+
import { Cause, Context, Effect, Either, Function, Layer, Option, Predicate, Queue, Record, Ref, Runtime, Schema, Stream, SubscriptionRef, pipe, } from 'effect';
|
|
3
3
|
import { h } from 'snabbdom';
|
|
4
4
|
import { fromString as urlFromString } from '../url';
|
|
5
5
|
import { patch, toVNode } from '../vdom';
|
|
@@ -14,7 +14,15 @@ export const makeSubscriptions = (SubscriptionDeps) => (configs) => Record.map(c
|
|
|
14
14
|
modelToDeps,
|
|
15
15
|
depsToStream,
|
|
16
16
|
}));
|
|
17
|
-
const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view, subscriptions, container, browser: browserConfig, errorView, }) => (hmrModel) => Effect.gen(function* () {
|
|
17
|
+
const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view, subscriptions, container, browser: browserConfig, errorView, resources, }) => (hmrModel) => Effect.scoped(Effect.gen(function* () {
|
|
18
|
+
const maybeResourceLayer = resources
|
|
19
|
+
? Option.some(yield* Layer.memoize(resources))
|
|
20
|
+
: Option.none();
|
|
21
|
+
const provideCommandResources = (command) => Option.match(maybeResourceLayer, {
|
|
22
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
23
|
+
onNone: () => command,
|
|
24
|
+
onSome: resourceLayer => Effect.provide(command, resourceLayer),
|
|
25
|
+
});
|
|
18
26
|
const flags = yield* flags_;
|
|
19
27
|
const modelEquivalence = Schema.equivalence(Model);
|
|
20
28
|
const messageQueue = yield* Queue.unbounded();
|
|
@@ -27,7 +35,7 @@ const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view,
|
|
|
27
35
|
}))
|
|
28
36
|
: init(flags, Option.getOrUndefined(currentUrl));
|
|
29
37
|
const modelSubscriptionRef = yield* SubscriptionRef.make(initModel);
|
|
30
|
-
yield* Effect.forEach(initCommands, command => Effect.forkDaemon(command.pipe(Effect.flatMap(enqueueMessage))));
|
|
38
|
+
yield* Effect.forEach(initCommands, command => Effect.forkDaemon(command.pipe(provideCommandResources, Effect.flatMap(enqueueMessage))));
|
|
31
39
|
if (browserConfig) {
|
|
32
40
|
addNavigationEventListeners(messageQueue, browserConfig);
|
|
33
41
|
}
|
|
@@ -43,7 +51,7 @@ const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view,
|
|
|
43
51
|
yield* SubscriptionRef.set(modelSubscriptionRef, nextModel);
|
|
44
52
|
preserveModel(nextModel);
|
|
45
53
|
}
|
|
46
|
-
yield* Effect.forEach(commands, command => Effect.forkDaemon(command.pipe(Effect.flatMap(enqueueMessage))));
|
|
54
|
+
yield* Effect.forEach(commands, command => Effect.forkDaemon(command.pipe(provideCommandResources, Effect.flatMap(enqueueMessage))));
|
|
47
55
|
});
|
|
48
56
|
const runProcessMessage = (messageEffect) => (runtime) => {
|
|
49
57
|
try {
|
|
@@ -53,7 +61,9 @@ const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view,
|
|
|
53
61
|
const squashed = Runtime.isFiberFailure(error)
|
|
54
62
|
? Cause.squash(error[Runtime.FiberFailureCauseId])
|
|
55
63
|
: error;
|
|
56
|
-
const appError = squashed instanceof Error
|
|
64
|
+
const appError = squashed instanceof Error
|
|
65
|
+
? squashed
|
|
66
|
+
: new Error(String(squashed));
|
|
57
67
|
renderErrorView(appError, errorView, container, maybeCurrentVNodeRef);
|
|
58
68
|
}
|
|
59
69
|
};
|
|
@@ -84,7 +94,7 @@ const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view,
|
|
|
84
94
|
if (subscriptions) {
|
|
85
95
|
yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { schema, modelToDeps, depsToStream }]) => {
|
|
86
96
|
const modelStream = Stream.concat(Stream.make(initModel), modelSubscriptionRef.changes);
|
|
87
|
-
return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDeps), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(Effect.flatMap(enqueueMessage))));
|
|
97
|
+
return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDeps), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(command => command.pipe(provideCommandResources, Effect.flatMap(enqueueMessage)))));
|
|
88
98
|
}, {
|
|
89
99
|
concurrency: 'unbounded',
|
|
90
100
|
discard: true,
|
|
@@ -95,10 +105,12 @@ const makeRuntime = ({ Model, Flags: _Flags, flags: flags_, init, update, view,
|
|
|
95
105
|
yield* processMessage(message);
|
|
96
106
|
})), Effect.catchAllCause(cause => Effect.sync(() => {
|
|
97
107
|
const squashed = Cause.squash(cause);
|
|
98
|
-
const appError = squashed instanceof Error
|
|
108
|
+
const appError = squashed instanceof Error
|
|
109
|
+
? squashed
|
|
110
|
+
: new Error(String(squashed));
|
|
99
111
|
renderErrorView(appError, errorView, container, maybeCurrentVNodeRef);
|
|
100
112
|
})));
|
|
101
|
-
});
|
|
113
|
+
}));
|
|
102
114
|
const patchVNode = (maybeCurrentVNode, nextVNodeNullish, container) => {
|
|
103
115
|
const nextVNode = Predicate.isNotNull(nextVNodeNullish)
|
|
104
116
|
? nextVNodeNullish
|
|
@@ -134,6 +146,7 @@ export function makeElement(config) {
|
|
|
134
146
|
...(config.subscriptions && { subscriptions: config.subscriptions }),
|
|
135
147
|
container: config.container,
|
|
136
148
|
...(config.errorView && { errorView: config.errorView }),
|
|
149
|
+
...(config.resources && { resources: config.resources }),
|
|
137
150
|
};
|
|
138
151
|
if ('Flags' in config) {
|
|
139
152
|
return makeRuntime({
|
|
@@ -162,6 +175,7 @@ export function makeApplication(config) {
|
|
|
162
175
|
container: config.container,
|
|
163
176
|
browser: config.browser,
|
|
164
177
|
...(config.errorView && { errorView: config.errorView }),
|
|
178
|
+
...(config.resources && { resources: config.resources }),
|
|
165
179
|
};
|
|
166
180
|
if ('Flags' in config) {
|
|
167
181
|
return makeRuntime({
|
package/dist/task/dom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/task/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAqC,MAAM,QAAQ,CAAA;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAczC;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWxE,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/task/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAqC,MAAM,QAAQ,CAAA;AAEzE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAczC;;;;;;;;;GASG;AACH,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWxE,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAWlC,CAAA;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GACzB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAYlC,CAAA;AAEJ,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAA;AAEhD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,MAAM,EAChB,WAAW,cAAc,KACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAuClC,CAAA"}
|