@ostack.tech/ui-kform-scaffolder 0.15.0 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ostack-ui-kform-scaffolder.js +876 -1389
- package/dist/ostack-ui-kform-scaffolder.js.map +1 -1
- package/dist/webapp/assets/gradle-wrapper-BR-5feie.jar +0 -0
- package/dist/webapp/assets/index-BDQK-p1w.js +1516 -0
- package/dist/webapp/assets/index-BKUWl2po.css +1 -0
- package/dist/webapp/index.html +2 -2
- package/package.json +7 -7
- package/{dist/types → types}/SchematicBuilder.d.ts +3 -3
- package/{dist/types → types}/SchematicKind.d.ts +3 -3
- package/{dist/types → types}/configs/DefaultLocaleConfig.d.ts +1 -1
- package/{dist/types → types}/configs/SerializationFormatConfig.d.ts +1 -1
- package/{dist/types → types}/configs/UseTableValuesSerializerConfig.d.ts +1 -1
- package/types/index.d.ts +24 -0
- package/types/main.d.ts +1 -0
- package/{dist/types → types}/scaffolding/ScaffoldingData.d.ts +2 -2
- package/types/scaffolding/kotlin/KtData.d.ts +4 -0
- package/{dist/types → types}/scaffolding/reactApp/ReactAppData.d.ts +2 -2
- package/{dist/types → types}/scaffolding/reactApp/util/reactAppLayout.d.ts +2 -2
- package/types/scaffolding/scaffolders/scaffoldActions.d.ts +3 -0
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldApi.d.ts +2 -2
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldAppComponent.d.ts +2 -2
- package/types/scaffolding/scaffolders/scaffoldAppContext.d.ts +3 -0
- package/types/scaffolding/scaffolders/scaffoldExternalContexts.d.ts +3 -0
- package/types/scaffolding/scaffolders/scaffoldGradleProject.d.ts +5 -0
- package/types/scaffolding/scaffolders/scaffoldGradleWrapper.d.ts +3 -0
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldIssueMessages.d.ts +2 -2
- package/types/scaffolding/scaffolders/scaffoldMain.d.ts +3 -0
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldPageComponents.d.ts +2 -2
- package/types/scaffolding/scaffolders/scaffoldProjectMisc.d.ts +3 -0
- package/types/scaffolding/scaffolders/scaffoldResponses.d.ts +3 -0
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldSerializer.d.ts +2 -2
- package/types/scaffolding/scaffolders/scaffoldStyles.d.ts +3 -0
- package/{dist/types → types}/scaffolding/scaffolders/scaffoldViteProject.d.ts +2 -2
- package/dist/types/index.d.ts +0 -24
- package/dist/types/main.d.ts +0 -0
- package/dist/types/scaffolding/kotlin/KtData.d.ts +0 -4
- package/dist/types/scaffolding/scaffolders/scaffoldActions.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldAppContext.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldExternalContexts.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldGradleProject.d.ts +0 -5
- package/dist/types/scaffolding/scaffolders/scaffoldGradleWrapper.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldMain.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldProjectMisc.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldResponses.d.ts +0 -3
- package/dist/types/scaffolding/scaffolders/scaffoldStyles.d.ts +0 -3
- package/dist/webapp/assets/index-DFHwLN8U.js +0 -1529
- package/dist/webapp/assets/index-x_B5n20N.css +0 -1
- /package/{dist/types → types}/util/arrayify.d.ts +0 -0
|
@@ -1,349 +1,326 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
}) {
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
117
|
+
//#endregion
|
|
118
|
+
//#region src/scaffolding/scaffolders/scaffoldIssueMessages.ts
|
|
119
|
+
var DEFAULT_SCAFFOLD_ISSUE_MESSAGES = true;
|
|
117
120
|
function scaffoldIssueMessages(schematic, data) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
132
|
+
return data.scaffoldIssueMessages ?? DEFAULT_SCAFFOLD_ISSUE_MESSAGES;
|
|
137
133
|
}
|
|
138
134
|
function scaffoldIssueMessagesConstant(schematic, data) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
188
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
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
|
-
|
|
243
|
+
return value == null ? [] : Array.isArray(value) ? value : [value];
|
|
262
244
|
}
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
252
|
+
var bigIntegerSchematicKind = {
|
|
253
|
+
...bigIntegerSchematicKind$1,
|
|
254
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
269
255
|
};
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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
|
-
|
|
280
|
-
|
|
281
|
-
|
|
265
|
+
var classAnnexSchematicKind = {
|
|
266
|
+
...classSchematicKind$1,
|
|
267
|
+
defaultPackageSuffix: (childName) => `annexes.${childName.toLowerCase()}`,
|
|
268
|
+
kind: "Class (Annex)"
|
|
282
269
|
};
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
270
|
+
var classFormPageSchematicKind = {
|
|
271
|
+
...classSchematicKind$1,
|
|
272
|
+
kind: "Class (FormPage)",
|
|
273
|
+
nullable: false
|
|
287
274
|
};
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
345
|
+
var doubleSchematicKind = {
|
|
346
|
+
...doubleSchematicKind$1,
|
|
347
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
376
348
|
};
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
349
|
+
var enumSchematicKind = {
|
|
350
|
+
...enumSchematicKind$1,
|
|
351
|
+
kind: "Enum",
|
|
352
|
+
internal: true,
|
|
353
|
+
nullable: false
|
|
382
354
|
};
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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
|
-
|
|
410
|
-
}
|
|
374
|
+
`].filter((s) => s).join("\n");
|
|
375
|
+
}
|
|
411
376
|
};
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
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
|
-
|
|
439
|
-
}
|
|
396
|
+
`].filter((s) => s).join("\n");
|
|
397
|
+
}
|
|
440
398
|
};
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
399
|
+
var fileSchematicKind = {
|
|
400
|
+
...fileSchematicKind$1,
|
|
401
|
+
nullable: true,
|
|
402
|
+
control: "@ostack.tech/ui-kform.FileControl"
|
|
445
403
|
};
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
404
|
+
var floatSchematicKind = {
|
|
405
|
+
...floatSchematicKind$1,
|
|
406
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
449
407
|
};
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
408
|
+
var intSchematicKind = {
|
|
409
|
+
...intSchematicKind$1,
|
|
410
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
453
411
|
};
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
495
|
-
}
|
|
441
|
+
`].filter((s) => s).join("\n");
|
|
442
|
+
}
|
|
496
443
|
};
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
-
|
|
538
|
-
}
|
|
473
|
+
`].filter((s) => s).join("\n");
|
|
474
|
+
}
|
|
539
475
|
};
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
476
|
+
var localDateSchematicKind = {
|
|
477
|
+
...localDateSchematicKind$1,
|
|
478
|
+
nullable: true,
|
|
479
|
+
control: "@ostack.tech/ui-kform.DateControl"
|
|
544
480
|
};
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
481
|
+
var longSchematicKind = {
|
|
482
|
+
...longSchematicKind$1,
|
|
483
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
548
484
|
};
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
485
|
+
var shortSchematicKind = {
|
|
486
|
+
...shortSchematicKind$1,
|
|
487
|
+
control: "@ostack.tech/ui-kform.NumericControl"
|
|
552
488
|
};
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
489
|
+
var stringSchematicKind = {
|
|
490
|
+
...stringSchematicKind$1,
|
|
491
|
+
control: "@ostack.tech/ui-kform.TextControl"
|
|
556
492
|
};
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
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
|
-
|
|
632
|
-
|
|
633
|
-
|
|
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
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
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
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
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
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
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
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
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
|
-
|
|
644
|
+
//#endregion
|
|
645
|
+
//#region src/scaffolding/scaffolders/scaffoldAppComponent.ts
|
|
646
|
+
var DEFAULT_ACTIVE_PATH_SEARCH_PARAM = "page";
|
|
762
647
|
function scaffoldAppComponent(schematic, data) {
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
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
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
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
|
-
|
|
841
|
-
|
|
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
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
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
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
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
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
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
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
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
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
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
|
-
|
|
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
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
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
|
-
|
|
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
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
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
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
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.3.21\"\nnodeGradle = \"7.1.0\"\n# Libraries\nkotlinxCoroutines = \"1.11.0\"\nkform = \"<%= kFormVersion %>\"\n<%_ if (includeKotlinxDatetime) { -%>\nkotlinxDatetime = \"0.8.0\"\n<%_ } -%>\n<%_ if (serializationFormat === \"json\") { -%>\nkotlinxSerialization = \"1.11.0\"\n<%_ } -%>\n<%_ if (includeKtMath) { -%>\nktMath = \"0.10.2\"\n<%_ } -%>\nslf4j = \"2.0.18\"\n<%_ if (serializationFormat === \"xml\") { -%>\nxmlutil = \"0.91.1\"\n<%_ } -%>\n<%_ if (includeKotlinxDatetime) { -%>\n# npm libraries\njsJodaTimezone = \"2.23.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 = "21";
|
|
892
|
+
var DEFAULT_NODEJS_VERSION = "24.16.0";
|
|
985
893
|
function scaffoldGradleProject(schematic, data) {
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
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 ?? "21",
|
|
904
|
+
nodejsVersion: data.nodejsVersion ?? "24.16.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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1042
|
-
const gradlewBat = `@rem\r
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
@rem\r
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
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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Zy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyJEFmdGVyT3B0aW9ucy5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCj0ttQVAMAAJMHAAA8AAkAAAAAAAAAAAAAAEkWAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRCZWZvcmVGaXJzdFN1YkNvbW1hbmQuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEALlZDIGAHAAA6DwAAPQAJAAAAAAAAAAAAAAAQGgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkS25vd25PcHRpb25QYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQDU5SDkTAIAAJcEAAA8AAkAAAAAAAAAAAAAAOQhAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRNaXNzaW5nT3B0aW9uQXJnU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAmT0V29YCAABKBQAAPQAJAAAAAAAAAAAAAACjJAAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkT3B0aW9uQXdhcmVQYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCflW/2oQEAAH0CAAA4AAkAAAAAAAAAAAAAAO0nAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRPcHRpb25QYXJzZXJTdGF0ZS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBXvGfjIgIAAGYDAAAzAAkAAAAAAAAAAAAAAP0pAABvcmcvZ3JhZGxlL2NsaS9Db21tYW5kTGluZVBhcnNlciRPcHRpb25TdHJpbmcuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAYjZYZqYBAADOAgAAMgAJAAAAAAAAAAAAAACJLAAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkUGFyc2VyU3RhdGUuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA/Y4pdXQCAADHBAAAPwAJAAAAAAAAAAAAAACYLgAAb3JnL2dyYWRsZS9jbGkvQ29tbWFuZExpbmVQYXJzZXIkVW5rbm93bk9wdGlvblBhcnNlclN0YXRlLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAEoBjirqBAAA0ggAACYACQAAAAAAAAAAAAAAgjEAAG9yZy9ncmFkbGUvY2xpL0NvbW1hbmRMaW5lUGFyc2VyLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAIKL8BCEBAAAUggAACYACQAAAAAAAAAAAAAAyTYAAG9yZy9ncmFkbGUvY2xpL1BhcnNlZENvbW1hbmRMaW5lLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAO2cvGdSAQAArAEAACwACQAAAAAAAAAAAAAAqjsAAG9yZy9ncmFkbGUvY2xpL1BhcnNlZENvbW1hbmRMaW5lT3B0aW9uLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAM7QOawiBQAAVggAADMACQAAAAAAAAAAAAAAXz0AAG9yZy9ncmFkbGUvaW50ZXJuYWwvZmlsZS9QYXRoVHJhdmVyc2FsQ2hlY2tlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQDp+MhHngEAACYCAABBAAkAAAAAAAAAAAAAAOtCAABvcmcvZ3JhZGxlL2ludGVybmFsL2ZpbGUvbG9ja2luZy9FeGNsdXNpdmVGaWxlQWNjZXNzTWFuYWdlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBE8acw2wEAAMcCAAA+AAkAAAAAAAAAAAAAAAFFAABvcmcvZ3JhZGxlL3V0aWwvaW50ZXJuYWwvV3JhcHBlckRpc3RyaWJ1dGlvblVybENvbnZlcnRlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQClNa2HjwEAAB4CAAAvAAkAAAAAAAAAAAAAAFFHAABvcmcvZ3JhZGxlL3dyYXBwZXIvQm9vdHN0cmFwTWFpblN0YXJ0ZXIkMS5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQBgdBonSwMAABIFAABBAAkAAAAAAAAAAAAAAEZJAABvcmcvZ3JhZGxlL3dyYXBwZXIvRG93bmxvYWQkRGVmYXVsdERvd25sb2FkUHJvZ3Jlc3NMaXN0ZW5lci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQACc6nUBwMAAEEFAAA0AAkAAAAAAAAAAAAAAAlNAABvcmcvZ3JhZGxlL3dyYXBwZXIvRG93bmxvYWQkUHJveHlBdXRoZW50aWNhdG9yLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhABQxDlHZCQAA5hIAACEACQAAAAAAAAAAAAAAe1AAAG9yZy9ncmFkbGUvd3JhcHBlci9Eb3dubG9hZC5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCqi+MW2QEAALICAAAtAAkAAAAAAAAAAAAAAKxaAABvcmcvZ3JhZGxlL3dyYXBwZXIvR3JhZGxlVXNlckhvbWVMb29rdXAuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAodQH4X8WAABdLQAAKgAJAAAAAAAAAAAAAADpXAAAb3JnL2dyYWRsZS93cmFwcGVyL0dyYWRsZVdyYXBwZXJNYWluLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAJOC8wXEDAAAshgAACIACQAAAAAAAAAAAAAAyXMAAG9yZy9ncmFkbGUvd3JhcHBlci9JbnN0YWxsJDEuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAarrq82oBAADnAQAALQAJAAAAAAAAAAAAAADmgAAAb3JnL2dyYWRsZS93cmFwcGVyL0luc3RhbGwkSW5zdGFsbENoZWNrLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhAEmBk+cSEQAA0yAAACAACQAAAAAAAAAAAAAAtIIAAG9yZy9ncmFkbGUvd3JhcHBlci9JbnN0YWxsLmNsYXNzVVQFAAEAAAAAUEsBAhQAFAAICAgAAAAhACeuAolbAgAAWgQAAB8ACQAAAAAAAAAAAAAAHZQAAG9yZy9ncmFkbGUvd3JhcHBlci9Mb2dnZXIuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEA7t7O9SQBAABqAQAAJgAJAAAAAAAAAAAAAADOlgAAb3JnL2dyYWRsZS93cmFwcGVyL1BhdGhBc3NlbWJsZXIuY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEAdFgpujIEAABmBwAALgAJAAAAAAAAAAAAAABPmAAAb3JnL2dyYWRsZS93cmFwcGVyL1Byb3BlcnRpZXNGaWxlSGFuZGxlci5jbGFzc1VUBQABAAAAAFBLAQIUABQACAgIAAAAIQCzldMe7gIAAFAGAAAtAAkAAAAAAAAAAAAAAOacAABvcmcvZ3JhZGxlL3dyYXBwZXIvV3JhcHBlckNvbmZpZ3VyYXRpb24uY2xhc3NVVAUAAQAAAABQSwECFAAUAAgICAAAACEABq9Rm6IGAABEDQAAKAAJAAAAAAAAAAAAAAA4oAAAb3JnL2dyYWRsZS93cmFwcGVyL1dyYXBwZXJFeGVjdXRvci5jbGFzc1VUBQABAAAAAFBLBQYAAAAAIQAhABANAAA5pwAAAAA=";
|
|
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-9.3.0-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\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%\" -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 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\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\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 -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
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
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
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
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
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
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
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
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
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
999
|
+
addTemplateFile(data, ".gitignore", _gitignore_raw_default);
|
|
1000
|
+
addTemplateFile(data, ".gitattributes", _gitattributes_raw_default);
|
|
1001
|
+
addTemplateFile(data, ".editorconfig", _editorconfig_raw_default);
|
|
1456
1002
|
}
|
|
1457
|
-
|
|
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
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1021
|
+
addTemplateFile(data, "index.scss", src_default);
|
|
1473
1022
|
}
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
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 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\": \"es2023\",\n \"lib\": [\"ES2023\", \"DOM\"],\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 \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"erasableSyntaxOnly\": true,\n \"noFallthroughCasesInSwitch\": 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 \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"erasableSyntaxOnly\": true,\n \"noFallthroughCasesInSwitch\": 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
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
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.2",
|
|
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
|
-
|
|
1514
|
-
|
|
1515
|
-
};
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
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.2", ...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
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
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
|