@ostack.tech/ui-kform-scaffolder 0.6.4 → 0.6.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.
@@ -232,6 +232,24 @@ function scaffoldField(schematic, data) {
232
232
  </ControlField>
233
233
  `;
234
234
  }
235
+ const jsonSerializerKt = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.json.Json\n\n/** Base JSON configuration. */\nprivate val JSON_CONFIG = Json.Default\n/** Pretty JSON configuration. */\nprivate val JSON_CONFIG_PRETTY = Json(JSON_CONFIG) { prettyPrint = true }\n\n/** JSON configuration. */\n@JvmOverloads\nfun jsonConfig(prettyPrint: Boolean = false): Json =\n if (prettyPrint) JSON_CONFIG_PRETTY else JSON_CONFIG\n\n<%_ if (includeSerializationFormatVersion) { -%>\n/** Version of the serialization format. */\n@JsExport\nconst val <%= formConstant %>_SERIALIZATION_VERSION = 1\n\n<%_ } -%>\n@JsExport\n@JvmOverloads\nfun encode<%= formClass %>ToString(<%= formVar %>: <%= formClass %>, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(<%= formVar %>)\n\n@JsExport\nfun decode<%= formClass %>FromString(json: String): <%= formClass %> =\n jsonConfig().decodeFromString(json)\n\n@JvmOverloads\nfun encode<%= formClass %>ExternalContextsToString(externalContexts: <%= formClass %>ExternalContexts, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(externalContexts)\n\n@JsExport\nfun decode<%= formClass %>ExternalContextsFromString(json: String): <%= formClass %>ExternalContexts =\n jsonConfig().decodeFromString(json)\n\n@JvmOverloads\nfun encode<%= formClass %>SubmitResponseToString(response: <%= formClass %>SubmitResponse, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(response)\n\n@JsExport\nfun decode<%= formClass %>SubmitResponseFromString(json: String): <%= formClass %>SubmitResponse =\n jsonConfig().decodeFromString(json)\n";
236
+ const xmlSerializerKt = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.encodeToString\nimport nl.adaptivity.xmlutil.ExperimentalXmlUtilApi\nimport nl.adaptivity.xmlutil.QName\nimport nl.adaptivity.xmlutil.XMLConstants\nimport nl.adaptivity.xmlutil.core.XmlVersion\nimport nl.adaptivity.xmlutil.serialization.DefaultXmlSerializationPolicy\nimport nl.adaptivity.xmlutil.serialization.OutputKind\nimport nl.adaptivity.xmlutil.serialization.XML\nimport nl.adaptivity.xmlutil.serialization.XmlSerializationPolicy\nimport nl.adaptivity.xmlutil.serialization.structure.SafeParentInfo\n\n/** Base XML configuration. */\nprivate val XML_CONFIG = XML {\n recommended_0_91_0 {\n xmlVersion = XmlVersion.XML10\n autoPolymorphic = false\n encodeDefault = XmlSerializationPolicy.XmlEncodeDefault.NEVER\n }\n\n // Set policy on top of the current policy config\n @OptIn(ExperimentalXmlUtilApi::class)\n policy =\n object : DefaultXmlSerializationPolicy(policy) {\n // Serialize properties as elements instead of attributes by default\n override val defaultPrimitiveOutputKind: OutputKind = OutputKind.Element\n\n // Use property names as serial names by default\n override fun effectiveName(\n serializerParent: SafeParentInfo,\n tagParent: SafeParentInfo,\n outputKind: OutputKind,\n useName: XmlSerializationPolicy.DeclaredNameInfo,\n ): QName =\n useName.annotatedName\n ?: serializerParent.elementTypeDescriptor.typeQname\n ?: QName(\n if (outputKind == OutputKind.Element) tagParent.namespace.namespaceURI\n else XMLConstants.NULL_NS_URI,\n useName.serialName,\n )\n }\n}\n/** Pretty XML configuration. */\nprivate val XML_CONFIG_PRETTY = XML_CONFIG.copy { indent = 4 }\n\n/** XML configuration. */\n@JvmOverloads\nfun xmlConfig(prettyPrint: Boolean = false): XML =\n if (prettyPrint) XML_CONFIG_PRETTY else XML_CONFIG\n\n<%_ if (includeSerializationFormatVersion) { -%>\n/** Version of the serialization format. */\n@JsExport\nconst val <%= formConstant %>_SERIALIZATION_VERSION = 1\n\n<%_ } -%>\n@JsExport\n@JvmOverloads\nfun encode<%= formClass %>ToString(<%= formVar %>: <%= formClass %>, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(<%= formVar %>)\n\n@JsExport\nfun decode<%= formClass %>FromString(xml: String): <%= formClass %> =\n xmlConfig().decodeFromString(xml)\n\n@JvmOverloads\nfun encode<%= formClass %>ExternalContextsToString(externalContexts: <%= formClass %>ExternalContexts, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(externalContexts)\n\n@JsExport\nfun decode<%= formClass %>ExternalContextsFromString(xml: String): <%= formClass %>ExternalContexts =\n xmlConfig().decodeFromString(xml)\n\n@JvmOverloads\nfun encode<%= formClass %>SubmitResponseToString(response: <%= formClass %>SubmitResponse, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(response)\n\n@JsExport\nfun decode<%= formClass %>SubmitResponseFromString(xml: String): <%= formClass %>SubmitResponse =\n xmlConfig().decodeFromString(xml)\n";
237
+ const DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION = true;
238
+ function scaffoldSerializer(schematic, data) {
239
+ const ejsData = {
240
+ filePackage: data.currentPackage,
241
+ formVar: camelCase(schematic.name),
242
+ formClass: schematic.name,
243
+ formConstant: constantCase(schematic.name),
244
+ includeSerializationFormatVersion: data.includeSerializationFormatVersion ?? DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION
245
+ };
246
+ addEjsTemplateFile(
247
+ data,
248
+ `${schematic.name}Serializer.kt`,
249
+ data.serializationFormat === "xml" ? xmlSerializerKt : jsonSerializerKt,
250
+ ejsData
251
+ );
252
+ }
235
253
  function arrayify(value) {
236
254
  return value == null ? [] : Array.isArray(value) ? value : [value];
237
255
  }
@@ -273,38 +291,42 @@ const classSchematicKind = {
273
291
  if (data.currentPath !== "/") {
274
292
  return baseModel;
275
293
  }
276
- data.currentFile.imports.add("kotlin.js.ExperimentalJsStatic").add("kotlin.js.JsStatic").add("kotlinx.serialization.EncodeDefault").add("kotlinx.serialization.ExperimentalSerializationApi");
277
294
  const classAnnotations = [];
278
- const versionAnnotations = [
279
- "@EncodeDefault",
280
- "@OptIn(ExperimentalSerializationApi::class)"
281
- ];
295
+ let versionProperty = null;
282
296
  if (data.serializationFormat === "xml") {
283
- data.currentFile.imports.add("nl.adaptivity.xmlutil.serialization.XmlChildrenName").add("nl.adaptivity.xmlutil.serialization.XmlElement").add("nl.adaptivity.xmlutil.serialization.XmlSerialName");
284
- const defaultNamespace = `http://${data.currentPackage.split(".").reverse().join(".")}/schema/${(/* @__PURE__ */ new Date()).getFullYear()}`;
297
+ data.currentFile.imports.add(
298
+ "nl.adaptivity.xmlutil.serialization.XmlSerialName"
299
+ );
300
+ const namespace = data.xmlNamespace ?? `http://${data.currentPackage.split(".").reverse().join(".")}/schema/${(/* @__PURE__ */ new Date()).getFullYear()}`;
285
301
  classAnnotations.push(
286
- `@XmlSerialName("${schematic.name}", "${defaultNamespace}")`
302
+ `@XmlSerialName("${schematic.name}", "${namespace}")`
287
303
  );
288
- versionAnnotations.push("@XmlElement(false)");
289
- } else {
290
- data.currentFile.imports.add("kotlinx.serialization.SerialName");
291
- versionAnnotations.push('@SerialName($$"$version")');
292
304
  }
