ballerina-core 1.0.39 → 1.0.41
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/package.json +1 -1
- package/src/async/domains/synchronized/coroutines/synchronize.ts +2 -2
- package/src/forms/domains/parser/domains/built-ins/state.ts +6 -5
- package/src/forms/domains/parser/domains/validator/state.ts +7 -6
- package/src/forms/domains/parser/state.tsx +20 -10
- package/src/forms/domains/singleton/domains/form-label/state.ts +1 -1
- package/src/value/domains/flagged-value/state.ts +27 -0
package/package.json
CHANGED
|
@@ -32,8 +32,8 @@ export const Synchronize = <value, syncResult, context = Unit>(
|
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
export const SynchronizeWithValueUpdater = <value, syncResult, context = Unit>(
|
|
35
|
-
p: BasicFun<value & context, Promise<[syncResult, BasicUpdater<value>]>>, errorProcessor: BasicFun<any, ErrorPermanenceStatus
|
|
36
|
-
maxAttempts: number, delayBetweenAttemptsInMs: number):
|
|
35
|
+
p: BasicFun<value & context, Promise<[syncResult, BasicUpdater<value>]>>, errorProcessor: BasicFun<any, ErrorPermanenceStatus> = () => "transient failure",
|
|
36
|
+
maxAttempts: number = 2, delayBetweenAttemptsInMs: number = 250):
|
|
37
37
|
Coroutine<Synchronized<value, syncResult> & context, Synchronized<value, syncResult>, ApiResultStatus> => {
|
|
38
38
|
const Co = CoTypedFactory<context, Synchronized<value, syncResult>>();
|
|
39
39
|
return Co.SetState(Synchronized.Updaters.sync(AsyncState.Updaters.toReloading())).then(() =>
|
|
@@ -128,7 +128,7 @@ export const defaultValue = <T>(types: Map<TypeName, TypeDefinition>, builtIns:
|
|
|
128
128
|
if (custom != undefined) {
|
|
129
129
|
let res = {} as any
|
|
130
130
|
custom.fields.forEach((field, fieldName) => {
|
|
131
|
-
res[fieldName] = defaultValue(types, builtIns)(field.kind == "primitive" ? field.value : field.kind == "lookup" ? field.name : field.value)
|
|
131
|
+
res[fieldName] = defaultValue(types, builtIns, injectedPrimitives)(field.kind == "primitive" ? field.value : field.kind == "lookup" ? field.name : field.value)
|
|
132
132
|
}
|
|
133
133
|
)
|
|
134
134
|
return res
|
|
@@ -233,10 +233,8 @@ export const fromAPIRawValue = <T>(t: Type, types: Map<TypeName, TypeDefinition>
|
|
|
233
233
|
return obj
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
-
|
|
237
236
|
export const toAPIRawValue = <T>(t: Type, types: Map<TypeName, TypeDefinition>, builtIns: BuiltIns, converters: BuiltInApiConverters, isKeywordsReverted: boolean = false, injectedPrimitives?: InjectedPrimitives<T>) => (raw: any, formState: any) : any => {
|
|
238
237
|
const obj = !isKeywordsReverted ? replaceKeywords(raw, "to api") : raw
|
|
239
|
-
|
|
240
238
|
if (t.kind == "primitive") {
|
|
241
239
|
return converters[t.value].toAPIRawValue([obj, formState.modifiedByUser] as never)
|
|
242
240
|
} else if (t.kind == "application") { // application here means "generic type application"
|
|
@@ -291,9 +289,12 @@ export const toAPIRawValue = <T>(t: Type, types: Map<TypeName, TypeDefinition>,
|
|
|
291
289
|
)
|
|
292
290
|
}
|
|
293
291
|
|
|
294
|
-
} else { // t.kind == lookup: we are dealing with a record/object
|
|
292
|
+
} else { // t.kind == lookup: we are dealing with a record/object or extended type
|
|
295
293
|
let result: any = { ...obj }
|
|
296
294
|
const tDef = types.get(t.name)!
|
|
295
|
+
if("extends" in tDef && tDef.extends.length == 1) {
|
|
296
|
+
return converters[(tDef.extends[0] as keyof BuiltInApiConverters)].toAPIRawValue([obj, formState.modifiedByUser] as never)
|
|
297
|
+
}
|
|
297
298
|
tDef.fields.forEach((fieldType, fieldName) => {
|
|
298
299
|
const revertedFieldName = revertKeyword(fieldName)
|
|
299
300
|
const fieldValue = obj[revertedFieldName]
|
|
@@ -301,5 +302,5 @@ export const toAPIRawValue = <T>(t: Type, types: Map<TypeName, TypeDefinition>,
|
|
|
301
302
|
})
|
|
302
303
|
return result
|
|
303
304
|
}
|
|
304
|
-
return defaultValue(types, builtIns)(t.value)
|
|
305
|
+
return defaultValue(types, builtIns, injectedPrimitives)(t.value)
|
|
305
306
|
}
|
|
@@ -3,7 +3,7 @@ import { ApiConverters, BoolExpr, BuiltIns, FieldName, FormsConfigMerger, Inject
|
|
|
3
3
|
|
|
4
4
|
export type FieldConfig = {
|
|
5
5
|
renderer: string;
|
|
6
|
-
label
|
|
6
|
+
label?: string;
|
|
7
7
|
tooltip?: string;
|
|
8
8
|
api: { stream?: string, enumOptions?: string };
|
|
9
9
|
elementRenderer?: string;
|
|
@@ -104,11 +104,12 @@ export const FormsConfig = {
|
|
|
104
104
|
if (injectedPrimitives?.injectedPrimitives.has(configFieldType as keyof T) &&
|
|
105
105
|
(builtIns.primitives.has(configFieldType) || builtIns.generics.has(configFieldType))) {
|
|
106
106
|
errors.push(`field ${fieldName} in type ${typeName}: injectedPrimitive cannot have same name as builtIn primitive`);
|
|
107
|
+
} else {
|
|
108
|
+
if (builtIns.primitives.has(configFieldType) || injectedPrimitives?.injectedPrimitives.has(configFieldType as keyof T))
|
|
109
|
+
typeDef.fields = typeDef.fields.set(fieldName, { kind: "primitive", value: configFieldType as any });
|
|
110
|
+
else
|
|
111
|
+
typeDef.fields = typeDef.fields.set(fieldName, { kind: "lookup", name: configFieldType as any })
|
|
107
112
|
}
|
|
108
|
-
if (builtIns.primitives.has(configFieldType) || injectedPrimitives?.injectedPrimitives.has(configFieldType as keyof T))
|
|
109
|
-
typeDef.fields = typeDef.fields.set(fieldName, { kind: "primitive", value: configFieldType as any });
|
|
110
|
-
else
|
|
111
|
-
typeDef.fields = typeDef.fields.set(fieldName, { kind: "lookup", name: configFieldType as any });
|
|
112
113
|
} else if (typeof configFieldType == "object") {
|
|
113
114
|
if ("fun" in configFieldType && "args" in configFieldType &&
|
|
114
115
|
typeof configFieldType["fun"] == "string" &&
|
|
@@ -477,7 +478,7 @@ export const FormsConfig = {
|
|
|
477
478
|
formDef.fields = formDef.fields.set(
|
|
478
479
|
fieldName, {
|
|
479
480
|
renderer: fieldConfig.renderer,
|
|
480
|
-
label: fieldConfig.label
|
|
481
|
+
label: fieldConfig.label,
|
|
481
482
|
tooltip: fieldConfig.tooltip,
|
|
482
483
|
elementTooltip: fieldConfig.elementTooltip,
|
|
483
484
|
elementRenderer: fieldConfig.elementRenderer,
|
|
@@ -24,7 +24,7 @@ const parseOptions = (leafPredicates: any, options: any) => {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
export const FieldView = //<Context, FieldViews extends DefaultFieldViews, EnumFieldConfigs extends {}, EnumSources extends {}>() => <ViewType extends keyof FieldViews, ViewName extends keyof FieldViews[ViewType]>
|
|
27
|
-
<T,>(fieldConfig:FieldConfig, fieldViews: any, viewType: any, viewName: any,
|
|
27
|
+
<T,>(fieldConfig:FieldConfig, fieldViews: any, viewType: any, viewName: any, label: string | undefined, tooltip: string | undefined, enumFieldConfigs: EnumOptionsSources, enumSources: any, leafPredicates: any, injectedPrimitives?: InjectedPrimitives<T>): any =>
|
|
28
28
|
{
|
|
29
29
|
if (viewType == "maybeBoolean")
|
|
30
30
|
return MaybeBooleanForm<any & FormLabel, Unit>()
|
|
@@ -208,8 +208,8 @@ export const ParseForm = <T,>(
|
|
|
208
208
|
).withView(((fieldViews as any)[viewType] as any)[viewName]() as any)
|
|
209
209
|
.mapContext<any>(_ => ({ ..._, label, tooltip }))
|
|
210
210
|
} else { // the list argument is a primitive
|
|
211
|
-
const elementForm = FieldView(fieldConfig, fieldViews, fieldNameToElementViewCategory(formFieldElementRenderers)(fieldName) as any, elementRendererName,
|
|
212
|
-
const initialFormState = FieldFormState(fieldConfig, fieldViews, fieldNameToElementViewCategory(formFieldElementRenderers)(fieldName) as any, elementRendererName,
|
|
211
|
+
const elementForm = FieldView(fieldConfig, fieldViews, fieldNameToElementViewCategory(formFieldElementRenderers)(fieldName) as any, elementRendererName, elementLabel, elementTooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives)
|
|
212
|
+
const initialFormState = FieldFormState(fieldConfig, fieldViews, fieldNameToElementViewCategory(formFieldElementRenderers)(fieldName) as any, elementRendererName, InfiniteStreamSources, fieldsInfiniteStreamsConfig, injectedPrimitives);
|
|
213
213
|
formConfig[fieldName] = ListForm<any, any, any & FormLabel, Unit>(
|
|
214
214
|
{ Default: () => initialFormState },
|
|
215
215
|
{ Default: () => initialElementValue },
|
|
@@ -239,7 +239,7 @@ export const ParseForm = <T,>(
|
|
|
239
239
|
const initialValueValue = defaultValue(valueType)
|
|
240
240
|
const getFormAndInitialState = (elementRenderers:any, rendererName:any, fieldConfig:FieldConfig) => {
|
|
241
241
|
const formDef = otherForms.get(rendererName)
|
|
242
|
-
const elementLabel = elementRenderers[fieldName].label
|
|
242
|
+
const elementLabel = elementRenderers[fieldName].label
|
|
243
243
|
const elementTooltip = elementRenderers[fieldName].tooltip
|
|
244
244
|
if (formDef != undefined) {
|
|
245
245
|
return [
|
|
@@ -248,7 +248,7 @@ export const ParseForm = <T,>(
|
|
|
248
248
|
]
|
|
249
249
|
} else {
|
|
250
250
|
const categoryName = fieldNameToElementViewCategory(elementRenderers)(fieldName) as any
|
|
251
|
-
const form = FieldView(fieldConfig, fieldViews, categoryName, rendererName,
|
|
251
|
+
const form = FieldView(fieldConfig, fieldViews, categoryName, rendererName, elementLabel, elementTooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives)
|
|
252
252
|
const initialFormState = FieldFormState(fieldConfig, fieldViews, categoryName, rendererName, fieldName, InfiniteStreamSources, fieldsInfiniteStreamsConfig, injectedPrimitives);
|
|
253
253
|
return [
|
|
254
254
|
form,
|
|
@@ -272,7 +272,7 @@ export const ParseForm = <T,>(
|
|
|
272
272
|
).withView(((fieldViews as any)[viewType] as any)[viewName]() as any)
|
|
273
273
|
.mapContext<any>(_ => ({ ..._, label, tooltip }))
|
|
274
274
|
} else {
|
|
275
|
-
formConfig[fieldName] = FieldView(fieldConfig, fieldViews, viewType, viewName,
|
|
275
|
+
formConfig[fieldName] = FieldView(fieldConfig, fieldViews, viewType, viewName, label, tooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives);
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
278
|
}
|
|
@@ -409,6 +409,15 @@ export const parseForms =
|
|
|
409
409
|
if (formsConfig.forms.has(field.elementRenderer))
|
|
410
410
|
traverse(formsConfig.forms.get(field.elementRenderer)!)
|
|
411
411
|
}
|
|
412
|
+
if (fieldType?.kind == "application" && fieldType?.value == "Map" && fieldType?.args.length == 2 && field.mapRenderer != undefined) {
|
|
413
|
+
const mapRenderer = field.mapRenderer
|
|
414
|
+
if (mapRenderer && formsConfig.forms.has(mapRenderer.keyRenderer.renderer)) {
|
|
415
|
+
traverse(formsConfig.forms.get(mapRenderer.keyRenderer.renderer)!)
|
|
416
|
+
}
|
|
417
|
+
if (mapRenderer && formsConfig.forms.has(mapRenderer.valueRenderer.renderer)) {
|
|
418
|
+
traverse(formsConfig.forms.get(mapRenderer.valueRenderer.renderer)!)
|
|
419
|
+
}
|
|
420
|
+
}
|
|
412
421
|
} catch (error) {
|
|
413
422
|
errors.push(`unhandled error: ${JSON.stringify(error)} -> ${formDef.name}`)
|
|
414
423
|
}
|
|
@@ -507,6 +516,7 @@ export const parseForms =
|
|
|
507
516
|
create: ([value, formState]: [any, any]) => {
|
|
508
517
|
// alert(`type = ${JSON.stringify(parsedForm.formDef.type)}`)
|
|
509
518
|
// alert(`value = ${JSON.stringify(value)}`)
|
|
519
|
+
console.log("value", JSON.stringify(value))
|
|
510
520
|
const raw = toAPIRawValue({ kind: "lookup", name: parsedForm.formDef.type }, formsConfig.types, builtIns, apiConverters, false, injectedPrimitives)(value, formState)
|
|
511
521
|
// alert(`raw = ${JSON.stringify(raw.interests)}`)
|
|
512
522
|
return entityApis.create(launcher.api)(raw)
|
|
@@ -598,13 +608,13 @@ export const replaceKeywords = (obj: any, kind: "from api" | "to api"): any => {
|
|
|
598
608
|
);
|
|
599
609
|
} else if (typeof obj === "object" && obj !== null) {
|
|
600
610
|
if(OrderedMap.isOrderedMap(obj)) {
|
|
601
|
-
return obj.
|
|
602
|
-
replacementFn(key as string)
|
|
611
|
+
return obj.mapEntries(([key, _]) =>
|
|
612
|
+
[replacementFn(key as string), _]
|
|
603
613
|
)
|
|
604
614
|
}
|
|
605
615
|
if(Map.isMap(obj)) {
|
|
606
|
-
return obj.
|
|
607
|
-
replacementFn(key as string)
|
|
616
|
+
return obj.mapEntries(([key, _]) =>
|
|
617
|
+
[replacementFn(key as string), _]
|
|
608
618
|
)
|
|
609
619
|
}
|
|
610
620
|
const copy = { ...obj };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
export type FormLabel = { label
|
|
2
|
+
export type FormLabel = { label?: string; tooltip?: string; };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BasicUpdater, Updater } from "../../../fun/domains/updater/state";
|
|
2
|
+
import { Value } from "../../state";
|
|
3
|
+
|
|
4
|
+
export type FlaggedValue<v> = Value<v> & { flag: boolean };
|
|
5
|
+
|
|
6
|
+
export const FlaggedValue = {
|
|
7
|
+
Default: <v>(v: v, flag: boolean = false): FlaggedValue<v> => ({
|
|
8
|
+
...Value.Default(v),
|
|
9
|
+
flag,
|
|
10
|
+
}),
|
|
11
|
+
Updaters: {
|
|
12
|
+
Core: {
|
|
13
|
+
value: <v>(_: BasicUpdater<v>): Updater<FlaggedValue<v>> =>
|
|
14
|
+
Updater<FlaggedValue<v>>((current) => ({
|
|
15
|
+
...current,
|
|
16
|
+
value: _(current.value),
|
|
17
|
+
})),
|
|
18
|
+
},
|
|
19
|
+
Template: {
|
|
20
|
+
flag: <v>(flag: boolean): Updater<FlaggedValue<v>> =>
|
|
21
|
+
Updater<FlaggedValue<v>>((current) => ({
|
|
22
|
+
...current,
|
|
23
|
+
flag,
|
|
24
|
+
})),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|