@effect-app/vue 0.87.0-next.14 → 0.87.0-next.16
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/CHANGELOG.md +18 -0
- package/_cjs/form.cjs +142 -1
- package/_cjs/form.cjs.map +1 -1
- package/_src/form.ts +216 -174
- package/dist/form.d.ts +25 -4
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +151 -2
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @effect-app/vue
|
|
2
2
|
|
|
3
|
+
## 0.87.0-next.16
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 660d57a: upd
|
|
8
|
+
- Updated dependencies [660d57a]
|
|
9
|
+
- @effect-app/schema@0.150.0-next.11
|
|
10
|
+
- @effect-app/vue@0.87.0-next.16
|
|
11
|
+
- @effect-app/prelude@0.107.0-next.14
|
|
12
|
+
|
|
13
|
+
## 0.87.0-next.15
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- 5f76678: reimplement vue form
|
|
18
|
+
- Updated dependencies [5f76678]
|
|
19
|
+
- @effect-app/vue@0.87.0-next.15
|
|
20
|
+
|
|
3
21
|
## 0.87.0-next.14
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/_cjs/form.cjs
CHANGED
|
@@ -3,12 +3,24 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.buildFieldInfoFromFields = buildFieldInfoFromFields;
|
|
7
|
+
exports.buildFormFromSchema = void 0;
|
|
6
8
|
exports.convertIn = convertIn;
|
|
7
9
|
exports.convertOut = convertOut;
|
|
8
10
|
exports.convertOutInt = convertOutInt;
|
|
9
|
-
exports.
|
|
11
|
+
exports.customSchemaErrors = void 0;
|
|
12
|
+
exports.getMetadataFromSchema = getMetadataFromSchema;
|
|
13
|
+
exports.translate = void 0;
|
|
14
|
+
var tsplus_module_1 = _interopRequireWildcard(require("@effect/schema/Parser"));
|
|
15
|
+
var tsplus_module_2 = _interopRequireWildcard(require("@effect-app/prelude"));
|
|
16
|
+
var tsplus_module_3 = _interopRequireWildcard(require("effect/Either"));
|
|
17
|
+
var tsplus_module_4 = _interopRequireWildcard(require("@effect-app/core/Function"));
|
|
18
|
+
var _schema = require("@effect-app/schema");
|
|
10
19
|
var _intl = require("@formatjs/intl");
|
|
11
20
|
var _vue = require("vue");
|
|
21
|
+
var JSONSchema = _interopRequireWildcard(require("@effect/schema/JSONSchema"));
|
|
22
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
23
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
24
|
function convertIn(v, type) {
|
|
13
25
|
return v === null ? "" : type === "text" ? v : `${v}`;
|
|
14
26
|
}
|
|
@@ -20,6 +32,14 @@ function convertOutInt(v, type) {
|
|
|
20
32
|
function convertOut(v, set, type) {
|
|
21
33
|
return set(convertOutInt(v, type));
|
|
22
34
|
}
|
|
35
|
+
function buildFieldInfoFromFields(fields) {
|
|
36
|
+
if (!_schema.AST.isTypeLiteral(fields.ast)) throw new Error("not a struct type");
|
|
37
|
+
return fields.ast.propertySignatures.reduce((prev, cur) => {
|
|
38
|
+
;
|
|
39
|
+
prev[cur.name] = buildFieldInfo(cur);
|
|
40
|
+
return prev;
|
|
41
|
+
}, {});
|
|
42
|
+
}
|
|
23
43
|
const f = Symbol();
|
|
24
44
|
class PhantomTypeParameter {}
|
|
25
45
|
// type GetSchemaFromProp<T> = T extends Field<infer S, any, any, any> ? S
|
|
@@ -29,4 +49,125 @@ const defaultIntl = (0, _intl.createIntl)({
|
|
|
29
49
|
});
|
|
30
50
|
const translate = exports.translate = (0, _vue.ref)(defaultIntl.formatMessage.bind(defaultIntl));
|
|
31
51
|
const customSchemaErrors = exports.customSchemaErrors = (0, _vue.ref)(new Map());
|
|
52
|
+
function buildFieldInfo(property) {
|
|
53
|
+
const propertyKey = property.name;
|
|
54
|
+
const schema = _schema.S.make(property.type);
|
|
55
|
+
const metadata = getMetadataFromSchema(property.type); // TODO
|
|
56
|
+
const parse = tsplus_module_1.parseEither(schema);
|
|
57
|
+
const nullable = _schema.AST.isUnion(property.type) && property.type.types.includes(tsplus_module_2.Schema2.null.ast);
|
|
58
|
+
const realSelf = nullable && _schema.AST.isUnion(property.type) ? property.type.types.filter(_ => _ !== tsplus_module_2.Schema2.null.ast)[0] : property.type;
|
|
59
|
+
function renderError(e, v) {
|
|
60
|
+
const err = e.toString();
|
|
61
|
+
const custom = customSchemaErrors.value.get(realSelf);
|
|
62
|
+
return custom ? custom(err, e, v) : translate.value({
|
|
63
|
+
defaultMessage: "The entered value is not a valid {type}: {message}",
|
|
64
|
+
id: "validation.not_a_valid"
|
|
65
|
+
}, {
|
|
66
|
+
type: translate.value({
|
|
67
|
+
defaultMessage: (0, _vue.capitalize)(propertyKey.toString()),
|
|
68
|
+
id: `fieldNames.${String(propertyKey)}`
|
|
69
|
+
}),
|
|
70
|
+
message: err // TODO err.slice(err.indexOf("expected")) // TODO: this is not translated.
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const stringRules = [v => v === null || metadata.minLength === undefined || v.length >= metadata.minLength || translate.value({
|
|
74
|
+
defaultMessage: "The field requires at least {minLength} characters",
|
|
75
|
+
id: "validation.string.minLength"
|
|
76
|
+
}, {
|
|
77
|
+
minLength: metadata.minLength
|
|
78
|
+
}), v => v === null || metadata.maxLength === undefined || v.length <= metadata.maxLength || translate.value({
|
|
79
|
+
defaultMessage: "The field cannot have more than {maxLength} characters",
|
|
80
|
+
id: "validation.string.maxLength"
|
|
81
|
+
}, {
|
|
82
|
+
maxLength: metadata.maxLength
|
|
83
|
+
})];
|
|
84
|
+
const numberRules = [v => v === null || metadata.minimum === undefined || metadata.minimumExclusive && v > metadata.minimum || !metadata.minimumExclusive && v >= metadata.minimum || translate.value({
|
|
85
|
+
defaultMessage: "The value should be {isExclusive, select, true {larger than} other {at least}} {minimum}",
|
|
86
|
+
id: "validation.number.min"
|
|
87
|
+
}, {
|
|
88
|
+
isExclusive: metadata.minimumExclusive,
|
|
89
|
+
minimum: metadata.minimum
|
|
90
|
+
}), v => v === null || metadata.maximum === undefined || metadata.maximumExclusive && v < metadata.maximum || !metadata.maximumExclusive && v <= metadata.maximum || translate.value({
|
|
91
|
+
defaultMessage: "The value should be {isExclusive, select, true {smaller than} other {at most}} {maximum}",
|
|
92
|
+
id: "validation.number.max"
|
|
93
|
+
}, {
|
|
94
|
+
isExclusive: metadata.maximumExclusive,
|
|
95
|
+
maximum: metadata.maximum
|
|
96
|
+
})];
|
|
97
|
+
const parseRule = v => tsplus_module_4.pipe(parse(v), _ => tsplus_module_3.match(_, {
|
|
98
|
+
onLeft: _ => renderError(_, v),
|
|
99
|
+
onRight: () => true
|
|
100
|
+
}));
|
|
101
|
+
const rules = [...(metadata.type === "text" ? stringRules : numberRules), parseRule];
|
|
102
|
+
const info = {
|
|
103
|
+
type: metadata.type,
|
|
104
|
+
rules: [v => !metadata.required || v !== "" || translate.value({
|
|
105
|
+
defaultMessage: "The field cannot be empty",
|
|
106
|
+
id: "validation.empty"
|
|
107
|
+
}), v => {
|
|
108
|
+
const converted = convertOutInt(v, metadata.type);
|
|
109
|
+
for (const r of rules) {
|
|
110
|
+
const res = r(converted);
|
|
111
|
+
if (res !== true) {
|
|
112
|
+
return res;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}],
|
|
117
|
+
metadata
|
|
118
|
+
};
|
|
119
|
+
return info;
|
|
120
|
+
}
|
|
121
|
+
const buildFormFromSchema = (s, state, onSubmit) => {
|
|
122
|
+
const fields = buildFieldInfoFromFields(s);
|
|
123
|
+
const parse = tsplus_module_1.parseSync(s);
|
|
124
|
+
const isDirty = (0, _vue.ref)(false);
|
|
125
|
+
const isValid = (0, _vue.ref)(true);
|
|
126
|
+
const submit1 = onSubmit => async e => {
|
|
127
|
+
const r = await e;
|
|
128
|
+
if (!r.valid) return;
|
|
129
|
+
return onSubmit(parse(state.value));
|
|
130
|
+
};
|
|
131
|
+
const submit = submit1(onSubmit);
|
|
132
|
+
(0, _vue.watch)(state, v => {
|
|
133
|
+
// TODO: do better
|
|
134
|
+
isDirty.value = JSON.stringify(v) !== JSON.stringify(state.value);
|
|
135
|
+
}, {
|
|
136
|
+
deep: true
|
|
137
|
+
});
|
|
138
|
+
const submitFromState = () => submit(Promise.resolve({
|
|
139
|
+
valid: isValid.value
|
|
140
|
+
}));
|
|
141
|
+
return {
|
|
142
|
+
fields,
|
|
143
|
+
submit,
|
|
144
|
+
submitFromState,
|
|
145
|
+
isDirty,
|
|
146
|
+
isValid
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
exports.buildFormFromSchema = buildFormFromSchema;
|
|
150
|
+
function getMetadataFromSchema(ast) {
|
|
151
|
+
const nullable = _schema.AST.isUnion(ast) && ast.types.includes(tsplus_module_2.Schema2.null.ast);
|
|
152
|
+
const realSelf = nullable && _schema.AST.isUnion(ast) ? ast.types.filter(_ => _ !== tsplus_module_2.Schema2.null.ast)[0] : ast;
|
|
153
|
+
let jschema;
|
|
154
|
+
try {
|
|
155
|
+
jschema = JSONSchema.to(_schema.S.make(realSelf));
|
|
156
|
+
} catch (err) {
|
|
157
|
+
jschema = {};
|
|
158
|
+
console.warn("error getting jsonschema from ", err, ast);
|
|
159
|
+
}
|
|
160
|
+
const isNumber = jschema.type === "number" || jschema.type === "integer";
|
|
161
|
+
const isInt = jschema.type === "integer";
|
|
162
|
+
return {
|
|
163
|
+
type: isInt ? "int" : isNumber ? "float" : "text",
|
|
164
|
+
minimum: jschema.minimum,
|
|
165
|
+
minimumExclusive: jschema.exclusiveMinimum,
|
|
166
|
+
maximum: jschema.maximum,
|
|
167
|
+
maximumExclusive: jschema.exclusiveMaximum,
|
|
168
|
+
minLength: jschema.minLength,
|
|
169
|
+
maxLength: jschema.maxLength,
|
|
170
|
+
required: !nullable
|
|
171
|
+
};
|
|
172
|
+
}
|
|
32
173
|
//# sourceMappingURL=form.cjs.map
|
package/_cjs/form.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.cjs","names":["
|
|
1
|
+
{"version":3,"file":"form.cjs","names":["_schema","require","_intl","_vue","JSONSchema","_interopRequireWildcard","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","convertIn","v","type","convertOutInt","trim","c","parseFloat","parseInt","convertOut","buildFieldInfoFromFields","fields","AST","isTypeLiteral","ast","Error","propertySignatures","reduce","prev","cur","name","buildFieldInfo","f","Symbol","PhantomTypeParameter","defaultIntl","createIntl","locale","translate","exports","ref","formatMessage","bind","customSchemaErrors","Map","property","propertyKey","schema","S","make","metadata","getMetadataFromSchema","parse","tsplus_module_1","parseEither","nullable","isUnion","types","includes","tsplus_module_2","Schema2","null","realSelf","filter","_","renderError","err","toString","custom","value","defaultMessage","id","capitalize","String","message","stringRules","minLength","undefined","length","maxLength","numberRules","minimum","minimumExclusive","isExclusive","maximum","maximumExclusive","parseRule","tsplus_module_4","pipe","tsplus_module_3","match","onLeft","onRight","rules","info","required","converted","res","buildFormFromSchema","s","state","onSubmit","parseSync","isDirty","isValid","submit1","valid","submit","watch","JSON","stringify","deep","submitFromState","Promise","resolve","jschema","to","console","warn","isNumber","isInt","exclusiveMinimum","exclusiveMaximum"],"sources":["../_src/form.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/_src/form.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import { AST, S } from "@effect-app/schema"
|
|
1
2
|
import type { Schema } from "@effect-app/schema"
|
|
2
3
|
import { createIntl, type IntlFormatters } from "@formatjs/intl"
|
|
3
|
-
import {
|
|
4
|
+
import type { Ref } from "vue"
|
|
5
|
+
import { capitalize, ref, watch } from "vue"
|
|
6
|
+
|
|
7
|
+
import * as JSONSchema from "@effect/schema/JSONSchema"
|
|
8
|
+
import type { ParseError } from "@effect/schema/ParseResult"
|
|
4
9
|
|
|
5
10
|
export function convertIn(v: string | null, type?: "text" | "float" | "int") {
|
|
6
11
|
return v === null ? "" : type === "text" ? v : `${v}`
|
|
@@ -16,22 +21,20 @@ export function convertOut(v: string, set: (v: unknown | null) => void, type?: "
|
|
|
16
21
|
return set(convertOutInt(v, type))
|
|
17
22
|
}
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// )
|
|
34
|
-
// }
|
|
24
|
+
export function buildFieldInfoFromFields<From extends Record<PropertyKey, any>, To extends Record<PropertyKey, any>>(
|
|
25
|
+
fields: Schema<From, To>
|
|
26
|
+
) {
|
|
27
|
+
if (!AST.isTypeLiteral(fields.ast)) throw new Error("not a struct type")
|
|
28
|
+
return fields.ast.propertySignatures.reduce(
|
|
29
|
+
(prev, cur) => {
|
|
30
|
+
;(prev as any)[cur.name] = buildFieldInfo(cur)
|
|
31
|
+
return prev
|
|
32
|
+
},
|
|
33
|
+
{} as {
|
|
34
|
+
[K in keyof To]: FieldInfo<To[K]>
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
}
|
|
35
38
|
|
|
36
39
|
export interface FieldMetadata {
|
|
37
40
|
minLength: number | undefined
|
|
@@ -48,7 +51,7 @@ abstract class PhantomTypeParameter<
|
|
|
48
51
|
readonly [NameP in Identifier]: (_: InstantiatedType) => InstantiatedType
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
export interface FieldInfo<
|
|
54
|
+
export interface FieldInfo<Tout> extends PhantomTypeParameter<typeof f, { out: Tout }> {
|
|
52
55
|
rules: ((v: string) => boolean | string)[]
|
|
53
56
|
metadata: FieldMetadata
|
|
54
57
|
type: "text" | "float" | "int" // todo; multi-line vs single line text
|
|
@@ -59,162 +62,201 @@ export interface FieldInfo<Tin, Tout> extends PhantomTypeParameter<typeof f, { i
|
|
|
59
62
|
|
|
60
63
|
const defaultIntl = createIntl({ locale: "en" })
|
|
61
64
|
export const translate = ref<IntlFormatters["formatMessage"]>(defaultIntl.formatMessage.bind(defaultIntl))
|
|
62
|
-
export const customSchemaErrors = ref<Map<
|
|
65
|
+
export const customSchemaErrors = ref<Map<AST.AST, (message: string, e: unknown, v: unknown) => string>>(
|
|
63
66
|
new Map()
|
|
64
67
|
)
|
|
65
68
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
//
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
69
|
+
function buildFieldInfo(
|
|
70
|
+
property: AST.PropertySignature
|
|
71
|
+
): FieldInfo<any> {
|
|
72
|
+
const propertyKey = property.name
|
|
73
|
+
const schema = S.make(property.type)
|
|
74
|
+
const metadata = getMetadataFromSchema(property.type) // TODO
|
|
75
|
+
const parse = schema.parseEither
|
|
76
|
+
|
|
77
|
+
const nullable = AST.isUnion(property.type) && property.type.types.includes(Schema2.null.ast)
|
|
78
|
+
const realSelf = nullable && AST.isUnion(property.type)
|
|
79
|
+
? property.type.types.filter((_) => _ !== Schema2.null.ast)[0]!
|
|
80
|
+
: property.type
|
|
81
|
+
|
|
82
|
+
function renderError(e: ParseError, v: unknown) {
|
|
83
|
+
const err = e.toString()
|
|
84
|
+
const custom = customSchemaErrors.value.get(realSelf)
|
|
85
|
+
return custom ? custom(err, e, v) : translate.value(
|
|
86
|
+
{ defaultMessage: "The entered value is not a valid {type}: {message}", id: "validation.not_a_valid" },
|
|
87
|
+
{
|
|
88
|
+
type: translate.value({
|
|
89
|
+
defaultMessage: capitalize(propertyKey.toString()),
|
|
90
|
+
id: `fieldNames.${String(propertyKey)}`
|
|
91
|
+
}),
|
|
92
|
+
message: err // TODO err.slice(err.indexOf("expected")) // TODO: this is not translated.
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const stringRules = [
|
|
98
|
+
(v: string | null) =>
|
|
99
|
+
v === null
|
|
100
|
+
|| metadata.minLength === undefined
|
|
101
|
+
|| v.length >= metadata.minLength
|
|
102
|
+
|| translate.value({
|
|
103
|
+
defaultMessage: "The field requires at least {minLength} characters",
|
|
104
|
+
id: "validation.string.minLength"
|
|
105
|
+
}, {
|
|
106
|
+
minLength: metadata.minLength
|
|
107
|
+
}),
|
|
108
|
+
(v: string | null) =>
|
|
109
|
+
v === null
|
|
110
|
+
|| metadata.maxLength === undefined
|
|
111
|
+
|| v.length <= metadata.maxLength
|
|
112
|
+
|| translate.value({
|
|
113
|
+
defaultMessage: "The field cannot have more than {maxLength} characters",
|
|
114
|
+
id: "validation.string.maxLength"
|
|
115
|
+
}, {
|
|
116
|
+
maxLength: metadata.maxLength
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
const numberRules = [
|
|
121
|
+
(v: number | null) =>
|
|
122
|
+
v === null
|
|
123
|
+
|| metadata.minimum === undefined
|
|
124
|
+
|| metadata.minimumExclusive && v > metadata.minimum
|
|
125
|
+
|| !metadata.minimumExclusive && v >= metadata.minimum
|
|
126
|
+
|| translate.value({
|
|
127
|
+
defaultMessage: "The value should be {isExclusive, select, true {larger than} other {at least}} {minimum}",
|
|
128
|
+
id: "validation.number.min"
|
|
129
|
+
}, { isExclusive: metadata.minimumExclusive, minimum: metadata.minimum }),
|
|
130
|
+
(v: number | null) =>
|
|
131
|
+
v === null
|
|
132
|
+
|| metadata.maximum === undefined
|
|
133
|
+
|| metadata.maximumExclusive && v < metadata.maximum
|
|
134
|
+
|| !metadata.maximumExclusive && v <= metadata.maximum
|
|
135
|
+
|| translate.value({
|
|
136
|
+
defaultMessage: "The value should be {isExclusive, select, true {smaller than} other {at most}} {maximum}",
|
|
137
|
+
id: "validation.number.max"
|
|
138
|
+
}, { isExclusive: metadata.maximumExclusive, maximum: metadata.maximum })
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
const parseRule = (v: unknown) =>
|
|
142
|
+
pipe(
|
|
143
|
+
parse(v),
|
|
144
|
+
(_) =>
|
|
145
|
+
_.match(
|
|
146
|
+
{
|
|
147
|
+
onLeft: (_) => renderError(_, v),
|
|
148
|
+
onRight: () => true
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
type UnknownRule = (v: unknown) => boolean | string
|
|
154
|
+
const rules: UnknownRule[] = [
|
|
155
|
+
...(metadata.type === "text"
|
|
156
|
+
? stringRules
|
|
157
|
+
: numberRules) as UnknownRule[],
|
|
158
|
+
parseRule as UnknownRule
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
const info = {
|
|
162
|
+
type: metadata.type,
|
|
163
|
+
rules: [
|
|
164
|
+
(v: string) =>
|
|
165
|
+
!metadata.required
|
|
166
|
+
|| v !== ""
|
|
167
|
+
|| translate.value({ defaultMessage: "The field cannot be empty", id: "validation.empty" }),
|
|
168
|
+
(v: string) => {
|
|
169
|
+
const converted = convertOutInt(v, metadata.type)
|
|
170
|
+
|
|
171
|
+
for (const r of rules) {
|
|
172
|
+
const res = r(converted)
|
|
173
|
+
if (res !== true) {
|
|
174
|
+
return res
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return true
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
metadata
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return info as any
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export const buildFormFromSchema = <
|
|
188
|
+
From extends Record<PropertyKey, any>,
|
|
189
|
+
To extends Record<PropertyKey, any>,
|
|
190
|
+
OnSubmitA
|
|
191
|
+
>(
|
|
192
|
+
s: Schema<
|
|
193
|
+
From,
|
|
194
|
+
To
|
|
195
|
+
>,
|
|
196
|
+
state: Ref<From>,
|
|
197
|
+
onSubmit: (a: To) => Promise<OnSubmitA>
|
|
198
|
+
) => {
|
|
199
|
+
const fields = buildFieldInfoFromFields(s)
|
|
200
|
+
const parse = s.parseSync
|
|
201
|
+
const isDirty = ref(false)
|
|
202
|
+
const isValid = ref(true)
|
|
203
|
+
|
|
204
|
+
const submit1 = <A>(onSubmit: (a: To) => Promise<A>) => async <T extends Promise<{ valid: boolean }>>(e: T) => {
|
|
205
|
+
const r = await e
|
|
206
|
+
if (!r.valid) return
|
|
207
|
+
return onSubmit(parse(state.value))
|
|
208
|
+
}
|
|
209
|
+
const submit = submit1(onSubmit)
|
|
210
|
+
|
|
211
|
+
watch(
|
|
212
|
+
state,
|
|
213
|
+
(v) => {
|
|
214
|
+
// TODO: do better
|
|
215
|
+
isDirty.value = JSON.stringify(v) !== JSON.stringify(state.value)
|
|
216
|
+
},
|
|
217
|
+
{ deep: true }
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
const submitFromState = () => submit(Promise.resolve({ valid: isValid.value }))
|
|
221
|
+
|
|
222
|
+
return { fields, submit, submitFromState, isDirty, isValid }
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export function getMetadataFromSchema(
|
|
226
|
+
ast: AST.AST
|
|
227
|
+
): {
|
|
228
|
+
type: "int" | "float" | "text"
|
|
229
|
+
minimum?: number
|
|
230
|
+
maximum?: number
|
|
231
|
+
minimumExclusive?: boolean
|
|
232
|
+
maximumExclusive?: boolean
|
|
233
|
+
minLength?: number
|
|
234
|
+
maxLength?: number
|
|
235
|
+
required: boolean
|
|
236
|
+
} {
|
|
237
|
+
const nullable = AST.isUnion(ast) && ast.types.includes(Schema2.null.ast)
|
|
238
|
+
const realSelf = nullable && AST.isUnion(ast)
|
|
239
|
+
? ast.types.filter((_) => _ !== Schema2.null.ast)[0]!
|
|
240
|
+
: ast
|
|
241
|
+
|
|
242
|
+
let jschema: any
|
|
243
|
+
try {
|
|
244
|
+
jschema = JSONSchema.to(S.make(realSelf)) as any
|
|
245
|
+
} catch (err) {
|
|
246
|
+
jschema = {}
|
|
247
|
+
console.warn("error getting jsonschema from ", err, ast)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const isNumber = jschema.type === "number" || jschema.type === "integer"
|
|
251
|
+
const isInt = jschema.type === "integer"
|
|
252
|
+
return {
|
|
253
|
+
type: isInt ? "int" as const : isNumber ? "float" as const : "text" as const,
|
|
254
|
+
minimum: jschema.minimum,
|
|
255
|
+
minimumExclusive: jschema.exclusiveMinimum,
|
|
256
|
+
maximum: jschema.maximum,
|
|
257
|
+
maximumExclusive: jschema.exclusiveMaximum,
|
|
258
|
+
minLength: jschema.minLength,
|
|
259
|
+
maxLength: jschema.maxLength,
|
|
260
|
+
required: !nullable
|
|
261
|
+
}
|
|
262
|
+
}
|
package/dist/form.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { AST } from "@effect-app/schema";
|
|
1
2
|
import type { Schema } from "@effect-app/schema";
|
|
3
|
+
import type { Ref } from "vue";
|
|
2
4
|
export declare function convertIn(v: string | null, type?: "text" | "float" | "int"): string;
|
|
3
5
|
export declare function convertOutInt(v: string, type?: "text" | "float" | "int"): string | number | null;
|
|
4
6
|
export declare function convertOut(v: string, set: (v: unknown | null) => void, type?: "text" | "float" | "int"): void;
|
|
7
|
+
export declare function buildFieldInfoFromFields<From extends Record<PropertyKey, any>, To extends Record<PropertyKey, any>>(fields: Schema<From, To>): { [K in keyof To]: FieldInfo<To[K]>; };
|
|
5
8
|
export interface FieldMetadata {
|
|
6
9
|
minLength: number | undefined;
|
|
7
10
|
maxLength: number | undefined;
|
|
@@ -13,18 +16,36 @@ declare abstract class PhantomTypeParameter<Identifier extends keyof any, Instan
|
|
|
13
16
|
readonly [NameP in Identifier]: (_: InstantiatedType) => InstantiatedType;
|
|
14
17
|
};
|
|
15
18
|
}
|
|
16
|
-
export interface FieldInfo<
|
|
17
|
-
in: Tin;
|
|
19
|
+
export interface FieldInfo<Tout> extends PhantomTypeParameter<typeof f, {
|
|
18
20
|
out: Tout;
|
|
19
21
|
}> {
|
|
20
22
|
rules: ((v: string) => boolean | string)[];
|
|
21
23
|
metadata: FieldMetadata;
|
|
22
24
|
type: "text" | "float" | "int";
|
|
23
25
|
}
|
|
24
|
-
export declare const translate:
|
|
26
|
+
export declare const translate: Ref<{
|
|
25
27
|
(descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").PrimitiveType | import("intl-messageformat").FormatXMLElementFn<string, string>> | undefined, opts?: import("intl-messageformat").Options | undefined): string;
|
|
26
28
|
<T extends unknown>(descriptor: import("@formatjs/intl").MessageDescriptor, values?: Record<string, import("intl-messageformat").PrimitiveType | T | import("intl-messageformat").FormatXMLElementFn<T>> | undefined, opts?: import("intl-messageformat").Options | undefined): string | T | (string | T)[];
|
|
27
29
|
}>;
|
|
28
|
-
export declare const customSchemaErrors:
|
|
30
|
+
export declare const customSchemaErrors: Ref<Map<AST.AST, (message: string, e: unknown, v: unknown) => string>>;
|
|
31
|
+
export declare const buildFormFromSchema: <From extends Record<PropertyKey, any>, To extends Record<PropertyKey, any>, OnSubmitA>(s: Schema<From, To>, state: Ref<From>, onSubmit: (a: To) => Promise<OnSubmitA>) => {
|
|
32
|
+
fields: { [K in keyof To]: FieldInfo<To[K]>; };
|
|
33
|
+
submit: <T extends Promise<{
|
|
34
|
+
valid: boolean;
|
|
35
|
+
}>>(e: T) => Promise<OnSubmitA | undefined>;
|
|
36
|
+
submitFromState: () => Promise<OnSubmitA | undefined>;
|
|
37
|
+
isDirty: Ref<boolean>;
|
|
38
|
+
isValid: Ref<boolean>;
|
|
39
|
+
};
|
|
40
|
+
export declare function getMetadataFromSchema(ast: AST.AST): {
|
|
41
|
+
type: "int" | "float" | "text";
|
|
42
|
+
minimum?: number;
|
|
43
|
+
maximum?: number;
|
|
44
|
+
minimumExclusive?: boolean;
|
|
45
|
+
maximumExclusive?: boolean;
|
|
46
|
+
minLength?: number;
|
|
47
|
+
maxLength?: number;
|
|
48
|
+
required: boolean;
|
|
49
|
+
};
|
|
29
50
|
export {};
|
|
30
51
|
//# sourceMappingURL=form.d.ts.map
|
package/dist/form.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../_src/form.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../_src/form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAM9B,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,UAE1E;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,0BAIvE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,QAEtG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,SAAS,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,EACjH,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,0CAYzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,QAAA,MAAM,CAAC,eAAW,CAAA;AAClB,uBAAe,oBAAoB,CACjC,UAAU,SAAS,MAAM,GAAG,EAC5B,gBAAgB;IAEhB,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;QAC7B,QAAQ,EAAE,KAAK,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,gBAAgB,KAAK,gBAAgB;KAC1E,CAAA;CACF;AACD,MAAM,WAAW,SAAS,CAAC,IAAI,CAAE,SAAQ,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAAE,GAAG,EAAE,IAAI,CAAA;CAAE,CAAC;IACpF,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC,EAAE,CAAA;IAC1C,QAAQ,EAAE,aAAa,CAAA;IACvB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAA;CAC/B;AAMD,eAAO,MAAM,SAAS;;;EAAoF,CAAA;AAC1G,eAAO,MAAM,kBAAkB,6BAA8B,MAAM,KAAK,OAAO,KAAK,OAAO,KAAK,MAAM,EAErG,CAAA;AAwHD,eAAO,MAAM,mBAAmB,6FAK3B,OACD,IAAI,EACJ,EAAE,CACH,SACM,IAAI,IAAI,CAAC,gBACF,EAAE,KAAK,QAAQ,SAAS,CAAC;;;eAOmD,OAAO;;;;;CAmBlG,CAAA;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,GAAG,CAAC,GAAG,GACX;IACD,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB,CA0BA"}
|
package/dist/form.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
import * as tsplus_module_1 from "@effect/schema/Parser";
|
|
2
|
+
import * as tsplus_module_2 from "@effect-app/prelude";
|
|
3
|
+
import * as tsplus_module_3 from "effect/Either";
|
|
4
|
+
import * as tsplus_module_4 from "@effect-app/core/Function";
|
|
5
|
+
import { AST, S } from "@effect-app/schema";
|
|
1
6
|
import { createIntl } from "@formatjs/intl";
|
|
2
|
-
import { ref } from "vue";
|
|
7
|
+
import { capitalize, ref, watch } from "vue";
|
|
8
|
+
import * as JSONSchema from "@effect/schema/JSONSchema";
|
|
3
9
|
export function convertIn(v, type) {
|
|
4
10
|
return v === null ? "" : type === "text" ? v : `${v}`;
|
|
5
11
|
}
|
|
@@ -11,6 +17,15 @@ export function convertOutInt(v, type) {
|
|
|
11
17
|
export function convertOut(v, set, type) {
|
|
12
18
|
return set(convertOutInt(v, type));
|
|
13
19
|
}
|
|
20
|
+
export function buildFieldInfoFromFields(fields) {
|
|
21
|
+
if (!AST.isTypeLiteral(fields.ast))
|
|
22
|
+
throw new Error("not a struct type");
|
|
23
|
+
return fields.ast.propertySignatures.reduce((prev, cur) => {
|
|
24
|
+
;
|
|
25
|
+
prev[cur.name] = buildFieldInfo(cur);
|
|
26
|
+
return prev;
|
|
27
|
+
}, {});
|
|
28
|
+
}
|
|
14
29
|
const f = Symbol();
|
|
15
30
|
class PhantomTypeParameter {
|
|
16
31
|
}
|
|
@@ -19,4 +34,138 @@ class PhantomTypeParameter {
|
|
|
19
34
|
const defaultIntl = createIntl({ locale: "en" });
|
|
20
35
|
export const translate = ref(defaultIntl.formatMessage.bind(defaultIntl));
|
|
21
36
|
export const customSchemaErrors = ref(new Map());
|
|
22
|
-
|
|
37
|
+
function buildFieldInfo(property) {
|
|
38
|
+
const propertyKey = property.name;
|
|
39
|
+
const schema = S.make(property.type);
|
|
40
|
+
const metadata = getMetadataFromSchema(property.type); // TODO
|
|
41
|
+
const parse = tsplus_module_1.parseEither(schema);
|
|
42
|
+
const nullable = AST.isUnion(property.type) && property.type.types.includes(tsplus_module_2.Schema2.null.ast);
|
|
43
|
+
const realSelf = nullable && AST.isUnion(property.type)
|
|
44
|
+
? property.type.types.filter((_) => _ !== tsplus_module_2.Schema2.null.ast)[0]
|
|
45
|
+
: property.type;
|
|
46
|
+
function renderError(e, v) {
|
|
47
|
+
const err = e.toString();
|
|
48
|
+
const custom = customSchemaErrors.value.get(realSelf);
|
|
49
|
+
return custom ? custom(err, e, v) : translate.value({ defaultMessage: "The entered value is not a valid {type}: {message}", id: "validation.not_a_valid" }, {
|
|
50
|
+
type: translate.value({
|
|
51
|
+
defaultMessage: capitalize(propertyKey.toString()),
|
|
52
|
+
id: `fieldNames.${String(propertyKey)}`
|
|
53
|
+
}),
|
|
54
|
+
message: err // TODO err.slice(err.indexOf("expected")) // TODO: this is not translated.
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const stringRules = [
|
|
58
|
+
(v) => v === null
|
|
59
|
+
|| metadata.minLength === undefined
|
|
60
|
+
|| v.length >= metadata.minLength
|
|
61
|
+
|| translate.value({
|
|
62
|
+
defaultMessage: "The field requires at least {minLength} characters",
|
|
63
|
+
id: "validation.string.minLength"
|
|
64
|
+
}, {
|
|
65
|
+
minLength: metadata.minLength
|
|
66
|
+
}),
|
|
67
|
+
(v) => v === null
|
|
68
|
+
|| metadata.maxLength === undefined
|
|
69
|
+
|| v.length <= metadata.maxLength
|
|
70
|
+
|| translate.value({
|
|
71
|
+
defaultMessage: "The field cannot have more than {maxLength} characters",
|
|
72
|
+
id: "validation.string.maxLength"
|
|
73
|
+
}, {
|
|
74
|
+
maxLength: metadata.maxLength
|
|
75
|
+
})
|
|
76
|
+
];
|
|
77
|
+
const numberRules = [
|
|
78
|
+
(v) => v === null
|
|
79
|
+
|| metadata.minimum === undefined
|
|
80
|
+
|| metadata.minimumExclusive && v > metadata.minimum
|
|
81
|
+
|| !metadata.minimumExclusive && v >= metadata.minimum
|
|
82
|
+
|| translate.value({
|
|
83
|
+
defaultMessage: "The value should be {isExclusive, select, true {larger than} other {at least}} {minimum}",
|
|
84
|
+
id: "validation.number.min"
|
|
85
|
+
}, { isExclusive: metadata.minimumExclusive, minimum: metadata.minimum }),
|
|
86
|
+
(v) => v === null
|
|
87
|
+
|| metadata.maximum === undefined
|
|
88
|
+
|| metadata.maximumExclusive && v < metadata.maximum
|
|
89
|
+
|| !metadata.maximumExclusive && v <= metadata.maximum
|
|
90
|
+
|| translate.value({
|
|
91
|
+
defaultMessage: "The value should be {isExclusive, select, true {smaller than} other {at most}} {maximum}",
|
|
92
|
+
id: "validation.number.max"
|
|
93
|
+
}, { isExclusive: metadata.maximumExclusive, maximum: metadata.maximum })
|
|
94
|
+
];
|
|
95
|
+
const parseRule = (v) => tsplus_module_4.pipe(parse(v), (_) => tsplus_module_3.match(_, {
|
|
96
|
+
onLeft: (_) => renderError(_, v),
|
|
97
|
+
onRight: () => true
|
|
98
|
+
}));
|
|
99
|
+
const rules = [
|
|
100
|
+
...(metadata.type === "text"
|
|
101
|
+
? stringRules
|
|
102
|
+
: numberRules),
|
|
103
|
+
parseRule
|
|
104
|
+
];
|
|
105
|
+
const info = {
|
|
106
|
+
type: metadata.type,
|
|
107
|
+
rules: [
|
|
108
|
+
(v) => !metadata.required
|
|
109
|
+
|| v !== ""
|
|
110
|
+
|| translate.value({ defaultMessage: "The field cannot be empty", id: "validation.empty" }),
|
|
111
|
+
(v) => {
|
|
112
|
+
const converted = convertOutInt(v, metadata.type);
|
|
113
|
+
for (const r of rules) {
|
|
114
|
+
const res = r(converted);
|
|
115
|
+
if (res !== true) {
|
|
116
|
+
return res;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
metadata
|
|
123
|
+
};
|
|
124
|
+
return info;
|
|
125
|
+
}
|
|
126
|
+
export const buildFormFromSchema = (s, state, onSubmit) => {
|
|
127
|
+
const fields = buildFieldInfoFromFields(s);
|
|
128
|
+
const parse = tsplus_module_1.parseSync(s);
|
|
129
|
+
const isDirty = ref(false);
|
|
130
|
+
const isValid = ref(true);
|
|
131
|
+
const submit1 = (onSubmit) => async (e) => {
|
|
132
|
+
const r = await e;
|
|
133
|
+
if (!r.valid)
|
|
134
|
+
return;
|
|
135
|
+
return onSubmit(parse(state.value));
|
|
136
|
+
};
|
|
137
|
+
const submit = submit1(onSubmit);
|
|
138
|
+
watch(state, (v) => {
|
|
139
|
+
// TODO: do better
|
|
140
|
+
isDirty.value = JSON.stringify(v) !== JSON.stringify(state.value);
|
|
141
|
+
}, { deep: true });
|
|
142
|
+
const submitFromState = () => submit(Promise.resolve({ valid: isValid.value }));
|
|
143
|
+
return { fields, submit, submitFromState, isDirty, isValid };
|
|
144
|
+
};
|
|
145
|
+
export function getMetadataFromSchema(ast) {
|
|
146
|
+
const nullable = AST.isUnion(ast) && ast.types.includes(tsplus_module_2.Schema2.null.ast);
|
|
147
|
+
const realSelf = nullable && AST.isUnion(ast)
|
|
148
|
+
? ast.types.filter((_) => _ !== tsplus_module_2.Schema2.null.ast)[0]
|
|
149
|
+
: ast;
|
|
150
|
+
let jschema;
|
|
151
|
+
try {
|
|
152
|
+
jschema = JSONSchema.to(S.make(realSelf));
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
jschema = {};
|
|
156
|
+
console.warn("error getting jsonschema from ", err, ast);
|
|
157
|
+
}
|
|
158
|
+
const isNumber = jschema.type === "number" || jschema.type === "integer";
|
|
159
|
+
const isInt = jschema.type === "integer";
|
|
160
|
+
return {
|
|
161
|
+
type: isInt ? "int" : isNumber ? "float" : "text",
|
|
162
|
+
minimum: jschema.minimum,
|
|
163
|
+
minimumExclusive: jschema.exclusiveMinimum,
|
|
164
|
+
maximum: jschema.maximum,
|
|
165
|
+
maximumExclusive: jschema.exclusiveMaximum,
|
|
166
|
+
minLength: jschema.minLength,
|
|
167
|
+
maxLength: jschema.maxLength,
|
|
168
|
+
required: !nullable
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL19zcmMvZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUF1QixNQUFNLGdCQUFnQixDQUFBO0FBRWhFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFBO0FBR3ZELE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBZ0IsRUFBRSxJQUErQjtJQUN6RSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFBO0FBQ3ZELENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVMsRUFBRSxJQUErQjtJQUN0RSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9GLE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBUyxFQUFFLEdBQWdDLEVB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/vue",
|
|
3
|
-
"version": "0.87.0-next.
|
|
3
|
+
"version": "0.87.0-next.16",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"query-string": "^8.1.0",
|
|
13
13
|
"swrv": "^1.0.4",
|
|
14
14
|
"vue": "^3.3.13",
|
|
15
|
-
"@effect-app/
|
|
16
|
-
"@effect-app/vue": "0.87.0-next.
|
|
17
|
-
"@effect-app/
|
|
18
|
-
"@effect-app/
|
|
15
|
+
"@effect-app/schema": "0.150.0-next.11",
|
|
16
|
+
"@effect-app/vue": "0.87.0-next.16",
|
|
17
|
+
"@effect-app/prelude": "0.107.0-next.14",
|
|
18
|
+
"@effect-app/core": "0.97.0-next.4"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@rollup/pluginutils": "^5.1.0",
|