foldkit 0.1.0-canary.5
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/README.md +96 -0
- package/dist/core/fieldValidation.d.ts +62 -0
- package/dist/core/fieldValidation.d.ts.map +1 -0
- package/dist/core/fieldValidation.js +51 -0
- package/dist/core/fold.d.ts +12 -0
- package/dist/core/fold.d.ts.map +1 -0
- package/dist/core/fold.js +9 -0
- package/dist/core/html.d.ts +176 -0
- package/dist/core/html.d.ts.map +1 -0
- package/dist/core/html.js +117 -0
- package/dist/core/navigation.d.ts +7 -0
- package/dist/core/navigation.d.ts.map +1 -0
- package/dist/core/navigation.js +12 -0
- package/dist/core/parser.d.ts +133 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +177 -0
- package/dist/core/route.d.ts +2 -0
- package/dist/core/route.d.ts.map +1 -0
- package/dist/core/route.js +1 -0
- package/dist/core/runtime/addNavigationEventListeners.d.ts +4 -0
- package/dist/core/runtime/addNavigationEventListeners.d.ts.map +1 -0
- package/dist/core/runtime/addNavigationEventListeners.js +59 -0
- package/dist/core/runtime/index.d.ts +2 -0
- package/dist/core/runtime/index.d.ts.map +1 -0
- package/dist/core/runtime/index.js +1 -0
- package/dist/core/runtime/runtime.d.ts +58 -0
- package/dist/core/runtime/runtime.d.ts.map +1 -0
- package/dist/core/runtime/runtime.js +82 -0
- package/dist/core/schema.d.ts +38 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +16 -0
- package/dist/core/urlRequest.d.ts +30 -0
- package/dist/core/urlRequest.d.ts.map +1 -0
- package/dist/core/urlRequest.js +13 -0
- package/dist/core/vdom.d.ts +5 -0
- package/dist/core/vdom.d.ts.map +1 -0
- package/dist/core/vdom.js +26 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/package.json +82 -0
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Foldkit
|
|
2
|
+
|
|
3
|
+
> ⚠️ **Experimental**: This is a canary release for early adopters and experimenters. APIs may change rapidly.
|
|
4
|
+
|
|
5
|
+
An Elm-inspired UI framework powered by Effect-TS, bringing functional programming patterns to the web.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install foldkit effect
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { Effect, Schema } from 'effect'
|
|
17
|
+
import { Fold, Runtime } from 'foldkit'
|
|
18
|
+
import { Class, Html, OnClick, button, div } from 'foldkit/html'
|
|
19
|
+
import { ST, ts } from 'foldkit/schema'
|
|
20
|
+
|
|
21
|
+
// MODEL
|
|
22
|
+
|
|
23
|
+
const Model = Schema.Number
|
|
24
|
+
type Model = ST<typeof Model>
|
|
25
|
+
|
|
26
|
+
// MESSAGE
|
|
27
|
+
|
|
28
|
+
const Decrement = ts('Decrement')
|
|
29
|
+
const Increment = ts('Increment')
|
|
30
|
+
const Reset = ts('Reset')
|
|
31
|
+
|
|
32
|
+
const Message = Schema.Union(Decrement, Increment, Reset)
|
|
33
|
+
|
|
34
|
+
type Decrement = ST<typeof Decrement>
|
|
35
|
+
type Increment = ST<typeof Increment>
|
|
36
|
+
type Reset = ST<typeof Reset>
|
|
37
|
+
|
|
38
|
+
type Message = ST<typeof Message>
|
|
39
|
+
|
|
40
|
+
// UPDATE
|
|
41
|
+
|
|
42
|
+
const update = Fold.fold<Model, Message>({
|
|
43
|
+
Decrement: (count) => [count - 1, []],
|
|
44
|
+
Increment: (count) => [count + 1, []],
|
|
45
|
+
Reset: () => [0, []],
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// INIT
|
|
49
|
+
|
|
50
|
+
const init: Runtime.ElementInit<Model, Message> = () => [0, []]
|
|
51
|
+
|
|
52
|
+
// VIEW
|
|
53
|
+
|
|
54
|
+
const view = (count: Model): Html =>
|
|
55
|
+
div(
|
|
56
|
+
[Class('min-h-screen bg-white flex flex-col items-center justify-center gap-6 p-6')],
|
|
57
|
+
[
|
|
58
|
+
div([Class('text-6xl font-bold text-gray-800')], [count.toString()]),
|
|
59
|
+
div(
|
|
60
|
+
[Class('flex flex-wrap justify-center gap-4')],
|
|
61
|
+
[
|
|
62
|
+
button([OnClick(Decrement.make()), Class(buttonStyle)], ['-']),
|
|
63
|
+
button([OnClick(Reset.make()), Class(buttonStyle)], ['Reset']),
|
|
64
|
+
button([OnClick(Increment.make()), Class(buttonStyle)], ['+']),
|
|
65
|
+
],
|
|
66
|
+
),
|
|
67
|
+
],
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
// STYLE
|
|
71
|
+
|
|
72
|
+
const buttonStyle = 'bg-black text-white hover:bg-gray-700 px-4 py-2 transition'
|
|
73
|
+
|
|
74
|
+
// RUN
|
|
75
|
+
|
|
76
|
+
const element = Runtime.makeElement({
|
|
77
|
+
Model,
|
|
78
|
+
init,
|
|
79
|
+
update,
|
|
80
|
+
view,
|
|
81
|
+
container: document.getElementById('root')!,
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
Effect.runFork(element)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Core Concepts
|
|
88
|
+
|
|
89
|
+
- **Model**: Your application state (Schema)
|
|
90
|
+
- **Messages**: Tagged unions representing events
|
|
91
|
+
- **Update**: Fold patterns that transform model and return effects
|
|
92
|
+
- **View**: Functions that render model to virtual DOM
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
**📚 Full documentation and examples**: https://github.com/devinjameson/foldkit
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Predicate, Schema as S } from 'effect';
|
|
2
|
+
export declare const FieldSchema: <A, I = A, R = never>(valueSchema: S.Schema<A, I, R>) => S.Union<[S.TaggedStruct<"NotValidated", {
|
|
3
|
+
value: S.Schema<A, I, R>;
|
|
4
|
+
}>, S.TaggedStruct<"Validating", {
|
|
5
|
+
value: S.Schema<A, I, R>;
|
|
6
|
+
}>, S.TaggedStruct<"Valid", {
|
|
7
|
+
value: S.Schema<A, I, R>;
|
|
8
|
+
}>, S.TaggedStruct<"Invalid", {
|
|
9
|
+
value: S.Schema<A, I, R>;
|
|
10
|
+
error: typeof S.String;
|
|
11
|
+
}>]>;
|
|
12
|
+
export declare const Field: {
|
|
13
|
+
NotValidated: <T>(args: {
|
|
14
|
+
value: T;
|
|
15
|
+
}) => Field<T>;
|
|
16
|
+
Validating: <T>(args: {
|
|
17
|
+
value: T;
|
|
18
|
+
}) => Field<T>;
|
|
19
|
+
Valid: <T>(args: {
|
|
20
|
+
value: T;
|
|
21
|
+
}) => Field<T>;
|
|
22
|
+
Invalid: <T>(args: {
|
|
23
|
+
value: T;
|
|
24
|
+
error: string;
|
|
25
|
+
}) => Field<T>;
|
|
26
|
+
$is: (tag: "NotValidated" | "Validating" | "Valid" | "Invalid") => <T>(field: Field<T>) => boolean;
|
|
27
|
+
$match: <T, R>(field: Field<T>, matchers: {
|
|
28
|
+
NotValidated: (args: {
|
|
29
|
+
value: T;
|
|
30
|
+
}) => R;
|
|
31
|
+
Validating: (args: {
|
|
32
|
+
value: T;
|
|
33
|
+
}) => R;
|
|
34
|
+
Valid: (args: {
|
|
35
|
+
value: T;
|
|
36
|
+
}) => R;
|
|
37
|
+
Invalid: (args: {
|
|
38
|
+
value: T;
|
|
39
|
+
error: string;
|
|
40
|
+
}) => R;
|
|
41
|
+
}) => R;
|
|
42
|
+
};
|
|
43
|
+
export type Field<T> = {
|
|
44
|
+
readonly _tag: 'NotValidated';
|
|
45
|
+
readonly value: T;
|
|
46
|
+
} | {
|
|
47
|
+
readonly _tag: 'Validating';
|
|
48
|
+
readonly value: T;
|
|
49
|
+
} | {
|
|
50
|
+
readonly _tag: 'Valid';
|
|
51
|
+
readonly value: T;
|
|
52
|
+
} | {
|
|
53
|
+
readonly _tag: 'Invalid';
|
|
54
|
+
readonly value: T;
|
|
55
|
+
readonly error: string;
|
|
56
|
+
};
|
|
57
|
+
export type FieldValidation<T> = [Predicate.Predicate<T>, string];
|
|
58
|
+
export declare const required: (fieldName: string) => FieldValidation<string>;
|
|
59
|
+
export declare const minLength: (min: number, message: (min: number) => string) => FieldValidation<string>;
|
|
60
|
+
export declare const regex: (regex: RegExp, message: string) => FieldValidation<string>;
|
|
61
|
+
export declare const validateField: <T>(fieldValidations: FieldValidation<T>[]) => (value: T) => Field<T>;
|
|
62
|
+
//# sourceMappingURL=fieldValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldValidation.d.ts","sourceRoot":"","sources":["../../src/core/fieldValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,IAAI,CAAC,EAAgB,MAAM,QAAQ,CAAA;AAE7E,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;;;;;;;;IAO9E,CAAA;AAED,eAAO,MAAM,KAAK;mBACD,CAAC,QAAQ;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAG,KAAK,CAAC,CAAC,CAAC;iBAClC,CAAC,QAAQ;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAG,KAAK,CAAC,CAAC,CAAC;YACrC,CAAC,QAAQ;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAG,KAAK,CAAC,CAAC,CAAC;cAC9B,CAAC,QAAQ;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAG,KAAK,CAAC,CAAC,CAAC;eAKjD,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,MACxD,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAG,OAAO;aAEtB,CAAC,EAAE,CAAC,SACJ,KAAK,CAAC,CAAC,CAAC,YACL;QACR,YAAY,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAA;SAAE,KAAK,CAAC,CAAA;QACvC,UAAU,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAA;SAAE,KAAK,CAAC,CAAA;QACrC,KAAK,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAA;SAAE,KAAK,CAAC,CAAA;QAChC,OAAO,EAAE,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,KAAK,CAAC,CAAA;KAClD,KACA,CAAC;CAaL,CAAA;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,IACf;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC7C;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3E,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAEjE,eAAO,MAAM,QAAQ,GAAI,WAAW,MAAM,KAAG,eAAe,CAAC,MAAM,CAGlE,CAAA;AAED,eAAO,MAAM,SAAS,GACpB,KAAK,MAAM,EACX,SAAS,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KAC/B,eAAe,CAAC,MAAM,CAA0E,CAAA;AAEnG,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,KAAG,eAAe,CAAC,MAAM,CAG5E,CAAA;AAED,eAAO,MAAM,aAAa,GACvB,CAAC,EAAE,kBAAkB,eAAe,CAAC,CAAC,CAAC,EAAE,MACzC,OAAO,CAAC,KAAG,KAAK,CAAC,CAAC,CAelB,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Number, Option, Schema as S, String, flow } from 'effect';
|
|
2
|
+
export const FieldSchema = (valueSchema) => {
|
|
3
|
+
return S.Union(S.TaggedStruct('NotValidated', { value: valueSchema }), S.TaggedStruct('Validating', { value: valueSchema }), S.TaggedStruct('Valid', { value: valueSchema }), S.TaggedStruct('Invalid', { value: valueSchema, error: S.String }));
|
|
4
|
+
};
|
|
5
|
+
export const Field = {
|
|
6
|
+
NotValidated: (args) => ({ _tag: 'NotValidated', ...args }),
|
|
7
|
+
Validating: (args) => ({ _tag: 'Validating', ...args }),
|
|
8
|
+
Valid: (args) => ({ _tag: 'Valid', ...args }),
|
|
9
|
+
Invalid: (args) => ({
|
|
10
|
+
_tag: 'Invalid',
|
|
11
|
+
...args,
|
|
12
|
+
}),
|
|
13
|
+
$is: (tag) => (field) => field._tag === tag,
|
|
14
|
+
$match: (field, matchers) => {
|
|
15
|
+
// TODO: Use Match here (ran into Unify<R> vs. R issues)
|
|
16
|
+
switch (field._tag) {
|
|
17
|
+
case 'NotValidated':
|
|
18
|
+
return matchers.NotValidated({ value: field.value });
|
|
19
|
+
case 'Validating':
|
|
20
|
+
return matchers.Validating({ value: field.value });
|
|
21
|
+
case 'Valid':
|
|
22
|
+
return matchers.Valid({ value: field.value });
|
|
23
|
+
case 'Invalid':
|
|
24
|
+
return matchers.Invalid({ value: field.value, error: field.error });
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export const required = (fieldName) => [
|
|
29
|
+
String.isNonEmpty,
|
|
30
|
+
`${fieldName} is required`,
|
|
31
|
+
];
|
|
32
|
+
export const minLength = (min, message) => [flow(String.length, Number.greaterThanOrEqualTo(min)), message(min)];
|
|
33
|
+
export const regex = (regex, message) => [
|
|
34
|
+
flow(String.match(regex), Option.isSome),
|
|
35
|
+
message,
|
|
36
|
+
];
|
|
37
|
+
export const validateField = (fieldValidations) => (value) => {
|
|
38
|
+
for (const [predicate, message] of fieldValidations) {
|
|
39
|
+
if (!predicate(value)) {
|
|
40
|
+
return {
|
|
41
|
+
_tag: 'Invalid',
|
|
42
|
+
value,
|
|
43
|
+
error: message,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
_tag: 'Valid',
|
|
49
|
+
value,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ExtractTag, Tags } from 'effect/Types';
|
|
2
|
+
import { Command } from './runtime';
|
|
3
|
+
type Update<Model, Message> = [Model, Command<Message>[]];
|
|
4
|
+
export type Init<Model, Message> = () => Update<Model, Message>;
|
|
5
|
+
export type FoldReturn<Model, Message> = (model: Model, message: Message) => [Model, Command<Message>[]];
|
|
6
|
+
export declare function fold<Model, Message extends {
|
|
7
|
+
readonly _tag: string;
|
|
8
|
+
}>(handlers: {
|
|
9
|
+
[K in Tags<Message>]: (model: Model, message: ExtractTag<Message, K>) => [Model, Command<Message>[]];
|
|
10
|
+
}): FoldReturn<Model, Message>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/core/fold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AACzD,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAE/D,MAAM,MAAM,UAAU,CAAC,KAAK,EAAE,OAAO,IAAI,CACvC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,KACb,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAEhC,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE;KAC9E,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,KAC5B,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;CACjC,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAW7B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function fold(handlers) {
|
|
2
|
+
return (model, message) => {
|
|
3
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
4
|
+
const tag = message._tag;
|
|
5
|
+
return handlers[tag](model,
|
|
6
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
7
|
+
message);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Data, Effect } from 'effect';
|
|
2
|
+
import { Dispatch } from './runtime';
|
|
3
|
+
import { VNode } from './vdom';
|
|
4
|
+
export type Html = Effect.Effect<VNode | null, never, Dispatch>;
|
|
5
|
+
export type Child = Html | string;
|
|
6
|
+
export type Attribute<Message> = Data.TaggedEnum<{
|
|
7
|
+
Class: {
|
|
8
|
+
readonly value: string;
|
|
9
|
+
};
|
|
10
|
+
Id: {
|
|
11
|
+
readonly value: string;
|
|
12
|
+
};
|
|
13
|
+
OnClick: {
|
|
14
|
+
readonly message: Message;
|
|
15
|
+
};
|
|
16
|
+
OnChange: {
|
|
17
|
+
readonly f: (value: string) => Message;
|
|
18
|
+
};
|
|
19
|
+
OnSubmit: {
|
|
20
|
+
readonly message: Message;
|
|
21
|
+
};
|
|
22
|
+
Value: {
|
|
23
|
+
readonly value: string;
|
|
24
|
+
};
|
|
25
|
+
Placeholder: {
|
|
26
|
+
readonly value: string;
|
|
27
|
+
};
|
|
28
|
+
Disabled: {
|
|
29
|
+
readonly value: boolean;
|
|
30
|
+
};
|
|
31
|
+
Type: {
|
|
32
|
+
readonly value: string;
|
|
33
|
+
};
|
|
34
|
+
Min: {
|
|
35
|
+
readonly value: string;
|
|
36
|
+
};
|
|
37
|
+
For: {
|
|
38
|
+
readonly value: string;
|
|
39
|
+
};
|
|
40
|
+
Href: {
|
|
41
|
+
readonly value: string;
|
|
42
|
+
};
|
|
43
|
+
}>;
|
|
44
|
+
export declare const Class_: <A>(args: {
|
|
45
|
+
readonly value: string;
|
|
46
|
+
}) => {
|
|
47
|
+
readonly _tag: "Class";
|
|
48
|
+
readonly value: string;
|
|
49
|
+
}, Id_: <A>(args: {
|
|
50
|
+
readonly value: string;
|
|
51
|
+
}) => {
|
|
52
|
+
readonly _tag: "Id";
|
|
53
|
+
readonly value: string;
|
|
54
|
+
}, OnClick_: <A>(args: {
|
|
55
|
+
readonly message: A;
|
|
56
|
+
}) => {
|
|
57
|
+
readonly _tag: "OnClick";
|
|
58
|
+
readonly message: A;
|
|
59
|
+
}, OnChange_: <A>(args: {
|
|
60
|
+
readonly f: (value: string) => A;
|
|
61
|
+
}) => {
|
|
62
|
+
readonly _tag: "OnChange";
|
|
63
|
+
readonly f: (value: string) => A;
|
|
64
|
+
}, OnSubmit_: <A>(args: {
|
|
65
|
+
readonly message: A;
|
|
66
|
+
}) => {
|
|
67
|
+
readonly _tag: "OnSubmit";
|
|
68
|
+
readonly message: A;
|
|
69
|
+
}, Value_: <A>(args: {
|
|
70
|
+
readonly value: string;
|
|
71
|
+
}) => {
|
|
72
|
+
readonly _tag: "Value";
|
|
73
|
+
readonly value: string;
|
|
74
|
+
}, Placeholder_: <A>(args: {
|
|
75
|
+
readonly value: string;
|
|
76
|
+
}) => {
|
|
77
|
+
readonly _tag: "Placeholder";
|
|
78
|
+
readonly value: string;
|
|
79
|
+
}, Disabled_: <A>(args: {
|
|
80
|
+
readonly value: boolean;
|
|
81
|
+
}) => {
|
|
82
|
+
readonly _tag: "Disabled";
|
|
83
|
+
readonly value: boolean;
|
|
84
|
+
}, Type_: <A>(args: {
|
|
85
|
+
readonly value: string;
|
|
86
|
+
}) => {
|
|
87
|
+
readonly _tag: "Type";
|
|
88
|
+
readonly value: string;
|
|
89
|
+
}, Min_: <A>(args: {
|
|
90
|
+
readonly value: string;
|
|
91
|
+
}) => {
|
|
92
|
+
readonly _tag: "Min";
|
|
93
|
+
readonly value: string;
|
|
94
|
+
}, For_: <A>(args: {
|
|
95
|
+
readonly value: string;
|
|
96
|
+
}) => {
|
|
97
|
+
readonly _tag: "For";
|
|
98
|
+
readonly value: string;
|
|
99
|
+
}, Href_: <A>(args: {
|
|
100
|
+
readonly value: string;
|
|
101
|
+
}) => {
|
|
102
|
+
readonly _tag: "Href";
|
|
103
|
+
readonly value: string;
|
|
104
|
+
};
|
|
105
|
+
export declare const Class: (value: string) => {
|
|
106
|
+
readonly _tag: "Class";
|
|
107
|
+
readonly value: string;
|
|
108
|
+
};
|
|
109
|
+
export declare const OnClick: <Message>(message: Message) => {
|
|
110
|
+
readonly _tag: "OnClick";
|
|
111
|
+
readonly message: Message;
|
|
112
|
+
};
|
|
113
|
+
export declare const Id: (value: string) => {
|
|
114
|
+
readonly _tag: "Id";
|
|
115
|
+
readonly value: string;
|
|
116
|
+
};
|
|
117
|
+
export declare const OnChange: <Message>(f: (value: string) => Message) => {
|
|
118
|
+
readonly _tag: "OnChange";
|
|
119
|
+
readonly f: (value: string) => Message;
|
|
120
|
+
};
|
|
121
|
+
export declare const OnSubmit: <Message>(message: Message) => {
|
|
122
|
+
readonly _tag: "OnSubmit";
|
|
123
|
+
readonly message: Message;
|
|
124
|
+
};
|
|
125
|
+
export declare const Value: (value: string) => {
|
|
126
|
+
readonly _tag: "Value";
|
|
127
|
+
readonly value: string;
|
|
128
|
+
};
|
|
129
|
+
export declare const Placeholder: (value: string) => {
|
|
130
|
+
readonly _tag: "Placeholder";
|
|
131
|
+
readonly value: string;
|
|
132
|
+
};
|
|
133
|
+
export declare const Type: (value: string) => {
|
|
134
|
+
readonly _tag: "Type";
|
|
135
|
+
readonly value: string;
|
|
136
|
+
};
|
|
137
|
+
export declare const Min: (value: string) => {
|
|
138
|
+
readonly _tag: "Min";
|
|
139
|
+
readonly value: string;
|
|
140
|
+
};
|
|
141
|
+
export declare const For: (value: string) => {
|
|
142
|
+
readonly _tag: "For";
|
|
143
|
+
readonly value: string;
|
|
144
|
+
};
|
|
145
|
+
export declare const Href: (value: string) => {
|
|
146
|
+
readonly _tag: "Href";
|
|
147
|
+
readonly value: string;
|
|
148
|
+
};
|
|
149
|
+
export declare const Disabled: (value: boolean) => {
|
|
150
|
+
readonly _tag: "Disabled";
|
|
151
|
+
readonly value: boolean;
|
|
152
|
+
};
|
|
153
|
+
export declare const createElement: <Message>(tagName: string, attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
154
|
+
export declare const div: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
155
|
+
export declare const span: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
156
|
+
export declare const button: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
157
|
+
export declare const h1: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
158
|
+
export declare const h2: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
159
|
+
export declare const h3: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
160
|
+
export declare const h4: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
161
|
+
export declare const h5: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
162
|
+
export declare const h6: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
163
|
+
export declare const p: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
164
|
+
export declare const ul: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
165
|
+
export declare const ol: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
166
|
+
export declare const li: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
167
|
+
export declare const a: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
168
|
+
export declare const form: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
169
|
+
export declare const label: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
170
|
+
export declare const textarea: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
171
|
+
export declare const select: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
172
|
+
export declare const option: <Message>(attributes?: ReadonlyArray<Attribute<Message>>, children?: ReadonlyArray<Child>) => Html;
|
|
173
|
+
export declare const input: <Message>(attributes?: ReadonlyArray<Attribute<Message>>) => Html;
|
|
174
|
+
export declare const img: <Message>(attributes?: ReadonlyArray<Attribute<Message>>) => Html;
|
|
175
|
+
export declare const empty: Html;
|
|
176
|
+
//# sourceMappingURL=html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/core/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Array, Data, Effect, Match, Predicate, Ref, String, flow, pipe } from 'effect';
|
|
2
|
+
import { h } from 'snabbdom';
|
|
3
|
+
import { Dispatch } from './runtime';
|
|
4
|
+
export const { Class: Class_, Id: Id_, OnClick: OnClick_, OnChange: OnChange_, OnSubmit: OnSubmit_, Value: Value_, Placeholder: Placeholder_, Disabled: Disabled_, Type: Type_, Min: Min_, For: For_, Href: Href_, } = Data.taggedEnum();
|
|
5
|
+
export const Class = (value) => Class_({ value });
|
|
6
|
+
export const OnClick = (message) => OnClick_({ message });
|
|
7
|
+
export const Id = (value) => Id_({ value });
|
|
8
|
+
export const OnChange = (f) => OnChange_({ f });
|
|
9
|
+
export const OnSubmit = (message) => OnSubmit_({ message });
|
|
10
|
+
export const Value = (value) => Value_({ value });
|
|
11
|
+
export const Placeholder = (value) => Placeholder_({ value });
|
|
12
|
+
export const Type = (value) => Type_({ value });
|
|
13
|
+
export const Min = (value) => Min_({ value });
|
|
14
|
+
export const For = (value) => For_({ value });
|
|
15
|
+
export const Href = (value) => Href_({ value });
|
|
16
|
+
export const Disabled = (value) => Disabled_({ value });
|
|
17
|
+
const buildVNodeData = (attributes) => Effect.gen(function* () {
|
|
18
|
+
const { dispatch } = yield* Dispatch;
|
|
19
|
+
const dataRef = yield* Ref.make({});
|
|
20
|
+
yield* Effect.forEach(attributes, (attr) => Match.value(attr).pipe(Match.tagsExhaustive({
|
|
21
|
+
Class: ({ value }) => Effect.gen(function* () {
|
|
22
|
+
const classObject = pipe(value, String.split(' '), Array.filter(flow(String.trim, String.isNonEmpty)), Array.reduce({}, (acc, className) => ({ ...acc, [className]: true })));
|
|
23
|
+
yield* Ref.update(dataRef, (data) => ({ ...data, class: classObject }));
|
|
24
|
+
}),
|
|
25
|
+
Id: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
26
|
+
...data,
|
|
27
|
+
props: { ...data.props, id: value },
|
|
28
|
+
})),
|
|
29
|
+
OnClick: ({ message }) => Ref.update(dataRef, (data) => ({
|
|
30
|
+
...data,
|
|
31
|
+
on: {
|
|
32
|
+
...data.on,
|
|
33
|
+
click: () => Effect.runSync(dispatch(message)),
|
|
34
|
+
},
|
|
35
|
+
})),
|
|
36
|
+
OnChange: ({ f }) => Ref.update(dataRef, (data) => ({
|
|
37
|
+
...data,
|
|
38
|
+
on: {
|
|
39
|
+
...data.on,
|
|
40
|
+
input: (event) => {
|
|
41
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
42
|
+
const target = event.target;
|
|
43
|
+
Effect.runSync(dispatch(f(target.value)));
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
})),
|
|
47
|
+
OnSubmit: ({ message }) => Ref.update(dataRef, (data) => ({
|
|
48
|
+
...data,
|
|
49
|
+
on: {
|
|
50
|
+
...data.on,
|
|
51
|
+
submit: (event) => {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
Effect.runSync(dispatch(message));
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
})),
|
|
57
|
+
Value: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
58
|
+
...data,
|
|
59
|
+
props: { ...data.props, value },
|
|
60
|
+
})),
|
|
61
|
+
Placeholder: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
62
|
+
...data,
|
|
63
|
+
props: { ...data.props, placeholder: value },
|
|
64
|
+
})),
|
|
65
|
+
Disabled: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
66
|
+
...data,
|
|
67
|
+
props: { ...data.props, disabled: value },
|
|
68
|
+
})),
|
|
69
|
+
Type: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
70
|
+
...data,
|
|
71
|
+
props: { ...data.props, type: value },
|
|
72
|
+
})),
|
|
73
|
+
Min: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
74
|
+
...data,
|
|
75
|
+
props: { ...data.props, min: value },
|
|
76
|
+
})),
|
|
77
|
+
For: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
78
|
+
...data,
|
|
79
|
+
props: { ...data.props, for: value },
|
|
80
|
+
})),
|
|
81
|
+
Href: ({ value }) => Ref.update(dataRef, (data) => ({
|
|
82
|
+
...data,
|
|
83
|
+
props: { ...data.props, href: value },
|
|
84
|
+
})),
|
|
85
|
+
})));
|
|
86
|
+
return yield* Ref.get(dataRef);
|
|
87
|
+
});
|
|
88
|
+
const processVNodeChildren = (children) => Effect.forEach(children, (child) => Predicate.isString(child) ? Effect.succeed(child) : child).pipe(Effect.map(Array.filter(Predicate.isNotNull)));
|
|
89
|
+
export const createElement = (tagName, attributes = [], children = []) => Effect.gen(function* () {
|
|
90
|
+
const vnodeData = yield* buildVNodeData(attributes);
|
|
91
|
+
const vnodeChildren = yield* processVNodeChildren(children);
|
|
92
|
+
return h(tagName, vnodeData, vnodeChildren);
|
|
93
|
+
});
|
|
94
|
+
const element = (tagName) => (attributes = [], children = []) => createElement(tagName, attributes, children);
|
|
95
|
+
const voidElement = (tagName) => (attributes = []) => createElement(tagName, attributes, []);
|
|
96
|
+
export const div = element('div');
|
|
97
|
+
export const span = element('span');
|
|
98
|
+
export const button = element('button');
|
|
99
|
+
export const h1 = element('h1');
|
|
100
|
+
export const h2 = element('h2');
|
|
101
|
+
export const h3 = element('h3');
|
|
102
|
+
export const h4 = element('h4');
|
|
103
|
+
export const h5 = element('h5');
|
|
104
|
+
export const h6 = element('h6');
|
|
105
|
+
export const p = element('p');
|
|
106
|
+
export const ul = element('ul');
|
|
107
|
+
export const ol = element('ol');
|
|
108
|
+
export const li = element('li');
|
|
109
|
+
export const a = element('a');
|
|
110
|
+
export const form = element('form');
|
|
111
|
+
export const label = element('label');
|
|
112
|
+
export const textarea = element('textarea');
|
|
113
|
+
export const select = element('select');
|
|
114
|
+
export const option = element('option');
|
|
115
|
+
export const input = voidElement('input');
|
|
116
|
+
export const img = voidElement('img');
|
|
117
|
+
export const empty = Effect.succeed(null);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
export declare const pushUrl: (url: string) => Effect.Effect<void>;
|
|
3
|
+
export declare const replaceUrl: (url: string) => Effect.Effect<void>;
|
|
4
|
+
export declare const back: () => Effect.Effect<void>;
|
|
5
|
+
export declare const forward: () => Effect.Effect<void>;
|
|
6
|
+
export declare const load: (href: string) => Effect.Effect<void>;
|
|
7
|
+
//# sourceMappingURL=navigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/core/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAIpD,CAAA;AAEJ,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAIvD,CAAA;AAEJ,eAAO,MAAM,IAAI,QAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAA6C,CAAA;AAEvF,eAAO,MAAM,OAAO,QAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgD,CAAA;AAE7F,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CACL,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
export const pushUrl = (url) => Effect.sync(() => {
|
|
3
|
+
window.history.pushState({}, '', url);
|
|
4
|
+
window.dispatchEvent(new CustomEvent('foldkit:urlchange'));
|
|
5
|
+
});
|
|
6
|
+
export const replaceUrl = (url) => Effect.sync(() => {
|
|
7
|
+
window.history.replaceState({}, '', url);
|
|
8
|
+
window.dispatchEvent(new CustomEvent('foldkit:urlchange'));
|
|
9
|
+
});
|
|
10
|
+
export const back = () => Effect.sync(() => window.history.back());
|
|
11
|
+
export const forward = () => Effect.sync(() => window.history.forward());
|
|
12
|
+
export const load = (href) => Effect.sync(() => window.location.assign(href));
|