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 CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ballerina-core",
3
3
  "author": "Dr. Giuseppe Maggiore",
4
4
  "private": false,
5
- "version": "1.0.39",
5
+ "version": "1.0.41",
6
6
  "main": "main.ts",
7
7
  "dependencies": {
8
8
  "immutable": "^5.0.0-beta.5",
@@ -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: string;
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 ?? revertKeyword(fieldName),
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, fieldName: string, label: string, tooltip: string | undefined, enumFieldConfigs: EnumOptionsSources, enumSources: any, leafPredicates: any, injectedPrimitives?: InjectedPrimitives<T>): 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, fieldName, elementLabel ?? label, elementTooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives)
212
- const initialFormState = FieldFormState(fieldConfig, fieldViews, fieldNameToElementViewCategory(formFieldElementRenderers)(fieldName) as any, elementRendererName, fieldName, InfiniteStreamSources, fieldsInfiniteStreamsConfig, injectedPrimitives);
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 ?? 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, fieldName, elementLabel, elementTooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives)
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, fieldName, label, tooltip, EnumOptionsSources, fieldsOptionsConfig, leafPredicates, injectedPrimitives);
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.map((_, key) =>
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.map((_, key) =>
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: string; tooltip?: string; };
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
+ };