293
- return annotate(
294
- classAnnotations,
295
- `${baseModel} ${code`
296
- {
297
- ${annotate(versionAnnotations, `internal var version = ${constantCase(schematic.name)}_SERIALIZATION_VERSION`)}
298
-
299
- companion object {
300
- @OptIn(ExperimentalJsStatic::class)
301
- @JsStatic
302
- fun createInitialValue(externalContexts: ${schematic.name}ExternalContexts) =
303
- externalContexts.initialValue ?: ${schematic.name}()
305
+ if (data.includeSerializationFormatVersion ?? DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION) {
306
+ data.currentFile.imports.add("kotlinx.serialization.EncodeDefault").add("kotlinx.serialization.ExperimentalSerializationApi");
307
+ const versionAnnotations = [
308
+ "@EncodeDefault",
309
+ "@OptIn(ExperimentalSerializationApi::class)"
310
+ ];
311
+ if (data.serializationFormat === "xml") {
312
+ data.currentFile.imports.add(
313
+ "nl.adaptivity.xmlutil.serialization.XmlElement"
314
+ );
315
+ versionAnnotations.push("@XmlElement(false)");
316
+ } else {
317
+ data.currentFile.imports.add("kotlinx.serialization.SerialName");
318
+ versionAnnotations.push('@SerialName($$"$version")');
319
+ }
320
+ versionProperty = annotate(
321
+ versionAnnotations,
322
+ `internal var version = ${constantCase(schematic.name)}_SERIALIZATION_VERSION`
323
+ );
324
+ }
325
+ return annotate(classAnnotations, baseModel) + (versionProperty ? ` ${code`
326
+ {
327
+ ${versionProperty}
304
328
  }
305
- }
306
- `}`
307
- );
329
+ `}` : "");
308
330
  },
