foldkit 0.7.0-canary.0 → 0.8.0-canary.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.
@@ -39,6 +39,7 @@ const addLinkClickListener = (messageQueue, browserConfig) => {
39
39
  return;
40
40
  }
41
41
  const url = pipe(href, String.split('?'), (parts) => {
42
+ event.preventDefault();
42
43
  const path = Array.headNonEmpty(parts);
43
44
  const searchAndHash = Array.tailNonEmpty(parts);
44
45
  const pathname = pipe(path, String.split('#'), Array.headNonEmpty) || '/';
@@ -57,11 +58,7 @@ const addLinkClickListener = (messageQueue, browserConfig) => {
57
58
  hash,
58
59
  };
59
60
  });
60
- const isSamePageHashLink = Option.isSome(url.hash) && (url.pathname === window.location.pathname || href.startsWith('#'));
61
- if (!isSamePageHashLink) {
62
- event.preventDefault();
63
- Queue.unsafeOffer(messageQueue, browserConfig.onUrlRequest(Internal.make({ url })));
64
- }
61
+ Queue.unsafeOffer(messageQueue, browserConfig.onUrlRequest(Internal.make({ url })));
65
62
  };
66
63
  document.addEventListener('click', onLinkClick);
67
64
  };
@@ -12,7 +12,7 @@ export type BrowserConfig<Message> = {
12
12
  readonly onUrlRequest: (request: UrlRequest) => Message;
13
13
  readonly onUrlChange: (url: Url) => Message;
14
14
  };
