@ostack.tech/ui-kform-scaffolder 0.15.0 → 0.15.1

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.
Files changed (35) hide show
  1. package/dist/ostack-ui-kform-scaffolder.js +876 -1389
  2. package/dist/ostack-ui-kform-scaffolder.js.map +1 -1
  3. package/dist/types/SchematicBuilder.d.ts +3 -3
  4. package/dist/types/SchematicKind.d.ts +3 -3
  5. package/dist/types/configs/DefaultLocaleConfig.d.ts +1 -1
  6. package/dist/types/configs/SerializationFormatConfig.d.ts +1 -1
  7. package/dist/types/configs/UseTableValuesSerializerConfig.d.ts +1 -1
  8. package/dist/types/index.d.ts +24 -24
  9. package/dist/types/main.d.ts +1 -0
  10. package/dist/types/scaffolding/ScaffoldingData.d.ts +2 -2
  11. package/dist/types/scaffolding/kotlin/KtData.d.ts +2 -2
  12. package/dist/types/scaffolding/reactApp/ReactAppData.d.ts +2 -2
  13. package/dist/types/scaffolding/reactApp/util/reactAppLayout.d.ts +2 -2
  14. package/dist/types/scaffolding/scaffolders/scaffoldActions.d.ts +2 -2
  15. package/dist/types/scaffolding/scaffolders/scaffoldApi.d.ts +2 -2
  16. package/dist/types/scaffolding/scaffolders/scaffoldAppComponent.d.ts +2 -2
  17. package/dist/types/scaffolding/scaffolders/scaffoldAppContext.d.ts +2 -2
  18. package/dist/types/scaffolding/scaffolders/scaffoldExternalContexts.d.ts +2 -2
  19. package/dist/types/scaffolding/scaffolders/scaffoldGradleProject.d.ts +2 -2
  20. package/dist/types/scaffolding/scaffolders/scaffoldGradleWrapper.d.ts +2 -2
  21. package/dist/types/scaffolding/scaffolders/scaffoldIssueMessages.d.ts +2 -2
  22. package/dist/types/scaffolding/scaffolders/scaffoldMain.d.ts +2 -2
  23. package/dist/types/scaffolding/scaffolders/scaffoldPageComponents.d.ts +2 -2
  24. package/dist/types/scaffolding/scaffolders/scaffoldProjectMisc.d.ts +2 -2
  25. package/dist/types/scaffolding/scaffolders/scaffoldResponses.d.ts +2 -2
  26. package/dist/types/scaffolding/scaffolders/scaffoldSerializer.d.ts +2 -2
  27. package/dist/types/scaffolding/scaffolders/scaffoldStyles.d.ts +2 -2
  28. package/dist/types/scaffolding/scaffolders/scaffoldViteProject.d.ts +2 -2
  29. package/dist/webapp/assets/gradle-wrapper-BruD2auj.jar +0 -0
  30. package/dist/webapp/assets/index-BKUWl2po.css +1 -0
  31. package/dist/webapp/assets/index-CZhbP43P.js +1526 -0
  32. package/dist/webapp/index.html +2 -2
  33. package/package.json +3 -3
  34. package/dist/webapp/assets/index-DFHwLN8U.js +0 -1529
  35. package/dist/webapp/assets/index-x_B5n20N.css +0 -1