309
331
  scaffoldField: (schematic, data) => {
310
332
  data.currentFile.imports.push(
@@ -753,7 +775,6 @@ function scaffoldAppComponentFile(schematic, data) {
753
775
  { moduleName: "@ostack.tech/ui-kform", name: localeVar },
754
776
  { moduleName: "@ostack.tech/ui-kform", name: "IssuesPanel" },
755
777
  { moduleName: "react", name: "useMemo" },
756
- { moduleName: data.kmpModuleName, name: schematic.name },
757
778
  { moduleName: data.kmpModuleName, name: `${schematic.name}FormMode` },
758
779
  { moduleName: data.kmpModuleName, name: `${schematic.name}Schema` },
759
780
  { moduleName: `./api/reportError.ts`, name: "reportError" },
@@ -774,10 +795,11 @@ function scaffoldAppComponentFile(schematic, data) {
774
795
  return (
775
796
  <FormApp
776
797
  schema={${schematic.name}Schema.get()}
777
- initialValue={useMemo(
778
- () => ${schematic.name}.createInitialValue(externalContexts),
779
- [externalContexts],
780
- )}
798
+ initialValue={
799
+ externalContexts.mode !== ${schematic.name}FormMode.NEW
800
+ ? externalContexts.initialValue
801
+ : undefined
802
+ }
781
803
  externalContexts={useMemo(
782
804
  () => ktMapToObject(externalContexts.toMap()),
783
805
  [externalContexts],
@@ -1436,22 +1458,6 @@ function scaffoldResponses(schematic, data) {
1436
1458
  ejsData
1437
1459
  );
1438
1460
  }
1439
- const jsonSerializerKt = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.json.Json\n\n/** Base JSON configuration. */\nprivate val JSON_CONFIG = Json.Default\n/** Pretty JSON configuration. */\nprivate val JSON_CONFIG_PRETTY = Json(JSON_CONFIG) { prettyPrint = true }\n\n/** JSON configuration. */\n@JvmOverloads\nfun jsonConfig(prettyPrint: Boolean = false): Json =\n if (prettyPrint) JSON_CONFIG_PRETTY else JSON_CONFIG\n\n/** Version of the serialization format. */\n@JsExport\nconst val <%= formConstant %>_SERIALIZATION_VERSION = 1\n\n@JsExport\n@JvmOverloads\nfun encode<%= formClass %>ToString(<%= formVar %>: <%= formClass %>, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(<%= formVar %>)\n\n@JsExport\nfun decode<%= formClass %>FromString(json: String): <%= formClass %> =\n jsonConfig().decodeFromString(json)\n\n@JvmOverloads\nfun encode<%= formClass %>ExternalContextsToString(externalContexts: <%= formClass %>ExternalContexts, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(externalContexts)\n\n@JsExport\nfun decode<%= formClass %>ExternalContextsFromString(json: String): <%= formClass %>ExternalContexts =\n jsonConfig().decodeFromString(json)\n\n@JvmOverloads\nfun encode<%= formClass %>SubmitResponseToString(response: <%= formClass %>SubmitResponse, prettyPrint: Boolean = false): String =\n jsonConfig(prettyPrint).encodeToString(response)\n\n@JsExport\nfun decode<%= formClass %>SubmitResponseFromString(json: String): <%= formClass %>SubmitResponse =\n jsonConfig().decodeFromString(json)\n";
1440
- const xmlSerializerKt = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.encodeToString\nimport nl.adaptivity.xmlutil.ExperimentalXmlUtilApi\nimport nl.adaptivity.xmlutil.QName\nimport nl.adaptivity.xmlutil.XMLConstants\nimport nl.adaptivity.xmlutil.core.XmlVersion\nimport nl.adaptivity.xmlutil.serialization.DefaultXmlSerializationPolicy\nimport nl.adaptivity.xmlutil.serialization.OutputKind\nimport nl.adaptivity.xmlutil.serialization.XML\nimport nl.adaptivity.xmlutil.serialization.XmlSerializationPolicy\nimport nl.adaptivity.xmlutil.serialization.structure.SafeParentInfo\n\n/** Base XML configuration. */\nprivate val XML_CONFIG = XML {\n recommended_0_91_0 {\n xmlVersion = XmlVersion.XML10\n autoPolymorphic = false\n encodeDefault = XmlSerializationPolicy.XmlEncodeDefault.NEVER\n }\n\n // Set policy on top of the current policy config\n @OptIn(ExperimentalXmlUtilApi::class)\n policy =\n object : DefaultXmlSerializationPolicy(policy) {\n // Serialize properties as elements instead of attributes by default\n override val defaultPrimitiveOutputKind: OutputKind = OutputKind.Element\n\n // Use property names as serial names by default\n override fun effectiveName(\n serializerParent: SafeParentInfo,\n tagParent: SafeParentInfo,\n outputKind: OutputKind,\n useName: XmlSerializationPolicy.DeclaredNameInfo,\n ): QName =\n useName.annotatedName\n ?: serializerParent.elementTypeDescriptor.typeQname\n ?: QName(\n if (outputKind == OutputKind.Element) tagParent.namespace.namespaceURI\n else XMLConstants.NULL_NS_URI,\n useName.serialName,\n )\n }\n}\n/** Pretty XML configuration. */\nprivate val XML_CONFIG_PRETTY = XML_CONFIG.copy { indent = 4 }\n\n/** XML configuration. */\n@JvmOverloads\nfun xmlConfig(prettyPrint: Boolean = false): XML =\n if (prettyPrint) XML_CONFIG_PRETTY else XML_CONFIG\n\n/** Version of the serialization format. */\n@JsExport\nconst val <%= formConstant %>_SERIALIZATION_VERSION = 1\n\n@JsExport\n@JvmOverloads\nfun encode<%= formClass %>ToString(<%= formVar %>: <%= formClass %>, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(<%= formVar %>)\n\n@JsExport\nfun decode<%= formClass %>FromString(xml: String): <%= formClass %> =\n xmlConfig().decodeFromString(xml)\n\n@JvmOverloads\nfun encode<%= formClass %>ExternalContextsToString(externalContexts: <%= formClass %>ExternalContexts, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(externalContexts)\n\n@JsExport\nfun decode<%= formClass %>ExternalContextsFromString(xml: String): <%= formClass %>ExternalContexts =\n xmlConfig().decodeFromString(xml)\n\n@JvmOverloads\nfun encode<%= formClass %>SubmitResponseToString(response: <%= formClass %>SubmitResponse, prettyPrint: Boolean = false): String =\n xmlConfig(prettyPrint).encodeToString(response)\n\n@JsExport\nfun decode<%= formClass %>SubmitResponseFromString(xml: String): <%= formClass %>SubmitResponse =\n xmlConfig().decodeFromString(xml)\n";
1441
- function scaffoldSerializer(schematic, data) {
1442
- const ejsData = {
1443
- filePackage: data.currentPackage,
1444
- formVar: camelCase(schematic.name),
1445
- formClass: schematic.name,
1446
- formConstant: constantCase(schematic.name)
1447
- };
1448
- addEjsTemplateFile(
1449
- data,
1450
- `${schematic.name}Serializer.kt`,
1451
- data.serializationFormat === "xml" ? xmlSerializerKt : jsonSerializerKt,
1452
- ejsData
1453
- );
1454
- }
1455
1461
  const indexScss = '@use "@ostack.tech/ui/scss" as ostack-ui;\n@use "@ostack.tech/ui-kform/scss" as ostack-ui-kform;\n';
1456
1462
  function scaffoldStyles(_schematic, data) {
1457
1463
  addTemplateFile(data, "index.scss", indexScss);
@@ -1471,7 +1477,7 @@ function scaffoldViteProject(schematic, data) {
1471
1477
  formId: kebabCase(schematic.name),
1472
1478
  formClass: schematic.name,
1473
1479
  formTitle: capitalCase(schematic.name),
1474
- ostackUiVersion: "0.6.4",
1480
+ ostackUiVersion: "0.6.5",
1475
1481
  kFormVersion: "0.31.6",
1476
1482
  dependencyVersions: JSON.parse('{"@eslint/js":"^9.39.1","@fortawesome/fontawesome-svg-core":"^7.1.0","@fortawesome/free-brands-svg-icons":"^7.1.0","@fortawesome/free-regular-svg-icons":"^7.1.0","@fortawesome/free-solid-svg-icons":"^7.1.0","@ostack.tech/kform":"~0.31.6","@ostack.tech/kform-react":"~0.31.6","@ostack.tech/kform-scaffolder":"~0.31.6","@storybook/addon-docs":"^10.1.5","@storybook/addon-links":"^10.1.5","@storybook/react-vite":"^10.1.5","@types/node":"^22.19.2","@types/react":"^19.2.7","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.2","change-case":"^5.4.4","cpy-cli":"^6.0.0","date-fns":"^4.1.0","eslint":"^9.39.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.24","eslint-plugin-simple-import-sort":"^12.1.1","eslint-plugin-storybook":"^10.1.5","globals":"^16.5.0","happy-dom":"^20.0.11","lint-staged":"^16.2.7","prettier":"^3.7.4","prettier-plugin-jsdoc":"^1.8.0","react":"^19.2.1","react-dom":"^19.2.1","rimraf":"^6.1.2","sass-embedded":"^1.93.3","simple-git-hooks":"^2.13.1","storybook":"^10.1.5","terser":"^5.44.1","tslib":"^2.8.1","typescript":"~5.9.3","typescript-eslint":"^8.49.0","vite":"^7.2.7","vite-plugin-dts":"^4.5.4","vitest":"^4.0.15","zustand":"^5.0.9"}'),
1477
1483
  externalContextsData: data.serializationFormat === "json" ? "{}" : `<${schematic.name}ExternalContexts />`,
@@ -1550,6 +1556,7 @@ function SchematicBuilder({
1550
1556
  export {
1551
1557
  DEFAULT_ACTIVE_PATH_SEARCH_PARAM,
1552
1558
  DEFAULT_API_BASE_PATH,
1559
+ DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION,
1553
1560
  DEFAULT_JVM_TOOLCHAIN_VERSION,
1554
1561
  DEFAULT_LOCALE,
1555
1562
  DEFAULT_NODEJS_VERSION,