15
- export interface RuntimeConfig<Model, Message, StreamDepsMap extends Record<string, Schema.Schema<any>>> {
15
+ export interface RuntimeConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>> {
16
16
  Model: Schema.Schema<Model, any, never>;
17
17
  readonly init: (url?: Url) => [Model, ReadonlyArray<Command<Message>>];
18
18
  readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
@@ -23,7 +23,7 @@ export interface RuntimeConfig<Model, Message, StreamDepsMap extends Record<stri
23
23
  }
24
24
  export type ElementInit<Model, Message> = () => [Model, ReadonlyArray<Command<Message>>];
25
25
  export type ApplicationInit<Model, Message> = (url: Url) => [Model, ReadonlyArray<Command<Message>>];
26
- export interface ElementConfig<Model, Message, StreamDepsMap extends Record<string, Schema.Schema<any>>> {
26
+ export interface ElementConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>> {
27
27
  readonly Model: Schema.Schema<Model, any, never>;
28
28
  readonly init: ElementInit<Model, Message>;
29
29
  readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
@@ -31,7 +31,7 @@ export interface ElementConfig<Model, Message, StreamDepsMap extends Record<stri
31
31
  readonly commandStreams?: CommandStreams<Model, Message, StreamDepsMap>;
32
32
  readonly container: HTMLElement;
33
33
  }
34
- export interface ApplicationConfig<Model, Message, StreamDepsMap extends Record<string, Schema.Schema<any>>> {
34
+ export interface ApplicationConfig<Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>> {
35
35
  readonly Model: Schema.Schema<Model, any, never>;
36
36
  readonly init: ApplicationInit<Model, Message>;
37
37
  readonly update: (model: Model, message: Message) => [Model, ReadonlyArray<Command<Message>>];
@@ -40,13 +40,15 @@ export interface ApplicationConfig<Model, Message, StreamDepsMap extends Record<
40
40
  readonly container: HTMLElement;
41
41
  readonly browser: BrowserConfig<Message>;
42
42
  }
43
- export type CommandStreamConfig<Model, Message, StreamDeps> = {
44
- readonly schema: Schema.Schema<StreamDeps>;
43
+ export type CommandStream<Model, Message, StreamDeps> = {
45
44
  readonly modelToDeps: (model: Model) => StreamDeps;
46
45
  readonly depsToStream: (deps: StreamDeps) => Stream.Stream<Command<Message>>;
47
46
  };
48
- export type CommandStreams<Model, Message, CommandStreamsDeps extends Record<string, Schema.Schema<any>>> = {
49
- readonly [K in keyof CommandStreamsDeps]: CommandStreamConfig<Model, Message, Schema.Schema.Type<CommandStreamsDeps[K]>>;
47
+ type CommandStreamConfig<Model, Message, StreamDeps> = {
48
+ readonly schema: Schema.Schema<StreamDeps>;
49
+ } & CommandStream<Model, Message, StreamDeps>;
50
+ export type CommandStreams<Model, Message, CommandStreamsDeps extends Schema.Struct<any>> = {
51
+ readonly [K in keyof Schema.Schema.Type<CommandStreamsDeps>]: CommandStreamConfig<Model, Message, Schema.Schema.Type<CommandStreamsDeps>[K]>;
50
52
  };
51
53
  export declare const makeCommandStreams: <CommandStreamsDeps extends Schema.Struct<any>>(CommandStreamsDeps: CommandStreamsDeps) => <Model, Message>(configs: { [K in keyof Schema.Schema.Type<CommandStreamsDeps>]: {
52
54
  modelToDeps: (model: Model) => Schema.Schema.Type<CommandStreamsDeps>[K];
@@ -57,13 +59,13 @@ export declare const makeCommandStreams: <CommandStreamsDeps extends Schema.Stru
57
59
  depsToStream: (deps: Schema.Schema.Type<CommandStreamsDeps>[K]) => Stream.Stream<Command<Message>>;
58
60
  }>;
59
61
  type MakeRuntimeReturn = (hmrModel?: unknown) => Effect.Effect<void>;
60
- export declare const makeRuntime: <Model, Message, StreamDepsMap extends Record<string, Schema.Schema<any>>>({ Model, init, update, view, commandStreams, container, browser: browserConfig, }: RuntimeConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
62
+ export declare const makeRuntime: <Model, Message, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>>({ Model, init, update, view, commandStreams, container, browser: browserConfig, }: RuntimeConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
61
63
  export declare const makeElement: <Model, Message extends {
62
64
  _tag: string;
63
- }, StreamDepsMap extends Record<string, Schema.Schema<any>>>(config: ElementConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
65
+ }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>>(config: ElementConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
64
66
  export declare const makeApplication: <Model, Message extends {
65
67
  _tag: string;
66
- }, StreamDepsMap extends Record<string, Schema.Schema<any>>>(config: ApplicationConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
68
+ }, StreamDepsMap extends Schema.Struct<Schema.Struct.Fields>>(config: ApplicationConfig<Model, Message, StreamDepsMap>) => MakeRuntimeReturn;
67
69
  export declare const run: (foldkitRuntime: MakeRuntimeReturn) => void;
68
70
  export {};
69
71
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -30,23 +30,17 @@ export const makeRuntime = ({ Model, init, update, view, commandStreams, contain
30
30
  addNavigationEventListeners(messageQueue, browserConfig);
31
31
  }
32
32
  const modelRef = yield* Ref.make(initModel);
33
- const currentVNodeRef = yield* Ref.make(Option.none());
33
+ const maybeCurrentVNodeRef = yield* Ref.make(Option.none());
34
34
  if (commandStreams) {
35
35
  yield* pipe(commandStreams, Record.toEntries, Effect.forEach(([_key, { schema, modelToDeps, depsToStream }]) => Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDeps), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(Effect.flatMap(enqueueMessage)))), {
36
36
  concurrency: 'unbounded',
37
37
  discard: true,
38
38
  }));
39
39
  }
40
- const render = (model) => view(model).pipe(Effect.flatMap((newVNode) => Effect.gen(function* () {
41
- const currentVNode = yield* Ref.get(currentVNodeRef);
42
- const patchedVNode = yield* Effect.sync(() => {
43
- const vnode = Predicate.isNotNull(newVNode) ? newVNode : h('#text', {}, '');
44
- return Option.match(currentVNode, {
45
- onNone: () => patch(toVNode(container), vnode),
46
- onSome: (prev) => patch(prev, vnode),
47
- });
48
- });
49
- yield* Ref.set(currentVNodeRef, Option.some(patchedVNode));
40
+ const render = (model) => view(model).pipe(Effect.flatMap((nextVNodeNullish) => Effect.gen(function* () {
41
+ const maybeCurrentVNode = yield* Ref.get(maybeCurrentVNodeRef);
42
+ const patchedVNode = yield* Effect.sync(() => patchVNode(maybeCurrentVNode, nextVNodeNullish, container));
43
+ yield* Ref.set(maybeCurrentVNodeRef, Option.some(patchedVNode));
50
44
  })), Effect.provideService(Dispatch, {
51
45
  /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
52
46
  dispatch: (message) => enqueueMessage(message),
@@ -66,6 +60,13 @@ export const makeRuntime = ({ Model, init, update, view, commandStreams, contain
66
60
  }
67
61
  }));
68
62
  });
63
+ const patchVNode = (maybeCurrentVNode, nextVNodeNullish, container) => {
64
+ const nextVNode = Predicate.isNotNull(nextVNodeNullish) ? nextVNodeNullish : h('#text', {}, '');
65
+ return Option.match(maybeCurrentVNode, {
66
+ onNone: () => patch(toVNode(container), nextVNode),
67
+ onSome: (currentVNode) => patch(currentVNode, nextVNode),
68
+ });
69
+ };
69
70
  export const makeElement = (config) => makeRuntime({
70
71
  Model: config.Model,
71
72
  init: () => config.init(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.7.0-canary.0",
3
+ "version": "0.8.0-canary.0",
4
4
  "description": "Elm-inspired UI framework powered by Effect",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",