@@ -1,349 +1,326 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useConfig, UseTableValuesSerializerConfig as UseTableValuesSerializerConfig$1, addEjsTemplateFile, joinPaths, tsFile, code, anySchematicKind as anySchematicKind$1, bigDecimalSchematicKind as bigDecimalSchematicKind$1, bigIntegerSchematicKind as bigIntegerSchematicKind$1, booleanSchematicKind as booleanSchematicKind$1, byteSchematicKind as byteSchematicKind$1, classSchematicKind as classSchematicKind$1, doubleSchematicKind as doubleSchematicKind$1, enumSchematicKind as enumSchematicKind$1, fileSchematicKind as fileSchematicKind$1, floatSchematicKind as floatSchematicKind$1, intSchematicKind as intSchematicKind$1, ListableBuilderWithoutKindSelect, listSchematicKind, localDateSchematicKind as localDateSchematicKind$1, longSchematicKind as longSchematicKind$1, shortSchematicKind as shortSchematicKind$1, stringSchematicKind as stringSchematicKind$1, tableSchematicKind as tableSchematicKind$1, annotate, createSchematic, addTemplateFile, SchematicBuilder as SchematicBuilder$1, configScaffolder, scaffoldSchemas, scaffoldModels, scaffoldValidator } from "@ostack.tech/kform-scaffolder";
1
+ import { ListableBuilderWithoutKindSelect, SchematicBuilder as SchematicBuilder$1, UseTableValuesSerializerConfig as UseTableValuesSerializerConfig$1, addEjsTemplateFile, addTemplateFile, annotate, anySchematicKind as anySchematicKind$1, bigDecimalSchematicKind as bigDecimalSchematicKind$1, bigIntegerSchematicKind as bigIntegerSchematicKind$1, booleanSchematicKind as booleanSchematicKind$1, byteSchematicKind as byteSchematicKind$1, classSchematicKind as classSchematicKind$1, code, configScaffolder, createSchematic, doubleSchematicKind as doubleSchematicKind$1, enumSchematicKind as enumSchematicKind$1, fileSchematicKind as fileSchematicKind$1, floatSchematicKind as floatSchematicKind$1, intSchematicKind as intSchematicKind$1, joinPaths, listSchematicKind, localDateSchematicKind as localDateSchematicKind$1, longSchematicKind as longSchematicKind$1, scaffoldModels, scaffoldSchemas, scaffoldValidator, shortSchematicKind as shortSchematicKind$1, stringSchematicKind as stringSchematicKind$1, tableSchematicKind as tableSchematicKind$1, tsFile, useConfig } from "@ostack.tech/kform-scaffolder";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useRef } from "react";
4
- import { camelCase, kebabCase, constantCase, sentenceCase, capitalCase, pascalCase } from "change-case";
5
- const DEFAULT_LOCALE = "en-US";
6
- const LOCALES = JSON.parse('["en-GB","en-US","fr-FR","pt-PT"]');
7
- function DefaultLocaleConfig({
8
- defaultValue = DEFAULT_LOCALE,
9
- disabled
10
- }) {
11
- const [config, setConfig] = useConfig("defaultLocale", defaultValue);
12
- return /* @__PURE__ */ jsxs("div", { className: "builder-config-field", children: [
13
- /* @__PURE__ */ jsx("label", { children: "Default locale" }),
14
- /* @__PURE__ */ jsx(
15
- "select",
16
- {
17
- value: config,
18
- onChange: (evt) => {
19
- setConfig(evt.target.value);
20
- },
21
- disabled,
22
- children: LOCALES.map((locale) => /* @__PURE__ */ jsx("option", { value: locale, children: locale }, locale))
23
- }
24
- )
25
- ] });
4
+ import { camelCase, capitalCase, constantCase, kebabCase, pascalCase, sentenceCase } from "change-case";
5
+ //#region src/configs/DefaultLocaleConfig.tsx
6
+ var DEFAULT_LOCALE = "en-US";
7
+ var LOCALES = JSON.parse("[\"en-GB\",\"en-US\",\"fr-FR\",\"pt-PT\"]");
8
+ function DefaultLocaleConfig({ defaultValue = DEFAULT_LOCALE, disabled }) {
9
+ const [config, setConfig] = useConfig("defaultLocale", defaultValue);
10
+ return /* @__PURE__ */ jsxs("div", {
11
+ className: "builder-config-field",
12
+ children: [/* @__PURE__ */ jsx("label", { children: "Default locale" }), /* @__PURE__ */ jsx("select", {
13
+ value: config,
14
+ onChange: (evt) => {
15
+ setConfig(evt.target.value);
16
+ },
17
+ disabled,
18
+ children: LOCALES.map((locale) => /* @__PURE__ */ jsx("option", {
19
+ value: locale,
20
+ children: locale
21
+ }, locale))
22
+ })]
23
+ });
26
24
  }
27
- const DEFAULT_SERIALIZATION_FORMAT = "json";
28
- function SerializationFormatConfig({
29
- defaultValue = DEFAULT_SERIALIZATION_FORMAT,
30
- disabled
31
- }) {
32
- const [useTableValuesSerializerConfig, setUseTableValuesSerializerConfig] = useConfig("useTableValuesSerializer", false);
33
- const lastUseTableValuesSerializerConfig = useRef(
34
- useTableValuesSerializerConfig
35
- );
36
- const [config, setConfig] = useConfig("serializationFormat", defaultValue);
37
- return /* @__PURE__ */ jsxs("div", { className: "builder-config-field", children: [
38
- /* @__PURE__ */ jsx("label", { children: "Serialization format" }),
39
- /* @__PURE__ */ jsxs(
40
- "select",
41
- {
42
- value: config,
43
- onChange: (evt) => {
44
- setConfig(evt.target.value);
45
- if (evt.target.value === "xml") {
46
- lastUseTableValuesSerializerConfig.current = useTableValuesSerializerConfig;
47
- setUseTableValuesSerializerConfig(true);
48
- } else {
49
- setUseTableValuesSerializerConfig(
50
- lastUseTableValuesSerializerConfig.current
51
- );
52
- }
53
- },
54
- disabled,
55
- children: [
56
- /* @__PURE__ */ jsx("option", { value: "json", children: "JSON" }),
57
- /* @__PURE__ */ jsx("option", { value: "xml", children: "XML" })
58
- ]
59
- }
60
- )
61
- ] });
25
+ //#endregion
26
+ //#region src/configs/SerializationFormatConfig.tsx
27
+ var DEFAULT_SERIALIZATION_FORMAT = "json";
28
+ function SerializationFormatConfig({ defaultValue = DEFAULT_SERIALIZATION_FORMAT, disabled }) {
29
+ const [useTableValuesSerializerConfig, setUseTableValuesSerializerConfig] = useConfig("useTableValuesSerializer", false);
30
+ const lastUseTableValuesSerializerConfig = useRef(useTableValuesSerializerConfig);
31
+ const [config, setConfig] = useConfig("serializationFormat", defaultValue);
32
+ return /* @__PURE__ */ jsxs("div", {
33
+ className: "builder-config-field",
34
+ children: [/* @__PURE__ */ jsx("label", { children: "Serialization format" }), /* @__PURE__ */ jsxs("select", {
35
+ value: config,
36
+ onChange: (evt) => {
37
+ setConfig(evt.target.value);
38
+ if (evt.target.value === "xml") {
39
+ lastUseTableValuesSerializerConfig.current = useTableValuesSerializerConfig;
40
+ setUseTableValuesSerializerConfig(true);
41
+ } else setUseTableValuesSerializerConfig(lastUseTableValuesSerializerConfig.current);
42
+ },
43
+ disabled,
44
+ children: [/* @__PURE__ */ jsx("option", {
45
+ value: "json",
46
+ children: "JSON"
47
+ }), /* @__PURE__ */ jsx("option", {
48
+ value: "xml",
49
+ children: "XML"
50
+ })]
51
+ })]
52
+ });
62
53
  }
63
- function UseTableValuesSerializerConfig({
64
- disabled
65
- }) {
66
- const [serializationFormatConfig] = useConfig(
67
- "serializationFormat",
68
- DEFAULT_SERIALIZATION_FORMAT
69
- );
70
- return /* @__PURE__ */ jsx(
71
- UseTableValuesSerializerConfig$1,
72
- {
73
- disabled: disabled || serializationFormatConfig === "xml"
74
- }
75
- );
54
+ //#endregion
55
+ //#region src/configs/UseTableValuesSerializerConfig.tsx
56
+ function UseTableValuesSerializerConfig({ disabled }) {
57
+ const [serializationFormatConfig] = useConfig("serializationFormat", DEFAULT_SERIALIZATION_FORMAT);
58
+ return /* @__PURE__ */ jsx(UseTableValuesSerializerConfig$1, { disabled: disabled || serializationFormatConfig === "xml" });
76
59
  }
77
- const loadTsxEjs = 'import { LoadAction } from "@ostack.tech/ui-kform";\nimport { decode<%= formClass %>FromString, <%= formClass %>FormMode } from "<%= kmpModuleName %>";\nimport { use<%= formClass %>Context } from "../<%= formClass %>Context.ts";\n\nexport function Load() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return (\n externalContexts.mode !== <%= formClass %>FormMode.READ && (\n <LoadAction\n decode={async (file) => decode<%= formClass %>FromString(await file.text())}\n mimeTypes={["<%= serializationMimeType %>"]}\n extensions={[".<%= serializationFormat %>"]}\n />\n )\n );\n}\n';
78
- const saveTsxEjs = 'import { SaveAction } from "@ostack.tech/ui-kform";\nimport { type <%= formClass %>, encode<%= formClass %>ToString, <%= formClass %>FormMode } from "<%= kmpModuleName %>";\nimport { use<%= formClass %>Context } from "../<%= formClass %>Context.ts";\n\nexport function Save() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return (\n <SaveAction\n encode={(<%= formVar %>: <%= formClass %>) => encode<%= formClass %>ToString(<%= formVar %>, true)}\n disableOverwrite={externalContexts.mode === <%= formClass %>FormMode.READ}\n mimeTypes={["<%= serializationMimeType %>"]}\n extensions={[".<%= serializationFormat %>"]}\n />\n );\n}\n';
79
- const submitTsxEjs = 'import { LocatedValidationWarning } from "@ostack.tech/kform";\nimport { SubmitAction } from "@ostack.tech/ui-kform";\nimport {\n type <%= formClass %>,\n <%= formClass %>FormMode,\n <%= formClass %>SubmitSuccess,\n <%= formClass %>SubmitValidationError,\n <%= formClass %>SubmitError,\n} from "<%= kmpModuleName %>";\nimport { use<%= formClass %>Context } from "../<%= formClass %>Context.ts";\nimport { submit } from "../api/submit.ts";\n\nexport function Submit() {\n const { externalContexts } = use<%= formClass %>Context();\n\n const handleSubmit = async (\n <%= formVar %>: <%= formClass %>,\n acceptedWarnings?: LocatedValidationWarning[],\n ) => {\n const response = await submit(<%= formVar %>, acceptedWarnings);\n if (response instanceof <%= formClass %>SubmitSuccess) {\n return response.redirectTo;\n } else if (response instanceof <%= formClass %>SubmitValidationError) {\n return response.issues;\n } else {\n throw response as <%= formClass %>SubmitError;\n }\n };\n\n const handleSuccessfulSubmit = (redirectTo: string) => {\n window.location.href = redirectTo;\n };\n\n return (\n externalContexts.mode !== <%= formClass %>FormMode.READ && (\n <SubmitAction\n onSubmit={handleSubmit}\n onSuccessfulSubmit={handleSuccessfulSubmit}\n <%_ if (useTableValuesSerializer) { -%>\n convertExternalIssuesTableRowIndicesToIds\n <%_ } -%>\n />\n )\n );\n}\n';
80
- const validateTsxEjs = 'import { ValidateAction } from "@ostack.tech/ui-kform";\nimport { <%= formClass %>FormMode } from "<%= kmpModuleName %>";\nimport { use<%= formClass %>Context } from "../<%= formClass %>Context.ts";\n\nexport function Validate() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return externalContexts.mode !== <%= formClass %>FormMode.READ && <ValidateAction />;\n}\n';
60
+ //#endregion
61
+ //#region src/scaffolding/templates/react-app/src/actions/Load.tsx.ejs?raw
62
+ var Load_tsx_default = "import { LoadAction } from \"@ostack.tech/ui-kform\";\nimport { decode<%= formClass %>FromString, <%= formClass %>FormMode } from \"<%= kmpModuleName %>\";\nimport { use<%= formClass %>Context } from \"../<%= formClass %>Context.ts\";\n\nexport function Load() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return (\n externalContexts.mode !== <%= formClass %>FormMode.READ && (\n <LoadAction\n decode={async (file) => decode<%= formClass %>FromString(await file.text())}\n mimeTypes={[\"<%= serializationMimeType %>\"]}\n extensions={[\".<%= serializationFormat %>\"]}\n />\n )\n );\n}\n";
63
+ //#endregion
64
+ //#region src/scaffolding/templates/react-app/src/actions/Save.tsx.ejs?raw
65
+ var Save_tsx_default = "import { SaveAction } from \"@ostack.tech/ui-kform\";\nimport { type <%= formClass %>, encode<%= formClass %>ToString, <%= formClass %>FormMode } from \"<%= kmpModuleName %>\";\nimport { use<%= formClass %>Context } from \"../<%= formClass %>Context.ts\";\n\nexport function Save() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return (\n <SaveAction\n encode={(<%= formVar %>: <%= formClass %>) => encode<%= formClass %>ToString(<%= formVar %>, true)}\n disableOverwrite={externalContexts.mode === <%= formClass %>FormMode.READ}\n mimeTypes={[\"<%= serializationMimeType %>\"]}\n extensions={[\".<%= serializationFormat %>\"]}\n />\n );\n}\n";
66
+ //#endregion
67
+ //#region src/scaffolding/templates/react-app/src/actions/Submit.tsx.ejs?raw
68
+ var Submit_tsx_default = "import { LocatedValidationWarning } from \"@ostack.tech/kform\";\nimport { SubmitAction } from \"@ostack.tech/ui-kform\";\nimport {\n type <%= formClass %>,\n <%= formClass %>FormMode,\n <%= formClass %>SubmitSuccess,\n <%= formClass %>SubmitValidationError,\n <%= formClass %>SubmitError,\n} from \"<%= kmpModuleName %>\";\nimport { use<%= formClass %>Context } from \"../<%= formClass %>Context.ts\";\nimport { submit } from \"../api/submit.ts\";\n\nexport function Submit() {\n const { externalContexts } = use<%= formClass %>Context();\n\n const handleSubmit = async (\n <%= formVar %>: <%= formClass %>,\n acceptedWarnings?: LocatedValidationWarning[],\n ) => {\n const response = await submit(<%= formVar %>, acceptedWarnings);\n if (response instanceof <%= formClass %>SubmitSuccess) {\n return response.redirectTo;\n } else if (response instanceof <%= formClass %>SubmitValidationError) {\n return response.issues;\n } else {\n throw response as <%= formClass %>SubmitError;\n }\n };\n\n const handleSuccessfulSubmit = (redirectTo: string) => {\n window.location.href = redirectTo;\n };\n\n return (\n externalContexts.mode !== <%= formClass %>FormMode.READ && (\n <SubmitAction\n onSubmit={handleSubmit}\n onSuccessfulSubmit={handleSuccessfulSubmit}\n <%_ if (useTableValuesSerializer) { -%>\n convertExternalIssuesTableRowIndicesToIds\n <%_ } -%>\n />\n )\n );\n}\n";
69
+ //#endregion
70
+ //#region src/scaffolding/templates/react-app/src/actions/Validate.tsx.ejs?raw
71
+ var Validate_tsx_default = "import { ValidateAction } from \"@ostack.tech/ui-kform\";\nimport { <%= formClass %>FormMode } from \"<%= kmpModuleName %>\";\nimport { use<%= formClass %>Context } from \"../<%= formClass %>Context.ts\";\n\nexport function Validate() {\n const { externalContexts } = use<%= formClass %>Context();\n\n return externalContexts.mode !== <%= formClass %>FormMode.READ && <ValidateAction />;\n}\n";
72
+ //#endregion
73
+ //#region src/scaffolding/scaffolders/scaffoldActions.ts
81
74
  function scaffoldActions(schematic, data) {
82
- const ejsData = {
83
- kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
84
- serializationFormat: data.serializationFormat ?? "json",
85
- serializationMimeType: `application/${data.serializationFormat}`,
86
- formVar: camelCase(schematic.name),
87
- formClass: schematic.name,
88
- useTableValuesSerializer: data.useTableValuesSerializer
89
- };
90
- addEjsTemplateFile(data, "actions/Load.tsx", loadTsxEjs, ejsData);
91
- addEjsTemplateFile(data, "actions/Save.tsx", saveTsxEjs, ejsData);
92
- addEjsTemplateFile(data, "actions/Submit.tsx", submitTsxEjs, ejsData);
93
- addEjsTemplateFile(data, "actions/Validate.tsx", validateTsxEjs, ejsData);
75
+ const ejsData = {
76
+ kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
77
+ serializationFormat: data.serializationFormat ?? "json",
78
+ serializationMimeType: `application/${data.serializationFormat}`,
79
+ formVar: camelCase(schematic.name),
80
+ formClass: schematic.name,
81
+ useTableValuesSerializer: data.useTableValuesSerializer
82
+ };
83
+ addEjsTemplateFile(data, "actions/Load.tsx", Load_tsx_default, ejsData);
84
+ addEjsTemplateFile(data, "actions/Save.tsx", Save_tsx_default, ejsData);
85
+ addEjsTemplateFile(data, "actions/Submit.tsx", Submit_tsx_default, ejsData);
86
+ addEjsTemplateFile(data, "actions/Validate.tsx", Validate_tsx_default, ejsData);
94
87
  }
95
- const apiFetchTsEjs = 'const API_BASE_URL = new URL("<%= apiBasePath %>", window.location.origin);\n\n/**\n * Wrapper around `fetch` for accessing the API.\n *\n * Configuration common to all API requests should be set here.\n */\nexport function apiFetch(url: string | URL, init?: RequestInit) {\n return fetch(new URL(url, API_BASE_URL), init);\n}\n';
96
- const reportErrorTsEjs = 'import type { ErrorReport } from "@ostack.tech/ui";\nimport { apiFetch } from "./apiFetch.ts";\n\nconst REPORT_ERROR_API_ENDPOINT = "<%= reportErrorApiEndpoint %>";\n\nexport async function reportError(error: ErrorReport) {\n await apiFetch(REPORT_ERROR_API_ENDPOINT, {\n method: "POST",\n headers: { "Content-Type": "application/json" },\n body: JSON.stringify(error, null, import.meta.env.DEV ? 2 : 0),\n });\n}\n';
97
- const submitTsEjs = 'import { LocatedValidationWarning } from "@ostack.tech/kform";\nimport {\n decode<%= formClass %>SubmitResponseFromString,\n encode<%= formClass %>ToString,\n <%= formClass %>,\n} from "<%= kmpModuleName %>";\nimport { apiFetch } from "./apiFetch.ts";\n\nconst SUBMIT_API_ENDPOINT = "<%= submitApiEndpoint %>";\n\nexport async function submit(\n <%= formVar %>: <%= formClass %>,\n acceptedWarnings?: LocatedValidationWarning[],\n) {\n const params = new URLSearchParams();\n if (acceptedWarnings?.length) {\n const acceptedWarningCodes = new Set(acceptedWarnings.map((w) => w.code));\n params.set("acceptedWarnings", Array.from(acceptedWarningCodes).join());\n }\n\n const response = await apiFetch(`${SUBMIT_API_ENDPOINT}?${params}`, {\n method: "POST",\n headers: { "Content-Type": "<%= serializationMimeType %>" },\n body: encode<%= formClass %>ToString(<%= formVar %>, import.meta.env.DEV),\n });\n return decode<%= formClass %>SubmitResponseFromString(await response.text());\n}\n';
98
- const DEFAULT_API_BASE_PATH = "/api/";
99
- const DEFAULT_REPORT_ERROR_API_ENDPOINT = "report-error";
100
- const DEFAULT_SUBMIT_API_ENDPOINT = "submit";
88
+ //#endregion
89
+ //#region src/scaffolding/templates/react-app/src/api/apiFetch.ts.ejs?raw
90
+ var apiFetch_ts_default = "const API_BASE_URL = new URL(\"<%= apiBasePath %>\", window.location.origin);\n\n/**\n * Wrapper around `fetch` for accessing the API.\n *\n * Configuration common to all API requests should be set here.\n */\nexport function apiFetch(url: string | URL, init?: RequestInit) {\n return fetch(new URL(url, API_BASE_URL), init);\n}\n";
91
+ //#endregion
92
+ //#region src/scaffolding/templates/react-app/src/api/reportError.ts.ejs?raw
93
+ var reportError_ts_default = "import type { ErrorReport } from \"@ostack.tech/ui\";\nimport { apiFetch } from \"./apiFetch.ts\";\n\nconst REPORT_ERROR_API_ENDPOINT = \"<%= reportErrorApiEndpoint %>\";\n\nexport async function reportError(error: ErrorReport) {\n await apiFetch(REPORT_ERROR_API_ENDPOINT, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(error, null, import.meta.env.DEV ? 2 : 0),\n });\n}\n";
94
+ //#endregion
95
+ //#region src/scaffolding/templates/react-app/src/api/submit.ts.ejs?raw
96
+ var submit_ts_default = "import { LocatedValidationWarning } from \"@ostack.tech/kform\";\nimport {\n decode<%= formClass %>SubmitResponseFromString,\n encode<%= formClass %>ToString,\n <%= formClass %>,\n} from \"<%= kmpModuleName %>\";\nimport { apiFetch } from \"./apiFetch.ts\";\n\nconst SUBMIT_API_ENDPOINT = \"<%= submitApiEndpoint %>\";\n\nexport async function submit(\n <%= formVar %>: <%= formClass %>,\n acceptedWarnings?: LocatedValidationWarning[],\n) {\n const params = new URLSearchParams();\n if (acceptedWarnings?.length) {\n const acceptedWarningCodes = new Set(acceptedWarnings.map((w) => w.code));\n params.set(\"acceptedWarnings\", Array.from(acceptedWarningCodes).join());\n }\n\n const response = await apiFetch(`${SUBMIT_API_ENDPOINT}?${params}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"<%= serializationMimeType %>\" },\n body: encode<%= formClass %>ToString(<%= formVar %>, import.meta.env.DEV),\n });\n return decode<%= formClass %>SubmitResponseFromString(await response.text());\n}\n";
97
+ //#endregion
98
+ //#region src/scaffolding/scaffolders/scaffoldApi.ts
99
+ var DEFAULT_API_BASE_PATH = "/api/";
100
+ var DEFAULT_REPORT_ERROR_API_ENDPOINT = "report-error";
101
+ var DEFAULT_SUBMIT_API_ENDPOINT = "submit";
101
102
  function scaffoldApi(schematic, data) {
102
- const ejsData = {
103
- kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
104
- serializationFormat: data.serializationFormat ?? DEFAULT_SERIALIZATION_FORMAT,
105
- serializationMimeType: `application/${data.serializationFormat}`,
106
- formVar: camelCase(schematic.name),
107
- formClass: schematic.name,
108
- apiBasePath: data.apiBasePath ?? DEFAULT_API_BASE_PATH,
109
- reportErrorApiEndpoint: data.reportErrorApiEndpoint ?? DEFAULT_REPORT_ERROR_API_ENDPOINT,
110
- submitApiEndpoint: data.submitApiEndpoint ?? DEFAULT_SUBMIT_API_ENDPOINT
111
- };
112
- addEjsTemplateFile(data, "api/apiFetch.ts", apiFetchTsEjs, ejsData);
113
- addEjsTemplateFile(data, "api/reportError.ts", reportErrorTsEjs, ejsData);
114
- addEjsTemplateFile(data, "api/submit.ts", submitTsEjs, ejsData);
103
+ const ejsData = {
104
+ kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
105
+ serializationFormat: data.serializationFormat ?? "json",
106
+ serializationMimeType: `application/${data.serializationFormat}`,
107
+ formVar: camelCase(schematic.name),
108
+ formClass: schematic.name,
109
+ apiBasePath: data.apiBasePath ?? "/api/",
110
+ reportErrorApiEndpoint: data.reportErrorApiEndpoint ?? "report-error",
111
+ submitApiEndpoint: data.submitApiEndpoint ?? "submit"
112
+ };
113
+ addEjsTemplateFile(data, "api/apiFetch.ts", apiFetch_ts_default, ejsData);
114
+ addEjsTemplateFile(data, "api/reportError.ts", reportError_ts_default, ejsData);
115
+ addEjsTemplateFile(data, "api/submit.ts", submit_ts_default, ejsData);
115
116
  }
116
- const DEFAULT_SCAFFOLD_ISSUE_MESSAGES = true;
117
+ //#endregion
118
+ //#region src/scaffolding/scaffolders/scaffoldIssueMessages.ts
119
+ var DEFAULT_SCAFFOLD_ISSUE_MESSAGES = true;
117
120
  function scaffoldIssueMessages(schematic, data) {
118
- if (!shouldScaffoldIssueMessages(data)) {
119
- return;
120
- }
121
- const fileName = joinPaths(
122
- data.currentDir,
123
- `${schematic.name}IssueMessages.tsx`
124
- );
125
- let file = data.files.get(fileName);
126
- if (!file) {
127
- data.files.set(fileName, file = tsFile());
128
- }
129
- scaffoldIssueMessagesConstant(schematic, {
130
- kmpModuleName: `${kebabCase(data.rootSchematic.name)}-shared`,
131
- ...data,
132
- currentFile: file
133
- });
121
+ if (!shouldScaffoldIssueMessages(data)) return;
122
+ const fileName = joinPaths(data.currentDir, `${schematic.name}IssueMessages.tsx`);
123
+ let file = data.files.get(fileName);
124
+ if (!file) data.files.set(fileName, file = tsFile());
125
+ scaffoldIssueMessagesConstant(schematic, {
126
+ kmpModuleName: `${kebabCase(data.rootSchematic.name)}-shared`,
127
+ ...data,
128
+ currentFile: file
129
+ });
134
130
  }
135
131
  function shouldScaffoldIssueMessages(data) {
136
- return data.scaffoldIssueMessages ?? DEFAULT_SCAFFOLD_ISSUE_MESSAGES;
132
+ return data.scaffoldIssueMessages ?? DEFAULT_SCAFFOLD_ISSUE_MESSAGES;
137
133
  }
138
134
  function scaffoldIssueMessagesConstant(schematic, data) {
139
- data.currentFile.imports.push({
140
- moduleName: "@ostack.tech/ui-kform",
141
- name: "IssueMessagesByCode",
142
- isType: true
143
- });
144
- data.currentFile.declarations.push(code`
135
+ data.currentFile.imports.push({
136
+ moduleName: "@ostack.tech/ui-kform",
137
+ name: "IssueMessagesByCode",
138
+ isType: true
139
+ });
140
+ data.currentFile.declarations.push(code`
145
141
  export const ${constantCase(schematic.name)}_ISSUE_MESSAGES: Record<string, IssueMessagesByCode> = {};
146
142
  `);
147
143
  }
144
+ //#endregion
145
+ //#region src/scaffolding/scaffolders/scaffoldPageComponents.ts
148
146
  function scaffoldPageComponents(schematic, data) {
149
- const layout = reactAppLayout(schematic, {
150
- kmpModuleName: `${kebabCase(schematic.name)}-shared`,
151
- ...data
152
- });
153
- for (const annex of layout) {
154
- for (const formPage of annex.formPages) {
155
- scaffoldPageComponent(formPage.schematic, formPage.data);
156
- if (formPage.data.currentPath !== "/") {
157
- scaffoldIssueMessages(formPage.schematic, formPage.data);
158
- }
159
- }
160
- }
147
+ const layout = reactAppLayout(schematic, {
148
+ kmpModuleName: `${kebabCase(schematic.name)}-shared`,
149
+ ...data
150
+ });
151
+ for (const annex of layout) for (const formPage of annex.formPages) {
152
+ scaffoldPageComponent(formPage.schematic, formPage.data);
153
+ if (formPage.data.currentPath !== "/") scaffoldIssueMessages(formPage.schematic, formPage.data);
154
+ }
161
155
  }
162
156
  function scaffoldPageComponent(schematic, data) {
163
- const fileName = joinPaths(data.currentDir, `${schematic.name}.tsx`);
164
- let file = data.files.get(fileName);
165
- if (!file) {
166
- data.files.set(fileName, file = tsFile());
167
- }
168
- scaffoldPageComponentDeclarations(schematic, {
169
- kmpModuleName: `${kebabCase(data.rootSchematic.name)}-shared`,
170
- ...data,
171
- currentFile: file
172
- });
157
+ const fileName = joinPaths(data.currentDir, `${schematic.name}.tsx`);
158
+ let file = data.files.get(fileName);
159
+ if (!file) data.files.set(fileName, file = tsFile());
160
+ scaffoldPageComponentDeclarations(schematic, {
161
+ kmpModuleName: `${kebabCase(data.rootSchematic.name)}-shared`,
162
+ ...data,
163
+ currentFile: file
164
+ });
173
165
  }
174
166
  function scaffoldPageComponentDeclarations(schematic, data) {
175
- data.currentFile.imports.push({
176
- moduleName: "@ostack.tech/ui",
177
- name: "Grid"
178
- });
179
- data.currentFile.declarations.push(code`
167
+ data.currentFile.imports.push({
168
+ moduleName: "@ostack.tech/ui",
169
+ name: "Grid"
170
+ });
171
+ data.currentFile.declarations.push(code`
180
172
  export function ${schematic.name}() {
181
173
  return (
182
174
  <Grid container>
183
- ${schematic.children.map(
184
- (child) => code`
175
+ ${schematic.children.map((child) => code`
185
176
  <Grid xs={12}>
186
177
  ${scaffoldField(child, {
187
- ...data,
188
- currentPath: child.childName
189
- })}
178
+ ...data,
179
+ currentPath: child.childName
180
+ })}
190
181
  </Grid>
191
- `
192
- ).join("\n\n")}
182
+ `).join("\n\n")}
193
183
  </Grid>
194
184
  );
195
185
  }
196
186
  `);
197
187
  }
198
188
  function scaffoldField(schematic, data) {
199
- const schematicKind = data.schematicKinds.get(
200
- schematic.kind
201
- );
202
- if (!schematicKind) {
203
- throw new Error(`Unknown schematic kind ${schematic.kind}`);
204
- }
205
- if (schematicKind.scaffoldField) {
206
- return schematicKind.scaffoldField?.(schematic, data);
207
- }
208
- data.currentFile.imports.push({
209
- moduleName: "@ostack.tech/ui-kform",
210
- name: "ControlField"
211
- });
212
- let controlModuleName;
213
- let controlName;
214
- if (schematicKind.control) {
215
- const controlSeparator = schematicKind.control.lastIndexOf(".");
216
- controlModuleName = schematicKind.control.slice(0, controlSeparator);
217
- controlName = schematicKind.control.slice(controlSeparator + 1);
218
- data.currentFile.imports.push({
219
- moduleName: controlModuleName,
220
- name: controlName
221
- });
222
- }
223
- let control = schematicKind.scaffoldControl?.(schematic, data);
224
- if (!control) {
225
- if (!data.omitLabel) {
226
- data.currentFile.imports.push({
227
- moduleName: "@ostack.tech/ui",
228
- name: "Label"
229
- });
230
- }
231
- control = [
232
- data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`,
233
- `<${controlName} />`
234
- ].filter((s) => s).join("\n");
235
- }
236
- return code`
189
+ const schematicKind = data.schematicKinds.get(schematic.kind);
190
+ if (!schematicKind) throw new Error(`Unknown schematic kind ${schematic.kind}`);
191
+ if (schematicKind.scaffoldField) return schematicKind.scaffoldField?.(schematic, data);
192
+ data.currentFile.imports.push({
193
+ moduleName: "@ostack.tech/ui-kform",
194
+ name: "ControlField"
195
+ });
196
+ let controlModuleName;
197
+ let controlName;
198
+ if (schematicKind.control) {
199
+ const controlSeparator = schematicKind.control.lastIndexOf(".");
200
+ controlModuleName = schematicKind.control.slice(0, controlSeparator);
201
+ controlName = schematicKind.control.slice(controlSeparator + 1);
202
+ data.currentFile.imports.push({
203
+ moduleName: controlModuleName,
204
+ name: controlName
205
+ });
206
+ }
207
+ let control = schematicKind.scaffoldControl?.(schematic, data);
208
+ if (!control) {
209
+ if (!data.omitLabel) data.currentFile.imports.push({
210
+ moduleName: "@ostack.tech/ui",
211
+ name: "Label"
212
+ });
213
+ control = [data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`, `<${controlName} />`].filter((s) => s).join("\n");
214
+ }
215
+ return code`
237
216
  <ControlField path="${data.currentPath}">
238
217
  ${control}
239
218
  </ControlField>
240
219
  `;
241
220
  }
242
- 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";
243
- 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";
244
- const DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION = true;
221
+ //#endregion
222
+ //#region src/scaffolding/templates/shared/src/commonMain/kotlin/JsonSerializer.kt.ejs?raw
223
+ var JsonSerializer_kt_default = "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";
224
+ //#endregion
225
+ //#region src/scaffolding/templates/shared/src/commonMain/kotlin/XmlSerializer.kt.ejs?raw
226
+ var XmlSerializer_kt_default = "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";
227
+ //#endregion
228
+ //#region src/scaffolding/scaffolders/scaffoldSerializer.ts
229
+ var DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION = true;
245
230
  function scaffoldSerializer(schematic, data) {
246
- const ejsData = {
247
- filePackage: data.currentPackage,
248
- formVar: camelCase(schematic.name),
249
- formClass: schematic.name,
250
- formConstant: constantCase(schematic.name),
251
- includeSerializationFormatVersion: data.includeSerializationFormatVersion ?? DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION
252
- };
253
- addEjsTemplateFile(
254
- data,
255
- `${schematic.name}Serializer.kt`,
256
- data.serializationFormat === "xml" ? xmlSerializerKt : jsonSerializerKt,
257
- ejsData
258
- );
231
+ const ejsData = {
232
+ filePackage: data.currentPackage,
233
+ formVar: camelCase(schematic.name),
234
+ formClass: schematic.name,
235
+ formConstant: constantCase(schematic.name),
236
+ includeSerializationFormatVersion: data.includeSerializationFormatVersion ?? true
237
+ };
238
+ addEjsTemplateFile(data, `${schematic.name}Serializer.kt`, data.serializationFormat === "xml" ? XmlSerializer_kt_default : JsonSerializer_kt_default, ejsData);
259
239
  }
240
+ //#endregion
241
+ //#region src/util/arrayify.ts
260
242
  function arrayify(value) {
261
- return value == null ? [] : Array.isArray(value) ? value : [value];
243
+ return value == null ? [] : Array.isArray(value) ? value : [value];
262
244
  }
263
- const anySchematicKind = {
264
- ...anySchematicKind$1
245
+ //#endregion
246
+ //#region src/SchematicKind.ts
247
+ var anySchematicKind = { ...anySchematicKind$1 };
248
+ var bigDecimalSchematicKind = {
249
+ ...bigDecimalSchematicKind$1,
250
+ control: "@ostack.tech/ui-kform.NumericControl"
265
251
  };
266
- const bigDecimalSchematicKind = {
267
- ...bigDecimalSchematicKind$1,
268
- control: "@ostack.tech/ui-kform.NumericControl"
252
+ var bigIntegerSchematicKind = {
253
+ ...bigIntegerSchematicKind$1,
254
+ control: "@ostack.tech/ui-kform.NumericControl"
269
255
  };
270
- const bigIntegerSchematicKind = {
271
- ...bigIntegerSchematicKind$1,
272
- control: "@ostack.tech/ui-kform.NumericControl"
256
+ var booleanSchematicKind = {
257
+ ...booleanSchematicKind$1,
258
+ control: "@ostack.tech/ui-kform.CheckboxControl",
259
+ scaffoldControl: (schematic, data) => data.omitLabel ? `<CheckboxControl />` : `<CheckboxControl>${sentenceCase(schematic.childName)}</CheckboxControl>`
273
260
  };
274
- const booleanSchematicKind = {
275
- ...booleanSchematicKind$1,
276
- control: "@ostack.tech/ui-kform.CheckboxControl",
277
- scaffoldControl: (schematic, data) => data.omitLabel ? `<CheckboxControl />` : `<CheckboxControl>${sentenceCase(schematic.childName)}</CheckboxControl>`
261
+ var byteSchematicKind = {
262
+ ...byteSchematicKind$1,
263
+ control: "@ostack.tech/ui-kform.NumericControl"
278
264
  };
279
- const byteSchematicKind = {
280
- ...byteSchematicKind$1,
281
- control: "@ostack.tech/ui-kform.NumericControl"
265
+ var classAnnexSchematicKind = {
266
+ ...classSchematicKind$1,
267
+ defaultPackageSuffix: (childName) => `annexes.${childName.toLowerCase()}`,
268
+ kind: "Class (Annex)"
282
269
  };
283
- const classAnnexSchematicKind = {
284
- ...classSchematicKind$1,
285
- defaultPackageSuffix: (childName) => `annexes.${childName.toLowerCase()}`,
286
- kind: "Class (Annex)"
270
+ var classFormPageSchematicKind = {
271
+ ...classSchematicKind$1,
272
+ kind: "Class (FormPage)",
273
+ nullable: false
287
274
  };
288
- const classFormPageSchematicKind = {
289
- ...classSchematicKind$1,
290
- kind: "Class (FormPage)",
291
- nullable: false
292
- };
293
- const classSchematicKind = {
294
- ...classSchematicKind$1,
295
- nullable: false,
296
- scaffoldModel: (schematic, data) => {
297
- const baseModel = classSchematicKind$1.scaffoldModel(schematic, data);
298
- if (data.currentPath !== "/") {
299
- return baseModel;
300
- }
301
- const classAnnotations = [];
302
- let versionProperty = null;
303
- if (data.serializationFormat === "xml") {
304
- data.currentFile.imports.add(
305
- "nl.adaptivity.xmlutil.serialization.XmlSerialName"
306
- );
307
- const namespace = data.xmlNamespace ?? `http://${data.currentPackage.split(".").reverse().join(".")}/schema/${(/* @__PURE__ */ new Date()).getFullYear()}`;
308
- classAnnotations.push(
309
- `@XmlSerialName("${schematic.name}", "${namespace}")`
310
- );
311
- }
312
- if (data.includeSerializationFormatVersion ?? DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION) {
313
- data.currentFile.imports.add("kotlinx.serialization.EncodeDefault").add("kotlinx.serialization.ExperimentalSerializationApi");
314
- const versionAnnotations = [
315
- "@EncodeDefault",
316
- "@OptIn(ExperimentalSerializationApi::class)"
317
- ];
318
- if (data.serializationFormat === "xml") {
319
- data.currentFile.imports.add(
320
- "nl.adaptivity.xmlutil.serialization.XmlElement"
321
- );
322
- versionAnnotations.push("@XmlElement(false)");
323
- } else {
324
- data.currentFile.imports.add("kotlinx.serialization.SerialName");
325
- versionAnnotations.push('@SerialName($$"$version")');
326
- }
327
- versionProperty = annotate(
328
- versionAnnotations,
329
- `internal var version = ${constantCase(schematic.name)}_SERIALIZATION_VERSION`
330
- );
331
- }
332
- return annotate(classAnnotations, baseModel) + (versionProperty ? ` ${code`
275
+ var classSchematicKind = {
276
+ ...classSchematicKind$1,
277
+ nullable: false,
278
+ scaffoldModel: (schematic, data) => {
279
+ const baseModel = classSchematicKind$1.scaffoldModel(schematic, data);
280
+ if (data.currentPath !== "/") return baseModel;
281
+ const classAnnotations = [];
282
+ let versionProperty = null;
283
+ if (data.serializationFormat === "xml") {
284
+ data.currentFile.imports.add("nl.adaptivity.xmlutil.serialization.XmlSerialName");
285
+ const namespace = data.xmlNamespace ?? `http://${data.currentPackage.split(".").reverse().join(".")}/schema/${(/* @__PURE__ */ new Date()).getFullYear()}`;
286
+ classAnnotations.push(`@XmlSerialName("${schematic.name}", "${namespace}")`);
287
+ }
288
+ if (data.includeSerializationFormatVersion ?? true) {
289
+ data.currentFile.imports.add("kotlinx.serialization.EncodeDefault").add("kotlinx.serialization.ExperimentalSerializationApi");
290
+ const versionAnnotations = ["@EncodeDefault", "@OptIn(ExperimentalSerializationApi::class)"];
291
+ if (data.serializationFormat === "xml") {
292
+ data.currentFile.imports.add("nl.adaptivity.xmlutil.serialization.XmlElement");
293
+ versionAnnotations.push("@XmlElement(false)");
294
+ } else {
295
+ data.currentFile.imports.add("kotlinx.serialization.SerialName");
296
+ versionAnnotations.push("@SerialName($$\"$version\")");
297
+ }
298
+ versionProperty = annotate(versionAnnotations, `internal var version = ${constantCase(schematic.name)}_SERIALIZATION_VERSION`);
299
+ }
300
+ return annotate(classAnnotations, baseModel) + (versionProperty ? ` ${code`
333
301
  {
334
302
  ${versionProperty}
335
303
  }
336
304
  `}` : "");
337
- },
338
- scaffoldField: (schematic, data) => {
339
- data.currentFile.imports.push(
340
- { moduleName: "@ostack.tech/ui", name: "FieldGroup" },
341
- { moduleName: "@ostack.tech/ui", name: "FieldGroupHeader" },
342
- { moduleName: "@ostack.tech/ui", name: "FieldGroupTitle" },
343
- { moduleName: "@ostack.tech/ui", name: "FieldGroupBody" },
344
- { moduleName: "@ostack.tech/ui", name: "Grid" }
345
- );
346
- return code`
305
+ },
306
+ scaffoldField: (schematic, data) => {
307
+ data.currentFile.imports.push({
308
+ moduleName: "@ostack.tech/ui",
309
+ name: "FieldGroup"
310
+ }, {
311
+ moduleName: "@ostack.tech/ui",
312
+ name: "FieldGroupHeader"
313
+ }, {
314
+ moduleName: "@ostack.tech/ui",
315
+ name: "FieldGroupTitle"
316
+ }, {
317
+ moduleName: "@ostack.tech/ui",
318
+ name: "FieldGroupBody"
319
+ }, {
320
+ moduleName: "@ostack.tech/ui",
321
+ name: "Grid"
322
+ });
323
+ return code`
347
324
  <FieldGroup>
348
325
  <FieldGroupHeader>
349
326
  <FieldGroupTitle>${capitalCase(schematic.name)}</FieldGroupTitle>
@@ -351,291 +328,236 @@ const classSchematicKind = {
351
328
 
352
329
  <FieldGroupBody>
353
330
  <Grid container>
354
- ${schematic.children.map(
355
- (child) => code`
331
+ ${schematic.children.map((child) => code`
356
332
  <Grid xs={12}>
357
333
  ${scaffoldField(child, {
358
- ...data,
359
- currentPath: joinPaths(
360
- data.currentPath,
361
- child.childName
362
- )
363
- })}
334
+ ...data,
335
+ currentPath: joinPaths(data.currentPath, child.childName)
336
+ })}
364
337
  </Grid>
365
- `
366
- ).join("\n\n")}
338
+ `).join("\n\n")}
367
339
  </Grid>
368
340
  </FieldGroupBody>
369
341
  </FieldGroup>
370
342
  `;
371
- }
343
+ }
372
344
  };
373
- const doubleSchematicKind = {
374
- ...doubleSchematicKind$1,
375
- control: "@ostack.tech/ui-kform.NumericControl"
345
+ var doubleSchematicKind = {
346
+ ...doubleSchematicKind$1,
347
+ control: "@ostack.tech/ui-kform.NumericControl"
376
348
  };
377
- const enumSchematicKind = {
378
- ...enumSchematicKind$1,
379
- kind: "Enum",
380
- internal: true,
381
- nullable: false
349
+ var enumSchematicKind = {
350
+ ...enumSchematicKind$1,
351
+ kind: "Enum",
352
+ internal: true,
353
+ nullable: false
382
354
  };
383
- const enumSelectSchematicKind = {
384
- ...enumSchematicKind$1,
385
- kind: "Enum (Select)",
386
- control: "@ostack.tech/ui-kform.SelectControl",
387
- scaffoldControl: (schematic, data) => {
388
- if (!data.omitLabel) {
389
- data.currentFile.imports.push({
390
- moduleName: "@ostack.tech/ui",
391
- name: "Label"
392
- });
393
- }
394
- data.currentFile.imports.push({
395
- moduleName: data.kmpModuleName,
396
- name: schematic.name
397
- });
398
- return [
399
- data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`,
400
- code`
355
+ var enumSelectSchematicKind = {
356
+ ...enumSchematicKind$1,
357
+ kind: "Enum (Select)",
358
+ control: "@ostack.tech/ui-kform.SelectControl",
359
+ scaffoldControl: (schematic, data) => {
360
+ if (!data.omitLabel) data.currentFile.imports.push({
361
+ moduleName: "@ostack.tech/ui",
362
+ name: "Label"
363
+ });
364
+ data.currentFile.imports.push({
365
+ moduleName: data.kmpModuleName,
366
+ name: schematic.name
367
+ });
368
+ return [data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`, code`
401
369
  <SelectControl
402
370
  options={[
403
- ${schematic.children.map(
404
- (child) => `{ value: ${schematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`
405
- ).join(",\n")}
371
+ ${schematic.children.map((child) => `{ value: ${schematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`).join(",\n")}
406
372
  ]}
407
373
  />
408
- `
409
- ].filter((s) => s).join("\n");
410
- }
374
+ `].filter((s) => s).join("\n");
375
+ }
411
376
  };
412
- const enumRadioGroupSchematicKind = {
413
- ...enumSchematicKind$1,
414
- kind: "Enum (RadioGroup)",
415
- control: "@ostack.tech/ui-kform.RadioGroupControl",
416
- scaffoldControl: (schematic, data) => {
417
- if (!data.omitLabel) {
418
- data.currentFile.imports.push({
419
- moduleName: "@ostack.tech/ui",
420
- name: "Label"
421
- });
422
- }
423
- data.currentFile.imports.push({
424
- moduleName: data.kmpModuleName,
425
- name: schematic.name
426
- });
427
- return [
428
- data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`,
429
- code`
377
+ var enumRadioGroupSchematicKind = {
378
+ ...enumSchematicKind$1,
379
+ kind: "Enum (RadioGroup)",
380
+ control: "@ostack.tech/ui-kform.RadioGroupControl",
381
+ scaffoldControl: (schematic, data) => {
382
+ if (!data.omitLabel) data.currentFile.imports.push({
383
+ moduleName: "@ostack.tech/ui",
384
+ name: "Label"
385
+ });
386
+ data.currentFile.imports.push({
387
+ moduleName: data.kmpModuleName,
388
+ name: schematic.name
389
+ });
390
+ return [data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`, code`
430
391
  <RadioGroupControl
431
392
  options={[
432
- ${schematic.children.map(
433
- (child) => `{ value: ${schematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`
434
- ).join(",\n")}
393
+ ${schematic.children.map((child) => `{ value: ${schematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`).join(",\n")}
435
394
  ]}
436
395
  />
437
- `
438
- ].filter((s) => s).join("\n");
439
- }
396
+ `].filter((s) => s).join("\n");
397
+ }
440
398
  };
441
- const fileSchematicKind = {
442
- ...fileSchematicKind$1,
443
- nullable: true,
444
- control: "@ostack.tech/ui-kform.FileControl"
399
+ var fileSchematicKind = {
400
+ ...fileSchematicKind$1,
401
+ nullable: true,
402
+ control: "@ostack.tech/ui-kform.FileControl"
445
403
  };
446
- const floatSchematicKind = {
447
- ...floatSchematicKind$1,
448
- control: "@ostack.tech/ui-kform.NumericControl"
404
+ var floatSchematicKind = {
405
+ ...floatSchematicKind$1,
406
+ control: "@ostack.tech/ui-kform.NumericControl"
449
407
  };
450
- const intSchematicKind = {
451
- ...intSchematicKind$1,
452
- control: "@ostack.tech/ui-kform.NumericControl"
408
+ var intSchematicKind = {
409
+ ...intSchematicKind$1,
410
+ control: "@ostack.tech/ui-kform.NumericControl"
453
411
  };
454
- const listCheckboxGroupSchematicKind = {
455
- ...listSchematicKind,
456
- kind: "List<Enum> (CheckboxGroup)",
457
- nullable: false,
458
- initChildren: (childName) => [
459
- createSchematic({
460
- kind: "Enum",
461
- name: pascalCase(childName),
462
- nullable: false,
463
- children: []
464
- })
465
- ],
466
- builder: ListableBuilderWithoutKindSelect,
467
- control: "@ostack.tech/ui-kform.CheckboxGroupControl",
468
- scaffoldControl: (schematic, data) => {
469
- const childSchematic = schematic.children[0];
470
- if (childSchematic.kind !== "Enum") {
471
- throw new Error("Invalid child kind.");
472
- }
473
- if (!data.omitLabel) {
474
- data.currentFile.imports.push({
475
- moduleName: "@ostack.tech/ui",
476
- name: "Label"
477
- });
478
- }
479
- data.currentFile.imports.push({
480
- moduleName: data.kmpModuleName,
481
- name: childSchematic.name
482
- });
483
- return [
484
- data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`,
485
- code`
412
+ var listCheckboxGroupSchematicKind = {
413
+ ...listSchematicKind,
414
+ kind: "List<Enum> (CheckboxGroup)",
415
+ nullable: false,
416
+ initChildren: (childName) => [createSchematic({
417
+ kind: "Enum",
418
+ name: pascalCase(childName),
419
+ nullable: false,
420
+ children: []
421
+ })],
422
+ builder: ListableBuilderWithoutKindSelect,
423
+ control: "@ostack.tech/ui-kform.CheckboxGroupControl",
424
+ scaffoldControl: (schematic, data) => {
425
+ const childSchematic = schematic.children[0];
426
+ if (childSchematic.kind !== "Enum") throw new Error("Invalid child kind.");
427
+ if (!data.omitLabel) data.currentFile.imports.push({
428
+ moduleName: "@ostack.tech/ui",
429
+ name: "Label"
430
+ });
431
+ data.currentFile.imports.push({
432
+ moduleName: data.kmpModuleName,
433
+ name: childSchematic.name
434
+ });
435
+ return [data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`, code`
486
436
  <CheckboxGroupControl
487
437
  options={[
488
- ${childSchematic.children.map(
489
- (child) => `{ value: ${childSchematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`
490
- ).join(",\n")}
438
+ ${childSchematic.children.map((child) => `{ value: ${childSchematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`).join(",\n")}
491
439
  ]}
492
440
  />
493
- `
494
- ].filter((s) => s).join("\n");
495
- }
441
+ `].filter((s) => s).join("\n");
442
+ }
496
443
  };
497
- const listSelectMultipleSchematicKind = {
498
- ...listSchematicKind,
499
- kind: "List<Enum> (SelectMultiple)",
500
- nullable: false,
501
- initChildren: (childName) => [
502
- createSchematic({
503
- kind: "Enum",
504
- name: pascalCase(childName),
505
- nullable: false,
506
- children: []
507
- })
508
- ],
509
- builder: ListableBuilderWithoutKindSelect,
510
- control: "@ostack.tech/ui-kform.SelectMultipleControl",
511
- scaffoldControl: (schematic, data) => {
512
- const childSchematic = schematic.children[0];
513
- if (childSchematic.kind !== "Enum") {
514
- throw new Error("Invalid child kind.");
515
- }
516
- if (!data.omitLabel) {
517
- data.currentFile.imports.push({
518
- moduleName: "@ostack.tech/ui",
519
- name: "Label"
520
- });
521
- }
522
- data.currentFile.imports.push({
523
- moduleName: data.kmpModuleName,
524
- name: childSchematic.name
525
- });
526
- return [
527
- data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`,
528
- code`
444
+ var listSelectMultipleSchematicKind = {
445
+ ...listSchematicKind,
446
+ kind: "List<Enum> (SelectMultiple)",
447
+ nullable: false,
448
+ initChildren: (childName) => [createSchematic({
449
+ kind: "Enum",
450
+ name: pascalCase(childName),
451
+ nullable: false,
452
+ children: []
453
+ })],
454
+ builder: ListableBuilderWithoutKindSelect,
455
+ control: "@ostack.tech/ui-kform.SelectMultipleControl",
456
+ scaffoldControl: (schematic, data) => {
457
+ const childSchematic = schematic.children[0];
458
+ if (childSchematic.kind !== "Enum") throw new Error("Invalid child kind.");
459
+ if (!data.omitLabel) data.currentFile.imports.push({
460
+ moduleName: "@ostack.tech/ui",
461
+ name: "Label"
462
+ });
463
+ data.currentFile.imports.push({
464
+ moduleName: data.kmpModuleName,
465
+ name: childSchematic.name
466
+ });
467
+ return [data.omitLabel ? null : `<Label>${sentenceCase(schematic.childName)}</Label>`, code`
529
468
  <SelectMultipleControl
530
469
  options={[
531
- ${childSchematic.children.map(
532
- (child) => `{ value: ${childSchematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`
533
- ).join(",\n")}
470
+ ${childSchematic.children.map((child) => `{ value: ${childSchematic.name}.${child.childName}, text: ${JSON.stringify(sentenceCase(child.childName))} }`).join(",\n")}
534
471
  ]}
535
472
  />
536
- `
537
- ].filter((s) => s).join("\n");
538
- }
473
+ `].filter((s) => s).join("\n");
474
+ }
539
475
  };
540
- const localDateSchematicKind = {
541
- ...localDateSchematicKind$1,
542
- nullable: true,
543
- control: "@ostack.tech/ui-kform.DateControl"
476
+ var localDateSchematicKind = {
477
+ ...localDateSchematicKind$1,
478
+ nullable: true,
479
+ control: "@ostack.tech/ui-kform.DateControl"
544
480
  };
545
- const longSchematicKind = {
546
- ...longSchematicKind$1,
547
- control: "@ostack.tech/ui-kform.NumericControl"
481
+ var longSchematicKind = {
482
+ ...longSchematicKind$1,
483
+ control: "@ostack.tech/ui-kform.NumericControl"
548
484
  };
549
- const shortSchematicKind = {
550
- ...shortSchematicKind$1,
551
- control: "@ostack.tech/ui-kform.NumericControl"
485
+ var shortSchematicKind = {
486
+ ...shortSchematicKind$1,
487
+ control: "@ostack.tech/ui-kform.NumericControl"
552
488
  };
553
- const stringSchematicKind = {
554
- ...stringSchematicKind$1,
555
- control: "@ostack.tech/ui-kform.TextControl"
489
+ var stringSchematicKind = {
490
+ ...stringSchematicKind$1,
491
+ control: "@ostack.tech/ui-kform.TextControl"
556
492
  };
557
- const tableAnnexesSchematicKind = {
558
- ...tableSchematicKind$1,
559
- kind: "Table (Annexes)",
560
- nullable: false,
561
- builder: ListableBuilderWithoutKindSelect,
562
- initChildren: (childName) => [
563
- createSchematic({
564
- kind: "Class (Annex)",
565
- packageSuffix: `annexes.${childName.toLowerCase()}`,
566
- name: pascalCase(childName),
567
- nullable: false,
568
- children: []
569
- })
570
- ],
571
- propertyAnnotations: (schematic, data) => {
572
- const annotations = arrayify(
573
- typeof tableSchematicKind$1.propertyAnnotations === "function" ? tableSchematicKind$1.propertyAnnotations?.(schematic, data) : tableSchematicKind$1.propertyAnnotations
574
- );
575
- if (data.serializationFormat === "xml") {
576
- data.currentFile.imports.add(
577
- "nl.adaptivity.xmlutil.serialization.XmlChildrenName"
578
- );
579
- annotations.push(
580
- `@XmlChildrenName("${camelCase(schematic.children[0].name)}")`
581
- );
582
- }
583
- return annotations;
584
- }
493
+ var tableAnnexesSchematicKind = {
494
+ ...tableSchematicKind$1,
495
+ kind: "Table (Annexes)",
496
+ nullable: false,
497
+ builder: ListableBuilderWithoutKindSelect,
498
+ initChildren: (childName) => [createSchematic({
499
+ kind: "Class (Annex)",
500
+ packageSuffix: `annexes.${childName.toLowerCase()}`,
501
+ name: pascalCase(childName),
502
+ nullable: false,
503
+ children: []
504
+ })],
505
+ propertyAnnotations: (schematic, data) => {
506
+ const annotations = arrayify(typeof tableSchematicKind$1.propertyAnnotations === "function" ? tableSchematicKind$1.propertyAnnotations?.(schematic, data) : tableSchematicKind$1.propertyAnnotations);
507
+ if (data.serializationFormat === "xml") {
508
+ data.currentFile.imports.add("nl.adaptivity.xmlutil.serialization.XmlChildrenName");
509
+ annotations.push(`@XmlChildrenName("${camelCase(schematic.children[0].name)}")`);
510
+ }
511
+ return annotations;
512
+ }
585
513
  };
586
- const tableSchematicKind = {
587
- ...tableSchematicKind$1,
588
- nullable: false,
589
- builder: ListableBuilderWithoutKindSelect,
590
- initChildren: (childName) => [
591
- createSchematic({
592
- kind: "Class",
593
- name: `${pascalCase(childName)}Row`,
594
- nullable: false,
595
- children: []
596
- })
597
- ],
598
- propertyAnnotations: tableAnnexesSchematicKind.propertyAnnotations,
599
- control: "@ostack.tech/ui-kform.TableControl",
600
- scaffoldControl: (schematic, data) => {
601
- const rowSchematic = schematic.children[0];
602
- if (rowSchematic.kind !== "Class") {
603
- throw new Error("Table child schematic is not of Class kind.");
604
- }
605
- data.currentFile.imports.push(
606
- { moduleName: "@ostack.tech/ui", name: "Label" },
607
- {
608
- moduleName: "@ostack.tech/ui-kform",
609
- name: "tableControlIndexColumn"
610
- },
611
- {
612
- moduleName: "@ostack.tech/ui-kform",
613
- name: "tableControlActionsColumn"
614
- },
615
- {
616
- moduleName: "@ostack.tech/ui-kform",
617
- name: "TableControlAddRowTrigger"
618
- },
619
- { moduleName: "@ostack.tech/ui-kform", name: "TableControlContent" }
620
- );
621
- return code`
514
+ var tableSchematicKind = {
515
+ ...tableSchematicKind$1,
516
+ nullable: false,
517
+ builder: ListableBuilderWithoutKindSelect,
518
+ initChildren: (childName) => [createSchematic({
519
+ kind: "Class",
520
+ name: `${pascalCase(childName)}Row`,
521
+ nullable: false,
522
+ children: []
523
+ })],
524
+ propertyAnnotations: tableAnnexesSchematicKind.propertyAnnotations,
525
+ control: "@ostack.tech/ui-kform.TableControl",
526
+ scaffoldControl: (schematic, data) => {
527
+ const rowSchematic = schematic.children[0];
528
+ if (rowSchematic.kind !== "Class") throw new Error("Table child schematic is not of Class kind.");
529
+ data.currentFile.imports.push({
530
+ moduleName: "@ostack.tech/ui",
531
+ name: "Label"
532
+ }, {
533
+ moduleName: "@ostack.tech/ui-kform",
534
+ name: "tableControlIndexColumn"
535
+ }, {
536
+ moduleName: "@ostack.tech/ui-kform",
537
+ name: "tableControlActionsColumn"
538
+ }, {
539
+ moduleName: "@ostack.tech/ui-kform",
540
+ name: "TableControlAddRowTrigger"
541
+ }, {
542
+ moduleName: "@ostack.tech/ui-kform",
543
+ name: "TableControlContent"
544
+ });
545
+ return code`
622
546
  <TableControl
623
547
  columns={[
624
548
  tableControlIndexColumn(),
625
- ${rowSchematic.children.map(
626
- (child) => code`
549
+ ${rowSchematic.children.map((child) => code`
627
550
  {
628
551
  label: ${JSON.stringify(sentenceCase(child.childName))},
629
552
  render: () => (
630
553
  ${scaffoldField(child, {
631
- ...data,
632
- omitLabel: true,
633
- currentPath: child.childName
634
- })}
554
+ ...data,
555
+ omitLabel: true,
556
+ currentPath: child.childName
557
+ })}
635
558
  )
636
559
  }
637
- `
638
- ).join(",\n")},
560
+ `).join(",\n")},
639
561
  tableControlActionsColumn()
640
562
  ]}
641
563
  >
@@ -644,162 +566,138 @@ const tableSchematicKind = {
644
566
  <TableControlContent />
645
567
  </TableControl>
646
568
  `;
647
- }
569
+ }
648
570
  };
649
- const defaultSchematicKinds = [
650
- anySchematicKind,
651
- bigDecimalSchematicKind,
652
- bigIntegerSchematicKind,
653
- booleanSchematicKind,
654
- byteSchematicKind,
655
- classSchematicKind,
656
- classAnnexSchematicKind,
657
- classFormPageSchematicKind,
658
- doubleSchematicKind,
659
- enumSchematicKind,
660
- enumSelectSchematicKind,
661
- enumRadioGroupSchematicKind,
662
- fileSchematicKind,
663
- floatSchematicKind,
664
- intSchematicKind,
665
- listCheckboxGroupSchematicKind,
666
- listSelectMultipleSchematicKind,
667
- localDateSchematicKind,
668
- longSchematicKind,
669
- shortSchematicKind,
670
- stringSchematicKind,
671
- tableAnnexesSchematicKind,
672
- tableSchematicKind
571
+ var defaultSchematicKinds = [
572
+ anySchematicKind,
573
+ bigDecimalSchematicKind,
574
+ bigIntegerSchematicKind,
575
+ booleanSchematicKind,
576
+ byteSchematicKind,
577
+ classSchematicKind,
578
+ classAnnexSchematicKind,
579
+ classFormPageSchematicKind,
580
+ doubleSchematicKind,
581
+ enumSchematicKind,
582
+ enumSelectSchematicKind,
583
+ enumRadioGroupSchematicKind,
584
+ fileSchematicKind,
585
+ floatSchematicKind,
586
+ intSchematicKind,
587
+ listCheckboxGroupSchematicKind,
588
+ listSelectMultipleSchematicKind,
589
+ localDateSchematicKind,
590
+ longSchematicKind,
591
+ shortSchematicKind,
592
+ stringSchematicKind,
593
+ tableAnnexesSchematicKind,
594
+ tableSchematicKind
673
595
  ];
596
+ //#endregion
597
+ //#region src/scaffolding/reactApp/util/reactAppLayout.ts
674
598
  function reactAppLayout(schematic, data) {
675
- const annexes = [];
676
- if (schematic.children?.every(
677
- (child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind
678
- )) {
679
- for (const annex of schematic.children) {
680
- if (annex.kind === classAnnexSchematicKind.kind) {
681
- annexes.push(
682
- layoutAnnex(annex, {
683
- ...data,
684
- currentPath: joinPaths(data.currentPath, annex.childName),
685
- currentDir: joinPaths(
686
- data.currentDir,
687
- annex.packageSuffix?.replaceAll(".", "/")
688
- )
689
- })
690
- );
691
- } else {
692
- annexes.push(
693
- layoutRepetitiveAnnex(annex, {
694
- ...data,
695
- currentPath: joinPaths(data.currentPath, annex.childName)
696
- })
697
- );
698
- }
699
- }
700
- } else if (schematic.children?.every(
701
- (child) => child.kind === classFormPageSchematicKind.kind
702
- )) {
703
- annexes.push(layoutAnnex(schematic, data));
704
- } else if (schematic.children?.some(
705
- (child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind || child.kind === classFormPageSchematicKind.kind
706
- )) {
707
- throw new Error(
708
- "Annexes/form pages cannot be mixed with other kinds of fields."
709
- );
710
- } else {
711
- annexes.push(layoutAnnex(schematic, data));
712
- }
713
- return annexes;
599
+ const annexes = [];
600
+ if (schematic.children?.every((child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind)) for (const annex of schematic.children) if (annex.kind === classAnnexSchematicKind.kind) annexes.push(layoutAnnex(annex, {
601
+ ...data,
602
+ currentPath: joinPaths(data.currentPath, annex.childName),
603
+ currentDir: joinPaths(data.currentDir, annex.packageSuffix?.replaceAll(".", "/"))
604
+ }));
605
+ else annexes.push(layoutRepetitiveAnnex(annex, {
606
+ ...data,
607
+ currentPath: joinPaths(data.currentPath, annex.childName)
608
+ }));
609
+ else if (schematic.children?.every((child) => child.kind === classFormPageSchematicKind.kind)) annexes.push(layoutAnnex(schematic, data));
610
+ else if (schematic.children?.some((child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind || child.kind === classFormPageSchematicKind.kind)) throw new Error("Annexes/form pages cannot be mixed with other kinds of fields.");
611
+ else annexes.push(layoutAnnex(schematic, data));
612
+ return annexes;
714
613
  }
715
614
  function layoutRepetitiveAnnex(schematic, data) {
716
- const childSchematic = schematic.children[0];
717
- return layoutAnnex(childSchematic, {
718
- ...data,
719
- currentPath: joinPaths(data.currentPath, "*"),
720
- currentDir: joinPaths(
721
- data.currentDir,
722
- childSchematic.packageSuffix?.replaceAll(".", "/")
723
- )
724
- });
615
+ const childSchematic = schematic.children[0];
616
+ return layoutAnnex(childSchematic, {
617
+ ...data,
618
+ currentPath: joinPaths(data.currentPath, "*"),
619
+ currentDir: joinPaths(data.currentDir, childSchematic.packageSuffix?.replaceAll(".", "/"))
620
+ });
725
621
  }
726
622
  function layoutAnnex(schematic, data) {
727
- if (schematic.children?.some(
728
- (child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind
729
- )) {
730
- throw new Error(
731
- "Annexes must only appear at the top level of the schematic."
732
- );
733
- }
734
- let formPages;
735
- if (schematic.children?.every(
736
- (child) => child.kind === classFormPageSchematicKind.kind
737
- )) {
738
- formPages = schematic.children?.map((formPage) => ({
739
- schematic: formPage,
740
- data: {
741
- ...data,
742
- currentPath: joinPaths(
743
- data.currentPath,
744
- camelCase(formPage.childName)
745
- ),
746
- currentDir: joinPaths(
747
- data.currentDir,
748
- formPage.packageSuffix?.replaceAll(".", "/")
749
- )
750
- }
751
- }));
752
- } else if (schematic.children?.some(
753
- (child) => child.kind === classFormPageSchematicKind.kind
754
- )) {
755
- throw new Error("Form pages cannot be mixed with other kinds of fields.");
756
- } else {
757
- formPages = [{ schematic, data }];
758
- }
759
- return { schematic, data, formPages };
623
+ if (schematic.children?.some((child) => child.kind === classAnnexSchematicKind.kind || child.kind === tableAnnexesSchematicKind.kind)) throw new Error("Annexes must only appear at the top level of the schematic.");
624
+ let formPages;
625
+ if (schematic.children?.every((child) => child.kind === classFormPageSchematicKind.kind)) formPages = schematic.children?.map((formPage) => ({
626
+ schematic: formPage,
627
+ data: {
628
+ ...data,
629
+ currentPath: joinPaths(data.currentPath, camelCase(formPage.childName)),
630
+ currentDir: joinPaths(data.currentDir, formPage.packageSuffix?.replaceAll(".", "/"))
631
+ }
632
+ }));
633
+ else if (schematic.children?.some((child) => child.kind === classFormPageSchematicKind.kind)) throw new Error("Form pages cannot be mixed with other kinds of fields.");
634
+ else formPages = [{
635
+ schematic,
636
+ data
637
+ }];
638
+ return {
639
+ schematic,
640
+ data,
641
+ formPages
642
+ };
760
643
  }
761
- const DEFAULT_ACTIVE_PATH_SEARCH_PARAM = "page";
644
+ //#endregion
645
+ //#region src/scaffolding/scaffolders/scaffoldAppComponent.ts
646
+ var DEFAULT_ACTIVE_PATH_SEARCH_PARAM = "page";
762
647
  function scaffoldAppComponent(schematic, data) {
763
- const fileName = joinPaths(data.currentDir, `${schematic.name}App.tsx`);
764
- let file = data.files.get(fileName);
765
- if (!file) {
766
- data.files.set(fileName, file = tsFile());
767
- }
768
- scaffoldAppComponentFile(schematic, {
769
- kmpModuleName: `${kebabCase(schematic.name)}-shared`,
770
- ...data,
771
- currentFile: file
772
- });
773
- scaffoldIssueMessages(schematic, data);
648
+ const fileName = joinPaths(data.currentDir, `${schematic.name}App.tsx`);
649
+ let file = data.files.get(fileName);
650
+ if (!file) data.files.set(fileName, file = tsFile());
651
+ scaffoldAppComponentFile(schematic, {
652
+ kmpModuleName: `${kebabCase(schematic.name)}-shared`,
653
+ ...data,
654
+ currentFile: file
655
+ });
656
+ scaffoldIssueMessages(schematic, data);
774
657
  }
775
658
  function scaffoldAppComponentFile(schematic, data) {
776
- const localeVar = (data.defaultLocale ?? DEFAULT_LOCALE).replaceAll("-", "");
777
- const activePathSearchParam = data.activePathSearchParam ?? DEFAULT_ACTIVE_PATH_SEARCH_PARAM;
778
- data.currentFile.imports.push(
779
- { moduleName: "@ostack.tech/kform", name: "ktMapToObject" },
780
- { moduleName: "@ostack.tech/ui", name: "useSearchParam" },
781
- { moduleName: "@ostack.tech/ui-kform", name: "FormApp" },
782
- { moduleName: "@ostack.tech/ui-kform", name: localeVar },
783
- { moduleName: "@ostack.tech/ui-kform", name: "IssuesPanel" },
784
- { moduleName: "react", name: "useMemo" },
785
- { moduleName: data.kmpModuleName, name: `${schematic.name}FormMode` },
786
- { moduleName: data.kmpModuleName, name: `${schematic.name}Schema` },
787
- { moduleName: `./api/reportError.ts`, name: "reportError" },
788
- {
789
- moduleName: `./${schematic.name}Context.ts`,
790
- name: `use${schematic.name}Context`
791
- }
792
- );
793
- let issueMessagesProp = "";
794
- if (shouldScaffoldIssueMessages(data)) {
795
- data.currentFile.imports.push({
796
- moduleName: `./${schematic.name}IssueMessages.tsx`,
797
- name: `${constantCase(schematic.name)}_ISSUE_MESSAGES`
798
- });
799
- issueMessagesProp = `
800
- issueMessages={${constantCase(schematic.name)}_ISSUE_MESSAGES}`;
801
- }
802
- data.currentFile.declarations.push(code`
659
+ const localeVar = (data.defaultLocale ?? "en-US").replaceAll("-", "");
660
+ const activePathSearchParam = data.activePathSearchParam ?? "page";
661
+ data.currentFile.imports.push({
662
+ moduleName: "@ostack.tech/kform",
663
+ name: "ktMapToObject"
664
+ }, {
665
+ moduleName: "@ostack.tech/ui",
666
+ name: "useSearchParam"
667
+ }, {
668
+ moduleName: "@ostack.tech/ui-kform",
669
+ name: "FormApp"
670
+ }, {
671
+ moduleName: "@ostack.tech/ui-kform",
672
+ name: localeVar
673
+ }, {
674
+ moduleName: "@ostack.tech/ui-kform",
675
+ name: "IssuesPanel"
676
+ }, {
677
+ moduleName: "react",
678
+ name: "useMemo"
679
+ }, {
680
+ moduleName: data.kmpModuleName,
681
+ name: `${schematic.name}FormMode`
682
+ }, {
683
+ moduleName: data.kmpModuleName,
684
+ name: `${schematic.name}Schema`
685
+ }, {
686
+ moduleName: `./api/reportError.ts`,
687
+ name: "reportError"
688
+ }, {
689
+ moduleName: `./${schematic.name}Context.ts`,
690
+ name: `use${schematic.name}Context`
691
+ });
692
+ let issueMessagesProp = "";
693
+ if (shouldScaffoldIssueMessages(data)) {
694
+ data.currentFile.imports.push({
695
+ moduleName: `./${schematic.name}IssueMessages.tsx`,
696
+ name: `${constantCase(schematic.name)}_ISSUE_MESSAGES`
697
+ });
698
+ issueMessagesProp = `\nissueMessages={${constantCase(schematic.name)}_ISSUE_MESSAGES}`;
699
+ }
700
+ data.currentFile.declarations.push(code`
803
701
  export function ${schematic.name}App() {
804
702
  const { externalContexts } = use${schematic.name}Context();
805
703
  const [activePath, setActivePath] = useSearchParam("${activePathSearchParam}");
@@ -837,19 +735,20 @@ issueMessages={${constantCase(schematic.name)}_ISSUE_MESSAGES}`;
837
735
  `);
838
736
  }
839
737
  function scaffoldAppLayout(schematic, data, scaffoldTopBarFn = scaffoldTopBar) {
840
- const layout = reactAppLayout(schematic, data);
841
- if (layout.length === 1 && layout[0].data.currentPath === "/") {
842
- return code`
738
+ const layout = reactAppLayout(schematic, data);
739
+ if (layout.length === 1 && layout[0].data.currentPath === "/") return code`
843
740
  ${scaffoldTopBarFn(data)}
844
741
 
845
742
  ${scaffoldFormPages(data, layout[0])}
846
743
  `;
847
- }
848
- data.currentFile.imports.push(
849
- { moduleName: "@ostack.tech/ui-kform", name: "Annexes" },
850
- { moduleName: "@ostack.tech/ui-kform", name: "AnnexesManager" }
851
- );
852
- return code`
744
+ data.currentFile.imports.push({
745
+ moduleName: "@ostack.tech/ui-kform",
746
+ name: "Annexes"
747
+ }, {
748
+ moduleName: "@ostack.tech/ui-kform",
749
+ name: "AnnexesManager"
750
+ });
751
+ return code`
853
752
  <Annexes>
854
753
  ${scaffoldTopBarFn(data, "<AnnexesManager />")}
855
754
 
@@ -858,18 +757,27 @@ function scaffoldAppLayout(schematic, data, scaffoldTopBarFn = scaffoldTopBar) {
858
757
  `;
859
758
  }
860
759
  function scaffoldTopBar(data, annexesManager) {
861
- data.currentFile.imports.push(
862
- { moduleName: "@ostack.tech/ui-kform", name: "TopBar" },
863
- { moduleName: "@ostack.tech/ui-kform", name: "TopBarActions" },
864
- { moduleName: "./actions/Load.tsx", name: "Load" },
865
- { moduleName: "./actions/Save.tsx", name: "Save" },
866
- { moduleName: "./actions/Validate.tsx", name: "Validate" },
867
- { moduleName: "./actions/Submit.tsx", name: "Submit" }
868
- );
869
- return code`
870
- <TopBar>${annexesManager ? `
871
- ${annexesManager}
872
- ` : ""}
760
+ data.currentFile.imports.push({
761
+ moduleName: "@ostack.tech/ui-kform",
762
+ name: "TopBar"
763
+ }, {
764
+ moduleName: "@ostack.tech/ui-kform",
765
+ name: "TopBarActions"
766
+ }, {
767
+ moduleName: "./actions/Load.tsx",
768
+ name: "Load"
769
+ }, {
770
+ moduleName: "./actions/Save.tsx",
771
+ name: "Save"
772
+ }, {
773
+ moduleName: "./actions/Validate.tsx",
774
+ name: "Validate"
775
+ }, {
776
+ moduleName: "./actions/Submit.tsx",
777
+ name: "Submit"
778
+ });
779
+ return code`
780
+ <TopBar>${annexesManager ? `\n ${annexesManager}\n` : ""}
873
781
  <TopBarActions>
874
782
  <Load />
875
783
  <Save />
@@ -880,555 +788,185 @@ function scaffoldTopBar(data, annexesManager) {
880
788
  `;
881
789
  }
882
790
  function scaffoldAnnex(data, annex) {
883
- data.currentFile.imports.push({
884
- moduleName: "@ostack.tech/ui-kform",
885
- name: "Annex"
886
- });
887
- return code`
791
+ data.currentFile.imports.push({
792
+ moduleName: "@ostack.tech/ui-kform",
793
+ name: "Annex"
794
+ });
795
+ return code`
888
796
  <Annex path="${annex.data.currentPath}" title="${sentenceCase(annex.schematic.name)}"${annex.formPages.length === 1 && annex.schematic === annex.formPages[0].schematic ? " documentTitle={null}" : ""}>
889
797
  ${scaffoldFormPages(data, annex)}
890
798
  </Annex>
891
799
  `;
892
800
  }
893
801
  function scaffoldFormPages(data, annex) {
894
- data.currentFile.imports.push({
895
- moduleName: "@ostack.tech/ui-kform",
896
- name: "FormPages"
897
- });
898
- let formPagesNavigation = "";
899
- if (annex.formPages.length > 1) {
900
- data.currentFile.imports.push({
901
- moduleName: "@ostack.tech/ui-kform",
902
- name: "FormPagesNavigation"
903
- });
904
- formPagesNavigation = "\n <FormPagesNavigation />\n";
905
- }
906
- return code`
802
+ data.currentFile.imports.push({
803
+ moduleName: "@ostack.tech/ui-kform",
804
+ name: "FormPages"
805
+ });
806
+ let formPagesNavigation = "";
807
+ if (annex.formPages.length > 1) {
808
+ data.currentFile.imports.push({
809
+ moduleName: "@ostack.tech/ui-kform",
810
+ name: "FormPagesNavigation"
811
+ });
812
+ formPagesNavigation = "\n <FormPagesNavigation />\n";
813
+ }
814
+ return code`
907
815
  <FormPages>${formPagesNavigation}
908
816
  ${annex.formPages.map((formPage) => scaffoldFormPage(data, annex, formPage)).join("\n\n")}
909
817
  </FormPages>
910
818
  `;
911
819
  }
912
820
  function scaffoldFormPage(data, annex, formPage) {
913
- data.currentFile.imports.push(
914
- { moduleName: "@ostack.tech/ui-kform", name: "FormPage" },
915
- {
916
- moduleName: `./${joinPaths(
917
- formPage.data.currentDir.slice(
918
- data.currentDir.length + (data.currentDir.endsWith("/") ? 0 : 1)
919
- ),
920
- formPage.schematic.name
921
- )}.tsx`,
922
- name: formPage.schematic.name
923
- }
924
- );
925
- let issueMessagesProp = "";
926
- if (shouldScaffoldIssueMessages(data) && formPage.data.currentPath !== "/") {
927
- data.currentFile.imports.push({
928
- moduleName: `./${joinPaths(
929
- formPage.data.currentDir.slice(
930
- data.currentDir.length + (data.currentDir.endsWith("/") ? 0 : 1)
931
- ),
932
- formPage.schematic.name
933
- )}IssueMessages.tsx`,
934
- name: `${constantCase(formPage.schematic.name)}_ISSUE_MESSAGES`
935
- });
936
- issueMessagesProp = ` issueMessages={${constantCase(formPage.schematic.name)}_ISSUE_MESSAGES}`;
937
- }
938
- const pathProp = annex.schematic === formPage.schematic ? "" : ` path="${formPage.data.currentPath.slice(
939
- annex.data.currentPath.length + (annex.data.currentPath.endsWith("/") ? 0 : 1)
940
- )}"`;
941
- const documentTitleProp = formPage.data.currentPath === "/" ? " documentTitle={null}" : "";
942
- return code`
943
- <FormPage${pathProp} title="${sentenceCase(
944
- formPage.schematic.name
945
- )}" code="${formPage.schematic.name?.[0].toUpperCase()}"${documentTitleProp}${issueMessagesProp}>
821
+ data.currentFile.imports.push({
822
+ moduleName: "@ostack.tech/ui-kform",
823
+ name: "FormPage"
824
+ }, {
825
+ moduleName: `./${joinPaths(formPage.data.currentDir.slice(data.currentDir.length + (data.currentDir.endsWith("/") ? 0 : 1)), formPage.schematic.name)}.tsx`,
826
+ name: formPage.schematic.name
827
+ });
828
+ let issueMessagesProp = "";
829
+ if (shouldScaffoldIssueMessages(data) && formPage.data.currentPath !== "/") {
830
+ data.currentFile.imports.push({
831
+ moduleName: `./${joinPaths(formPage.data.currentDir.slice(data.currentDir.length + (data.currentDir.endsWith("/") ? 0 : 1)), formPage.schematic.name)}IssueMessages.tsx`,
832
+ name: `${constantCase(formPage.schematic.name)}_ISSUE_MESSAGES`
833
+ });
834
+ issueMessagesProp = ` issueMessages={${constantCase(formPage.schematic.name)}_ISSUE_MESSAGES}`;
835
+ }
836
+ const pathProp = annex.schematic === formPage.schematic ? "" : ` path="${formPage.data.currentPath.slice(annex.data.currentPath.length + (annex.data.currentPath.endsWith("/") ? 0 : 1))}"`;
837
+ const documentTitleProp = formPage.data.currentPath === "/" ? " documentTitle={null}" : "";
838
+ return code`
839
+ <FormPage${pathProp} title="${sentenceCase(formPage.schematic.name)}" code="${formPage.schematic.name?.[0].toUpperCase()}"${documentTitleProp}${issueMessagesProp}>
946
840
  <${formPage.schematic.name} />
947
841
  </FormPage>
948
842
  `;
949
843
  }
950
- const contextTsEjs = 'import { createContext, useContext } from "react";\nimport { <%= formClass %>ExternalContexts } from "<%= kmpModuleName %>";\n\nexport interface <%= formClass %>ContextValue {\n externalContexts: <%= formClass %>ExternalContexts;\n}\n\nexport const <%= formClass %>Context = createContext<<%= formClass %>ContextValue>(null as never);\n\nexport function use<%= formClass %>Context(): <%= formClass %>ContextValue {\n return useContext(<%= formClass %>Context);\n}\n';
844
+ //#endregion
845
+ //#region src/scaffolding/templates/react-app/src/Context.ts.ejs?raw
846
+ var Context_ts_default = "import { createContext, useContext } from \"react\";\nimport { <%= formClass %>ExternalContexts } from \"<%= kmpModuleName %>\";\n\nexport interface <%= formClass %>ContextValue {\n externalContexts: <%= formClass %>ExternalContexts;\n}\n\nexport const <%= formClass %>Context = createContext<<%= formClass %>ContextValue>(null as never);\n\nexport function use<%= formClass %>Context(): <%= formClass %>ContextValue {\n return useContext(<%= formClass %>Context);\n}\n";
847
+ //#endregion
848
+ //#region src/scaffolding/scaffolders/scaffoldAppContext.ts
951
849
  function scaffoldAppContext(schematic, data) {
952
- const ejsData = {
953
- kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
954
- formClass: schematic.name
955
- };
956
- addEjsTemplateFile(
957
- data,
958
- `${schematic.name}Context.ts`,
959
- contextTsEjs,
960
- ejsData
961
- );
850
+ const ejsData = {
851
+ kmpModuleName: data.kmpModuleName ?? `${kebabCase(schematic.name)}-shared`,
852
+ formClass: schematic.name
853
+ };
854
+ addEjsTemplateFile(data, `${schematic.name}Context.ts`, Context_ts_default, ejsData);
962
855
  }
963
- const externalContextsKt = 'package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.Serializable\n\n@JsExport\n@Serializable\nenum class <%= formClass %>FormMode {\n /** Submitting a new form. */\n NEW,\n /** Reading a previously submitted form (`initialValue` should be provided as context). */\n READ,\n /** Replacing a previously submitted form (`initialValue` should be provided as context). */\n REPLACE,\n}\n\n@JsExport\n@Serializable\ndata class <%= formClass %>ExternalContexts @JvmOverloads constructor(\n val mode: <%= formClass %>FormMode = <%= formClass %>FormMode.NEW,\n val initialValue: <%= formClass %>? = null,\n) {\n fun toMap(): Map<String, Any?> = mapOf("mode" to mode, "initialValue" to initialValue)\n}\n';
856
+ //#endregion
857
+ //#region src/scaffolding/templates/shared/src/commonMain/kotlin/ExternalContexts.kt.ejs?raw
858
+ var ExternalContexts_kt_default = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.Serializable\n\n@JsExport\n@Serializable\nenum class <%= formClass %>FormMode {\n /** Submitting a new form. */\n NEW,\n /** Reading a previously submitted form (`initialValue` should be provided as context). */\n READ,\n /** Replacing a previously submitted form (`initialValue` should be provided as context). */\n REPLACE,\n}\n\n@JsExport\n@Serializable\ndata class <%= formClass %>ExternalContexts @JvmOverloads constructor(\n val mode: <%= formClass %>FormMode = <%= formClass %>FormMode.NEW,\n val initialValue: <%= formClass %>? = null,\n) {\n fun toMap(): Map<String, Any?> = mapOf(\"mode\" to mode, \"initialValue\" to initialValue)\n}\n";
859
+ //#endregion
860
+ //#region src/scaffolding/scaffolders/scaffoldExternalContexts.ts
964
861
  function scaffoldExternalContexts(schematic, data) {
965
- const ejsData = {
966
- filePackage: data.currentPackage,
967
- formClass: schematic.name
968
- };
969
- addEjsTemplateFile(
970
- data,
971
- `${schematic.name}ExternalContexts.kt`,
972
- externalContextsKt,
973
- ejsData
974
- );
862
+ const ejsData = {
863
+ filePackage: data.currentPackage,
864
+ formClass: schematic.name
865
+ };
866
+ addEjsTemplateFile(data, `${schematic.name}ExternalContexts.kt`, ExternalContexts_kt_default, ejsData);
975
867
  }
976
- const buildGradleKts = "allprojects {\n repositories { mavenCentral() }\n}\n";
977
- const gradlePropertiesEjs = "group=<%= gradlePropertiesGroup %>\nversion=0.0.1\n\norg.gradle.caching=true\norg.gradle.configuration-cache=true\n";
978
- const libsVersionsTomlEjs = '[versions]\n# Plugins\nkotlin = "2.2.21"\nnodeGradle = "7.1.0"\n# Libraries\nkotlinxCoroutines = "1.10.2"\nkform = "<%= kFormVersion %>"\n<%_ if (includeKotlinxDatetime) { -%>\nkotlinxDatetime = "0.7.1"\n<%_ } -%>\n<%_ if (serializationFormat === "json") { -%>\nkotlinxSerialization = "1.9.0"\n<%_ } -%>\n<%_ if (includeKtMath) { -%>\nktMath = "0.10.2"\n<%_ } -%>\nslf4j = "2.0.17"\n<%_ if (serializationFormat === "xml") { -%>\nxmlutil = "0.91.1"\n<%_ } -%>\n<%_ if (includeKotlinxDatetime) { -%>\n# npm libraries\njsJodaTimezone = "2.22.0"\n<%_ } -%>\n# Runtimes\njvmToolchain = "<%= jvmToolchainVersion %>"\nnodejs = "<%= nodejsVersion %>"\n\n[libraries]\nkform = { module = "tech.ostack:kform", version.ref = "kform" }\nkform-jsBindings = { module = "tech.ostack:kform-js-bindings", version.ref = "kform" }\nkotlinxCoroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }\n<%_ if (includeKotlinxDatetime) { -%>\nkotlinxDatetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDatetime" }\n<%_ } -%>\n<%_ if (serializationFormat === "json") { -%>\nkotlinxSerialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" }\n<%_ } -%>\n<%_ if (includeKtMath) { -%>\nktMath = { module = "io.github.gciatto:kt-math", version.ref = "ktMath" }\n<%_ } -%>\nslf4j-simple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" }\n<%_ if (serializationFormat === "xml") { -%>\nxmlutil-serialization = { module = "io.github.pdvrieze.xmlutil:serialization", version.ref = "xmlutil" }\n<%_ } -%>\n\n[plugins]\nkotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }\nkotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }\nnodeGradle = { id = "com.github.node-gradle.node", version.ref = "nodeGradle" }\n';
979
- const reactAppBuildGradleKtsEjs = 'import com.github.gradle.node.npm.task.NpmTask\n\nplugins {\n alias(libs.plugins.nodeGradle)\n base\n}\n\nval isCI = System.getenv("CI") !in arrayOf(null, "0", "false")\nnode {\n download = true\n version = libs.versions.nodejs.get()\n npmInstallCommand = if (isCI) "ci" else "install"\n}\n\nval sharedPackage = project(":shared").file("build/<%= formId %>-shared-$version.tgz")\n\nval npmInstallShared by tasks.registering(NpmTask::class) {\n group = "build"\n dependsOn(":shared:packJsPackage")\n npmCommand = listOf("install", "<%= formId %>-shared@file:$sharedPackage")\n\n inputs.file(sharedPackage)\n outputs.dir("node_modules/<%= formId %>-shared")\n}\n\ntasks.npmInstall {\n dependsOn(npmInstallShared)\n}\n\nval npmRunDev by tasks.registering(NpmTask::class) {\n group = "development"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf("run", "dev")\n}\n\nprivate fun NpmTask.npmRunBuild(buildReason: String) {\n group = "build"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf("run", "build")\n environment = mapOf("VITE_BUILD_REASON" to buildReason)\n\n inputs.dir("src")\n inputs.file(sharedPackage)\n inputs.file("index.html")\n inputs.file("package.json")\n inputs.file("tsconfig.json")\n inputs.file("tsconfig.app.json")\n inputs.file("tsconfig.node.json")\n inputs.file("vite.config.ts")\n outputs.dir("build/dist")\n}\n\nval npmRunBuild by tasks.registering(NpmTask::class) {\n npmRunBuild("production")\n}\n\nval npmRunBuildPreview by tasks.registering(NpmTask::class) {\n npmRunBuild("preview")\n}\n\nval npmRunPreview by tasks.registering(NpmTask::class) {\n group = "development"\n dependsOn(npmRunBuildPreview)\n npmCommand = listOf("run", "preview")\n}\n\nval npmRunLint by tasks.registering(NpmTask::class) {\n group = "verification"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf("run", "lint")\n\n inputs.dir("src")\n inputs.file("eslint.config.js")\n inputs.file("package.json")\n inputs.file("tsconfig.json")\n inputs.file("tsconfig.app.json")\n inputs.file("tsconfig.node.json")\n outputs.upToDateWhen { true }\n}\n\ntasks.assemble {\n dependsOn(npmRunBuild)\n}\n';
980
- const settingsGradleKtsEjs = 'plugins {\n id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"\n}\n\nrootProject.name = "<%= formId %>"\n\ninclude("shared", "react-app")\n';
981
- const sharedBuildGradleKtsEjs = 'import com.github.gradle.node.npm.task.NpmTask\n\nplugins {\n alias(libs.plugins.kotlin.multiplatform)\n alias(libs.plugins.kotlin.serialization)\n alias(libs.plugins.nodeGradle)\n}\n\nkotlin {\n jvmToolchain(libs.versions.jvmToolchain.get().toInt())\n jvm {\n testRuns["test"].executionTask.configure { useJUnitPlatform() }\n }\n js {\n compilerOptions {\n target = "es2015"\n freeCompilerArgs.add("-Xes-long-as-bigint")\n freeCompilerArgs.add("-Xwarning-level=NON_EXPORTABLE_TYPE:disabled")\n }\n binaries.library()\n browser { testTask { useMocha() } }\n generateTypeScriptDefinitions()\n }\n\n sourceSets {\n all {\n // Opt in to the experimental `JsExport` annotation\n languageSettings.optIn("kotlin.js.ExperimentalJsExport")\n }\n\n commonMain.dependencies {\n api(libs.kform)\n <%_ if (includeKotlinxDatetime) { -%>\n api(libs.kotlinxDatetime)\n <%_ } -%>\n <%_ if (serializationFormat === "json") { -%>\n api(libs.kotlinxSerialization.json)\n <%_ } -%>\n <%_ if (includeKtMath) { -%>\n api(libs.ktMath)\n <%_ } -%>\n <%_ if (serializationFormat === "xml") { -%>\n api(libs.xmlutil.serialization)\n <%_ } -%>\n }\n commonTest.dependencies {\n implementation(kotlin("test"))\n implementation(libs.kotlinxCoroutines.test)\n }\n jvmTest.dependencies {\n implementation(libs.slf4j.simple)\n }\n jsMain.dependencies {\n implementation(libs.kform.jsBindings)\n <%_ if (includeKotlinxDatetime) { -%>\n implementation(npm("@js-joda/timezone", libs.versions.jsJodaTimezone.get()))\n <%_ } -%>\n }\n }\n}\n\nnode {\n download = true\n version = libs.versions.nodejs.get()\n}\n\n// Packs the result of the JS compilation, for consumption by the React app\nval packJsPackage by tasks.registering(NpmTask::class) {\n group = "build"\n dependsOn("jsBrowserProductionLibraryDistribution")\n\n val libraryDir = "build/dist/js/productionLibrary"\n npmCommand = listOf("pack", libraryDir, "--pack-destination", "build")\n\n inputs.dir(libraryDir)\n outputs.file("build/<%= formId %>-shared-$version.tgz")\n}\n';
982
- const jsJodaTimeZoneKtEjs = 'package <%= filePackage %>\n\n// See: https://github.com/Kotlin/kotlinx-datetime?tab=readme-ov-file#note-about-time-zones-in-js\n@JsModule("@js-joda/timezone")\n@JsNonModule\nexternal object JsJodaTimeZoneModule\n\n@JsExport\nval jsJodaTz = JsJodaTimeZoneModule\n';
983
- const DEFAULT_JVM_TOOLCHAIN_VERSION = "17";
984
- const DEFAULT_NODEJS_VERSION = "22.20.0";
868
+ //#endregion
869
+ //#region src/scaffolding/templates/build.gradle.kts?raw
870
+ var build_gradle_default = "allprojects {\n repositories { mavenCentral() }\n}\n";
871
+ //#endregion
872
+ //#region src/scaffolding/templates/gradle.properties.ejs?raw
873
+ var gradle_properties_default = "group=<%= gradlePropertiesGroup %>\nversion=0.0.1\n\norg.gradle.caching=true\norg.gradle.configuration-cache=true\n";
874
+ //#endregion
875
+ //#region src/scaffolding/templates/gradle/libs.versions.toml.ejs?raw
876
+ var libs_versions_toml_default = "[versions]\n# Plugins\nkotlin = \"2.2.21\"\nnodeGradle = \"7.1.0\"\n# Libraries\nkotlinxCoroutines = \"1.10.2\"\nkform = \"<%= kFormVersion %>\"\n<%_ if (includeKotlinxDatetime) { -%>\nkotlinxDatetime = \"0.7.1\"\n<%_ } -%>\n<%_ if (serializationFormat === \"json\") { -%>\nkotlinxSerialization = \"1.9.0\"\n<%_ } -%>\n<%_ if (includeKtMath) { -%>\nktMath = \"0.10.2\"\n<%_ } -%>\nslf4j = \"2.0.17\"\n<%_ if (serializationFormat === \"xml\") { -%>\nxmlutil = \"0.91.1\"\n<%_ } -%>\n<%_ if (includeKotlinxDatetime) { -%>\n# npm libraries\njsJodaTimezone = \"2.22.0\"\n<%_ } -%>\n# Runtimes\njvmToolchain = \"<%= jvmToolchainVersion %>\"\nnodejs = \"<%= nodejsVersion %>\"\n\n[libraries]\nkform = { module = \"tech.ostack:kform\", version.ref = \"kform\" }\nkform-jsBindings = { module = \"tech.ostack:kform-js-bindings\", version.ref = \"kform\" }\nkotlinxCoroutines-test = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-test\", version.ref = \"kotlinxCoroutines\" }\n<%_ if (includeKotlinxDatetime) { -%>\nkotlinxDatetime = { module = \"org.jetbrains.kotlinx:kotlinx-datetime\", version.ref = \"kotlinxDatetime\" }\n<%_ } -%>\n<%_ if (serializationFormat === \"json\") { -%>\nkotlinxSerialization-json = { module = \"org.jetbrains.kotlinx:kotlinx-serialization-json\", version.ref = \"kotlinxSerialization\" }\n<%_ } -%>\n<%_ if (includeKtMath) { -%>\nktMath = { module = \"io.github.gciatto:kt-math\", version.ref = \"ktMath\" }\n<%_ } -%>\nslf4j-simple = { module = \"org.slf4j:slf4j-simple\", version.ref = \"slf4j\" }\n<%_ if (serializationFormat === \"xml\") { -%>\nxmlutil-serialization = { module = \"io.github.pdvrieze.xmlutil:serialization\", version.ref = \"xmlutil\" }\n<%_ } -%>\n\n[plugins]\nkotlin-multiplatform = { id = \"org.jetbrains.kotlin.multiplatform\", version.ref = \"kotlin\" }\nkotlin-serialization = { id = \"org.jetbrains.kotlin.plugin.serialization\", version.ref = \"kotlin\" }\nnodeGradle = { id = \"com.github.node-gradle.node\", version.ref = \"nodeGradle\" }\n";
877
+ //#endregion
878
+ //#region src/scaffolding/templates/react-app/build.gradle.kts.ejs?raw
879
+ var build_gradle_kts_default$1 = "import com.github.gradle.node.npm.task.NpmTask\n\nplugins {\n alias(libs.plugins.nodeGradle)\n base\n}\n\nval isCI = System.getenv(\"CI\") !in arrayOf(null, \"0\", \"false\")\nnode {\n download = true\n version = libs.versions.nodejs.get()\n npmInstallCommand = if (isCI) \"ci\" else \"install\"\n}\n\nval sharedPackage = project(\":shared\").file(\"build/<%= formId %>-shared-$version.tgz\")\n\nval npmInstallShared by tasks.registering(NpmTask::class) {\n group = \"build\"\n dependsOn(\":shared:packJsPackage\")\n npmCommand = listOf(\"install\", \"<%= formId %>-shared@file:$sharedPackage\")\n\n inputs.file(sharedPackage)\n outputs.dir(\"node_modules/<%= formId %>-shared\")\n}\n\ntasks.npmInstall {\n dependsOn(npmInstallShared)\n}\n\nval npmRunDev by tasks.registering(NpmTask::class) {\n group = \"development\"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf(\"run\", \"dev\")\n}\n\nprivate fun NpmTask.npmRunBuild(buildReason: String) {\n group = \"build\"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf(\"run\", \"build\")\n environment = mapOf(\"VITE_BUILD_REASON\" to buildReason)\n\n inputs.dir(\"src\")\n inputs.file(sharedPackage)\n inputs.file(\"index.html\")\n inputs.file(\"package.json\")\n inputs.file(\"tsconfig.json\")\n inputs.file(\"tsconfig.app.json\")\n inputs.file(\"tsconfig.node.json\")\n inputs.file(\"vite.config.ts\")\n outputs.dir(\"build/dist\")\n}\n\nval npmRunBuild by tasks.registering(NpmTask::class) {\n npmRunBuild(\"production\")\n}\n\nval npmRunBuildPreview by tasks.registering(NpmTask::class) {\n npmRunBuild(\"preview\")\n}\n\nval npmRunPreview by tasks.registering(NpmTask::class) {\n group = \"development\"\n dependsOn(npmRunBuildPreview)\n npmCommand = listOf(\"run\", \"preview\")\n}\n\nval npmRunLint by tasks.registering(NpmTask::class) {\n group = \"verification\"\n dependsOn(tasks.npmInstall)\n npmCommand = listOf(\"run\", \"lint\")\n\n inputs.dir(\"src\")\n inputs.file(\"eslint.config.js\")\n inputs.file(\"package.json\")\n inputs.file(\"tsconfig.json\")\n inputs.file(\"tsconfig.app.json\")\n inputs.file(\"tsconfig.node.json\")\n outputs.upToDateWhen { true }\n}\n\ntasks.assemble {\n dependsOn(npmRunBuild)\n}\n";
880
+ //#endregion
881
+ //#region src/scaffolding/templates/settings.gradle.kts.ejs?raw
882
+ var settings_gradle_kts_default = "plugins {\n id(\"org.gradle.toolchains.foojay-resolver-convention\") version \"1.0.0\"\n}\n\nrootProject.name = \"<%= formId %>\"\n\ninclude(\"shared\", \"react-app\")\n";
883
+ //#endregion
884
+ //#region src/scaffolding/templates/shared/build.gradle.kts.ejs?raw
885
+ var build_gradle_kts_default = "import com.github.gradle.node.npm.task.NpmTask\n\nplugins {\n alias(libs.plugins.kotlin.multiplatform)\n alias(libs.plugins.kotlin.serialization)\n alias(libs.plugins.nodeGradle)\n}\n\nkotlin {\n jvmToolchain(libs.versions.jvmToolchain.get().toInt())\n jvm {\n testRuns[\"test\"].executionTask.configure { useJUnitPlatform() }\n }\n js {\n compilerOptions {\n target = \"es2015\"\n freeCompilerArgs.add(\"-Xes-long-as-bigint\")\n freeCompilerArgs.add(\"-Xwarning-level=NON_EXPORTABLE_TYPE:disabled\")\n }\n binaries.library()\n browser { testTask { useMocha() } }\n generateTypeScriptDefinitions()\n }\n\n sourceSets {\n all {\n // Opt in to the experimental `JsExport` annotation\n languageSettings.optIn(\"kotlin.js.ExperimentalJsExport\")\n }\n\n commonMain.dependencies {\n api(libs.kform)\n <%_ if (includeKotlinxDatetime) { -%>\n api(libs.kotlinxDatetime)\n <%_ } -%>\n <%_ if (serializationFormat === \"json\") { -%>\n api(libs.kotlinxSerialization.json)\n <%_ } -%>\n <%_ if (includeKtMath) { -%>\n api(libs.ktMath)\n <%_ } -%>\n <%_ if (serializationFormat === \"xml\") { -%>\n api(libs.xmlutil.serialization)\n <%_ } -%>\n }\n commonTest.dependencies {\n implementation(kotlin(\"test\"))\n implementation(libs.kotlinxCoroutines.test)\n }\n jvmTest.dependencies {\n implementation(libs.slf4j.simple)\n }\n jsMain.dependencies {\n implementation(libs.kform.jsBindings)\n <%_ if (includeKotlinxDatetime) { -%>\n implementation(npm(\"@js-joda/timezone\", libs.versions.jsJodaTimezone.get()))\n <%_ } -%>\n }\n }\n}\n\nnode {\n download = true\n version = libs.versions.nodejs.get()\n}\n\n// Packs the result of the JS compilation, for consumption by the React app\nval packJsPackage by tasks.registering(NpmTask::class) {\n group = \"build\"\n dependsOn(\"jsBrowserProductionLibraryDistribution\")\n\n val libraryDir = \"build/dist/js/productionLibrary\"\n npmCommand = listOf(\"pack\", libraryDir, \"--pack-destination\", \"build\")\n\n inputs.dir(libraryDir)\n outputs.file(\"build/<%= formId %>-shared-$version.tgz\")\n}\n";
886
+ //#endregion
887
+ //#region src/scaffolding/templates/shared/src/jsMain/kotlin/JsJodaTimeZone.kt.ejs?raw
888
+ var JsJodaTimeZone_kt_default = "package <%= filePackage %>\n\n// See: https://github.com/Kotlin/kotlinx-datetime?tab=readme-ov-file#note-about-time-zones-in-js\n@JsModule(\"@js-joda/timezone\")\n@JsNonModule\nexternal object JsJodaTimeZoneModule\n\n@JsExport\nval jsJodaTz = JsJodaTimeZoneModule\n";
889
+ //#endregion
890
+ //#region src/scaffolding/scaffolders/scaffoldGradleProject.ts
891
+ var DEFAULT_JVM_TOOLCHAIN_VERSION = "17";
892
+ var DEFAULT_NODEJS_VERSION = "22.20.0";
985
893
  function scaffoldGradleProject(schematic, data) {
986
- const ejsData = {
987
- gradlePropertiesGroup: data.gradlePropertiesGroup ?? data.currentPackage,
988
- filePackage: data.currentPackage,
989
- formId: kebabCase(schematic.name),
990
- formTitle: capitalCase(schematic.name),
991
- kFormVersion: "0.34.2",
992
- serializationFormat: data.serializationFormat ?? "json",
993
- includeKotlinxDatetime: data.includeKotlinxDatetime ?? usesKotlinxDatetime(schematic, data),
994
- includeKtMath: data.includeKtMath ?? usesKtMath(schematic),
995
- jvmToolchainVersion: data.jvmToolchainVersion ?? DEFAULT_JVM_TOOLCHAIN_VERSION,
996
- nodejsVersion: data.nodejsVersion ?? DEFAULT_NODEJS_VERSION
997
- };
998
- addEjsTemplateFile(data, "gradle.properties", gradlePropertiesEjs, ejsData);
999
- addEjsTemplateFile(
1000
- data,
1001
- "settings.gradle.kts",
1002
- settingsGradleKtsEjs,
1003
- ejsData
1004
- );
1005
- addEjsTemplateFile(
1006
- data,
1007
- "gradle/libs.versions.toml",
1008
- libsVersionsTomlEjs,
1009
- ejsData
1010
- );
1011
- addTemplateFile(data, "build.gradle.kts", buildGradleKts);
1012
- addEjsTemplateFile(
1013
- data,
1014
- "shared/build.gradle.kts",
1015
- sharedBuildGradleKtsEjs,
1016
- ejsData
1017
- );
1018
- if (ejsData.includeKotlinxDatetime) {
1019
- addEjsTemplateFile(
1020
- data,
1021
- "shared/src/jsMain/kotlin/JsJodaTimeZone.kt",
1022
- jsJodaTimeZoneKtEjs,
1023
- ejsData
1024
- );
1025
- }
1026
- addEjsTemplateFile(
1027
- data,
1028
- "react-app/build.gradle.kts",
1029
- reactAppBuildGradleKtsEjs,
1030
- ejsData
1031
- );
894
+ const ejsData = {
895
+ gradlePropertiesGroup: data.gradlePropertiesGroup ?? data.currentPackage,
896
+ filePackage: data.currentPackage,
897
+ formId: kebabCase(schematic.name),
898
+ formTitle: capitalCase(schematic.name),
899
+ kFormVersion: "0.35.0",
900
+ serializationFormat: data.serializationFormat ?? "json",
901
+ includeKotlinxDatetime: data.includeKotlinxDatetime ?? usesKotlinxDatetime(schematic, data),
902
+ includeKtMath: data.includeKtMath ?? usesKtMath(schematic),
903
+ jvmToolchainVersion: data.jvmToolchainVersion ?? "17",
904
+ nodejsVersion: data.nodejsVersion ?? "22.20.0"
905
+ };
906
+ addEjsTemplateFile(data, "gradle.properties", gradle_properties_default, ejsData);
907
+ addEjsTemplateFile(data, "settings.gradle.kts", settings_gradle_kts_default, ejsData);
908
+ addEjsTemplateFile(data, "gradle/libs.versions.toml", libs_versions_toml_default, ejsData);
909
+ addTemplateFile(data, "build.gradle.kts", build_gradle_default);
910
+ addEjsTemplateFile(data, "shared/build.gradle.kts", build_gradle_kts_default, ejsData);
911
+ if (ejsData.includeKotlinxDatetime) addEjsTemplateFile(data, "shared/src/jsMain/kotlin/JsJodaTimeZone.kt", JsJodaTimeZone_kt_default, ejsData);
912
+ addEjsTemplateFile(data, "react-app/build.gradle.kts", build_gradle_kts_default$1, ejsData);
1032
913
  }
1033
914
  function usesKotlinxDatetime(schematic, data) {
1034
- const schematicKind = data.schematicKinds.get(schematic.kind);
1035
- return schematicKind?.package === "kotlinx.datetime" || schematic.children?.some((child) => usesKotlinxDatetime(child, data)) === true;
915
+ return data.schematicKinds.get(schematic.kind)?.package === "kotlinx.datetime" || schematic.children?.some((child) => usesKotlinxDatetime(child, data)) === true;
1036
916
  }
1037
917
  function usesKtMath(schematic) {
1038
- return ["BigInteger", "BigDecimal"].includes(schematic.kind) || schematic.children?.some((child) => usesKtMath(child)) === true;
918
+ return ["BigInteger", "BigDecimal"].includes(schematic.kind) || schematic.children?.some((child) => usesKtMath(child)) === true;
1039
919
  }
1040
- const gradleWrapperJar = "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AAAAAAAAAAAAAAAwDgAATUVUQS1JTkYvTUFOSUZFU1QuTUZVVAUAAQAAAABQSwECFAAUAAgICAAAACEAAsIE3yIBAABwAQAAMQAJAAAAAAAAAAAAAAD2DgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVBcmd1bWVudEV4Y2VwdGlvbi5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBsZK5NbgIAALMDAAAmAAkAAAAAAAAAAAAAAIAQAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZU9wdGlvbi5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBrrAeZWwIAALYEAAAzAAkAAAAAAAAAAAAAAEsTAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRBZnRlck9wdGlvbnMuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEABUgOxC4DAABdBwAAPAAJAAAAAAAAAAAAAAAQFgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkQmVmb3JlRmlyc3RTdWJDb21tYW5kLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAO+A7pzcBgAAYg4AAD0ACQAAAAAAAAAAAAAAsRkAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJEtub3duT3B0aW9uUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAxIDBO00CAACXBAAAPAAJAAAAAAAAAAAAAAABIQAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkTWlzc2luZ09wdGlvbkFyZ1N0YXRlLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAKUEGSPYAgAASgUAAD0ACQAAAAAAAAAAAAAAwSMAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJE9wdGlvbkF3YXJlUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAIjgzfKIBAAB9AgAAOAAJAAAAAAAAAAAAAAANJwAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkT3B0aW9uUGFyc2Vy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";
1041
- const gradleWrapperProperties = "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14.2-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n";
1042
- const gradlewBat = `@rem\r
1043
- @rem Copyright 2015 the original author or authors.\r
1044
- @rem\r
1045
- @rem Licensed under the Apache License, Version 2.0 (the "License");\r
1046
- @rem you may not use this file except in compliance with the License.\r
1047
- @rem You may obtain a copy of the License at\r
1048
- @rem\r
1049
- @rem https://www.apache.org/licenses/LICENSE-2.0\r
1050
- @rem\r
1051
- @rem Unless required by applicable law or agreed to in writing, software\r
1052
- @rem distributed under the License is distributed on an "AS IS" BASIS,\r
1053
- @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
1054
- @rem See the License for the specific language governing permissions and\r
1055
- @rem limitations under the License.\r
1056
- @rem\r
1057
- @rem SPDX-License-Identifier: Apache-2.0\r
1058
- @rem\r
1059
- \r
1060
- @if "%DEBUG%"=="" @echo off\r
1061
- @rem ##########################################################################\r
1062
- @rem\r
1063
- @rem Gradle startup script for Windows\r
1064
- @rem\r
1065
- @rem ##########################################################################\r
1066
- \r
1067
- @rem Set local scope for the variables with windows NT shell\r
1068
- if "%OS%"=="Windows_NT" setlocal\r
1069
- \r
1070
- set DIRNAME=%~dp0\r
1071
- if "%DIRNAME%"=="" set DIRNAME=.\r
1072
- @rem This is normally unused\r
1073
- set APP_BASE_NAME=%~n0\r
1074
- set APP_HOME=%DIRNAME%\r
1075
- \r
1076
- @rem Resolve any "." and ".." in APP_HOME to make it shorter.\r
1077
- for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi\r
1078
- \r
1079
- @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r
1080
- set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"\r
1081
- \r
1082
- @rem Find java.exe\r
1083
- if defined JAVA_HOME goto findJavaFromJavaHome\r
1084
- \r
1085
- set JAVA_EXE=java.exe\r
1086
- %JAVA_EXE% -version >NUL 2>&1\r
1087
- if %ERRORLEVEL% equ 0 goto execute\r
1088
- \r
1089
- echo. 1>&2\r
1090
- echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r
1091
- echo. 1>&2\r
1092
- echo Please set the JAVA_HOME variable in your environment to match the 1>&2\r
1093
- echo location of your Java installation. 1>&2\r
1094
- \r
1095
- goto fail\r
1096
- \r
1097
- :findJavaFromJavaHome\r
1098
- set JAVA_HOME=%JAVA_HOME:"=%\r
1099
- set JAVA_EXE=%JAVA_HOME%/bin/java.exe\r
1100
- \r
1101
- if exist "%JAVA_EXE%" goto execute\r
1102
- \r
1103
- echo. 1>&2\r
1104
- echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r
1105
- echo. 1>&2\r
1106
- echo Please set the JAVA_HOME variable in your environment to match the 1>&2\r
1107
- echo location of your Java installation. 1>&2\r
1108
- \r
1109
- goto fail\r
1110
- \r
1111
- :execute\r
1112
- @rem Setup the command line\r
1113
- \r
1114
- set CLASSPATH=\r
1115
- \r
1116
- \r
1117
- @rem Execute Gradle\r
1118
- "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar" %*\r
1119
- \r
1120
- :end\r
1121
- @rem End local scope for the variables with windows NT shell\r
1122
- if %ERRORLEVEL% equ 0 goto mainEnd\r
1123
- \r
1124
- :fail\r
1125
- rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r
1126
- rem the _cmd.exe /c_ return code!\r
1127
- set EXIT_CODE=%ERRORLEVEL%\r
1128
- if %EXIT_CODE% equ 0 set EXIT_CODE=1\r
1129
- if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%\r
1130
- exit /b %EXIT_CODE%\r
1131
- \r
1132
- :mainEnd\r
1133
- if "%OS%"=="Windows_NT" endlocal\r
1134
- \r
1135
- :omega\r
1136
- `;
1137
- const gradlew = `#!/bin/sh
1138
-
1139
- #
1140
- # Copyright © 2015-2021 the original authors.
1141
- #
1142
- # Licensed under the Apache License, Version 2.0 (the "License");
1143
- # you may not use this file except in compliance with the License.
1144
- # You may obtain a copy of the License at
1145
- #
1146
- # https://www.apache.org/licenses/LICENSE-2.0
1147
- #
1148
- # Unless required by applicable law or agreed to in writing, software
1149
- # distributed under the License is distributed on an "AS IS" BASIS,
1150
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1151
- # See the License for the specific language governing permissions and
1152
- # limitations under the License.
1153
- #
1154
- # SPDX-License-Identifier: Apache-2.0
1155
- #
1156
-
1157
- ##############################################################################
1158
- #
1159
- # Gradle start up script for POSIX generated by Gradle.
1160
- #
1161
- # Important for running:
1162
- #
1163
- # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
1164
- # noncompliant, but you have some other compliant shell such as ksh or
1165
- # bash, then to run this script, type that shell name before the whole
1166
- # command line, like:
1167
- #
1168
- # ksh Gradle
1169
- #
1170
- # Busybox and similar reduced shells will NOT work, because this script
1171
- # requires all of these POSIX shell features:
1172
- # * functions;
1173
- # * expansions «$var», «\${var}», «\${var:-default}», «\${var+SET}»,
1174
- # «\${var#prefix}», «\${var%suffix}», and «$( cmd )»;
1175
- # * compound commands having a testable exit status, especially «case»;
1176
- # * various built-in commands including «command», «set», and «ulimit».
1177
- #
1178
- # Important for patching:
1179
- #
1180
- # (2) This script targets any POSIX shell, so it avoids extensions provided
1181
- # by Bash, Ksh, etc; in particular arrays are avoided.
1182
- #
1183
- # The "traditional" practice of packing multiple parameters into a
1184
- # space-separated string is a well documented source of bugs and security
1185
- # problems, so this is (mostly) avoided, by progressively accumulating
1186
- # options in "$@", and eventually passing that to Java.
1187
- #
1188
- # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
1189
- # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
1190
- # see the in-line comments for details.
1191
- #
1192
- # There are tweaks for specific operating systems such as AIX, CygWin,
1193
- # Darwin, MinGW, and NonStop.
1194
- #
1195
- # (3) This script is generated from the Groovy template
1196
- # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
1197
- # within the Gradle project.
1198
- #
1199
- # You can find Gradle at https://github.com/gradle/gradle/.
1200
- #
1201
- ##############################################################################
1202
-
1203
- # Attempt to set APP_HOME
1204
-
1205
- # Resolve links: $0 may be a link
1206
- app_path=$0
1207
-
1208
- # Need this for daisy-chained symlinks.
1209
- while
1210
- APP_HOME=\${app_path%"\${app_path##*/}"} # leaves a trailing /; empty if no leading path
1211
- [ -h "$app_path" ]
1212
- do
1213
- ls=$( ls -ld "$app_path" )
1214
- link=\${ls#*' -> '}
1215
- case $link in #(
1216
- /*) app_path=$link ;; #(
1217
- *) app_path=$APP_HOME$link ;;
1218
- esac
1219
- done
1220
-
1221
- # This is normally unused
1222
- # shellcheck disable=SC2034
1223
- APP_BASE_NAME=\${0##*/}
1224
- # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
1225
- APP_HOME=$( cd -P "\${APP_HOME:-./}" > /dev/null && printf '%s\\n' "$PWD" ) || exit
1226
-
1227
- # Use the maximum available, or set MAX_FD != -1 to use that value.
1228
- MAX_FD=maximum
1229
-
1230
- warn () {
1231
- echo "$*"
1232
- } >&2
1233
-
1234
- die () {
1235
- echo
1236
- echo "$*"
1237
- echo
1238
- exit 1
1239
- } >&2
1240
-
1241
- # OS specific support (must be 'true' or 'false').
1242
- cygwin=false
1243
- msys=false
1244
- darwin=false
1245
- nonstop=false
1246
- case "$( uname )" in #(
1247
- CYGWIN* ) cygwin=true ;; #(
1248
- Darwin* ) darwin=true ;; #(
1249
- MSYS* | MINGW* ) msys=true ;; #(
1250
- NONSTOP* ) nonstop=true ;;
1251
- esac
1252
-
1253
- CLASSPATH="\\\\\\"\\\\\\""
1254
-
1255
-
1256
- # Determine the Java command to use to start the JVM.
1257
- if [ -n "$JAVA_HOME" ] ; then
1258
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
1259
- # IBM's JDK on AIX uses strange locations for the executables
1260
- JAVACMD=$JAVA_HOME/jre/sh/java
1261
- else
1262
- JAVACMD=$JAVA_HOME/bin/java
1263
- fi
1264
- if [ ! -x "$JAVACMD" ] ; then
1265
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
1266
-
1267
- Please set the JAVA_HOME variable in your environment to match the
1268
- location of your Java installation."
1269
- fi
1270
- else
1271
- JAVACMD=java
1272
- if ! command -v java >/dev/null 2>&1
1273
- then
1274
- die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
1275
-
1276
- Please set the JAVA_HOME variable in your environment to match the
1277
- location of your Java installation."
1278
- fi
1279
- fi
1280
-
1281
- # Increase the maximum file descriptors if we can.
1282
- if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
1283
- case $MAX_FD in #(
1284
- max*)
1285
- # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
1286
- # shellcheck disable=SC2039,SC3045
1287
- MAX_FD=$( ulimit -H -n ) ||
1288
- warn "Could not query maximum file descriptor limit"
1289
- esac
1290
- case $MAX_FD in #(
1291
- '' | soft) :;; #(
1292
- *)
1293
- # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
1294
- # shellcheck disable=SC2039,SC3045
1295
- ulimit -n "$MAX_FD" ||
1296
- warn "Could not set maximum file descriptor limit to $MAX_FD"
1297
- esac
1298
- fi
1299
-
1300
- # Collect all arguments for the java command, stacking in reverse order:
1301
- # * args from the command line
1302
- # * the main class name
1303
- # * -classpath
1304
- # * -D...appname settings
1305
- # * --module-path (only if needed)
1306
- # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
1307
-
1308
- # For Cygwin or MSYS, switch paths to Windows format before running java
1309
- if "$cygwin" || "$msys" ; then
1310
- APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
1311
- CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
1312
-
1313
- JAVACMD=$( cygpath --unix "$JAVACMD" )
1314
-
1315
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
1316
- for arg do
1317
- if
1318
- case $arg in #(
1319
- -*) false ;; # don't mess with options #(
1320
- /?*) t=\${arg#/} t=/\${t%%/*} # looks like a POSIX filepath
1321
- [ -e "$t" ] ;; #(
1322
- *) false ;;
1323
- esac
1324
- then
1325
- arg=$( cygpath --path --ignore --mixed "$arg" )
1326
- fi
1327
- # Roll the args list around exactly as many times as the number of
1328
- # args, so each arg winds up back in the position where it started, but
1329
- # possibly modified.
1330
- #
1331
- # NB: a \`for\` loop captures its iteration list before it begins, so
1332
- # changing the positional parameters here affects neither the number of
1333
- # iterations, nor the values presented in \`arg\`.
1334
- shift # remove old arg
1335
- set -- "$@" "$arg" # push replacement arg
1336
- done
1337
- fi
1338
-
1339
-
1340
- # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
1341
- DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
1342
-
1343
- # Collect all arguments for the java command:
1344
- # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
1345
- # and any embedded shellness will be escaped.
1346
- # * For example: A user cannot expect \${Hostname} to be expanded, as it is an environment variable and will be
1347
- # treated as '\${Hostname}' itself on the command line.
1348
-
1349
- set -- \\
1350
- "-Dorg.gradle.appname=$APP_BASE_NAME" \\
1351
- -classpath "$CLASSPATH" \\
1352
- -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \\
1353
- "$@"
1354
-
1355
- # Stop when "xargs" is not available.
1356
- if ! command -v xargs >/dev/null 2>&1
1357
- then
1358
- die "xargs is not available"
1359
- fi
1360
-
1361
- # Use "xargs" to parse quoted args.
1362
- #
1363
- # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
1364
- #
1365
- # In Bash we could simply go:
1366
- #
1367
- # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
1368
- # set -- "\${ARGS[@]}" "$@"
1369
- #
1370
- # but POSIX shell has neither arrays nor command substitution, so instead we
1371
- # post-process each arg (as a line of input to sed) to backslash-escape any
1372
- # character that might be a shell metacharacter, then use eval to reverse
1373
- # that process (while maintaining the separation between arguments), and wrap
1374
- # the whole thing up as a single "set" statement.
1375
- #
1376
- # This will of course break if any of these variables contains a newline or
1377
- # an unmatched quote.
1378
- #
1379
-
1380
- eval "set -- $(
1381
- printf '%s\\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
1382
- xargs -n1 |
1383
- sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |
1384
- tr '\\n' ' '
1385
- )" '"$@"'
1386
-
1387
- exec "$JAVACMD" "$@"
1388
- `;
920
+ //#endregion
921
+ //#region src/scaffolding/templates/gradle/wrapper/gradle-wrapper.jar?url
922
+ var gradle_wrapper_default$1 = "data:application/java-archive;base64,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AAAAAAAAAAAAAAAwDgAATUVUQS1JTkYvTUFOSUZFU1QuTUZVVAUAAQAAAABQSwECFAAUAAgICAAAACEAAsIE3yIBAABwAQAAMQAJAAAAAAAAAAAAAAD2DgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVBcmd1bWVudEV4Y2VwdGlvbi5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBsZK5NbgIAALMDAAAmAAkAAAAAAAAAAAAAAIAQAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZU9wdGlvbi5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBrrAeZWwIAALYEAAAzAAkAAAAAAAAAAAAAAEsTAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRBZnRlck9wdGlvbnMuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEABUgOxC4DAABdBwAAPAAJAAAAAAAAAAAAAAAQFgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkQmVmb3JlRmlyc3RTdWJDb21tYW5kLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAO+A7pzcBgAAYg4AAD0ACQAAAAAAAAAAAAAAsRkAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJEtub3duT3B0aW9uUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAxIDBO00CAACXBAAAPAAJAAAAAAAAAAAAAAABIQAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkTWlzc2luZ09wdGlvbkFyZ1N0YXRlLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAKUEGSPYAgAASgUAAD0ACQAAAAAAAAAAAAAAwSMAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJE9wdGlvbkF3YXJlUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAIjgzfKIBAAB9AgAAOAAJAAAAAAAAAAAAAAANJwAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkT3B0aW9uUGFyc2Vy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";
923
+ //#endregion
924
+ //#region src/scaffolding/templates/gradle/wrapper/gradle-wrapper.properties?raw
925
+ var gradle_wrapper_default = "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14.2-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n";
926
+ //#endregion
927
+ //#region src/scaffolding/templates/gradlew.bat?raw
928
+ var gradlew_default = "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n";
929
+ //#endregion
930
+ //#region src/scaffolding/templates/gradlew?raw
931
+ var gradlew_raw_default = "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n# Gradle start up script for POSIX generated by Gradle.\n#\n# Important for running:\n#\n# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n# noncompliant, but you have some other compliant shell such as ksh or\n# bash, then to run this script, type that shell name before the whole\n# command line, like:\n#\n# ksh Gradle\n#\n# Busybox and similar reduced shells will NOT work, because this script\n# requires all of these POSIX shell features:\n# * functions;\n# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n# «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n# * compound commands having a testable exit status, especially «case»;\n# * various built-in commands including «command», «set», and «ulimit».\n#\n# Important for patching:\n#\n# (2) This script targets any POSIX shell, so it avoids extensions provided\n# by Bash, Ksh, etc; in particular arrays are avoided.\n#\n# The \"traditional\" practice of packing multiple parameters into a\n# space-separated string is a well documented source of bugs and security\n# problems, so this is (mostly) avoided, by progressively accumulating\n# options in \"$@\", and eventually passing that to Java.\n#\n# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n# see the in-line comments for details.\n#\n# There are tweaks for specific operating systems such as AIX, CygWin,\n# Darwin, MinGW, and NonStop.\n#\n# (3) This script is generated from the Groovy template\n# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n# within the Gradle project.\n#\n# You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n APP_HOME=${app_path%\"${app_path##*/}\"} # leaves a trailing /; empty if no leading path\n [ -h \"$app_path\" ]\ndo\n ls=$( ls -ld \"$app_path\" )\n link=${ls#*' -> '}\n case $link in #(\n /*) app_path=$link ;; #(\n *) app_path=$APP_HOME$link ;;\n esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n echo \"$*\"\n} >&2\n\ndie () {\n echo\n echo \"$*\"\n echo\n exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in #(\n CYGWIN* ) cygwin=true ;; #(\n Darwin* ) darwin=true ;; #(\n MSYS* | MINGW* ) msys=true ;; #(\n NONSTOP* ) nonstop=true ;;\nesac\n\nCLASSPATH=\"\\\\\\\"\\\\\\\"\"\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n # IBM's JDK on AIX uses strange locations for the executables\n JAVACMD=$JAVA_HOME/jre/sh/java\n else\n JAVACMD=$JAVA_HOME/bin/java\n fi\n if [ ! -x \"$JAVACMD\" ] ; then\n die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n fi\nelse\n JAVACMD=java\n if ! command -v java >/dev/null 2>&1\n then\n die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n case $MAX_FD in #(\n max*)\n # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n # shellcheck disable=SC2039,SC3045\n MAX_FD=$( ulimit -H -n ) ||\n warn \"Could not query maximum file descriptor limit\"\n esac\n case $MAX_FD in #(\n '' | soft) :;; #(\n *)\n # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n # shellcheck disable=SC2039,SC3045\n ulimit -n \"$MAX_FD\" ||\n warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n# * args from the command line\n# * the main class name\n# * -classpath\n# * -D...appname settings\n# * --module-path (only if needed)\n# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n # Now convert the arguments - kludge to limit ourselves to /bin/sh\n for arg do\n if\n case $arg in #(\n -*) false ;; # don't mess with options #(\n /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath\n [ -e \"$t\" ] ;; #(\n *) false ;;\n esac\n then\n arg=$( cygpath --path --ignore --mixed \"$arg\" )\n fi\n # Roll the args list around exactly as many times as the number of\n # args, so each arg winds up back in the position where it started, but\n # possibly modified.\n #\n # NB: a `for` loop captures its iteration list before it begins, so\n # changing the positional parameters here affects neither the number of\n # iterations, nor the values presented in `arg`.\n shift # remove old arg\n set -- \"$@\" \"$arg\" # push replacement arg\n done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n# and any embedded shellness will be escaped.\n# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n# treated as '${Hostname}' itself on the command line.\n\nset -- \\\n \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n -classpath \"$CLASSPATH\" \\\n -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n# readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n# set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n xargs -n1 |\n sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n tr '\\n' ' '\n )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n";
932
+ //#endregion
933
+ //#region src/scaffolding/scaffolders/scaffoldGradleWrapper.ts
1389
934
  function scaffoldGradleWrapper(_schematic, data) {
1390
- addTemplateFile(data, "gradlew", gradlew, { executable: true });
1391
- addTemplateFile(data, "gradlew.bat", gradlewBat);
1392
- addTemplateFile(data, "gradle/wrapper/gradle-wrapper.jar", gradleWrapperJar, {
1393
- base64: true
1394
- });
1395
- addTemplateFile(
1396
- data,
1397
- "gradle/wrapper/gradle-wrapper.properties",
1398
- gradleWrapperProperties
1399
- );
935
+ addTemplateFile(data, "gradlew", gradlew_raw_default, { executable: true });
936
+ addTemplateFile(data, "gradlew.bat", gradlew_default);
937
+ addTemplateFile(data, "gradle/wrapper/gradle-wrapper.jar", fetch(gradle_wrapper_default$1).then((res) => res.arrayBuffer()));
938
+ addTemplateFile(data, "gradle/wrapper/gradle-wrapper.properties", gradle_wrapper_default);
1400
939
  }
940
+ //#endregion
941
+ //#region src/scaffolding/scaffolders/scaffoldMain.ts
1401
942
  function scaffoldMain(schematic, data) {
1402
- const fileName = joinPaths(data.currentDir, "main.tsx");
1403
- let file = data.files.get(fileName);
1404
- if (!file) {
1405
- data.files.set(fileName, file = tsFile());
1406
- }
1407
- scaffoldMainDeclarations(schematic, {
1408
- kmpModuleName: `${kebabCase(schematic.name)}-shared`,
1409
- ...data,
1410
- currentFile: file
1411
- });
943
+ const fileName = joinPaths(data.currentDir, "main.tsx");
944
+ let file = data.files.get(fileName);
945
+ if (!file) data.files.set(fileName, file = tsFile());
946
+ scaffoldMainDeclarations(schematic, {
947
+ kmpModuleName: `${kebabCase(schematic.name)}-shared`,
948
+ ...data,
949
+ currentFile: file
950
+ });
1412
951
  }
1413
952
  function scaffoldMainDeclarations(schematic, data) {
1414
- data.currentFile.imports.push(
1415
- { moduleName: "./index.scss" },
1416
- { moduleName: "react", name: "StrictMode" },
1417
- { moduleName: "react-dom/client", name: "createRoot" },
1418
- {
1419
- moduleName: data.kmpModuleName,
1420
- name: `decode${schematic.name}ExternalContextsFromString`
1421
- },
1422
- {
1423
- moduleName: `./${schematic.name}Context.ts`,
1424
- name: `${schematic.name}Context`
1425
- },
1426
- {
1427
- moduleName: `./${schematic.name}App.tsx`,
1428
- name: `${schematic.name}App`
1429
- }
1430
- );
1431
- data.currentFile.declarations.push(code`
953
+ data.currentFile.imports.push({ moduleName: "./index.scss" }, {
954
+ moduleName: "react",
955
+ name: "StrictMode"
956
+ }, {
957
+ moduleName: "react-dom/client",
958
+ name: "createRoot"
959
+ }, {
960
+ moduleName: data.kmpModuleName,
961
+ name: `decode${schematic.name}ExternalContextsFromString`
962
+ }, {
963
+ moduleName: `./${schematic.name}Context.ts`,
964
+ name: `${schematic.name}Context`
965
+ }, {
966
+ moduleName: `./${schematic.name}App.tsx`,
967
+ name: `${schematic.name}App`
968
+ });
969
+ data.currentFile.declarations.push(code`
1432
970
  export function renderRoot(encodedExternalContexts: string) {
1433
971
  createRoot(document.getElementById("${kebabCase(schematic.name)}-app-root")!).render(
1434
972
  <StrictMode>
@@ -1446,185 +984,134 @@ function scaffoldMainDeclarations(schematic, data) {
1446
984
  }
1447
985
  `);
1448
986
  }
1449
- const editorconfig = "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\nmax_line_length = 80\ntrim_trailing_whitespace = true\n\n[*.bat]\nend_of_line = crlf\n\n[{*.kt,*.kts,*.md}]\nindent_size = 4\nmax_line_length = 100\n";
1450
- const gitattributes = "* text=auto eol=lf\n*.bat text eol=crlf\n";
1451
- const gitignore = "# Gradle\n.gradle/\nbuild/\n!**/src/**/build/\n\n# Kotlin\n.kotlin/\n\n# Node.js\nnode_modules/\n.npmrc\n\n# Typescript\n*.tsbuildinfo\n\n# Local env files\n.env*.local\n\n# Logs\nlogs\n*.log\n\n# IDEs and editors\n.vscode/\n.idea/\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\nout/\n!**/src/**/out/\n\n# Misc\n.DS_Store\n*.pem\n";
987
+ //#endregion
988
+ //#region src/scaffolding/templates/_editorconfig?raw
989
+ var _editorconfig_raw_default = "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\nmax_line_length = 80\ntrim_trailing_whitespace = true\n\n[*.bat]\nend_of_line = crlf\n\n[{*.kt,*.kts,*.md}]\nindent_size = 4\nmax_line_length = 100\n";
990
+ //#endregion
991
+ //#region src/scaffolding/templates/_gitattributes?raw
992
+ var _gitattributes_raw_default = "* text=auto eol=lf\n*.bat text eol=crlf\n";
993
+ //#endregion
994
+ //#region src/scaffolding/templates/_gitignore?raw
995
+ var _gitignore_raw_default = "# Gradle\n.gradle/\nbuild/\n!**/src/**/build/\n\n# Kotlin\n.kotlin/\n\n# Node.js\nnode_modules/\n.npmrc\n\n# Typescript\n*.tsbuildinfo\n\n# Local env files\n.env*.local\n\n# Logs\nlogs\n*.log\n\n# IDEs and editors\n.vscode/\n.idea/\n.project\n.classpath\n.c9/\n*.launch\n.settings/\n*.sublime-workspace\nout/\n!**/src/**/out/\n\n# Misc\n.DS_Store\n*.pem\n";
996
+ //#endregion
997
+ //#region src/scaffolding/scaffolders/scaffoldProjectMisc.ts
1452
998
  function scaffoldProjectMisc(_schematic, data) {
1453
- addTemplateFile(data, ".gitignore", gitignore);
1454
- addTemplateFile(data, ".gitattributes", gitattributes);
1455
- addTemplateFile(data, ".editorconfig", editorconfig);
999
+ addTemplateFile(data, ".gitignore", _gitignore_raw_default);
1000
+ addTemplateFile(data, ".gitattributes", _gitattributes_raw_default);
1001
+ addTemplateFile(data, ".editorconfig", _editorconfig_raw_default);
1456
1002
  }
1457
- const responsesKt = 'package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport tech.ostack.kform.LocatedValidationIssue\n\n@JsExport\n@Serializable\nsealed interface <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName("success")\nclass <%= formClass %>SubmitSuccess(val redirectTo: String) : <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName("error")\nclass <%= formClass %>SubmitError @JvmOverloads constructor(override val message: String? = null) :\n Throwable(message), <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName("validationError")\nclass <%= formClass %>SubmitValidationError(val issues: List<LocatedValidationIssue>) :\n <%= formClass %>SubmitResponse\n';
1003
+ //#endregion
1004
+ //#region src/scaffolding/templates/shared/src/commonMain/kotlin/Responses.kt.ejs?raw
1005
+ var Responses_kt_default = "package <%= filePackage %>\n\nimport kotlin.js.JsExport\nimport kotlin.jvm.JvmOverloads\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport tech.ostack.kform.LocatedValidationIssue\n\n@JsExport\n@Serializable\nsealed interface <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName(\"success\")\nclass <%= formClass %>SubmitSuccess(val redirectTo: String) : <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName(\"error\")\nclass <%= formClass %>SubmitError @JvmOverloads constructor(override val message: String? = null) :\n Throwable(message), <%= formClass %>SubmitResponse\n\n@JsExport\n@Serializable\n@SerialName(\"validationError\")\nclass <%= formClass %>SubmitValidationError(val issues: List<LocatedValidationIssue>) :\n <%= formClass %>SubmitResponse\n";
1006
+ //#endregion
1007
+ //#region src/scaffolding/scaffolders/scaffoldResponses.ts
1458
1008
  function scaffoldResponses(schematic, data) {
1459
- const ejsData = {
1460
- filePackage: data.currentPackage,
1461
- formClass: schematic.name
1462
- };
1463
- addEjsTemplateFile(
1464
- data,
1465
- `${schematic.name}Responses.kt`,
1466
- responsesKt,
1467
- ejsData
1468
- );
1009
+ const ejsData = {
1010
+ filePackage: data.currentPackage,
1011
+ formClass: schematic.name
1012
+ };
1013
+ addEjsTemplateFile(data, `${schematic.name}Responses.kt`, Responses_kt_default, ejsData);
1469
1014
  }
1470
- const indexScss = '@use "@ostack.tech/ui/scss" as o-ui;\n@use "@ostack.tech/ui-kform/scss" as o-ui-kform;\n';
1015
+ //#endregion
1016
+ //#region src/scaffolding/templates/react-app/src/index.scss?raw
1017
+ var src_default = "@use \"@ostack.tech/ui/scss\" as o-ui;\n@use \"@ostack.tech/ui-kform/scss\" as o-ui-kform;\n";
1018
+ //#endregion
1019
+ //#region src/scaffolding/scaffolders/scaffoldStyles.ts
1471
1020
  function scaffoldStyles(_schematic, data) {
1472
- addTemplateFile(data, "index.scss", indexScss);
1021
+ addTemplateFile(data, "index.scss", src_default);
1473
1022
  }
1474
- const eslintConfigJs = 'import js from "@eslint/js";\nimport { defineConfig, globalIgnores } from "eslint/config";\nimport reactHooks from "eslint-plugin-react-hooks";\nimport reactRefresh from "eslint-plugin-react-refresh";\nimport globals from "globals";\nimport tseslint from "typescript-eslint";\n\nexport default defineConfig([\n globalIgnores([".gradle", "build"]),\n {\n files: ["**/*.{ts,tsx}"],\n extends: [\n js.configs.recommended,\n tseslint.configs.recommended,\n reactHooks.configs.flat.recommended,\n reactRefresh.configs.vite,\n ],\n languageOptions: {\n ecmaVersion: 2020,\n globals: globals.browser,\n },\n },\n]);\n';
1475
- const indexHtmlEjs = '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <link rel="icon" type="image/svg+xml" href="/vite.svg" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title><%= formTitle %></title>\n <style>\n body {\n margin: 0;\n }\n </style>\n </head>\n <body>\n <div id="<%= formId %>-app-root"></div>\n <script type="module">\n import { renderRoot } from "/src/main.tsx";\n\n renderRoot(<%- encodedExternalContexts %>);\n <\/script>\n </body>\n</html>\n';
1476
- const packageJsonEjs = '{\n "name": "<%= formId %>-react-app",\n "private": true,\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "tsc -b && vite build",\n "lint": "eslint .",\n "preview": "vite preview"\n },\n "dependencies": {\n "@fortawesome/fontawesome-svg-core": "<%= dependencyVersions["@fortawesome/fontawesome-svg-core"] %>",\n "@fortawesome/free-regular-svg-icons": "<%= dependencyVersions["@fortawesome/free-regular-svg-icons"] %>",\n "@fortawesome/free-solid-svg-icons": "<%= dependencyVersions["@fortawesome/free-solid-svg-icons"] %>",\n "@ostack.tech/kform-react": "~<%= kFormVersion %>",\n "@ostack.tech/ui": "~<%= ostackUiVersion %>",\n "@ostack.tech/ui-kform": "~<%= ostackUiVersion %>",\n "date-fns": "<%= dependencyVersions["date-fns"] %>",\n "<%= formId %>-shared": "file:../shared/build/<%= formId %>-shared-0.0.1.tgz",\n "react": "<%= dependencyVersions.react %>",\n "react-dom": "<%= dependencyVersions["react-dom"] %>"\n },\n "devDependencies": {\n "@eslint/js": "<%= dependencyVersions["@eslint/js"] %>",\n "@types/node": "<%= dependencyVersions["@types/node"] %>",\n "@types/ostack.tech__kform": "npm:@ostack.tech/kform@~<%= kFormVersion %>",\n "@types/react": "<%= dependencyVersions["@types/react"] %>",\n "@types/react-dom": "<%= dependencyVersions["@types/react-dom"] %>",\n "@vitejs/plugin-react": "<%= dependencyVersions["@vitejs/plugin-react"] %>",\n "eslint": "<%= dependencyVersions.eslint %>",\n "eslint-plugin-react-hooks": "<%= dependencyVersions["eslint-plugin-react-hooks"] %>",\n "eslint-plugin-react-refresh": "<%= dependencyVersions["eslint-plugin-react-refresh"] %>",\n "globals": "<%= dependencyVersions.globals %>",\n "sass-embedded": "<%= dependencyVersions["sass-embedded"] %>",\n "typescript": "<%= dependencyVersions.typescript %>",\n "typescript-eslint": "<%= dependencyVersions["typescript-eslint"] %>",\n "vite": "<%= dependencyVersions.vite %>"\n }\n}\n';
1477
- const viteSvg = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>\n';
1478
- const tsConfigAppJson = '{\n "compilerOptions": {\n "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",\n "target": "ES2022",\n "useDefineForClassFields": true,\n "lib": ["ES2022", "DOM", "DOM.Iterable"],\n "module": "ESNext",\n "types": ["vite/client"],\n "skipLibCheck": true,\n\n /* Bundler mode */\n "moduleResolution": "bundler",\n "allowImportingTsExtensions": true,\n "verbatimModuleSyntax": true,\n "moduleDetection": "force",\n "noEmit": true,\n "jsx": "react-jsx",\n\n /* Linting */\n "strict": true,\n "noUnusedLocals": true,\n "noUnusedParameters": true,\n "erasableSyntaxOnly": true,\n "noFallthroughCasesInSwitch": true,\n "noUncheckedSideEffectImports": true\n },\n "include": ["src"]\n}\n';
1479
- const tsConfigJson = '{\n "files": [],\n "references": [\n { "path": "./tsconfig.app.json" },\n { "path": "./tsconfig.node.json" }\n ]\n}\n';
1480
- const tsConfigNodeJson = '{\n "compilerOptions": {\n "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",\n "target": "ES2023",\n "lib": ["ES2023"],\n "module": "ESNext",\n "types": ["node"],\n "skipLibCheck": true,\n\n /* Bundler mode */\n "moduleResolution": "bundler",\n "allowImportingTsExtensions": true,\n "verbatimModuleSyntax": true,\n "moduleDetection": "force",\n "noEmit": true,\n\n /* Linting */\n "strict": true,\n "noUnusedLocals": true,\n "noUnusedParameters": true,\n "erasableSyntaxOnly": true,\n "noFallthroughCasesInSwitch": true,\n "noUncheckedSideEffectImports": true\n },\n "include": ["vite.config.ts"]\n}\n';
1481
- const viteConfigTsEjs = 'import { resolve } from "node:path";\n\nimport react from "@vitejs/plugin-react";\nimport { defineConfig } from "vite";\n\n// https://vite.dev/config/\nexport default defineConfig({\n plugins: [react()],\n build: {\n outDir: "<%= viteConfigOutDir %>",\n rollupOptions: {\n preserveEntrySignatures: "exports-only",\n input: {\n "<%= formId %>-app":\n process.env.VITE_BUILD_REASON === "preview"\n ? "index.html"\n : "src/main.tsx",\n },\n output: {\n // Output files without hashes, making it easier to serve them in the\n // server. However, the server is expected to somehow "version" them for\n // cache busting purposes.\n entryFileNames: "assets/[name].js",\n chunkFileNames: "assets/[name].js",\n assetFileNames: "assets/[name].[ext]",\n },\n },\n },\n resolve: {\n alias: {\n // Due to how Kotlin "bundles" dependencies, we need to use the\n // `@ostack.tech/kform` produced by the shared module.\n "@ostack.tech/kform": resolve(\n import.meta.dirname,\n "node_modules/<%= formId %>-shared/ostack-kform.mjs",\n ),\n },\n },\n server: {\n proxy: { "<%= apiBasePath %>": "<%= viteConfigProxyTarget %>" },\n },\n});\n';
1482
- const DEFAULT_VITE_CONFIG_OUT_DIR = "build/dist/";
1483
- const DEFAULT_VITE_CONFIG_PROXY_TARGET = "http://127.0.0.1:8080/";
1023
+ //#endregion
1024
+ //#region src/scaffolding/templates/react-app/eslint.config.js?raw
1025
+ var eslint_config_default = "import js from \"@eslint/js\";\nimport { defineConfig, globalIgnores } from \"eslint/config\";\nimport reactHooks from \"eslint-plugin-react-hooks\";\nimport reactRefresh from \"eslint-plugin-react-refresh\";\nimport globals from \"globals\";\nimport tseslint from \"typescript-eslint\";\n\nexport default defineConfig([\n globalIgnores([\".gradle\", \"build\"]),\n {\n files: [\"**/*.{ts,tsx}\"],\n extends: [\n js.configs.recommended,\n tseslint.configs.recommended,\n reactHooks.configs.flat.recommended,\n reactRefresh.configs.vite,\n ],\n languageOptions: {\n ecmaVersion: 2020,\n globals: globals.browser,\n },\n },\n]);\n";
1026
+ //#endregion
1027
+ //#region src/scaffolding/templates/react-app/index.html.ejs?raw
1028
+ var index_html_default = "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title><%= formTitle %></title>\n <style>\n body {\n margin: 0;\n }\n </style>\n </head>\n <body>\n <div id=\"<%= formId %>-app-root\"></div>\n <script type=\"module\">\n import { renderRoot } from \"/src/main.tsx\";\n\n renderRoot(<%- encodedExternalContexts %>);\n <\/script>\n </body>\n</html>\n";
1029
+ //#endregion
1030
+ //#region src/scaffolding/templates/react-app/package.json.ejs?raw
1031
+ var package_json_default = "{\n \"name\": \"<%= formId %>-react-app\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc -b && vite build\",\n \"lint\": \"eslint .\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"@fortawesome/fontawesome-svg-core\": \"<%= dependencyVersions[\"@fortawesome/fontawesome-svg-core\"] %>\",\n \"@fortawesome/free-regular-svg-icons\": \"<%= dependencyVersions[\"@fortawesome/free-regular-svg-icons\"] %>\",\n \"@fortawesome/free-solid-svg-icons\": \"<%= dependencyVersions[\"@fortawesome/free-solid-svg-icons\"] %>\",\n \"@ostack.tech/kform-react\": \"~<%= kFormVersion %>\",\n \"@ostack.tech/ui\": \"~<%= ostackUiVersion %>\",\n \"@ostack.tech/ui-kform\": \"~<%= ostackUiVersion %>\",\n \"date-fns\": \"<%= dependencyVersions[\"date-fns\"] %>\",\n \"<%= formId %>-shared\": \"file:../shared/build/<%= formId %>-shared-0.0.1.tgz\",\n \"react\": \"<%= dependencyVersions.react %>\",\n \"react-dom\": \"<%= dependencyVersions[\"react-dom\"] %>\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"<%= dependencyVersions[\"@eslint/js\"] %>\",\n \"@types/node\": \"<%= dependencyVersions[\"@types/node\"] %>\",\n \"@types/ostack.tech__kform\": \"npm:@ostack.tech/kform@~<%= kFormVersion %>\",\n \"@types/react\": \"<%= dependencyVersions[\"@types/react\"] %>\",\n \"@types/react-dom\": \"<%= dependencyVersions[\"@types/react-dom\"] %>\",\n \"@vitejs/plugin-react\": \"<%= dependencyVersions[\"@vitejs/plugin-react\"] %>\",\n \"eslint\": \"<%= dependencyVersions.eslint %>\",\n \"eslint-plugin-react-hooks\": \"<%= dependencyVersions[\"eslint-plugin-react-hooks\"] %>\",\n \"eslint-plugin-react-refresh\": \"<%= dependencyVersions[\"eslint-plugin-react-refresh\"] %>\",\n \"globals\": \"<%= dependencyVersions.globals %>\",\n \"sass-embedded\": \"<%= dependencyVersions[\"sass-embedded\"] %>\",\n \"typescript\": \"<%= dependencyVersions.typescript %>\",\n \"typescript-eslint\": \"<%= dependencyVersions[\"typescript-eslint\"] %>\",\n \"vite\": \"<%= dependencyVersions.vite %>\"\n }\n}\n";
1032
+ //#endregion
1033
+ //#region src/scaffolding/templates/react-app/public/vite.svg?raw
1034
+ var vite_default = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" aria-hidden=\"true\" role=\"img\" class=\"iconify iconify--logos\" width=\"31.88\" height=\"32\" preserveAspectRatio=\"xMidYMid meet\" viewBox=\"0 0 256 257\"><defs><linearGradient id=\"IconifyId1813088fe1fbc01fb466\" x1=\"-.828%\" x2=\"57.636%\" y1=\"7.652%\" y2=\"78.411%\"><stop offset=\"0%\" stop-color=\"#41D1FF\"></stop><stop offset=\"100%\" stop-color=\"#BD34FE\"></stop></linearGradient><linearGradient id=\"IconifyId1813088fe1fbc01fb467\" x1=\"43.376%\" x2=\"50.316%\" y1=\"2.242%\" y2=\"89.03%\"><stop offset=\"0%\" stop-color=\"#FFEA83\"></stop><stop offset=\"8.333%\" stop-color=\"#FFDD35\"></stop><stop offset=\"100%\" stop-color=\"#FFA800\"></stop></linearGradient></defs><path fill=\"url(#IconifyId1813088fe1fbc01fb466)\" d=\"M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z\"></path><path fill=\"url(#IconifyId1813088fe1fbc01fb467)\" d=\"M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z\"></path></svg>\n";
1035
+ //#endregion
1036
+ //#region src/scaffolding/templates/react-app/tsconfig.app.json?raw
1037
+ var tsconfig_app_default = "{\n \"compilerOptions\": {\n \"tsBuildInfoFile\": \"./node_modules/.tmp/tsconfig.app.tsbuildinfo\",\n \"target\": \"ES2022\",\n \"useDefineForClassFields\": true,\n \"lib\": [\"ES2022\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"ESNext\",\n \"types\": [\"vite/client\"],\n \"skipLibCheck\": true,\n\n /* Bundler mode */\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"verbatimModuleSyntax\": true,\n \"moduleDetection\": \"force\",\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n\n /* Linting */\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"erasableSyntaxOnly\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedSideEffectImports\": true\n },\n \"include\": [\"src\"]\n}\n";
1038
+ //#endregion
1039
+ //#region src/scaffolding/templates/react-app/tsconfig.json?raw
1040
+ var tsconfig_default = "{\n \"files\": [],\n \"references\": [\n { \"path\": \"./tsconfig.app.json\" },\n { \"path\": \"./tsconfig.node.json\" }\n ]\n}\n";
1041
+ //#endregion
1042
+ //#region src/scaffolding/templates/react-app/tsconfig.node.json?raw
1043
+ var tsconfig_node_default = "{\n \"compilerOptions\": {\n \"tsBuildInfoFile\": \"./node_modules/.tmp/tsconfig.node.tsbuildinfo\",\n \"target\": \"ES2023\",\n \"lib\": [\"ES2023\"],\n \"module\": \"ESNext\",\n \"types\": [\"node\"],\n \"skipLibCheck\": true,\n\n /* Bundler mode */\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"verbatimModuleSyntax\": true,\n \"moduleDetection\": \"force\",\n \"noEmit\": true,\n\n /* Linting */\n \"strict\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"erasableSyntaxOnly\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedSideEffectImports\": true\n },\n \"include\": [\"vite.config.ts\"]\n}\n";
1044
+ //#endregion
1045
+ //#region src/scaffolding/templates/react-app/vite.config.ts.ejs?raw
1046
+ var vite_config_ts_default = "import { resolve } from \"node:path\";\n\nimport react from \"@vitejs/plugin-react\";\nimport { defineConfig } from \"vite\";\n\n// https://vite.dev/config/\nexport default defineConfig({\n plugins: [react()],\n build: {\n outDir: \"<%= viteConfigOutDir %>\",\n rollupOptions: {\n preserveEntrySignatures: \"exports-only\",\n input: {\n \"<%= formId %>-app\":\n process.env.VITE_BUILD_REASON === \"preview\"\n ? \"index.html\"\n : \"src/main.tsx\",\n },\n output: {\n // Output files without hashes, making it easier to serve them in the\n // server. However, the server is expected to somehow \"version\" them for\n // cache busting purposes.\n entryFileNames: \"assets/[name].js\",\n chunkFileNames: \"assets/[name].js\",\n assetFileNames: \"assets/[name].[ext]\",\n },\n },\n },\n resolve: {\n alias: {\n // Due to how Kotlin \"bundles\" dependencies, we need to use the\n // `@ostack.tech/kform` produced by the shared module.\n \"@ostack.tech/kform\": resolve(\n import.meta.dirname,\n \"node_modules/<%= formId %>-shared/ostack-kform.mjs\",\n ),\n },\n },\n server: {\n proxy: { \"<%= apiBasePath %>\": \"<%= viteConfigProxyTarget %>\" },\n },\n});\n";
1047
+ //#endregion
1048
+ //#region src/scaffolding/scaffolders/scaffoldViteProject.ts
1049
+ var DEFAULT_VITE_CONFIG_OUT_DIR = "build/dist/";
1050
+ var DEFAULT_VITE_CONFIG_PROXY_TARGET = "http://127.0.0.1:8080/";
1484
1051
  function scaffoldViteProject(schematic, data) {
1485
- const ejsData = {
1486
- formId: kebabCase(schematic.name),
1487
- formClass: schematic.name,
1488
- formTitle: capitalCase(schematic.name),
1489
- ostackUiVersion: "0.15.0",
1490
- kFormVersion: "0.34.2",
1491
- dependencyVersions: JSON.parse('{"@eslint/js":"^9.39.3","@fortawesome/fontawesome-svg-core":"^7.2.0","@fortawesome/free-brands-svg-icons":"^7.2.0","@fortawesome/free-regular-svg-icons":"^7.2.0","@fortawesome/free-solid-svg-icons":"^7.2.0","@ostack.tech/kform":"^0.34.2","@ostack.tech/kform-react":"^0.34.2","@ostack.tech/kform-scaffolder":"^0.34.2","@storybook/addon-docs":"^10.2.14","@storybook/addon-links":"^10.2.14","@storybook/react-vite":"^10.2.14","@types/node":"^22.19.13","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.4","change-case":"^5.4.4","cpy-cli":"^7.0.0","date-fns":"^4.1.0","eslint":"^9.39.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.2","eslint-plugin-simple-import-sort":"^12.1.1","eslint-plugin-storybook":"^10.2.14","globals":"^17.4.0","happy-dom":"^20.7.0","lint-staged":"^16.3.1","prettier":"^3.8.1","prettier-plugin-jsdoc":"^1.8.0","react":"^19.2.4","react-dom":"^19.2.4","rimraf":"^6.1.3","sass-embedded":"^1.97.3","simple-git-hooks":"^2.13.1","storybook":"^10.2.14","terser":"^5.46.0","tslib":"^2.8.1","typescript":"~5.9.3","typescript-eslint":"^8.56.1","vite":"^7.3.1","vite-plugin-dts":"^4.5.4","vitest":"^4.0.18","write-excel-file":"^3.0.5","zustand":"^5.0.11","zod":"^4.4.3"}'),
1492
- encodedExternalContexts: JSON.stringify(
1493
- data.serializationFormat === "json" ? "{}" : `<${schematic.name}ExternalContexts />`
1494
- ),
1495
- apiBasePath: data.apiBasePath ?? DEFAULT_API_BASE_PATH,
1496
- viteConfigOutDir: data.viteConfigOutDir ?? DEFAULT_VITE_CONFIG_OUT_DIR,
1497
- viteConfigProxyTarget: data.viteConfigProxyTarget ?? DEFAULT_VITE_CONFIG_PROXY_TARGET
1498
- };
1499
- addEjsTemplateFile(data, "react-app/package.json", packageJsonEjs, ejsData);
1500
- addEjsTemplateFile(
1501
- data,
1502
- "react-app/vite.config.ts",
1503
- viteConfigTsEjs,
1504
- ejsData
1505
- );
1506
- addTemplateFile(data, "react-app/tsconfig.json", tsConfigJson);
1507
- addTemplateFile(data, "react-app/tsconfig.app.json", tsConfigAppJson);
1508
- addTemplateFile(data, "react-app/tsconfig.node.json", tsConfigNodeJson);
1509
- addTemplateFile(data, "react-app/eslint.config.js", eslintConfigJs);
1510
- addEjsTemplateFile(data, "react-app/index.html", indexHtmlEjs, ejsData);
1511
- addTemplateFile(data, "react-app/public/vite.svg", viteSvg);
1052
+ const ejsData = {
1053
+ formId: kebabCase(schematic.name),
1054
+ formClass: schematic.name,
1055
+ formTitle: capitalCase(schematic.name),
1056
+ ostackUiVersion: "0.15.1",
1057
+ kFormVersion: "0.35.0",
1058
+ dependencyVersions: JSON.parse("{\"@eslint/js\":\"^10.0.1\",\"@fortawesome/fontawesome-svg-core\":\"^7.2.0\",\"@fortawesome/free-brands-svg-icons\":\"^7.2.0\",\"@fortawesome/free-regular-svg-icons\":\"^7.2.0\",\"@fortawesome/free-solid-svg-icons\":\"^7.2.0\",\"@ostack.tech/kform\":\"^0.35.0\",\"@ostack.tech/kform-react\":\"^0.35.0\",\"@ostack.tech/kform-scaffolder\":\"^0.35.0\",\"@storybook/addon-docs\":\"^10.4.2\",\"@storybook/addon-links\":\"^10.4.2\",\"@storybook/react-vite\":\"^10.4.2\",\"@types/node\":\"^24.12.4\",\"@types/react\":\"^19.2.16\",\"@types/react-dom\":\"^19.2.3\",\"@vitejs/plugin-react\":\"^6.0.2\",\"change-case\":\"^5.4.4\",\"cpy-cli\":\"^7.0.0\",\"date-fns\":\"^4.4.0\",\"eslint\":\"^10.4.1\",\"eslint-config-prettier\":\"^10.1.8\",\"eslint-plugin-prettier\":\"^5.5.6\",\"eslint-plugin-react-hooks\":\"^7.1.1\",\"eslint-plugin-react-refresh\":\"^0.5.2\",\"eslint-plugin-simple-import-sort\":\"^13.0.0\",\"eslint-plugin-storybook\":\"^10.4.2\",\"globals\":\"^17.6.0\",\"happy-dom\":\"^20.9.0\",\"lint-staged\":\"^17.0.7\",\"prettier\":\"^3.8.3\",\"prettier-plugin-jsdoc\":\"^1.8.1\",\"react\":\"^19.2.7\",\"react-dom\":\"^19.2.7\",\"rimraf\":\"^6.1.3\",\"sass-embedded\":\"^1.100.0\",\"simple-git-hooks\":\"^2.13.1\",\"storybook\":\"^10.4.2\",\"terser\":\"^5.48.0\",\"tslib\":\"^2.8.1\",\"typescript\":\"~6.0.3\",\"typescript-eslint\":\"^8.60.1\",\"vite\":\"^8.0.16\",\"vitest\":\"^4.1.8\",\"write-excel-file\":\"^4.0.7\",\"zod\":\"^4.4.3\",\"zustand\":\"^5.0.14\"}"),
1059
+ encodedExternalContexts: JSON.stringify(data.serializationFormat === "json" ? "{}" : `<${schematic.name}ExternalContexts />`),
1060
+ apiBasePath: data.apiBasePath ?? "/api/",
1061
+ viteConfigOutDir: data.viteConfigOutDir ?? "build/dist/",
1062
+ viteConfigProxyTarget: data.viteConfigProxyTarget ?? "http://127.0.0.1:8080/"
1063
+ };
1064
+ addEjsTemplateFile(data, "react-app/package.json", package_json_default, ejsData);
1065
+ addEjsTemplateFile(data, "react-app/vite.config.ts", vite_config_ts_default, ejsData);
1066
+ addTemplateFile(data, "react-app/tsconfig.json", tsconfig_default);
1067
+ addTemplateFile(data, "react-app/tsconfig.app.json", tsconfig_app_default);
1068
+ addTemplateFile(data, "react-app/tsconfig.node.json", tsconfig_node_default);
1069
+ addTemplateFile(data, "react-app/eslint.config.js", eslint_config_default);
1070
+ addEjsTemplateFile(data, "react-app/index.html", index_html_default, ejsData);
1071
+ addTemplateFile(data, "react-app/public/vite.svg", vite_default);
1512
1072
  }
1513
- const kotlinMainData = {
1514
- currentDir: "shared/src/commonMain/kotlin"
1515
- };
1516
- const kotlinTestData = {
1517
- currentDir: "shared/src/commonTest/kotlin"
1518
- };
1519
- const reactAppData = {
1520
- currentDir: "react-app/src"
1521
- };
1522
- function SchematicBuilder({
1523
- name = "ostack-ui-kform",
1524
- schematicKinds = defaultSchematicKinds,
1525
- scaffolders = [
1526
- scaffoldProjectMisc,
1527
- scaffoldGradleWrapper,
1528
- scaffoldGradleProject,
1529
- scaffoldViteProject,
1530
- configScaffolder(scaffoldSchemas, kotlinMainData),
1531
- configScaffolder(scaffoldModels, kotlinMainData),
1532
- configScaffolder(scaffoldResponses, kotlinMainData),
1533
- configScaffolder(scaffoldExternalContexts, kotlinMainData),
1534
- configScaffolder(scaffoldSerializer, kotlinMainData),
1535
- configScaffolder(scaffoldValidator, kotlinTestData),
1536
- configScaffolder(scaffoldMain, reactAppData),
1537
- configScaffolder(scaffoldStyles, reactAppData),
1538
- configScaffolder(scaffoldAppComponent, reactAppData),
1539
- configScaffolder(scaffoldAppContext, reactAppData),
1540
- configScaffolder(scaffoldActions, reactAppData),
1541
- configScaffolder(scaffoldApi, reactAppData),
1542
- configScaffolder(scaffoldPageComponents, reactAppData)
1543
- ],
1544
- scaffoldingData = (schematic) => ({
1545
- useFileBase64Serializer: true,
1546
- ...schematic.config
1547
- }),
1548
- configs = /* @__PURE__ */ jsxs(Fragment, { children: [
1549
- /* @__PURE__ */ jsx(DefaultLocaleConfig, {}),
1550
- /* @__PURE__ */ jsx(SerializationFormatConfig, {}),
1551
- /* @__PURE__ */ jsx(UseTableValuesSerializerConfig, {})
1552
- ] }),
1553
- version = "0.15.0",
1554
- ...otherProps
1555
- }) {
1556
- return /* @__PURE__ */ jsx(
1557
- SchematicBuilder$1,
1558
- {
1559
- name,
1560
- schematicKinds,
1561
- scaffolders,
1562
- scaffoldingData,
1563
- configs,
1564
- version,
1565
- ...otherProps
1566
- }
1567
- );
1073
+ //#endregion
1074
+ //#region src/SchematicBuilder.tsx
1075
+ var kotlinMainData = { currentDir: "shared/src/commonMain/kotlin" };
1076
+ var kotlinTestData = { currentDir: "shared/src/commonTest/kotlin" };
1077
+ var reactAppData = { currentDir: "react-app/src" };
1078
+ function SchematicBuilder({ name = "ostack-ui-kform", schematicKinds = defaultSchematicKinds, scaffolders = [
1079
+ scaffoldProjectMisc,
1080
+ scaffoldGradleWrapper,
1081
+ scaffoldGradleProject,
1082
+ scaffoldViteProject,
1083
+ configScaffolder(scaffoldSchemas, kotlinMainData),
1084
+ configScaffolder(scaffoldModels, kotlinMainData),
1085
+ configScaffolder(scaffoldResponses, kotlinMainData),
1086
+ configScaffolder(scaffoldExternalContexts, kotlinMainData),
1087
+ configScaffolder(scaffoldSerializer, kotlinMainData),
1088
+ configScaffolder(scaffoldValidator, kotlinTestData),
1089
+ configScaffolder(scaffoldMain, reactAppData),
1090
+ configScaffolder(scaffoldStyles, reactAppData),
1091
+ configScaffolder(scaffoldAppComponent, reactAppData),
1092
+ configScaffolder(scaffoldAppContext, reactAppData),
1093
+ configScaffolder(scaffoldActions, reactAppData),
1094
+ configScaffolder(scaffoldApi, reactAppData),
1095
+ configScaffolder(scaffoldPageComponents, reactAppData)
1096
+ ], scaffoldingData = (schematic) => ({
1097
+ useFileBase64Serializer: true,
1098
+ ...schematic.config
1099
+ }), configs = /* @__PURE__ */ jsxs(Fragment, { children: [
1100
+ /* @__PURE__ */ jsx(DefaultLocaleConfig, {}),
1101
+ /* @__PURE__ */ jsx(SerializationFormatConfig, {}),
1102
+ /* @__PURE__ */ jsx(UseTableValuesSerializerConfig, {})
1103
+ ] }), version = "0.15.1", ...otherProps }) {
1104
+ return /* @__PURE__ */ jsx(SchematicBuilder$1, {
1105
+ name,
1106
+ schematicKinds,
1107
+ scaffolders,
1108
+ scaffoldingData,
1109
+ configs,
1110
+ version,
1111
+ ...otherProps
1112
+ });
1568
1113
  }
1569
- export {
1570
- DEFAULT_ACTIVE_PATH_SEARCH_PARAM,
1571
- DEFAULT_API_BASE_PATH,
1572
- DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION,
1573
- DEFAULT_JVM_TOOLCHAIN_VERSION,
1574
- DEFAULT_LOCALE,
1575
- DEFAULT_NODEJS_VERSION,
1576
- DEFAULT_REPORT_ERROR_API_ENDPOINT,
1577
- DEFAULT_SERIALIZATION_FORMAT,
1578
- DEFAULT_SUBMIT_API_ENDPOINT,
1579
- DEFAULT_VITE_CONFIG_OUT_DIR,
1580
- DEFAULT_VITE_CONFIG_PROXY_TARGET,
1581
- DefaultLocaleConfig,
1582
- LOCALES,
1583
- SchematicBuilder,
1584
- SerializationFormatConfig,
1585
- UseTableValuesSerializerConfig,
1586
- anySchematicKind,
1587
- bigDecimalSchematicKind,
1588
- bigIntegerSchematicKind,
1589
- booleanSchematicKind,
1590
- byteSchematicKind,
1591
- classAnnexSchematicKind,
1592
- classFormPageSchematicKind,
1593
- classSchematicKind,
1594
- defaultSchematicKinds,
1595
- doubleSchematicKind,
1596
- enumRadioGroupSchematicKind,
1597
- enumSchematicKind,
1598
- enumSelectSchematicKind,
1599
- fileSchematicKind,
1600
- floatSchematicKind,
1601
- intSchematicKind,
1602
- listCheckboxGroupSchematicKind,
1603
- listSelectMultipleSchematicKind,
1604
- localDateSchematicKind,
1605
- longSchematicKind,
1606
- reactAppLayout,
1607
- scaffoldActions,
1608
- scaffoldApi,
1609
- scaffoldAppComponent,
1610
- scaffoldAppContext,
1611
- scaffoldAppLayout,
1612
- scaffoldExternalContexts,
1613
- scaffoldField,
1614
- scaffoldGradleProject,
1615
- scaffoldGradleWrapper,
1616
- scaffoldIssueMessages,
1617
- scaffoldMain,
1618
- scaffoldPageComponents,
1619
- scaffoldProjectMisc,
1620
- scaffoldResponses,
1621
- scaffoldSerializer,
1622
- scaffoldStyles,
1623
- scaffoldViteProject,
1624
- shortSchematicKind,
1625
- shouldScaffoldIssueMessages,
1626
- stringSchematicKind,
1627
- tableAnnexesSchematicKind,
1628
- tableSchematicKind
1629
- };
1630
- //# sourceMappingURL=ostack-ui-kform-scaffolder.js.map
1114
+ //#endregion
1115
+ export { DEFAULT_ACTIVE_PATH_SEARCH_PARAM, DEFAULT_API_BASE_PATH, DEFAULT_INCLUDE_SERIALIZATION_FORMAT_VERSION, DEFAULT_JVM_TOOLCHAIN_VERSION, DEFAULT_LOCALE, DEFAULT_NODEJS_VERSION, DEFAULT_REPORT_ERROR_API_ENDPOINT, DEFAULT_SERIALIZATION_FORMAT, DEFAULT_SUBMIT_API_ENDPOINT, DEFAULT_VITE_CONFIG_OUT_DIR, DEFAULT_VITE_CONFIG_PROXY_TARGET, DefaultLocaleConfig, LOCALES, SchematicBuilder, SerializationFormatConfig, UseTableValuesSerializerConfig, anySchematicKind, bigDecimalSchematicKind, bigIntegerSchematicKind, booleanSchematicKind, byteSchematicKind, classAnnexSchematicKind, classFormPageSchematicKind, classSchematicKind, defaultSchematicKinds, doubleSchematicKind, enumRadioGroupSchematicKind, enumSchematicKind, enumSelectSchematicKind, fileSchematicKind, floatSchematicKind, intSchematicKind, listCheckboxGroupSchematicKind, listSelectMultipleSchematicKind, localDateSchematicKind, longSchematicKind, reactAppLayout, scaffoldActions, scaffoldApi, scaffoldAppComponent, scaffoldAppContext, scaffoldAppLayout, scaffoldExternalContexts, scaffoldField, scaffoldGradleProject, scaffoldGradleWrapper, scaffoldIssueMessages, scaffoldMain, scaffoldPageComponents, scaffoldProjectMisc, scaffoldResponses, scaffoldSerializer, scaffoldStyles, scaffoldViteProject, shortSchematicKind, shouldScaffoldIssueMessages, stringSchematicKind, tableAnnexesSchematicKind, tableSchematicKind };
1116
+
1117
+ //# sourceMappingURL=ostack-ui-kform-scaffolder.js.map